From fe76490418664d38865ebf33e4b8c83bf0dd146a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 7 Sep 2020 17:06:56 -0400 Subject: [PATCH] Fixed #2515 --- core/assets/planets/serpulo.dat | Bin 23483 -> 23255 bytes core/src/mindustry/content/Blocks.java | 36 ++++------ core/src/mindustry/core/Control.java | 6 +- core/src/mindustry/core/World.java | 2 - core/src/mindustry/editor/EditorTile.java | 15 ++-- .../maps/generators/BaseGenerator.java | 18 ++--- core/src/mindustry/type/Sector.java | 4 +- core/src/mindustry/world/Tile.java | 15 ++-- .../world/blocks/power/NuclearReactor.java | 2 +- .../mindustry/world/consumers/Consumers.java | 4 ++ .../mindustry/tools/SectorDataGenerator.java | 64 +++++++++++++++++- 11 files changed, 106 insertions(+), 60 deletions(-) diff --git a/core/assets/planets/serpulo.dat b/core/assets/planets/serpulo.dat index d31bf6c11c9a526655dfa807298d9968504f43a5..3a1465dfde3363207b973b0d6887d3fbdbe91717 100644 GIT binary patch delta 9683 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 delta 9936 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 diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 978678824c..6c2e445822 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -101,13 +101,12 @@ public class Blocks implements ContentList{ hasShadow = false; } - public void drawBase(Tile tile){} - public void load(){} - public void init(){} - public boolean isHidden(){ - return true; - } + @Override public void drawBase(Tile tile){} + @Override public void load(){} + @Override public void init(){} + @Override public boolean isHidden(){ return true; } + @Override public TextureRegion[] variantRegions(){ if(variantRegions == null){ variantRegions = new TextureRegion[]{Core.atlas.find("clear")}; @@ -211,9 +210,7 @@ public class Blocks implements ContentList{ cacheLayer = CacheLayer.slag; }}; - stone = new Floor("stone"){{ - - }}; + stone = new Floor("stone"); craters = new Floor("craters"){{ variants = 3; @@ -265,9 +262,7 @@ public class Blocks implements ContentList{ ((ShallowLiquid)sandWater).set(Blocks.water, Blocks.sand); ((ShallowLiquid)darksandWater).set(Blocks.water, Blocks.darksand); - holostone = new Floor("holostone"){{ - - }}; + holostone = new Floor("holostone"); grass = new Floor("grass"){{ attributes.set(Attribute.water, 0.1f); @@ -334,8 +329,7 @@ public class Blocks implements ContentList{ variants = 2; }}; - saltRocks = new StaticWall("saltrocks"){{ - }}; + saltRocks = new StaticWall("saltrocks"); sporePine = new StaticTree("spore-pine"){{ variants = 0; @@ -349,15 +343,11 @@ public class Blocks implements ContentList{ variants = 0; }}; - shrubs = new StaticWall("shrubs"){{ + shrubs = new StaticWall("shrubs"); - }}; + whiteTreeDead = new TreeBlock("white-tree-dead"); - whiteTreeDead = new TreeBlock("white-tree-dead"){{ - }}; - - whiteTree = new TreeBlock("white-tree"){{ - }}; + whiteTree = new TreeBlock("white-tree"); sporeCluster = new Rock("spore-cluster"){{ variants = 3; @@ -1157,7 +1147,7 @@ public class Blocks implements ContentList{ rtgGenerator = new DecayGenerator("rtg-generator"){{ requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phasefabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; - powerProduction = 4f; + powerProduction = 4.5f; itemDuration = 500f; }}; @@ -1177,7 +1167,7 @@ public class Blocks implements ContentList{ size = 3; health = 700; itemDuration = 360f; - powerProduction = 14f; + powerProduction = 15f; consumes.item(Items.thorium); heating = 0.02f; consumes.liquid(Liquids.cryofluid, heating / coolantPower).update(false); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 46e79e64cd..cf3e474211 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -431,16 +431,16 @@ public class Control implements ApplicationListener, Loadable{ ui.showStartupInfo("[accent]v6[] is currently in [accent]pre-alpha[].\n" + "[lightgray]This means:[]\n" + "- Content is missing\n" + - "- [scarlet]Mobile[] is not supported.\n" + "- Most [scarlet]Unit AI[] does not work\n" + - "- Many units are [scarlet]missing[] or unfinished\n" + + "- Many units are unfinished\n" + "- The campaign is completely unfinished\n" + "- Everything you see is subject to change or removal." + "\n\nReport bugs or crashes on [accent]Github[]."); })); } - //play tutorial on stop + //play tutorial on start + //TODO no tutorial right now if(!settings.getBool("playedtutorial", false)){ //Core.app.post(() -> Core.app.post(this::playTutorial)); } diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index dcc9fb4812..52fdbecd9b 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -185,8 +185,6 @@ public class World{ continue; } - tile.updateOcclusion(); - if(tile.build != null){ tile.build.updateProximity(); } diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 3ad8cf49d8..feb53f2f09 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -39,13 +39,6 @@ public class EditorTile extends Tile{ super.setFloor(type); } - @Override - public void updateOcclusion(){ - super.updateOcclusion(); - - ui.editor.editor.renderer().updatePoint(x, y); - } - @Override public void setBlock(Block type, Team team, int rotation){ if(state.isGame()){ @@ -85,8 +78,12 @@ public class EditorTile extends Tile{ } @Override - protected void preChanged(){ - super.preChanged(); + protected void fireChanged(){ + if(state.isGame()){ + super.fireChanged(); + }else{ + ui.editor.editor.renderer().updatePoint(x, y); + } } @Override diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index a9be2c15fc..a671ac4d72 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -200,20 +200,16 @@ public class BaseGenerator{ } boolean isTaken(Block block, int x, int y){ - if(block.isMultiblock()){ - int offsetx = -(block.size - 1) / 2; - int offsety = -(block.size - 1) / 2; + int offsetx = -(block.size - 1) / 2; + int offsety = -(block.size - 1) / 2; + int pad = 1; - for(int dx = 0; dx < block.size; dx++){ - for(int dy = 0; dy < block.size; dy++){ - if(overlaps(dx + offsetx + x, dy + offsety + y)){ - return true; - } + for(int dx = -pad; dx < block.size + pad; dx++){ + for(int dy = -pad; dy < block.size + pad; dy++){ + if(overlaps(dx + offsetx + x, dy + offsety + y)){ + return true; } } - - }else{ - return overlaps(x, y); } return false; diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index bf20d55b3f..7b6dbbcc15 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -390,6 +390,8 @@ public class Sector{ /** Has an enemy base. */ base, /** Has spore weather. */ - spores + spores, + /** Path from core to spawns requires traversing water. */ + navalPath } } diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index dc4e5d7603..482724699a 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -449,10 +449,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return block.solid && block.fillsTile && !block.synthetic() ? data : 0; } - //TODO remove this method? - public void updateOcclusion(){ - } - protected void preChanged(){ if(build != null){ //only call removed() for the center block - this only gets called once. @@ -475,8 +471,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ other.block = Blocks.air; //manually call changed event - other.updateOcclusion(); - world.notifyChanged(other); + other.fireChanged(); } } } @@ -533,9 +528,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } - updateOcclusion(); - - world.notifyChanged(this); + fireChanged(); //recache when static block is added if(block.isStatic()){ @@ -543,6 +536,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } + protected void fireChanged(){ + world.notifyChanged(this); + } + @Override public void display(Table table){ Block toDisplay = overlay.itemDrop != null ? overlay : floor; diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index 18dfd0afca..ac449d90db 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -70,7 +70,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void updateTile(){ ConsumeLiquid cliquid = consumes.get(ConsumeType.liquid); - Item item = consumes.get(ConsumeType.item).items[0].item; + Item item = consumes.getItem().items[0].item; int fuel = items.get(item); float fullness = (float)fuel / itemCapacity; diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 99fff57632..8683c6d158 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -34,6 +34,10 @@ public class Consumers{ return get(ConsumeType.power); } + public ConsumeItems getItem(){ + return get(ConsumeType.item); + } + public boolean hasPower(){ return has(ConsumeType.power); } diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java index 34cc7c7200..622a0b2466 100644 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ b/tools/src/mindustry/tools/SectorDataGenerator.java @@ -3,6 +3,7 @@ package mindustry.tools; import arc.*; import arc.backend.headless.mock.*; import arc.files.*; +import arc.math.geom.*; import arc.mock.*; import arc.struct.*; import arc.struct.ObjectIntMap.*; @@ -17,6 +18,7 @@ import mindustry.net.Net; import mindustry.type.*; import mindustry.type.Sector.*; import mindustry.world.*; +import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.CoreBlock.*; import static mindustry.Vars.*; @@ -84,6 +86,19 @@ public class SectorDataGenerator{ CoreBuild entity = Team.sharded.core(); int cx = entity.tileX(), cy = entity.tileY(); + boolean path = pathfind(true); + boolean groundPath = pathfind(false); + + if(!path){ + Log.err("Sector &ly@&lr has no core path!", sector.id); + } + + if(!groundPath){ + Log.debug("&lbSector &ly@&lb is naval-only", sector.id); + + data.attributes |= (1 << SectorAttribute.navalPath.ordinal()); + } + int nearTiles = 0; int waterCheckRad = 5; @@ -150,7 +165,7 @@ public class SectorDataGenerator{ } if(count[0]++ % 10 == 0){ - Log.info("&lyDone with sector &lm@/@", count[0], planet.sectors.size); + Log.info("&ly[ &lg@% &ly] Done with sector &lm@/@ ", (int)((float)count[0] / planet.sectors.size * 100), count[0], planet.sectors.size); } return data; @@ -163,4 +178,51 @@ public class SectorDataGenerator{ } } } + + private static boolean pathfind(boolean allowWater){ + CoreBuild entity = Team.sharded.core(); + + IntSet enemies = new IntSet(); + world.tiles.eachTile(t -> { + if((t.team() == Team.crux && t.block() instanceof CoreBlock) || t.overlay() == Blocks.spawn){ + enemies.add(t.pos()); + } + }); + + GridBits used = new GridBits(world.width(), world.height()); + + IntQueue queue = new IntQueue(); + queue.addFirst(entity.pos()); + boolean any = false; + + outer: + while(!queue.isEmpty()){ + int pos = queue.removeFirst(); + int x = Point2.x(pos), y = Point2.y(pos); + used.set(x, y); + + for(Point2 p : Geometry.d4){ + int nx = p.x + x, ny = p.y + y; + + if(world.tiles.in(nx, ny) && !used.get(nx, ny)){ + Tile tile = world.tile(nx, ny); + + //skip full solids + if((tile.block().isStatic() && tile.solid()) || (!allowWater && tile.floor().isLiquid)) continue; + + int newpos = Point2.pack(nx, ny); + + used.set(nx, ny); + queue.addLast(newpos); + + if(enemies.contains(newpos)){ + any = true; + break outer; + } + } + } + } + + return any; + } }