1
0
mirror of https://github.com/Anuken/Mindustry.git synced 2024-11-11 14:56:10 +03:00

Various optimizations; made healer enemies explode after a while

This commit is contained in:
Anuken 2017-12-10 15:06:33 -05:00
parent 9f70290c69
commit 347cae23e5
18 changed files with 118 additions and 73 deletions

View File

@ -3,8 +3,8 @@ _Keep in mind that this is just a basic outline of planned features, and will be
### 3.0 Release
- New tutorial with the power blocks
- New SFX for specific blocks, especially turrets
- Block drawing layers. Refactor/remove `Block#drawOver()`, add `Layer` enum. Should fix 'glitchy' lasers and conveyor clipping
- Balance nuclear reactor, improve effectiveness as they are currently underpowered
- [DONE] Block drawing layers. Refactor/remove `Block#drawOver()`, add `Layer` enum. Should fix 'glitchy' lasers and conveyor clipping
- [DONE] Balance nuclear reactor, improve effectiveness as they are currently underpowered
- Make generation frame independent
- Investigate issue #5 (enemies stuck in blocks)
- Faster mech movement, possibly with a "boost" key
@ -52,4 +52,7 @@ _Keep in mind that this is just a basic outline of planned features, and will be
- Optimize generator laser distribution, especially finding targets
- Optimize UI
- Check memory usage and GC, profile
- Optimize health bars and enemies in general
- Make drawing of enemies more efficient (don't call `flush()`?)
- Look into `NodeRecord` storage for pathfinder, since it's taking 2MB+ of memory!

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.anuke.mindustry"
android:versionCode="20"
android:versionName="3.04b" >
android:versionCode="22"
android:versionName="3.06b" >
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="25" />

View File

@ -79,7 +79,7 @@ project(":core") {
apply plugin: "java"
dependencies {
compile 'com.github.Anuken:ucore:191a0bc25a'
compile 'com.github.Anuken:ucore:6238d06'
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-ai:1.8.1"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 B

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -27,7 +27,7 @@ public class Vars{
//how far away from spawn points the player can't place blocks
public static final float enemyspawnspace = 65;
//scale of the font
public static final float fontscale = Unit.dp.inPixels(1f)/2f;
public static float fontscale = Unit.dp.inPixels(1f)/2f;
//camera zoom displayed on startup
public static final int baseCameraScale = Math.round(Unit.dp.inPixels(4));
//how much the zoom changes every zoom button press

View File

@ -199,9 +199,7 @@ public class Control extends Module{
play();
});
Timers.run(18, ()->{
ui.hideLoading();
});
Timers.run(18, ()-> ui.hideLoading());
}
public GameMode getMode(){
@ -306,9 +304,7 @@ public class Control extends Module{
}
Effects.effect(Fx.coreexplosion, core.worldx(), core.worldy());
Timers.run(60, ()->{
ui.showRestart();
});
Timers.run(60, ()-> ui.showRestart());
}
float waveSpacing(){

View File

@ -32,19 +32,22 @@ import io.anuke.ucore.entities.DestructibleEntity;
import io.anuke.ucore.entities.EffectEntity;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.graphics.CacheBatch;
import io.anuke.ucore.graphics.Surface;
import io.anuke.ucore.modules.RendererModule;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.scene.utils.Cursors;
import io.anuke.ucore.util.*;
public class Renderer extends RendererModule{
String[] surfaces = { "shadow", "shield", "pixel", "indicators" };
int targetscale = baseCameraScale;
int chunksize = 32;
int[][][] cache;
FloatArray shieldHits = new FloatArray();
float shieldHitDuration = 18f;
CacheBatch cbatch;
private final static int chunksize = 32;
private final static float shieldHitDuration = 18f;
public Surface shadowSurface, shieldSurface, indicatorSurface;
private int targetscale = baseCameraScale;
private int[][][] cache;
private FloatArray shieldHits = new FloatArray();
private CacheBatch cbatch;
public Renderer() {
Core.cameraScale = baseCameraScale;
@ -63,9 +66,12 @@ public class Renderer extends RendererModule{
@Override
public void init(){
pixelate = Settings.getBool("pixelate");
for(String surface : surfaces){
Graphics.addSurface(surface, Settings.getBool("pixelate") ? Core.cameraScale : 1);
}
int scale = Settings.getBool("pixelate") ? Core.cameraScale : 1;
shadowSurface = Graphics.createSurface(scale);
shieldSurface = Graphics.createSurface(scale);
indicatorSurface = Graphics.createSurface(scale);
pixelSurface = Graphics.createSurface(scale);
}
public void setPixelate(boolean pixelate){
@ -81,9 +87,7 @@ public class Renderer extends RendererModule{
if(Mathf.in(camera.zoom, targetzoom, 0.005f)){
camera.zoom = 1f;
Core.cameraScale = targetscale;
camera.viewportWidth = Gdx.graphics.getWidth() / Core.cameraScale;
camera.viewportHeight = Gdx.graphics.getHeight() / Core.cameraScale;
Graphics.setCameraScale(targetscale);
AndroidInput.mousex = Gdx.graphics.getWidth() / 2;
AndroidInput.mousey = Gdx.graphics.getHeight() / 2;
@ -158,12 +162,15 @@ public class Renderer extends RendererModule{
@Override
public void draw(){
Graphics.surface("shield");
//clera shield surface
Graphics.surface(shieldSurface);
Graphics.surface();
boolean optimize = false;
Profiler.begin("blockDraw");
drawFloor();
drawBlocks(false);
drawBlocks(false, optimize);
Profiler.end("blockDraw");
Profiler.begin("entityDraw");
@ -177,11 +184,11 @@ public class Renderer extends RendererModule{
Profiler.end("entityDraw");
drawBlocks(true);
if(!optimize) drawBlocks(true, false);
drawShield();
renderPixelOverlay();
drawOverlay();
if(Settings.getBool("indicators")){
drawEnemyMarkers();
@ -198,7 +205,7 @@ public class Renderer extends RendererModule{
}
void drawEnemyMarkers(){
Graphics.surface("indicators");
Graphics.surface(indicatorSurface);
Draw.color(Color.RED);
//Draw.alpha(0.6f);
for(Enemy enemy : control.enemyGroup.all()){
@ -232,7 +239,7 @@ public class Renderer extends RendererModule{
}
}
Texture texture = Graphics.getSurface("shield").texture();
Texture texture = shieldSurface.texture();
Shaders.shield.color.set(Color.SKY);
Tmp.tr2.setRegion(texture);
@ -273,8 +280,8 @@ public class Renderer extends RendererModule{
Graphics.end();
int crangex = (int) (camera.viewportWidth / (chunksize * tilesize)) + 1;
int crangey = (int) (camera.viewportHeight / (chunksize * tilesize)) + 1;
int crangex = Math.round(camera.viewportWidth * camera.zoom / (chunksize * tilesize));
int crangey = Math.round(camera.viewportHeight * camera.zoom / (chunksize * tilesize));
drawCache(0, crangex, crangey);
@ -303,12 +310,12 @@ public class Renderer extends RendererModule{
}
}
void drawBlocks(boolean top){
void drawBlocks(boolean top, boolean optimize){
int crangex = (int) (camera.viewportWidth / (chunksize * tilesize)) + 1;
int crangey = (int) (camera.viewportHeight / (chunksize * tilesize)) + 1;
int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2) + 2;
int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2) + 2;
int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2)+2;
int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2)+2;
boolean noshadows = Settings.getBool("noshadows");
@ -318,8 +325,8 @@ public class Renderer extends RendererModule{
Layer[] layers = Layer.values();
int start = top ? 4 : (noshadows ? 1 : 0);
int end = top ? 4 + layers.length-1 : 4;
int start = optimize ? (noshadows ? 1 : 0) : (top ? 4 : (noshadows ? 1 : 0));
int end = optimize ? 4 : (top ? 4 + layers.length-1 : 4);
//0 = shadows
//1 = cache blocks
@ -327,13 +334,13 @@ public class Renderer extends RendererModule{
//3+ = layers
for(int l = start; l < end; l++){
if(l == 0){
Graphics.surface("shadow");
Graphics.surface(shadowSurface);
}
Layer layer = l >= 3 ? layers[l - 3] : null;
boolean expand = l >= 2;
int expandr = (expand ? 4 : 0);
boolean expand = layer == Layer.power;
int expandr = (expand ? 3 : 0);
if(l == 1){
Graphics.end();
@ -353,15 +360,18 @@ public class Renderer extends RendererModule{
tile.block().drawShadow(tile);
}
}else if(!(tile.block() instanceof StaticBlock) &&
!expanded || tile.block().expanded){
(!expanded || tile.block().expanded)){
if(l == 2){
tile.block().draw(tile);
}else{
}else if(!optimize){
if(tile.block().layer == layer)
tile.block().drawLayer(tile);
if(tile.block().layer2 == layer)
tile.block().drawLayer2(tile);
}else if(l == 3){
tile.block().drawLayer(tile);
tile.block().drawLayer2(tile);
}
}
}
@ -437,7 +447,7 @@ public class Renderer extends RendererModule{
Draw.reset();
}
void renderPixelOverlay(){
void drawOverlay(){
//draw tutorial placement point
if(Vars.control.tutorial.showBlock()){
@ -571,7 +581,8 @@ public class Renderer extends RendererModule{
void drawHealth(float x, float y, float health, float maxhealth){
drawBar(Color.RED, x, y, health / maxhealth);
}
//TODO optimize!
public void drawBar(Color color, float x, float y, float fraction){
float len = 3;
@ -595,9 +606,10 @@ public class Renderer extends RendererModule{
public void setCameraScale(int amount){
targetscale = amount;
clampScale();
//scale up all surfaces in preparation for the zoom
if(Settings.getBool("pixelate")){
for(String surface : surfaces){
Graphics.getSurface(surface).setScale(targetscale);
for(Surface surface : Graphics.getSurfaces()){
surface.setScale(targetscale);
}
}
}

View File

@ -175,6 +175,17 @@ public class UI extends SceneModule{
prefs.screenshakePref();
prefs.volumePrefs();
//this is incredinbly buggy
/*
prefs.sliderPref("sscale", "UI Scale", 100, 25, 200, i ->{
Unit.dp.multiplier = i / 100f;
fontscale = Unit.dp.inPixels(1f)/2f;
skin.font().getData().setScale(fontscale);
invalidateAll();
return i + "%";
});*/
prefs.checkPref("fps", "Show FPS", false);
prefs.checkPref("noshadows", "Disable shadows", false);
@ -184,12 +195,12 @@ public class UI extends SceneModule{
prefs.checkPref("drawblocks", "Draw Blocks", true);
prefs.checkPref("pixelate", "Pixelate Screen", true, b->{
if(b){
Graphics.getSurface("pixel").setScale(Core.cameraScale);
Graphics.getSurface("shadow").setScale(Core.cameraScale);
Graphics.getSurface("shield").setScale(Core.cameraScale);
Vars.renderer.pixelSurface.setScale(Core.cameraScale);
Vars.renderer.shadowSurface.setScale(Core.cameraScale);
Vars.renderer.shieldSurface.setScale(Core.cameraScale);
}else{
Graphics.getSurface("shadow").setScale(1);
Graphics.getSurface("shield").setScale(1);
Vars.renderer.shadowSurface.setScale(1);
Vars.renderer.shieldSurface.setScale(1);
}
renderer.setPixelate(b);
});
@ -280,6 +291,15 @@ public class UI extends SceneModule{
build.end();
}
void invalidateAll(){
for(Element e : scene.getElements()){
if(e instanceof Table){
((Table)e).invalidateHierarchy();
}
}
}
public void updateWeapons(){
((WeaponFragment)weaponfrag).updateWeapons();
}

View File

@ -76,7 +76,7 @@ public class Shield extends Entity{
float rad = drawRadius();
Graphics.surface("shield", false);
Graphics.surface(Vars.renderer.shieldSurface, false);
Draw.color(Color.ROYAL);
Draw.thick(2f);
Draw.rect("circle2", x, y, rad, rad);

View File

@ -65,11 +65,10 @@ public class Enemy extends DestructibleEntity{
Tile core = Vars.control.getCore();
boolean nearCore = distanceTo(core.worldx(), core.worldy()) <= range - 18f && stopNearCore;
Vector2 vec;
if(nearCore){
vec = Tmp.v2.setZero();
vec = Tmp.v1.setZero();
if(targetCore) target = core.entity;
}else{
vec = Vars.world.pathfinder().find(this);
@ -84,9 +83,8 @@ public class Enemy extends DestructibleEntity{
Entities.getNearby(Vars.control.enemyGroup, x, y, range, other -> {
Enemy enemy = (Enemy)other;
if(other == this) return;
float dst = other.distanceTo(this);
if(other == this)
return;
if(dst < shiftRange){
float scl = Mathf.clamp(1.4f - dst / shiftRange) * enemy.mass * 1f/mass;

View File

@ -3,11 +3,11 @@ package io.anuke.mindustry.entities.enemies;
import com.badlogic.gdx.math.MathUtils;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.effect.Fx;
import io.anuke.mindustry.entities.effect.Shaders;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.util.Angles;
@ -19,19 +19,30 @@ public class HealerEnemy extends Enemy{
speed = 0.25f;
reload = 10;
maxhealth = 200;
range = 90f;
bullet = BulletType.shot;
range = 30f;
range = 40f;
alwaysRotate = false;
targetCore = false;
stopNearCore = true;
mass = 1.1f;
heal();
}
@Override
void move(){
super.move();
if(idletime > 60f*3){ //explode after 3 seconds of stillness
explode();
Effects.effect(Fx.shellexplosion, this);
Effects.effect(Fx.shellsmoke, this);
}
}
@Override
void updateTargeting(boolean nearCore){
if(Timers.get(this, "target", 15)){
if(timer.get(timerTarget, 15)){
target = Entities.getClosest(Vars.control.enemyGroup,
x, y, range, e -> e instanceof Enemy && e != this && ((Enemy)e).healthfrac() < 1f);
}
@ -47,6 +58,7 @@ public class HealerEnemy extends Enemy{
if(enemy.health < enemy.maxhealth && Timers.get(this, "heal", reload)){
enemy.health ++;
idletime = 0;
}
}
@ -68,5 +80,11 @@ public class HealerEnemy extends Enemy{
}
Graphics.shader(Shaders.outline);
}
void explode(){
Bullet b = new Bullet(BulletType.blast, this, x, y, 0).add();
b.damage = BulletType.blast.damage + (tier-1) * 40;
damage(999);
}
}

View File

@ -85,7 +85,7 @@ public class AndroidInput extends InputAdapter{
int tilex = Mathf.scl2(vec.x, tilesize);
int tiley = Mathf.scl2(vec.y, tilesize);
if(player.recipe != null && Vars.world.validPlace(tilex, tiley, player.recipe.result)){
if(player.recipe != null && Vars.control.hasItems(player.recipe.requirements) && Vars.world.validPlace(tilex, tiley, player.recipe.result)){
Vars.world.placeBlock(tilex, tiley, player.recipe.result, player.rotation);
@ -98,10 +98,7 @@ public class AndroidInput extends InputAdapter{
public static void doInput(){
if(Gdx.input.isTouched(0) && Mathf.near2d(lmousex, lmousey, Gdx.input.getX(0), Gdx.input.getY(0), Unit.dp.inPixels(50))
&& !ui.hasMouse() /*
* && (player.recipe == null || mode ==
* PlaceMode.touch)
*/){
&& !ui.hasMouse()){
warmup += Timers.delta();
float lx = mousex, ly = mousey;

View File

@ -215,6 +215,7 @@ public class HudFragment implements Fragment{
for(int i = 0; i < control.getItems().length; i ++){
int amount = control.getItems()[i];
if(amount == 0) continue;
String formatted = Mindustry.formatter.format(amount);
if(amount > 99999999){
formatted = "inf";

View File

@ -18,7 +18,7 @@ public class WeaponFragment implements Fragment{
public void build(){
weapontable = Core.scene.table();
weapontable.bottom().left();
weapontable.setVisible(()->!GameState.is(State.menu));
weapontable.setVisible(()-> !GameState.is(State.menu));
if(android){
weapontable.remove();

View File

@ -257,7 +257,7 @@ public class ProductionBlocks{
formalName = "RTG generator";
generateItem = Item.uranium;
powerCapacity = 40f;
powerOutput = 0.055f;
powerOutput = 0.05f;
itemDuration = 250f;
description = "Generates power from uranium.";
fullDescription = "Generates small amounts of power from the radioactive decay of uranium. Outputs power as lasers to its 4 sides.";

View File

@ -48,7 +48,7 @@ public class ShieldedWallBlock extends PowerBlock{
ShieldedWallEntity entity = tile.entity();
if(entity.power > powerToDamage){
Graphics.surface("shield", false);
Graphics.surface(Vars.renderer.shieldSurface, false);
Draw.color(Color.ROYAL);
Draw.rect("blank", tile.worldx(), tile.worldy(), Vars.tilesize, Vars.tilesize);
Graphics.surface();

View File

@ -26,7 +26,7 @@ public class NuclearReactor extends LiquidItemPowerGenerator{
protected Color coolColor = new Color(1, 1, 1, 0f);
protected Color hotColor = Color.valueOf("ff9575a3");
protected int fuelUseTime = 120; //time to consume 1 fuel
protected float powerMultiplier = 0.08f; //power per frame, depends on full capacity
protected float powerMultiplier = 0.2f; //power per frame, depends on full capacity
protected float heating = 0.007f; //heating per frame
protected float coolantPower = 0.007f; //how much heat decreases per coolant unit
protected float smokeThreshold = 0.3f; //threshold at which block starts smoking