Optimized conveyors and all timer blocks, edited laser FX

This commit is contained in:
Anuken
2017-12-09 13:36:41 -05:00
parent 97019064a7
commit 2c7402f809
29 changed files with 467 additions and 358 deletions

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -8,6 +8,7 @@ import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.profiling.GLProfiler; import com.badlogic.gdx.graphics.profiling.GLProfiler;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.FloatArray; import com.badlogic.gdx.utils.FloatArray;
@@ -47,8 +48,14 @@ public class Renderer extends RendererModule{
public Renderer() { public Renderer() {
Core.cameraScale = baseCameraScale; Core.cameraScale = baseCameraScale;
Effects.setEffectProvider((name, color, x, y, rotation) -> { Effects.setEffectProvider((name, color, x, y, rotation) -> {
if(Settings.getBool("effects")) if(Settings.getBool("effects")){
new EffectEntity(name, color, rotation).set(x, y).add(); Rectangle view = Tmp.r1.setSize(camera.viewportWidth, camera.viewportHeight)
.setCenter(camera.position.x, camera.position.y);
Rectangle pos = Tmp.r2.setSize(name.size).setCenter(x, y);
if(view.overlaps(pos)){
new EffectEntity(name, color, rotation).set(x, y).add();
}
}
}); });
} }

View File

@@ -4,7 +4,7 @@ import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectIntMap;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.entities.effect.Fx;
@@ -19,10 +19,12 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.Entity; import io.anuke.ucore.entities.Entity;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Timer;
public class TileEntity extends Entity{ public class TileEntity extends Entity{
public Tile tile; public Tile tile;
public ObjectMap<Item, Integer> items = new ObjectMap<>(); public ObjectIntMap<Item> items = new ObjectIntMap<>();
public Timer timer;
public int maxhealth, health; public int maxhealth, health;
public boolean dead = false; public boolean dead = false;
public boolean added; public boolean added;
@@ -37,8 +39,10 @@ public class TileEntity extends Entity{
maxhealth = tile.block().health; maxhealth = tile.block().health;
health = maxhealth; health = maxhealth;
timer = new Timer(tile.block().timers);
if(added){ if(added){
add(Entities.getGroup(TileEntity.class)); add();
} }
return this; return this;
@@ -79,12 +83,12 @@ public class TileEntity extends Entity{
} }
public boolean collide(Bullet other){ public boolean collide(Bullet other){
return other.owner instanceof Enemy; //TODO return other.owner instanceof Enemy;
} }
@Override @Override
public void update(){ public void update(){
if(health != 0 && !(tile.block() instanceof Wall) && if(health != 0 && health < tile.block().health && !(tile.block() instanceof Wall) &&
Mathf.chance(0.009f*Timers.delta()*(1f-(float)health/maxhealth))){ Mathf.chance(0.009f*Timers.delta()*(1f-(float)health/maxhealth))){
Effects.effect(Fx.smoke, x+Mathf.range(4), y+Mathf.range(4)); Effects.effect(Fx.smoke, x+Mathf.range(4), y+Mathf.range(4));
@@ -120,4 +124,9 @@ public class TileEntity extends Entity{
public void removeItem(Item item, int amount){ public void removeItem(Item item, int amount){
items.put(item, items.get(item, 0) - amount); items.put(item, items.get(item, 0) - amount);
} }
@Override
public TileEntity add(){
return add(Entities.getGroup(TileEntity.class));
}
} }

View File

@@ -71,7 +71,7 @@ public class WaveCreator{
after = 12; after = 12;
amount = 3; amount = 3;
spacing = 5; spacing = 5;
scaling = 2; scaling = 3;
}}, }},
new EnemySpawn(EmpEnemy.class){{ new EnemySpawn(EmpEnemy.class){{
@@ -107,7 +107,7 @@ public class WaveCreator{
new EnemySpawn(HealerEnemy.class){{ new EnemySpawn(HealerEnemy.class){{
after = 16; after = 16;
spacing = 5; spacing = 5;
scaling = 1; scaling = 2;
amount = 2; amount = 2;
}}, }},
//end boss wave //end boss wave
@@ -117,14 +117,14 @@ public class WaveCreator{
after = 16 + 5; after = 16 + 5;
amount = 1; amount = 1;
spacing = 5; spacing = 5;
scaling = 1; scaling = 2;
}}, }},
new EnemySpawn(EmpEnemy.class){{ new EnemySpawn(EmpEnemy.class){{
after = 16 + 5; after = 16 + 5;
amount = 1; amount = 1;
spacing = 5; spacing = 5;
scaling = 1; scaling = 2;
}} }}
//end enchanced boss wave //end enchanced boss wave
); );

View File

@@ -17,7 +17,7 @@ public class Fx{
public static final Effect public static final Effect
generatorexplosion = new Effect(28, e -> { generatorexplosion = new Effect(28, 40f, e -> {
Angles.randLenVectors(e.id, 16, 10f + e.ifract()*8f, (x, y)->{ Angles.randLenVectors(e.id, 16, 10f + e.ifract()*8f, (x, y)->{
float size = e.fract()*12f + 1f; float size = e.fract()*12f + 1f;
Draw.color(Color.WHITE, lightOrange, e.ifract()); Draw.color(Color.WHITE, lightOrange, e.ifract());
@@ -44,7 +44,7 @@ public class Fx{
}); });
}), }),
nuclearcloud = new Effect(90, e -> { nuclearcloud = new Effect(90, 200f, e -> {
Angles.randLenVectors(e.id, 10, e.powfract()*90f, (x, y)->{ Angles.randLenVectors(e.id, 10, e.powfract()*90f, (x, y)->{
float size = e.fract()*14f; float size = e.fract()*14f;
Draw.color(Color.LIME, Color.GRAY, e.ifract()); Draw.color(Color.LIME, Color.GRAY, e.ifract());
@@ -106,14 +106,14 @@ public class Fx{
Draw.reset(); Draw.reset();
}), }),
shockwave = new Effect(10f, e -> { shockwave = new Effect(10f, 80f, e -> {
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract());
Draw.thick(e.fract()*2f + 0.2f); Draw.thick(e.fract()*2f + 0.2f);
Draw.circle(e.x, e.y, e.ifract()*28f); Draw.circle(e.x, e.y, e.ifract()*28f);
Draw.reset(); Draw.reset();
}), }),
nuclearShockwave = new Effect(10f, e -> { nuclearShockwave = new Effect(10f, 200f, e -> {
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract());
Draw.thick(e.fract()*3f + 0.2f); Draw.thick(e.fract()*3f + 0.2f);
Draw.polygon(40, e.x, e.y, e.ifract()*140f); Draw.polygon(40, e.x, e.y, e.ifract()*140f);
@@ -366,7 +366,7 @@ public class Fx{
Draw.reset(); Draw.reset();
}), }),
titanExplosion = new Effect(11, e -> { titanExplosion = new Effect(11, 48f, e -> {
Draw.thickness(2f*e.fract()+0.5f); Draw.thickness(2f*e.fract()+0.5f);
Draw.color(Color.WHITE, Color.DARK_GRAY, e.powfract()); Draw.color(Color.WHITE, Color.DARK_GRAY, e.powfract());
Draw.circle(e.x, e.y, 5f + e.powfract() * 8f); Draw.circle(e.x, e.y, 5f + e.powfract() * 8f);

View File

@@ -11,15 +11,15 @@ import io.anuke.mindustry.entities.effect.Shaders;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.*; import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.*; import io.anuke.ucore.entities.*;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.*;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp;
public class Enemy extends DestructibleEntity{ public class Enemy extends DestructibleEntity{
public final static Color[] tierColors = { Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), Color.valueOf("ff2d86") }; public final static Color[] tierColors = { Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), Color.valueOf("ff2d86") };
public final static int maxtier = 4; public final static int maxtier = 4;
public final static float maxIdle = 60*1.5f; public final static float maxIdle = 60*1.5f;
protected int timeid;
protected Timer timer = new Timer(5);
protected float speed = 0.4f; protected float speed = 0.4f;
protected float reload = 32; protected float reload = 32;
protected float range = 60; protected float range = 60;
@@ -37,7 +37,7 @@ public class Enemy extends DestructibleEntity{
protected boolean stopNearCore = true; protected boolean stopNearCore = true;
protected float mass = 1f; protected float mass = 1f;
public float idletime = 0f; public float idletime = 0f;
public int spawn; public int spawn;
public int node = -1; public int node = -1;
public Tile[] path; public Tile[] path;
@@ -45,6 +45,9 @@ public class Enemy extends DestructibleEntity{
public float xvelocity, yvelocity; public float xvelocity, yvelocity;
public Entity target; public Entity target;
public int tier = 1; public int tier = 1;
protected final int timerTarget = timeid ++;
protected final int timerReload = timeid ++;
public Enemy() { public Enemy() {
hitbox.setSize(5f); hitbox.setSize(5f);
@@ -110,7 +113,7 @@ public class Enemy extends DestructibleEntity{
target = null; target = null;
} }
if(Timers.get(this, "target", 15) && !nearCore){ if(timer.get(timerTarget, 15) && !nearCore){
target = Vars.world.findTileTarget(x, y, null, range, false); target = Vars.world.findTileTarget(x, y, null, range, false);
//no tile found //no tile found
@@ -127,7 +130,7 @@ public class Enemy extends DestructibleEntity{
} }
void updateShooting(){ void updateShooting(){
if(Timers.get(this, "reload", reload * Vars.multiplier)){ if(timer.get(timerReload, reload * Vars.multiplier)){
shoot(bullet); shoot(bullet);
if(shootsound != null) Effects.sound(shootsound, this); if(shootsound != null) Effects.sound(shootsound, this);
} }

View File

@@ -269,7 +269,7 @@ public class SaveIO{
for(Item item : tile.entity.items.keys()){ for(Item item : tile.entity.items.keys()){
stream.writeByte(item.ordinal()); //item ID stream.writeByte(item.ordinal()); //item ID
stream.writeInt(tile.entity.items.get(item)); //item amount stream.writeInt(tile.entity.items.get(item, 0)); //item amount
} }
tile.entity.write(stream); tile.entity.write(stream);

View File

@@ -37,7 +37,7 @@ public class SaveDialog extends LoadDialog{
} }
void save(int slot){ void save(int slot){
Vars.ui.showLoading("[orange]Saving..."); Vars.ui.showLoading("[accent]Saving...");
Timers.runTask(5f, () -> { Timers.runTask(5f, () -> {
hide(); hide();

View File

@@ -10,6 +10,7 @@ import io.anuke.mindustry.Mindustry;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.GameMode; import io.anuke.mindustry.world.GameMode;
@@ -141,6 +142,8 @@ public class HudFragment implements Fragment{
new table(){{ new table(){{
abottom(); abottom();
aleft(); aleft();
new label((StringSupplier)()->"[purple]tiles: " + Entities.getGroup(TileEntity.class).amount()).left();
row();
new label((StringSupplier)()->"[purple]enemies: " + Entities.getGroup(Enemy.class).amount()).left(); new label((StringSupplier)()->"[purple]enemies: " + Entities.getGroup(Enemy.class).amount()).left();
row(); row();
new label((StringSupplier)()->"[orange]noclip: " + Vars.noclip).left(); new label((StringSupplier)()->"[orange]noclip: " + Vars.noclip).left();

View File

@@ -69,6 +69,8 @@ public class Block{
public String fullDescription; public String fullDescription;
/**Whether to draw this block in the expanded draw range.*/ /**Whether to draw this block in the expanded draw range.*/
public boolean expanded = false; public boolean expanded = false;
/**Max of timers used.*/
public int timers = 0;
public Block(String name) { public Block(String name) {
blocks.add(this); blocks.add(this);
@@ -201,7 +203,6 @@ public class Block{
Tile other = tile.getNearby()[tile.getRotation()]; Tile other = tile.getNearby()[tile.getRotation()];
if(other != null && other.block().acceptItem(item, other, tile)){ if(other != null && other.block().acceptItem(item, other, tile)){
other.block().handleItem(item, other, tile); other.block().handleItem(item, other, tile);
//other.entity.addCovey(item, ch == 1 ? 0.5f : ch ==2 ? 1f : 0f);
return true; return true;
} }
return false; return false;

View File

@@ -2,17 +2,20 @@ package io.anuke.mindustry.world;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.enemies.TargetEnemy; import io.anuke.mindustry.entities.enemies.TargetEnemy;
import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.mindustry.world.blocks.*;
import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.mindustry.world.blocks.types.Floor;
import io.anuke.ucore.graphics.Hue; import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.noise.Noise; import io.anuke.ucore.noise.Noise;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class Generator{ public class Generator{
public static boolean debugBlockspam = false;
static final int spawn = Color.rgba8888(Color.RED); static final int spawn = Color.rgba8888(Color.RED);
static final int start = Color.rgba8888(Color.GREEN); static final int start = Color.rgba8888(Color.GREEN);
@@ -117,9 +120,9 @@ public class Generator{
} }
//preformance debugging //preformance debugging
//if(Vector2.dst(pixmap.getWidth()/2, pixmap.getHeight()/2, x, y) < 30){ if(debugBlockspam && Vector2.dst(0, 0, x, y) < 260){
// block = Mathf.choose(ProductionBlocks.stonedrill, DistributionBlocks.conveyor); block = Mathf.choose(ProductionBlocks.omnidrill, DistributionBlocks.conveyor, DistributionBlocks.router, WeaponBlocks.turret);
//} }
tiles[x][y].setBlock(block, 0); tiles[x][y].setBlock(block, 0);
tiles[x][y].setFloor(floor); tiles[x][y].setFloor(floor);

View File

@@ -1,6 +1,7 @@
package io.anuke.mindustry.world.blocks; package io.anuke.mindustry.world.blocks;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.entities.effect.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
@@ -8,7 +9,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.production.*; import io.anuke.mindustry.world.blocks.types.production.*;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
public class ProductionBlocks{ public class ProductionBlocks{
public static final Block public static final Block
@@ -192,6 +192,9 @@ public class ProductionBlocks{
omnidrill = new Drill("omnidrill"){ omnidrill = new Drill("omnidrill"){
{ {
drillEffect = Fx.sparkbig;
resource = null;
result = null;
time = 3; time = 3;
formalName = "omnidrill"; formalName = "omnidrill";
description = "Mines 1 of any resource every "+time+" seconds."; description = "Mines 1 of any resource every "+time+" seconds.";
@@ -200,13 +203,14 @@ public class ProductionBlocks{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
TileEntity entity = tile.entity;
if(tile.floor().drops != null && Timers.get(tile, "drill", 60 * time)){ if(tile.floor().drops != null && entity.timer.get(timerDrill, 60 * time)){
offloadNear(tile, tile.floor().drops.item); offloadNear(tile, tile.floor().drops.item);
Effects.effect(Fx.sparkbig, tile.worldx(), tile.worldy()); Effects.effect(drillEffect, tile.worldx(), tile.worldy());
} }
if(Timers.get(tile, "dump", 30)){ if(entity.timer.get(timerDump, 30)){
tryDump(tile); tryDump(tile);
} }
} }

View File

@@ -11,10 +11,11 @@ import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class LiquidBlock extends Block implements LiquidAcceptor{ public class LiquidBlock extends Block implements LiquidAcceptor{
protected final int timerFlow = timers++;
protected float liquidCapacity = 10f; protected float liquidCapacity = 10f;
protected float flowfactor = 4.9f; protected float flowfactor = 4.9f;
@@ -56,7 +57,7 @@ public class LiquidBlock extends Block implements LiquidAcceptor{
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity(); LiquidEntity entity = tile.entity();
if(entity.liquidAmount > 0.01f && Timers.get(entity, "flow", 3)){ if(entity.liquidAmount > 0.01f && entity.timer.get(timerFlow, 3)){
tryMoveLiquid(tile, tile.getNearby()[tile.getRotation()]); tryMoveLiquid(tile, tile.getNearby()[tile.getRotation()]);
} }

View File

@@ -46,7 +46,7 @@ public class RepairTurret extends PowerTurret{
entity.blockTarget = null; entity.blockTarget = null;
} }
if(Timers.get(entity, "blocktarget", targetInterval)){ if(entity.timer.get(timerTarget, targetInterval)){
entity.blockTarget = Vars.world.findTileTarget(tile.worldx(), tile.worldy(), tile, range, true); entity.blockTarget = Vars.world.findTileTarget(tile.worldx(), tile.worldy(), tile, range, true);
} }
@@ -54,7 +54,7 @@ public class RepairTurret extends PowerTurret{
float target = entity.angleTo(entity.blockTarget); float target = entity.angleTo(entity.blockTarget);
entity.rotation = Mathf.slerp(entity.rotation, target, 0.16f*Timers.delta()); entity.rotation = Mathf.slerp(entity.rotation, target, 0.16f*Timers.delta());
if(Timers.get(tile, "reload", reload) && Angles.angleDist(target, entity.rotation) < shootCone){ if(entity.timer.get(timerReload, reload) && Angles.angleDist(target, entity.rotation) < shootCone){
entity.blockTarget.health++; entity.blockTarget.health++;
if(entity.blockTarget.health > entity.blockTarget.health) if(entity.blockTarget.health > entity.blockTarget.health)

View File

@@ -30,6 +30,9 @@ public class Turret extends Block{
static final int targetInterval = 15; static final int targetInterval = 15;
static boolean drawDebug = false; static boolean drawDebug = false;
protected final int timerTarget = timers++;
protected final int timerReload = timers++;
protected float range = 50f; protected float range = 50f;
protected float reload = 10f; protected float reload = 10f;
protected float inaccuracy = 0f; protected float inaccuracy = 0f;
@@ -141,11 +144,9 @@ public class Turret extends Block{
if(hasAmmo(tile) || (Vars.debug && Vars.infiniteAmmo)){ if(hasAmmo(tile) || (Vars.debug && Vars.infiniteAmmo)){
if(Timers.get(entity, "target", targetInterval)){ if(entity.timer.get(timerTarget, targetInterval)){
entity.target = (Enemy)Entities.getClosest(Entities.getGroup(Enemy.class), entity.target = (Enemy)Entities.getClosest(Entities.getGroup(Enemy.class),
tile.worldx(), tile.worldy(), range, e-> tile.worldx(), tile.worldy(), range, e-> e instanceof Enemy && !((Enemy)e).isDead());
e instanceof Enemy && !((Enemy)e).isDead()
);
} }
if(entity.target != null){ if(entity.target != null){
@@ -157,7 +158,7 @@ public class Turret extends Block{
rotatespeed*Timers.delta()); rotatespeed*Timers.delta());
float reload = Vars.multiplier*this.reload; float reload = Vars.multiplier*this.reload;
if(Angles.angleDist(entity.rotation, targetRot) < shootCone && Timers.get(tile, "reload", reload)){ if(Angles.angleDist(entity.rotation, targetRot) < shootCone && entity.timer.get(timerReload, reload)){
if(shootsound != null) Effects.sound(shootsound, entity); if(shootsound != null) Effects.sound(shootsound, entity);
shoot(tile); shoot(tile);
consumeAmmo(tile); consumeAmmo(tile);

View File

@@ -5,8 +5,10 @@ import static io.anuke.mindustry.Vars.tilesize;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.AbstractList;
import java.util.Collections;
import java.util.List;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntArray;
@@ -76,22 +78,14 @@ public class Conveyor extends Block{
int value = entity.convey.get(i); int value = entity.convey.get(i);
ItemPos pos = pos1.set(value); ItemPos pos = pos1.set(value);
boolean canmove = true; boolean canmove = i == entity.convey.size - 1 ||
!(pos2.set(entity.convey.get(i + 1)).y - pos.y < 0.135 * Timers.delta());
for(int j = 0; j < entity.convey.size; j ++){
ItemPos other = pos2.set(entity.convey.get(j));
if(other.y > pos.y && other.y - pos.y < 0.14 * Timers.delta()){
canmove = false;
break;
}
}
if(canmove){ if(canmove){
pos.y += Math.max(speed * Timers.delta(), 1f/252f); //TODO fix precision issues? pos.y += Math.max(speed * Timers.delta(), 1f/252f); //TODO fix precision issues?
pos.x = MathUtils.lerp(pos.x, 0, 0.06f * Timers.delta()); pos.x = Mathf.lerpDelta(pos.x, 0, 0.06f);
}else{ }else{
pos.x = MathUtils.lerp(pos.x, pos.seed/128f/3f, 0.1f * Timers.delta()); pos.x = Mathf.lerpDelta(pos.x, pos.seed/128f/3f, 0.1f);
} }
pos.y = Mathf.clamp(pos.y); pos.y = Mathf.clamp(pos.y);
@@ -135,7 +129,21 @@ public class Conveyor extends Block{
float y = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; float y = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0;
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
entity.convey.add(ItemPos.packItem(item, y*0.9f, pos, (byte)Mathf.random(255))); int result = ItemPos.packItem(item, y*0.9f, pos, (byte)Mathf.random(255));
boolean inserted = false;
for(int i = 0; i < entity.convey.size; i ++){
if(compareItems(result, entity.convey.get(i)) < 0){
entity.convey.insert(i, result);
inserted = true;
break;
}
}
//this item must be greater than anything there...
if(!inserted){
entity.convey.add(result);
}
} }
/** /**
@@ -167,9 +175,41 @@ public class Conveyor extends Block{
for(int i = 0; i < amount; i ++){ for(int i = 0; i < amount; i ++){
convey.add(stream.readInt()); convey.add(stream.readInt());
} }
sort(convey.items, convey.size);
} }
} }
private static void sort(int[] elements, int length){
List<Integer> wrapper = new AbstractList<Integer>() {
@Override
public Integer get(int index) {
return elements[index];
}
@Override
public int size() {
return length;
}
@Override
public Integer set(int index, Integer element) {
int v = elements[index];
elements[index] = element;
return v;
}
};
Collections.sort(wrapper, Conveyor::compareItems);
}
private static int compareItems(int a, int b){
pos1.set(a);
pos2.set(b);
return Float.compare(pos1.y, pos2.y);
}
//Container class. Do not instantiate. //Container class. Do not instantiate.
static class ItemPos{ static class ItemPos{
Item item; Item item;

View File

@@ -6,9 +6,10 @@ import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock; import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Timers;
public class LiquidRouter extends LiquidBlock{ public class LiquidRouter extends LiquidBlock{
protected final int timerDump = timers++;
private ObjectMap<Tile, Byte> lastmap = new ObjectMap<>(); private ObjectMap<Tile, Byte> lastmap = new ObjectMap<>();
public LiquidRouter(String name) { public LiquidRouter(String name) {
@@ -21,7 +22,7 @@ public class LiquidRouter extends LiquidBlock{
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity(); LiquidEntity entity = tile.entity();
if(Timers.get(tile, "dump", 2) && entity.liquidAmount > 0){ if(entity.timer.get(timerDump, 2) && entity.liquidAmount > 0){
if(lastmap.get(tile, (byte)-1) != tile.getRotation()){ if(lastmap.get(tile, (byte)-1) != tile.getRotation()){
tryMoveLiquid(tile, tile.getNearby()[tile.getRotation()]); tryMoveLiquid(tile, tile.getNearby()[tile.getRotation()]);
} }

View File

@@ -8,28 +8,29 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor; import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.mindustry.world.blocks.types.production.Generator; import io.anuke.mindustry.world.blocks.types.production.Generator;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class PowerBooster extends Generator{ public class PowerBooster extends Generator{
public int powerRange = 4; protected final int timerGenerate = timers++;
public int powerRange = 4;
public PowerBooster(String name) { public PowerBooster(String name) {
super(name); super(name);
explosive = false; explosive = false;
hasLasers = false; hasLasers = false;
powerSpeed = 0.4f; powerSpeed = 0.4f;
} }
@Override @Override
public void drawPixelOverlay(Tile tile){ public void drawPixelOverlay(Tile tile){
super.drawPixelOverlay(tile); super.drawPixelOverlay(tile);
Draw.color("yellow"); Draw.color("yellow");
Draw.dashCircle(tile.worldx(), tile.worldy(), powerRange * Vars.tilesize); Draw.dashCircle(tile.worldx(), tile.worldy(), powerRange * Vars.tilesize);
Draw.reset(); Draw.reset();
} }
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
Draw.color("purple"); Draw.color("purple");
@@ -37,69 +38,70 @@ public class PowerBooster extends Generator{
Draw.dashCircle(x * Vars.tilesize, y * Vars.tilesize, powerRange * Vars.tilesize); Draw.dashCircle(x * Vars.tilesize, y * Vars.tilesize, powerRange * Vars.tilesize);
Draw.reset(); Draw.reset();
} }
@Override @Override
public void getStats(Array<String> list){ public void getStats(Array<String> list){
super.getStats(list); super.getStats(list);
list.add("[powerinfo]Power Range: " + powerRange + " tiles"); list.add("[powerinfo]Power Range: " + powerRange + " tiles");
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
distributePower(tile); distributePower(tile);
} }
@Override @Override
public void drawOver(Tile tile){} public void drawOver(Tile tile){
}
@Override @Override
public boolean acceptsPower(Tile tile){ public boolean acceptsPower(Tile tile){
PowerEntity entity = tile.entity(); PowerEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity; return entity.power + 0.001f <= powerCapacity;
} }
//TODO better distribution //TODO better distribution
protected void distributePower(Tile tile){ protected void distributePower(Tile tile){
if(!Timers.get(tile, "generate", powerTime)){ PowerEntity p = tile.entity();
return;
} if(!p.timer.get(timerGenerate, powerTime)){
return;
}
PowerEntity p = tile.entity(); int acceptors = 0;
float flow = 0f;
int acceptors = 0; for(int i = 0; i < 2; i++){
float flow = 0f; for(int x = -powerRange; x <= powerRange; x++){
for(int y = -powerRange; y <= powerRange; y++){
for(int i = 0; i < 2; i++){ if(x == 0 && y == 0){
for(int x = -powerRange; x <= powerRange; x++){ continue;
for(int y = -powerRange; y <= powerRange; y++){ }
if(x == 0 && y == 0){ if(Vector2.dst(x, y, 0, 0) < powerRange){
continue; Tile dest = Vars.world.tile(tile.x + x, tile.y + y);
} if(dest != null && dest.block() instanceof PowerAcceptor && ((PowerAcceptor) dest.block()).acceptsPower(dest)){
if(i == 1){
PowerAcceptor block = (PowerAcceptor) dest.block();
if(Vector2.dst(x, y, 0, 0) < powerRange){ float transmission = Math.min(flow, p.power);
Tile dest = Vars.world.tile(tile.x + x, tile.y + y);
if(dest != null && dest.block() instanceof PowerAcceptor && ((PowerAcceptor) dest.block()).acceptsPower(dest)){
if(i == 1){
PowerAcceptor block = (PowerAcceptor) dest.block();
float transmission = Math.min(flow, p.power); float amount = block.addPower(dest, transmission);
p.power -= amount;
float amount = block.addPower(dest, transmission); }else{
p.power -= amount; acceptors++;
}else{
acceptors++;
}
} }
} }
} }
} }
}
//TODO better distribution scheme //TODO better distribution scheme
if(i == 0 && acceptors > 0){ if(i == 0 && acceptors > 0){
flow = Mathf.clamp(p.power / acceptors, 0f, powerSpeed / acceptors); flow = Mathf.clamp(p.power / acceptors, 0f, powerSpeed / acceptors);
}
} }
} }
}
} }

View File

@@ -8,10 +8,11 @@ import io.anuke.mindustry.Vars;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class Router extends Block{ public class Router extends Block{
protected final int timerDump = timers++;
private ObjectMap<Tile, Byte> lastmap = new ObjectMap<>(); private ObjectMap<Tile, Byte> lastmap = new ObjectMap<>();
int capacity = 20; int capacity = 20;
@@ -34,7 +35,7 @@ public class Router extends Block{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
if(Timers.get(tile, "dump", 2) && tile.entity.totalItems() > 0){ if(tile.entity.timer.get(timerDump, 2) && tile.entity.totalItems() > 0){
if(lastmap.get(tile, (byte)-1) != tile.getRotation() if(lastmap.get(tile, (byte)-1) != tile.getRotation()
|| Mathf.chance(0.3)){ //sometimes dump backwards at a 1/4 chance... this somehow works? || Mathf.chance(0.3)){ //sometimes dump backwards at a 1/4 chance... this somehow works?
tryDump(tile, tile.getRotation(), null); tryDump(tile, tile.getRotation(), null);

View File

@@ -9,9 +9,10 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
public class Crafter extends Block{ public class Crafter extends Block{
protected final int timerDump = timers++;
protected Item[] requirements; protected Item[] requirements;
protected Item result; protected Item result;
@@ -31,7 +32,7 @@ public class Crafter extends Block{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
if(Timers.get(tile, "dump", 20) && tile.entity.hasItem(result)){ if(tile.entity.timer.get(timerDump, 20) && tile.entity.hasItem(result)){
tryDump(tile, -1, result); tryDump(tile, -1, result);
} }

View File

@@ -2,20 +2,26 @@ package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.entities.effect.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class Drill extends Block{ public class Drill extends Block{
protected final int timerDrill = timers++;
protected final int timerDump = timers++;
protected Block resource; protected Block resource;
protected Item result; protected Item result;
protected int time = 5; protected int time = 5;
protected int capacity = 5; protected int capacity = 5;
protected Effect drillEffect = Fx.spark;
public Drill(String name) { public Drill(String name) {
super(name); super(name);
@@ -32,13 +38,15 @@ public class Drill extends Block{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
TileEntity entity = tile.entity;
if((tile.floor() == resource || (resource.drops.equals(tile.floor().drops))) && Timers.get(tile, "drill", 60 * time) && tile.entity.totalItems() < capacity){ if((tile.floor() == resource || (resource.drops.equals(tile.floor().drops)))
&& entity.timer.get(timerDrill, 60 * time) && tile.entity.totalItems() < capacity){
offloadNear(tile, result); offloadNear(tile, result);
Effects.effect(Fx.spark, tile.worldx(), tile.worldy()); Effects.effect(drillEffect, tile.worldx(), tile.worldy());
} }
if(Timers.get(tile, "dump", 30)){ if(entity.timer.get(timerDump, 30)){
tryDump(tile); tryDump(tile);
} }
} }

View File

@@ -184,9 +184,19 @@ public class Generator extends PowerBlock{
} }
float r = interfering ? 0.8f : 0f; float r = interfering ? 0.8f : 0f;
Draw.laser("laser", "laserend", tile.worldx() + Angles.x(), tile.worldy() + Angles.y(), target.worldx() - Tmp.v1.x + Mathf.range(r), target.worldy() - Tmp.v1.y + Mathf.range(r), 0.7f + Mathf.sin(Timers.time(), 2f, 0.1f * 0)); int relative = tile.relativeTo(target.x, target.y);
if(relative == -1){
Draw.laser("laser", "laserend", tile.worldx() + Angles.x(), tile.worldy() + Angles.y(),
target.worldx() - Tmp.v1.x + Mathf.range(r),
target.worldy() - Tmp.v1.y + Mathf.range(r), 0.7f);
}else{
Draw.rect("laserfull",
tile.worldx() + Geometry.getD4Points()[relative].x * width * Vars.tilesize / 2f,
tile.worldy() + Geometry.getD4Points()[relative].y * width * Vars.tilesize / 2f);
}
Draw.color(); Draw.color();
} }
} }

View File

@@ -13,10 +13,12 @@ import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
public class LiquidCrafter extends LiquidBlock{ public class LiquidCrafter extends LiquidBlock{
protected final int timerDump = timers++;
protected final int timerPurify = timers++;
/**Can be null.*/ /**Can be null.*/
public Item input = null; public Item input = null;
public int inputAmount = 5; public int inputAmount = 5;
@@ -63,7 +65,7 @@ public class LiquidCrafter extends LiquidBlock{
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity(); LiquidEntity entity = tile.entity();
if(Timers.get(tile, "purify", purifyTime) && entity.liquidAmount >= liquidAmount && if(entity.timer.get(timerPurify, purifyTime) && entity.liquidAmount >= liquidAmount &&
(input == null || entity.hasItem(input, inputAmount))){ (input == null || entity.hasItem(input, inputAmount))){
if(input != null) if(input != null)
@@ -73,7 +75,7 @@ public class LiquidCrafter extends LiquidBlock{
Effects.effect(craftEffect, tile.worldx(), tile.worldy()); Effects.effect(craftEffect, tile.worldx(), tile.worldy());
} }
if(Timers.get(tile.hashCode(), "dump", 30)){ if(entity.timer.get(timerDump, 30)){
tryDump(tile, -1, output); tryDump(tile, -1, output);
} }
} }

View File

@@ -21,6 +21,8 @@ import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp; import io.anuke.ucore.util.Tmp;
public class NuclearReactor extends LiquidItemPowerGenerator{ public class NuclearReactor extends LiquidItemPowerGenerator{
protected final int timerFuel = timers++;
protected Color coolColor = new Color(1, 1, 1, 0f); protected Color coolColor = new Color(1, 1, 1, 0f);
protected Color hotColor = Color.valueOf("ff9575a3"); protected Color hotColor = Color.valueOf("ff9575a3");
protected int fuelUseTime = 120; //time to consume 1 fuel protected int fuelUseTime = 120; //time to consume 1 fuel
@@ -53,7 +55,7 @@ public class NuclearReactor extends LiquidItemPowerGenerator{
if(fuel > 0){ if(fuel > 0){
entity.heat += fullness * heating; entity.heat += fullness * heating;
entity.power += powerMultiplier * fullness; entity.power += powerMultiplier * fullness;
if(Timers.get(tile, "fuelRemove", fuelUseTime)){ if(entity.timer.get(timerFuel, fuelUseTime)){
entity.removeItem(generateItem, 1); entity.removeItem(generateItem, 1);
} }
} }

View File

@@ -11,6 +11,9 @@ import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
public class Pump extends LiquidBlock{ public class Pump extends LiquidBlock{
protected final int timerPump = timers++;
protected final int timerDump = timers++;
protected float pumpAmount = 2f; protected float pumpAmount = 2f;
protected float pumpTime = 8f; protected float pumpTime = 8f;
@@ -59,12 +62,12 @@ public class Pump extends LiquidBlock{
LiquidEntity entity = tile.entity(); LiquidEntity entity = tile.entity();
if(tile.floor().liquidDrop != null && if(tile.floor().liquidDrop != null &&
Timers.get(tile, "pump", pumpTime) && entity.liquidAmount < liquidCapacity){ entity.timer.get(timerPump, pumpTime) && entity.liquidAmount < liquidCapacity){
entity.liquid = tile.floor().liquidDrop; entity.liquid = tile.floor().liquidDrop;
entity.liquidAmount += Math.min(pumpAmount, this.liquidCapacity - entity.liquidAmount); entity.liquidAmount += Math.min(pumpAmount, this.liquidCapacity - entity.liquidAmount);
} }
if(Timers.get(tile, "dump", 1)){ if(entity.timer.get(timerDump, pumpTime)){
tryDumpLiquid(tile); tryDumpLiquid(tile);
} }
} }