diff --git a/core/assets-raw/sprites/blocks/units/crawler-factory-top.png b/core/assets-raw/sprites/blocks/units/crawler-factory-top.png deleted file mode 100644 index e517f1b7ea..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/crawler-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/crawler-factory.png b/core/assets-raw/sprites/blocks/units/crawler-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/crawler-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/draug-factory-top.png b/core/assets-raw/sprites/blocks/units/draug-factory-top.png deleted file mode 100644 index 20dccd2958..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/draug-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/draug-factory.png b/core/assets-raw/sprites/blocks/units/draug-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/draug-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/factory-out.png b/core/assets-raw/sprites/blocks/units/factory-out.png index d7eccee9c4..4553a690dd 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-out.png and b/core/assets-raw/sprites/blocks/units/factory-out.png differ diff --git a/core/assets-raw/sprites/blocks/units/fortress-factory.png b/core/assets-raw/sprites/blocks/units/fortress-factory.png deleted file mode 100644 index 75d2917c92..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/fortress-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/ghoul-factory.png b/core/assets-raw/sprites/blocks/units/ghoul-factory.png deleted file mode 100644 index 608a1e396c..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/ghoul-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/phantom-factory-top.png b/core/assets-raw/sprites/blocks/units/phantom-factory-top.png deleted file mode 100644 index 8a6a52c48c..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/phantom-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/phantom-factory.png b/core/assets-raw/sprites/blocks/units/phantom-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/phantom-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/spirit-factory-top.png b/core/assets-raw/sprites/blocks/units/spirit-factory-top.png deleted file mode 100644 index fe0bf57a17..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/spirit-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/spirit-factory.png b/core/assets-raw/sprites/blocks/units/spirit-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/spirit-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/titan-factory.png b/core/assets-raw/sprites/blocks/units/titan-factory.png deleted file mode 100644 index a112348ba1..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/titan-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/wraith-factory-top.png b/core/assets-raw/sprites/blocks/units/wraith-factory-top.png deleted file mode 100644 index adf5e63285..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/wraith-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/wraith-factory.png b/core/assets-raw/sprites/blocks/units/wraith-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/wraith-factory.png and /dev/null differ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 2ca4ee0c87..4d2e1a2614 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -258,15 +258,15 @@ public class UnitTypes implements ContentList{ alpha = new UnitType("alpha"){{ flying = true; mineSpeed = 2f; + buildSpeed = 0.5f; drag = 0.05f; mass = 2f; speed = 2.4f; rotateSpeed = 15f; accel = 0.1f; range = 70f; - itemCapacity = 70; + itemCapacity = 30; health = 400; - buildSpeed = 0.85f; engineOffset = 6f; hitsize = 8f; @@ -292,7 +292,7 @@ public class UnitTypes implements ContentList{ range = 70f; itemCapacity = 70; health = 400; - buildSpeed = 0.4f; + buildSpeed = 0.6f; engineOffset = 6.5f; hitsize = 8f; }}; diff --git a/core/src/mindustry/entities/comp/PosComp.java b/core/src/mindustry/entities/comp/PosComp.java index 2822c72021..df114ae81f 100644 --- a/core/src/mindustry/entities/comp/PosComp.java +++ b/core/src/mindustry/entities/comp/PosComp.java @@ -27,6 +27,10 @@ abstract class PosComp implements Position{ set(this.x + x, this.y + y); } + void trns(Position pos){ + trns(pos.getX(), pos.getY()); + } + int tileX(){ return Vars.world.toTile(x); } diff --git a/core/src/mindustry/entities/comp/TileComp.java b/core/src/mindustry/entities/comp/TileComp.java index bbf4b3910a..2e2f4a3729 100644 --- a/core/src/mindustry/entities/comp/TileComp.java +++ b/core/src/mindustry/entities/comp/TileComp.java @@ -197,6 +197,11 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree return tile.absoluteRelativeTo(cx, cy); } + public @Nullable Tile frontLarge(){ + int trns = block.size/2 + 1; + return tile.getNearby(Geometry.d4(rotation()).x * trns, Geometry.d4(rotation()).y * trns); + } + public @Nullable Tilec front(){ return nearby((rotation() + 4) % 4); } @@ -217,6 +222,10 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree return tile.pos(); } + public float rotdeg(){ + return tile.rotation() * 90; + } + public int rotation(){ return tile.rotation(); } @@ -345,13 +354,30 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } + /** - * Tries dumping a payload. + * Tries moving a payload forwards. + * @param todump payload to dump. + * @return whether the payload was moved successfully + */ + public boolean movePayload(@NonNull Payload todump){ + int trns = block.size/2 + 1; + Tile next = tile.getNearby(Geometry.d4(rotation()).x * trns, Geometry.d4(rotation()).y * trns); + + if(next != null && next.entity != null && next.entity.team() == team() && next.entity.acceptPayload(this, todump)){ + next.entity.handlePayload(this, todump); + return true; + } + + return false; + } + + /** + * Tries dumping a payload to any adjacent block. * @param todump payload to dump. * @return whether the payload was moved successfully */ public boolean dumpPayload(@NonNull Payload todump){ - Array proximity = proximity(); int dump = rotation(); if(proximity.size == 0) return false; diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index b24eeabc0a..9f0dc9ed24 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -7,12 +7,11 @@ import arc.math.*; import arc.scene.style.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -29,7 +28,7 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class UnitFactory extends Block{ - public float launchVelocity = 5f; + public float payloadSpeed = 0.5f; public @Load(value = "@-top", fallback = "factory-top") TextureRegion topRegion; public @Load(value = "@-out", fallback = "factory-out") TextureRegion outRegion; public int[] capacities; @@ -128,31 +127,13 @@ public class UnitFactory extends Block{ public class UnitFactoryEntity extends TileEntity{ public int currentPlan = -1; - public float progress, time, speedScl; - public @Nullable Payload payload; + public float progress, time, speedScl, payloadPos; + public @Nullable UnitPayload payload; public float fraction(){ return currentPlan == -1 ? 0 : progress / plans[currentPlan].time; } - public void spawned(){ - progress = 0f; - - Effects.shake(2f, 3f, this); - Fx.producesmoke.at(this); - - if(!net.client() && currentPlan != -1){ - UnitPlan plan = plans[currentPlan]; - Unitc unit = plan.unit.create(team); - unit.set(x, y ); - unit.add(); - unit.rotation(90); - unit.vel().y = launchVelocity + Mathf.range(1f); - unit.vel().x = Mathf.range(1f); - Events.fire(new UnitCreateEvent(unit)); - } - } - @Override public void buildConfiguration(Table table){ Array units = Array.with(plans).map(u -> u.unit); @@ -200,7 +181,7 @@ public class UnitFactory extends Block{ Shaders.build.time = -time / 20f; Draw.shader(Shaders.build); - Draw.rect(region, x, y); + Draw.rect(region, x, y, rotation() * 90 - 90); Draw.shader(); Draw.color(Pal.accent); @@ -212,14 +193,39 @@ public class UnitFactory extends Block{ }); } + Draw.z(Layer.blockOver); + if(payload != null){ - payload.draw(x, y, rotation() * 90); + payload.draw( + x + Angles.trnsx(rotation() * 90, payloadPos), + y + Angles.trnsy(rotation() * 90, payloadPos), + rotation() * 90 + ); } - Draw.z(Layer.blockOver); + Draw.z(Layer.blockOver + 0.1f); + Draw.rect(topRegion, x, y); } + public void spawned(){ + progress = 0f; + + if(!net.client() && payload != null){ + Unitc unit = payload.unit; + unit.set(x, y); + + unit.rotation(rotation() * 90); + unit.vel().trns(rotation() * 90, payloadSpeed * 2f).add(Mathf.range(0.1f), Mathf.range(0.1f)); + unit.trns(Tmp.v1.trns(rotation() * 90, size * tilesize/2f)); + unit.trns(unit.vel()); + unit.add(); + Events.fire(new UnitCreateEvent(unit)); + } + + payload = null; + } + @Override public void updateTile(){ if(currentPlan < 0 || currentPlan >= plans.length){ @@ -235,16 +241,30 @@ public class UnitFactory extends Block{ } if(payload != null){ + payloadPos += edelta() * payloadSpeed; + if(payloadPos >= size * tilesize/2f){ + payloadPos = size * tilesize/2f; + Tile front = frontLarge(); + if(front != null && front.entity != null && front.block().outputsPayload){ + if(movePayload(payload)){ + payload = null; + } + }else if(front != null && !front.solid()){ + //create unit + Call.onUnitFactorySpawn(tile); + } + } } - if(currentPlan != -1 && payload != null){ + if(currentPlan != -1 && payload == null){ UnitPlan plan = plans[currentPlan]; if(progress >= plan.time && Units.canCreate(team)){ progress = 0f; - this.payload = new UnitPayload(plan.unit.create(team)); + payloadPos = 0f; + payload = new UnitPayload(plan.unit.create(team)); consume(); }