From 09221f952a260c7f55810db17d6e081c100e115b Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 21 Apr 2022 14:34:01 -0400 Subject: [PATCH] Shield breaker block --- .../sprites/blocks/defense/shield-breaker.png | Bin 0 -> 4699 bytes core/src/mindustry/ai/BlockIndexer.java | 4 ++- core/src/mindustry/content/Blocks.java | 9 ++++++ core/src/mindustry/game/Teams.java | 7 +++++ .../world/blocks/defense/ShieldBreaker.java | 28 +++++++++++++++++- gradle.properties | 2 +- 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/shield-breaker.png diff --git a/core/assets-raw/sprites/blocks/defense/shield-breaker.png b/core/assets-raw/sprites/blocks/defense/shield-breaker.png new file mode 100644 index 0000000000000000000000000000000000000000..3012ca28677a56eb36ee8e133146fc58b9a4d493 GIT binary patch literal 4699 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 nn&zh#Q=Hpc5cJl~ZM4U|{fc^>bP0l+XkKF>$5Y literal 0 HcmV?d00001 diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index e5cf94e462..a1a014fc5d 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -114,7 +114,8 @@ public class BlockIndexer{ } //no longer part of the building list - data.buildings.remove(tile.build); + data.buildings.remove(build); + data.buildingTypes.get(build.block, () -> new Seq<>(false)).remove(build); //update the unit cap when building is removed data.unitCap -= tile.block().unitCapModifier; @@ -449,6 +450,7 @@ public class BlockIndexer{ //record in list of buildings data.buildings.add(tile.build); + data.buildingTypes.get(tile.block(), () -> new Seq<>(false)).add(tile.build); //update the unit cap when new tile is registered data.unitCap += tile.block().unitCapModifier; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 766d98a6a5..9651026dad 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -91,6 +91,7 @@ public class Blocks{ //campaign only shieldProjector, largeShieldProjector, + shieldBreaker, //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, @@ -1781,6 +1782,14 @@ public class Blocks{ consumePower(5f); }}; + shieldBreaker = new BaseShield("shield-breaker"){{ + requirements(Category.effect, BuildVisibility.editorOnly, with()); + + size = 5; + + consumeItem(Items.tungsten, 100); + }}; + //endregion //region distribution diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index 54bbd84c6f..e92e7e677c 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -10,6 +10,7 @@ import mindustry.*; import mindustry.ai.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.world.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -260,6 +261,8 @@ public class Teams{ public int unitCount; /** Counts for each type of unit. Do not access directly. */ public @Nullable int[] typeCounts; + /** Cached buildings by type. */ + public ObjectMap> buildingTypes = new ObjectMap<>(); /** Units of this team. Updated each frame. */ public Seq units = new Seq<>(false); /** Same as units, but players. */ @@ -273,6 +276,10 @@ public class Teams{ this.team = team; } + public Seq getBuildings(Block block){ + return buildingTypes.get(block, () -> new Seq<>(false)); + } + /** Destroys this team's presence on the map, killing part of its buildings and converting everything to 'derelict'. */ public void destroyToDerelict(){ diff --git a/core/src/mindustry/world/blocks/defense/ShieldBreaker.java b/core/src/mindustry/world/blocks/defense/ShieldBreaker.java index 76f94a8c99..b0cda79ded 100644 --- a/core/src/mindustry/world/blocks/defense/ShieldBreaker.java +++ b/core/src/mindustry/world/blocks/defense/ShieldBreaker.java @@ -1,9 +1,16 @@ package mindustry.world.blocks.defense; +import arc.math.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; import mindustry.gen.*; import mindustry.world.*; public class ShieldBreaker extends Block{ + public @Nullable Block toDestroy; + public Effect effect = Fx.shockwave, breakEffect = Fx.reactorExplosion, selfKillEffect = Fx.massiveExplosion; public ShieldBreaker(String name){ super(name); @@ -11,11 +18,30 @@ public class ShieldBreaker extends Block{ solid = update = true; } + @Override + public boolean canBreak(Tile tile){ + return false; + } + public class ShieldBreakerBuild extends Building{ @Override public void updateTile(){ - + if(Mathf.equal(efficiency, 1f)){ + if(toDestroy != null){ + effect.at(this); + for(var other : Vars.state.teams.active){ + if(team != other.team){ + other.getBuildings(toDestroy).copy().each(b -> { + breakEffect.at(b); + b.kill(); + }); + } + } + selfKillEffect.at(this); + kill(); + } + } } } } diff --git a/gradle.properties b/gradle.properties index b4b546230d..55f4b48e62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ org.gradle.caching=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=6daca211b7 +archash=b2eb1dd566