From 2e19504b65f86a4f531fec926d16be878d490ab0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 5 Mar 2020 20:27:42 -0500 Subject: [PATCH] it begins --- core/src/mindustry/content/Blocks.java | 33 +- core/src/mindustry/editor/DrawOperation.java | 2 +- core/src/mindustry/editor/EditorTile.java | 2 +- .../src/mindustry/editor/MapEditorDialog.java | 2 +- .../mindustry/editor/MapGenerateDialog.java | 2 +- .../mindustry/entities/def/FlyingComp.java | 2 +- core/src/mindustry/entities/def/PosComp.java | 2 +- .../mindustry/entities/def/StatusComp.java | 2 +- core/src/mindustry/entities/def/TileComp.java | 554 +++++++++--------- core/src/mindustry/entities/def/UnitComp.java | 2 +- .../mindustry/entities/def/WaterMoveComp.java | 2 +- .../src/mindustry/graphics/FloorRenderer.java | 2 +- core/src/mindustry/graphics/MenuRenderer.java | 2 +- .../mindustry/graphics/MinimapRenderer.java | 2 +- .../mindustry/maps/filters/DistortFilter.java | 2 +- .../mindustry/maps/filters/FilterOption.java | 2 +- core/src/mindustry/type/Item.java | 2 +- core/src/mindustry/type/UnitType.java | 2 +- core/src/mindustry/world/Block.java | 75 ++- core/src/mindustry/world/Tile.java | 24 +- .../src/mindustry/world/blocks/Autotiler.java | 8 +- .../mindustry/world/blocks/BuildBlock.java | 169 +++--- .../mindustry/world/blocks/LiquidBlock.java | 54 -- .../world/blocks/defense/DeflectorWall.java | 2 +- .../mindustry/world/blocks/defense/Door.java | 2 +- .../world/blocks/defense/ForceProjector.java | 4 +- .../world/blocks/defense/MendProjector.java | 4 +- .../blocks/defense/OverdriveProjector.java | 4 +- .../world/blocks/defense/ShockMine.java | 2 +- .../mindustry/world/blocks/defense/Wall.java | 2 +- .../blocks/defense/turrets/LaserTurret.java | 2 +- .../world/blocks/defense/turrets/Turret.java | 4 +- .../world/blocks/distribution/Conveyor.java | 434 +++++++------- .../world/blocks/distribution/ItemBridge.java | 2 +- .../world/blocks/distribution/Junction.java | 2 +- .../world/blocks/distribution/MassDriver.java | 4 +- .../blocks/distribution/OverflowGate.java | 2 +- .../world/blocks/distribution/Router.java | 2 +- .../world/blocks/distribution/Sorter.java | 2 +- .../world/blocks/{ => environment}/Cliff.java | 4 +- .../{ => environment}/DoubleOverlayFloor.java | 5 +- .../world/blocks/{ => environment}/Floor.java | 7 +- .../blocks/{ => environment}/OreBlock.java | 2 +- .../{ => environment}/OverlayFloor.java | 4 +- .../world/blocks/{ => environment}/Rock.java | 4 +- .../{ => blocks/environment}/StaticTree.java | 11 +- .../blocks/{ => environment}/StaticWall.java | 12 +- .../blocks/{ => environment}/TreeBlock.java | 4 +- .../world/blocks/liquid/ArmoredConduit.java | 14 +- .../world/blocks/liquid/Conduit.java | 89 ++- .../world/blocks/liquid/LiquidBlock.java | 51 ++ .../world/blocks/liquid/LiquidBridge.java | 3 +- .../blocks/liquid/LiquidExtendingBridge.java | 3 +- .../world/blocks/liquid/LiquidJunction.java | 4 +- .../blocks/liquid/LiquidOverflowGate.java | 53 -- .../world/blocks/liquid/LiquidRouter.java | 25 +- .../world/blocks/liquid/LiquidTank.java | 8 - .../mindustry/world/blocks/power/Battery.java | 2 +- .../world/blocks/power/ImpactReactor.java | 4 +- .../blocks/power/ItemLiquidGenerator.java | 4 +- .../world/blocks/power/LightBlock.java | 2 +- .../world/blocks/power/NuclearReactor.java | 4 +- .../world/blocks/{ => power}/PowerBlock.java | 2 +- .../world/blocks/power/PowerDiode.java | 4 +- .../world/blocks/power/PowerDistributor.java | 2 - .../world/blocks/power/PowerNode.java | 3 +- .../world/blocks/power/SolarGenerator.java | 2 +- .../world/blocks/power/ThermalGenerator.java | 2 +- .../world/blocks/production/Cultivator.java | 4 +- .../world/blocks/production/Drill.java | 4 +- .../world/blocks/production/Fracker.java | 4 +- .../blocks/production/GenericCrafter.java | 9 +- .../blocks/production/GenericSmelter.java | 2 +- .../world/blocks/production/Incinerator.java | 4 +- .../blocks/production/LiquidConverter.java | 2 +- .../world/blocks/production/Pump.java | 6 +- .../world/blocks/production/Separator.java | 4 +- .../world/blocks/production/SolidPump.java | 4 +- .../world/blocks/sandbox/ItemSource.java | 4 +- .../world/blocks/sandbox/LiquidSource.java | 4 +- .../world/blocks/sandbox/PowerVoid.java | 2 +- .../world/blocks/storage/CoreBlock.java | 2 +- .../world/blocks/storage/LaunchPad.java | 4 +- .../world/blocks/storage/Unloader.java | 4 +- .../world/blocks/units/CommandCenter.java | 2 +- .../mindustry/world/blocks/units/MechPad.java | 2 +- .../world/blocks/units/RepairPoint.java | 4 +- .../blocks/{ => units}/RespawnBlock.java | 2 +- .../world/blocks/units/UnitFactory.java | 4 +- .../world/meta/values/FloorValue.java | 2 +- .../src/test/java/power/PowerTestFixture.java | 1 - tools/src/mindustry/tools/Generators.java | 2 +- 92 files changed, 891 insertions(+), 948 deletions(-) delete mode 100644 core/src/mindustry/world/blocks/LiquidBlock.java rename core/src/mindustry/world/blocks/{ => environment}/Cliff.java (91%) rename core/src/mindustry/world/blocks/{ => environment}/DoubleOverlayFloor.java (85%) rename core/src/mindustry/world/blocks/{ => environment}/Floor.java (98%) rename core/src/mindustry/world/blocks/{ => environment}/OreBlock.java (98%) rename core/src/mindustry/world/blocks/{ => environment}/OverlayFloor.java (83%) rename core/src/mindustry/world/blocks/{ => environment}/Rock.java (94%) rename core/src/mindustry/world/{ => blocks/environment}/StaticTree.java (84%) rename core/src/mindustry/world/blocks/{ => environment}/StaticWall.java (88%) rename core/src/mindustry/world/blocks/{ => environment}/TreeBlock.java (85%) create mode 100644 core/src/mindustry/world/blocks/liquid/LiquidBlock.java delete mode 100644 core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java delete mode 100644 core/src/mindustry/world/blocks/liquid/LiquidTank.java rename core/src/mindustry/world/blocks/{ => power}/PowerBlock.java (88%) rename core/src/mindustry/world/blocks/{ => units}/RespawnBlock.java (98%) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index b27e8f7bac..8c8d8b6667 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1,13 +1,14 @@ package mindustry.content; import arc.*; -import arc.struct.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ctype.*; +import mindustry.entities.AllDefs.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.gen.*; @@ -18,6 +19,7 @@ import mindustry.world.blocks.*; import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.environment.*; import mindustry.world.blocks.liquid.*; import mindustry.world.blocks.logic.*; import mindustry.world.blocks.power.*; @@ -91,7 +93,7 @@ public class Blocks implements ContentList{ hasShadow = false; } - public void draw(Tile tile){} + public void draw(){} public void load(){} public void init(){} public boolean isHidden(){ @@ -110,7 +112,7 @@ public class Blocks implements ContentList{ { variants = 0; } - public void draw(Tile tile){} + public void draw(){} }; cliff = new Cliff("cliff"); @@ -511,13 +513,10 @@ public class Blocks implements ContentList{ int topRegion = reg("-top"); - drawer = tile -> { - Draw.rect(region, tile.drawx(), tile.drawy()); - - GenericCrafterEntity entity = tile.ent(); - + drawer = entity -> { + Draw.rect(region, entity.x(), entity.y()); Draw.alpha(Mathf.absin(entity.totalProgress, 3f, 0.9f) * entity.warmup); - Draw.rect(reg(topRegion), tile.drawx(), tile.drawy()); + Draw.rect(reg(topRegion), entity.x(), entity.y()); Draw.reset(); }; }}; @@ -538,24 +537,22 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name), Core.atlas.find(name + "-weave")}; - drawer = tile -> { - GenericCrafterEntity entity = tile.ent(); - - Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); - Draw.rect(reg(weaveRegion), tile.drawx(), tile.drawy(), entity.totalProgress); + drawer = entity -> { + Draw.rect(reg(bottomRegion), entity.x(), entity.y()); + Draw.rect(reg(weaveRegion), entity.x(), entity.y(), entity.totalProgress); Draw.color(Pal.accent); Draw.alpha(entity.warmup); Lines.lineAngleCenter( - tile.drawx() + Mathf.sin(entity.totalProgress, 6f, Vars.tilesize / 3f * size), - tile.drawy(), + entity.x() + Mathf.sin(entity.totalProgress, 6f, Vars.tilesize / 3f * size), + entity.y(), 90, size * Vars.tilesize / 2f); Draw.reset(); - Draw.rect(region, tile.drawx(), tile.drawy()); + Draw.rect(region, entity.x(), entity.y()); }; }}; @@ -1039,7 +1036,7 @@ public class Blocks implements ContentList{ liquidCapacity = 20f; }}; - liquidTank = new LiquidTank("liquid-tank"){{ + liquidTank = new LiquidRouter("liquid-tank"){{ requirements(Category.liquid, ItemStack.with(Items.titanium, 25, Items.metaglass, 25)); size = 3; liquidCapacity = 1500f; diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index f2e9b2ff71..c38efca996 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -6,7 +6,7 @@ import mindustry.game.Team; import mindustry.gen.TileOp; import mindustry.world.Block; import mindustry.world.Tile; -import mindustry.world.blocks.Floor; +import mindustry.world.blocks.environment.Floor; import static mindustry.Vars.content; diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 96f5adcc51..a7e37f2786 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -8,7 +8,7 @@ import mindustry.game.Team; import mindustry.gen.TileOp; import mindustry.world.Block; import mindustry.world.Tile; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import mindustry.world.modules.*; import static mindustry.Vars.state; diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index e8634f2194..48d6fe7845 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -28,7 +28,7 @@ import mindustry.ui.*; import mindustry.ui.Cicon; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index 7c90d10548..6cc3f16604 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -21,7 +21,7 @@ import mindustry.maps.filters.GenerateFilter.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/entities/def/FlyingComp.java b/core/src/mindustry/entities/def/FlyingComp.java index c94c44a0e2..bd230cc194 100644 --- a/core/src/mindustry/entities/def/FlyingComp.java +++ b/core/src/mindustry/entities/def/FlyingComp.java @@ -6,7 +6,7 @@ import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.gen.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.net; diff --git a/core/src/mindustry/entities/def/PosComp.java b/core/src/mindustry/entities/def/PosComp.java index 00b143acc4..b4eec935fb 100644 --- a/core/src/mindustry/entities/def/PosComp.java +++ b/core/src/mindustry/entities/def/PosComp.java @@ -6,7 +6,7 @@ import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.world; diff --git a/core/src/mindustry/entities/def/StatusComp.java b/core/src/mindustry/entities/def/StatusComp.java index a1440a7081..e158904a04 100644 --- a/core/src/mindustry/entities/def/StatusComp.java +++ b/core/src/mindustry/entities/def/StatusComp.java @@ -11,7 +11,7 @@ import mindustry.ctype.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import java.io.*; diff --git a/core/src/mindustry/entities/def/TileComp.java b/core/src/mindustry/entities/def/TileComp.java index d8f347c7d9..ec481b6b35 100644 --- a/core/src/mindustry/entities/def/TileComp.java +++ b/core/src/mindustry/entities/def/TileComp.java @@ -4,21 +4,29 @@ import arc.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; import arc.func.*; +import arc.graphics.*; import arc.graphics.g2d.*; +import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; +import arc.util.ArcAnnotate.*; import arc.util.io.*; +import arc.util.pooling.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.power.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; import mindustry.world.modules.*; @@ -31,7 +39,12 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ //region vars and initialization static final float timeToSleep = 60f * 1; static final ObjectSet tmpTiles = new ObjectSet<>(); + static final Array tempTileEnts = new Array<>(); + static final Array tempTiles = new Array<>(); static int sleepingEntities = 0; + + @Import float x, y, health; + @Import Team team; transient Tile tile; transient Block block; @@ -49,10 +62,10 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ private transient boolean sleeping; private transient float sleepTime; - /** Sets this tile entity data to this tile, and adds it if necessary. */ + /** Sets this tile entity data to this and adds it if necessary. */ public Tilec init(Tile tile, boolean shouldAdd){ this.tile = tile; - this.block = tile.block(); + this.block = block(); set(tile.drawx(), tile.drawy()); if(block.activeSound != Sounds.none){ @@ -74,9 +87,9 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ //region io public final void writeBase(Writes write){ - write.f(health()); - write.b(tile.rotation()); - write.b(tile.getTeamID()); + write.f(health); + write.b(rotation()); + write.b(team.id); if(items != null) items.write(write); if(power != null) power.write(write); if(liquids != null) liquids.write(write); @@ -84,9 +97,9 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ } public final void readBase(Reads read){ - health(read.f()); - tile.rotation(read.b()); - tile.setTeam(Team.get(read.b())); + health = read.f(); + rotation(read.b()); + team = Team.get(read.b()); if(items != null) items.read(read); if(power != null) power.read(read); if(liquids != null) liquids.read(read); @@ -121,20 +134,41 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ timeScaleDuration = Math.max(timeScaleDuration, duration); } + public byte relativeTo(Tile tile){ + return relativeTo(tile.x, tile.y); + } + + /** Return relative rotation to a coordinate. Returns -1 if the coordinate is not near this tile. */ + public byte relativeTo(int cx, int cy){ + if(x == cx && y == cy - 1) return 1; + if(x == cx && y == cy + 1) return 3; + if(x == cx - 1 && y == cy) return 0; + if(x == cx + 1 && y == cy) return 2; + return -1; + } + + public byte absoluteRelativeTo(int cx, int cy){ + if(x == cx && y <= cy - 1) return 1; + if(x == cx && y >= cy + 1) return 3; + if(x <= cx - 1 && y == cy) return 0; + if(x >= cx + 1 && y == cy) return 2; + return -1; + } + public int pos(){ - return tile.pos(); + return pos(); } public int rotation(){ - return tile.rotation(); + return rotation(); } public void rotation(int rotation){ - tile.rotation(rotation); + rotation(rotation); } public Floor floor(){ - return tile.floor(); + return floor(); } public boolean interactable(Team team){ @@ -190,146 +224,140 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ //endregion //region handler methods - - - public boolean shouldConsume(Tilec tile){ + + public boolean shouldConsume(){ return true; } - public boolean productionValid(Tilec tile){ + public boolean productionValid(){ return true; } - public float getPowerProduction(Tilec tile){ + public float getPowerProduction(){ return 0f; } /** Returns the amount of items this block can accept. */ - public int acceptStack(Tilec tile, Item item, int amount, Teamc source){ - if(acceptItem(tile, tile, item) && hasItems && (source == null || source.team() == tile.team())){ - return Math.min(getMaximumAccepted(tile, item) - tile.items().get(item), amount); + public int acceptStack(Item item, int amount, Teamc source){ + if(acceptItem(this, item) && block.hasItems && (source == null || source.team() == team())){ + return Math.min(getMaximumAccepted(item) - items.get(item), amount); }else{ return 0; } } - public int getMaximumAccepted(Tilec tile, Item item){ - return itemCapacity; + public int getMaximumAccepted(Item item){ + return block.itemCapacity; } /** Remove a stack from this inventory, and return the amount removed. */ - public int removeStack(Tilec tile, Item item, int amount){ - if(tile.entity == null || tile.items() == null) return 0; - amount = Math.min(amount, tile.items().get(item)); - tile.noSleep(); - tile.items().remove(item, amount); + public int removeStack(Item item, int amount){ + if(items == null) return 0; + amount = Math.min(amount, items.get(item)); + noSleep(); + items.remove(item, amount); return amount; } /** Handle a stack input. */ - public void handleStack(Tilec tile, Item item, int amount, Teamc source){ - tile.noSleep(); - tile.items().add(item, amount); - } - - public boolean outputsItems(){ - return hasItems; + public void handleStack(Item item, int amount, Teamc source){ + noSleep(); + items.add(item, amount); } /** Returns offset for stack placement. */ - public void getStackOffset(Tilec tile, Item item, Vec2 trns){ + public void getStackOffset(Item item, Vec2 trns){ } - public void onProximityUpdate(Tilec tile){ - tile.noSleep(); + public void onProximityUpdate(){ + noSleep(); } - public void handleItem(Tilec tile, Tilec source, Item item){ - tile.items().add(item, 1); + public void handleItem(Tilec source, Item item){ + items.add(item, 1); } - public boolean acceptItem(Tilec tile, Tilec source, Item item){ - return consumes.itemFilters.get(item.id) && tile.items().get(item) < getMaximumAccepted(tile, item); + public boolean acceptItem(Tilec source, Item item){ + return block.consumes.itemFilters.get(item.id) && items.get(item) < getMaximumAccepted(item); } - public boolean acceptLiquid(Tilec tile, Tilec source, Liquid liquid, float amount){ - return hasLiquids && tile.liquids().get(liquid) + amount < liquidCapacity && consumes.liquidfilters.get(liquid.id); + public boolean acceptLiquid(Tilec source, Liquid liquid, float amount){ + return block.hasLiquids && liquids().get(liquid) + amount < block.liquidCapacity && block.consumes.liquidfilters.get(liquid.id); } - public void handleLiquid(Tilec tile, Tilec source, Liquid liquid, float amount){ - tile.liquids().add(liquid, amount); + public void handleLiquid(Tilec source, Liquid liquid, float amount){ + liquids().add(liquid, amount); } - public void tryDumpLiquid(Tilec tile, Liquid liquid){ - Array proximity = tile.proximity(); - int dump = tile.rotation(); + public void dumpLiquid(Liquid liquid){ + Array proximity = proximity(); + int dump = rotation(); for(int i = 0; i < proximity.size; i++){ - incrementDump(tile, proximity.size); + incrementDump(proximity.size); Tilec other = proximity.get((i + dump) % proximity.size); - //TODO fix, this is incorrect - Tilec in = Edges.getFacingEdge(tile.tile(), other.tile()).entity; + other = other.getLiquidDestination(this, liquid); - other = other.block().getLiquidDestination(other, in, liquid); - - if(other != null && other.team() == tile.team() && other.block().hasLiquids && canDumpLiquid(tile, other, liquid) && other.liquids() != null){ + if(other != null && other.team() == team() && other.block().hasLiquids && canDumpLiquid(other, liquid) && other.liquids() != null){ float ofract = other.liquids().get(liquid) / other.block().liquidCapacity; - float fract = tile.liquids().get(liquid) / liquidCapacity; + float fract = liquids().get(liquid) / block.liquidCapacity; - if(ofract < fract) tryMoveLiquid(tile, in, other, (fract - ofract) * liquidCapacity / 2f, liquid); + if(ofract < fract) moveLiquid(other, (fract - ofract) * block.liquidCapacity / 2f, liquid); } } } - public boolean canDumpLiquid(Tilec tile, Tilec to, Liquid liquid){ + public boolean canDumpLiquid(Tilec to, Liquid liquid){ return true; } - public void tryMoveLiquid(Tilec tile, Tilec tileSource, Tilec next, float amount, Liquid liquid){ + //TODO why does this exist? + /* + public void tryMoveLiquid(Tilec next, float amount, Liquid liquid){ float flow = Math.min(next.block().liquidCapacity - next.liquids().get(liquid) - 0.001f, amount); - if(next.block().acceptLiquid(next, tileSource, liquid, flow)){ - next.block().handleLiquid(next, tileSource, liquid, flow); - tile.liquids().remove(liquid, flow); + if(next.acceptLiquid(liquid, flow)){ + next.handleLiquid(liquid, flow); + liquids().remove(liquid, flow); } + }*/ + + public float moveLiquid(Tilec next, boolean leak, Liquid liquid){ + return moveLiquid(next, leak ? 1.5f : 100, liquid); } - public float tryMoveLiquid(Tilec tile, Tilec next, boolean leak, Liquid liquid){ - return tryMoveLiquid(tile, next, leak ? 1.5f : 100, liquid); - } - - public float tryMoveLiquid(Tilec tile, Tilec next, float leakResistance, Liquid liquid){ + public float moveLiquid(Tilec next, float leakResistance, Liquid liquid){ if(next == null) return 0; - next = next.block().getLiquidDestination(next, tile, liquid); + next = next.getLiquidDestination(next, liquid); - if(next.team() == tile.team() && next.block().hasLiquids && tile.liquids().get(liquid) > 0f){ + if(next.team() == team() && next.block().hasLiquids && liquids().get(liquid) > 0f){ - if(next.block().acceptLiquid(next, tile, liquid, 0f)){ + if(next.acceptLiquid(next, liquid, 0f)){ float ofract = next.liquids().get(liquid) / next.block().liquidCapacity; - float fract = tile.liquids().get(liquid) / liquidCapacity * liquidPressure; - float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.liquids().get(liquid)); + float fract = liquids().get(liquid) / block.liquidCapacity * block.liquidPressure; + float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids().get(liquid)); flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid) - 0.001f); - if(flow > 0f && ofract <= fract && next.block().acceptLiquid(next, tile, liquid, flow)){ - next.block().handleLiquid(next, tile, liquid, flow); - tile.liquids().remove(liquid, flow); + if(flow > 0f && ofract <= fract && next.acceptLiquid(this, liquid, flow)){ + next.handleLiquid(this, liquid, flow); + liquids().remove(liquid, flow); return flow; }else if(ofract > 0.1f && fract > 0.1f){ //TODO these are incorrect effect positions - float fx = (tile.x() + next.x()) / 2f, fy = (tile.y() + next.y()) / 2f; + float fx = (x() + next.x()) / 2f, fy = (y() + next.y()) / 2f; Liquid other = next.liquids().current(); if((other.flammability > 0.3f && liquid.temperature > 0.7f) || (liquid.flammability > 0.3f && other.temperature > 0.7f)){ - tile.damage(1 * Time.delta()); + damage(1 * Time.delta()); next.damage(1 * Time.delta()); if(Mathf.chance(0.1 * Time.delta())){ Fx.fire.at(fx, fy); } }else if((liquid.temperature > 0.7f && other.temperature < 0.55f) || (other.temperature > 0.7f && liquid.temperature < 0.55f)){ - tile.liquids().remove(liquid, Math.min(tile.liquids().get(liquid), 0.7f * Time.delta())); + liquids().remove(liquid, Math.min(liquids().get(liquid), 0.7f * Time.delta())); if(Mathf.chance(0.2f * Time.delta())){ Fx.steam.at(fx, fy); } @@ -337,195 +365,190 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ } } }else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){ - float leakAmount = tile.liquids().get(liquid) / leakResistance; - Puddles.deposit(next.tile(), tile.tile(), liquid, leakAmount); - tile.liquids().remove(liquid, leakAmount); + float leakAmount = liquids().get(liquid) / leakResistance; + Puddles.deposit(next.tile(), tile(), liquid, leakAmount); + liquids().remove(liquid, leakAmount); } return 0; } - public Tilec getLiquidDestination(Tilec tile, Tilec from, Liquid liquid){ - return tile; + public Tilec getLiquidDestination(Tilec from, Liquid liquid){ + return this; } /** * Tries to put this item into a nearby container, if there are no available * containers, it gets added to the block's inventory. */ - public void offloadNear(Tilec tile, Item item){ - Array proximity = tile.proximity(); - int dump = tile.rotation(); + public void offloadNear(Item item){ + Array proximity = proximity(); + int dump = rotation(); for(int i = 0; i < proximity.size; i++){ - incrementDump(tile, proximity.size); + incrementDump(proximity.size); Tilec other = proximity.get((i + dump) % proximity.size); //TODO fix position - Tilec in = Edges.getFacingEdge(tile.tile(), other.tile()).entity; - if(other.team() == tile.team() && other.block().acceptItem(other, in, item) && canDump(tile, other, item)){ - other.block().handleItem(other, in, item); + Tilec in = Edges.getFacingEdge(tile(), other.tile()).entity; + if(other.team() == team() && other.acceptItem(in, item) && canDump(other, item)){ + other.handleItem(in, item); return; } } - handleItem(tile, tile, item); + handleItem(this, item); } - /** Try dumping any item near the tile. */ - public boolean tryDump(Tilec tile){ - return tryDump(tile, null); + /** Try dumping any item near the */ + public boolean dump(){ + return dump(null); } /** - * Try dumping a specific item near the tile. + * Try dumping a specific item near the * @param todump Item to dump. Can be null to dump anything. */ - public boolean tryDump(Tilec entity, Item todump){ - if(entity == null || !hasItems || entity.items().total() == 0 || (todump != null && !entity.items().has(todump))) - return false; + public boolean dump(Item todump){ + if(!block.hasItems || items.total() == 0 || (todump != null && !items.has(todump))) return false; - Array proximity = entity.proximity(); - int dump = entity.rotation(); + Array proximity = proximity(); + int dump = rotation(); if(proximity.size == 0) return false; for(int i = 0; i < proximity.size; i++){ Tilec other = proximity.get((i + dump) % proximity.size); //TODO fix position - Tilec in = Edges.getFacingEdge(entity.tile(), other.tile()).entity; + Tilec in = Edges.getFacingEdge(tile, other.tile()).entity; if(todump == null){ for(int ii = 0; ii < content.items().size; ii++){ Item item = content.item(ii); - if(other.team() == entity.team() && entity.items().has(item) && other.block().acceptItem(other, in, item) && canDump(entity, other, item)){ - other.block().handleItem(other, in, item); - entity.items().remove(item, 1); - incrementDump(entity, proximity.size); + if(other.team() == team() && items.has(item) && other.acceptItem(in, item) && canDump(other, item)){ + other.handleItem(in, item); + items.remove(item, 1); + incrementDump(proximity.size); return true; } } }else{ - if(other.team() == entity.team() && other.block().acceptItem(other, in, todump) && canDump(entity, other, todump)){ - other.block().handleItem(other, in, todump); - entity.items().remove(todump, 1); - incrementDump(entity, proximity.size); + if(other.team() == team() && other.acceptItem(in, todump) && canDump(other, todump)){ + other.handleItem(in, todump); + items.remove(todump, 1); + incrementDump(proximity.size); return true; } } - incrementDump(entity, proximity.size); + incrementDump(proximity.size); } return false; } - protected void incrementDump(Tilec tile, int prox){ - tile.rotation((byte)((tile.rotation() + 1) % prox)); + public void incrementDump(int prox){ + rotation((byte)((rotation() + 1) % prox)); } /** Used for dumping items. */ - public boolean canDump(Tilec tile, Tilec to, Item item){ + public boolean canDump(Tilec to, Item item){ return true; } /** Try offloading an item to a nearby container in its facing direction. Returns true if success. */ - public boolean offloadDir(Tilec tile, Item item){ - Tilec other = tile.tile().front(); - if(other != null && other.team() == tile.team() && other.block().acceptItem(other, tile, item)){ - other.block().handleItem(other, tile, item); + public boolean moveForward(Item item){ + Tilec other = tile().front(); + if(other != null && other.team() == team() && other.acceptItem(this, item)){ + other.handleItem(this, item); return true; } return false; } - public boolean canBreak(Tile tile){ - return true; - } - - public void onProximityRemoved(Tilec tile){ - if(tile.power() != null){ - tile.block().powerGraphRemoved(tile); + public void onProximityRemoved(){ + if(power != null){ + powerGraphRemoved(); } } - public void onProximityAdded(Tilec tile){ - if(tile.block().hasPower) tile.block().updatePowerGraph(tile); + public void onProximityAdded(){ + if(block.hasPower) updatePowerGraph(); } - protected void updatePowerGraph(Tilec tile){ + public void updatePowerGraph(){ - for(Tilec other : getPowerConnections(tile, tempTileEnts)){ + for(Tilec other : getPowerConnections(tempTileEnts)){ if(other.power() != null){ - other.power().graph.add(tile.power().graph); + other.power().graph.add(power.graph); } } } - protected void powerGraphRemoved(Tilec tile){ - if(tile.entity == null || tile.power() == null){ + public void powerGraphRemoved(){ + if(power == null){ return; } - tile.power().graph.remove(tile); - for(int i = 0; i < tile.power().links.size; i++){ - Tile other = world.tile(tile.power().links.get(i)); + power.graph.remove(this); + for(int i = 0; i < power.links.size; i++){ + Tile other = world.tile(power.links.get(i)); if(other != null && other.entity != null && other.entity.power() != null){ - other.entity.power().links.removeValue(tile.pos()); + other.entity.power().links.removeValue(pos()); } } } - public Array getPowerConnections(Tilec tile, Array out){ + public Array getPowerConnections(Array out){ out.clear(); - if(tile == null || tile.entity == null || tile.power() == null) return out; + if(power == null) return out; - for(Tilec other : tile.proximity()){ - if(other != null && other.entity != null && other.power() != null - && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) - && !tile.power().links.contains(other.pos())){ + for(Tilec other : proximity()){ + if(other != null && other.power() != null + && !(block.consumesPower && other.block().consumesPower && !block.outputsPower && !other.block().outputsPower) + && !power.links.contains(other.pos())){ out.add(other); } } - for(int i = 0; i < tile.power().links.size; i++){ - Tile link = world.tile(tile.power().links.get(i)); + for(int i = 0; i < power.links.size; i++){ + Tile link = world.tile(power.links.get(i)); if(link != null && link.entity != null && link.entity.power() != null) out.add(link.entity); } return out; } - protected float getProgressIncrease(Tilec entity, float baseTime){ + public float getProgressIncrease(Tilec entity, float baseTime){ return 1f / baseTime * entity.delta() * entity.efficiency(); } /** @return whether this block should play its active sound.*/ - public boolean shouldActiveSound(Tilec tile){ + public boolean shouldActiveSound(){ return false; } /** @return whether this block should play its idle sound.*/ - public boolean shouldIdleSound(Tilec tile){ - return shouldConsume(tile); + public boolean shouldIdleSound(){ + return shouldConsume(); } - public void drawLayer(Tilec tile){ + public void drawLayer(){ } - public void drawLayer2(Tilec tile){ + public void drawLayer2(){ } - public void drawCracks(Tilec tile){ - if(!tile.damaged() || size > maxCrackSize) return; - int id = tile.pos(); - TextureRegion region = cracks[size - 1][Mathf.clamp((int)((1f - tile.healthf()) * crackRegions), 0, crackRegions-1)]; - Draw.colorl(0.2f, 0.1f + (1f - tile.healthf())* 0.6f); - Draw.rect(region, tile.x(), tile.y(), (id%4)*90); + public void drawCracks(){ + if(!damaged() || block.size > Block.maxCrackSize) return; + int id = pos(); + TextureRegion region = Block.cracks[block.size - 1][Mathf.clamp((int)((1f - healthf()) * Block.crackRegions), 0, Block.crackRegions-1)]; + Draw.colorl(0.2f, 0.1f + (1f - healthf())* 0.6f); + Draw.rect(region, x(), y(), (id%4)*90); Draw.color(); } /** Draw the block overlay that is shown when a cursor is over the block. */ - public void drawSelect(Tilec tile){ + public void drawSelect(){ } /** Drawn when you are placing a block. */ @@ -546,7 +569,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ float width = layout.width; font.setColor(color); - float dx = x * tilesize + offset(), dy = y * tilesize + offset() + size * tilesize / 2f + 3; + float dx = x * tilesize + block.offset(), dy = y * tilesize + block.offset() + block.size * tilesize / 2f + 3; font.draw(text, dx, dy + layout.height + 1, Align.center); dy -= 1f; Lines.stroke(2f, Color.darkGray); @@ -562,84 +585,79 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ return width; } - public void draw(Tilec tile){ - Draw.rect(region, tile.x(), tile.y(), rotate ? tile.rotation() * 90 : 0); + public void draw(){ + Draw.rect(block.region, x, y, block.rotate ? rotation() * 90 : 0); } - public void drawLight(Tilec tile){ - if(tile.entity != null && hasLiquids && drawLiquidLight && tile.liquids().current().lightColor.a > 0.001f){ - drawLiquidLight(tile, tile.liquids().current(), tile.liquids().smoothAmount()); + public void drawLight(){ + if(block.hasLiquids && block.drawLiquidLight && liquids().current().lightColor.a > 0.001f){ + drawLiquidLight(liquids().current(), liquids().smoothAmount()); } } - public void drawLiquidLight(Tilec tile, Liquid liquid, float amount){ + public void drawLiquidLight(Liquid liquid, float amount){ if(amount > 0.01f){ Color color = liquid.lightColor; float fract = 1f; float opacity = color.a * fract; if(opacity > 0.001f){ - renderer.lights.add(tile.x(), tile.y(), size * 30f * fract, color, opacity); + renderer.lights.add(x, y, block.size * 30f * fract, color, opacity); } } } - public void drawTeam(Tilec tile){ - Draw.color(tile.team().color); - Draw.rect("block-border", tile.x() - size * tilesize / 2f + 4, tile.y() - size * tilesize / 2f + 4); + public void drawTeam(){ + Draw.color(team().color); + Draw.rect("block-border", x - block.size * tilesize / 2f + 4, y - block.size * tilesize / 2f + 4); Draw.color(); } /** Called after the block is placed by this client. */ @CallSuper - public void playerPlaced(Tilec tile){ + public void playerPlaced(){ } /** Called after the block is placed by anyone. */ @CallSuper - public void placed(Tilec tile){ + public void placed(){ if(net.client()) return; - if((consumesPower && !outputsPower) || (!consumesPower && outputsPower)){ + if((block.consumesPower && !block.outputsPower) || (!block.consumesPower && block.outputsPower)){ int range = 10; tempTiles.clear(); - Geometry.circle(tile.tileX(), tile.tileY(), range, (x, y) -> { + Geometry.circle(tileX(), tileY(), range, (x, y) -> { Tilec other = world.ent(x, y); - if(other != null && other.block() instanceof PowerNode && ((PowerNode)other.block()).linkValid(other, tile) && !PowerNode.insulated(other, tile) && !other.proximity().contains(tile) && - !(outputsPower && tile.proximity().contains(p -> p.entity != null && p.power() != null && p.power().graph == other.power().graph))){ + if(other != null && other.block() instanceof PowerNode && ((PowerNode)other.block()).linkValid(other, this) && !PowerNode.insulated(other, this) && !other.proximity().contains(this) && + !(block.outputsPower && proximity().contains(p -> p.power() != null && p.power().graph == other.power().graph))){ tempTiles.add(other.tile()); } }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); if(!tempTiles.isEmpty()){ Tile toLink = tempTiles.first(); - if(!toLink.entity.power().links.contains(tile.pos())){ - toLink.configureAny(tile.pos()); + if(!toLink.entity.power().links.contains(pos())){ + toLink.configureAny(pos()); } } } } - public void removed(Tilec tile){ + public void onRemoved(){ } - /** Called every frame a unit is on this tile. */ - public void unitOn(Tilec tile, Unitc unit){ + /** Called every frame a unit is on this */ + public void unitOn(Unitc unit){ } /** Called when a unit that spawned at this tile is removed. */ - public void unitRemoved(Tilec tile, Unitc unit){ - } - - /** Returns whether ot not this block can be place on the specified tile. */ - public boolean canPlaceOn(Tile tile){ - return true; + public void unitRemoved(Unitc unit){ } /** Call when some content is produced. This unlocks the content if it is applicable. */ - public void useContent(Tilec tile, UnlockableContent content){ + public void useContent(UnlockableContent content){ //only unlocks content in zones - if(!headless && tile.team() == player.team() && state.isCampaign()){ + if(!headless && team() == player.team() && state.isCampaign()){ logic.handleContent(content); } } @@ -648,7 +666,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ Tile tile = world.tile(x, y); if(tile == null) return 0; float sum = 0; - for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ + for(Tile other : tile.getLinkedTilesAs(block, tempTiles)){ sum += other.floor().attributes.get(attr); } return sum; @@ -658,49 +676,48 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ Tile tile = world.tile(x, y); if(tile == null) return 0; float sum = 0; - for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ - sum += !other.floor.isLiquid ? 1f : 0f; + for(Tile other : tile.getLinkedTilesAs(block, tempTiles)){ + sum += !other.floor().isLiquid ? 1f : 0f; } - return sum / size / size; + return sum / block.size / block.size; } /** Called when the block is tapped. This is equivalent to being configured with null. */ - public void tapped(Tilec tile, Playerc player){ + public void tapped(Playerc player){ } /** Called when the block is destroyed. */ - public void onDestroyed(Tilec tile){ - float x = tile.x(), y = tile.y(); - float explosiveness = baseExplosiveness; + public void onDestroyed(){ + float explosiveness = block.baseExplosiveness; float flammability = 0f; float power = 0f; - if(hasItems){ + if(block.hasItems){ for(Item item : content.items()){ - int amount = tile.items().get(item); + int amount = items.get(item); explosiveness += item.explosiveness * amount; flammability += item.flammability * amount; } } - if(hasLiquids){ - flammability += tile.liquids().sum((liquid, amount) -> liquid.explosiveness * amount / 2f); - explosiveness += tile.liquids().sum((liquid, amount) -> liquid.flammability * amount / 2f); + if(block.hasLiquids){ + flammability += liquids().sum((liquid, amount) -> liquid.explosiveness * amount / 2f); + explosiveness += liquids().sum((liquid, amount) -> liquid.flammability * amount / 2f); } - if(consumes.hasPower() && consumes.getPower().buffered){ - power += tile.power().status * consumes.getPower().capacity; + if(block.consumes.hasPower() && block.consumes.getPower().buffered){ + power += this.power.status * block.consumes.getPower().capacity; } - if(hasLiquids){ + if(block.hasLiquids){ - tile.liquids().each((liquid, amount) -> { + liquids().each((liquid, amount) -> { float splash = Mathf.clamp(amount / 4f, 0f, 10f); for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){ Time.run(i / 2f, () -> { - Tile other = world.tile(tile.tileX() + Mathf.range(size / 2), tile.tileY() + Mathf.range(size / 2)); + Tile other = world.tile(tileX() + Mathf.range(block.size / 2), tileY() + Mathf.range(block.size / 2)); if(other != null){ Puddles.deposit(other, liquid, splash); } @@ -709,152 +726,137 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ }); } - Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * size / 2f, Pal.darkFlame); - if(!tile.floor().solid && !tile.floor().isLiquid){ - Effects.rubble(tile.x(), tile.y(), size); + Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, Pal.darkFlame); + if(!floor().solid && !floor().isLiquid){ + Effects.rubble(x, y, block.size); } } /** - * Returns the flammability of the tile. Used for fire calculations. + * Returns the flammability of the Used for fire calculations. * Takes flammability of floor liquid into account. */ - public float getFlammability(Tilec tile){ - if(!hasItems || tile.entity == null){ - if(tile.floor().isLiquid && !solid){ - return tile.floor().liquidDrop.flammability; + public float getFlammability(){ + if(!block.hasItems){ + if(floor().isLiquid && !block.solid){ + return floor().liquidDrop.flammability; } return 0; }else{ - float result = tile.items().sum((item, amount) -> item.flammability * amount); + float result = items.sum((item, amount) -> item.flammability * amount); - if(hasLiquids){ - result += tile.liquids().sum((liquid, amount) -> liquid.flammability * amount / 3f); + if(block.hasLiquids){ + result += liquids().sum((liquid, amount) -> liquid.flammability * amount / 3f); } return result; } } - public String getDisplayName(Tilec tile){ + public String getDisplayName(){ return block.localizedName; } - public TextureRegion getDisplayIcon(Tilec tile){ + public TextureRegion getDisplayIcon(){ return block.icon(Cicon.medium); } - public void display(Tilec entity, Table table){ + public void display(Table table){ + table.table(bars -> { + bars.defaults().growX().height(18f).pad(4); - if(entity != null){ - table.table(bars -> { - bars.defaults().growX().height(18f).pad(4); + displayBars(bars); + }).growX(); + table.row(); + table.table(ctable -> { + displayConsumption(ctable); + }).growX(); - displayBars(entity, bars); - }).growX(); - table.row(); - table.table(ctable -> { - displayConsumption(entity, ctable); - }).growX(); - - table.marginBottom(-5); - } + table.marginBottom(-5); } - public void displayConsumption(Tilec tile, Table table){ + public void displayConsumption(Table table){ table.left(); - for(Consume cons : consumes.all()){ + for(Consume cons : block.consumes.all()){ if(cons.isOptional() && cons.isBoost()) continue; - cons.build(tile, table); + cons.build(this, table); } } - public void displayBars(Tilec tile, Table table){ - for(Func bar : bars.list()){ - table.add(bar.get(tile)).growX(); + public void displayBars(Table table){ + for(Func bar : block.bars.list()){ + table.add(bar.get(this)).growX(); table.row(); } } /** Called when this block is tapped to build a UI on the table. * configurable must be true for this to be called.*/ - public void buildConfiguration(Tilec tile, Table table){ + public void buildConfiguration(Table table){ } /** Update table alignment after configuring.*/ - public void updateTableAlign(Tilec tile, Table table){ - Vec2 pos = Core.input.mouseScreen(tile.x(), tile.y() - tile.block().size * tilesize / 2f - 1); + public void updateTableAlign(Table table){ + Vec2 pos = Core.input.mouseScreen(x, y - block().size * tilesize / 2f - 1); table.setPosition(pos.x, pos.y, Align.top); } /** Returns whether or not a hand cursor should be shown over this block. */ - public Cursor getCursor(Tilec tile){ - return configurable ? SystemCursor.hand : SystemCursor.arrow; + public Cursor getCursor(){ + return block.configurable ? SystemCursor.hand : SystemCursor.arrow; } /** * Called when another tile is tapped while this block is selected. * Returns whether or not this block should be deselected. */ - public boolean onConfigureTileTapped(Tilec tile, Tilec other){ + public boolean onConfigureTileTapped(Tilec other){ return tile != other; } /** Returns whether this config menu should show when the specified player taps it. */ - public boolean shouldShowConfigure(Tilec tile, Playerc player){ + public boolean shouldShowConfigure(Playerc player){ return true; } /** Whether this configuration should be hidden now. Called every frame the config is open. */ - public boolean shouldHideConfigure(Tilec tile, Playerc player){ + public boolean shouldHideConfigure(Playerc player){ return false; } - public void drawConfigure(Tilec tile){ + public void drawConfigure(){ Draw.color(Pal.accent); Lines.stroke(1f); - Lines.square(tile.x(), tile.y(), tile.block().size * tilesize / 2f + 1f); + Lines.square(x, y, block().size * tilesize / 2f + 1f); Draw.reset(); } - public boolean isSolidFor(Tilec tile){ + public boolean checkSolid(){ return false; } - public float handleDamage(Tilec tile, float amount){ + public float handleDamage(float amount){ return amount; } - public void handleBulletHit(Tilec entity, Bulletc bullet){ - entity.damage(bullet.damage()); - } - - /** @return a custom minimap color for this tile, or 0 to use default colors. */ - public int minimapColor(Tile tile){ - return 0; - } - - public void update(Tilec tile){ - } - public boolean collide(Bulletc other){ return true; } public void collision(Bulletc other){ - block.handleBulletHit(this, other); + damage(other.damage()); } public void removeFromProximity(){ - block.onProximityRemoved(this); + onProximityRemoved(); Point2[] nearby = Edges.getEdges(block.size); for(Point2 point : nearby){ Tilec other = world.ent(tile.x + point.x, tile.y + point.y); //remove this tile from all nearby tile's proximities if(other != null){ - other.block().onProximityUpdate(other); + other.onProximityUpdate(); other.proximity().remove(this, true); } } @@ -863,12 +865,12 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ public void updateProximity(){ tmpTiles.clear(); proximity.clear(); - + Point2[] nearby = Edges.getEdges(block.size); for(Point2 point : nearby){ Tilec other = world.ent(tile.x + point.x, tile.y + point.y); - if(other == null || !(other.tile().interactable(tile.team()))) continue; + if(other == null || !(other.tile().interactable(team()))) continue; //add this tile to proximity of nearby tiles if(!other.proximity().contains(this, true)){ @@ -883,14 +885,18 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ proximity.add(tile); } - block.onProximityAdded(this); - block.onProximityUpdate(this); + onProximityAdded(); + onProximityUpdate(); for(Tilec other : tmpTiles){ - other.block().onProximityUpdate(other); + other.onProximityUpdate(); } } + public void updateTile(){ + + } + //endregion //region overrides @@ -911,8 +917,8 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ public void killed(){ Events.fire(new BlockDestroyEvent(tile)); block.breakSound.at(tile); - block.onDestroyed(this); - tile.remove(); + onDestroyed(); + remove(); } @Override @@ -923,14 +929,14 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ } if(sound != null){ - sound.update(x(), y(), block.shouldActiveSound(this)); + sound.update(x, y, shouldActiveSound()); } - if(block.idleSound != Sounds.none && block.shouldIdleSound(this)){ + if(block.idleSound != Sounds.none && shouldIdleSound()){ loops.play(block.idleSound, this, block.idleSoundVolume); } - block.update(this); + updateTile(); if(liquids != null){ liquids.update(); diff --git a/core/src/mindustry/entities/def/UnitComp.java b/core/src/mindustry/entities/def/UnitComp.java index 23d2ce9af7..6e975abb18 100644 --- a/core/src/mindustry/entities/def/UnitComp.java +++ b/core/src/mindustry/entities/def/UnitComp.java @@ -13,7 +13,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/entities/def/WaterMoveComp.java b/core/src/mindustry/entities/def/WaterMoveComp.java index 88c5487a95..6913debd53 100644 --- a/core/src/mindustry/entities/def/WaterMoveComp.java +++ b/core/src/mindustry/entities/def/WaterMoveComp.java @@ -4,7 +4,7 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.collisions; diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 0e30c3196b..a6e3287d03 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -10,7 +10,7 @@ import arc.struct.IntSet.*; import arc.util.*; import mindustry.game.EventType.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import java.util.*; diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index cdcaf15673..18a206ebe2 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -14,7 +14,7 @@ import mindustry.content.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index 28f7de4312..0ce66ac106 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -134,7 +134,7 @@ public class MinimapRenderer implements Disposable{ texture.draw(pixmap, 0, 0); } - public void update(Tile tile){ + public void updateTile(){ int color = colorFor(world.tile(tile.x, tile.y)); pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, color); diff --git a/core/src/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java index e1fecffc3c..0d3691f1f7 100644 --- a/core/src/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -3,7 +3,7 @@ package mindustry.maps.filters; import arc.util.*; import mindustry.maps.filters.FilterOption.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; public class DistortFilter extends GenerateFilter{ float scl = 40, mag = 5; diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index a91d471a82..bb1b00e57d 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -12,7 +12,7 @@ import mindustry.gen.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index f8719c34cb..e26d605e2b 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -6,7 +6,7 @@ import arc.scene.ui.layout.*; import mindustry.ctype.*; import mindustry.ctype.ContentType; import mindustry.ui.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.content; diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 1867d1ff1a..0aa3f3f68c 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -17,7 +17,7 @@ import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 59ee21c423..ca2fe71e40 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -23,7 +23,7 @@ import mindustry.graphics.*; import mindustry.graphics.MultiPacker.*; import mindustry.type.*; import mindustry.ui.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; import mindustry.world.meta.values.*; @@ -159,13 +159,13 @@ public class Block extends UnlockableContent{ protected Array cacheRegionStrings = new Array<>(); protected ObjectMap, Cons2> configurations = new ObjectMap<>(); - protected Array tempTiles = new Array<>(); - protected Array tempTileEnts = new Array<>(); + //TODO move protected TextureRegion[] generatedIcons; protected TextureRegion[] variantRegions, editorVariantRegions; - protected TextureRegion region, editorIcon; + public TextureRegion region, editorIcon; - protected static TextureRegion[][] cracks; + //TODO move + public static TextureRegion[][] cracks; /** Dump timer ID.*/ protected final int timerDump = timers++; @@ -177,6 +177,34 @@ public class Block extends UnlockableContent{ this.solid = false; } + //TODO rename to draw() once class refactoring is done. + public void drawBase(Tile tile){ + //delegates to entity unless it is null + if(tile.entity != null){ + tile.entity.draw(); + }else{ + Draw.rect(region, tile.drawx(), tile.drawy(), rotate ? tile.rotation * 90 : 0); + } + } + + /** @return a custom minimap color for this or 0 to use default colors. */ + public int minimapColor(Tile tile){ + return 0; + } + + public boolean outputsItems(){ + return hasItems; + } + + /** Returns whether ot not this block can be place on the specified */ + public boolean canPlaceOn(Tile tile){ + return true; + } + + public boolean canBreak(Tile tile){ + return true; + } + /** Adds a region by name to be loaded, with the final name "{name}-suffix". Returns an ID to looks this region up by in {@link #reg(int)}. */ protected int reg(String suffix){ cacheRegionStrings.add(name + suffix); @@ -438,26 +466,37 @@ public class Block extends UnlockableContent{ } if(entityType == null){ - //assign default value for now - entityType = TileEntity::create; //attempt to find the first declared class and use it as the entity type try{ Class[] classes = getClass().getDeclaredClasses(); - //first class that is subclass of Tilec - Class type = Structs.find(classes, Tilec.class::isAssignableFrom); - if(type != null){ - Constructor cons = (Constructor)type.getConstructor(); - entityType = () -> { - try{ - return cons.newInstance(); - }catch(Exception e){ - throw new RuntimeException(e); - } - }; + Class current = getClass(); + + while(entityType == null && Block.class.isAssignableFrom(current)){ + //first class that is subclass of Tilec + Class type = Structs.find(classes, Tilec.class::isAssignableFrom); + if(type != null){ + Constructor cons = (Constructor)type.getConstructor(); + entityType = () -> { + try{ + return cons.newInstance(); + }catch(Exception e){ + throw new RuntimeException(e); + } + }; + } + + //scan through every superclass looking for it + current = current.getSuperclass(); } + }catch(Throwable ignored){ } + + if(entityType == null){ + //assign default value + entityType = TileEntity::create; + } } buildCost = 0f; diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index f26ef4dfed..7b882e8b25 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -10,7 +10,7 @@ import mindustry.content.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.type.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import mindustry.world.modules.*; import static mindustry.Vars.*; @@ -92,17 +92,17 @@ public class Tile implements Position{ /** Configure a tile with the current, local player. */ public void configure(Object value){ - Call.onTileConfig(player, this, value); + if(entity != null) Call.onTileConfig(player, entity, value); } public void configureAny(Object value){ - Call.onTileConfig(null, this, value); + if(entity != null) Call.onTileConfig(null, entity, value); } - @SuppressWarnings("unchecked") - public T ent(){ - return (T)entity; - } + //@SuppressWarnings("unchecked") + //public T ent(){ + // return (T)entity; + //} public float worldx(){ return x * tilesize; @@ -216,7 +216,7 @@ public class Tile implements Position{ recache(); if(entity != null){ - block.onProximityUpdate(entity); + entity.onProximityUpdate(); } } @@ -309,7 +309,7 @@ public class Tile implements Position{ } public boolean solid(){ - return block.solid || (entity != null && block.isSolidFor(entity)); + return block.solid || (entity != null && entity.checkSolid()); } public boolean breakable(){ @@ -475,7 +475,7 @@ public class Tile implements Position{ protected void preChanged(){ if(entity != null){ //only call removed() for the center block - this only gets called once. - block.removed(entity); + entity.onRemoved(); entity.removeFromProximity(); //remove this tile's dangling entities @@ -527,9 +527,9 @@ public class Tile implements Position{ }else if(!world.isGenerating()){ //since the entity won't update proximity for us, update proximity for all nearby tiles manually for(Point2 p : Geometry.d4){ - Tile tile = world.tile(x + p.x, y + p.y); + Tilec tile = world.ent(x + p.x, y + p.y); if(tile != null){ - tile.block().onProximityUpdate(entity); + tile.onProximityUpdate(); } } } diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index 7485a19d96..a2f8f13dd1 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -2,9 +2,10 @@ package mindustry.world.blocks; import arc.math.*; import arc.math.geom.*; -import arc.util.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.world.*; import java.util.*; @@ -82,9 +83,8 @@ public interface Autotiler{ } default boolean blends(Tile tile, int rotation, int direction){ - Tile other = tile.getNearby(Mathf.mod(rotation - direction, 4)); - if(other != null) other = other.link(); - return other != null && other.team() == tile.team() && blends(tile, rotation, other.x, other.y, other.rotation(), other.block()); + Tilec other = tile.getNearbyEntity(Mathf.mod(rotation - direction, 4)); + return other != null && other.team() == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation(), other.block()); } default boolean blendsArmored(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ diff --git a/core/src/mindustry/world/blocks/BuildBlock.java b/core/src/mindustry/world/blocks/BuildBlock.java index ef7bc567aa..4d304b50c6 100644 --- a/core/src/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/BuildBlock.java @@ -62,15 +62,13 @@ public class BuildBlock extends Block{ @Remote(called = Loc.server) public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ if(tile == null) return; - float healthf = tile.entity == null ? 1f : tile.entity.healthf(); + float healthf = tile.entity.healthf(); tile.setBlock(block, team, (int)rotation); - if(tile.entity != null){ - tile.entity.health(block.health * healthf); - } + tile.entity.health(block.health * healthf); //last builder was this local client player, call placed() if(!headless && builderID == player.unit().id()){ if(!skipConfig){ - tile.block().playerPlaced(tile); + tile.entity.playerPlaced(); } } Fx.placeBlock.at(tile.drawx(), tile.drawy(), block.size); @@ -102,7 +100,7 @@ public class BuildBlock extends Block{ public static void constructed(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ Call.onConstructFinish(tile, block, builderID, rotation, team, skipConfig); - tile.block().placed(tile); + tile.entity.placed(); Events.fire(new BlockBuildEndEvent(tile, Groups.unit.getByID(builderID), team, false)); if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); @@ -113,94 +111,12 @@ public class BuildBlock extends Block{ return true; } - @Override - public String getDisplayName(Tile tile){ - BuildEntity entity = tile.ent(); - return Core.bundle.format("block.constructing", entity.cblock == null ? entity.previous.localizedName : entity.cblock.localizedName); - } - - @Override - public TextureRegion getDisplayIcon(Tile tile){ - BuildEntity entity = tile.ent(); - return (entity.cblock == null ? entity.previous : entity.cblock).icon(mindustry.ui.Cicon.full); - } - - @Override - public boolean isSolidFor(Tile tile){ - BuildEntity entity = tile.ent(); - return entity == null || (entity.cblock != null && entity.cblock.solid) || entity.previous == null || entity.previous.solid; - } - - @Override - public Cursor getCursor(Tile tile){ - return SystemCursor.hand; - } - - @Override - public void tapped(Tile tile, Playerc player){ - BuildEntity entity = tile.ent(); - - //if the target is constructible, begin constructing - if(!headless && entity.cblock != null){ - if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){ - control.input.isBuilding = true; - } - player.builder().addBuild(new BuildRequest(tile.x, tile.y, tile.rotation(), entity.cblock), false); - } - } - - @Override - public void onDestroyed(Tile tile){ - Fx.blockExplosionSmoke.at(tile); - - if(!tile.floor().solid && !tile.floor().isLiquid){ - Effects.rubble(tile.drawx(), tile.drawy(), size); - } - } - - @Override - public void draw(Tile tile){ - BuildEntity entity = tile.ent(); - - //When breaking, don't draw the previous block... since it's the thing you were breaking - if(entity.cblock != null && entity.previous == entity.cblock){ - return; - } - - if(entity.previous == null || entity.cblock == null) return; - - if(Core.atlas.isFound(entity.previous.icon(Cicon.full))){ - Draw.rect(entity.previous.icon(Cicon.full), tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.rotation() * 90 : 0); - } - } - - @Override - public void drawLayer(Tile tile){ - - BuildEntity entity = tile.ent(); - - Shaders.blockbuild.color = Pal.accent; - - Block target = entity.cblock == null ? entity.previous : entity.cblock; - - if(target == null) return; - - for(TextureRegion region : target.getGeneratedIcons()){ - Shaders.blockbuild.region = region; - Shaders.blockbuild.progress = entity.progress; - - Draw.rect(region, tile.drawx(), tile.drawy(), target.rotate ? tile.rotation() * 90 : 0); - Draw.flush(); - } - } - public class BuildEntity extends TileEntity{ /** * The recipe of the block that is being constructed. * If there is no recipe for this block, as is the case with rocks, 'previous' is used. */ - public @Nullable - Block cblock; + public @Nullable Block cblock; public float progress = 0; public float buildCost; @@ -213,6 +129,77 @@ public class BuildBlock extends Block{ private float[] accumulator; private float[] totalAccumulator; + + @Override + public String getDisplayName(){ + return Core.bundle.format("block.constructing", cblock == null ? previous.localizedName : cblock.localizedName); + } + + @Override + public TextureRegion getDisplayIcon(){ + return (cblock == null ? previous : cblock).icon(Cicon.full); + } + + @Override + public boolean checkSolid(){ + return (cblock != null && cblock.solid) || previous == null || previous.solid; + } + + @Override + public Cursor getCursor(){ + return SystemCursor.hand; + } + + @Override + public void tapped(Playerc player){ + //if the target is constructible, begin constructing + if(!headless && cblock != null){ + if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){ + control.input.isBuilding = true; + } + player.builder().addBuild(new BuildRequest(tile.x, tile.y, tile.rotation(), cblock), false); + } + } + + @Override + public void onDestroyed(){ + Fx.blockExplosionSmoke.at(tile); + + if(!tile.floor().solid && !tile.floor().isLiquid){ + Effects.rubble(tile.drawx(), tile.drawy(), size); + } + } + + @Override + public void draw(){ + //When breaking, don't draw the previous block... since it's the thing you were breaking + if(cblock != null && previous == cblock){ + return; + } + + if(previous == null || cblock == null) return; + + if(Core.atlas.isFound(previous.icon(Cicon.full))){ + Draw.rect(previous.icon(Cicon.full), tile.drawx(), tile.drawy(), previous.rotate ? tile.rotation() * 90 : 0); + } + } + + @Override + public void drawLayer(){ + Shaders.blockbuild.color = Pal.accent; + + Block target = cblock == null ? previous : cblock; + + if(target == null) return; + + for(TextureRegion region : target.getGeneratedIcons()){ + Shaders.blockbuild.region = region; + Shaders.blockbuild.progress = progress; + + Draw.rect(region, tile.drawx(), tile.drawy(), target.rotate ? tile.rotation() * 90 : 0); + Draw.flush(); + } + } public boolean construct(Unitc builder, @Nullable Tilec core, float amount, boolean configured){ if(cblock == null){ @@ -265,8 +252,8 @@ public class BuildBlock extends Block{ if(clampedAmount > 0 && accumulated > 0){ //if it's positive, add it to the core if(core != null){ - int accepting = core.tile().block().acceptStack(core.tile(), requirements[i].item, accumulated, builder); - core.tile().block().handleStack(core.tile(), requirements[i].item, accepting, builder); + int accepting = core.acceptStack(requirements[i].item, accumulated, builder); + core.handleStack(requirements[i].item, accepting, builder); accumulator[i] -= accepting; }else{ accumulator[i] -= accumulated; diff --git a/core/src/mindustry/world/blocks/LiquidBlock.java b/core/src/mindustry/world/blocks/LiquidBlock.java deleted file mode 100644 index 9b8c45842f..0000000000 --- a/core/src/mindustry/world/blocks/LiquidBlock.java +++ /dev/null @@ -1,54 +0,0 @@ -package mindustry.world.blocks; - -import arc.Core; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; -import mindustry.world.Block; -import mindustry.world.Tile; -import mindustry.world.meta.BlockGroup; -import mindustry.world.modules.LiquidModule; - -public class LiquidBlock extends Block{ - protected TextureRegion liquidRegion, bottomRegion, topRegion; - - public LiquidBlock(String name){ - super(name); - update = true; - solid = true; - hasLiquids = true; - group = BlockGroup.liquids; - outputsLiquid = true; - } - - @Override - public void load(){ - super.load(); - - liquidRegion = Core.atlas.find(name + "-liquid"); - topRegion = Core.atlas.find(name + "-top"); - bottomRegion = Core.atlas.find(name + "-bottom"); - } - - @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name + "-top")}; - } - - @Override - public void draw(Tile tile){ - LiquidModule mod = tile.entity.liquids(); - - int rotation = rotate ? tile.rotation() * 90 : 0; - - Draw.rect(bottomRegion, tile.drawx(), tile.drawy(), rotation); - - if(mod.total() > 0.001f){ - Draw.color(mod.current().color); - Draw.alpha(mod.total() / liquidCapacity); - Draw.rect(liquidRegion, tile.drawx(), tile.drawy(), rotation); - Draw.color(); - } - - Draw.rect(topRegion, tile.drawx(), tile.drawy(), rotation); - } -} diff --git a/core/src/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/mindustry/world/blocks/defense/DeflectorWall.java index 0273ca981a..ffc097526f 100644 --- a/core/src/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/mindustry/world/blocks/defense/DeflectorWall.java @@ -23,7 +23,7 @@ public class DeflectorWall extends Wall{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); DeflectorEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 33eb7e8c6b..f01460a17f 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -52,7 +52,7 @@ public class Door extends Wall{ } @Override - public void draw(Tile tile){ + public void draw(){ DoorEntity entity = tile.ent(); Draw.rect(entity.open ? openRegion : region, tile.drawx(), tile.drawy()); } diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index e95a27aa7e..9e02615d45 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -86,7 +86,7 @@ public class ForceProjector extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ ForceEntity entity = tile.ent(); if(entity.shield == null){ @@ -149,7 +149,7 @@ public class ForceProjector extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); ForceEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 833145d5e6..a1a87b8d3e 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -61,7 +61,7 @@ public class MendProjector extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ MendEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.consValid() || tile.isEnemyCheat() ? 1f : 0f, 0.08f); entity.charge += entity.heat * entity.delta(); @@ -97,7 +97,7 @@ public class MendProjector extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); MendEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index bc274613e2..51baf96941 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -72,7 +72,7 @@ public class OverdriveProjector extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ OverdriveEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.consValid() ? 1f : 0f, 0.08f); entity.charge += entity.heat * Time.delta(); @@ -101,7 +101,7 @@ public class OverdriveProjector extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); OverdriveEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/defense/ShockMine.java b/core/src/mindustry/world/blocks/defense/ShockMine.java index 8a1426d7ac..92f3bc4121 100644 --- a/core/src/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/mindustry/world/blocks/defense/ShockMine.java @@ -41,7 +41,7 @@ public class ShockMine extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ //nope } diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index d790e3f299..90f7ccd8df 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -34,7 +34,7 @@ public class Wall extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ if(variants == 0){ Draw.rect(region, tile.drawx(), tile.drawy()); }else{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index c028b503cb..54cb3ae476 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -37,7 +37,7 @@ public class LaserTurret extends PowerTurret{ } @Override - public void update(Tile tile){ + public void updateTile(){ super.update(tile); LaserTurretEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 015169f992..6c3bd25637 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -101,7 +101,7 @@ public abstract class Turret extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(baseRegion, tile.drawx(), tile.drawy()); Draw.color(); } @@ -135,7 +135,7 @@ public abstract class Turret extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ TurretEntity entity = tile.ent(); if(!validateTarget(tile)) entity.target = null; diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index 3de051d7cc..9435e0ff68 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -41,7 +41,6 @@ public class Conveyor extends Block implements Autotiler{ hasItems = true; itemCapacity = 4; conveyorPlacement = true; - entityType = ConveyorEntity::new; idleSound = Sounds.conveyor; idleSoundVolume = 0.004f; @@ -66,39 +65,6 @@ public class Conveyor extends Block implements Autotiler{ } } - @Override - public void draw(Tile tile){ - ConveyorEntity entity = tile.ent(); - byte rotation = tile.rotation(); - - int frame = entity.clogHeat <= 0.5f ? (int)(((Time.time() * speed * 8f * entity.timeScale())) % 4) : 0; - Draw.rect(regions[Mathf.clamp(entity.blendbits, 0, regions.length - 1)][Mathf.clamp(frame, 0, regions[0].length - 1)], tile.drawx(), tile.drawy(), - tilesize * entity.blendsclx, tilesize * entity.blendscly, rotation * 90); - } - - @Override - public boolean shouldIdleSound(Tile tile){ - ConveyorEntity entity = tile.ent(); - return entity.clogHeat <= 0.5f ; - } - - @Override - public void onProximityUpdate(Tile tile){ - super.onProximityUpdate(tile); - - ConveyorEntity entity = tile.ent(); - int[] bits = buildBlending(tile, tile.rotation(), null, true); - entity.blendbits = bits[0]; - entity.blendsclx = bits[1]; - entity.blendscly = bits[2]; - - if(tile.front() != null && tile.front().entity != null){ - entity.next = tile.front().entity; - entity.nextc = entity.next instanceof ConveyorEntity && entity.next.team() == tile.team() ? (ConveyorEntity)entity.next : null; - entity.aligned = entity.nextc != null && tile.rotation() == entity.next.tile().rotation(); - } - } - @Override public void drawRequestRegion(BuildRequest req, Eachable list){ int[] bits = getTiling(req, list); @@ -119,99 +85,6 @@ public class Conveyor extends Block implements Autotiler{ return new TextureRegion[]{Core.atlas.find(name + "-0-0")}; } - @Override - public void drawLayer(Tile tile){ - ConveyorEntity e = tile.ent(); - byte rotation = tile.rotation(); - - for(int i = 0; i < e.len; i++){ - Item item = e.ids[i]; - tr1.trns(rotation * 90, tilesize, 0); - tr2.trns(rotation * 90, -tilesize / 2f, e.xs[i] * tilesize / 2f); - - Draw.rect(item.icon(Cicon.medium), - (tile.x * tilesize + tr1.x * e.ys[i] + tr2.x), - (tile.y * tilesize + tr1.y * e.ys[i] + tr2.y), itemSize, itemSize); - } - } - - @Override - public void unitOn(Tile tile, Unitc unit){ - ConveyorEntity entity = tile.ent(); - - if(entity.clogHeat > 0.5f){ - return; - } - - entity.noSleep(); - - float speed = this.speed * tilesize / 2.4f; - float centerSpeed = 0.1f; - float centerDstScl = 3f; - float tx = Geometry.d4[tile.rotation()].x, ty = Geometry.d4[tile.rotation()].y; - - float centerx = 0f, centery = 0f; - - if(Math.abs(tx) > Math.abs(ty)){ - centery = Mathf.clamp((tile.worldy() - unit.y()) / centerDstScl, -centerSpeed, centerSpeed); - if(Math.abs(tile.worldy() - unit.y()) < 1f) centery = 0f; - }else{ - centerx = Mathf.clamp((tile.worldx() - unit.x()) / centerDstScl, -centerSpeed, centerSpeed); - if(Math.abs(tile.worldx() - unit.x()) < 1f) centerx = 0f; - } - - if(entity.len * itemSpace < 0.9f){ - unit.impulse((tx * speed + centerx) * entity.delta(), (ty * speed + centery) * entity.delta()); - } - } - - @Override - public void update(Tile tile){ - ConveyorEntity e = tile.ent(); - e.minitem = 1f; - e.mid = 0; - - //skip updates if possible - if(e.len == 0){ - e.clogHeat = 0f; - e.sleep(); - return; - } - - float nextMax = e.aligned ? 1f - Math.max(itemSpace - e.nextc.minitem, 0) : 1f; - - for(int i = e.len - 1; i >= 0; i--){ - float nextpos = (i == e.len - 1 ? 100f : e.ys[i + 1]) - itemSpace; - float maxmove = Mathf.clamp(nextpos - e.ys[i], 0, speed * e.delta()); - - e.ys[i] += maxmove; - - if(e.ys[i] > nextMax) e.ys[i] = nextMax; - if(e.ys[i] > 0.5 && i > 0) e.mid = i - 1; - e.xs[i] = Mathf.approachDelta(e.xs[i], 0, speed*2); - - if(e.ys[i] >= 1f && offloadDir(tile, e.ids[i])){ - //align X position if passing forwards - if(e.aligned){ - e.nextc.xs[e.nextc.lastInserted] = e.xs[i]; - } - //remove last item - e.items().remove(e.ids[i], e.len - i); - e.len = Math.min(i, e.len); - }else if(e.ys[i] < e.minitem){ - e.minitem = e.ys[i]; - } - } - - if(e.minitem < itemSpace + (e.blendbits == 1 ? 0.3f : 0f)){ - e.clogHeat = Mathf.lerpDelta(e.clogHeat, 1f, 0.02f); - }else{ - e.clogHeat = 0f; - } - - e.noSleep(); - } - @Override public boolean isAccessible(){ return true; @@ -227,88 +100,7 @@ public class Conveyor extends Block implements Autotiler{ Mathf.mod(req.tile().rotation() - req.rotation, 2) == 1 ? Blocks.junction : this; } - @Override - public int removeStack(Tile tile, Item item, int amount){ - ConveyorEntity e = tile.ent(); - e.noSleep(); - int removed = 0; - - for(int j = 0; j < amount; j++){ - for(int i = 0; i < e.len; i++){ - if(e.ids[i] == item){ - e.remove(i); - removed ++; - break; - } - } - } - - e.items().remove(item, removed); - - return removed; - } - - @Override - public void getStackOffset(Tile tile, Item item, Vec2 trns){ - trns.trns(tile.rotation() * 90 + 180f, tilesize / 2f); - } - - @Override - public int acceptStack(Tile tile, Item item, int amount, Teamc source){ - ConveyorEntity entity = tile.ent(); - return Math.min((int)(entity.minitem / itemSpace), amount); - } - - @Override - public void handleStack(Tile tile, Item item, int amount, Teamc source){ - ConveyorEntity e = tile.ent(); - amount = Math.min(amount, itemCapacity - e.len); - - for(int i = amount - 1; i >= 0; i--){ - e.add(0); - e.xs[0] = 0; - e.ys[0] = i * itemSpace; - e.ids[0] = item; - e.items().add(item, 1); - } - - e.noSleep(); - } - - @Override - public boolean acceptItem(Tile tile, Tile source, Item item){ - ConveyorEntity e = tile.ent(); - if(e.len >= capacity) return false; - int direction = source == null ? 0 : Math.abs(source.relativeTo(tile.x, tile.y) - tile.rotation()); - return (((direction == 0) && e.minitem >= itemSpace) || ((direction % 2 == 1) && e.minitem > 0.7f)) && (source == null || !(source.block().rotate && (source.rotation() + 2) % 4 == tile.rotation())); - } - - @Override - public void handleItem(Tile tile, Tile source, Item item){ - ConveyorEntity e = tile.ent(); - if(e.len >= capacity) return; - - byte r = tile.rotation(); - int ang = ((source.relativeTo(tile.x, tile.y) - r)); - float x = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; - - e.noSleep(); - e.items().add(item, 1); - - if(Math.abs(source.relativeTo(tile.x, tile.y) - r) == 0){ //idx = 0 - e.add(0); - e.xs[0] = x; - e.ys[0] = 0; - e.ids[0] = item; - }else{ //idx = mid - e.add(e.mid); - e.xs[e.mid] = x; - e.ys[e.mid] = 0.5f; - e.ids[e.mid] = item; - } - } - - public static class ConveyorEntity extends TileEntity{ + public class ConveyorEntity extends TileEntity{ //parallel array data Item[] ids = new Item[capacity]; float[] xs = new float[capacity]; @@ -329,24 +121,199 @@ public class Conveyor extends Block implements Autotiler{ float clogHeat = 0f; - final void add(int o){ - for(int i = Math.max(o + 1, len); i > o; i--){ - ids[i] = ids[i - 1]; - xs[i] = xs[i - 1]; - ys[i] = ys[i - 1]; - } - - len++; + @Override + public void draw(){ + byte rotation = tile.rotation(); + int frame = clogHeat <= 0.5f ? (int)(((Time.time() * speed * 8f * timeScale())) % 4) : 0; + Draw.rect(regions[Mathf.clamp(blendbits, 0, regions.length - 1)][Mathf.clamp(frame, 0, regions[0].length - 1)], tile.drawx(), tile.drawy(), + tilesize * blendsclx, tilesize * blendscly, rotation * 90); } - final void remove(int o){ - for(int i = o; i < len - 1; i++){ - ids[i] = ids[i + 1]; - xs[i] = xs[i + 1]; - ys[i] = ys[i + 1]; + @Override + public boolean shouldIdleSound(){ + return clogHeat <= 0.5f ; + } + + @Override + public void onProximityUpdate(){ + super.onProximityUpdate(); + + int[] bits = buildBlending(tile, rotation(), null, true); + blendbits = bits[0]; + blendsclx = bits[1]; + blendscly = bits[2]; + + if(tile.front() != null && tile.front() != null){ + next = tile.front(); + nextc = next instanceof ConveyorEntity && next.team() == tile.team() ? (ConveyorEntity)next : null; + aligned = nextc != null && tile.rotation() == next.tile().rotation(); + } + } + + @Override + public void drawLayer(){ + byte rotation = tile.rotation(); + + for(int i = 0; i < len; i++){ + Item item = ids[i]; + tr1.trns(rotation * 90, tilesize, 0); + tr2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f); + + Draw.rect(item.icon(Cicon.medium), + (tile.x * tilesize + tr1.x * ys[i] + tr2.x), + (tile.y * tilesize + tr1.y * ys[i] + tr2.y), itemSize, itemSize); + } + } + + @Override + public void unitOn(Unitc unit){ + if(clogHeat > 0.5f){ + return; } - len--; + noSleep(); + + float mspeed = speed * tilesize / 2.4f; + float centerSpeed = 0.1f; + float centerDstScl = 3f; + float tx = Geometry.d4[tile.rotation()].x, ty = Geometry.d4[tile.rotation()].y; + + float centerx = 0f, centery = 0f; + + if(Math.abs(tx) > Math.abs(ty)){ + centery = Mathf.clamp((tile.worldy() - unit.y()) / centerDstScl, -centerSpeed, centerSpeed); + if(Math.abs(tile.worldy() - unit.y()) < 1f) centery = 0f; + }else{ + centerx = Mathf.clamp((tile.worldx() - unit.x()) / centerDstScl, -centerSpeed, centerSpeed); + if(Math.abs(tile.worldx() - unit.x()) < 1f) centerx = 0f; + } + + if(len * itemSpace < 0.9f){ + unit.impulse((tx * mspeed + centerx) * delta(), (ty * mspeed + centery) * delta()); + } + } + + @Override + public void updateTile(){ + minitem = 1f; + mid = 0; + + //skip updates if possible + if(len == 0){ + clogHeat = 0f; + sleep(); + return; + } + + float nextMax = aligned ? 1f - Math.max(itemSpace - nextc.minitem, 0) : 1f; + + for(int i = len - 1; i >= 0; i--){ + float nextpos = (i == len - 1 ? 100f : ys[i + 1]) - itemSpace; + float maxmove = Mathf.clamp(nextpos - ys[i], 0, speed * delta()); + + ys[i] += maxmove; + + if(ys[i] > nextMax) ys[i] = nextMax; + if(ys[i] > 0.5 && i > 0) mid = i - 1; + xs[i] = Mathf.approachDelta(xs[i], 0, speed*2); + + if(ys[i] >= 1f && moveForward(ids[i])){ + //align X position if passing forwards + if(aligned){ + nextc.xs[nextc.lastInserted] = xs[i]; + } + //remove last item + items.remove(ids[i], len - i); + len = Math.min(i, len); + }else if(ys[i] < minitem){ + minitem = ys[i]; + } + } + + if(minitem < itemSpace + (blendbits == 1 ? 0.3f : 0f)){ + clogHeat = Mathf.lerpDelta(clogHeat, 1f, 0.02f); + }else{ + clogHeat = 0f; + } + + noSleep(); + } + + @Override + public int removeStack(Item item, int amount){ + noSleep(); + int removed = 0; + + for(int j = 0; j < amount; j++){ + for(int i = 0; i < len; i++){ + if(ids[i] == item){ + remove(i); + removed ++; + break; + } + } + } + + items.remove(item, removed); + return removed; + } + + @Override + public void getStackOffset(Item item, Vec2 trns){ + trns.trns(tile.rotation() * 90 + 180f, tilesize / 2f); + } + + @Override + public int acceptStack(Item item, int amount, Teamc source){ + return Math.min((int)(minitem / itemSpace), amount); + } + + @Override + public void handleStack(Item item, int amount, Teamc source){ + amount = Math.min(amount, itemCapacity - len); + + for(int i = amount - 1; i >= 0; i--){ + add(0); + xs[0] = 0; + ys[0] = i * itemSpace; + ids[0] = item; + items.add(item, 1); + } + + noSleep(); + } + + @Override + public boolean acceptItem(Tilec source, Item item){ + if(len >= capacity) return false; + Tile facing = Edges.getFacingEdge(source.tile(), tile); + int direction = Math.abs(facing.relativeTo(tile.x, tile.y) - tile.rotation()); + return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block().rotate && (source.rotation() + 2) % 4 == tile.rotation()); + } + + @Override + public void handleItem(Tilec source, Item item){ + if(len >= capacity) return; + + byte r = tile.rotation(); + Tile facing = Edges.getFacingEdge(source.tile(), tile); + int ang = ((facing.relativeTo(tile.x, tile.y) - r)); + float x = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; + + noSleep(); + items.add(item, 1); + + if(Math.abs(facing.relativeTo(tile.x, tile.y) - r) == 0){ //idx = 0 + add(0); + xs[0] = x; + ys[0] = 0; + ids[0] = item; + }else{ //idx = mid + add(mid); + xs[mid] = x; + ys[mid] = 0.5f; + ids[mid] = item; + } } @Override @@ -377,5 +344,26 @@ public class Conveyor extends Block implements Autotiler{ } } } + + + final void add(int o){ + for(int i = Math.max(o + 1, len); i > o; i--){ + ids[i] = ids[i - 1]; + xs[i] = xs[i - 1]; + ys[i] = ys[i - 1]; + } + + len++; + } + + final void remove(int o){ + for(int i = o; i < len - 1; i++){ + ids[i] = ids[i + 1]; + xs[i] = xs[i + 1]; + ys[i] = ys[i + 1]; + } + + len--; + } } } diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 54f0b9c3eb..52ae0f321d 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -163,7 +163,7 @@ public class ItemBridge extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * entity.delta(); diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java index 76f76ca1ea..4f80679e88 100644 --- a/core/src/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/mindustry/world/blocks/distribution/Junction.java @@ -36,7 +36,7 @@ public class Junction extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ JunctionEntity entity = tile.ent(); DirectionalItemBuffer buffer = entity.buffer; diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index b074717070..d8dc6ac542 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -60,7 +60,7 @@ public class MassDriver extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ MassDriverEntity entity = tile.ent(); Tile link = world.tile(entity.link); boolean hasLink = linkValid(tile); @@ -143,7 +143,7 @@ public class MassDriver extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(baseRegion, tile.drawx(), tile.drawy()); } diff --git a/core/src/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java index be3bea308c..d20e3b3833 100644 --- a/core/src/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -45,7 +45,7 @@ public class OverflowGate extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ OverflowGateEntity entity = tile.ent(); if(entity.lastItem == null && entity.items().total() > 0){ diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index ec655a5edd..26ea98a06a 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -23,7 +23,7 @@ public class Router extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ RouterEntity entity = tile.ent(); if(entity.lastItem == null && entity.items().total() > 0){ diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index 6179ca9464..b5e3bee30c 100644 --- a/core/src/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/mindustry/world/blocks/distribution/Sorter.java @@ -60,7 +60,7 @@ public class Sorter extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); SorterEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java similarity index 91% rename from core/src/mindustry/world/blocks/Cliff.java rename to core/src/mindustry/world/blocks/environment/Cliff.java index 2089d7f679..a9a800f126 100644 --- a/core/src/mindustry/world/blocks/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.graphics.g2d.*; import arc.util.*; @@ -17,7 +17,7 @@ public class Cliff extends Block{ } @Override - public void draw(Tile tile){ + public void drawBase(Tile tile){ int r = tile.rotation(); for(int i = 0; i < 8; i++){ if((r & (1 << i)) != 0){ diff --git a/core/src/mindustry/world/blocks/DoubleOverlayFloor.java b/core/src/mindustry/world/blocks/environment/DoubleOverlayFloor.java similarity index 85% rename from core/src/mindustry/world/blocks/DoubleOverlayFloor.java rename to core/src/mindustry/world/blocks/environment/DoubleOverlayFloor.java index 45d156c164..bbf72dc50f 100644 --- a/core/src/mindustry/world/blocks/DoubleOverlayFloor.java +++ b/core/src/mindustry/world/blocks/environment/DoubleOverlayFloor.java @@ -1,8 +1,7 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.graphics.g2d.Draw; import arc.math.Mathf; -import mindustry.world.Tile; public class DoubleOverlayFloor extends OverlayFloor{ @@ -11,7 +10,7 @@ public class DoubleOverlayFloor extends OverlayFloor{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.colorl(0.4f); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy() - 0.75f); Draw.color(); diff --git a/core/src/mindustry/world/blocks/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java similarity index 98% rename from core/src/mindustry/world/blocks/Floor.java rename to core/src/mindustry/world/blocks/environment/Floor.java index 6abb1de2ce..f732527cec 100644 --- a/core/src/mindustry/world/blocks/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.*; import arc.graphics.*; @@ -15,6 +15,7 @@ import mindustry.graphics.MultiPacker.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; import static mindustry.Vars.*; @@ -152,7 +153,7 @@ public class Floor extends Block{ } @Override - public void draw(Tile tile){ + public void drawBase(Tile tile){ Mathf.random.setSeed(tile.pos()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); @@ -161,7 +162,7 @@ public class Floor extends Block{ Floor floor = tile.overlay(); if(floor != Blocks.air && floor != this){ //ore should never have itself on top, but it's possible, so prevent a crash in that case - floor.draw(tile); + floor.drawBase(tile); } } diff --git a/core/src/mindustry/world/blocks/OreBlock.java b/core/src/mindustry/world/blocks/environment/OreBlock.java similarity index 98% rename from core/src/mindustry/world/blocks/OreBlock.java rename to core/src/mindustry/world/blocks/environment/OreBlock.java index bf3a402262..a5514e06ea 100644 --- a/core/src/mindustry/world/blocks/OreBlock.java +++ b/core/src/mindustry/world/blocks/environment/OreBlock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.*; import mindustry.annotations.Annotations.*; diff --git a/core/src/mindustry/world/blocks/OverlayFloor.java b/core/src/mindustry/world/blocks/environment/OverlayFloor.java similarity index 83% rename from core/src/mindustry/world/blocks/OverlayFloor.java rename to core/src/mindustry/world/blocks/environment/OverlayFloor.java index 28c5e81983..4f2d6acfd9 100644 --- a/core/src/mindustry/world/blocks/OverlayFloor.java +++ b/core/src/mindustry/world/blocks/environment/OverlayFloor.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.graphics.g2d.Draw; import arc.math.Mathf; @@ -12,7 +12,7 @@ public class OverlayFloor extends Floor{ } @Override - public void draw(Tile tile){ + public void drawBase(Tile tile){ Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); } } diff --git a/core/src/mindustry/world/blocks/Rock.java b/core/src/mindustry/world/blocks/environment/Rock.java similarity index 94% rename from core/src/mindustry/world/blocks/Rock.java rename to core/src/mindustry/world/blocks/environment/Rock.java index 235dd24ee6..cb338f10d6 100644 --- a/core/src/mindustry/world/blocks/Rock.java +++ b/core/src/mindustry/world/blocks/environment/Rock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.Core; import arc.graphics.g2d.Draw; @@ -17,7 +17,7 @@ public class Rock extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ if(variants > 0){ Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); }else{ diff --git a/core/src/mindustry/world/StaticTree.java b/core/src/mindustry/world/blocks/environment/StaticTree.java similarity index 84% rename from core/src/mindustry/world/StaticTree.java rename to core/src/mindustry/world/blocks/environment/StaticTree.java index 1eeb3f89c2..3550895b96 100644 --- a/core/src/mindustry/world/StaticTree.java +++ b/core/src/mindustry/world/blocks/environment/StaticTree.java @@ -1,9 +1,8 @@ -package mindustry.world; +package mindustry.world.blocks.environment; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; -import arc.util.Tmp; -import mindustry.world.blocks.StaticWall; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.world.*; import static mindustry.Vars.tilesize; @@ -14,7 +13,7 @@ public class StaticTree extends StaticWall{ } @Override - public void draw(Tile tile){ + public void drawBase(Tile tile){ TextureRegion r = Tmp.tr1; r.set(region); int crop = (region.getWidth() - tilesize*4) / 2; diff --git a/core/src/mindustry/world/blocks/StaticWall.java b/core/src/mindustry/world/blocks/environment/StaticWall.java similarity index 88% rename from core/src/mindustry/world/blocks/StaticWall.java rename to core/src/mindustry/world/blocks/environment/StaticWall.java index 80b813d84e..6a20bd2c91 100644 --- a/core/src/mindustry/world/blocks/StaticWall.java +++ b/core/src/mindustry/world/blocks/environment/StaticWall.java @@ -1,13 +1,13 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; -import arc.Core; +import arc.*; import arc.graphics.g2d.*; -import arc.math.Mathf; +import arc.math.*; import arc.math.geom.*; -import mindustry.graphics.CacheLayer; +import mindustry.graphics.*; import mindustry.world.*; -import static mindustry.Vars.*; +import static mindustry.Vars.world; public class StaticWall extends Rock{ TextureRegion large; @@ -22,7 +22,7 @@ public class StaticWall extends Rock{ } @Override - public void draw(Tile tile){ + public void drawBase(Tile tile){ int rx = tile.x / 2 * 2; int ry = tile.y / 2 * 2; diff --git a/core/src/mindustry/world/blocks/TreeBlock.java b/core/src/mindustry/world/blocks/environment/TreeBlock.java similarity index 85% rename from core/src/mindustry/world/blocks/TreeBlock.java rename to core/src/mindustry/world/blocks/environment/TreeBlock.java index 6ce0ca84d8..dfb0bda406 100644 --- a/core/src/mindustry/world/blocks/TreeBlock.java +++ b/core/src/mindustry/world/blocks/environment/TreeBlock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.environment; import arc.graphics.g2d.Draw; import arc.math.Mathf; @@ -16,7 +16,7 @@ public class TreeBlock extends Block{ } @Override - public void draw(Tile tile){} + public void drawBase(Tile tile){} @Override public void drawLayer(Tile tile){ diff --git a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java index da8c442706..f3fd6b0c98 100644 --- a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -1,12 +1,10 @@ package mindustry.world.blocks.liquid; -import arc.Core; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; -import mindustry.type.Liquid; -import mindustry.world.Block; -import mindustry.world.Edges; -import mindustry.world.Tile; +import arc.*; +import arc.graphics.g2d.*; +import mindustry.entities.AllDefs.*; +import mindustry.type.*; +import mindustry.world.*; public class ArmoredConduit extends Conduit{ public TextureRegion capRegion; @@ -23,7 +21,7 @@ public class ArmoredConduit extends Conduit{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); // draw the cap when a conduit would normally leak diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index b605e06cb5..342a7bbf41 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -42,15 +42,6 @@ public class Conduit extends LiquidBlock implements Autotiler{ } } - @Override - public void onProximityUpdate(Tile tile){ - super.onProximityUpdate(tile); - - ConduitEntity entity = tile.ent(); - int[] bits = buildBlending(tile, tile.rotation(), null, true); - entity.blendbits = bits[0]; - } - @Override public void drawRequestRegion(BuildRequest req, Eachable list){ int[] bits = getTiling(req, list); @@ -88,50 +79,54 @@ public class Conduit extends LiquidBlock implements Autotiler{ return otherblock.hasLiquids && otherblock.outputsLiquid && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); } - @Override - public void draw(Tile tile){ - ConduitEntity entity = tile.ent(); - int rotation = tile.rotation() * 90; - - Draw.colorl(0.34f); - Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); - - Draw.color(tile.entity.liquids().current().color); - Draw.alpha(entity.smoothLiquid); - Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); - Draw.color(); - - Draw.rect(topRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); - } - - @Override - public void update(Tile tile){ - ConduitEntity entity = tile.ent(); - entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids().currentAmount() / liquidCapacity, 0.05f); - - if(tile.entity.liquids().total() > 0.001f && tile.entity.timer(timerFlow, 1)){ - tryMoveLiquid(tile, tile.getNearby(tile.rotation()), leakResistance, tile.entity.liquids().current()); - entity.noSleep(); - }else{ - entity.sleep(); - } - } - @Override public TextureRegion[] generateIcons(){ return new TextureRegion[]{Core.atlas.find("conduit-bottom"), Core.atlas.find(name + "-top-0")}; } - @Override - public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - tile.entity.noSleep(); - return tile.entity.liquids().get(liquid) + amount < liquidCapacity && (tile.entity.liquids().current() == liquid || tile.entity.liquids().get(tile.entity.liquids().current()) < 0.2f) - && ((source.absoluteRelativeTo(tile.x, tile.y) + 2) % 4 != tile.rotation()); - } - - public static class ConduitEntity extends TileEntity{ + public class ConduitEntity extends LiquidBlockEntity{ public float smoothLiquid; - int blendbits; + + @Override + public void draw(){ + int rotation = rotation() * 90; + + Draw.colorl(0.34f); + Draw.rect(botRegions[blendbits], tile.drawx(), tile.drawy(), rotation); + + Draw.color(liquids.current().color); + Draw.alpha(smoothLiquid); + Draw.rect(botRegions[blendbits], tile.drawx(), tile.drawy(), rotation); + Draw.color(); + + Draw.rect(topRegions[blendbits], tile.drawx(), tile.drawy(), rotation); + } + + @Override + public void onProximityUpdate(){ + super.onProximityUpdate(); + + blendbits = buildBlending(tile, tile.rotation(), null, true)[0]; + } + + @Override + public boolean acceptLiquid(Tilec source, Liquid liquid, float amount){ + noSleep(); + return liquids.get(liquid) + amount < liquidCapacity && (liquids.current() == liquid || liquids.currentAmount() < 0.2f) + && ((source.absoluteRelativeTo(tile.x, tile.y) + 2) % 4 != tile.rotation()); + } + + @Override + public void updateTile(){ + smoothLiquid = Mathf.lerpDelta(smoothLiquid, liquids.currentAmount() / liquidCapacity, 0.05f); + + if(liquids.total() > 0.001f && timer(timerFlow, 1)){ + moveLiquid(tile.getNearbyEntity(tile.rotation()), leakResistance, liquids.current()); + noSleep(); + }else{ + sleep(); + } + } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBlock.java b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java new file mode 100644 index 0000000000..03be82b7eb --- /dev/null +++ b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java @@ -0,0 +1,51 @@ +package mindustry.world.blocks.liquid; + +import arc.*; +import arc.graphics.g2d.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +public class LiquidBlock extends Block{ + protected TextureRegion liquidRegion, bottomRegion, topRegion; + + public LiquidBlock(String name){ + super(name); + update = true; + solid = true; + hasLiquids = true; + group = BlockGroup.liquids; + outputsLiquid = true; + } + + @Override + public void load(){ + super.load(); + + liquidRegion = Core.atlas.find(name + "-liquid"); + topRegion = Core.atlas.find(name + "-top"); + bottomRegion = Core.atlas.find(name + "-bottom"); + } + + @Override + public TextureRegion[] generateIcons(){ + return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name + "-top")}; + } + + public class LiquidBlockEntity extends TileEntity{ + @Override + public void draw(){ + int rotation = rotate ? rotation() * 90 : 0; + Draw.rect(bottomRegion, x, y, rotation); + + if(liquids.total() > 0.001f){ + Draw.color(liquids.current().color); + Draw.alpha(liquids.total() / liquidCapacity); + Draw.rect(liquidRegion, x, y, rotation); + Draw.color(); + } + + Draw.rect(topRegion, x, y, rotation); + } + } +} diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java index 32828c44c7..fab9911e56 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.liquid; import arc.math.*; import arc.util.*; +import mindustry.entities.AllDefs.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.distribution.*; @@ -20,7 +21,7 @@ public class LiquidBridge extends ItemBridge{ } @Override - public void update(Tile tile){ + public void updateTile(){ ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 8b34b2e942..da01fbb5ed 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.liquid; import arc.math.*; import arc.util.*; +import mindustry.entities.AllDefs.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.distribution.*; @@ -20,7 +21,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ } @Override - public void update(Tile tile){ + public void updateTile(){ ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 881213705a..d00de70163 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -2,9 +2,9 @@ package mindustry.world.blocks.liquid; import arc.*; import arc.graphics.g2d.*; +import mindustry.entities.AllDefs.*; import mindustry.type.*; import mindustry.world.*; -import mindustry.world.blocks.*; import mindustry.world.meta.*; public class LiquidJunction extends LiquidBlock{ @@ -26,7 +26,7 @@ public class LiquidJunction extends LiquidBlock{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(name, tile.worldx(), tile.worldy()); } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java b/core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java deleted file mode 100644 index 1f6ceac925..0000000000 --- a/core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java +++ /dev/null @@ -1,53 +0,0 @@ -package mindustry.world.blocks.liquid; - -import arc.*; -import arc.graphics.g2d.*; -import mindustry.type.*; -import mindustry.world.*; -import mindustry.world.blocks.*; -import mindustry.world.meta.*; - -//TODO implement later -public class LiquidOverflowGate extends LiquidBlock{ - public int topRegion; - - public LiquidOverflowGate(String name){ - super(name); - rotate = true; - topRegion = reg("-top"); - } - - @Override - public void setStats(){ - super.setStats(); - stats.remove(BlockStat.liquidCapacity); - } - - @Override - public void setBars(){ - super.setBars(); - bars.remove("liquid"); - } - - @Override - public void draw(Tile tile){ - Draw.rect(name, tile.drawx(), tile.drawy()); - Draw.rect(reg(topRegion), tile.drawx(), tile.drawy(), tile.rotation() * 90); - } - - @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; - } - - @Override - public Tile getLiquidDestination(Tile tile, Tile source, Liquid liquid){ - int dir = source.relativeTo(tile.x, tile.y); - dir = (dir + 4) % 4; - Tile next = tile.getNearby(dir).link(); - if(!next.block().acceptLiquid(next, tile, liquid, 0.0001f) && !(next.block() instanceof LiquidOverflowGate || next.block() instanceof LiquidJunction)){ - return tile; - } - return next.block().getLiquidDestination(next, tile, liquid); - } -} diff --git a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java index 3f787d1ef2..1bc9845e27 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -1,8 +1,7 @@ package mindustry.world.blocks.liquid; -import mindustry.type.Liquid; -import mindustry.world.Tile; -import mindustry.world.blocks.LiquidBlock; +import mindustry.gen.*; +import mindustry.type.*; public class LiquidRouter extends LiquidBlock{ @@ -10,16 +9,18 @@ public class LiquidRouter extends LiquidBlock{ super(name); } - @Override - public void update(Tile tile){ + public class LiquidRouterEntity extends LiquidBlockEntity{ - if(tile.entity.liquids().total() > 0.01f){ - tryDumpLiquid(tile, tile.entity.liquids().current()); + @Override + public void updateTile(){ + if(liquids.total() > 0.01f){ + dumpLiquid(liquids.current()); + } + } + + @Override + public boolean acceptLiquid(Tilec source, Liquid liquid, float amount){ + return liquids.get(liquid) + amount < liquidCapacity && (liquids.current() == liquid || liquids.currentAmount() < 0.2f); } } - - @Override - public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - return tile.entity.liquids().get(liquid) + amount < liquidCapacity && (tile.entity.liquids().current() == liquid || tile.entity.liquids().get(tile.entity.liquids().current()) < 0.2f); - } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidTank.java b/core/src/mindustry/world/blocks/liquid/LiquidTank.java deleted file mode 100644 index 89dd558dc2..0000000000 --- a/core/src/mindustry/world/blocks/liquid/LiquidTank.java +++ /dev/null @@ -1,8 +0,0 @@ -package mindustry.world.blocks.liquid; - -public class LiquidTank extends LiquidRouter{ - - public LiquidTank(String name){ - super(name); - } -} diff --git a/core/src/mindustry/world/blocks/power/Battery.java b/core/src/mindustry/world/blocks/power/Battery.java index 053fb39ea9..46d2303bcf 100644 --- a/core/src/mindustry/world/blocks/power/Battery.java +++ b/core/src/mindustry/world/blocks/power/Battery.java @@ -19,7 +19,7 @@ public class Battery extends PowerDistributor{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.color(emptyLightColor, fullLightColor, tile.entity.power().status); Fill.square(tile.drawx(), tile.drawy(), tilesize * size / 2f - 1); Draw.color(); diff --git a/core/src/mindustry/world/blocks/power/ImpactReactor.java b/core/src/mindustry/world/blocks/power/ImpactReactor.java index f323c15687..5f037b5a98 100644 --- a/core/src/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/mindustry/world/blocks/power/ImpactReactor.java @@ -69,7 +69,7 @@ public class ImpactReactor extends PowerGenerator{ } @Override - public void update(Tile tile){ + public void updateTile(){ FusionReactorEntity entity = tile.ent(); if(entity.consValid() && entity.power().status >= 0.99f){ @@ -95,7 +95,7 @@ public class ImpactReactor extends PowerGenerator{ } @Override - public void draw(Tile tile){ + public void draw(){ FusionReactorEntity entity = tile.ent(); Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index 32dbab21c7..34665367e4 100644 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -91,7 +91,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } @Override - public void update(Tile tile){ + public void updateTile(){ ItemLiquidGeneratorEntity entity = tile.ent(); //Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary. @@ -152,7 +152,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); ItemLiquidGeneratorEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/power/LightBlock.java b/core/src/mindustry/world/blocks/power/LightBlock.java index dffcaaf021..0256f30834 100644 --- a/core/src/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/mindustry/world/blocks/power/LightBlock.java @@ -37,7 +37,7 @@ public class LightBlock extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); LightEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index e1c9d20339..4981ddba7e 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -74,7 +74,7 @@ public class NuclearReactor extends PowerGenerator{ } @Override - public void update(Tile tile){ + public void updateTile(){ NuclearReactorEntity entity = tile.ent(); ConsumeLiquid cliquid = consumes.get(ConsumeType.liquid); @@ -159,7 +159,7 @@ public class NuclearReactor extends PowerGenerator{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); NuclearReactorEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/PowerBlock.java b/core/src/mindustry/world/blocks/power/PowerBlock.java similarity index 88% rename from core/src/mindustry/world/blocks/PowerBlock.java rename to core/src/mindustry/world/blocks/power/PowerBlock.java index 3312267635..5e29e99b75 100644 --- a/core/src/mindustry/world/blocks/PowerBlock.java +++ b/core/src/mindustry/world/blocks/power/PowerBlock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.power; import mindustry.world.Block; import mindustry.world.meta.BlockGroup; diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index 267fb727d0..0c3f30a02b 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -24,7 +24,7 @@ public class PowerDiode extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ super.update(tile); if(tile.front() == null || tile.back() == null || !tile.back().block().hasPower || !tile.front().block().hasPower || tile.back().team() != tile.front().team()) return; @@ -69,7 +69,7 @@ public class PowerDiode extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(region, tile.drawx(), tile.drawy(), 0); Draw.rect(arrow, tile.drawx(), tile.drawy(), rotate ? tile.rotation() * 90 : 0); } diff --git a/core/src/mindustry/world/blocks/power/PowerDistributor.java b/core/src/mindustry/world/blocks/power/PowerDistributor.java index 6a9bf0b302..d496ed68c0 100644 --- a/core/src/mindustry/world/blocks/power/PowerDistributor.java +++ b/core/src/mindustry/world/blocks/power/PowerDistributor.java @@ -1,7 +1,5 @@ package mindustry.world.blocks.power; -import mindustry.world.blocks.PowerBlock; - public class PowerDistributor extends PowerBlock{ public PowerDistributor(String name){ diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index 5a1a1b5d29..7fe4b23518 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -14,7 +14,6 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -177,7 +176,7 @@ public class PowerNode extends PowerBlock{ } @Override - public void update(Tile tile){ + public void updateTile(){ tile.entity.power().graph.update(); } diff --git a/core/src/mindustry/world/blocks/power/SolarGenerator.java b/core/src/mindustry/world/blocks/power/SolarGenerator.java index cd7efdb5ed..6c9ada2f9e 100644 --- a/core/src/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/mindustry/world/blocks/power/SolarGenerator.java @@ -16,7 +16,7 @@ public class SolarGenerator extends PowerGenerator{ } @Override - public void update(Tile tile){ + public void updateTile(){ tile.ent().productionEfficiency = state.rules.solarPowerMultiplier < 0 ? (state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f) : state.rules.solarPowerMultiplier; } diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index 5e0059a05f..e9f8c4bab2 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -27,7 +27,7 @@ public class ThermalGenerator extends PowerGenerator{ } @Override - public void update(Tile tile){ + public void updateTile(){ GeneratorEntity entity = tile.ent(); if(entity.productionEfficiency > 0.1f && Mathf.chance(0.05 * entity.delta())){ diff --git a/core/src/mindustry/world/blocks/production/Cultivator.java b/core/src/mindustry/world/blocks/production/Cultivator.java index 26cd4c61ed..30a29a9229 100644 --- a/core/src/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/mindustry/world/blocks/production/Cultivator.java @@ -40,7 +40,7 @@ public class Cultivator extends GenericCrafter{ } @Override - public void update(Tile tile){ + public void updateTile(){ super.update(tile); CultivatorEntity entity = tile.ent(); @@ -70,7 +70,7 @@ public class Cultivator extends GenericCrafter{ } @Override - public void draw(Tile tile){ + public void draw(){ CultivatorEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 123b4bd19a..0f5b5fc4d3 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -91,7 +91,7 @@ public class Drill extends Block{ public void drawCracks(Tile tile){} @Override - public void draw(Tile tile){ + public void draw(){ float s = 0.3f; float ts = 0.6f; @@ -244,7 +244,7 @@ public class Drill extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ DrillEntity entity = tile.ent(); if(entity.dominantItem == null){ diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index e8ce36dff8..f64e8f96a5 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -48,7 +48,7 @@ public class Fracker extends SolidPump{ } @Override - public void draw(Tile tile){ + public void draw(){ FrackerEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); @@ -69,7 +69,7 @@ public class Fracker extends SolidPump{ } @Override - public void update(Tile tile){ + public void updateTile(){ FrackerEntity entity = tile.ent(); if(entity.consValid()){ diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 7b0c83b331..62c341abdd 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.util.*; import arc.util.io.*; import mindustry.content.*; +import mindustry.entities.AllDefs.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; @@ -13,8 +14,6 @@ import mindustry.world.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; -import java.io.*; - public class GenericCrafter extends Block{ public ItemStack outputItem; public LiquidStack outputLiquid; @@ -24,7 +23,7 @@ public class GenericCrafter extends Block{ public Effect updateEffect = Fx.none; public float updateEffectChance = 0.04f; - public Cons drawer = null; + public Cons drawer = null; public Prov drawIcons = null; public GenericCrafter(String name){ @@ -70,7 +69,7 @@ public class GenericCrafter extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ if(drawer == null){ super.draw(tile); }else{ @@ -84,7 +83,7 @@ public class GenericCrafter extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ GenericCrafterEntity entity = tile.ent(); if(entity.consValid()){ diff --git a/core/src/mindustry/world/blocks/production/GenericSmelter.java b/core/src/mindustry/world/blocks/production/GenericSmelter.java index 4e74edecd0..0b98f52906 100644 --- a/core/src/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/mindustry/world/blocks/production/GenericSmelter.java @@ -25,7 +25,7 @@ public class GenericSmelter extends GenericCrafter{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); GenericCrafterEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/production/Incinerator.java b/core/src/mindustry/world/blocks/production/Incinerator.java index d1b223b98c..ef7c9dfd27 100644 --- a/core/src/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/mindustry/world/blocks/production/Incinerator.java @@ -27,7 +27,7 @@ public class Incinerator extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ IncineratorEntity entity = tile.ent(); if(entity.consValid()){ @@ -38,7 +38,7 @@ public class Incinerator extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); IncineratorEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/production/LiquidConverter.java b/core/src/mindustry/world/blocks/production/LiquidConverter.java index 0704e6a08f..2ae8081878 100644 --- a/core/src/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/mindustry/world/blocks/production/LiquidConverter.java @@ -40,7 +40,7 @@ public class LiquidConverter extends GenericCrafter{ } @Override - public void update(Tile tile){ + public void updateTile(){ GenericCrafterEntity entity = tile.ent(); ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index 7eabecdb41..c359a6f58e 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -9,7 +9,7 @@ import mindustry.graphics.Layer; import mindustry.type.Liquid; import mindustry.ui.Cicon; import mindustry.world.Tile; -import mindustry.world.blocks.LiquidBlock; +import mindustry.world.blocks.liquid.LiquidBlock; import mindustry.world.meta.*; import static mindustry.Vars.tilesize; @@ -45,7 +45,7 @@ public class Pump extends LiquidBlock{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(name, tile.drawx(), tile.drawy()); Draw.color(tile.entity.liquids().current().color); @@ -102,7 +102,7 @@ public class Pump extends LiquidBlock{ } @Override - public void update(Tile tile){ + public void updateTile(){ float tiles = 0f; Liquid liquidDrop = null; diff --git a/core/src/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java index 961da8a521..bd7423e14c 100644 --- a/core/src/mindustry/world/blocks/production/Separator.java +++ b/core/src/mindustry/world/blocks/production/Separator.java @@ -58,7 +58,7 @@ public class Separator extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); GenericCrafterEntity entity = tile.ent(); @@ -74,7 +74,7 @@ public class Separator extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ GenericCrafterEntity entity = tile.ent(); entity.totalProgress += entity.warmup * entity.delta(); diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index f2a21ebbd9..4b65c24df7 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -70,7 +70,7 @@ public class SolidPump extends Pump{ } @Override - public void draw(Tile tile){ + public void draw(){ SolidPumpEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); @@ -88,7 +88,7 @@ public class SolidPump extends Pump{ } @Override - public void update(Tile tile){ + public void updateTile(){ SolidPumpEntity entity = tile.ent(); float fraction = 0f; diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java index 083207ed33..a7a920e676 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -54,7 +54,7 @@ public class ItemSource extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); ItemSourceEntity entity = tile.ent(); @@ -66,7 +66,7 @@ public class ItemSource extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ ItemSourceEntity entity = tile.ent(); if(entity.outputItem == null) return; diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java index 938676f41f..301bc25cf7 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -47,7 +47,7 @@ public class LiquidSource extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ LiquidSourceEntity entity = tile.ent(); if(entity.source == null){ @@ -64,7 +64,7 @@ public class LiquidSource extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); LiquidSourceEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java index ba778d2688..067f6335e5 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java @@ -1,6 +1,6 @@ package mindustry.world.blocks.sandbox; -import mindustry.world.blocks.PowerBlock; +import mindustry.world.blocks.power.PowerBlock; import mindustry.world.meta.BlockStat; public class PowerVoid extends PowerBlock{ diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 7dec61ac8b..2da675b576 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -201,7 +201,7 @@ public class CoreBlock extends StorageBlock{ } @Override - public void update(Tile tile){ + public void updateTile(){ CoreEntity entity = tile.ent(); //TODO implement diff --git a/core/src/mindustry/world/blocks/storage/LaunchPad.java b/core/src/mindustry/world/blocks/storage/LaunchPad.java index 3c011cda8b..b2bf03592d 100644 --- a/core/src/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/mindustry/world/blocks/storage/LaunchPad.java @@ -43,7 +43,7 @@ public class LaunchPad extends StorageBlock{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); //TODO broken @@ -69,7 +69,7 @@ public class LaunchPad extends StorageBlock{ } @Override - public void update(Tile tile){ + public void updateTile(){ Tilec entity = tile.entity; if(state.isCampaign() && entity.consValid() && entity.items().total() >= itemCapacity && entity.timer(timerLaunch, launchTime / entity.timeScale())){ diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index 9954c27385..7f83f79810 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -60,7 +60,7 @@ public class Unloader extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ UnloaderEntity entity = tile.ent(); if(tile.entity.timer(timerUnload, speed / entity.timeScale()) && tile.entity.items().total() == 0){ @@ -110,7 +110,7 @@ public class Unloader extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ super.draw(tile); UnloaderEntity entity = tile.ent(); diff --git a/core/src/mindustry/world/blocks/units/CommandCenter.java b/core/src/mindustry/world/blocks/units/CommandCenter.java index 34a8ba5f4a..5ac6196ec8 100644 --- a/core/src/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/mindustry/world/blocks/units/CommandCenter.java @@ -87,7 +87,7 @@ public class CommandCenter extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ CommandCenterEntity entity = tile.ent(); super.draw(tile); diff --git a/core/src/mindustry/world/blocks/units/MechPad.java b/core/src/mindustry/world/blocks/units/MechPad.java index 4567ce39f4..c304c74bc7 100644 --- a/core/src/mindustry/world/blocks/units/MechPad.java +++ b/core/src/mindustry/world/blocks/units/MechPad.java @@ -115,7 +115,7 @@ public class MechPad extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ MechFactoryEntity entity = tile.ent(); if(entity.player != null){ diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index 547b1ceb63..4490083e5e 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -72,7 +72,7 @@ public class RepairPoint extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ Draw.rect(baseRegion, tile.drawx(), tile.drawy()); } @@ -106,7 +106,7 @@ public class RepairPoint extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ RepairPointEntity entity = tile.ent(); boolean targetIsBeingRepaired = false; diff --git a/core/src/mindustry/world/blocks/RespawnBlock.java b/core/src/mindustry/world/blocks/units/RespawnBlock.java similarity index 98% rename from core/src/mindustry/world/blocks/RespawnBlock.java rename to core/src/mindustry/world/blocks/units/RespawnBlock.java index 1ee3297219..2c7f0b1ffe 100644 --- a/core/src/mindustry/world/blocks/RespawnBlock.java +++ b/core/src/mindustry/world/blocks/units/RespawnBlock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks; +package mindustry.world.blocks.units; import arc.graphics.g2d.*; import arc.math.*; diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 7f09a66ff4..080182e6f4 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -116,7 +116,7 @@ public class UnitFactory extends Block{ } @Override - public void draw(Tile tile){ + public void draw(){ UnitFactoryEntity entity = tile.ent(); TextureRegion region = unitType.icon(Cicon.full); @@ -147,7 +147,7 @@ public class UnitFactory extends Block{ } @Override - public void update(Tile tile){ + public void updateTile(){ UnitFactoryEntity entity = tile.ent(); if(entity.spawned >= maxSpawn){ diff --git a/core/src/mindustry/world/meta/values/FloorValue.java b/core/src/mindustry/world/meta/values/FloorValue.java index 81b612164b..45ff92bc7d 100644 --- a/core/src/mindustry/world/meta/values/FloorValue.java +++ b/core/src/mindustry/world/meta/values/FloorValue.java @@ -3,7 +3,7 @@ package mindustry.world.meta.values; import arc.scene.ui.*; import arc.scene.ui.layout.*; import mindustry.ui.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import mindustry.world.meta.*; public class FloorValue implements StatValue{ diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index bb8cecff91..aa8ad490ac 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -8,7 +8,6 @@ import mindustry.content.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.world.*; -import mindustry.world.blocks.*; import mindustry.world.blocks.power.*; import mindustry.world.modules.*; import org.junit.jupiter.api.*; diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index b63a056495..7895b9ae79 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -14,7 +14,7 @@ import mindustry.tools.ImagePacker.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*;