From c3222f59c50cc2c00a7871e14cb50cd84686a846 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 14 Sep 2020 17:10:32 -0400 Subject: [PATCH 01/44] router --- .../world/blocks/distribution/Router.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index cb0ae9807d..6dae71a26e 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -1,9 +1,12 @@ package mindustry.world.blocks.distribution; +import arc.math.*; +import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.*; import mindustry.world.meta.*; public class Router extends Block{ @@ -20,10 +23,22 @@ public class Router extends Block{ noUpdateDisabled = true; } - public class RouterBuild extends Building{ + public class RouterBuild extends Building implements ControlBlock{ public Item lastItem; public Tile lastInput; public float time; + public @NonNull BlockUnitc unit = Nulls.blockUnit; + + @Override + public void created(){ + unit = (BlockUnitc)UnitTypes.block.create(team); + unit.tile(this); + } + + @Override + public Unit unit(){ + return (Unit)unit; + } @Override public void updateTile(){ @@ -72,6 +87,22 @@ public class Router extends Block{ } public Building getTileTarget(Item item, Tile from, boolean set){ + if(isControlled()){ + unit.health(health); + unit.team(team); + + int angle = Mathf.mod((int)((angleTo(unit.aimX(), unit.aimY()) + 45) / 90), 4); + + if(unit.isShooting()){ + Building other = nearby(angle); + if(other.acceptItem(this, item)){ + return other; + } + } + + return null; + } + int counter = rotation; for(int i = 0; i < proximity.size; i++){ Building other = proximity.get((i + counter) % proximity.size); From c1c41a19c89ce1079ac1032895d4b35102731b28 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 09:08:47 -0400 Subject: [PATCH 02/44] Cleanup --- core/src/mindustry/ai/BaseAI.java | 2 +- core/src/mindustry/ai/Pathfinder.java | 2 +- core/src/mindustry/editor/EditorTile.java | 4 ++-- core/src/mindustry/editor/MapGenerateDialog.java | 2 +- core/src/mindustry/entities/comp/BuildingComp.java | 4 ++-- core/src/mindustry/game/EventType.java | 6 +++--- .../maps/planet/SerpuloPlanetGenerator.java | 2 +- core/src/mindustry/world/Build.java | 2 +- core/src/mindustry/world/CachedTile.java | 2 +- core/src/mindustry/world/Tile.java | 14 +++++++------- core/src/mindustry/world/blocks/Autotiler.java | 4 ++-- .../src/mindustry/world/blocks/ConstructBlock.java | 2 +- .../world/blocks/distribution/ItemBridge.java | 2 +- .../world/blocks/distribution/PayloadConveyor.java | 2 +- .../mindustry/world/blocks/environment/Floor.java | 8 ++++---- .../world/blocks/environment/StaticTree.java | 2 +- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 4a4a267217..51c5be43b3 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -24,7 +24,7 @@ public class BaseAI{ private static final Vec2 axis = new Vec2(), rotator = new Vec2(); private static final float correctPercent = 0.5f; private static final float step = 5; - private static final int attempts = 5; + private static final int attempts = 4; private static final float emptyChance = 0.01f; private static final int timerStep = 0, timerSpawn = 1; diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 900a481a13..78a596bb9d 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -103,7 +103,7 @@ public class Pathfinder implements Runnable{ boolean nearLiquid = false, nearSolid = false, nearGround = false; for(int i = 0; i < 4; i++){ - Tile other = tile.getNearby(i); + Tile other = tile.nearby(i); if(other != null){ if(other.floor().isLiquid) nearLiquid = true; if(other.solid()) nearSolid = true; diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 5ff533325d..2d08b9d3d2 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -105,9 +105,9 @@ public class EditorTile extends Tile{ } @Override - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changeBuild(Team team, Prov entityprov, int rotation){ if(skip()){ - super.changeEntity(team, entityprov, rotation); + super.changeBuild(team, entityprov, rotation); return; } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index fae31dc7d5..6a06e0b966 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -51,7 +51,7 @@ public class MapGenerateDialog extends BaseDialog{ CachedTile ctile = new CachedTile(){ //nothing. @Override - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changeBuild(Team team, Prov entityprov, int rotation){ } }; diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index e81c867988..45b1042660 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -464,7 +464,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, */ public boolean movePayload(Payload todump){ int trns = block.size/2 + 1; - Tile next = tile.getNearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); + Tile next = tile.nearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(self(), todump)){ next.build.handlePayload(self(), todump); @@ -547,7 +547,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public float moveLiquidForward(boolean leaks, Liquid liquid){ - Tile next = tile.getNearby(rotation); + Tile next = tile.nearby(rotation); if(next == null) return 0; diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index cc71e17224..1ab946c4ac 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -229,8 +229,8 @@ public class EventType{ } /** - * Called when block building begins by placing down the BuildBlock. - * The tile's block will nearly always be a BuildBlock. + * Called when block building begins by placing down the ConstructBlock. + * The tile's block will nearly always be a ConstructBlock. */ public static class BlockBuildBeginEvent{ public final Tile tile; @@ -262,7 +262,7 @@ public class EventType{ /** * Called when a player or drone begins building something. - * This does not necessarily happen when a new BuildBlock is created. + * This does not necessarily happen when a new ConstructBlock is created. */ public static class BuildSelectEvent{ public final Tile tile; diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 9065467dff..7e2b5e9aaa 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -414,7 +414,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ state.rules.attackMode = sector.info.attack = true; }else{ - state.rules.winWave = sector.info.winWave = 15 * (int)Math.max(difficulty * 10, 1); + state.rules.winWave = sector.info.winWave = 10 + 5 * (int)Math.max(difficulty * 10, 1); } state.rules.waves = sector.info.waves = true; diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 070ddab553..98409e6d18 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -45,7 +45,7 @@ public class Build{ Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); } - /** Places a BuildBlock at this location. */ + /** Places a ConstructBlock at this location. */ @Remote(called = Loc.server) public static void beginPlace(Block result, Team team, int x, int y, int rotation){ if(!validPlace(result, team, x, y, rotation)){ diff --git a/core/src/mindustry/world/CachedTile.java b/core/src/mindustry/world/CachedTile.java index 3c14ade132..5777ece759 100644 --- a/core/src/mindustry/world/CachedTile.java +++ b/core/src/mindustry/world/CachedTile.java @@ -21,7 +21,7 @@ public class CachedTile extends Tile{ } @Override - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changeBuild(Team team, Prov entityprov, int rotation){ build = null; Block block = block(); diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 8fdfd6c009..18696d8930 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -45,7 +45,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ this.block = wall; //update entity and create it if needed - changeEntity(Team.derelict, wall::newBuilding, 0); + changeBuild(Team.derelict, wall::newBuilding, 0); changed(); } @@ -186,7 +186,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ this.block = type; preChanged(); - changeEntity(team, entityprov, (byte)Mathf.mod(rotation, 4)); + changeBuild(team, entityprov, (byte)Mathf.mod(rotation, 4)); if(build != null){ build.team(team); @@ -430,15 +430,15 @@ public class Tile implements Position, QuadTreeObject, Displayable{ getHitbox(rect); } - public Tile getNearby(Point2 relative){ + public Tile nearby(Point2 relative){ return world.tile(x + relative.x, y + relative.y); } - public Tile getNearby(int dx, int dy){ + public Tile nearby(int dx, int dy){ return world.tile(x + dx, y + dy); } - public Tile getNearby(int rotation){ + public Tile nearby(int rotation){ if(rotation == 0) return world.tile(x + 1, y); if(rotation == 1) return world.tile(x, y + 1); if(rotation == 2) return world.tile(x - 1, y); @@ -446,7 +446,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return null; } - public Building getNearbyEntity(int rotation){ + public Building nearbyBuild(int rotation){ if(rotation == 0) return world.build(x + 1, y); if(rotation == 1) return world.build(x, y + 1); if(rotation == 2) return world.build(x - 1, y); @@ -503,7 +503,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changeBuild(Team team, Prov entityprov, int rotation){ if(build != null){ int size = build.block.size; build.remove(); diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index 2989436fac..027ac93b31 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -133,7 +133,7 @@ public interface Autotiler{ for(int i = 0; i < 4; i++){ int realDir = Mathf.mod(rotation - i, 4); - if(blends(tile, rotation, directional, i, world) && (tile != null && tile.getNearbyEntity(realDir) != null && !tile.getNearbyEntity(realDir).block.squareSprite)){ + if(blends(tile, rotation, directional, i, world) && (tile != null && tile.nearbyBuild(realDir) != null && !tile.nearbyBuild(realDir).block.squareSprite)){ blendresult[4] |= (1 << i); } } @@ -194,7 +194,7 @@ public interface Autotiler{ // TODO docs -- use for direction? default boolean blends(Tile tile, int rotation, int direction){ - Building other = tile.getNearbyEntity(Mathf.mod(rotation - direction, 4)); + Building other = tile.nearbyBuild(Mathf.mod(rotation - direction, 4)); return other != null && other.team == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation, other.block); } diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java index c228397a32..cefdfa6887 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -42,7 +42,7 @@ public class ConstructBlock extends Block{ consBlocks[size - 1] = this; } - /** Returns a BuildBlock by size. */ + /** Returns a ConstructBlock by size. */ public static ConstructBlock get(int size){ if(size > maxSize) throw new IllegalArgumentException("No. Don't place ConstructBlock of size greater than " + maxSize); return consBlocks[size - 1]; diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 2d09c69eba..87fcb11a7e 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -202,7 +202,7 @@ public class ItemBridge extends Block{ for(int i = 1; i <= range; i++){ for(int j = 0; j < 4; j++){ - Tile other = tile.getNearby(Geometry.d4[j].x * i, Geometry.d4[j].y * i); + Tile other = tile.nearby(Geometry.d4[j].x * i, Geometry.d4[j].y * i); if(linkValid(tile, other)){ boolean linked = other.pos() == link; diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 7c0bbb7821..08035d9c84 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -87,7 +87,7 @@ public class PayloadConveyor extends Block{ } int ntrns = 1 + size/2; - Tile next = tile.getNearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns); + Tile next = tile.nearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns); blocked = (next != null && next.solid() && !next.block().outputsPayload) || (this.next != null && (this.next.rotation + 2)%4 == rotation); } diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index a70056717a..cacf375cef 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -183,7 +183,7 @@ public class Floor extends Block{ for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; - Tile other = tile.getNearby(point); + Tile other = tile.nearby(point); if(other != null && other.floor().cacheLayer == layer && other.floor().edges() != null){ if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); @@ -200,7 +200,7 @@ public class Floor extends Block{ for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; - Tile other = tile.getNearby(point); + Tile other = tile.nearby(point); if(other != null && doEdge(other.floor()) && other.floor().cacheLayer == cacheLayer && other.floor().edges() != null){ if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); @@ -217,7 +217,7 @@ public class Floor extends Block{ for(Block block : blenders){ for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; - Tile other = tile.getNearby(point); + Tile other = tile.nearby(point); if(other != null && other.floor() == block){ TextureRegion region = edge((Floor)block, 1 - point.x, 1 - point.y); Draw.rect(region, tile.worldx(), tile.worldy()); @@ -229,7 +229,7 @@ public class Floor extends Block{ //'new' style of edges with shadows instead of colors, not used currently protected void drawEdgesFlat(Tile tile, boolean sameLayer){ for(int i = 0; i < 4; i++){ - Tile other = tile.getNearby(i); + Tile other = tile.nearby(i); if(other != null && doEdge(other.floor())){ Color color = other.floor().mapColor; Draw.color(color.r, color.g, color.b, 1f); diff --git a/core/src/mindustry/world/blocks/environment/StaticTree.java b/core/src/mindustry/world/blocks/environment/StaticTree.java index 78c6133d2f..9b1a7063f4 100644 --- a/core/src/mindustry/world/blocks/environment/StaticTree.java +++ b/core/src/mindustry/world/blocks/environment/StaticTree.java @@ -21,7 +21,7 @@ public class StaticTree extends StaticWall{ float oy = 0; for(int i = 0; i < 4; i++){ - if(tile.getNearby(i) != null && tile.getNearby(i).block() instanceof StaticWall){ + if(tile.nearby(i) != null && tile.nearby(i).block() instanceof StaticWall){ if(i == 0){ r.setWidth(r.width - crop); From e6606ca17eae4a69651b91401b1a0aa3a8b83ff8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 09:11:15 -0400 Subject: [PATCH 03/44] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 64b7650e62..85459446aa 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,8 +7,6 @@ assignees: '' --- -**Note**: Do not report any new bugs directly relating to the v6 campaign. They will not be fixed or considered at this time. - **Platform**: *Android/iOS/Mac/Windows/Linux* **Build**: *The build number under the title in the main menu. Required. "LATEST" IS NOT A VERSION, I NEED THE EXACT BUILD NUMBER OF YOUR GAME.* From 7f708a3f6cd659cf8d6bb3ca1bc1b33932f4c764 Mon Sep 17 00:00:00 2001 From: abomb4 Date: Sun, 18 Oct 2020 21:15:30 +0800 Subject: [PATCH 04/44] Try fix 'Cannot attach current VM' problem in IDEA Seems add a 'fork' option to core module solves this problem --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index e54f6b56b2..1fa4087b6c 100644 --- a/build.gradle +++ b/build.gradle @@ -262,6 +262,8 @@ project(":ios"){ project(":core"){ apply plugin: "java-library" + compileJava.options.fork = true + task preGen{ outputs.upToDateWhen{ false } generateLocales() From 14c42c56521c8cbc65224371027a4c4dd24b6fd2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 09:29:49 -0400 Subject: [PATCH 05/44] Removed issue workaround from README --- README.md | 7 ------- .../mindustry/world/blocks/experimental/BlockForge.java | 2 +- fastlane/metadata/android/en-US/changelogs/29672.txt | 6 ++++++ 3 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/29672.txt diff --git a/README.md b/README.md index 209775b7f6..13f620832f 100644 --- a/README.md +++ b/README.md @@ -50,13 +50,6 @@ To debug the application on a connected phone, run `gradlew android:installDebug If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.* -#### Can not attach to current VM / Error during attachment using [...] - -This is a problem related to [Jabel](https://github.com/bsideup/jabel), which I use to compile Java 8-compatible bytecode while using Java 9+ language features. -I don't know of a complete fix to this issue. However, if you're getting the error when running through IntelliJ, a workaround is to launch through Gradle *once*, which starts a daemon and avoids the problem in future runs through IntelliJ. - - - --- Gradle may take up to several minutes to download files. Be patient.
diff --git a/core/src/mindustry/world/blocks/experimental/BlockForge.java b/core/src/mindustry/world/blocks/experimental/BlockForge.java index 52509674a7..251c6820a0 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockForge.java +++ b/core/src/mindustry/world/blocks/experimental/BlockForge.java @@ -99,7 +99,7 @@ public class BlockForge extends PayloadAcceptor{ public void buildConfiguration(Table table){ Seq blocks = Vars.content.blocks().select(b -> b.isVisible() && b.size <= 2); - ItemSelection.buildTable(table, blocks, () -> recipe, block -> recipe = block); + ItemSelection.buildTable(table, blocks, () -> recipe, this::configure); } @Override diff --git a/fastlane/metadata/android/en-US/changelogs/29672.txt b/fastlane/metadata/android/en-US/changelogs/29672.txt new file mode 100644 index 0000000000..04c1a277ad --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29672.txt @@ -0,0 +1,6 @@ +- Fixed "host game" crash, as well as some other prominent bugs +- Logic: Breaking change: All coordinates are now in tiles, not in "world units" +- Logic: Added sensors for ammo (units/turrets) +- Campaign: Added research button in mobile multiplayer (check pause menu) +- Campaign: Added tech tree sharing in multiplayer - only the host can research +- Campaign: Re-added sector invasions, any sector near an enemy base can be invaded From ce6292cc5360008257ceaa07d6bbfcd4df9a6194 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 11:53:36 -0400 Subject: [PATCH 06/44] Recipe display for reconstructors --- build.gradle | 2 +- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/world/Block.java | 2 +- .../world/blocks/units/Reconstructor.java | 16 ++++++++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 1fa4087b6c..c94a79598a 100644 --- a/build.gradle +++ b/build.gradle @@ -305,7 +305,7 @@ project(":core"){ compileOnly project(":annotations") annotationProcessor project(":annotations") - annotationProcessor 'com.github.Anuken:jabel:40eec868af' + annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd' } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index a70280f81f..fcad9b888f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1353,7 +1353,7 @@ public class Blocks implements ContentList{ size = 5; unitCapModifier = 20; - researchCostMultiplier = 0.06f; + researchCostMultiplier = 0.05f; }}; vault = new StorageBlock("vault"){{ diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 53dde34460..2f559267a8 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -617,7 +617,7 @@ public class Block extends UnlockableContent{ public ItemStack[] researchRequirements(){ ItemStack[] out = new ItemStack[requirements.length]; for(int i = 0; i < out.length; i++){ - int quantity = 40 + Mathf.round(Mathf.pow(requirements[i].amount, 1.25f) * 20 * researchCostMultiplier, 10); + int quantity = 40 + Mathf.round(Mathf.pow(requirements[i].amount, 1.15f) * 20 * researchCostMultiplier, 10); out[i] = new ItemStack(requirements[i].item, UI.roundAmount(quantity)); } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index 326a9f06eb..ed21b6dc11 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -64,6 +64,22 @@ public class Reconstructor extends UnitBlock{ super.setStats(); stats.add(BlockStat.productionTime, constructTime / 60f, StatUnit.seconds); + stats.add(BlockStat.output, table -> { + table.row(); + for(var upgrade : upgrades){ + float size = 8*3; + if(upgrade[0].unlockedNow() && upgrade[1].unlockedNow()){ + table.image(upgrade[0].icon(Cicon.small)).size(size).padRight(4).padLeft(10).scaling(Scaling.fit).right(); + table.add(upgrade[0].localizedName).left(); + + table.add("[lightgray] -> "); + + table.image(upgrade[1].icon(Cicon.small)).size(size).padRight(4).scaling(Scaling.fit); + table.add(upgrade[1].localizedName).left(); + table.row(); + } + } + }); } @Override From 8625ef09ccad287758bac212c5b4de67fd263378 Mon Sep 17 00:00:00 2001 From: summetdev Date: Sun, 18 Oct 2020 19:54:10 +0300 Subject: [PATCH 07/44] Units payload --- core/src/mindustry/input/InputHandler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 6608b4613b..d8ce3e38c1 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -241,6 +241,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ pay.set(x, y); pay.dropLastPayload(); pay.set(prevx, prevy); + pay.controlling().each(u -> { + if (u instanceof Payloadc p){ + p.dropLastPayload(); + } + }); } } From 563e99aded77c896701f81d8c1dfa715faed17fa Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 13:02:55 -0400 Subject: [PATCH 08/44] Fixed #3009 --- core/src/mindustry/world/Block.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 2f559267a8..6ccd5855d2 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -14,6 +14,7 @@ import arc.struct.*; import arc.util.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; @@ -348,7 +349,7 @@ public class Block extends UnlockableContent{ Liquid liquid = consumes.get(ConsumeType.liquid).liquid; current = entity -> liquid; }else{ - current = entity -> entity.liquids.current(); + current = entity -> entity.liquids == null ? Liquids.water : entity.liquids.current(); } bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName, () -> current.get(entity).barColor(), () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); From 2e0c1cd613ae8d2629e55e10d9771c815b12df05 Mon Sep 17 00:00:00 2001 From: Summet Date: Sun, 18 Oct 2020 20:07:46 +0300 Subject: [PATCH 09/44] code style Co-authored-by: Anuken --- core/src/mindustry/input/InputHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index d8ce3e38c1..1a2e587d02 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -242,7 +242,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ pay.dropLastPayload(); pay.set(prevx, prevy); pay.controlling().each(u -> { - if (u instanceof Payloadc p){ + if(u instanceof Payloadc p){ p.dropLastPayload(); } }); From 12e35b643caeb1d19ffd306a884921da93fcc08a Mon Sep 17 00:00:00 2001 From: summetdev Date: Sun, 18 Oct 2020 20:24:09 +0300 Subject: [PATCH 10/44] sync fix --- core/src/mindustry/input/InputHandler.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index d8ce3e38c1..515aed1baa 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -241,11 +241,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ pay.set(x, y); pay.dropLastPayload(); pay.set(prevx, prevy); - pay.controlling().each(u -> { - if (u instanceof Payloadc p){ - p.dropLastPayload(); - } - }); + pay.controlling().each(u -> Call.payloadDropped(u, u.x, u.y)); } } From 801eca5ca3b2ada72884880636c9344d6ea999ea Mon Sep 17 00:00:00 2001 From: summetdev Date: Sun, 18 Oct 2020 21:26:32 +0300 Subject: [PATCH 11/44] prevent sending extra packets --- core/src/mindustry/input/InputHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 515aed1baa..4c425fb2f4 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -241,7 +241,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ pay.set(x, y); pay.dropLastPayload(); pay.set(prevx, prevy); - pay.controlling().each(u -> Call.payloadDropped(u, u.x, u.y)); + pay.controlling().each(u -> { + if(u instanceof Payloadc){ + Call.payloadDropped(u, u.x, u.y); + } + }); } } From bd6aebb9616e41337b1f9005487c650d5de175ea Mon Sep 17 00:00:00 2001 From: summetdev Date: Sun, 18 Oct 2020 21:38:01 +0300 Subject: [PATCH 12/44] fixed a typo in comment --- core/src/mindustry/input/DesktopInput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index e59c334926..63d7c25e84 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -661,7 +661,7 @@ public class DesktopInput extends InputHandler{ } } - //update commander inut + //update commander unit if(Core.input.keyTap(Binding.command)){ Call.unitCommand(player); } From 00d6997b5a8dc7aea98732ab35409b5e24bf19d0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 15:46:20 -0400 Subject: [PATCH 13/44] Hex/bin logic number support --- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/logic/LAssembler.java | 17 ++++++++++++++--- core/src/mindustry/ui/dialogs/PlanetDialog.java | 1 - 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index fcad9b888f..64ebd5c21d 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1912,7 +1912,7 @@ public class Blocks implements ContentList{ new UnitType[]{UnitTypes.antumbra, UnitTypes.eclipse}, new UnitType[]{UnitTypes.arkyid, UnitTypes.toxopid}, new UnitType[]{UnitTypes.scepter, UnitTypes.reign}, - new UnitType[] {UnitTypes.sei, UnitTypes.omura}, + new UnitType[]{UnitTypes.sei, UnitTypes.omura}, new UnitType[]{UnitTypes.quad, UnitTypes.oct}, new UnitType[]{UnitTypes.vela, UnitTypes.corvus} ); diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index f353a8c38c..57c2004320 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -189,17 +189,28 @@ public class LAssembler{ return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id; } + //remove spaces for non-strings + symbol = symbol.replace(' ', '_'); + try{ - double value = Double.parseDouble(symbol); + double value = parseDouble(symbol); if(Double.isNaN(value) || Double.isInfinite(value)) value = 0; + //this creates a hidden const variable with the specified value - String key = "___" + value; - return putConst(key, value).id; + return putConst("___" + value, value).id; }catch(NumberFormatException e){ return putVar(symbol).id; } } + double parseDouble(String symbol) throws NumberFormatException{ + //parse hex/binary syntax + if(symbol.startsWith("0b")) return Long.parseLong(symbol.substring(2), 2); + if(symbol.startsWith("0x")) return Long.parseLong(symbol.substring(2), 16); + + return Double.parseDouble(symbol); + } + /** Adds a constant value by name. */ public BVar putConst(String name, Object value){ BVar var = putVar(name); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 2d32588faa..8257ec10ee 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -491,7 +491,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ selected = null; } } - } }); From db3db47ca1ca72a602ee8a2ed15429ae9fcb3364 Mon Sep 17 00:00:00 2001 From: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com> Date: Sun, 18 Oct 2020 13:35:20 -0700 Subject: [PATCH 14/44] Add wall stats + other changes --- core/assets/bundles/bundle.properties | 7 ++++-- core/src/mindustry/content/Blocks.java | 6 +++-- .../mindustry/world/blocks/defense/Wall.java | 22 ++++++++++++++----- core/src/mindustry/world/meta/BlockStat.java | 3 +++ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 196b6e87af..e5b2fcc8c9 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -625,6 +625,9 @@ blocks.reload = Shots/Second blocks.ammo = Ammo blocks.shieldhealth = Shield Health blocks.cooldowntime = Cooldown Time +blocks.basedeflectchance = Base Deflect Chance +blocks.lightningchance = Lightning Chance +blocks.lightningdamage = Lightning Damage bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1244,8 +1247,8 @@ block.plastanium-wall.description = A special type of wall that absorbs electric block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. -block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflection chance is equal to the ratio of bullet damage to base deflection chance. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflection chance is equal to the ratio of bullet damage to base deflection chance.\nSpans multiple tiles. block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. block.door.description = A small door. Can be opened or closed by tapping. diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index a70280f81f..ff24adaa1b 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -792,14 +792,16 @@ public class Blocks implements ContentList{ phaseWall = new Wall("phase-wall"){{ requirements(Category.defense, with(Items.phasefabric, 6)); health = 150 * wallHealthMultiplier; - flashHit = deflect = true; + chanceDeflect = 10f; + flashHit = true; }}; phaseWallLarge = new Wall("phase-wall-large"){{ requirements(Category.defense, ItemStack.mult(phaseWall.requirements, 4)); health = 150 * 4 * wallHealthMultiplier; size = 2; - flashHit = deflect = true; + chanceDeflect = 10f; + flashHit = true; }}; surgeWall = new Wall("surge-wall"){{ diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index abb941b899..a5f0698238 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -17,16 +17,17 @@ import static mindustry.Vars.*; public class Wall extends Block{ public int variants = 0; - public float lightningChance = -0.001f; + /** Lighting chance. -1 to disable */ + public float lightningChance = -1f; public float lightningDamage = 20f; public int lightningLength = 17; public Color lightningColor = Pal.surge; public Sound lightningSound = Sounds.spark; - public float chanceDeflect = 10f; + /** Bullet deflection chance. -1 to disable */ + public float chanceDeflect = -1f; public boolean flashHit; public Color flashColor = Color.white; - public boolean deflect; public Sound deflectSound = Sounds.none; public Wall(String name){ @@ -38,6 +39,17 @@ public class Wall extends Block{ canOverdrive = false; } + @Override + public void setStats(){ + super.setStats(); + + if(chanceDeflect > 0f) stats.add(BlockStat.baseDeflectChance, chanceDeflect, StatUnit.none); + if(lightningChance > 0f) { + stats.add(BlockStat.lightningChance, lightningChance * 100f, StatUnit.percent); + stats.add(BlockStat.lightningDamage, lightningDamage, StatUnit.none); + } + } + @Override public void load(){ super.load(); @@ -96,7 +108,7 @@ public class Wall extends Block{ hit = 1f; //create lightning if necessary - if(lightningChance > 0){ + if(lightningChance > 0f){ if(Mathf.chance(lightningChance)){ Lightning.create(team, lightningColor, lightningDamage, x, y, bullet.rotation() + 180f, lightningLength); lightningSound.at(tile, Mathf.random(0.9f, 1.1f)); @@ -104,7 +116,7 @@ public class Wall extends Block{ } //deflect bullets if necessary - if(deflect){ + if(chanceDeflect > 0f){ //slow bullets are not deflected if(bullet.vel().len() <= 0.1f || !bullet.type.reflectable) return true; diff --git a/core/src/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java index 05e45acbfe..5b3e71b14f 100644 --- a/core/src/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -12,6 +12,9 @@ public enum BlockStat{ buildTime(StatCategory.general), buildCost(StatCategory.general), memoryCapacity(StatCategory.general), + baseDeflectChance(StatCategory.general), + lightningChance(StatCategory.general), + lightningDamage(StatCategory.general), itemCapacity(StatCategory.items), itemsMoved(StatCategory.items), From 8ceb155e38e415cb38e8b0bd21cc9001dab39265 Mon Sep 17 00:00:00 2001 From: Summet Date: Mon, 19 Oct 2020 00:14:40 +0300 Subject: [PATCH 15/44] :) --- core/assets/contributors | 1 + 1 file changed, 1 insertion(+) diff --git a/core/assets/contributors b/core/assets/contributors index 69de5a3d8e..9f1cf8c9f4 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -95,3 +95,4 @@ ThePlayerA YellOw139 PetrGasparik LeoDog896 +Summet From 7a7fa74e65ca6af88d25ffc75b94c8832081b1bf Mon Sep 17 00:00:00 2001 From: genNAowl <68400583+genNAowl@users.noreply.github.com> Date: Sun, 18 Oct 2020 14:26:48 -0700 Subject: [PATCH 16/44] Update core/src/mindustry/world/blocks/defense/Wall.java Co-authored-by: Summet --- core/src/mindustry/world/blocks/defense/Wall.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index a5f0698238..bc99d814cc 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -44,7 +44,7 @@ public class Wall extends Block{ super.setStats(); if(chanceDeflect > 0f) stats.add(BlockStat.baseDeflectChance, chanceDeflect, StatUnit.none); - if(lightningChance > 0f) { + if(lightningChance > 0f){ stats.add(BlockStat.lightningChance, lightningChance * 100f, StatUnit.percent); stats.add(BlockStat.lightningDamage, lightningDamage, StatUnit.none); } From cff2799c72f53feb26c6c3c10972bbdbe5353a27 Mon Sep 17 00:00:00 2001 From: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com> Date: Sun, 18 Oct 2020 14:29:15 -0700 Subject: [PATCH 17/44] remove changes in description --- core/assets/bundles/bundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e5b2fcc8c9..4c12f1b633 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1247,8 +1247,8 @@ block.plastanium-wall.description = A special type of wall that absorbs electric block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflection chance is equal to the ratio of bullet damage to base deflection chance. -block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflection chance is equal to the ratio of bullet damage to base deflection chance.\nSpans multiple tiles. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. block.door.description = A small door. Can be opened or closed by tapping. From dac236b0e9b4da4c0ad305622af6b66b923aa69e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 18:34:19 -0400 Subject: [PATCH 18/44] Better launch selection --- core/src/mindustry/core/Control.java | 15 --- core/src/mindustry/game/SectorInfo.java | 2 +- core/src/mindustry/input/DesktopInput.java | 4 - core/src/mindustry/type/ItemSeq.java | 20 ++++ core/src/mindustry/type/Sector.java | 21 +++- .../ui/dialogs/LaunchLoadoutDialog.java | 12 ++- .../mindustry/ui/dialogs/PausedDialog.java | 11 +-- .../mindustry/ui/dialogs/PlanetDialog.java | 99 ++++++++++--------- .../world/blocks/production/Fracker.java | 2 +- 9 files changed, 104 insertions(+), 82 deletions(-) diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 0b789d14fd..e24881692f 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -9,7 +9,6 @@ import arc.math.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; -import mindustry.*; import mindustry.audio.*; import mindustry.content.*; import mindustry.core.GameState.*; @@ -25,7 +24,6 @@ import mindustry.maps.Map; import mindustry.type.*; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; import java.text.*; @@ -250,19 +248,6 @@ public class Control implements ApplicationListener, Loadable{ }); } - //TODO move - public void handleLaunch(CoreBuild tile){ - LaunchCorec ent = LaunchCore.create(); - ent.set(tile); - ent.block(Blocks.coreShard); - ent.lifetime(Vars.launchDuration); - ent.add(); - - //remove schematic requirements from core - tile.items.remove(universe.getLastLoadout().requirements()); - tile.items.remove(universe.getLaunchResources()); - } - public void playSector(Sector sector){ playSector(sector, sector); } diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index f9e30f7d02..3b2b4df3dd 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -28,7 +28,7 @@ public class SectorInfo{ /** Items stored in all cores. */ public ItemSeq items = new ItemSeq(); /** The best available core type. */ - public Block bestCoreType = Blocks.air; + public Block bestCoreType = Blocks.coreShard; /** Max storage capacity. */ public int storageCapacity = 0; /** Whether a core is available here. */ diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 63d7c25e84..f305d661fc 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -352,10 +352,6 @@ public class DesktopInput extends InputHandler{ table.button(Icon.map, Styles.clearPartiali, () -> { ui.planet.show(); }).visible(() -> state.isCampaign()).tooltip("@planetmap"); - - table.button(Icon.up, Styles.clearPartiali, () -> { - ui.planet.showLaunch(state.getSector(), player.team().core()); - }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } void pollInput(){ diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index 0407f6a3f8..49055fb5b9 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -21,6 +21,13 @@ public class ItemSeq implements Iterable, Serializable{ stacks.each(this::add); } + public ItemSeq copy(){ + ItemSeq out = new ItemSeq(); + out.total = total; + System.arraycopy(values, 0, out.values, 0, values.length); + return out; + } + public void each(ItemConsumer cons){ for(int i = 0; i < values.length; i++){ if(values[i] != 0){ @@ -46,6 +53,19 @@ public class ItemSeq implements Iterable, Serializable{ return values[item.id] > 0; } + public boolean has(ItemSeq seq){ + for(int i = 0; i < values.length; i++){ + if(seq.values[i] > values[i]){ + return false; + } + } + return true; + } + + public boolean has(Item item, int amount){ + return values[item.id] >= amount; + } + public int get(Item item){ return values[item.id]; } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 37535bffca..975c8b82c8 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -40,9 +40,22 @@ public class Sector{ this.id = tile.id; } + /** @return a copy of the items in this sector - may be core items, or stored data. */ + public ItemSeq getItems(){ + if(isBeingPlayed()){ + ItemSeq out = new ItemSeq(); + if(state.rules.defaultTeam.core() != null) out.add(state.rules.defaultTeam.core().items); + return out; + }else{ + return info.items; + } + } + public Seq near(){ tmpSeq1.clear(); - near(tmpSeq1::add); + for(Ptile tile : tile.tiles){ + tmpSeq1.add(planet.getSector(tile)); + } return tmpSeq1; } @@ -131,6 +144,12 @@ public class Sector{ removeItem(item, -amount); } + public void removeItems(ItemSeq items){ + ItemSeq copy = items.copy(); + copy.each((i, a) -> copy.set(i, -a)); + addItems(copy); + } + public void removeItem(Item item, int amount){ ItemSeq seq = new ItemSeq(); seq.add(item, -amount); diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index 1ba7a0084b..62db818bf7 100644 --- a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java @@ -30,7 +30,7 @@ public class LaunchLoadoutDialog extends BaseDialog{ super("@configure"); } - public void show(CoreBlock core, Building build, Runnable confirm){ + public void show(CoreBlock core, Sector sector, Runnable confirm){ cont.clear(); buttons.clear(); @@ -43,12 +43,14 @@ public class LaunchLoadoutDialog extends BaseDialog{ } }); + ItemSeq sitems = sector.getItems(); + //updates sum requirements Runnable update = () -> { total.clear(); selected.requirements().each(total::add); universe.getLaunchResources().each(total::add); - valid = build.items.has(total); + valid = sitems.has(total); }; Cons rebuild = table -> { @@ -65,8 +67,8 @@ public class LaunchLoadoutDialog extends BaseDialog{ String amountStr = "[lightgray]" + (al + " + [accent]" + as + "[lightgray]"); table.add( - build.items.has(s.item, s.amount) ? amountStr : - "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); + sitems.has(s.item, s.amount) ? amountStr : + "[scarlet]" + (Math.min(sitems.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); if(++i % 4 == 0){ table.row(); @@ -108,7 +110,7 @@ public class LaunchLoadoutDialog extends BaseDialog{ selected = s; update.run(); rebuildItems.run(); - }).group(group).pad(4).disabled(!build.items.has(s.requirements())).checked(s == selected).size(200f); + }).group(group).pad(4).disabled(!sitems.has(s.requirements())).checked(s == selected).size(200f); if(++i % cols == 0){ t.row(); diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 5bd1e5abd3..fce68f3044 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -78,10 +78,7 @@ public class PausedDialog extends BaseDialog{ cont.buttonRow("@load", Icon.download, load::show).disabled(b -> net.active()); }else if(state.isCampaign()){ - cont.buttonRow("@launchcore", Icon.up, () -> { - hide(); - ui.planet.showLaunch(state.getSector(), player.team().core()); - }).disabled(b -> player.team().core() == null || net.client()); + cont.buttonRow("@research", Icon.tree, ui.research::show); cont.row(); @@ -93,11 +90,7 @@ public class PausedDialog extends BaseDialog{ cont.row(); } - if(state.isCampaign() && net.active()){ - cont.buttonRow("@research", Icon.tree, ui.research::show); - }else{ - cont.buttonRow("@hostserver.mobile", Icon.host, ui.host::show).disabled(b -> net.active()); - } + cont.buttonRow("@hostserver.mobile", Icon.host, ui.host::show).disabled(b -> net.active()); cont.buttonRow("@quit", Icon.exit, this::showQuitConfirm).update(s -> { s.setText(control.saves.getCurrent() != null && control.saves.getCurrent().isAutosave() ? "@save.quit" : "@quit"); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 8257ec10ee..0dda776cbe 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -13,6 +13,7 @@ import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.util.*; +import mindustry.content.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.*; @@ -22,7 +23,6 @@ import mindustry.graphics.g3d.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.blocks.storage.*; -import mindustry.world.blocks.storage.CoreBlock.*; import static mindustry.Vars.*; import static mindustry.graphics.g3d.PlanetRenderer.*; @@ -40,7 +40,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ public int launchRange; public float zoom = 1f, selectAlpha = 1f; public @Nullable Sector selected, hovered, launchSector; - public CoreBuild launcher; public Mode mode = look; public boolean launching; public Cons listener = s -> {}; @@ -91,9 +90,16 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ mode = look; selected = hovered = launchSector = null; launching = false; + + zoom = 1f; + planets.zoom = 2f; + selectAlpha = 0f; + launchSector = state.getSector(); + if(planets.planet.getLastSector() != null){ lookAt(planets.planet.getLastSector()); } + return super.show(); } @@ -115,37 +121,33 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ super.show(); } - public void showLaunch(Sector sector, CoreBuild launcher){ - if(launcher == null) return; - - this.launcher = launcher; - selected = null; - hovered = null; - launching = false; - - //update view to sector - lookAt(sector); - zoom = 1f; - planets.zoom = 2f; - selectAlpha = 0f; - launchRange = ((CoreBlock)launcher.block).launchRange; - launchSector = sector; - - mode = launch; - - super.show(); - } - - private void lookAt(Sector sector){ + void lookAt(Sector sector){ planets.camPos.set(Tmp.v33.set(sector.tile.v).rotate(Vec3.Y, -sector.planet.getRotation())); } boolean canSelect(Sector sector){ if(mode == select) return sector.hasBase(); - return mode == launch && - (sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range - || (sector.preset != null && sector.preset.unlocked())); //is an unlocked preset + return sector.near().contains(Sector::hasBase)//(sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range + || (sector.preset != null && sector.preset.unlocked()); //is an unlocked preset + } + + Sector findLauncher(Sector to){ + //directly nearby. + if(to.near().contains(launchSector)) return launchSector; + + Sector launchFrom = launchSector; + if(launchFrom == null){ + //TODO pick one with the most resources + launchFrom = to.near().find(Sector::hasBase); + if(launchFrom == null && to.preset != null){ + if(launchSector != null) return launchSector; + launchFrom = planets.planet.sectors.min(s -> !s.hasBase() ? Float.MAX_VALUE : s.tile.v.dst2(to.tile.v)); + if(!launchFrom.hasBase()) launchFrom = null; + } + } + + return launchFrom; } @Override @@ -157,9 +159,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(selectAlpha > 0.01f){ if(canSelect(sec) || sec.unlocked()){ - if(sec.baseCoverage > 0){ - planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); - } + //TODO remove completely? + //if(sec.baseCoverage > 0){ + //planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); + //} Color color = sec.hasBase() ? Team.sharded.color : @@ -177,8 +180,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } - if(launchSector != null){ - planets.fill(launchSector, hoverColor, -0.001f); + Sector current = state.getSector() != null && state.getSector().isBeingPlayed() ? state.getSector() : null; + + if(current != null){ + planets.fill(current, hoverColor, -0.001f); } //draw hover border @@ -195,9 +200,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.batch.flush(Gl.triangles); - if(mode == launch || mode == select){ - if(hovered != launchSector && hovered != null && canSelect(hovered)){ - planets.drawArc(planet, launchSector.tile.v, hovered.tile.v); + if(hovered != null && !hovered.hasBase()){ + Sector launchFrom = findLauncher(hovered); + if(launchFrom != null && hovered != launchFrom && canSelect(hovered)){ + planets.drawArc(planet, launchFrom.tile.v, hovered.tile.v); } } @@ -244,7 +250,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ addListener(new ElementGestureListener(){ @Override public void tap(InputEvent event, float x, float y, int count, KeyCode button){ - if(hovered != null && ((mode == launch ? canSelect(hovered) && hovered != launchSector : hovered.unlocked()) || debugSelect)){ + if(hovered != null && ((mode == look ? canSelect(hovered) && hovered != launchSector : hovered.unlocked()) || debugSelect)){ selected = hovered; } @@ -263,9 +269,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ }, new Table(t -> { t.touchable = Touchable.disabled; - //TODO localize t.top(); - t.label(() -> mode == select ? "@sectors.select" : mode == launch ? "Select Launch Sector" : "").style(Styles.outlineLabel).color(Pal.accent); + t.label(() -> mode == select ? "@sectors.select" : "").style(Styles.outlineLabel).color(Pal.accent); }), new Table(t -> { t.right(); @@ -322,7 +327,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.toFront(); //smooth camera toward the sector - if(mode == launch && launching){ + if(mode == look && launching){ float len = planets.camPos.len(); planets.camPos.slerp(Tmp.v31.set(selected.tile.v).rotate(Vec3.Y,-selected.planet.getRotation()).setLength(len), 0.1f); } @@ -453,16 +458,20 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } - if(mode == launch && !sector.hasBase()){ - Sector current = state.rules.sector; + if(mode == look && !sector.hasBase()){ shouldHide = false; - loadouts.show((CoreBlock)launcher.block, launcher, () -> { - control.handleLaunch(launcher); + Sector from = findLauncher(sector); + CoreBlock block = from.info.bestCoreType instanceof CoreBlock b ? b : (CoreBlock)Blocks.coreShard; + + loadouts.show(block, from, () -> { + from.removeItems(universe.getLastLoadout().requirements()); + from.removeItems(universe.getLaunchResources()); + launching = true; zoom = 0.5f; ui.hudfrag.showLaunchDirect(); - Time.runTask(launchDuration, () -> control.playSector(current, sector)); + Time.runTask(launchDuration, () -> control.playSector(from, sector)); }); }else if(mode == select){ listener.get(sector); @@ -500,8 +509,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ public enum Mode{ /** Look around for existing sectors. Can only deploy. */ look, - /** Launch to a new location. */ - launch, /** Select a sector for some purpose. */ select } diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index d894cf05b5..b1ea3a5b34 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -45,7 +45,7 @@ public class Fracker extends SolidPump{ Draw.rect(region, x, y); super.drawCracks(); - Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, result.color); + Drawf.liquid(liquidRegion, x, y, liquids.get(result) / liquidCapacity, result.color); Draw.rect(rotatorRegion, x, y, pumpTime); Draw.rect(topRegion, x, y); From c7622198fd4dd568f3bc937209f6211ae074aab1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 19:21:59 -0400 Subject: [PATCH 19/44] Cleanup --- core/src/mindustry/game/Gamemode.java | 1 - core/src/mindustry/input/InputHandler.java | 6 ++--- core/src/mindustry/input/MobileInput.java | 3 ++- core/src/mindustry/io/TypeIO.java | 2 +- .../mindustry/ui/dialogs/PlanetDialog.java | 8 ++---- .../mindustry/world/blocks/ControlBlock.java | 10 +++++++ .../world/blocks/distribution/Router.java | 27 ++++++++++++------- 7 files changed, 36 insertions(+), 21 deletions(-) diff --git a/core/src/mindustry/game/Gamemode.java b/core/src/mindustry/game/Gamemode.java index 9de5e71052..f2bb95130a 100644 --- a/core/src/mindustry/game/Gamemode.java +++ b/core/src/mindustry/game/Gamemode.java @@ -23,7 +23,6 @@ public enum Gamemode{ rules.waveTimer = true; rules.waveSpacing /= 2f; - rules.teams.get(rules.waveTeam).ai = true; rules.teams.get(rules.waveTeam).infiniteResources = true; }, map -> map.teams.contains(state.rules.waveTeam.id)), pvp(rules -> { diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 4c425fb2f4..99103da3d7 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -426,7 +426,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(controlledType != null){ Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type == controlledType && !u.dead); if(unit == null && controlledType == UnitTypes.block){ - unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null; + unit = world.buildWorld(player.x, player.y) instanceof ControlBlock cont && cont.canControl() ? cont.unit() : null; } if(unit != null){ @@ -990,8 +990,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - if(tile instanceof ControlBlock && tile.team == player.team()){ - return ((ControlBlock)tile).unit(); + if(tile instanceof ControlBlock cont && cont.canControl() && tile.team == player.team()){ + return cont.unit(); } return null; diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 530c94deb7..981f55bd6f 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -24,6 +24,7 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; import static mindustry.Vars.*; import static mindustry.input.PlaceMode.*; @@ -936,7 +937,7 @@ public class MobileInput extends InputHandler implements GestureListener{ unit.aim(player.mouseX = Core.input.mouseWorldX(), player.mouseY = Core.input.mouseWorldY()); }else if(target == null){ player.shooting = false; - if(Core.settings.getBool("autotarget")){ + if(Core.settings.getBool("autotarget") && !(player.unit() instanceof BlockUnitUnit u && u.tile() instanceof ControlBlock c && !c.shouldAutoTarget())){ target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.team != Team.derelict, u -> u.team != Team.derelict); if(allowHealing && target == null){ diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index bba4ffeb0a..2c2c19dcfc 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -185,7 +185,7 @@ public class TypeIO{ return unit == null ? Nulls.unit : unit; }else if(type == 1){ //block Building tile = world.build(id); - return tile instanceof ControlBlock ? ((ControlBlock)tile).unit() : Nulls.unit; + return tile instanceof ControlBlock cont ? cont.unit() : Nulls.unit; } return Nulls.unit; } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 0dda776cbe..6763ba37e5 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -92,7 +92,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ launching = false; zoom = 1f; - planets.zoom = 2f; + planets.zoom = 1f; selectAlpha = 0f; launchSector = state.getSector(); @@ -112,7 +112,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //update view to sector lookAt(sector); zoom = 1f; - planets.zoom = 2f; + planets.zoom = 1f; selectAlpha = 0f; launchSector = sector; @@ -159,10 +159,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(selectAlpha > 0.01f){ if(canSelect(sec) || sec.unlocked()){ - //TODO remove completely? - //if(sec.baseCoverage > 0){ - //planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); - //} Color color = sec.hasBase() ? Team.sharded.color : diff --git a/core/src/mindustry/world/blocks/ControlBlock.java b/core/src/mindustry/world/blocks/ControlBlock.java index 6724ff9205..7688cdab6a 100644 --- a/core/src/mindustry/world/blocks/ControlBlock.java +++ b/core/src/mindustry/world/blocks/ControlBlock.java @@ -10,4 +10,14 @@ public interface ControlBlock{ default boolean isControlled(){ return unit().isPlayer(); } + + /** @return whether this block can be controlled at all. */ + default boolean canControl(){ + return true; + } + + /** @return whether targets should automatically be selected (on mobile) */ + default boolean shouldAutoTarget(){ + return true; + } } diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index d8b4200984..f632be6862 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -1,7 +1,7 @@ package mindustry.world.blocks.distribution; import arc.math.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.type.*; @@ -27,19 +27,27 @@ public class Router extends Block{ public Item lastItem; public Tile lastInput; public float time; - public @NonNull BlockUnitc unit = Nulls.blockUnit; - - @Override - public void created(){ - unit = (BlockUnitc)UnitTypes.block.create(team); - unit.tile(this); - } + public @Nullable BlockUnitc unit; @Override public Unit unit(){ + if(unit == null){ + unit = (BlockUnitc)UnitTypes.block.create(team); + unit.tile(this); + } return (Unit)unit; } + @Override + public boolean canControl(){ + return size == 1; + } + + @Override + public boolean shouldAutoTarget(){ + return false; + } + @Override public void updateTile(){ if(lastItem == null && items.any()){ @@ -87,8 +95,9 @@ public class Router extends Block{ } public Building getTileTarget(Item item, Tile from, boolean set){ - if(isControlled()){ + if(unit != null && isControlled()){ unit.health(health); + unit.ammo(unit.type().ammoCapacity * (items.total() > 0 ? 1f : 0f)); unit.team(team); int angle = Mathf.mod((int)((angleTo(unit.aimX(), unit.aimY()) + 45) / 90), 4); From 7f21d61078b74c40823bf704b951df373ec51cc5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Oct 2020 19:54:52 -0400 Subject: [PATCH 20/44] Crash fix --- core/src/mindustry/world/blocks/distribution/Router.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index f632be6862..766a1bafff 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -104,7 +104,7 @@ public class Router extends Block{ if(unit.isShooting()){ Building other = nearby(angle); - if(other.acceptItem(this, item)){ + if(other != null && other.acceptItem(this, item)){ return other; } } From ad5d3581f669e818ddcf5b04e78645d3271da93b Mon Sep 17 00:00:00 2001 From: Ilya246 <57039557+Ilya246@users.noreply.github.com> Date: Mon, 19 Oct 2020 10:09:39 +0400 Subject: [PATCH 21/44] armor defined twice in mega --- core/src/mindustry/content/UnitTypes.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index b9189ec64e..a40199f08c 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1196,7 +1196,6 @@ public class UnitTypes implements ContentList{ mineTier = 3; health = 500; - armor = 2f; armor = 5f; speed = 1.8f; accel = 0.06f; From 80f801db36e1dfc4b1ec529afdc7c33cea7fdf53 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 19 Oct 2020 10:04:10 -0400 Subject: [PATCH 22/44] Fixed #3023 / Fixed #3020 --- core/assets/maps/frozenForest.msav | Bin 10057 -> 10215 bytes core/src/mindustry/ai/WaveSpawner.java | 2 +- core/src/mindustry/ai/types/FlyingAI.java | 4 +- core/src/mindustry/content/Blocks.java | 2 + core/src/mindustry/content/UnitTypes.java | 17 +++-- .../mindustry/entities/comp/PuddleComp.java | 2 +- .../src/mindustry/entities/comp/UnitComp.java | 2 +- core/src/mindustry/type/AmmoTypes.java | 2 +- core/src/mindustry/type/UnitType.java | 2 + .../mindustry/ui/dialogs/PlanetDialog.java | 23 +++--- .../blocks/defense/turrets/BaseTurret.java | 67 ++++++++++++++++++ .../{ => turrets}/PointDefenseTurret.java | 40 ++++------- .../blocks/defense/turrets/ReloadTurret.java | 49 +++++++++++++ .../{ => turrets}/TractorBeamTurret.java | 46 +++++++----- .../world/blocks/defense/turrets/Turret.java | 53 ++------------ .../world/blocks/distribution/ItemBridge.java | 20 +++--- .../mindustry/world/blocks/power/Battery.java | 2 +- .../world/blocks/power/NuclearReactor.java | 2 + .../world/blocks/power/PowerGenerator.java | 2 +- .../blocks/production/GenericCrafter.java | 5 +- .../world/blocks/storage/CoreBlock.java | 2 +- core/src/mindustry/world/meta/BlockFlag.java | 12 ++-- 22 files changed, 228 insertions(+), 128 deletions(-) create mode 100644 core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java rename core/src/mindustry/world/blocks/defense/{ => turrets}/PointDefenseTurret.java (78%) create mode 100644 core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java rename core/src/mindustry/world/blocks/defense/{ => turrets}/TractorBeamTurret.java (75%) diff --git a/core/assets/maps/frozenForest.msav b/core/assets/maps/frozenForest.msav index a2a1f52354d8403d6d5f7655cc87f8e300ae9544..0eb9f1fe564a276af7e7b793c87df4854ae7d815 100644 GIT binary patch literal 10215 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 WzxbM5hO3hA;$6aj)Z2@d2?7AQ=KkLR diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 429ba00587..c420972457 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -80,7 +80,7 @@ public class WaveSpawner{ Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); - Time.run(Math.min(i * 5, 60 * 2), () -> spawnEffect(unit)); + spawnEffect(unit); } }); } diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 9d4c2d38f9..f88a125e93 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -34,10 +34,10 @@ public class FlyingAI extends AIController{ Teamc result = target(x, y, range, air, ground); if(result != null) return result; - if(ground) result = targetFlag(x, y, BlockFlag.producer, true); + if(ground) result = targetFlag(x, y, BlockFlag.generator, true); if(result != null) return result; - if(ground) result = targetFlag(x, y, BlockFlag.turret, true); + if(ground) result = targetFlag(x, y, BlockFlag.core, true); if(result != null) return result; return null; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 64ebd5c21d..bd59e3d092 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -14,6 +14,8 @@ import mindustry.world.blocks.*; import mindustry.world.blocks.campaign.*; import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.turrets.*; +import mindustry.world.blocks.defense.turrets.PointDefenseTurret; +import mindustry.world.blocks.defense.turrets.TractorBeamTurret; import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.environment.*; import mindustry.world.blocks.experimental.*; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index b9189ec64e..1eddbcdabc 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -10,6 +10,7 @@ import mindustry.entities.bullet.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -897,6 +898,7 @@ public class UnitTypes implements ContentList{ range = 140f; faceTarget = false; armor = 4f; + targetFlag = BlockFlag.factory; weapons.add(new Weapon(){{ minShootVelocity = 0.75f; @@ -977,6 +979,7 @@ public class UnitTypes implements ContentList{ engineOffset = 21; engineSize = 5.3f; hitSize = 56f; + targetFlag = BlockFlag.battery; BulletType missiles = new MissileBulletType(2.7f, 10){{ width = 8f; @@ -1051,6 +1054,7 @@ public class UnitTypes implements ContentList{ hitSize = 58f; destructibleWreck = false; armor = 13f; + targetFlag = BlockFlag.reactor; BulletType fragBullet = new FlakBulletType(4f, 5){{ shootEffect = Fx.shootBig; @@ -1246,6 +1250,7 @@ public class UnitTypes implements ContentList{ buildSpeed = 2.5f; range = 140f; targetAir = false; + targetFlag = BlockFlag.battery; ammoType = AmmoTypes.powerHigh; @@ -1654,7 +1659,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 15f; accel = 0.1f; itemCapacity = 30; - health = 120f; + health = 150f; engineOffset = 6f; hitSize = 8f; commandLimit = 3; @@ -1665,7 +1670,7 @@ public class UnitTypes implements ContentList{ y = 1f; top = false; - bullet = new BasicBulletType(2.5f, 9){{ + bullet = new BasicBulletType(2.5f, 10){{ width = 7f; height = 9f; lifetime = 60f; @@ -1689,7 +1694,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 17f; accel = 0.1f; itemCapacity = 50; - health = 150f; + health = 170f; engineOffset = 6f; hitSize = 9f; rotateShooting = false; @@ -1706,7 +1711,7 @@ public class UnitTypes implements ContentList{ shotDelay = 4f; spacing = 0f; - bullet = new BasicBulletType(3f, 9){{ + bullet = new BasicBulletType(3f, 10){{ width = 7f; height = 9f; lifetime = 60f; @@ -1730,7 +1735,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 19f; accel = 0.11f; itemCapacity = 70; - health = 190f; + health = 220f; engineOffset = 6f; hitSize = 10f; commandLimit = 7; @@ -1745,7 +1750,7 @@ public class UnitTypes implements ContentList{ inaccuracy = 3f; shotDelay = 3f; - bullet = new BasicBulletType(3.5f, 9){{ + bullet = new BasicBulletType(3.5f, 10{{ width = 6.5f; height = 11f; lifetime = 70f; diff --git a/core/src/mindustry/entities/comp/PuddleComp.java b/core/src/mindustry/entities/comp/PuddleComp.java index d83408c734..a447bd633a 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -98,7 +98,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ boolean onLiquid = tile.floor().isLiquid; float f = Mathf.clamp(amount / (maxLiquid / 1.5f)); float smag = onLiquid ? 0.8f : 0f; - float sscl = 20f; + float sscl = 25f; Draw.color(tmp.set(liquid.color).shiftValue(-0.05f)); Fill.circle(x + Mathf.sin(Time.time() + seeds * 532, sscl, smag), y + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 8f); diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 0a703366e9..ca85eacd07 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -89,7 +89,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I case rotation -> rotation; case health -> health; case maxHealth -> maxHealth; - case ammo -> state.rules.unitAmmo ? type.ammoCapacity : ammo; + case ammo -> !state.rules.unitAmmo ? type.ammoCapacity : ammo; case ammoCapacity -> type.ammoCapacity; case x -> World.conv(x); case y -> World.conv(y); diff --git a/core/src/mindustry/type/AmmoTypes.java b/core/src/mindustry/type/AmmoTypes.java index 534bdbe703..761bcbc8d0 100644 --- a/core/src/mindustry/type/AmmoTypes.java +++ b/core/src/mindustry/type/AmmoTypes.java @@ -41,7 +41,7 @@ public class AmmoTypes implements ContentList{ @Override public void resupply(Unit unit){ float range = unit.hitSize + 60f; - Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.powerRes); + Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.battery); if(closest != null && closest.build != null && unit.within(closest.build, range) && closest.build.power != null){ var build = closest.build; diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 7d0c3fd98b..5c48f8165e 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -28,6 +28,7 @@ import mindustry.world.blocks.environment.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.units.*; import mindustry.world.consumers.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -58,6 +59,7 @@ public class UnitType extends UnlockableContent{ public Effect fallEffect = Fx.fallSmoke; public Effect fallThrusterEffect = Fx.fallSmoke; public Seq abilities = new Seq<>(); + public BlockFlag targetFlag = BlockFlag.generator; public int legCount = 4, legGroupSize = 2; public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f; diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 6763ba37e5..d14314977b 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -457,18 +457,23 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(mode == look && !sector.hasBase()){ shouldHide = false; Sector from = findLauncher(sector); - CoreBlock block = from.info.bestCoreType instanceof CoreBlock b ? b : (CoreBlock)Blocks.coreShard; + if(from == null){ + //free launch. + control.playSector(sector); + }else{ + CoreBlock block = from.info.bestCoreType instanceof CoreBlock b ? b : (CoreBlock)Blocks.coreShard; - loadouts.show(block, from, () -> { - from.removeItems(universe.getLastLoadout().requirements()); - from.removeItems(universe.getLaunchResources()); + loadouts.show(block, from, () -> { + from.removeItems(universe.getLastLoadout().requirements()); + from.removeItems(universe.getLaunchResources()); - launching = true; - zoom = 0.5f; + launching = true; + zoom = 0.5f; - ui.hudfrag.showLaunchDirect(); - Time.runTask(launchDuration, () -> control.playSector(from, sector)); - }); + ui.hudfrag.showLaunchDirect(); + Time.runTask(launchDuration, () -> control.playSector(from, sector)); + }); + } }else if(mode == select){ listener.get(sector); }else{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java new file mode 100644 index 0000000000..824492cff5 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java @@ -0,0 +1,67 @@ +package mindustry.world.blocks.defense.turrets; + +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.logic.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public abstract class BaseTurret extends Block{ + public float range = 80f; + public float rotateSpeed = 5; + + public boolean acceptCoolant = true; + /** Effect displayed when coolant is used. */ + public Effect coolEffect = Fx.fuelburn; + /** How much reload is lowered by for each unit of liquid of heat capacity. */ + public float coolantMultiplier = 5f; + + public BaseTurret(String name){ + super(name); + + update = true; + solid = true; + outlineIcon = true; + } + + @Override + public void init(){ + if(acceptCoolant && !consumes.has(ConsumeType.liquid)){ + hasLiquids = true; + consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.2f)).update(false).boost(); + } + + super.init(); + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, range, Pal.placing); + } + + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); + } + + public class BaseTurretBuild extends Building implements Ranged{ + public float rotation = 90; + + @Override + public float range(){ + return range; + } + + @Override + public void drawSelect(){ + Drawf.dashCircle(x, y, range, team.color); + } + } +} diff --git a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java similarity index 78% rename from core/src/mindustry/world/blocks/defense/PointDefenseTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java index 06746bcfaa..e4b7b68628 100644 --- a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks.defense; +package mindustry.world.blocks.defense.turrets; import arc.graphics.*; import arc.graphics.g2d.*; @@ -11,12 +11,9 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.world.*; import mindustry.world.meta.*; -import static mindustry.Vars.*; - -public class PointDefenseTurret extends Block{ +public class PointDefenseTurret extends ReloadTurret{ public final int timerTarget = timers++; public float retargetTime = 5f; @@ -27,9 +24,6 @@ public class PointDefenseTurret extends Block{ public Effect hitEffect = Fx.pointHit; public Effect shootEffect = Fx.sparkShoot; - public float range = 80f; - public float reloadTime = 30f; - public float rotateSpeed = 20; public float shootCone = 5f; public float bulletDamage = 10f; public float shootLength = 3f; @@ -37,13 +31,12 @@ public class PointDefenseTurret extends Block{ public PointDefenseTurret(String name){ super(name); - outlineIcon = true; - update = true; - } + rotateSpeed = 20f; + reloadTime = 30f; - @Override - public void drawPlace(int x, int y, int rotation, boolean valid){ - Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, range, Pal.accent); + coolantMultiplier = 2f; + //disabled due to version mismatch problems + acceptCoolant = false; } @Override @@ -55,12 +48,10 @@ public class PointDefenseTurret extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); stats.add(BlockStat.reload, 60f / reloadTime, StatUnit.none); } - public class PointDefenseBuild extends Building{ - public float rotation = 90, reload; + public class PointDefenseBuild extends ReloadTurretBuild{ public @Nullable Bullet target; @Override @@ -76,14 +67,18 @@ public class PointDefenseTurret extends Block{ target = null; } + if(acceptCoolant){ + updateCooling(); + } + //look at target if(target != null && target.within(this, range) && target.team != team && target.type() != null && target.type().hittable){ float dest = angleTo(target); rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta()); - reload -= edelta(); + reload += edelta(); //shoot when possible - if(Angles.within(rotation, dest, shootCone) && reload <= 0f){ + if(Angles.within(rotation, dest, shootCone) && reload >= reloadTime){ if(target.damage() > bulletDamage){ target.damage(target.damage() - bulletDamage); }else{ @@ -95,18 +90,13 @@ public class PointDefenseTurret extends Block{ beamEffect.at(x + Tmp.v1.x, y + Tmp.v1.y, rotation, color, new Vec2().set(target)); shootEffect.at(x + Tmp.v1.x, y + Tmp.v1.y, rotation, color); hitEffect.at(target.x, target.y, color); - reload = reloadTime; + reload = 0; } }else{ target = null; } } - @Override - public void drawSelect(){ - Drawf.dashCircle(x, y, range, Pal.accent); - } - @Override public void draw(){ Draw.rect(baseRegion, x, y); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java new file mode 100644 index 0000000000..b53c2feb03 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java @@ -0,0 +1,49 @@ +package mindustry.world.blocks.defense.turrets; + +import arc.math.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; + +import static mindustry.Vars.*; + +public abstract class ReloadTurret extends BaseTurret{ + public float reloadTime = 10f; + + public ReloadTurret(String name){ + super(name); + } + + @Override + public void setStats(){ + super.setStats(); + + if(acceptCoolant){ + stats.add(BlockStat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); + } + } + + public class ReloadTurretBuild extends BaseTurretBuild{ + public float reload; + + protected void updateCooling(){ + float maxUsed = consumes.get(ConsumeType.liquid).amount; + + Liquid liquid = liquids.current(); + + float used = Math.min(Math.min(liquids.get(liquid), maxUsed * Time.delta), Math.max(0, ((reloadTime - reload) / coolantMultiplier) / liquid.heatCapacity)) * baseReloadSpeed(); + reload += used * liquid.heatCapacity * coolantMultiplier; + liquids.remove(liquid, used); + + if(Mathf.chance(0.06 * used)){ + coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); + } + } + + protected float baseReloadSpeed(){ + return efficiency(); + } + } +} diff --git a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java similarity index 75% rename from core/src/mindustry/world/blocks/defense/TractorBeamTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java index 3808f7c360..b40c738a35 100644 --- a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks.defense; +package mindustry.world.blocks.defense.turrets; import arc.graphics.*; import arc.graphics.g2d.*; @@ -9,12 +9,13 @@ import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.world.*; +import mindustry.type.*; +import mindustry.world.consumers.*; import mindustry.world.meta.*; import static mindustry.Vars.*; -public class TractorBeamTurret extends Block{ +public class TractorBeamTurret extends BaseTurret{ public final int timerTarget = timers++; public float retargetTime = 5f; @@ -22,8 +23,6 @@ public class TractorBeamTurret extends Block{ public @Load("@-laser") TextureRegion laser; public @Load("@-laser-end") TextureRegion laserEnd; - public float range = 80f; - public float rotateSpeed = 10; public float shootCone = 6f; public float laserWidth = 0.6f; public float force = 0.3f; @@ -35,14 +34,11 @@ public class TractorBeamTurret extends Block{ public TractorBeamTurret(String name){ super(name); - update = true; - solid = true; - outlineIcon = true; - } + rotateSpeed = 10f; + coolantMultiplier = 1f; - @Override - public void drawPlace(int x, int y, int rotation, boolean valid){ - Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, range, Pal.accent); + //disabled due to version mismatch problems + acceptCoolant = false; } @Override @@ -54,17 +50,16 @@ public class TractorBeamTurret extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); stats.add(BlockStat.targetsAir, targetAir); stats.add(BlockStat.targetsGround, targetGround); stats.add(BlockStat.damage, damage * 60f, StatUnit.perSecond); } - public class TractorBeamBuild extends Building{ - public float rotation = 90; + public class TractorBeamBuild extends BaseTurretBuild{ public @Nullable Unit target; public float lastX, lastY, strength; public boolean any; + public float coolant = 1f; @Override public void updateTile(){ @@ -74,6 +69,23 @@ public class TractorBeamTurret extends Block{ target = Units.closestEnemy(team, x, y, range, u -> u.checkTarget(targetAir, targetGround)); } + //consume coolant + if(target != null && acceptCoolant){ + float maxUsed = consumes.get(ConsumeType.liquid).amount; + + Liquid liquid = liquids.current(); + + float used = Math.min(Math.min(liquids.get(liquid), maxUsed * Time.delta), Math.max(0, (1f / coolantMultiplier) / liquid.heatCapacity)); + + liquids.remove(liquid, used); + + if(Mathf.chance(0.06 * used)){ + coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); + } + + coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier); + } + //look at target if(target != null && target.within(this, range) && target.team() != team && target.type.flying && efficiency() > 0.01f){ any = true; @@ -98,8 +110,8 @@ public class TractorBeamTurret extends Block{ } @Override - public void drawSelect(){ - Drawf.dashCircle(x, y, range, Pal.accent); + public float efficiency() { + return super.efficiency() * coolant; } @Override diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 5e1212ace1..7040f83759 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -21,7 +21,6 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.logic.*; import mindustry.type.*; -import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; @@ -29,7 +28,7 @@ import mindustry.world.meta.values.*; import static mindustry.Vars.*; -public abstract class Turret extends Block{ +public abstract class Turret extends ReloadTurret{ //after being logic-controlled and this amount of time passes, the turret will resume normal AI public final static float logicControlCooldown = 60 * 2; @@ -45,8 +44,6 @@ public abstract class Turret extends Block{ public int maxAmmo = 30; public int ammoPerShot = 1; public float ammoEjectBack = 1f; - public float range = 50f; - public float reloadTime = 10f; public float inaccuracy = 0f; public float velocityInaccuracy = 0f; public int shots = 1; @@ -54,7 +51,6 @@ public abstract class Turret extends Block{ public float recoilAmount = 1f; public float restitution = 0.02f; public float cooldown = 0.02f; - public float rotateSpeed = 5f; //in degrees per tick public float shootCone = 8f; public float shootShake = 0f; public float xRand = 0f; @@ -65,10 +61,7 @@ public abstract class Turret extends Block{ public boolean targetAir = true; public boolean targetGround = true; public boolean acceptCoolant = true; - /** How much reload is lowered by for each unit of liquid of heat capacity. */ - public float coolantMultiplier = 5f; - /** Effect displayed when coolant is used. */ - public Effect coolEffect = Fx.fuelburn; + public Sortf unitSort = Unit::dst2; protected Vec2 tr = new Vec2(); @@ -108,7 +101,6 @@ public abstract class Turret extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); stats.add(BlockStat.inaccuracy, (int)inaccuracy, StatUnit.degrees); stats.add(BlockStat.reload, 60f / reloadTime * shots, StatUnit.none); stats.add(BlockStat.targetsAir, targetAir); @@ -134,32 +126,22 @@ public abstract class Turret extends Block{ return new TextureRegion[]{baseRegion, region}; } - @Override - public void drawPlace(int x, int y, int rotation, boolean valid){ - Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, range, Pal.placing); - } - public static abstract class AmmoEntry{ public int amount; public abstract BulletType type(); } - public class TurretBuild extends Building implements ControlBlock, Ranged{ + public class TurretBuild extends ReloadTurretBuild implements ControlBlock{ public Seq ammo = new Seq<>(); public int totalAmmo; - public float reload, rotation = 90, recoil, heat, logicControlTime = -1; + public float recoil, heat, logicControlTime = -1; public int shotCounter; public boolean logicShooting = false; public @Nullable Posc target; public Vec2 targetPos = new Vec2(); public BlockUnitc unit = Nulls.blockUnit; - @Override - public float range(){ - return range; - } - @Override public void created(){ unit = (BlockUnitc)UnitTypes.block.create(team); @@ -197,8 +179,8 @@ public abstract class Turret extends Block{ case ammo -> totalAmmo; case ammoCapacity -> maxAmmo; case rotation -> rotation; - case shootX -> targetPos.x; - case shootY -> targetPos.y; + case shootX -> World.conv(targetPos.x); + case shootY -> World.conv(targetPos.y); case shooting -> (isControlled() ? unit.isShooting() : logicControlled() ? logicShooting : validateTarget()) ? 1 : 0; default -> super.sense(sensor); }; @@ -301,11 +283,6 @@ public abstract class Turret extends Block{ } } - @Override - public void drawSelect(){ - Drawf.dashCircle(x, y, range, team.color); - } - @Override public void handleLiquid(Building source, Liquid liquid, float amount){ if(acceptCoolant && liquids.currentAmount() <= 0.001f){ @@ -315,20 +292,6 @@ public abstract class Turret extends Block{ super.handleLiquid(source, liquid, amount); } - protected void updateCooling(){ - float maxUsed = consumes.get(ConsumeType.liquid).amount; - - Liquid liquid = liquids.current(); - - float used = Math.min(Math.min(liquids.get(liquid), maxUsed * Time.delta), Math.max(0, ((reloadTime - reload) / coolantMultiplier) / liquid.heatCapacity)) * baseReloadSpeed(); - reload += used * liquid.heatCapacity * coolantMultiplier; - liquids.remove(liquid, used); - - if(Mathf.chance(0.06 * used)){ - coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); - } - } - protected boolean validateTarget(){ return !Units.invalidateTarget(target, team, x, y) || isControlled() || logicControlled(); } @@ -453,10 +416,6 @@ public abstract class Turret extends Block{ ammoUseEffect.at(x - Angles.trnsx(rotation, ammoEjectBack), y - Angles.trnsy(rotation, ammoEjectBack), rotation); } - protected float baseReloadSpeed(){ - return efficiency(); - } - @Override public void write(Writes write){ super.write(write); diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 87fcb11a7e..6e310d0e55 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -336,16 +336,18 @@ public class ItemBridge extends Block{ Tile other = world.tile(link); + if(items.total() >= itemCapacity) return false; + + if(linked(source)) return true; + if(linkValid(tile, other)){ int rel = relativeTo(other); int rel2 = relativeTo(Edges.getFacingEdge(source, this)); - if(rel == rel2) return false; - }else{ - return linked(source) && items.total() < itemCapacity; + return rel != rel2; } - return items.total() < itemCapacity; + return false; } @Override @@ -359,16 +361,18 @@ public class ItemBridge extends Block{ Tile other = world.tile(link); + if(!(liquids.current() == liquid || liquids.get(liquids.current()) < 0.2f)) return false; + + if(linked(source)) return true; + if(linkValid(tile, other)){ int rel = relativeTo(other.x, other.y); int rel2 = relativeTo(Edges.getFacingEdge(source, this)); - if(rel == rel2) return false; - }else if(!(linked(source))){ - return false; + return rel != rel2; } - return (liquids.current() == liquid || liquids.get(liquids.current()) < 0.2f); + return false; } protected boolean linked(Building source){ diff --git a/core/src/mindustry/world/blocks/power/Battery.java b/core/src/mindustry/world/blocks/power/Battery.java index 7c1f364b37..e78cb31b3a 100644 --- a/core/src/mindustry/world/blocks/power/Battery.java +++ b/core/src/mindustry/world/blocks/power/Battery.java @@ -20,7 +20,7 @@ public class Battery extends PowerDistributor{ super(name); outputsPower = true; consumesPower = true; - flags = EnumSet.of(BlockFlag.powerRes); + flags = EnumSet.of(BlockFlag.battery); } public class BatteryBuild extends Building{ diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index ac449d90db..2553426092 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -5,6 +5,7 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -47,6 +48,7 @@ public class NuclearReactor extends PowerGenerator{ hasItems = true; hasLiquids = true; rebuildable = false; + flags = EnumSet.of(BlockFlag.reactor); } @Override diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index 2307093f27..24053e70a7 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -18,7 +18,7 @@ public class PowerGenerator extends PowerDistributor{ super(name); sync = true; baseExplosiveness = 5f; - flags = EnumSet.of(BlockFlag.producer); + flags = EnumSet.of(BlockFlag.generator); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 434c9f4b65..4fcb3b1f1a 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.production; import arc.graphics.g2d.*; import arc.math.*; +import arc.struct.*; import arc.util.io.*; import mindustry.content.*; import mindustry.entities.*; @@ -23,9 +24,6 @@ public class GenericCrafter extends Block{ public DrawBlock drawer = new DrawBlock(); - //public Cons drawer = null; - //public Prov drawIcons = null; - public GenericCrafter(String name){ super(name); update = true; @@ -34,6 +32,7 @@ public class GenericCrafter extends Block{ idleSound = Sounds.machine; sync = true; idleSoundVolume = 0.03f; + flags = EnumSet.of(BlockFlag.factory); } @Override diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 1acf5d61c3..f93d907d47 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -47,7 +47,7 @@ public class CoreBlock extends StorageBlock{ update = true; hasItems = true; priority = TargetPriority.core; - flags = EnumSet.of(BlockFlag.core, BlockFlag.producer, BlockFlag.unitModifier); + flags = EnumSet.of(BlockFlag.core, BlockFlag.unitModifier); unitCapModifier = 10; activeSound = Sounds.respawning; activeSoundVolume = 1f; diff --git a/core/src/mindustry/world/meta/BlockFlag.java b/core/src/mindustry/world/meta/BlockFlag.java index 5c9bf2e920..a3fe674e37 100644 --- a/core/src/mindustry/world/meta/BlockFlag.java +++ b/core/src/mindustry/world/meta/BlockFlag.java @@ -4,18 +4,22 @@ package mindustry.world.meta; public enum BlockFlag{ /** Enemy core; primary target for all units. */ core, - /** Producer of important goods. */ - producer, - /** A turret. */ + /** Something that generates power. */ + generator, + /** Any turret. */ turret, + /** A block that transforms resources. */ + factory, /** Repair point. */ repair, /** Rally point. */ rally, /** Block that stored power for resupply. */ - powerRes, + battery, /** Block used for resupply. */ resupply, + /** Any reactor block. */ + reactor, /** Any block that boosts unit capacity. */ unitModifier; From 59e1fd1eb6ee6a2b0410aca8c3cae02e0035117e Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 19 Oct 2020 10:04:30 -0400 Subject: [PATCH 23/44] typo --- core/src/mindustry/content/UnitTypes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 1daff6b47d..2b3ec1df0c 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1749,7 +1749,7 @@ public class UnitTypes implements ContentList{ inaccuracy = 3f; shotDelay = 3f; - bullet = new BasicBulletType(3.5f, 10{{ + bullet = new BasicBulletType(3.5f, 10){{ width = 6.5f; height = 11f; lifetime = 70f; From 9e79ed8a26507fc3ddc206ed4d2ca47bdbf6d40c Mon Sep 17 00:00:00 2001 From: abomb4 Date: Mon, 19 Oct 2020 22:34:52 +0800 Subject: [PATCH 24/44] Json in Mod should be able to define OreBlock type That in mindustry.world.blocks.environment package --- core/src/mindustry/mod/ContentParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index c8085ae8c8..9a1118c22d 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -190,6 +190,7 @@ public class ContentParser{ "mindustry.world.blocks.defense", "mindustry.world.blocks.defense.turrets", "mindustry.world.blocks.distribution", + "mindustry.world.blocks.environment", "mindustry.world.blocks.liquid", "mindustry.world.blocks.logic", "mindustry.world.blocks.power", From 2ff749bd17ffe21425e23d40f54e2eac6b98f86b Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 19 Oct 2020 11:12:40 -0400 Subject: [PATCH 25/44] Unified stat system --- core/assets/bundles/bundle.properties | 119 ++++++------- core/assets/bundles/bundle_be.properties | 86 ++++----- core/assets/bundles/bundle_cs.properties | 88 +++++----- core/assets/bundles/bundle_da.properties | 86 ++++----- core/assets/bundles/bundle_de.properties | 86 ++++----- core/assets/bundles/bundle_es.properties | 86 ++++----- core/assets/bundles/bundle_et.properties | 86 ++++----- core/assets/bundles/bundle_eu.properties | 86 ++++----- core/assets/bundles/bundle_fi.properties | 86 ++++----- core/assets/bundles/bundle_fil.properties | 86 ++++----- core/assets/bundles/bundle_fr.properties | 86 ++++----- core/assets/bundles/bundle_fr_BE.properties | 86 ++++----- core/assets/bundles/bundle_hu.properties | 86 ++++----- core/assets/bundles/bundle_in_ID.properties | 88 +++++----- core/assets/bundles/bundle_it.properties | 86 ++++----- core/assets/bundles/bundle_ja.properties | 86 ++++----- core/assets/bundles/bundle_ko.properties | 86 ++++----- core/assets/bundles/bundle_lt.properties | 86 ++++----- core/assets/bundles/bundle_nl.properties | 86 ++++----- core/assets/bundles/bundle_nl_BE.properties | 86 ++++----- core/assets/bundles/bundle_pl.properties | 86 ++++----- core/assets/bundles/bundle_pt_BR.properties | 86 ++++----- core/assets/bundles/bundle_pt_PT.properties | 86 ++++----- core/assets/bundles/bundle_ro.properties | 88 +++++----- core/assets/bundles/bundle_ru.properties | 89 +++++----- core/assets/bundles/bundle_sv.properties | 86 ++++----- core/assets/bundles/bundle_th.properties | 86 ++++----- core/assets/bundles/bundle_tk.properties | 86 ++++----- core/assets/bundles/bundle_tr.properties | 86 ++++----- core/assets/bundles/bundle_uk_UA.properties | 88 +++++----- core/assets/bundles/bundle_zh_CN.properties | 86 ++++----- core/assets/bundles/bundle_zh_TW.properties | 86 ++++----- core/src/mindustry/core/GameState.java | 2 +- .../mindustry/ctype/UnlockableContent.java | 21 ++- .../game/{Stats.java => GameStats.java} | 2 +- core/src/mindustry/input/DesktopInput.java | 2 + core/src/mindustry/io/SaveVersion.java | 2 +- core/src/mindustry/type/Item.java | 9 +- core/src/mindustry/type/Liquid.java | 11 +- core/src/mindustry/type/Planet.java | 6 - core/src/mindustry/type/SectorPreset.java | 6 - core/src/mindustry/type/UnitType.java | 24 ++- core/src/mindustry/type/Weather.java | 6 - core/src/mindustry/ui/ContentDisplay.java | 165 ------------------ .../ui/dialogs/ContentInfoDialog.java | 59 ++++++- .../mindustry/ui/dialogs/GameOverDialog.java | 2 +- core/src/mindustry/world/Block.java | 28 ++- .../world/blocks/campaign/LaunchPad.java | 2 +- .../world/blocks/defense/ForceProjector.java | 10 +- .../world/blocks/defense/MendProjector.java | 8 +- .../blocks/defense/OverdriveProjector.java | 10 +- .../blocks/defense/turrets/BaseTurret.java | 2 +- .../blocks/defense/turrets/ItemTurret.java | 6 +- .../blocks/defense/turrets/LaserTurret.java | 8 +- .../blocks/defense/turrets/LiquidTurret.java | 4 +- .../defense/turrets/PointDefenseTurret.java | 2 +- .../blocks/defense/turrets/PowerTurret.java | 2 +- .../blocks/defense/turrets/ReloadTurret.java | 2 +- .../defense/turrets/TractorBeamTurret.java | 6 +- .../world/blocks/defense/turrets/Turret.java | 10 +- .../world/blocks/distribution/Conveyor.java | 2 +- .../blocks/distribution/StackConveyor.java | 2 +- .../world/blocks/liquid/LiquidJunction.java | 2 +- .../world/blocks/logic/LogicBlock.java | 4 +- .../world/blocks/logic/LogicDisplay.java | 2 +- .../world/blocks/logic/MemoryBlock.java | 2 +- .../world/blocks/power/ImpactReactor.java | 2 +- .../blocks/power/ItemLiquidGenerator.java | 2 +- .../world/blocks/power/NuclearReactor.java | 2 +- .../world/blocks/power/PowerGenerator.java | 2 +- .../world/blocks/power/PowerNode.java | 4 +- .../world/blocks/power/ThermalGenerator.java | 2 +- .../blocks/production/AttributeSmelter.java | 2 +- .../world/blocks/production/Cultivator.java | 2 +- .../world/blocks/production/Drill.java | 26 +-- .../world/blocks/production/Fracker.java | 2 +- .../blocks/production/GenericCrafter.java | 6 +- .../blocks/production/LiquidConverter.java | 4 +- .../world/blocks/production/Pump.java | 2 +- .../world/blocks/production/Separator.java | 4 +- .../world/blocks/production/SolidPump.java | 6 +- .../world/blocks/sandbox/PowerVoid.java | 6 +- .../world/blocks/storage/CoreBlock.java | 14 +- .../world/blocks/units/Reconstructor.java | 4 +- .../world/blocks/units/RepairPoint.java | 2 +- .../world/blocks/units/UnitFactory.java | 2 +- .../mindustry/world/consumers/Consume.java | 2 +- .../world/consumers/ConsumeItemDynamic.java | 2 +- .../world/consumers/ConsumeItemFilter.java | 4 +- .../world/consumers/ConsumeItems.java | 4 +- .../world/consumers/ConsumeLiquid.java | 4 +- .../world/consumers/ConsumeLiquidFilter.java | 4 +- .../world/consumers/ConsumePower.java | 6 +- .../mindustry/world/consumers/Consumers.java | 2 +- core/src/mindustry/world/meta/BlockStat.java | 68 -------- core/src/mindustry/world/meta/Stat.java | 82 +++++++++ .../meta/{StatCategory.java => StatCat.java} | 2 +- .../meta/{BlockStats.java => Stats.java} | 55 ++++-- .../world/meta/values/BlockFilterValue.java | 37 ++++ .../world/meta/values/BlockListValue.java | 33 ++++ .../src/mindustry/desktop/steam/SStats.java | 2 +- 101 files changed, 1815 insertions(+), 1815 deletions(-) rename core/src/mindustry/game/{Stats.java => GameStats.java} (99%) delete mode 100644 core/src/mindustry/ui/ContentDisplay.java delete mode 100644 core/src/mindustry/world/meta/BlockStat.java create mode 100644 core/src/mindustry/world/meta/Stat.java rename core/src/mindustry/world/meta/{StatCategory.java => StatCat.java} (91%) rename core/src/mindustry/world/meta/{BlockStats.java => Stats.java} (55%) create mode 100644 core/src/mindustry/world/meta/values/BlockFilterValue.java create mode 100644 core/src/mindustry/world/meta/values/BlockListValue.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 196b6e87af..6295b8e928 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -581,50 +581,62 @@ error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build lastaccessed = [lightgray]Last Accessed: {0} -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.memorycapacity = Memory Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier + bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -875,6 +887,7 @@ content.item.name = Items content.liquid.name = Liquids content.unit.name = Units content.block.name = Blocks + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -896,23 +909,6 @@ liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid -item.explosiveness = [lightgray]Explosiveness: {0}% -item.flammability = [lightgray]Flammability: {0}% -item.radioactivity = [lightgray]Radioactivity: {0}% - -unit.health = [lightgray]Health: {0} -unit.speed = [lightgray]Speed: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -1324,5 +1320,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. - +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index f62aba4377..590d8094f2 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -570,49 +570,49 @@ info.title = Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ error.title = [crimson]ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° error.crashtitle = ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° unit.nobuild = [scarlet]Unit can't build -blocks.input = Уваход -blocks.output = Выхад -blocks.booster = ПаÑкаральнік -blocks.tiles = ÐÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð»Ñ–Ñ‚ÐºÑ– -blocks.affinities = ПавелічÑнне ÑфектыўнаÑці +stat.input = Уваход +stat.output = Выхад +stat.booster = ПаÑкаральнік +stat.tiles = ÐÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð»Ñ–Ñ‚ÐºÑ– +stat.affinities = ПавелічÑнне ÑфектыўнаÑці block.unknown = [lightgray]??? -blocks.powercapacity = УмÑшчальнаÑць Ñнергіі -blocks.powershot = ЭнергіÑ/Ð’Ñ‹ÑтрÑл -blocks.damage = Страты -blocks.targetsair = ÐŸÐ°Ð²ÐµÑ‚Ñ€Ð°Ð½Ñ‹Ñ Ð¼Ñты -blocks.targetsground = ÐÐ°Ð·ÐµÐ¼Ð½Ñ‹Ñ Ð¼Ñты -blocks.itemsmoved = ХуткаÑць перамÑшчÑÐ½Ð½Ñ -blocks.launchtime = ІнтÑрвал запуÑкаў -blocks.shootrange = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ -blocks.size = Памер -blocks.displaysize = Display Size -blocks.liquidcapacity = УмÑшчальнаÑць вадкаÑці -blocks.powerrange = ДалёкаÑць перадачы Ñнергіі -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = КолькаÑць злучÑннÑÑž -blocks.poweruse = Спажывае Ñнергіі -blocks.powerdamage = ЭнергіÑ/Ñтраты -blocks.itemcapacity = УмÑшчальнаÑць прадметаў -blocks.basepowergeneration = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ñнергіі -blocks.productiontime = Ð§Ð°Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці -blocks.repairtime = Ð§Ð°Ñ Ð¿Ð¾ÑžÐ½Ð°Ð¹ Ñ€Ñгенерацыі -blocks.speedincrease = ПавелічÑнне хуткаÑці -blocks.range = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ -blocks.drilltier = Бурит -blocks.drillspeed = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць ÑÐ²Ñ–Ð´Ñ€Ð°Ð²Ð°Ð½Ð½Ñ -blocks.boosteffect = паÑкараўÑÑ Ñфект -blocks.maxunits = МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць актыўных адзінак -blocks.health = Здароўе -blocks.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Кошт будаўніцтва -blocks.inaccuracy = РоÑкід -blocks.shots = СтрÑлы -blocks.reload = СтрÑлы/Ñекунду -blocks.ammo = БоепрыпаÑÑ‹ -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = УмÑшчальнаÑць Ñнергіі +stat.powershot = ЭнергіÑ/Ð’Ñ‹ÑтрÑл +stat.damage = Страты +stat.targetsair = ÐŸÐ°Ð²ÐµÑ‚Ñ€Ð°Ð½Ñ‹Ñ Ð¼Ñты +stat.targetsground = ÐÐ°Ð·ÐµÐ¼Ð½Ñ‹Ñ Ð¼Ñты +stat.itemsmoved = ХуткаÑць перамÑшчÑÐ½Ð½Ñ +stat.launchtime = ІнтÑрвал запуÑкаў +stat.shootrange = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ +stat.size = Памер +stat.displaysize = Display Size +stat.liquidcapacity = УмÑшчальнаÑць вадкаÑці +stat.powerrange = ДалёкаÑць перадачы Ñнергіі +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = КолькаÑць злучÑннÑÑž +stat.poweruse = Спажывае Ñнергіі +stat.powerdamage = ЭнергіÑ/Ñтраты +stat.itemcapacity = УмÑшчальнаÑць прадметаў +stat.basepowergeneration = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ñнергіі +stat.productiontime = Ð§Ð°Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці +stat.repairtime = Ð§Ð°Ñ Ð¿Ð¾ÑžÐ½Ð°Ð¹ Ñ€Ñгенерацыі +stat.speedincrease = ПавелічÑнне хуткаÑці +stat.range = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ +stat.drilltier = Бурит +stat.drillspeed = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць ÑÐ²Ñ–Ð´Ñ€Ð°Ð²Ð°Ð½Ð½Ñ +stat.boosteffect = паÑкараўÑÑ Ñфект +stat.maxunits = МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць актыўных адзінак +stat.health = Здароўе +stat.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° +stat.maxconsecutive = Max Consecutive +stat.buildcost = Кошт будаўніцтва +stat.inaccuracy = РоÑкід +stat.shots = СтрÑлы +stat.reload = СтрÑлы/Ñекунду +stat.ammo = БоепрыпаÑÑ‹ +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Патрабуецца Ñвідар лепей bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Ð’ÑÐ»Ñ–ÐºÐ°Ñ Ñ‚ÑƒÑ€Ñль, ÑÐºÐ°Ñ Ð¼Ð¾Ð¶Ð° ве block.spectre.description = МаÑÑ–ÑžÐ½Ð°Ñ Ð´Ð²ÑƒÑтвольное гармата. СтралÑе буйнымі бранÑбойнымі кулÑмі па паветраных Ñ– наземных мÑтах. block.meltdown.description = МаÑÑ–ÑžÐ½Ð°Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ð°Ñ Ð³Ð°Ñ€Ð¼Ð°Ñ‚Ð°. Зараджае Ñ– ÑтралÑе паÑтаÑнным лазерным прамÑнём Ñž бліжÑйшых ворагаў. Патрабуецца аÑÑ‚ÑƒÐ´Ð¶Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð´ÐºÐ°Ñць Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹. block.repair-point.description = БеÑперапынна лечыць бліжÑйшую пашкоджаную баÑвую адзінку або мех у Ñваім радыуÑе. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 8bcd567380..f9f98951dc 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -572,50 +572,50 @@ info.title = Informace error.title = [scarlet]Objevila se chyba[] error.crashtitle = Objevila se chyba unit.nobuild = [scarlet]Jednotka nemůže stavÄ›t -blocks.input = Vstup -blocks.output = Výstup -blocks.booster = PosilovaÄ -blocks.tiles = Vyžadované dlaždice -blocks.affinities = Synergie +stat.input = Vstup +stat.output = Výstup +stat.booster = PosilovaÄ +stat.tiles = Vyžadované dlaždice +stat.affinities = Synergie block.unknown = [lightgray]???[] -blocks.powercapacity = Kapacita energie -blocks.powershot = Energie na 1 výstÅ™el -blocks.damage = PoÅ¡kození -blocks.targetsair = Zaměřuje vzduÅ¡né jednotky -blocks.targetsground = Zaměřuje pozemní jednotky -blocks.itemsmoved = Rychlost pohybu -blocks.launchtime = ÄŒas mezi vysláním -blocks.shootrange = DostÅ™el -blocks.size = Velikost -blocks.displaysize = Velikost zobrazovaÄe -blocks.liquidcapacity = Kapacita kapalin -blocks.powerrange = Rozsah energie -blocks.linkrange = Dosah napojení -blocks.instructions = Instrukce -blocks.powerconnections = Nejvyšší poÄet spojení -blocks.poweruse = SpotÅ™eba energie -blocks.powerdamage = Energie na jednotku poÅ¡kození -blocks.itemcapacity = Kapacita pÅ™edmÄ›tů -blocks.memorycapacity = Kapacita pamÄ›ti -blocks.basepowergeneration = Základní generování energie -blocks.productiontime = ÄŒas produkce -blocks.repairtime = ÄŒas do úplné opravy -blocks.speedincrease = Zvýšení rychlosti -blocks.range = Dosah -blocks.drilltier = Lze těžit -blocks.drillspeed = Základní rychlost vrtu -blocks.boosteffect = ÚÄinek posílení -blocks.maxunits = Nejvýše aktivních jednotek -blocks.health = Životy -blocks.buildtime = ÄŒas stavby -blocks.maxconsecutive = Nejvýše po sobÄ› -blocks.buildcost = Cena stavby -blocks.inaccuracy = NepÅ™esnost -blocks.shots = StÅ™ely -blocks.reload = StÅ™el za 1s -blocks.ammo = StÅ™elivo -blocks.shieldhealth = Zdraví Å¡títu -blocks.cooldowntime = ÄŒas na zchladnutí +stat.powercapacity = Kapacita energie +stat.powershot = Energie na 1 výstÅ™el +stat.damage = PoÅ¡kození +stat.targetsair = Zaměřuje vzduÅ¡né jednotky +stat.targetsground = Zaměřuje pozemní jednotky +stat.itemsmoved = Rychlost pohybu +stat.launchtime = ÄŒas mezi vysláním +stat.shootrange = DostÅ™el +stat.size = Velikost +stat.displaysize = Velikost zobrazovaÄe +stat.liquidcapacity = Kapacita kapalin +stat.powerrange = Rozsah energie +stat.linkrange = Dosah napojení +stat.instructions = Instrukce +stat.powerconnections = Nejvyšší poÄet spojení +stat.poweruse = SpotÅ™eba energie +stat.powerdamage = Energie na jednotku poÅ¡kození +stat.itemcapacity = Kapacita pÅ™edmÄ›tů +stat.memorycapacity = Kapacita pamÄ›ti +stat.basepowergeneration = Základní generování energie +stat.productiontime = ÄŒas produkce +stat.repairtime = ÄŒas do úplné opravy +stat.speedincrease = Zvýšení rychlosti +stat.range = Dosah +stat.drilltier = Lze těžit +stat.drillspeed = Základní rychlost vrtu +stat.boosteffect = ÚÄinek posílení +stat.maxunits = Nejvýše aktivních jednotek +stat.health = Životy +stat.buildtime = ÄŒas stavby +stat.maxconsecutive = Nejvýše po sobÄ› +stat.buildcost = Cena stavby +stat.inaccuracy = NepÅ™esnost +stat.shots = StÅ™ely +stat.reload = StÅ™el za 1s +stat.ammo = StÅ™elivo +stat.shieldhealth = Zdraví Å¡títu +stat.cooldowntime = ÄŒas na zchladnutí bar.drilltierreq = Je vyžadován lepší vrt bar.noresources = ChybÄ›jí zdroje @@ -1312,4 +1312,4 @@ block.cyclone.description = Velká protiletecká a protipozemní střílna. Pál block.spectre.description = Velká střílna s kanónem s dvÄ›ma hlavnÄ›mi. Střílí velké náboje, které pronikají brnÄ›ním jak pozemních, tak vzduÅ¡ných nepřátelských cílů. block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepÅ™etržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení. block.repair-point.description = NepÅ™etržitÄ› léÄí nejbližší poÅ¡kozenou jednotku v poli své působnosti. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 0e9d2ce889..b65afebcd3 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 67311e3451..5d02ed2f85 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! unit.nobuild = [scarlet]Einheit kann nicht bauen! -blocks.input = Eingang -blocks.output = Ausgang -blocks.booster = Verstärkung -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Eingang +stat.output = Ausgang +stat.booster = Verstärkung +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Kapazität -blocks.powershot = Stromverbrauch/Schuss -blocks.damage = Schaden -blocks.targetsair = Visiert Lufteinheiten an -blocks.targetsground = Visiert Bodeneinheiten an -blocks.itemsmoved = Bewegungsgeschwindigkeit -blocks.launchtime = Zeit zwischen Starts -blocks.shootrange = Reichweite -blocks.size = Größe -blocks.displaysize = Display Size -blocks.liquidcapacity = Flüssigkeitskapazität -blocks.powerrange = Stromreichweite -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maximale Stromverbindungen -blocks.poweruse = Stromverbrauch -blocks.powerdamage = Stromverbrauch/Schadenspunkt -blocks.itemcapacity = Materialkapazität -blocks.basepowergeneration = Basis-Stromerzeugung -blocks.productiontime = Produktionszeit -blocks.repairtime = Zeit zur vollständigen Reparatur -blocks.speedincrease = Geschwindigkeitserhöhung -blocks.range = Reichweite -blocks.drilltier = Abbaubare Erze -blocks.drillspeed = Bohrgeschwindigkeit -blocks.boosteffect = Verstärkungseffekt -blocks.maxunits = Max. aktive Einheiten -blocks.health = Lebenspunkte -blocks.buildtime = Baudauer -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Baukosten -blocks.inaccuracy = Ungenauigkeit -blocks.shots = Schüsse -blocks.reload = Schüsse/Sekunde -blocks.ammo = Munition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Kapazität +stat.powershot = Stromverbrauch/Schuss +stat.damage = Schaden +stat.targetsair = Visiert Lufteinheiten an +stat.targetsground = Visiert Bodeneinheiten an +stat.itemsmoved = Bewegungsgeschwindigkeit +stat.launchtime = Zeit zwischen Starts +stat.shootrange = Reichweite +stat.size = Größe +stat.displaysize = Display Size +stat.liquidcapacity = Flüssigkeitskapazität +stat.powerrange = Stromreichweite +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maximale Stromverbindungen +stat.poweruse = Stromverbrauch +stat.powerdamage = Stromverbrauch/Schadenspunkt +stat.itemcapacity = Materialkapazität +stat.basepowergeneration = Basis-Stromerzeugung +stat.productiontime = Produktionszeit +stat.repairtime = Zeit zur vollständigen Reparatur +stat.speedincrease = Geschwindigkeitserhöhung +stat.range = Reichweite +stat.drilltier = Abbaubare Erze +stat.drillspeed = Bohrgeschwindigkeit +stat.boosteffect = Verstärkungseffekt +stat.maxunits = Max. aktive Einheiten +stat.health = Lebenspunkte +stat.buildtime = Baudauer +stat.maxconsecutive = Max Consecutive +stat.buildcost = Baukosten +stat.inaccuracy = Ungenauigkeit +stat.shots = Schüsse +stat.reload = Schüsse/Sekunde +stat.ammo = Munition +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Besserer Bohrer Benötigt bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Ein großer Schnellfeuer-Geschützturm. block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert. block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 5c87f27455..6c24039d7e 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -570,49 +570,49 @@ info.title = [accent]Información error.title = [crimson]Un error ha ocurrido. error.crashtitle = Un error ha ocurrido. unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Salida -blocks.booster = Potenciador -blocks.tiles = Tiles requeridos -blocks.affinities = Afinidades +stat.input = Entrada +stat.output = Salida +stat.booster = Potenciador +stat.tiles = Tiles requeridos +stat.affinities = Afinidades block.unknown = [lightgray]??? -blocks.powercapacity = Capacidad de Energía -blocks.powershot = Energía/Disparo -blocks.damage = Daño -blocks.targetsair = Apunta al Aire -blocks.targetsground = Apunta a Tierra -blocks.itemsmoved = Velocidad de movimiento -blocks.launchtime = Tiempo entre lanzamientos -blocks.shootrange = Rango de Disparo -blocks.size = Tamaño -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidad de Líquidos -blocks.powerrange = Rango de Energía -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Conexiones maximas -blocks.poweruse = Consumo de Energía -blocks.powerdamage = Energía/Daño -blocks.itemcapacity = Capacidad de Objetos -blocks.basepowergeneration = Generación de energía base -blocks.productiontime = Tiempo de producción -blocks.repairtime = Tiempo para Reparar Bloque Completamente -blocks.speedincrease = Aumento de Velocidad -blocks.range = Rango -blocks.drilltier = Taladrables -blocks.drillspeed = Velocidad Base del Taladro -blocks.boosteffect = Efecto del Potenciador -blocks.maxunits = Máximo de Unidades Activas -blocks.health = Vida -blocks.buildtime = Tiempo de construcción -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coste de construcción -blocks.inaccuracy = Imprecisión -blocks.shots = Disparos -blocks.reload = Recarga -blocks.ammo = Munición -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacidad de Energía +stat.powershot = Energía/Disparo +stat.damage = Daño +stat.targetsair = Apunta al Aire +stat.targetsground = Apunta a Tierra +stat.itemsmoved = Velocidad de movimiento +stat.launchtime = Tiempo entre lanzamientos +stat.shootrange = Rango de Disparo +stat.size = Tamaño +stat.displaysize = Display Size +stat.liquidcapacity = Capacidad de Líquidos +stat.powerrange = Rango de Energía +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Conexiones maximas +stat.poweruse = Consumo de Energía +stat.powerdamage = Energía/Daño +stat.itemcapacity = Capacidad de Objetos +stat.basepowergeneration = Generación de energía base +stat.productiontime = Tiempo de producción +stat.repairtime = Tiempo para Reparar Bloque Completamente +stat.speedincrease = Aumento de Velocidad +stat.range = Rango +stat.drilltier = Taladrables +stat.drillspeed = Velocidad Base del Taladro +stat.boosteffect = Efecto del Potenciador +stat.maxunits = Máximo de Unidades Activas +stat.health = Vida +stat.buildtime = Tiempo de construcción +stat.maxconsecutive = Max Consecutive +stat.buildcost = Coste de construcción +stat.inaccuracy = Imprecisión +stat.shots = Disparos +stat.reload = Recarga +stat.ammo = Munición +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Se requiere un mejor taladro. bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Una torre grande anti-aérea y anti-terrestre. Dispa block.spectre.description = Un cañon masivo de dos barriles. Dispara balas perforantes a objetivos de aire y tierra. block.meltdown.description = Un cañon láser masivo. Carga y dispara un rayo láser constante a enemigos cercanos. Requiere enfriamiento para operar. block.repair-point.description = Repara la unidad dañada más cercana a su alrededor. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index d5ac8cfb74..62b0002df6 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]Viga error.crashtitle = Viga unit.nobuild = [scarlet]Unit can't build -blocks.input = Sisend -blocks.output = Väljund -blocks.booster = Kiirendaja -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Sisend +stat.output = Väljund +stat.booster = Kiirendaja +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Energiamahtuvus -blocks.powershot = Energia ühikut/lasu kohta -blocks.damage = Hävituspunkte -blocks.targetsair = Sihib õhku -blocks.targetsground = Sihib maapinnale -blocks.itemsmoved = Transportimise kiirus -blocks.launchtime = Aeg lendutõusude vahel -blocks.shootrange = Ulatus -blocks.size = Suurus -blocks.displaysize = Display Size -blocks.liquidcapacity = Vedelike mahutavus -blocks.powerrange = Energia ulatus -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Energiatarve -blocks.powerdamage = Energiatarve hävituspunkti kohta -blocks.itemcapacity = Ressursside mahutavus -blocks.basepowergeneration = Energiatootlus -blocks.productiontime = Tootmisaeg -blocks.repairtime = Täieliku parandamise aeg -blocks.speedincrease = Kiiruse suurenemine -blocks.range = Ulatus -blocks.drilltier = Kaevandatav -blocks.drillspeed = Puurimise kiirus -blocks.boosteffect = Kiirendaja mõju -blocks.maxunits = Maks. aktiivseid väeüksuseid -blocks.health = Elud -blocks.buildtime = Ehitamise aeg -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Ehitamise maksumus -blocks.inaccuracy = Ebatäpsus -blocks.shots = Laske -blocks.reload = Lasku/s -blocks.ammo = Laskemoon -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Energiamahtuvus +stat.powershot = Energia ühikut/lasu kohta +stat.damage = Hävituspunkte +stat.targetsair = Sihib õhku +stat.targetsground = Sihib maapinnale +stat.itemsmoved = Transportimise kiirus +stat.launchtime = Aeg lendutõusude vahel +stat.shootrange = Ulatus +stat.size = Suurus +stat.displaysize = Display Size +stat.liquidcapacity = Vedelike mahutavus +stat.powerrange = Energia ulatus +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Energiatarve +stat.powerdamage = Energiatarve hävituspunkti kohta +stat.itemcapacity = Ressursside mahutavus +stat.basepowergeneration = Energiatootlus +stat.productiontime = Tootmisaeg +stat.repairtime = Täieliku parandamise aeg +stat.speedincrease = Kiiruse suurenemine +stat.range = Ulatus +stat.drilltier = Kaevandatav +stat.drillspeed = Puurimise kiirus +stat.boosteffect = Kiirendaja mõju +stat.maxunits = Maks. aktiivseid väeüksuseid +stat.health = Elud +stat.buildtime = Ehitamise aeg +stat.maxconsecutive = Max Consecutive +stat.buildcost = Ehitamise maksumus +stat.inaccuracy = Ebatäpsus +stat.shots = Laske +stat.reload = Lasku/s +stat.ammo = Laskemoon +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Nõuab paremat puuri bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Suur lendavate ja maapealsete väeüksuste vastane k block.spectre.description = Massiivne kaheraudne kahur, mis tulistab soomuskatteid läbistavaid mürske nii lendavate kui ka maapealsete väeüksuste pihta. block.meltdown.description = Massiivne laserkahur, mis tekitab püsiva energiakiire. Vajab töötamiseks jahutusvedelikku. block.repair-point.description = Parandab kõige lähemal asuvat liitlaste väeüksust. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 5ef1a41b71..7afde97031 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -570,49 +570,49 @@ info.title = Informazioa error.title = [crimson]Errore bat gertatu da error.crashtitle = Errore bat gertatu da unit.nobuild = [scarlet]Unit can't build -blocks.input = Sarrera -blocks.output = Irteera -blocks.booster = Indargarria -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Sarrera +stat.output = Irteera +stat.booster = Indargarria +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Energia-edukiera -blocks.powershot = Energia/tiroko -blocks.damage = Kaltea -blocks.targetsair = Airera tirokatzen du -blocks.targetsground = Lurrera tirokatzen du -blocks.itemsmoved = Garraio-abiadura -blocks.launchtime = Egozketen arteko denbora -blocks.shootrange = Irismena -blocks.size = Neurria -blocks.displaysize = Display Size -blocks.liquidcapacity = Likido-edukiera -blocks.powerrange = Energia irismena -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Gehieneko konexioak -blocks.poweruse = Energia-erabilera -blocks.powerdamage = Energia/Kaltea -blocks.itemcapacity = Elementu-edukiera -blocks.basepowergeneration = Oinarrizko energia sorrera -blocks.productiontime = Eraikitze denbora -blocks.repairtime = Blokearen konpontze denbora osoa -blocks.speedincrease = Abiadura areagotzea -blocks.range = Irismena -blocks.drilltier = Ustiagarriak -blocks.drillspeed = Oinarrizko ustiatze-abiadura -blocks.boosteffect = Indartze-efektua -blocks.maxunits = Gehieneko unitate aktiboak -blocks.health = Osasuna -blocks.buildtime = Eraikitze-denbora -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Eraikitze-kostua -blocks.inaccuracy = Zehazgabetasuna -blocks.shots = Tiroak -blocks.reload = Tiroak/segundoko -blocks.ammo = Munizioa -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Energia-edukiera +stat.powershot = Energia/tiroko +stat.damage = Kaltea +stat.targetsair = Airera tirokatzen du +stat.targetsground = Lurrera tirokatzen du +stat.itemsmoved = Garraio-abiadura +stat.launchtime = Egozketen arteko denbora +stat.shootrange = Irismena +stat.size = Neurria +stat.displaysize = Display Size +stat.liquidcapacity = Likido-edukiera +stat.powerrange = Energia irismena +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Gehieneko konexioak +stat.poweruse = Energia-erabilera +stat.powerdamage = Energia/Kaltea +stat.itemcapacity = Elementu-edukiera +stat.basepowergeneration = Oinarrizko energia sorrera +stat.productiontime = Eraikitze denbora +stat.repairtime = Blokearen konpontze denbora osoa +stat.speedincrease = Abiadura areagotzea +stat.range = Irismena +stat.drilltier = Ustiagarriak +stat.drillspeed = Oinarrizko ustiatze-abiadura +stat.boosteffect = Indartze-efektua +stat.maxunits = Gehieneko unitate aktiboak +stat.health = Osasuna +stat.buildtime = Eraikitze-denbora +stat.maxconsecutive = Max Consecutive +stat.buildcost = Eraikitze-kostua +stat.inaccuracy = Zehazgabetasuna +stat.shots = Tiroak +stat.reload = Tiroak/segundoko +stat.ammo = Munizioa +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Zulagailu hobea behar da bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Aire zein lurreko defentsarako dorre handia. Torpedo block.spectre.description = Kanoi bikoitz erraldoia. Blindajea zulatu dezaketen bala handiak tirokatzen ditu aireko zein lurreko xedeei. block.meltdown.description = Laser kanoi erraldoia. Etengabeko laser izpi bat kargatu eta jauritzen die inguruko etsaiei. Hozgarria behar du jarduteko. block.repair-point.description = Etengabe konpontzen du inguruko kaltetutako unitate hurbilena. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index ae351b8764..30a231333c 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -570,49 +570,49 @@ info.title = Informaatio error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Sisääntulo -blocks.output = Ulostulo -blocks.booster = Tehostaja -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Sisääntulo +stat.output = Ulostulo +stat.booster = Tehostaja +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Energiakapasiteetti -blocks.powershot = Energiaa/Ammus -blocks.damage = Vahinko -blocks.targetsair = Hyökkää ilmaan -blocks.targetsground = Hyökkää maahan -blocks.itemsmoved = Liikkumisnopeus -blocks.launchtime = Aika laukaisujen välillä -blocks.shootrange = Kantama -blocks.size = Koko -blocks.displaysize = Display Size -blocks.liquidcapacity = Nestekapasiteetti -blocks.powerrange = Energiakantama -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maksimimäärä yhdistyksiä -blocks.poweruse = Energian käyttö -blocks.powerdamage = Energia/Vahinko -blocks.itemcapacity = Tavarakapasiteetti -blocks.basepowergeneration = Perus energiantuotto -blocks.productiontime = Tuotantoaika -blocks.repairtime = Kokonaisen palikan korjausaika -blocks.speedincrease = Nopeuden kasvu -blocks.range = Etäisyys -blocks.drilltier = Porattavat -blocks.drillspeed = Kanta Poran Nopeus -blocks.boosteffect = Tehostamisem vaikutus -blocks.maxunits = Maksimimäärä yksikköjä -blocks.health = Elämäpisteet -blocks.buildtime = Rakentamisaika -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Rakentamishinta -blocks.inaccuracy = Epätarkkuus -blocks.shots = Ammusta -blocks.reload = Ammusta/sekunnissa -blocks.ammo = Ammus -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Energiakapasiteetti +stat.powershot = Energiaa/Ammus +stat.damage = Vahinko +stat.targetsair = Hyökkää ilmaan +stat.targetsground = Hyökkää maahan +stat.itemsmoved = Liikkumisnopeus +stat.launchtime = Aika laukaisujen välillä +stat.shootrange = Kantama +stat.size = Koko +stat.displaysize = Display Size +stat.liquidcapacity = Nestekapasiteetti +stat.powerrange = Energiakantama +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maksimimäärä yhdistyksiä +stat.poweruse = Energian käyttö +stat.powerdamage = Energia/Vahinko +stat.itemcapacity = Tavarakapasiteetti +stat.basepowergeneration = Perus energiantuotto +stat.productiontime = Tuotantoaika +stat.repairtime = Kokonaisen palikan korjausaika +stat.speedincrease = Nopeuden kasvu +stat.range = Etäisyys +stat.drilltier = Porattavat +stat.drillspeed = Kanta Poran Nopeus +stat.boosteffect = Tehostamisem vaikutus +stat.maxunits = Maksimimäärä yksikköjä +stat.health = Elämäpisteet +stat.buildtime = Rakentamisaika +stat.maxconsecutive = Max Consecutive +stat.buildcost = Rakentamishinta +stat.inaccuracy = Epätarkkuus +stat.shots = Ammusta +stat.reload = Ammusta/sekunnissa +stat.ammo = Ammus +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Parempi pora vaadittu bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 86c3c0737a..0fa6608526 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index e7749d7347..925465c595 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite unit.nobuild = [scarlet]Cette unité ne peut construire -blocks.input = Entrée -blocks.output = Sortie -blocks.booster = Booster -blocks.tiles = Pré-requis -blocks.affinities = Affinités +stat.input = Entrée +stat.output = Sortie +stat.booster = Booster +stat.tiles = Pré-requis +stat.affinities = Affinités block.unknown = [lightgray]??? -blocks.powercapacity = Capacité d'énergie -blocks.powershot = Énergie/Tir -blocks.damage = Dégâts -blocks.targetsair = Cibles Aériennes -blocks.targetsground = Cibles Terrestres -blocks.itemsmoved = Vitesse de Déplacement -blocks.launchtime = Temps entre chaque lancement -blocks.shootrange = Portée de tir -blocks.size = Taille -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacité liquide -blocks.powerrange = Portée électrique -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Nombre maximal de connections -blocks.poweruse = Énergie utilisée -blocks.powerdamage = Dégâts d'énergie -blocks.itemcapacity = Stockage -blocks.basepowergeneration = Production d'énergie -blocks.productiontime = Durée de production -blocks.repairtime = Durée de réparation complète du Bloc -blocks.speedincrease = Accélération -blocks.range = Portée -blocks.drilltier = Forable -blocks.drillspeed = Vitesse de forage de base -blocks.boosteffect = Effet du Boost -blocks.maxunits = Unités actives max -blocks.health = Santé -blocks.buildtime = Durée de construction -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coût de construction -blocks.inaccuracy = Imprécision -blocks.shots = Tirs -blocks.reload = Tirs/Seconde -blocks.ammo = Munitions -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacité d'énergie +stat.powershot = Énergie/Tir +stat.damage = Dégâts +stat.targetsair = Cibles Aériennes +stat.targetsground = Cibles Terrestres +stat.itemsmoved = Vitesse de Déplacement +stat.launchtime = Temps entre chaque lancement +stat.shootrange = Portée de tir +stat.size = Taille +stat.displaysize = Display Size +stat.liquidcapacity = Capacité liquide +stat.powerrange = Portée électrique +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Nombre maximal de connections +stat.poweruse = Énergie utilisée +stat.powerdamage = Dégâts d'énergie +stat.itemcapacity = Stockage +stat.basepowergeneration = Production d'énergie +stat.productiontime = Durée de production +stat.repairtime = Durée de réparation complète du Bloc +stat.speedincrease = Accélération +stat.range = Portée +stat.drilltier = Forable +stat.drillspeed = Vitesse de forage de base +stat.boosteffect = Effet du Boost +stat.maxunits = Unités actives max +stat.health = Santé +stat.buildtime = Durée de construction +stat.maxconsecutive = Max Consecutive +stat.buildcost = Coût de construction +stat.inaccuracy = Imprécision +stat.shots = Tirs +stat.reload = Tirs/Seconde +stat.ammo = Munitions +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Meilleure Foreuse Requise bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Une grande tourelle qui tire rapidement des débris block.spectre.description = Une tourelle massive à double cannon et qui tire de puissantes balles perce-blindages simultanément. block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement. block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.segment.description = Endommage et détruit les tirs ennemis. Cependant, les lasers ne peuvent pas être ciblés. +block.segment.description = Endommage et détruit les tirs ennemis. Cependant, les lasers ne peuvent pas être ciblés. \ No newline at end of file diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 02fe5e58b1..869da14c46 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite unit.nobuild = [scarlet]Unit can't build -blocks.input = Ressource(s) requise(s) -blocks.output = Ressource(s) produite(s) -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Ressource(s) requise(s) +stat.output = Ressource(s) produite(s) +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]Inconnu -blocks.powercapacity = Capacité d'énergie -blocks.powershot = Énergie/Tir -blocks.damage = Damage -blocks.targetsair = Cible les unités aériennes -blocks.targetsground = Cible les unités terrestres -blocks.itemsmoved = Vitesse de déplacement -blocks.launchtime = Temps entre chaque lancement -blocks.shootrange = Portée -blocks.size = Taille -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacité en liquide -blocks.powerrange = Distance de transmission -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Énergie utilisée -blocks.powerdamage = Énergie/Dégâts -blocks.itemcapacity = Stockage -blocks.basepowergeneration = Production d'énergie de base -blocks.productiontime = Temps de production -blocks.repairtime = Temps pour la réparation totale du bloc -blocks.speedincrease = Augmentation de la vitesse -blocks.range = Portée -blocks.drilltier = Forable -blocks.drillspeed = Vitesse de forage de base -blocks.boosteffect = Effet boostant -blocks.maxunits = Maximum d'unitée active -blocks.health = Santé -blocks.buildtime = Temps de construction -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coût de construction -blocks.inaccuracy = Précision -blocks.shots = Tirs -blocks.reload = Tirs/Seconde -blocks.ammo = Munition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacité d'énergie +stat.powershot = Énergie/Tir +stat.damage = Damage +stat.targetsair = Cible les unités aériennes +stat.targetsground = Cible les unités terrestres +stat.itemsmoved = Vitesse de déplacement +stat.launchtime = Temps entre chaque lancement +stat.shootrange = Portée +stat.size = Taille +stat.displaysize = Display Size +stat.liquidcapacity = Capacité en liquide +stat.powerrange = Distance de transmission +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Énergie utilisée +stat.powerdamage = Énergie/Dégâts +stat.itemcapacity = Stockage +stat.basepowergeneration = Production d'énergie de base +stat.productiontime = Temps de production +stat.repairtime = Temps pour la réparation totale du bloc +stat.speedincrease = Augmentation de la vitesse +stat.range = Portée +stat.drilltier = Forable +stat.drillspeed = Vitesse de forage de base +stat.boosteffect = Effet boostant +stat.maxunits = Maximum d'unitée active +stat.health = Santé +stat.buildtime = Temps de construction +stat.maxconsecutive = Max Consecutive +stat.buildcost = Coût de construction +stat.inaccuracy = Précision +stat.shots = Tirs +stat.reload = Tirs/Seconde +stat.ammo = Munition +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Une grande tourelle à tir rapide. block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois. block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée. block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index b28d471cdd..c24c9a24ee 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index d601b9e904..e9f6f933eb 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -572,50 +572,50 @@ info.title = Info error.title = [crimson]Sebuah kesalahan telah terjadi error.crashtitle = Sebuah kesalahan telah terjadi unit.nobuild = [scarlet]Unit tidak dapat membangun -blocks.input = Masukan -blocks.output = Pengeluaran -blocks.booster = Pendorong -blocks.tiles = Kotak yang dibutuhkan -blocks.affinities = Afinitas +stat.input = Masukan +stat.output = Pengeluaran +stat.booster = Pendorong +stat.tiles = Kotak yang dibutuhkan +stat.affinities = Afinitas block.unknown = [lightgray]??? -blocks.powercapacity = Kapasitas Tenaga -blocks.powershot = Tenaga/Tembakan -blocks.damage = Kerusakan -blocks.targetsair = Menargetkan Udara -blocks.targetsground = Menargetkan Darat -blocks.itemsmoved = Kecepatan Gerak -blocks.launchtime = Waktu Diantara Peluncuran -blocks.shootrange = Jarak -blocks.size = Ukuran -blocks.displaysize = Ukuran Tampilan -blocks.liquidcapacity = Kapasitas Zat Cair -blocks.powerrange = Jarak Tenaga -blocks.linkrange = Jarak Tautan -blocks.instructions = Instruksi -blocks.powerconnections = Koneksi Maksimal -blocks.poweruse = Penggunaan Tenaga -blocks.powerdamage = Tenaga/Pukulan -blocks.itemcapacity = Kapasitas Item -blocks.memorycapacity = Kapasitas Memori -blocks.basepowergeneration = Basis Generasi Tenaga -blocks.productiontime = Waktu Produksi -blocks.repairtime = Waktu Memperbaiki Blok Penuh -blocks.speedincrease = Tambahan Kecepatan -blocks.range = Jarak -blocks.drilltier = Sumber Daya yang Bisa di Bor -blocks.drillspeed = Basis Kecepatan Bor -blocks.boosteffect = Efek Pendorong -blocks.maxunits = Maks Unit Aktif -blocks.health = Darah -blocks.buildtime = Waktu Pembuatan -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Biaya Bangunan -blocks.inaccuracy = Jarak Melenceng -blocks.shots = Tembakan -blocks.reload = Tembakan/Detik -blocks.ammo = Amunisi -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Kapasitas Tenaga +stat.powershot = Tenaga/Tembakan +stat.damage = Kerusakan +stat.targetsair = Menargetkan Udara +stat.targetsground = Menargetkan Darat +stat.itemsmoved = Kecepatan Gerak +stat.launchtime = Waktu Diantara Peluncuran +stat.shootrange = Jarak +stat.size = Ukuran +stat.displaysize = Ukuran Tampilan +stat.liquidcapacity = Kapasitas Zat Cair +stat.powerrange = Jarak Tenaga +stat.linkrange = Jarak Tautan +stat.instructions = Instruksi +stat.powerconnections = Koneksi Maksimal +stat.poweruse = Penggunaan Tenaga +stat.powerdamage = Tenaga/Pukulan +stat.itemcapacity = Kapasitas Item +stat.memorycapacity = Kapasitas Memori +stat.basepowergeneration = Basis Generasi Tenaga +stat.productiontime = Waktu Produksi +stat.repairtime = Waktu Memperbaiki Blok Penuh +stat.speedincrease = Tambahan Kecepatan +stat.range = Jarak +stat.drilltier = Sumber Daya yang Bisa di Bor +stat.drillspeed = Basis Kecepatan Bor +stat.boosteffect = Efek Pendorong +stat.maxunits = Maks Unit Aktif +stat.health = Darah +stat.buildtime = Waktu Pembuatan +stat.maxconsecutive = Max Consecutive +stat.buildcost = Biaya Bangunan +stat.inaccuracy = Jarak Melenceng +stat.shots = Tembakan +stat.reload = Tembakan/Detik +stat.ammo = Amunisi +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Membutuhkan Bor yang Lebih Baik bar.noresources = Sumber Daya Tidak Ditemukan @@ -1310,4 +1310,4 @@ block.cyclone.description = Menara penembak beruntun besar. block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus. block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat. block.repair-point.description = Terus menerus memulihkan unit terluka disekitar. -block.segment.description = Merusakkan dan menghancurkan proyektil yang datang. Proyektil laser tidak akan ditargetkan. +block.segment.description = Merusakkan dan menghancurkan proyektil yang datang. Proyektil laser tidak akan ditargetkan. \ No newline at end of file diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index c10f894851..5fc3245ed6 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore unit.nobuild = [scarlet]L'unità non può costruire -blocks.input = Ingresso -blocks.output = Uscita -blocks.booster = Potenziamenti -blocks.tiles = Blocchi Richiesti -blocks.affinities = Affinità +stat.input = Ingresso +stat.output = Uscita +stat.booster = Potenziamenti +stat.tiles = Blocchi Richiesti +stat.affinities = Affinità block.unknown = [lightgray]??? -blocks.powercapacity = Capacità Energetica -blocks.powershot = Danno/Colpo -blocks.damage = Danno -blocks.targetsair = Attacca Nemici Aerei -blocks.targetsground = Attacca Nemici Terreni -blocks.itemsmoved = Velocità di Movimento -blocks.launchtime = Tempo fra Decolli -blocks.shootrange = Raggio -blocks.size = Dimensioni -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacità del Liquido -blocks.powerrange = Raggio Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Connessioni Massime -blocks.poweruse = Utilizzo Energia -blocks.powerdamage = Energia/Danno -blocks.itemcapacity = Capacità -blocks.basepowergeneration = Generazione Energia di Base -blocks.productiontime = Tempo di Produzione -blocks.repairtime = Tempo di Riparazione Completa -blocks.speedincrease = Aumento Velocità -blocks.range = Raggio -blocks.drilltier = Scavabili -blocks.drillspeed = Velocità di Scavo Stabile -blocks.boosteffect = Effetto Boost -blocks.maxunits = Unità Attive Max -blocks.health = Salute -blocks.buildtime = Tempo di Costruzione -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Costo di Costruzione -blocks.inaccuracy = Inaccuratezza -blocks.shots = Colpi -blocks.reload = Ricarica -blocks.ammo = Munizioni -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacità Energetica +stat.powershot = Danno/Colpo +stat.damage = Danno +stat.targetsair = Attacca Nemici Aerei +stat.targetsground = Attacca Nemici Terreni +stat.itemsmoved = Velocità di Movimento +stat.launchtime = Tempo fra Decolli +stat.shootrange = Raggio +stat.size = Dimensioni +stat.displaysize = Display Size +stat.liquidcapacity = Capacità del Liquido +stat.powerrange = Raggio Energia +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Connessioni Massime +stat.poweruse = Utilizzo Energia +stat.powerdamage = Energia/Danno +stat.itemcapacity = Capacità +stat.basepowergeneration = Generazione Energia di Base +stat.productiontime = Tempo di Produzione +stat.repairtime = Tempo di Riparazione Completa +stat.speedincrease = Aumento Velocità +stat.range = Raggio +stat.drilltier = Scavabili +stat.drillspeed = Velocità di Scavo Stabile +stat.boosteffect = Effetto Boost +stat.maxunits = Unità Attive Max +stat.health = Salute +stat.buildtime = Tempo di Costruzione +stat.maxconsecutive = Max Consecutive +stat.buildcost = Costo di Costruzione +stat.inaccuracy = Inaccuratezza +stat.shots = Colpi +stat.reload = Ricarica +stat.ammo = Munizioni +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Miglior Trivella Richiesta bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Una grande torretta a fuoco rapido. block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente. block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio. block.repair-point.description = Cura continuamente l'unità danneggiata più vicina. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index fdb915ff96..68c766e79b 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -570,49 +570,49 @@ info.title = 情報 error.title = [crimson]エラーãŒç™ºç”Ÿã—ã¾ã—㟠error.crashtitle = エラーãŒç™ºç”Ÿã—ã¾ã—㟠unit.nobuild = [scarlet]ユニットを構築ã§ãã¾ã›ã‚“ -blocks.input = æ¬å…¥ -blocks.output = æ¬å‡º -blocks.booster = ブースト -blocks.tiles = å¿…è¦ãªã‚¿ã‚¤ãƒ« -blocks.affinities = 親和性 +stat.input = æ¬å…¥ +stat.output = æ¬å‡º +stat.booster = ブースト +stat.tiles = å¿…è¦ãªã‚¿ã‚¤ãƒ« +stat.affinities = 親和性 block.unknown = [lightgray]??? -blocks.powercapacity = é›»åŠ›å®¹é‡ -blocks.powershot = 電力/ショット -blocks.damage = ダメージ -blocks.targetsair = 対空攻撃 -blocks.targetsground = 対地攻撃 -blocks.itemsmoved = 輸é€é€Ÿåº¦ -blocks.launchtime = 発射ã®å¾…機時間 -blocks.shootrange = 範囲 -blocks.size = 大ãã• -blocks.displaysize = Display Size -blocks.liquidcapacity = æ¶²ä½“å®¹é‡ -blocks.powerrange = 電力範囲 -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 最大接続数 -blocks.poweruse = é›»åŠ›ä½¿ç”¨é‡ -blocks.powerdamage = 電力/ダメージ -blocks.itemcapacity = ã‚¢ã‚¤ãƒ†ãƒ å®¹é‡ -blocks.basepowergeneration = åŸºæœ¬ç™ºé›»é‡ -blocks.productiontime = 製造速度 -blocks.repairtime = ブロックã®å®Œå…¨ä¿®å¾©é€Ÿåº¦ -blocks.speedincrease = 速度å‘上 -blocks.range = 範囲 -blocks.drilltier = ドリル -blocks.drillspeed = 基本採掘速度 -blocks.boosteffect = ブースト効果 -blocks.maxunits = 最大ユニット数 -blocks.health = è€ä¹…値 -blocks.buildtime = 建設時間 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = 建設費用 -blocks.inaccuracy = 誤差 -blocks.shots = ショット -blocks.reload = リロード速度 -blocks.ammo = 弾薬 -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = é›»åŠ›å®¹é‡ +stat.powershot = 電力/ショット +stat.damage = ダメージ +stat.targetsair = 対空攻撃 +stat.targetsground = 対地攻撃 +stat.itemsmoved = 輸é€é€Ÿåº¦ +stat.launchtime = 発射ã®å¾…機時間 +stat.shootrange = 範囲 +stat.size = 大ãã• +stat.displaysize = Display Size +stat.liquidcapacity = æ¶²ä½“å®¹é‡ +stat.powerrange = 電力範囲 +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = 最大接続数 +stat.poweruse = é›»åŠ›ä½¿ç”¨é‡ +stat.powerdamage = 電力/ダメージ +stat.itemcapacity = ã‚¢ã‚¤ãƒ†ãƒ å®¹é‡ +stat.basepowergeneration = åŸºæœ¬ç™ºé›»é‡ +stat.productiontime = 製造速度 +stat.repairtime = ブロックã®å®Œå…¨ä¿®å¾©é€Ÿåº¦ +stat.speedincrease = 速度å‘上 +stat.range = 範囲 +stat.drilltier = ドリル +stat.drillspeed = 基本採掘速度 +stat.boosteffect = ブースト効果 +stat.maxunits = 最大ユニット数 +stat.health = è€ä¹…値 +stat.buildtime = 建設時間 +stat.maxconsecutive = Max Consecutive +stat.buildcost = 建設費用 +stat.inaccuracy = 誤差 +stat.shots = ショット +stat.reload = リロード速度 +stat.ammo = 弾薬 +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = より高性能ãªãƒ‰ãƒªãƒ«ã‚’使用ã—ã¦ãã ã•ã„ bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = 大型ã®é€£å°„型ターレットã§ã™ã€‚ block.spectre.description = 一度ã«2発ã®å¼·åŠ›ãªå¼¾ã‚’放ã¤å¤§åž‹ã®ã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚ block.meltdown.description = 強力ãªé•·è·é›¢æ”»æ’ƒãŒå¯èƒ½ãªå¤§åž‹ã®ã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚ block.repair-point.description = è¿‘ãã®è² å‚·ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’修復ã—ã¾ã™ã€‚ -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index f03ff17264..82bb299642 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -570,49 +570,49 @@ info.title = ì •ë³´ error.title = [scarlet]오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. error.crashtitle = 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ unit.nobuild = [scarlet]ì´ ìœ ë‹›ì€ ê±´ì„¤í•  수 없습니다. -blocks.input = ìž…ë ¥ -blocks.output = 출력 -blocks.booster = ê°€ì† -blocks.tiles = 필요한 íƒ€ì¼ -blocks.affinities = 친화력 +stat.input = ìž…ë ¥ +stat.output = 출력 +stat.booster = ê°€ì† +stat.tiles = 필요한 íƒ€ì¼ +stat.affinities = 친화력 block.unknown = [lightgray]??? -blocks.powercapacity = ì „ë ¥ 용량 -blocks.powershot = ì „ë ¥/ë°œ -blocks.damage = 공격력 -blocks.targetsair = 공중 공격 -blocks.targetsground = ì§€ìƒ ê³µê²© -blocks.itemsmoved = ì´ë™ ì†ë„ -blocks.launchtime = 출격 간격 -blocks.shootrange = 사거리 -blocks.size = í¬ê¸° -blocks.displaysize = Display Size -blocks.liquidcapacity = ì•¡ì²´ 용량 -blocks.powerrange = ì „ë ¥ 범위 -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 최대 ì—°ê²° 수 -blocks.poweruse = ì „ë ¥ 사용 -blocks.powerdamage = ì „ë ¥/ë°ë¯¸ì§€ -blocks.itemcapacity = 저장 용량 -blocks.basepowergeneration = 기본 ì „ë ¥ ìƒì„±ëŸ‰ -blocks.productiontime = 제작 시간 -blocks.repairtime = ì „ì²´ ë¸”ë¡ ìˆ˜ë¦¬ì‹œê°„ -blocks.speedincrease = ì†ë„ ì¦ê°€ -blocks.range = 사거리 -blocks.drilltier = 드릴 -blocks.drillspeed = 기본 드릴 ì†ë„ -blocks.boosteffect = ê°€ì† íš¨ê³¼ -blocks.maxunits = 최대 활성 유닛수 -blocks.health = ì²´ë ¥ -blocks.buildtime = 건설 시간 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = 건설 재료 -blocks.inaccuracy = ì˜¤ì°¨ê° -blocks.shots = 공격 ì†ë„ -blocks.reload = ë°œ/ì´ˆ -blocks.ammo = 탄약 -blocks.shieldhealth = 보호막 ì²´ë ¥ -blocks.cooldowntime = Cooldown Time +stat.powercapacity = ì „ë ¥ 용량 +stat.powershot = ì „ë ¥/ë°œ +stat.damage = 공격력 +stat.targetsair = 공중 공격 +stat.targetsground = ì§€ìƒ ê³µê²© +stat.itemsmoved = ì´ë™ ì†ë„ +stat.launchtime = 출격 간격 +stat.shootrange = 사거리 +stat.size = í¬ê¸° +stat.displaysize = Display Size +stat.liquidcapacity = ì•¡ì²´ 용량 +stat.powerrange = ì „ë ¥ 범위 +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = 최대 ì—°ê²° 수 +stat.poweruse = ì „ë ¥ 사용 +stat.powerdamage = ì „ë ¥/ë°ë¯¸ì§€ +stat.itemcapacity = 저장 용량 +stat.basepowergeneration = 기본 ì „ë ¥ ìƒì„±ëŸ‰ +stat.productiontime = 제작 시간 +stat.repairtime = ì „ì²´ ë¸”ë¡ ìˆ˜ë¦¬ì‹œê°„ +stat.speedincrease = ì†ë„ ì¦ê°€ +stat.range = 사거리 +stat.drilltier = 드릴 +stat.drillspeed = 기본 드릴 ì†ë„ +stat.boosteffect = ê°€ì† íš¨ê³¼ +stat.maxunits = 최대 활성 유닛수 +stat.health = ì²´ë ¥ +stat.buildtime = 건설 시간 +stat.maxconsecutive = Max Consecutive +stat.buildcost = 건설 재료 +stat.inaccuracy = ì˜¤ì°¨ê° +stat.shots = 공격 ì†ë„ +stat.reload = ë°œ/ì´ˆ +stat.ammo = 탄약 +stat.shieldhealth = 보호막 ì²´ë ¥ +stat.cooldowntime = Cooldown Time bar.drilltierreq = ë” ì¢‹ì€ ë“œë¦´ì´ í•„ìš” bar.noresources = ìžì› 부족 @@ -1302,4 +1302,4 @@ block.cyclone.description = 대공 ë° ëŒ€ì§€ í¬íƒ‘. 근처 유닛ì—게 í­ë°œ block.spectre.description = 거대한 ì´ì¤‘ 배럴 대í¬. 공중 ë° ì§€ìƒ ëª©í‘œë¬¼ì— í° ê´€í†µ ì² ê°‘íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. block.meltdown.description = 거대한 ë ˆì´ì € 대í¬. ê·¼ì²˜ì˜ ì ì—게 ì§€ì†ì ì¸ ë ˆì´ë²„ ë¹”ì„ ì¶©ì „í•˜ì—¬ 발사합니다. 냉ê°ìˆ˜ê°€ 있어야 ìž‘ë™í•©ë‹ˆë‹¤. block.repair-point.description = 주변ì—서 가장 가까운 ìœ ë‹›ì„ ì§€ì†ì ìœ¼ë¡œ 치료합니다. -block.segment.description = 날아오는 발사체를 요격합니다. ë ˆì´ì €ëŠ” 목표 대ìƒì´ 아닙니다. +block.segment.description = 날아오는 발사체를 요격합니다. ë ˆì´ì €ëŠ” 목표 대ìƒì´ 아닙니다. \ No newline at end of file diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index a318c53f5f..2ebd273b5a 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -570,49 +570,49 @@ info.title = Informacija error.title = [crimson]Ä®vyko klaida error.crashtitle = Ä®vyko klaida unit.nobuild = [scarlet]Unit can't build -blocks.input = Ä®eiga -blocks.output = IÅ¡eiga -blocks.booster = Stiprintuvas -blocks.tiles = Privalomi -blocks.affinities = Affinities +stat.input = Ä®eiga +stat.output = IÅ¡eiga +stat.booster = Stiprintuvas +stat.tiles = Privalomi +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Energijos Talpumas -blocks.powershot = Energija per šūvį -blocks.damage = Žala -blocks.targetsair = Å audo į oro taikinius -blocks.targetsground = Å audo į žemÄ—s taikinius -blocks.itemsmoved = JudÄ—jimo Greitis -blocks.launchtime = Laikas Tarp Paleidimų -blocks.shootrange = Atstumas -blocks.size = Dydis -blocks.displaysize = Display Size -blocks.liquidcapacity = SkysÄių Talpumas -blocks.powerrange = Energijos Skleidimo Atstumas -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maks. JungÄių Kiekis -blocks.poweruse = Energijos Suvartojimas -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Daiktų Talpumas -blocks.basepowergeneration = Bazinis Energijos Generavimas -blocks.productiontime = Gamybos Laikas -blocks.repairtime = Pilnas bloko sutaisymo laikas -blocks.speedincrease = GreiÄio PadidÄ—jimas -blocks.range = Atstumas -blocks.drilltier = Gręžiama -blocks.drillspeed = Bazinis Grąžto Greitis -blocks.boosteffect = Pastiprinimo Efektas -blocks.maxunits = Maks. Aktyvių Vienetų Kiekis -blocks.health = GyvybÄ—s -blocks.buildtime = Statymo Laikas -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Statymo Kaina -blocks.inaccuracy = Netikslumas -blocks.shots = Å Å«viai -blocks.reload = Å Å«viai per sekundÄ™ -blocks.ammo = Å oviniai -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Energijos Talpumas +stat.powershot = Energija per šūvį +stat.damage = Žala +stat.targetsair = Å audo į oro taikinius +stat.targetsground = Å audo į žemÄ—s taikinius +stat.itemsmoved = JudÄ—jimo Greitis +stat.launchtime = Laikas Tarp Paleidimų +stat.shootrange = Atstumas +stat.size = Dydis +stat.displaysize = Display Size +stat.liquidcapacity = SkysÄių Talpumas +stat.powerrange = Energijos Skleidimo Atstumas +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maks. JungÄių Kiekis +stat.poweruse = Energijos Suvartojimas +stat.powerdamage = Power/Damage +stat.itemcapacity = Daiktų Talpumas +stat.basepowergeneration = Bazinis Energijos Generavimas +stat.productiontime = Gamybos Laikas +stat.repairtime = Pilnas bloko sutaisymo laikas +stat.speedincrease = GreiÄio PadidÄ—jimas +stat.range = Atstumas +stat.drilltier = Gręžiama +stat.drillspeed = Bazinis Grąžto Greitis +stat.boosteffect = Pastiprinimo Efektas +stat.maxunits = Maks. Aktyvių Vienetų Kiekis +stat.health = GyvybÄ—s +stat.buildtime = Statymo Laikas +stat.maxconsecutive = Max Consecutive +stat.buildcost = Statymo Kaina +stat.inaccuracy = Netikslumas +stat.shots = Å Å«viai +stat.reload = Å Å«viai per sekundÄ™ +stat.ammo = Å oviniai +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Privalomas Geresnis Grąžtas bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Didelis bokÅ¡tas puolantis, tiek žemÄ™, tiek orÄ…. block.spectre.description = MilžiniÅ¡kas dvivamzdis bokÅ¡tas. Å audo didelius, kiaurai per Å¡arvus einanÄius Å¡ovinius į taikinius esanÄius ant žemÄ—s ir ore. block.meltdown.description = MilžiniÅ¡ka lazerinÄ— patranka. Užsikrauna ir Å¡audo lazerinius spindulius į aplinkinius prieÅ¡us. Veikimui reikalingas auÅ¡inimo skystis. block.repair-point.description = Pastoviai gydo artimiausius netoliese esanÄius vienetus. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 634b6eb00e..41d6e8a8fc 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -570,49 +570,49 @@ info.title = Informatie error.title = [crimson]Een fout is opgetreden error.crashtitle = Een fout is opgetreden unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Stroomcapaciteit -blocks.powershot = Stroom/Schot -blocks.damage = Schade -blocks.targetsair = Luchtdoelwitten -blocks.targetsground = Gronddoelwitten -blocks.itemsmoved = Beweegingssnelheid -blocks.launchtime = Tijd tussen lanceringen -blocks.shootrange = Bereik -blocks.size = Formaat -blocks.displaysize = Display Size -blocks.liquidcapacity = Vloeistofcapaciteit -blocks.powerrange = Stroombereik -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maximale Hoeveelheid Connecties -blocks.poweruse = Stroomverbruik -blocks.powerdamage = Stroom/Schade -blocks.itemcapacity = Materiaalcapaciteit -blocks.basepowergeneration = Standaard Stroom Generatie -blocks.productiontime = Productie Tijd -blocks.repairtime = Volledige Blok Repareertijd -blocks.speedincrease = Snelheidsverhoging -blocks.range = Bereik -blocks.drilltier = Valt te delven -blocks.drillspeed = Standaard mine snelheid -blocks.boosteffect = Boost Effect -blocks.maxunits = Maximaal Actieve Units -blocks.health = Levenspunten -blocks.buildtime = Bouwtijd -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Bouwkosten -blocks.inaccuracy = Onnauwkeurigheid -blocks.shots = Shoten -blocks.reload = Schoten/Seconde -blocks.ammo = Ammunitie -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Stroomcapaciteit +stat.powershot = Stroom/Schot +stat.damage = Schade +stat.targetsair = Luchtdoelwitten +stat.targetsground = Gronddoelwitten +stat.itemsmoved = Beweegingssnelheid +stat.launchtime = Tijd tussen lanceringen +stat.shootrange = Bereik +stat.size = Formaat +stat.displaysize = Display Size +stat.liquidcapacity = Vloeistofcapaciteit +stat.powerrange = Stroombereik +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maximale Hoeveelheid Connecties +stat.poweruse = Stroomverbruik +stat.powerdamage = Stroom/Schade +stat.itemcapacity = Materiaalcapaciteit +stat.basepowergeneration = Standaard Stroom Generatie +stat.productiontime = Productie Tijd +stat.repairtime = Volledige Blok Repareertijd +stat.speedincrease = Snelheidsverhoging +stat.range = Bereik +stat.drilltier = Valt te delven +stat.drillspeed = Standaard mine snelheid +stat.boosteffect = Boost Effect +stat.maxunits = Maximaal Actieve Units +stat.health = Levenspunten +stat.buildtime = Bouwtijd +stat.maxconsecutive = Max Consecutive +stat.buildcost = Bouwkosten +stat.inaccuracy = Onnauwkeurigheid +stat.shots = Shoten +stat.reload = Schoten/Seconde +stat.ammo = Ammunitie +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Betere miner nodig bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large rapid fire turret. block.spectre.description = A large turret which shoots two powerful bullets at once. block.meltdown.description = A large turret which shoots powerful long-range beams. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index ce59b257f7..4f2ed1fdcd 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large rapid fire turret. block.spectre.description = A large turret which shoots two powerful bullets at once. block.meltdown.description = A large turret which shoots powerful long-range beams. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index f0c67c6a88..80502bb870 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -570,49 +570,49 @@ info.title = Informacje error.title = [crimson]WystÄ…piÅ‚ błąd error.crashtitle = WystÄ…piÅ‚ błąd unit.nobuild = [scarlet]Jednostka nie może budować -blocks.input = WejÅ›cie -blocks.output = WyjÅ›cie -blocks.booster = Wzmacniacz -blocks.tiles = Wymagane Pola -blocks.affinities = Uwydajnienie +stat.input = WejÅ›cie +stat.output = WyjÅ›cie +stat.booster = Wzmacniacz +stat.tiles = Wymagane Pola +stat.affinities = Uwydajnienie block.unknown = [lightgray]??? -blocks.powercapacity = Pojemność mocy -blocks.powershot = moc/strzaÅ‚ -blocks.damage = Obrażenia -blocks.targetsair = Namierzanie wrogów powietrznych -blocks.targetsground = Namierzanie wrogów lÄ…dowych -blocks.itemsmoved = PrÄ™dkość poruszania siÄ™ -blocks.launchtime = Czas pomiÄ™dzy wystrzeleniami -blocks.shootrange = ZasiÄ™g -blocks.size = Rozmiar -blocks.displaysize = Display Size -blocks.liquidcapacity = Pojemność cieczy -blocks.powerrange = Zakres mocy -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maksymalna ilość połączeÅ„ -blocks.poweruse = Zużycie prÄ…du -blocks.powerdamage = Moc/Zniszczenia -blocks.itemcapacity = Pojemność przedmiotów -blocks.basepowergeneration = Podstawowa generacja mocy -blocks.productiontime = Czas produkcji -blocks.repairtime = Czas peÅ‚nej naprawy bloku -blocks.speedincrease = ZwiÄ™kszenie prÄ™dkoÅ›ci -blocks.range = ZasiÄ™g -blocks.drilltier = Co może wykopać -blocks.drillspeed = Podstawowa szybkość kopania -blocks.boosteffect = Efekt wzmocnienia -blocks.maxunits = Maksymalna ilość jednostek -blocks.health = Zdrowie -blocks.buildtime = Czas budowy -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Koszt budowy -blocks.inaccuracy = Niecelność -blocks.shots = StrzaÅ‚y -blocks.reload = Strzałów/sekundÄ™ -blocks.ammo = Amunicja -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Pojemność mocy +stat.powershot = moc/strzaÅ‚ +stat.damage = Obrażenia +stat.targetsair = Namierzanie wrogów powietrznych +stat.targetsground = Namierzanie wrogów lÄ…dowych +stat.itemsmoved = PrÄ™dkość poruszania siÄ™ +stat.launchtime = Czas pomiÄ™dzy wystrzeleniami +stat.shootrange = ZasiÄ™g +stat.size = Rozmiar +stat.displaysize = Display Size +stat.liquidcapacity = Pojemność cieczy +stat.powerrange = Zakres mocy +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maksymalna ilość połączeÅ„ +stat.poweruse = Zużycie prÄ…du +stat.powerdamage = Moc/Zniszczenia +stat.itemcapacity = Pojemność przedmiotów +stat.basepowergeneration = Podstawowa generacja mocy +stat.productiontime = Czas produkcji +stat.repairtime = Czas peÅ‚nej naprawy bloku +stat.speedincrease = ZwiÄ™kszenie prÄ™dkoÅ›ci +stat.range = ZasiÄ™g +stat.drilltier = Co może wykopać +stat.drillspeed = Podstawowa szybkość kopania +stat.boosteffect = Efekt wzmocnienia +stat.maxunits = Maksymalna ilość jednostek +stat.health = Zdrowie +stat.buildtime = Czas budowy +stat.maxconsecutive = Max Consecutive +stat.buildcost = Koszt budowy +stat.inaccuracy = Niecelność +stat.shots = StrzaÅ‚y +stat.reload = Strzałów/sekundÄ™ +stat.ammo = Amunicja +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Wymagane Lepsze WiertÅ‚o bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Duża szybkostrzelna wieża. block.spectre.description = Duże dziaÅ‚o dwulufowe, które strzela potężnymi pociskami przebijajÄ…cymi pancerz w jednostki naziemne i powietrzne. block.meltdown.description = Duże dziaÅ‚o laserowe, które strzela potężnymi wiÄ…zkami dalekiego zasiÄ™gu. Wymaga chÅ‚odzenia. block.repair-point.description = Bez przerw naprawia najbliższÄ… uszkodzonÄ… jednostkÄ™ w jego zasiÄ™gu. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index c2d8b20dcf..7f2659d839 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -570,49 +570,49 @@ info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Saída -blocks.booster = Apoio -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Entrada +stat.output = Saída +stat.booster = Apoio +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Capacidade de Energia -blocks.powershot = Energia/tiro -blocks.damage = Dano -blocks.targetsair = Mira no ar -blocks.targetsground = Mira no chão -blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre Disparos. -blocks.shootrange = Alcance -blocks.size = Tamanho -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidade de Líquido -blocks.powerrange = Alcance da Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Conexões Máximas -blocks.poweruse = Uso de energia -blocks.powerdamage = Dano/Poder -blocks.itemcapacity = Capacidade de Itens -blocks.basepowergeneration = Geração de poder base -blocks.productiontime = Tempo de produção -blocks.repairtime = Tempo de reparo total do bloco -blocks.speedincrease = Aumento de velocidade -blocks.range = Distância -blocks.drilltier = Brocas -blocks.drillspeed = Velocidade base da Broca -blocks.boosteffect = Efeito do Impulso -blocks.maxunits = Máximo de unidades ativas -blocks.health = Saúde -blocks.buildtime = Tempo de construção -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Custo de construção -blocks.inaccuracy = Imprecisão -blocks.shots = Tiros -blocks.reload = Tiros por segundo -blocks.ammo = Munição -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacidade de Energia +stat.powershot = Energia/tiro +stat.damage = Dano +stat.targetsair = Mira no ar +stat.targetsground = Mira no chão +stat.itemsmoved = Velocidade de movimento +stat.launchtime = Tempo entre Disparos. +stat.shootrange = Alcance +stat.size = Tamanho +stat.displaysize = Display Size +stat.liquidcapacity = Capacidade de Líquido +stat.powerrange = Alcance da Energia +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Conexões Máximas +stat.poweruse = Uso de energia +stat.powerdamage = Dano/Poder +stat.itemcapacity = Capacidade de Itens +stat.basepowergeneration = Geração de poder base +stat.productiontime = Tempo de produção +stat.repairtime = Tempo de reparo total do bloco +stat.speedincrease = Aumento de velocidade +stat.range = Distância +stat.drilltier = Brocas +stat.drillspeed = Velocidade base da Broca +stat.boosteffect = Efeito do Impulso +stat.maxunits = Máximo de unidades ativas +stat.health = Saúde +stat.buildtime = Tempo de construção +stat.maxconsecutive = Max Consecutive +stat.buildcost = Custo de construção +stat.inaccuracy = Imprecisão +stat.shots = Tiros +stat.reload = Tiros por segundo +stat.ammo = Munição +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Uma grande torre que dispara balas explosivas que se block.spectre.description = Um grande canhão massivo. Dispara grandes tiros perfuradores de blindagem em inimigos aéreos e terrestres. block.meltdown.description = Um grande canhão laser massivo. Carrega e dispara um poderoso e persistente feixe nos seus inimigos. Requer uma refrigeração para ser operada. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.segment.description = Destrói projéteis inimigos. Projéteis de laser não são afetados. +block.segment.description = Destrói projéteis inimigos. Projéteis de laser não são afetados. \ No newline at end of file diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 0b6948191b..c4b5070b3a 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -570,49 +570,49 @@ info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Saida -blocks.booster = Booster -blocks.tiles = Telhas Requeridas -blocks.affinities = Afinidades +stat.input = Entrada +stat.output = Saida +stat.booster = Booster +stat.tiles = Telhas Requeridas +stat.affinities = Afinidades block.unknown = [lightgray]??? -blocks.powercapacity = Capacidade de Energia -blocks.powershot = Energia/tiro -blocks.damage = Dano -blocks.targetsair = Mirar no ar -blocks.targetsground = Mirar no chão -blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre tiros -blocks.shootrange = Alcance -blocks.size = Tamanho -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidade de Líquido -blocks.powerrange = Alcance da Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Uso de energia -blocks.powerdamage = Dano/Poder -blocks.itemcapacity = Capacidade de Itens -blocks.basepowergeneration = Geração de poder base -blocks.productiontime = Tempo de produção -blocks.repairtime = Tempo de reparo total do bloco -blocks.speedincrease = Aumento de velocidade -blocks.range = Distância -blocks.drilltier = Furáveis -blocks.drillspeed = Velocidade da broca base -blocks.boosteffect = Efeito do Boost -blocks.maxunits = Máximo de unidades ativas -blocks.health = Saúde -blocks.buildtime = Tempo de construção -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Custo de construção -blocks.inaccuracy = Imprecisão -blocks.shots = Tiros -blocks.reload = Tiros por segundo -blocks.ammo = Munição -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Capacidade de Energia +stat.powershot = Energia/tiro +stat.damage = Dano +stat.targetsair = Mirar no ar +stat.targetsground = Mirar no chão +stat.itemsmoved = Velocidade de movimento +stat.launchtime = Tempo entre tiros +stat.shootrange = Alcance +stat.size = Tamanho +stat.displaysize = Display Size +stat.liquidcapacity = Capacidade de Líquido +stat.powerrange = Alcance da Energia +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Uso de energia +stat.powerdamage = Dano/Poder +stat.itemcapacity = Capacidade de Itens +stat.basepowergeneration = Geração de poder base +stat.productiontime = Tempo de produção +stat.repairtime = Tempo de reparo total do bloco +stat.speedincrease = Aumento de velocidade +stat.range = Distância +stat.drilltier = Furáveis +stat.drillspeed = Velocidade da broca base +stat.boosteffect = Efeito do Boost +stat.maxunits = Máximo de unidades ativas +stat.health = Saúde +stat.buildtime = Tempo de construção +stat.maxconsecutive = Max Consecutive +stat.buildcost = Custo de construção +stat.inaccuracy = Imprecisão +stat.shots = Tiros +stat.reload = Tiros por segundo +stat.ammo = Munição +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Uma grande torre de tiro rapido. block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 053fbdc7d7..aa9fd2f18d 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -569,50 +569,50 @@ error.title = [scarlet]A apărut o eroare. error.crashtitle = A apărut o eroare. unit.nobuild = [scarlet]Unitatea nu poate construi. lastaccessed = [lightgray]Ultima Accesare: {0} -blocks.input = Necesită -blocks.output = Produce -blocks.booster = Booster -blocks.tiles = Teren Necesar -blocks.affinities = Efecte Teren +stat.input = Necesită +stat.output = Produce +stat.booster = Booster +stat.tiles = Teren Necesar +stat.affinities = Efecte Teren block.unknown = [lightgray]??? -blocks.powercapacity = Capacitate electrică -blocks.powershot = Electricitate/GlonÈ› -blocks.damage = Forță -blocks.targetsair = LoveÈ™te Aeronave -blocks.targetsground = LoveÈ™te Artilerie -blocks.itemsmoved = Viteza de MiÈ™care a Materialelor -blocks.launchtime = Timp între Lansări -blocks.shootrange = Rază -blocks.size = Mărime -blocks.displaysize = Mărimea Monitorului Logic -blocks.liquidcapacity = Capacitate Lichid -blocks.powerrange = Raza Electrică -blocks.linkrange = Raza Legăturilor -blocks.instructions = InstrucÈ›iuni -blocks.powerconnections = Maxim Conexiuni -blocks.poweruse = Consum Electricitate -blocks.powerdamage = Electricitate/ForÈ›a GlonÈ›ului -blocks.itemcapacity = Capacitate Materiale -blocks.memorycapacity = Capacitate Memorie -blocks.basepowergeneration = Generare Electricitate (Bază) -blocks.productiontime = Timp ProducÈ›ie -blocks.repairtime = Durata Reparării Blocului -blocks.speedincrease = CreÈ™tere Viteză -blocks.range = Rază -blocks.drilltier = Minabile -blocks.drillspeed = Viteză Burghiu (Bază) -blocks.boosteffect = Efect de Boost -blocks.maxunits = Maxim Unități Active -blocks.health = Viață -blocks.buildtime = Timp ConstrucÈ›ie -blocks.maxconsecutive = Maxim Consecutive -blocks.buildcost = Cost ConstrucÈ›ie -blocks.inaccuracy = InacurateÈ›e -blocks.shots = Lovituri -blocks.reload = Lovituri/Secundă -blocks.ammo = MuniÈ›ie -blocks.shieldhealth = ViaÈ›a Scutului -blocks.cooldowntime = Timp de Reîncărcare +stat.powercapacity = Capacitate electrică +stat.powershot = Electricitate/GlonÈ› +stat.damage = Forță +stat.targetsair = LoveÈ™te Aeronave +stat.targetsground = LoveÈ™te Artilerie +stat.itemsmoved = Viteza de MiÈ™care a Materialelor +stat.launchtime = Timp între Lansări +stat.shootrange = Rază +stat.size = Mărime +stat.displaysize = Mărimea Monitorului Logic +stat.liquidcapacity = Capacitate Lichid +stat.powerrange = Raza Electrică +stat.linkrange = Raza Legăturilor +stat.instructions = InstrucÈ›iuni +stat.powerconnections = Maxim Conexiuni +stat.poweruse = Consum Electricitate +stat.powerdamage = Electricitate/ForÈ›a GlonÈ›ului +stat.itemcapacity = Capacitate Materiale +stat.memorycapacity = Capacitate Memorie +stat.basepowergeneration = Generare Electricitate (Bază) +stat.productiontime = Timp ProducÈ›ie +stat.repairtime = Durata Reparării Blocului +stat.speedincrease = CreÈ™tere Viteză +stat.range = Rază +stat.drilltier = Minabile +stat.drillspeed = Viteză Burghiu (Bază) +stat.boosteffect = Efect de Boost +stat.maxunits = Maxim Unități Active +stat.health = Viață +stat.buildtime = Timp ConstrucÈ›ie +stat.maxconsecutive = Maxim Consecutive +stat.buildcost = Cost ConstrucÈ›ie +stat.inaccuracy = InacurateÈ›e +stat.shots = Lovituri +stat.reload = Lovituri/Secundă +stat.ammo = MuniÈ›ie +stat.shieldhealth = ViaÈ›a Scutului +stat.cooldowntime = Timp de Reîncărcare bar.drilltierreq = Burghiu Mai Bun Necesar bar.noresources = Resurse lipsă @@ -1311,4 +1311,4 @@ block.cyclone.description = O mare armă anti-artilerie È™i anti-aer. Trage cu g block.spectre.description = O armă masivă cu două È›evi. Trage cu gloanÈ›e mari care găuresc armurile È›intelor aeriene È™i artileriei. block.meltdown.description = O armă cu laser masivă. Trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. -block.segment.description = Deteriorează È™i distruge proiectilele din apropiere. Laserele nu sunt afectate. +block.segment.description = Deteriorează È™i distruge proiectilele din apropiere. Laserele nu sunt afectate. \ No newline at end of file diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 1e12db9ee4..078a1cf6f4 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -576,50 +576,50 @@ error.title = [scarlet]Произошла ошибка error.crashtitle = Произошла ошибка unit.nobuild = [scarlet]Ð‘Ð¾ÐµÐ²Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° не может Ñтроить lastaccessed = [lightgray]ПоÑледнÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ {0} -blocks.input = Вход -blocks.output = Выход -blocks.booster = УÑкоритель -blocks.tiles = Ðеобходимые плитки -blocks.affinities = Увеличение ÑффективноÑти +stat.input = Вход +stat.output = Выход +stat.booster = УÑкоритель +stat.tiles = Ðеобходимые плитки +stat.affinities = Увеличение ÑффективноÑти block.unknown = [lightgray]??? -blocks.powercapacity = ВмеÑтимоÑть Ñнергии -blocks.powershot = ЭнергиÑ/Ð’Ñ‹Ñтрел -blocks.damage = Урон -blocks.targetsair = Воздушные цели -blocks.targetsground = Ðаземные цели -blocks.itemsmoved = СкороÑть Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ -blocks.launchtime = Интервал запуÑков -blocks.shootrange = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ -blocks.size = Размер -blocks.displaysize = Размер диÑÐ¿Ð»ÐµÑ -blocks.liquidcapacity = ВмеÑтимоÑть жидкоÑти -blocks.powerrange = ДальноÑть передачи Ñнергии -blocks.linkrange = ДальноÑть ÑвÑзи -blocks.instructions = ИнÑтрукции -blocks.powerconnections = КоличеÑтво Ñоединений -blocks.poweruse = ПотреблÑет Ñнергии -blocks.powerdamage = ЭнергиÑ/урон -blocks.itemcapacity = ВмеÑтимоÑть предметов -blocks.memorycapacity = Размер памÑти -blocks.basepowergeneration = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñнергии -blocks.productiontime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва -blocks.repairtime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ регенерации -blocks.speedincrease = Увеличение ÑкороÑти -blocks.range = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ -blocks.drilltier = Бурит -blocks.drillspeed = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑкороÑть Ð±ÑƒÑ€ÐµÐ½Ð¸Ñ -blocks.boosteffect = УÑкорÑющий Ñффект -blocks.maxunits = МакÑимальное количеÑтво активных единиц -blocks.health = ПрочноÑть -blocks.buildtime = Ð’Ñ€ÐµÐ¼Ñ ÑтроительÑтва -blocks.maxconsecutive = МакÑ. поÑледовательноÑть -blocks.buildcost = СтоимоÑть ÑтроительÑтва -blocks.inaccuracy = Ð Ð°Ð·Ð±Ñ€Ð¾Ñ -blocks.shots = Ð’Ñ‹Ñтрелы -blocks.reload = Ð’Ñ‹Ñтрелы/Ñекунду -blocks.ammo = БоеприпаÑÑ‹ -blocks.shieldhealth = ПрочноÑть щита -blocks.cooldowntime = Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ +stat.powercapacity = ВмеÑтимоÑть Ñнергии +stat.powershot = ЭнергиÑ/Ð’Ñ‹Ñтрел +stat.damage = Урон +stat.targetsair = Воздушные цели +stat.targetsground = Ðаземные цели +stat.itemsmoved = СкороÑть Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ +stat.launchtime = Интервал запуÑков +stat.shootrange = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ +stat.size = Размер +stat.displaysize = Размер диÑÐ¿Ð»ÐµÑ +stat.liquidcapacity = ВмеÑтимоÑть жидкоÑти +stat.powerrange = ДальноÑть передачи Ñнергии +stat.linkrange = ДальноÑть ÑвÑзи +stat.instructions = ИнÑтрукции +stat.powerconnections = КоличеÑтво Ñоединений +stat.poweruse = ПотреблÑет Ñнергии +stat.powerdamage = ЭнергиÑ/урон +stat.itemcapacity = ВмеÑтимоÑть предметов +stat.memorycapacity = Размер памÑти +stat.basepowergeneration = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñнергии +stat.productiontime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва +stat.repairtime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ регенерации +stat.speedincrease = Увеличение ÑкороÑти +stat.range = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ +stat.drilltier = Бурит +stat.drillspeed = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑкороÑть Ð±ÑƒÑ€ÐµÐ½Ð¸Ñ +stat.boosteffect = УÑкорÑющий Ñффект +stat.maxunits = МакÑимальное количеÑтво активных единиц +stat.health = ПрочноÑть +stat.buildtime = Ð’Ñ€ÐµÐ¼Ñ ÑтроительÑтва +stat.maxconsecutive = МакÑ. поÑледовательноÑть +stat.buildcost = СтоимоÑть ÑтроительÑтва +stat.inaccuracy = Ð Ð°Ð·Ð±Ñ€Ð¾Ñ +stat.shots = Ð’Ñ‹Ñтрелы +stat.reload = Ð’Ñ‹Ñтрелы/Ñекунду +stat.ammo = БоеприпаÑÑ‹ +stat.shieldhealth = ПрочноÑть щита +stat.cooldowntime = Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ bar.drilltierreq = ТребуетÑÑ Ð±ÑƒÑ€ получше bar.noresources = ÐедоÑтаточно реÑурÑов @@ -1321,5 +1321,4 @@ block.cyclone.description = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶Ðµ block.spectre.description = МаÑÑÐ¸Ð²Ð½Ð°Ñ Ð´Ð²ÑƒÑÑ‚Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿ÑƒÑˆÐºÐ°. СтрелÑет крупными бронебойными ÑнарÑдами по воздушным и наземным целÑм. block.meltdown.description = МаÑÑÐ¸Ð²Ð½Ð°Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ð°Ñ Ð¿ÑƒÑˆÐºÐ°. ЗарÑжает и ÑтрелÑет поÑтоÑнным лазерным лучом в ближайших врагов. ТребуетÑÑ Ð¾Ñ…Ð»Ð°Ð¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. block.repair-point.description = Ðепрерывно лечит ближайшую поврежденную боевую единицу или мех в Ñвоём радиуÑе. -block.segment.description = Повреждает и разрушает приближающиеÑÑ ÑнарÑды. Ðе взаимодейÑтвует Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ñ‹Ð¼Ð¸ лучами. - +block.segment.description = Повреждает и разрушает приближающиеÑÑ ÑнарÑды. Ðе взаимодейÑтвует Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ñ‹Ð¼Ð¸ лучами. \ No newline at end of file diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 0d29e6a89e..8d3942eccb 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -570,49 +570,49 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Inmatning -blocks.output = Utmatning -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Inmatning +stat.output = Utmatning +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Skada -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Storlek -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Skott -blocks.reload = Shots/Second -blocks.ammo = Ammunition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Skada +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Storlek +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Skott +stat.reload = Shots/Second +stat.ammo = Ammunition +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Bättre Borr Krävs bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large anti-air and anti-ground turret. Fires explo block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 6a89ac29ca..b86d8e7182 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -570,49 +570,49 @@ info.title = ข้อมูล error.title = [crimson]มีบางอย่างผิดพลาดเà¸à¸´à¸”ขึ้น error.crashtitle = มีบางอย่างผิดพลาดเà¸à¸´à¸”ขึ้น unit.nobuild = [scarlet]Unit can't build -blocks.input = นำเข้า -blocks.output = ส่งออภ-blocks.booster = บูสเตอร์ -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = นำเข้า +stat.output = ส่งออภ+stat.booster = บูสเตอร์ +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = ความจุพลังงาน -blocks.powershot = หน่วยพลังงาน/นัด -blocks.damage = ดาเมจ -blocks.targetsair = ยิงอาà¸à¸²à¸¨à¸¢à¸²à¸™ -blocks.targetsground = ยิงภาคพื้นดิน -blocks.itemsmoved = ความเร็วเคลื่อนที่ -blocks.launchtime = เวลาระหว่างà¸à¸²à¸£à¸ªà¹ˆà¸‡ -blocks.shootrange = ระยะยิง -blocks.size = ขนาด -blocks.displaysize = Display Size -blocks.liquidcapacity = จุของเหลว -blocks.powerrange = ระยะพลังงาน -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = จำนวนà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อสูงสุด -blocks.poweruse = ใช้พลังงาน -blocks.powerdamage = หน่วยพลังงาน/ดาเมจ -blocks.itemcapacity = จุไอเท็ม -blocks.basepowergeneration = à¸à¸³à¹€à¸™à¸´à¸”พลังงานพื้นà¸à¸²à¸™ -blocks.productiontime = เวลาที่ใช้ในà¸à¸²à¸£à¸œà¸¥à¸´à¸• -blocks.repairtime = เวลาที่ใช้ในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¹à¸‹à¸¡à¹ƒà¸«à¹‰à¸ªà¸¡à¸šà¸¹à¸£à¸“์ -blocks.speedincrease = เพิ่มความเร็ว -blocks.range = ระยะ -blocks.drilltier = ขุดได้ -blocks.drillspeed = ความเร็วขุดพื้นà¸à¸²à¸™ -blocks.boosteffect = à¹à¸­à¸Ÿà¹€à¸Ÿà¹‡à¸„ของบูสต์ -blocks.maxunits = จำนวนยูนิตสูงสุด -blocks.health = เลือด -blocks.buildtime = เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = ใช้ -blocks.inaccuracy = ความคลาดเคลื่อน -blocks.shots = นัด -blocks.reload = นัด/วินาที -blocks.ammo = à¸à¸£à¸°à¸ªà¸¸à¸™ -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = ความจุพลังงาน +stat.powershot = หน่วยพลังงาน/นัด +stat.damage = ดาเมจ +stat.targetsair = ยิงอาà¸à¸²à¸¨à¸¢à¸²à¸™ +stat.targetsground = ยิงภาคพื้นดิน +stat.itemsmoved = ความเร็วเคลื่อนที่ +stat.launchtime = เวลาระหว่างà¸à¸²à¸£à¸ªà¹ˆà¸‡ +stat.shootrange = ระยะยิง +stat.size = ขนาด +stat.displaysize = Display Size +stat.liquidcapacity = จุของเหลว +stat.powerrange = ระยะพลังงาน +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = จำนวนà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อสูงสุด +stat.poweruse = ใช้พลังงาน +stat.powerdamage = หน่วยพลังงาน/ดาเมจ +stat.itemcapacity = จุไอเท็ม +stat.basepowergeneration = à¸à¸³à¹€à¸™à¸´à¸”พลังงานพื้นà¸à¸²à¸™ +stat.productiontime = เวลาที่ใช้ในà¸à¸²à¸£à¸œà¸¥à¸´à¸• +stat.repairtime = เวลาที่ใช้ในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¹à¸‹à¸¡à¹ƒà¸«à¹‰à¸ªà¸¡à¸šà¸¹à¸£à¸“์ +stat.speedincrease = เพิ่มความเร็ว +stat.range = ระยะ +stat.drilltier = ขุดได้ +stat.drillspeed = ความเร็วขุดพื้นà¸à¸²à¸™ +stat.boosteffect = à¹à¸­à¸Ÿà¹€à¸Ÿà¹‡à¸„ของบูสต์ +stat.maxunits = จำนวนยูนิตสูงสุด +stat.health = เลือด +stat.buildtime = เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ +stat.maxconsecutive = Max Consecutive +stat.buildcost = ใช้ +stat.inaccuracy = ความคลาดเคลื่อน +stat.shots = นัด +stat.reload = นัด/วินาที +stat.ammo = à¸à¸£à¸°à¸ªà¸¸à¸™ +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = จำเป็นต้องใช้เครื่องขุดที่ดีà¸à¸§à¹ˆà¸² bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = ป้อมปืนต่อต้านอาภblock.spectre.description = ปืนใหà¸à¹ˆà¸¥à¸³à¸à¸¥à¹‰à¸­à¸‡à¸„ูขนาดยัà¸à¸©à¹Œ. ยิงà¸à¸£à¸°à¸ªà¸¸à¸™à¹€à¸ˆà¸²à¸°à¹€à¸à¸£à¸²à¸°à¹ƒà¸ªà¹ˆà¸¨à¸±à¸•รูทั้งบนอาà¸à¸²à¸¨à¹à¸¥à¸°à¸ à¸²à¸”พื้นดิน. block.meltdown.description = ปืนใหà¸à¹ˆà¹€à¸¥à¹€à¸‹à¸­à¸£à¹Œà¸‚นาดยัà¸à¸©à¹Œ. ชาร์จà¹à¸¥à¹‰à¸§à¸¢à¸´à¸‡à¸¥à¸³à¹à¸ªà¸‡à¹€à¸¥à¹€à¸‹à¸­à¸£à¹Œà¹ƒà¸ªà¹ˆà¸¨à¸±à¸•รูที่อยู่ใà¸à¸¥à¹‰. จำเป็นต้องใช้สารหล่อเย็น. block.repair-point.description = ซ่อมà¹à¸‹à¸¡à¸¢à¸¹à¸™à¸´à¸•ที่อยู่ในรัศมีอย่างต่อเนื่อง. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index edfae05b29..cfac48c897 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -570,49 +570,49 @@ info.title = [accent]Bilgi error.title = [crimson]Bir hata olustu error.crashtitle = Bir hata olustu unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Guc kapasitesi -blocks.powershot = Guc/Saldiri hizi -blocks.damage = Damage -blocks.targetsair = Havayi hedef alir mi? -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Menzil -blocks.size = Buyukluk -blocks.displaysize = Display Size -blocks.liquidcapacity = Sivi kapasitesi -blocks.powerrange = Menzil -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Guc kullanimi -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Esya kapasitesi -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Kazilabilirler -blocks.drillspeed = Ana kazma hizi -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Can -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = sekme -blocks.shots = vuruslar -blocks.reload = Yeniden doldurma -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Guc kapasitesi +stat.powershot = Guc/Saldiri hizi +stat.damage = Damage +stat.targetsair = Havayi hedef alir mi? +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Menzil +stat.size = Buyukluk +stat.displaysize = Display Size +stat.liquidcapacity = Sivi kapasitesi +stat.powerrange = Menzil +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Guc kullanimi +stat.powerdamage = Power/Damage +stat.itemcapacity = Esya kapasitesi +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Kazilabilirler +stat.drillspeed = Ana kazma hizi +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Can +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = sekme +stat.shots = vuruslar +stat.reload = Yeniden doldurma +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = A large rapid fire turret. block.spectre.description = A large turret which shoots two powerful bullets at once. block.meltdown.description = A large turret which shoots powerful long-range beams. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 1fd6a6618e..395e062453 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -570,49 +570,49 @@ info.title = Bilgi error.title = [crimson]Bir hata oldu error.crashtitle = Bir hata oldu unit.nobuild = [scarlet]Unit can't build -blocks.input = GiriÅŸ -blocks.output = Çıkış -blocks.booster = Güçlendirici -blocks.tiles = Required Tiles -blocks.affinities = Affinities +stat.input = GiriÅŸ +stat.output = Çıkış +stat.booster = Güçlendirici +stat.tiles = Required Tiles +stat.affinities = Affinities block.unknown = [lightgray]??? -blocks.powercapacity = Enerji Kapasitesi -blocks.powershot = Enerji/Atış -blocks.damage = Hasar -blocks.targetsair = Havayı Hedefler Mi -blocks.targetsground = Yeri Hedefler Mi -blocks.itemsmoved = Hareket Hızı -blocks.launchtime = Fırlatmalar Arasındaki Süre -blocks.shootrange = Menzil -blocks.size = Boyut -blocks.displaysize = Display Size -blocks.liquidcapacity = Sıvı Kapasitesi -blocks.powerrange = Enerji Menzili -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = BaÄŸlantı sayısı -blocks.poweruse = Enerji Kullanımı -blocks.powerdamage = Enerji/Hasar -blocks.itemcapacity = EÅŸya Kapasitesi -blocks.basepowergeneration = Temel Enerji Üretimi -blocks.productiontime = Üretim Süresi -blocks.repairtime = Tamir Tamir Edilme Süresi -blocks.speedincrease = Hız Artışı -blocks.range = Menzil -blocks.drilltier = Kazılabilenler -blocks.drillspeed = Temel Matkap Hızı -blocks.boosteffect = Hızlandırma Efekti -blocks.maxunits = Maksimum Aktif Birim -blocks.health = Can -blocks.buildtime = İnÅŸaat Süresi -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = İnÅŸaat Fiyatı -blocks.inaccuracy = İskalama Oranı -blocks.shots = Atışlar -blocks.reload = Atışlar/Sn -blocks.ammo = Mermi -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = Enerji Kapasitesi +stat.powershot = Enerji/Atış +stat.damage = Hasar +stat.targetsair = Havayı Hedefler Mi +stat.targetsground = Yeri Hedefler Mi +stat.itemsmoved = Hareket Hızı +stat.launchtime = Fırlatmalar Arasındaki Süre +stat.shootrange = Menzil +stat.size = Boyut +stat.displaysize = Display Size +stat.liquidcapacity = Sıvı Kapasitesi +stat.powerrange = Enerji Menzili +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = BaÄŸlantı sayısı +stat.poweruse = Enerji Kullanımı +stat.powerdamage = Enerji/Hasar +stat.itemcapacity = EÅŸya Kapasitesi +stat.basepowergeneration = Temel Enerji Üretimi +stat.productiontime = Üretim Süresi +stat.repairtime = Tamir Tamir Edilme Süresi +stat.speedincrease = Hız Artışı +stat.range = Menzil +stat.drilltier = Kazılabilenler +stat.drillspeed = Temel Matkap Hızı +stat.boosteffect = Hızlandırma Efekti +stat.maxunits = Maksimum Aktif Birim +stat.health = Can +stat.buildtime = İnÅŸaat Süresi +stat.maxconsecutive = Max Consecutive +stat.buildcost = İnÅŸaat Fiyatı +stat.inaccuracy = İskalama Oranı +stat.shots = Atışlar +stat.reload = Atışlar/Sn +stat.ammo = Mermi +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = Daha İyi Matkap Gerekli bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = Büyük bir anti hava ve anti kara tareti. Yakının block.spectre.description = Dev bir çift namlulu top. Hava ve kara birimlerine iri, zırh delici mermiler atar. block.meltdown.description = Dev bir lazer topu. Yüklenip yakındaki düşmanlara uzun süreli lazer ışınları yollar. Çalışması için soÄŸutucu gerekir. block.repair-point.description = Kendisine en yakın hasarlı birimi tamir eder. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 05deecc5b3..dfc4bae48b 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -565,50 +565,50 @@ info.title = Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ error.title = [crimson]Виникла помилка error.crashtitle = Виникла помилка unit.nobuild = [scarlet]Ð¦Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð½Ðµ може будувати -blocks.input = Ввід -blocks.output = Вивід -blocks.booster = ПриÑкорювач -blocks.tiles = Ðеобхідні плитки -blocks.affinities = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті +stat.input = Ввід +stat.output = Вивід +stat.booster = ПриÑкорювач +stat.tiles = Ðеобхідні плитки +stat.affinities = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті block.unknown = [lightgray]??? -blocks.powercapacity = МіÑткіÑть енергії -blocks.powershot = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ Ð·Ð° поÑтріл -blocks.damage = Шкода -blocks.targetsair = ПовітрÑні противники -blocks.targetsground = Ðаземні противники -blocks.itemsmoved = ШвидкіÑть Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ -blocks.launchtime = Ð§Ð°Ñ Ð¼Ñ–Ð¶ запуÑками -blocks.shootrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— -blocks.size = Розмір -blocks.displaysize = Розмір диÑплею -blocks.liquidcapacity = Рідинна міÑткіÑть -blocks.powerrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– енергії -blocks.linkrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ -blocks.instructions = ІнÑтрукції -blocks.powerconnections = МакÑимальна кількіÑть з’єднань -blocks.poweruse = Енергії викориÑтовує -blocks.powerdamage = Енергії за од. шкоди -blocks.itemcapacity = МіÑткіÑть предметів -blocks.memorycapacity = ЄмніÑть пам’Ñті -blocks.basepowergeneration = Базова Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— -blocks.productiontime = Ð§Ð°Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° -blocks.repairtime = Ð§Ð°Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ -blocks.speedincrease = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті -blocks.range = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— -blocks.drilltier = Видобуває -blocks.drillspeed = Базова швидкіÑть Ð±ÑƒÑ€Ñ–Ð½Ð½Ñ -blocks.boosteffect = ПриÑкорювальний ефект -blocks.maxunits = МакÑимальна кількіÑть активних одиниць -blocks.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ -blocks.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -blocks.maxconsecutive = МакÑимальна поÑлідовніÑть -blocks.buildcost = ВартіÑть Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -blocks.inaccuracy = Розкид -blocks.shots = ПоÑтріли -blocks.reload = ПоÑтріли/Ñекунду -blocks.ammo = БоєприпаÑи -blocks.shieldhealth = МіцніÑть щита -blocks.cooldowntime = ТриваліÑть Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ +stat.powercapacity = МіÑткіÑть енергії +stat.powershot = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ Ð·Ð° поÑтріл +stat.damage = Шкода +stat.targetsair = ПовітрÑні противники +stat.targetsground = Ðаземні противники +stat.itemsmoved = ШвидкіÑть Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ +stat.launchtime = Ð§Ð°Ñ Ð¼Ñ–Ð¶ запуÑками +stat.shootrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— +stat.size = Розмір +stat.displaysize = Розмір диÑплею +stat.liquidcapacity = Рідинна міÑткіÑть +stat.powerrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– енергії +stat.linkrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ +stat.instructions = ІнÑтрукції +stat.powerconnections = МакÑимальна кількіÑть з’єднань +stat.poweruse = Енергії викориÑтовує +stat.powerdamage = Енергії за од. шкоди +stat.itemcapacity = МіÑткіÑть предметів +stat.memorycapacity = ЄмніÑть пам’Ñті +stat.basepowergeneration = Базова Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— +stat.productiontime = Ð§Ð°Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° +stat.repairtime = Ð§Ð°Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ +stat.speedincrease = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті +stat.range = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— +stat.drilltier = Видобуває +stat.drillspeed = Базова швидкіÑть Ð±ÑƒÑ€Ñ–Ð½Ð½Ñ +stat.boosteffect = ПриÑкорювальний ефект +stat.maxunits = МакÑимальна кількіÑть активних одиниць +stat.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ +stat.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.maxconsecutive = МакÑимальна поÑлідовніÑть +stat.buildcost = ВартіÑть Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.inaccuracy = Розкид +stat.shots = ПоÑтріли +stat.reload = ПоÑтріли/Ñекунду +stat.ammo = БоєприпаÑи +stat.shieldhealth = МіцніÑть щита +stat.cooldowntime = ТриваліÑть Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ bar.drilltierreq = ПотребуєтьÑÑ ÐºÑ€Ð°Ñ‰Ð¸Ð¹ бур bar.noresources = Бракує реÑурÑів @@ -1300,4 +1300,4 @@ block.cyclone.description = Велика протиповітрÑна та пр block.spectre.description = МаÑивна двоÑтвольна гармата. СтрілÑÑ” великими бронебійними кулÑми в повітрÑні та наземні цілі. block.meltdown.description = МаÑивна лазерна гармата. ЗарÑджає Ñ– ÑтрілÑÑ” лазерним променем у найближчих противників. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потрібен теплоноÑій. block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю. -block.segment.description = Пошкоджує та руйнує вхідні ÑнарÑди. Окрім лазерних. +block.segment.description = Пошкоджує та руйнує вхідні ÑнарÑди. Окрім лазерних. \ No newline at end of file diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 5c5c529ae2..5744d3d0fd 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -570,49 +570,49 @@ info.title = [accent]详情 error.title = [crimson]å‘生了一个错误 error.crashtitle = å‘生了一个错误 unit.nobuild = [scarlet]å•使œªèƒ½å»ºé€  -blocks.input = 输入 -blocks.output = 输出 -blocks.booster = 增强物å“/液体 -blocks.tiles = 所需地型 -blocks.affinities = 相关 +stat.input = 输入 +stat.output = 输出 +stat.booster = 增强物å“/液体 +stat.tiles = 所需地型 +stat.affinities = 相关 block.unknown = [lightgray]??? -blocks.powercapacity = 能é‡å®¹é‡ -blocks.powershot = 能é‡/å‘å°„ -blocks.damage = 伤害 -blocks.targetsair = 攻击空中å•ä½ -blocks.targetsground = 攻击地é¢å•ä½ -blocks.itemsmoved = 移动速度 -blocks.launchtime = å‘射间隔时间 -blocks.shootrange = 范围 -blocks.size = 尺寸 -blocks.displaysize = 显示尺寸 -blocks.liquidcapacity = æ¶²ä½“å®¹é‡ -blocks.powerrange = 能é‡èŒƒå›´ -blocks.linkrange = 连接范围 -blocks.instructions = æŒ‡ä»¤æ•°é‡ -blocks.powerconnections = 最多连接 -blocks.poweruse = ä½¿ç”¨èƒ½é‡ -blocks.powerdamage = 功率/æŸä¼¤ -blocks.itemcapacity = 物å“å®¹é‡ -blocks.basepowergeneration = 基础能æºè¾“出 -blocks.productiontime = 生产时间 -blocks.repairtime = å»ºç­‘å®Œå…¨ä¿®å¤æ—¶é—´ -blocks.speedincrease = æé€Ÿ -blocks.range = 范围 -blocks.drilltier = å¯é’»æŽ¢çŸ¿ç‰© -blocks.drillspeed = 基础钻探速度 -blocks.boosteffect = 增强效果 -blocks.maxunits = 最大å•使•°é‡ -blocks.health = 生命值 -blocks.buildtime = 建造时间 -blocks.maxconsecutive = 最大连续 -blocks.buildcost = 建造花费 -blocks.inaccuracy = 误差 -blocks.shots = å‘å°„æ•° -blocks.reload = æ¯ç§’å‘å°„æ•° -blocks.ammo = å¼¹è¯ -blocks.shieldhealth = 盾容 -blocks.cooldowntime = 冷崿—¶é—´ +stat.powercapacity = 能é‡å®¹é‡ +stat.powershot = 能é‡/å‘å°„ +stat.damage = 伤害 +stat.targetsair = 攻击空中å•ä½ +stat.targetsground = 攻击地é¢å•ä½ +stat.itemsmoved = 移动速度 +stat.launchtime = å‘射间隔时间 +stat.shootrange = 范围 +stat.size = 尺寸 +stat.displaysize = 显示尺寸 +stat.liquidcapacity = æ¶²ä½“å®¹é‡ +stat.powerrange = 能é‡èŒƒå›´ +stat.linkrange = 连接范围 +stat.instructions = æŒ‡ä»¤æ•°é‡ +stat.powerconnections = 最多连接 +stat.poweruse = ä½¿ç”¨èƒ½é‡ +stat.powerdamage = 功率/æŸä¼¤ +stat.itemcapacity = 物å“å®¹é‡ +stat.basepowergeneration = 基础能æºè¾“出 +stat.productiontime = 生产时间 +stat.repairtime = å»ºç­‘å®Œå…¨ä¿®å¤æ—¶é—´ +stat.speedincrease = æé€Ÿ +stat.range = 范围 +stat.drilltier = å¯é’»æŽ¢çŸ¿ç‰© +stat.drillspeed = 基础钻探速度 +stat.boosteffect = 增强效果 +stat.maxunits = 最大å•使•°é‡ +stat.health = 生命值 +stat.buildtime = 建造时间 +stat.maxconsecutive = 最大连续 +stat.buildcost = 建造花费 +stat.inaccuracy = 误差 +stat.shots = å‘å°„æ•° +stat.reload = æ¯ç§’å‘å°„æ•° +stat.ammo = å¼¹è¯ +stat.shieldhealth = 盾容 +stat.cooldowntime = 冷崿—¶é—´ bar.drilltierreq = éœ€è¦æ›´å¥½çš„钻头 bar.noresources = ç¼ºå¤±èµ„æº @@ -1302,4 +1302,4 @@ block.cyclone.description = 大型炮塔,对空对地,å‘射在敌人周围 block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的破甲弹。 block.meltdown.description = è¶…å¤§åž‹æ¿€å…‰ç‚®å¡”ï¼Œå……èƒ½ä¹‹åŽæŒç»­å‘å°„å…‰æŸï¼Œéœ€è¦å†·å´å‰‚。 block.repair-point.description = æŒç»­æ²»ç–—å…¶é™„è¿‘å—æŸæœ€ä¸¥é‡çš„å•ä½ã€‚ -block.segment.description = æ‘§æ¯è¢­æ¥çš„除激光以外的å­å¼¹æˆ–导弹. +block.segment.description = æ‘§æ¯è¢­æ¥çš„除激光以外的å­å¼¹æˆ–导弹. \ No newline at end of file diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 85efa9a527..e495f4b768 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -570,49 +570,49 @@ info.title = 資訊 error.title = [crimson]發生錯誤 error.crashtitle = 發生錯誤 unit.nobuild = [scarlet]å–®ä½ä¸èƒ½å»ºé€  -blocks.input = 輸入 -blocks.output = 輸出 -blocks.booster = 強化 -blocks.tiles = 需求方塊 -blocks.affinities = 親和方塊 +stat.input = 輸入 +stat.output = 輸出 +stat.booster = 強化 +stat.tiles = 需求方塊 +stat.affinities = 親和方塊 block.unknown = [lightgray]??? -blocks.powercapacity = è“„é›»é‡ -blocks.powershot = 能é‡/射擊 -blocks.damage = 傷害 -blocks.targetsair = 攻擊空中目標 -blocks.targetsground = 攻擊地é¢ç›®æ¨™ -blocks.itemsmoved = 移動速度 -blocks.launchtime = 發射間隔 -blocks.shootrange = ç¯„åœ -blocks.size = 尺寸 -blocks.displaysize = Display Size -blocks.liquidcapacity = æ¶²é«”å®¹é‡ -blocks.powerrange = è¼¸å‡ºç¯„åœ -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 最大連接數 -blocks.poweruse = 能é‡ä½¿ç”¨ -blocks.powerdamage = 能é‡/傷害 -blocks.itemcapacity = 物å“å®¹é‡ -blocks.basepowergeneration = 基礎能é‡ç”Ÿç”¢ -blocks.productiontime = 生產時間 -blocks.repairtime = 方塊完全修復時間 -blocks.speedincrease = 速度æå‡ -blocks.range = ç¯„åœ -blocks.drilltier = å¯é‘½å–礦物 -blocks.drillspeed = 基本鑽å–速度 -blocks.boosteffect = æå‡æ•ˆæ‡‰ -blocks.maxunits = 最大活èºå–®ä½ -blocks.health = è€ä¹…度 -blocks.buildtime = 建設時間 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = å»ºé€ æˆæœ¬ -blocks.inaccuracy = 誤差 -blocks.shots = 射擊數 -blocks.reload = 射擊次數/ç§’ -blocks.ammo = 彈藥 -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.powercapacity = è“„é›»é‡ +stat.powershot = 能é‡/射擊 +stat.damage = 傷害 +stat.targetsair = 攻擊空中目標 +stat.targetsground = 攻擊地é¢ç›®æ¨™ +stat.itemsmoved = 移動速度 +stat.launchtime = 發射間隔 +stat.shootrange = ç¯„åœ +stat.size = 尺寸 +stat.displaysize = Display Size +stat.liquidcapacity = æ¶²é«”å®¹é‡ +stat.powerrange = è¼¸å‡ºç¯„åœ +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = 最大連接數 +stat.poweruse = 能é‡ä½¿ç”¨ +stat.powerdamage = 能é‡/傷害 +stat.itemcapacity = 物å“å®¹é‡ +stat.basepowergeneration = 基礎能é‡ç”Ÿç”¢ +stat.productiontime = 生產時間 +stat.repairtime = 方塊完全修復時間 +stat.speedincrease = 速度æå‡ +stat.range = ç¯„åœ +stat.drilltier = å¯é‘½å–礦物 +stat.drillspeed = 基本鑽å–速度 +stat.boosteffect = æå‡æ•ˆæ‡‰ +stat.maxunits = 最大活èºå–®ä½ +stat.health = è€ä¹…度 +stat.buildtime = 建設時間 +stat.maxconsecutive = Max Consecutive +stat.buildcost = å»ºé€ æˆæœ¬ +stat.inaccuracy = 誤差 +stat.shots = 射擊數 +stat.reload = 射擊次數/ç§’ +stat.ammo = 彈藥 +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time bar.drilltierreq = éœ€è¦æ›´å¥½çš„鑽頭 bar.noresources = Missing Resources @@ -1302,4 +1302,4 @@ block.cyclone.description = 一種å°ç©ºå’Œå°åœ°çš„大型砲塔。å‘附近單 block.spectre.description = 一種雙炮管的巨型砲塔。å‘空中åŠåœ°é¢æ•µäººç™¼å°„大型的穿甲彈。 block.meltdown.description = 一種巨型激光砲塔。充能並發射æŒçºŒæ€§çš„æ¿€å…‰å…‰æŸã€‚需è¦å†·å»æ¶²ä»¥é‹ä½œã€‚ block.repair-point.description = æŒçºŒæ²»ç™‚é™„è¿‘æœ€è¿‘çš„å—æå–®ä½ã€‚ -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. \ No newline at end of file diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 7d39da5176..41f14074c8 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -23,7 +23,7 @@ public class GameState{ /** The current game rules. */ public Rules rules = new Rules(); /** Statistics for this save/game. Displayed after game over. */ - public Stats stats = new Stats(); + public GameStats stats = new GameStats(); /** Global attributes of the environment, calculated by weather. */ public Attributes envAttrs = new Attributes(); /** Sector information. Only valid in the campaign. */ diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 21b72374ec..727fad8bed 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -10,11 +10,14 @@ import mindustry.game.EventType.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ + /** Stat storage for this content. Initialized on demand. */ + public Stats stats = new Stats(); /** Localized, formal name. Never null. Set to internal name if not found in bundle. */ public String localizedName; /** Localized description. May be null. */ @@ -38,6 +41,20 @@ public abstract class UnlockableContent extends MappableContent{ return minfo.mod == null ? description : description + "\n" + Core.bundle.format("mod.display", minfo.mod.meta.displayName()); } + /** Checks stat initialization state. Call before displaying stats. */ + public void checkStats(){ + if(!stats.intialized){ + setStats(); + stats.intialized = true; + } + } + + /** Intializes stats on demand. Should only be called once. Only called before something is displayed. */ + @CallSuper + public void setStats(){ + stats.intialized = true; + } + /** Generate any special icons for this content. Called asynchronously.*/ @CallSuper public void createIcons(MultiPacker packer){ @@ -73,7 +90,9 @@ public abstract class UnlockableContent extends MappableContent{ } /** This should show all necessary info about this content in the specified table. */ - public abstract void displayInfo(Table table); + public void display(Table table){ + + } /** Called when this content is unlocked. Use this to unlock other related content. */ public void onUnlock(){ diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/GameStats.java similarity index 99% rename from core/src/mindustry/game/Stats.java rename to core/src/mindustry/game/GameStats.java index b963223518..8108f2ddad 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/GameStats.java @@ -6,7 +6,7 @@ import mindustry.type.*; //TODO more stats: //- units constructed -public class Stats{ +public class GameStats{ /** Total items delivered to global resoure counter. Campaign only. */ public ObjectIntMap itemsDelivered = new ObjectIntMap<>(); /** Enemy (red team) units destroyed. */ diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index f305d661fc..906d96d56e 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -352,6 +352,8 @@ public class DesktopInput extends InputHandler{ table.button(Icon.map, Styles.clearPartiali, () -> { ui.planet.show(); }).visible(() -> state.isCampaign()).tooltip("@planetmap"); + + table.add(); } void pollInput(){ diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index e153b74587..b76a5156e8 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -105,7 +105,7 @@ public abstract class SaveVersion extends SaveFileReader{ state.wave = map.getInt("wave"); state.wavetime = map.getFloat("wavetime", state.rules.waveSpacing); - state.stats = JsonIO.read(Stats.class, map.get("stats", "{}")); + state.stats = JsonIO.read(GameStats.class, map.get("stats", "{}")); state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); lastReadBuild = map.getInt("build", -1); diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index 9329efb47e..d245902a39 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -1,11 +1,10 @@ package mindustry.type; import arc.graphics.*; -import arc.scene.ui.layout.*; import arc.struct.*; import mindustry.ctype.*; -import mindustry.ui.*; import mindustry.world.blocks.environment.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -36,8 +35,10 @@ public class Item extends UnlockableContent{ } @Override - public void displayInfo(Table table){ - ContentDisplay.displayItem(table, this); + public void setStats(){ + stats.addPercent(Stat.explosiveness, explosiveness); + stats.addPercent(Stat.flammability, flammability); + stats.addPercent(Stat.radioactivity, radioactivity); } @Override diff --git a/core/src/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java index 19e77a9987..3c4fe8eaf7 100644 --- a/core/src/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -1,11 +1,10 @@ package mindustry.type; import arc.graphics.*; -import arc.scene.ui.layout.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; -import mindustry.ui.*; +import mindustry.world.meta.*; public class Liquid extends UnlockableContent{ /** Color used in pipes and on the ground. */ @@ -46,8 +45,12 @@ public class Liquid extends UnlockableContent{ } @Override - public void displayInfo(Table table){ - ContentDisplay.displayLiquid(table, this); + public void setStats(){ + stats.addPercent(Stat.explosiveness, explosiveness); + stats.addPercent(Stat.flammability, flammability); + stats.addPercent(Stat.temperature, temperature); + stats.addPercent(Stat.heatCapacity, heatCapacity); + stats.addPercent(Stat.viscosity, viscosity); } @Override diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index ad7fb066be..4550ae6805 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -5,7 +5,6 @@ import arc.func.*; import arc.graphics.*; import arc.math.*; import arc.math.geom.*; -import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.noise.*; @@ -259,11 +258,6 @@ public class Planet extends UnlockableContent{ return true; } - @Override - public void displayInfo(Table table){ - - } - @Override public ContentType getContentType(){ return ContentType.planet; diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index f08374fa70..0e9b90fb30 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -2,7 +2,6 @@ package mindustry.type; import arc.func.*; import arc.graphics.g2d.*; -import arc.scene.ui.layout.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; @@ -39,11 +38,6 @@ public class SectorPreset extends UnlockableContent{ return true; } - //neither of these are implemented, as zones are not displayed in a normal fashion... yet - @Override - public void displayInfo(Table table){ - } - @Override public ContentType getContentType(){ return ContentType.sector; diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 5c48f8165e..55c1784fd3 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -29,6 +29,7 @@ import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.units.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; +import mindustry.world.meta.values.*; import static mindustry.Vars.*; @@ -42,7 +43,7 @@ public class UnitType extends UnlockableContent{ public Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); public float speed = 1.1f, boostMultiplier = 1f, rotateSpeed = 5f, baseRotateSpeed = 5f; public float drag = 0.3f, accel = 0.5f, landShake = 0f, rippleScale = 1f, fallSpeed = 0.018f; - public float health = 200f, range = -1, armor = 0f; + public float health = 200f, range = -1, armor = 0f, maxRange = -1f; public float crashDamageMultiplier = 1f; public boolean targetAir = true, targetGround = true; public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false; @@ -190,10 +191,21 @@ public class UnitType extends UnlockableContent{ } } - @Override - public void displayInfo(Table table){ - ContentDisplay.displayUnit(table, this); + public void setStats(){ + Unit inst = constructor.get(); + + stats.add(Stat.health, health); + stats.add(Stat.speed, speed); + stats.add(Stat.itemCapacity, health); + stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks); + //TODO abilities, maybe try something like DPS + + if(inst instanceof Minerc && mineTier >= 1){ + stats.addPercent(Stat.mineSpeed, mineSpeed); + stats.add(Stat.mineTier, new BlockFilterValue(b -> b instanceof Floor f && f.itemDrop != null && f.itemDrop.hardness <= mineTier && !f.playerUnmineable)); + } + if(inst instanceof Builderc) stats.addPercent(Stat.buildSpeed, buildSpeed); } @CallSuper @@ -219,8 +231,10 @@ public class UnitType extends UnlockableContent{ //set up default range if(range < 0){ range = Float.MAX_VALUE; + maxRange = 0f; for(Weapon weapon : weapons){ range = Math.min(range, weapon.bullet.range() + hitSize /2f); + maxRange = Math.max(maxRange, weapon.bullet.range() + hitSize /2f); } } @@ -324,7 +338,7 @@ public class UnitType extends UnlockableContent{ if(stacks != null){ ItemStack[] out = new ItemStack[stacks.length]; for(int i = 0; i < out.length; i++){ - out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50))); + out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1) * 50))); } return out; diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 8fb30aecb6..86e44c0174 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -4,7 +4,6 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.scene.ui.layout.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -91,11 +90,6 @@ public abstract class Weather extends UnlockableContent{ } - @Override - public void displayInfo(Table table){ - //do not - } - @Override public boolean isHidden(){ return true; diff --git a/core/src/mindustry/ui/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java deleted file mode 100644 index 6eefedcd53..0000000000 --- a/core/src/mindustry/ui/ContentDisplay.java +++ /dev/null @@ -1,165 +0,0 @@ -package mindustry.ui; - -import arc.*; -import arc.graphics.*; -import arc.scene.ui.layout.*; -import arc.struct.*; -import arc.util.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.type.*; -import mindustry.world.*; -import mindustry.world.meta.*; - -public class ContentDisplay{ - - public static void displayBlock(Table table, Block block){ - - table.table(title -> { - int size = 8 * 6; - - title.image(block.icon(Cicon.xlarge)).size(size); - title.add("[accent]" + block.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(block.description != null){ - table.add(block.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); - table.row(); - } - - BlockStats stats = block.stats; - - for(StatCategory cat : stats.toMap().keys()){ - OrderedMap> map = stats.toMap().get(cat); - - if(map.size == 0) continue; - - table.add("@category." + cat.name()).color(Pal.accent).fillX(); - table.row(); - - for(BlockStat stat : map.keys()){ - table.table(inset -> { - inset.left(); - inset.add("[lightgray]" + stat.localized() + ":[] ").left(); - Seq arr = map.get(stat); - for(StatValue value : arr){ - value.display(inset); - inset.add().size(10f); - } - - }).fillX().padLeft(10); - table.row(); - } - } - } - - public static void displayItem(Table table, Item item){ - - table.table(title -> { - title.image(item.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + item.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(item.description != null){ - table.add(item.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - table.add(Core.bundle.format("item.explosiveness", (int)(item.explosiveness * 100))); - table.row(); - table.add(Core.bundle.format("item.flammability", (int)(item.flammability * 100))); - table.row(); - table.add(Core.bundle.format("item.radioactivity", (int)(item.radioactivity * 100))); - table.row(); - } - - public static void displayLiquid(Table table, Liquid liquid){ - - table.table(title -> { - title.image(liquid.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + liquid.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(liquid.description != null){ - table.add(liquid.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - table.add(Core.bundle.format("item.explosiveness", (int)(liquid.explosiveness * 100))); - table.row(); - table.add(Core.bundle.format("item.flammability", (int)(liquid.flammability * 100))); - table.row(); - table.add(Core.bundle.format("liquid.heatcapacity", (int)(liquid.heatCapacity * 100))); - table.row(); - table.add(Core.bundle.format("liquid.temperature", (int)(liquid.temperature * 100))); - table.row(); - table.add(Core.bundle.format("liquid.viscosity", (int)(liquid.viscosity * 100))); - table.row(); - } - - public static void displayUnit(Table table, UnitType unit){ - table.table(title -> { - title.image(unit.icon(Cicon.xlarge)).size(8 * 6).scaling(Scaling.fit); - title.add("[accent]" + unit.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(unit.description != null){ - table.add(unit.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - Unit inst = unit.constructor.get(); - - //TODO more stats - table.add(Core.bundle.format("unit.health", unit.health)).row(); - table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))).row(); - table.add(Core.bundle.format("unit.itemcapacity", unit.itemCapacity)).row(); - - if(inst instanceof Minerc) table.add(Core.bundle.format("unit.minespeed", (int)(unit.mineSpeed * 100f))).row(); - if(inst instanceof Builderc) table.add(Core.bundle.format("unit.buildspeed", (int)(unit.buildSpeed * 100f))).row(); - - table.row(); - } -} diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 0ee1960f9f..89cf556cb1 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -1,8 +1,14 @@ package mindustry.ui.dialogs; +import arc.graphics.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; import mindustry.ctype.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.meta.*; public class ContentInfoDialog extends BaseDialog{ @@ -18,11 +24,62 @@ public class ContentInfoDialog extends BaseDialog{ Table table = new Table(); table.margin(10); - content.displayInfo(table); + //initialize stats if they haven't been yet + content.checkStats(); + + table.table(title1 -> { + int size = 8 * 6; + + title1.image(content.icon(Cicon.xlarge)).size(size).scaling(Scaling.fit); + title1.add("[accent]" + content.localizedName).padLeft(5); + }); + + table.row(); + + table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); + + table.row(); + + if(content.description != null){ + table.add(content.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); + table.row(); + + table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); + table.row(); + } + + Stats stats = content.stats; + + for(StatCat cat : stats.toMap().keys()){ + OrderedMap> map = stats.toMap().get(cat); + + if(map.size == 0) continue; + + //TODO check + if(stats.useCategories){ + table.add("@category." + cat.name()).color(Pal.accent).fillX(); + table.row(); + } + + for(Stat stat : map.keys()){ + table.table(inset -> { + inset.left(); + inset.add("[lightgray]" + stat.localized() + ":[] ").left(); + Seq arr = map.get(stat); + for(StatValue value : arr){ + value.display(inset); + inset.add().size(10f); + } + + }).fillX().padLeft(10); + table.row(); + } + } ScrollPane pane = new ScrollPane(table); cont.add(pane); show(); } + } diff --git a/core/src/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java index b9967e6564..ceea590826 100644 --- a/core/src/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -2,7 +2,7 @@ package mindustry.ui.dialogs; import arc.*; import mindustry.game.EventType.*; -import mindustry.game.Stats.*; +import mindustry.game.GameStats.*; import mindustry.game.*; import mindustry.type.*; import mindustry.ui.*; diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 6ccd5855d2..f977a24743 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -51,7 +51,6 @@ public class Block extends UnlockableContent{ public float liquidCapacity = 10f; public float liquidPressure = 1f; - public final BlockStats stats = new BlockStats(); public final BlockBars bars = new BlockBars(); public final Consumers consumes = new Consumers(); @@ -321,23 +320,26 @@ public class Block extends UnlockableContent{ return update || destructible; } + @Override public void setStats(){ - stats.add(BlockStat.size, "@x@", size, size); - stats.add(BlockStat.health, health, StatUnit.none); + super.setStats(); + + stats.add(Stat.size, "@x@", size, size); + stats.add(Stat.health, health, StatUnit.none); if(canBeBuilt()){ - stats.add(BlockStat.buildTime, buildCost / 60, StatUnit.seconds); - stats.add(BlockStat.buildCost, new ItemListValue(false, requirements)); + stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds); + stats.add(Stat.buildCost, new ItemListValue(false, requirements)); } if(instantTransfer){ - stats.add(BlockStat.maxConsecutive, 2, StatUnit.none); + stats.add(Stat.maxConsecutive, 2, StatUnit.none); } consumes.display(stats); - // Note: Power stats are added by the consumers. - if(hasLiquids) stats.add(BlockStat.liquidCapacity, liquidCapacity, StatUnit.liquidUnits); - if(hasItems && itemCapacity > 0) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items); + //Note: Power stats are added by the consumers. + if(hasLiquids) stats.add(Stat.liquidCapacity, liquidCapacity, StatUnit.liquidUnits); + if(hasItems && itemCapacity > 0) stats.add(Stat.itemCapacity, itemCapacity, StatUnit.items); } public void setBars(){ @@ -634,11 +636,6 @@ public class Block extends UnlockableContent{ } } - @Override - public void displayInfo(Table table){ - ContentDisplay.displayBlock(table, this); - } - @Override public ContentType getContentType(){ return ContentType.block; @@ -669,9 +666,10 @@ public class Block extends UnlockableContent{ if(consumes.has(ConsumeType.item)) hasItems = true; if(consumes.has(ConsumeType.liquid)) hasLiquids = true; - setStats(); setBars(); + stats.useCategories = true; + consumes.init(); if(!outputsPower && consumes.hasPower() && consumes.getPower().buffered){ diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 726e14cd8a..ff069acc48 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -42,7 +42,7 @@ public class LaunchPad extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.launchTime, launchTime / 60f, StatUnit.seconds); + stats.add(Stat.launchTime, launchTime / 60f, StatUnit.seconds); } @Override diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index 3b90533745..46fb01d7d5 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -61,11 +61,11 @@ public class ForceProjector extends Block{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.shieldHealth, breakage, StatUnit.none); - stats.add(BlockStat.cooldownTime, (int) (breakage / cooldownBrokenBase / 60f), StatUnit.seconds); - stats.add(BlockStat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond); - stats.add(BlockStat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); - stats.add(BlockStat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth); + stats.add(Stat.shieldHealth, breakage, StatUnit.none); + stats.add(Stat.cooldownTime, (int) (breakage / cooldownBrokenBase / 60f), StatUnit.seconds); + stats.add(Stat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond); + stats.add(Stat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); + stats.add(Stat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth); } @Override diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 2bc50d6d7a..cf71928f26 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -44,11 +44,11 @@ public class MendProjector extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.repairTime, (int)(100f / healPercent * reload / 60f), StatUnit.seconds); - stats.add(BlockStat.range, range / tilesize, StatUnit.blocks); + stats.add(Stat.repairTime, (int)(100f / healPercent * reload / 60f), StatUnit.seconds); + stats.add(Stat.range, range / tilesize, StatUnit.blocks); - stats.add(BlockStat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); - stats.add(BlockStat.boostEffect, (phaseBoost + healPercent) / healPercent, StatUnit.timesSpeed); + stats.add(Stat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); + stats.add(Stat.boostEffect, (phaseBoost + healPercent) / healPercent, StatUnit.timesSpeed); } @Override diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index ae3c10f3fd..7cadaede81 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -51,13 +51,13 @@ public class OverdriveProjector extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.speedIncrease, (int)(100f * speedBoost), StatUnit.percent); - stats.add(BlockStat.range, range / tilesize, StatUnit.blocks); - stats.add(BlockStat.productionTime, useTime / 60f, StatUnit.seconds); + stats.add(Stat.speedIncrease, (int)(100f * speedBoost), StatUnit.percent); + stats.add(Stat.range, range / tilesize, StatUnit.blocks); + stats.add(Stat.productionTime, useTime / 60f, StatUnit.seconds); if(hasBoost){ - stats.add(BlockStat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); - stats.add(BlockStat.boostEffect, (int)((speedBoost + speedBoostPhase) * 100f), StatUnit.percent); + stats.add(Stat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); + stats.add(Stat.boostEffect, (int)((speedBoost + speedBoostPhase) * 100f), StatUnit.percent); } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java index 824492cff5..e10b1612e9 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java @@ -48,7 +48,7 @@ public abstract class BaseTurret extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); + stats.add(Stat.shootRange, range / tilesize, StatUnit.blocks); } public class BaseTurretBuild extends Building implements Ranged{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 521e6dc19b..8544ca2cce 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -35,8 +35,8 @@ public class ItemTurret extends Turret{ public void setStats(){ super.setStats(); - stats.remove(BlockStat.itemCapacity); - stats.add(BlockStat.ammo, new AmmoListValue<>(ammoTypes)); + stats.remove(Stat.itemCapacity); + stats.add(Stat.ammo, new AmmoListValue<>(ammoTypes)); consumes.add(new ConsumeItemFilter(i -> ammoTypes.containsKey(i)){ @Override public void build(Building tile, Table table){ @@ -54,7 +54,7 @@ public class ItemTurret extends Turret{ } @Override - public void display(BlockStats stats){ + public void display(Stats stats){ //don't display } }); diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index c47a279414..3aefcdd33c 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -33,11 +33,11 @@ public class LaserTurret extends PowerTurret{ public void setStats(){ super.setStats(); - stats.remove(BlockStat.booster); - stats.add(BlockStat.input, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, false, l -> consumes.liquidfilters.get(l.id))); - stats.remove(BlockStat.damage); + stats.remove(Stat.booster); + stats.add(Stat.input, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, false, l -> consumes.liquidfilters.get(l.id))); + stats.remove(Stat.damage); //damages every 5 ticks, at least in meltdown's case - stats.add(BlockStat.damage, shootType.damage * 60f / 5f, StatUnit.perSecond); + stats.add(Stat.damage, shootType.damage * 60f / 5f, StatUnit.perSecond); } public class LaserTurretBuild extends PowerTurretBuild{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 11d6213aa5..15716b4a94 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -36,7 +36,7 @@ public class LiquidTurret extends Turret{ public void setStats(){ super.setStats(); - stats.add(BlockStat.ammo, new AmmoListValue<>(ammoTypes)); + stats.add(Stat.ammo, new AmmoListValue<>(ammoTypes)); consumes.add(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){ @Override public boolean valid(Building entity){ @@ -49,7 +49,7 @@ public class LiquidTurret extends Turret{ } @Override - public void display(BlockStats stats){ + public void display(Stats stats){ } }); diff --git a/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java index e4b7b68628..0184f9ff7a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java @@ -48,7 +48,7 @@ public class PointDefenseTurret extends ReloadTurret{ public void setStats(){ super.setStats(); - stats.add(BlockStat.reload, 60f / reloadTime, StatUnit.none); + stats.add(Stat.reload, 60f / reloadTime, StatUnit.none); } public class PointDefenseBuild extends ReloadTurretBuild{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java index 85e5243e2f..bf365f4439 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -16,7 +16,7 @@ public class PowerTurret extends Turret{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.damage, shootType.damage, StatUnit.none); + stats.add(Stat.damage, shootType.damage, StatUnit.none); } @Override diff --git a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java index b53c2feb03..33538771a1 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java @@ -21,7 +21,7 @@ public abstract class ReloadTurret extends BaseTurret{ super.setStats(); if(acceptCoolant){ - stats.add(BlockStat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); + stats.add(Stat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java index b40c738a35..debe26f7e6 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java @@ -50,9 +50,9 @@ public class TractorBeamTurret extends BaseTurret{ public void setStats(){ super.setStats(); - stats.add(BlockStat.targetsAir, targetAir); - stats.add(BlockStat.targetsGround, targetGround); - stats.add(BlockStat.damage, damage * 60f, StatUnit.perSecond); + stats.add(Stat.targetsAir, targetAir); + stats.add(Stat.targetsGround, targetGround); + stats.add(Stat.damage, damage * 60f, StatUnit.perSecond); } public class TractorBeamBuild extends BaseTurretBuild{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 7040f83759..2361c429af 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -101,13 +101,13 @@ public abstract class Turret extends ReloadTurret{ public void setStats(){ super.setStats(); - stats.add(BlockStat.inaccuracy, (int)inaccuracy, StatUnit.degrees); - stats.add(BlockStat.reload, 60f / reloadTime * shots, StatUnit.none); - stats.add(BlockStat.targetsAir, targetAir); - stats.add(BlockStat.targetsGround, targetGround); + stats.add(Stat.inaccuracy, (int)inaccuracy, StatUnit.degrees); + stats.add(Stat.reload, 60f / reloadTime * shots, StatUnit.none); + stats.add(Stat.targetsAir, targetAir); + stats.add(Stat.targetsGround, targetGround); if(acceptCoolant){ - stats.add(BlockStat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); + stats.add(Stat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); } } diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index 60ab45f159..9ad1f01bea 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -52,7 +52,7 @@ public class Conveyor extends Block implements Autotiler{ super.setStats(); //have to add a custom calculated speed, since the actual movement speed is apparently not linear - stats.add(BlockStat.itemsMoved, displayedSpeed, StatUnit.itemsSecond); + stats.add(Stat.itemsMoved, displayedSpeed, StatUnit.itemsSecond); } @Override diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index 3327c62c15..f3c400ad9b 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -53,7 +53,7 @@ public class StackConveyor extends Block implements Autotiler{ public void setStats(){ super.setStats(); - stats.add(BlockStat.itemsMoved, Mathf.round(itemCapacity * speed * 60), StatUnit.itemsSecond); + stats.add(Stat.itemsMoved, Mathf.round(itemCapacity * speed * 60), StatUnit.itemsSecond); } @Override diff --git a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 09e5b70bb0..80881e2c17 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -14,7 +14,7 @@ public class LiquidJunction extends LiquidBlock{ @Override public void setStats(){ super.setStats(); - stats.remove(BlockStat.liquidCapacity); + stats.remove(Stat.liquidCapacity); } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index 0f2fce78ba..e1b5c857e4 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -117,8 +117,8 @@ public class LogicBlock extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.linkRange, range / 8, StatUnit.blocks); - stats.add(BlockStat.instructions, instructionsPerTick * 60, StatUnit.perSecond); + stats.add(Stat.linkRange, range / 8, StatUnit.blocks); + stats.add(Stat.instructions, instructionsPerTick * 60, StatUnit.perSecond); } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index cb062259b8..505791e1b0 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -38,7 +38,7 @@ public class LogicDisplay extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.displaySize, "@x@", displaySize, displaySize); + stats.add(Stat.displaySize, "@x@", displaySize, displaySize); } public class LogicDisplayBuild extends Building{ diff --git a/core/src/mindustry/world/blocks/logic/MemoryBlock.java b/core/src/mindustry/world/blocks/logic/MemoryBlock.java index d215238ced..0329744168 100644 --- a/core/src/mindustry/world/blocks/logic/MemoryBlock.java +++ b/core/src/mindustry/world/blocks/logic/MemoryBlock.java @@ -18,7 +18,7 @@ public class MemoryBlock extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.memoryCapacity, memoryCapacity, StatUnit.none); + stats.add(Stat.memoryCapacity, memoryCapacity, StatUnit.none); } public class MemoryBuild extends Building{ diff --git a/core/src/mindustry/world/blocks/power/ImpactReactor.java b/core/src/mindustry/world/blocks/power/ImpactReactor.java index a24fecf2b4..f5dc985d1e 100644 --- a/core/src/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/mindustry/world/blocks/power/ImpactReactor.java @@ -55,7 +55,7 @@ public class ImpactReactor extends PowerGenerator{ super.setStats(); if(hasItems){ - stats.add(BlockStat.productionTime, itemDuration / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, itemDuration / 60f, StatUnit.seconds); } } diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index 2d82bfa4c7..12b3f6d691 100644 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -72,7 +72,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ super.setStats(); if(hasItems){ - stats.add(BlockStat.productionTime, itemDuration / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, itemDuration / 60f, StatUnit.seconds); } } diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index 2553426092..85fe183993 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -56,7 +56,7 @@ public class NuclearReactor extends PowerGenerator{ super.setStats(); if(hasItems){ - stats.add(BlockStat.productionTime, itemDuration / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, itemDuration / 60f, StatUnit.seconds); } } diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index 24053e70a7..ae9453d675 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -12,7 +12,7 @@ import mindustry.world.meta.*; public class PowerGenerator extends PowerDistributor{ /** The amount of power produced per tick in case of an efficiency of 1.0, which represents 100%. */ public float powerProduction; - public BlockStat generationType = BlockStat.basePowerGeneration; + public Stat generationType = Stat.basePowerGeneration; public PowerGenerator(String name){ super(name); diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index 5d033c99b7..042b03099e 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -124,8 +124,8 @@ public class PowerNode extends PowerBlock{ public void setStats(){ super.setStats(); - stats.add(BlockStat.powerRange, laserRange, StatUnit.blocks); - stats.add(BlockStat.powerConnections, maxNodes, StatUnit.none); + stats.add(Stat.powerRange, laserRange, StatUnit.blocks); + stats.add(Stat.powerConnections, maxNodes, StatUnit.none); } @Override diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index e29b7a6bdb..154bd02a0c 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -22,7 +22,7 @@ public class ThermalGenerator extends PowerGenerator{ public void setStats(){ super.setStats(); - stats.add(BlockStat.tiles, attribute, floating); + stats.add(Stat.tiles, attribute, floating); } @Override diff --git a/core/src/mindustry/world/blocks/production/AttributeSmelter.java b/core/src/mindustry/world/blocks/production/AttributeSmelter.java index 987b14e63b..c2650ab030 100644 --- a/core/src/mindustry/world/blocks/production/AttributeSmelter.java +++ b/core/src/mindustry/world/blocks/production/AttributeSmelter.java @@ -37,7 +37,7 @@ public class AttributeSmelter extends GenericSmelter{ public void setStats(){ super.setStats(); - stats.add(BlockStat.affinities, attribute, boostScale); + stats.add(Stat.affinities, attribute, boostScale); } public class AttributeSmelterBuild extends SmelterBuild{ diff --git a/core/src/mindustry/world/blocks/production/Cultivator.java b/core/src/mindustry/world/blocks/production/Cultivator.java index 2dc97d82f6..a5aede4e25 100644 --- a/core/src/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/mindustry/world/blocks/production/Cultivator.java @@ -42,7 +42,7 @@ public class Cultivator extends GenericCrafter{ public void setStats(){ super.setStats(); - stats.add(BlockStat.affinities, attribute); + stats.add(Stat.affinities, attribute); } @Override diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 7b86f1d1f5..ef4ab64b27 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -16,7 +16,9 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import mindustry.world.meta.*; +import mindustry.world.meta.values.*; import static mindustry.Vars.*; @@ -135,29 +137,11 @@ public class Drill extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.drillTier, table -> { - Seq list = content.blocks().select(b -> b.isFloor() && b.asFloor().itemDrop != null && b.asFloor().itemDrop.hardness <= tier); + stats.add(Stat.drillTier, new BlockFilterValue(b -> b instanceof Floor f && f.itemDrop != null && f.itemDrop.hardness <= tier)); - table.table(l -> { - l.left(); - - for(int i = 0; i < list.size; i++){ - Block item = list.get(i); - - l.image(item.icon(Cicon.small)).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); - l.add(item.localizedName).left().padLeft(1).padRight(4); - if(i % 5 == 4){ - l.row(); - } - } - }); - - - }); - - stats.add(BlockStat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); + stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); if(liquidBoostIntensity != 1){ - stats.add(BlockStat.boostEffect, liquidBoostIntensity * liquidBoostIntensity, StatUnit.timesSpeed); + stats.add(Stat.boostEffect, liquidBoostIntensity * liquidBoostIntensity, StatUnit.timesSpeed); } } diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index b1ea3a5b34..d2dbd5bf69 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -21,7 +21,7 @@ public class Fracker extends SolidPump{ public void setStats(){ super.setStats(); - stats.add(BlockStat.productionTime, itemUseTime / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, itemUseTime / 60f, StatUnit.seconds); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 4fcb3b1f1a..c992be7d78 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -43,14 +43,14 @@ public class GenericCrafter extends Block{ } super.setStats(); - stats.add(BlockStat.productionTime, craftTime / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds); if(outputItem != null){ - stats.add(BlockStat.output, outputItem); + stats.add(Stat.output, outputItem); } if(outputLiquid != null){ - stats.add(BlockStat.output, outputLiquid.liquid, outputLiquid.amount, false); + stats.add(Stat.output, outputLiquid.liquid, outputLiquid.amount, false); } } diff --git a/core/src/mindustry/world/blocks/production/LiquidConverter.java b/core/src/mindustry/world/blocks/production/LiquidConverter.java index 84868d9b61..8a9725d42d 100644 --- a/core/src/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/mindustry/world/blocks/production/LiquidConverter.java @@ -26,8 +26,8 @@ public class LiquidConverter extends GenericCrafter{ @Override public void setStats(){ super.setStats(); - stats.remove(BlockStat.output); - stats.add(BlockStat.output, outputLiquid.liquid, outputLiquid.amount * craftTime, false); + stats.remove(Stat.output); + stats.add(Stat.output, outputLiquid.liquid, outputLiquid.amount * craftTime, false); } public class LiquidConverterBuild extends GenericCrafterBuild{ diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index fa2f67999f..c4a6313129 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -26,7 +26,7 @@ public class Pump extends LiquidBlock{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.output, 60f * pumpAmount * size * size, StatUnit.liquidSecond); + stats.add(Stat.output, 60f * pumpAmount * size * size, StatUnit.liquidSecond); } @Override diff --git a/core/src/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java index bcf66984e3..d9b355cc70 100644 --- a/core/src/mindustry/world/blocks/production/Separator.java +++ b/core/src/mindustry/world/blocks/production/Separator.java @@ -41,14 +41,14 @@ public class Separator extends Block{ super.setStats(); - stats.add(BlockStat.output, new ItemFilterValue(item -> { + stats.add(Stat.output, new ItemFilterValue(item -> { for(ItemStack i : results){ if(item == i.item) return true; } return false; })); - stats.add(BlockStat.productionTime, craftTime / 60f, StatUnit.seconds); + stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds); } public class SeparatorBuild extends Building{ diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index 3b29665fde..d49a6499ac 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -53,10 +53,10 @@ public class SolidPump extends Pump{ public void setStats(){ super.setStats(); - stats.remove(BlockStat.output); - stats.add(BlockStat.output, result, 60f * pumpAmount, true); + stats.remove(Stat.output); + stats.add(Stat.output, result, 60f * pumpAmount, true); if(attribute != null){ - stats.add(baseEfficiency > 0.0001f ? BlockStat.affinities : BlockStat.tiles, attribute); + stats.add(baseEfficiency > 0.0001f ? Stat.affinities : Stat.tiles, attribute); } } diff --git a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java index c423ba6caf..e97622c609 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java @@ -11,8 +11,8 @@ public class PowerVoid extends PowerBlock{ } @Override - public void init(){ - super.init(); - stats.remove(BlockStat.powerUse); + public void setStats(){ + super.setStats(); + stats.remove(Stat.powerUse); } } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index f93d907d47..039c7cc3cf 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -77,12 +77,16 @@ public class CoreBlock extends StorageBlock{ public void setStats(){ super.setStats(); - stats.add(BlockStat.buildTime, 0, StatUnit.seconds); + stats.add(Stat.buildTime, 0, StatUnit.seconds); + } - bars.add("capacity", (CoreBuild e) -> - new Bar( - () -> Core.bundle.format("bar.capacity", UI.formatAmount(e.storageCapacity)), - () -> Pal.items, + @Override + public void setBars(){ + super.setBars(); + + bars.add("capacity", (CoreBuild e) -> new Bar( + () -> Core.bundle.format("bar.capacity", UI.formatAmount(e.storageCapacity)), + () -> Pal.items, () -> e.items.total() / ((float)e.storageCapacity * content.items().count(i -> i.unlockedNow())) )); } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index ed21b6dc11..9374e0d801 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -63,8 +63,8 @@ public class Reconstructor extends UnitBlock{ public void setStats(){ super.setStats(); - stats.add(BlockStat.productionTime, constructTime / 60f, StatUnit.seconds); - stats.add(BlockStat.output, table -> { + stats.add(Stat.productionTime, constructTime / 60f, StatUnit.seconds); + stats.add(Stat.output, table -> { table.row(); for(var upgrade : upgrades){ float size = 8*3; diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index abcc4bf738..789f7a8901 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -42,7 +42,7 @@ public class RepairPoint extends Block{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.range, repairRadius / tilesize, StatUnit.blocks); + stats.add(Stat.range, repairRadius / tilesize, StatUnit.blocks); } @Override diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 52a3af85c7..500385966e 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -87,7 +87,7 @@ public class UnitFactory extends UnitBlock{ public void setStats(){ super.setStats(); - stats.remove(BlockStat.itemCapacity); + stats.remove(Stat.itemCapacity); } @Override diff --git a/core/src/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java index 410d041a03..3066dbb9bb 100644 --- a/core/src/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -69,5 +69,5 @@ public abstract class Consume{ public abstract boolean valid(Building entity); - public abstract void display(BlockStats stats); + public abstract void display(Stats stats); } diff --git a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java index a2dd079c20..0c18e77741 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -73,7 +73,7 @@ public class ConsumeItemDynamic extends Consume{ } @Override - public void display(BlockStats stats){ + public void display(Stats stats){ //should be handled by the block } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index e9e98041c4..93d70a46f3 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -70,7 +70,7 @@ public class ConsumeItemFilter extends Consume{ } @Override - public void display(BlockStats stats){ - stats.add(booster ? BlockStat.booster : BlockStat.input, new ItemFilterValue(filter)); + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, new ItemFilterValue(filter)); } } diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index 01909e2a14..f43746db87 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -63,7 +63,7 @@ public class ConsumeItems extends Consume{ } @Override - public void display(BlockStats stats){ - stats.add(booster ? BlockStat.booster : BlockStat.input, new ItemListValue(items)); + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, new ItemListValue(items)); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index 90f3bf0687..839b59c607 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -45,7 +45,7 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ } @Override - public void display(BlockStats stats){ - stats.add(booster ? BlockStat.booster : BlockStat.input, liquid, amount * timePeriod, timePeriod == 60); + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, liquid, amount * timePeriod, timePeriod == 60); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 962023488b..851cf75fd2 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -49,7 +49,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ } @Override - public void display(BlockStats stats){ - stats.add(booster ? BlockStat.booster : BlockStat.input, new LiquidFilterValue(filter, amount * timePeriod, timePeriod == 60f)); + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, new LiquidFilterValue(filter, amount * timePeriod, timePeriod == 60f)); } } diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 2dc55dbb11..67b23d6c4c 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -54,11 +54,11 @@ public class ConsumePower extends Consume{ } @Override - public void display(BlockStats stats){ + public void display(Stats stats){ if(buffered){ - stats.add(BlockStat.powerCapacity, capacity, StatUnit.none); + stats.add(Stat.powerCapacity, capacity, StatUnit.none); }else{ - stats.add(BlockStat.powerUse, usage * 60f, StatUnit.powerSecond); + stats.add(Stat.powerUse, usage * 60f, StatUnit.powerSecond); } } diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 4ce410aa04..a811a24d52 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -109,7 +109,7 @@ public class Consumers{ return optionalResults; } - public void display(BlockStats stats){ + public void display(Stats stats){ for(Consume c : map){ if(c != null){ c.display(stats); diff --git a/core/src/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java deleted file mode 100644 index 05e45acbfe..0000000000 --- a/core/src/mindustry/world/meta/BlockStat.java +++ /dev/null @@ -1,68 +0,0 @@ -package mindustry.world.meta; - -import arc.*; - -import java.util.*; - -/** Describes one type of stat for a block. */ -public enum BlockStat{ - health(StatCategory.general), - size(StatCategory.general), - displaySize(StatCategory.general), - buildTime(StatCategory.general), - buildCost(StatCategory.general), - memoryCapacity(StatCategory.general), - - itemCapacity(StatCategory.items), - itemsMoved(StatCategory.items), - launchTime(StatCategory.items), - maxConsecutive(StatCategory.items), - - liquidCapacity(StatCategory.liquids), - - powerCapacity(StatCategory.power), - powerUse(StatCategory.power), - powerDamage(StatCategory.power), - powerRange(StatCategory.power), - powerConnections(StatCategory.power), - basePowerGeneration(StatCategory.power), - - tiles(StatCategory.crafting), - input(StatCategory.crafting), - output(StatCategory.crafting), - productionTime(StatCategory.crafting), - drillTier(StatCategory.crafting), - drillSpeed(StatCategory.crafting), - maxUnits(StatCategory.crafting), - linkRange(StatCategory.crafting), - instructions(StatCategory.crafting), - - speedIncrease(StatCategory.shooting), - repairTime(StatCategory.shooting), - range(StatCategory.shooting), - shootRange(StatCategory.shooting), - inaccuracy(StatCategory.shooting), - shots(StatCategory.shooting), - reload(StatCategory.shooting), - powerShot(StatCategory.shooting), - targetsAir(StatCategory.shooting), - targetsGround(StatCategory.shooting), - damage(StatCategory.shooting), - ammo(StatCategory.shooting), - shieldHealth(StatCategory.shooting), - cooldownTime(StatCategory.shooting), - - booster(StatCategory.optional), - boostEffect(StatCategory.optional), - affinities(StatCategory.optional); - - public final StatCategory category; - - BlockStat(StatCategory category){ - this.category = category; - } - - public String localized(){ - return Core.bundle.get("blocks." + name().toLowerCase(Locale.ROOT)); - } -} diff --git a/core/src/mindustry/world/meta/Stat.java b/core/src/mindustry/world/meta/Stat.java new file mode 100644 index 0000000000..bb872f98c4 --- /dev/null +++ b/core/src/mindustry/world/meta/Stat.java @@ -0,0 +1,82 @@ +package mindustry.world.meta; + +import arc.*; + +import java.util.*; + +/** Describes one type of stat for content. */ +public enum Stat{ + health, + size, + displaySize, + buildTime, + buildCost, + memoryCapacity, + explosiveness, + flammability, + radioactivity, + heatCapacity, + viscosity, + temperature, + speed, + buildSpeed, + mineSpeed, + mineTier, + + itemCapacity(StatCat.items), + itemsMoved(StatCat.items), + launchTime(StatCat.items), + maxConsecutive(StatCat.items), + + liquidCapacity(StatCat.liquids), + + powerCapacity(StatCat.power), + powerUse(StatCat.power), + powerDamage(StatCat.power), + powerRange(StatCat.power), + powerConnections(StatCat.power), + basePowerGeneration(StatCat.power), + + tiles(StatCat.crafting), + input(StatCat.crafting), + output(StatCat.crafting), + productionTime(StatCat.crafting), + drillTier(StatCat.crafting), + drillSpeed(StatCat.crafting), + maxUnits(StatCat.crafting), + linkRange(StatCat.crafting), + instructions(StatCat.crafting), + + speedIncrease(StatCat.shooting), + repairTime(StatCat.shooting), + range(StatCat.shooting), + shootRange(StatCat.shooting), + inaccuracy(StatCat.shooting), + shots(StatCat.shooting), + reload(StatCat.shooting), + powerShot(StatCat.shooting), + targetsAir(StatCat.shooting), + targetsGround(StatCat.shooting), + damage(StatCat.shooting), + ammo(StatCat.shooting), + shieldHealth(StatCat.shooting), + cooldownTime(StatCat.shooting), + + booster(StatCat.optional), + boostEffect(StatCat.optional), + affinities(StatCat.optional); + + public final StatCat category; + + Stat(StatCat category){ + this.category = category; + } + + Stat(){ + this.category = StatCat.general; + } + + public String localized(){ + return Core.bundle.get("stat." + name().toLowerCase(Locale.ROOT)); + } +} diff --git a/core/src/mindustry/world/meta/StatCategory.java b/core/src/mindustry/world/meta/StatCat.java similarity index 91% rename from core/src/mindustry/world/meta/StatCategory.java rename to core/src/mindustry/world/meta/StatCat.java index e6c91b04bb..8dfd42d3c5 100644 --- a/core/src/mindustry/world/meta/StatCategory.java +++ b/core/src/mindustry/world/meta/StatCat.java @@ -3,7 +3,7 @@ package mindustry.world.meta; import arc.*; /** A specific category for a stat. */ -public enum StatCategory{ +public enum StatCat{ general, power, liquids, diff --git a/core/src/mindustry/world/meta/BlockStats.java b/core/src/mindustry/world/meta/Stats.java similarity index 55% rename from core/src/mindustry/world/meta/BlockStats.java rename to core/src/mindustry/world/meta/Stats.java index ff93a217a9..68f96ff260 100644 --- a/core/src/mindustry/world/meta/BlockStats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -2,54 +2,71 @@ package mindustry.world.meta; import arc.struct.ObjectMap.*; import arc.struct.*; +import arc.util.*; import mindustry.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.meta.values.*; /** Hold and organizes a list of block stats. */ -public class BlockStats{ - private final OrderedMap>> map = new OrderedMap<>(); +public class Stats{ + /** Whether to display stats with categories. If false, categories are completely ignored during display. */ + public boolean useCategories = false; + /** Whether these stats are initialized yet. */ + public boolean intialized = false; + + @Nullable + private OrderedMap>> map; private boolean dirty; /** Adds a single float value with this stat, formatted to 2 decimal places. */ - public void add(BlockStat stat, float value, StatUnit unit){ + public void add(Stat stat, float value, StatUnit unit){ add(stat, new NumberValue(value, unit)); } + /** Adds a single float value with this stat and no unit. */ + public void add(Stat stat, float value){ + add(stat, value, StatUnit.none); + } + + /** Adds an integer percent stat value. Value is assumed to be in the 0-1 range. */ + public void addPercent(Stat stat, float value){ + add(stat, new NumberValue((int)(value * 100), StatUnit.percent)); + } + /** Adds a single y/n boolean value. */ - public void add(BlockStat stat, boolean value){ + public void add(Stat stat, boolean value){ add(stat, new BooleanValue(value)); } /** Adds an item value. */ - public void add(BlockStat stat, Item item){ + public void add(Stat stat, Item item){ add(stat, new ItemListValue(new ItemStack(item, 1))); } /** Adds an item value. */ - public void add(BlockStat stat, ItemStack item){ + public void add(Stat stat, ItemStack item){ add(stat, new ItemListValue(item)); } /** Adds an item value. */ - public void add(BlockStat stat, Liquid liquid, float amount, boolean perSecond){ + public void add(Stat stat, Liquid liquid, float amount, boolean perSecond){ add(stat, new LiquidValue(liquid, amount, perSecond)); } - public void add(BlockStat stat, Attribute attr){ + public void add(Stat stat, Attribute attr){ add(stat, attr, false, 1f); } - public void add(BlockStat stat, Attribute attr, float scale){ + public void add(Stat stat, Attribute attr, float scale){ add(stat, attr, false, scale); } - public void add(BlockStat stat, Attribute attr, boolean floating){ + public void add(Stat stat, Attribute attr, boolean floating){ add(stat, attr, floating, 1f); } - public void add(BlockStat stat, Attribute attr, boolean floating, float scale){ + public void add(Stat stat, Attribute attr, boolean floating, float scale){ for(Block block : Vars.content.blocks()){ if(!block.isFloor() || block.asFloor().attributes.get(attr) == 0 || (block.asFloor().isLiquid && !floating)) continue; add(stat, new FloorEfficiencyValue(block.asFloor(), block.asFloor().attributes.get(attr) * scale)); @@ -57,12 +74,14 @@ public class BlockStats{ } /** Adds a single string value with this stat. */ - public void add(BlockStat stat, String format, Object... args){ + public void add(Stat stat, String format, Object... args){ add(stat, new StringValue(format, args)); } /** Adds a stat value. */ - public void add(BlockStat stat, StatValue value){ + public void add(Stat stat, StatValue value){ + if(map == null) map = new OrderedMap<>(); + if(!map.containsKey(stat.category)){ map.put(stat.category, new OrderedMap<>()); } @@ -73,7 +92,9 @@ public class BlockStats{ } /** Removes a stat, if it exists. */ - public void remove(BlockStat stat){ + public void remove(Stat stat){ + if(map == null) map = new OrderedMap<>(); + if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){ throw new RuntimeException("No stat entry found: \"" + stat + "\" in block."); } @@ -83,11 +104,13 @@ public class BlockStats{ dirty = true; } - public OrderedMap>> toMap(){ + public OrderedMap>> toMap(){ + if(map == null) map = new OrderedMap<>(); + //sort stats by index if they've been modified if(dirty){ map.orderedKeys().sort(); - for(Entry>> entry : map.entries()){ + for(Entry>> entry : map.entries()){ entry.value.orderedKeys().sort(); } diff --git a/core/src/mindustry/world/meta/values/BlockFilterValue.java b/core/src/mindustry/world/meta/values/BlockFilterValue.java new file mode 100644 index 0000000000..3c4d0fe56e --- /dev/null +++ b/core/src/mindustry/world/meta/values/BlockFilterValue.java @@ -0,0 +1,37 @@ +package mindustry.world.meta.values; + +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class BlockFilterValue implements StatValue{ + public final Boolf pred; + + public BlockFilterValue(Boolf pred){ + this.pred = pred; + } + + @Override + public void display(Table table){ + Seq list = content.blocks().select(pred); + + table.table(l -> { + l.left(); + + for(int i = 0; i < list.size; i++){ + Block item = list.get(i); + + l.image(item.icon(Cicon.small)).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); + l.add(item.localizedName).left().padLeft(1).padRight(4); + if(i % 5 == 4){ + l.row(); + } + } + }); + } +} diff --git a/core/src/mindustry/world/meta/values/BlockListValue.java b/core/src/mindustry/world/meta/values/BlockListValue.java new file mode 100644 index 0000000000..a1cd5adffe --- /dev/null +++ b/core/src/mindustry/world/meta/values/BlockListValue.java @@ -0,0 +1,33 @@ +package mindustry.world.meta.values; + +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +public class BlockListValue implements StatValue{ + public final Seq list; + + public BlockListValue(Seq list){ + this.list = list; + } + + @Override + public void display(Table table){ + + table.table(l -> { + l.left(); + + for(int i = 0; i < list.size; i++){ + Block item = list.get(i); + + l.image(item.icon(Cicon.small)).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); + l.add(item.localizedName).left().padLeft(1).padRight(4); + if(i % 5 == 4){ + l.row(); + } + } + }); + } +} diff --git a/desktop/src/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java index 925c670223..9338aafc5b 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -7,7 +7,7 @@ import mindustry.*; import mindustry.content.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; -import mindustry.game.Stats.*; +import mindustry.game.GameStats.*; import mindustry.gen.*; import mindustry.type.*; From efb42296cf4d1c7d218cf7bb567a65d60f43d2b6 Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Tue, 20 Oct 2020 00:57:08 +0900 Subject: [PATCH 26/44] remove final --- core/src/mindustry/type/Item.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index d245902a39..f52323d655 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -9,7 +9,7 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class Item extends UnlockableContent{ - public final Color color; + public Color color; /** how explosive this item is. */ public float explosiveness = 0f; From 3c2e12621eccc4e14a3232a9d404d30477185e36 Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Tue, 20 Oct 2020 01:01:45 +0900 Subject: [PATCH 27/44] rainbow liquid --- core/src/mindustry/type/Liquid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java index 3c4fe8eaf7..e62805e60b 100644 --- a/core/src/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -8,7 +8,7 @@ import mindustry.world.meta.*; public class Liquid extends UnlockableContent{ /** Color used in pipes and on the ground. */ - public final Color color; + public Color color; /** Color used in bars. */ public @Nullable Color barColor; /** Color used to draw lights. Note that the alpha channel is used to dictate brightness. */ From 6e8732387b3b73a0929a26659ddac1ff7971848b Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 19 Oct 2020 16:25:59 -0400 Subject: [PATCH 28/44] Better weather classes --- core/assets/bundles/bundle.properties | 1 - core/src/mindustry/ai/BaseAI.java | 5 + core/src/mindustry/content/Fx.java | 8 + core/src/mindustry/content/UnitTypes.java | 12 +- core/src/mindustry/content/Weathers.java | 363 +++--------------- .../mindustry/ctype/UnlockableContent.java | 2 - core/src/mindustry/game/Universe.java | 2 +- core/src/mindustry/mod/ContentParser.java | 14 + core/src/mindustry/type/Weather.java | 135 +++++++ .../type/weather/ParticleWeather.java | 79 ++++ .../mindustry/type/weather/RainWeather.java | 38 ++ .../world/blocks/storage/StorageBlock.java | 2 +- 12 files changed, 332 insertions(+), 329 deletions(-) create mode 100644 core/src/mindustry/type/weather/ParticleWeather.java create mode 100644 core/src/mindustry/type/weather/RainWeather.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6295b8e928..1a3b4b1dde 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -637,7 +637,6 @@ stat.buildspeed = Build Speed stat.minespeed = Mine Speed stat.minetier = Mine Tier - bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources bar.corereq = Core Base Required diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 51c5be43b3..2c1fb11617 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -72,6 +72,11 @@ public class BaseAI{ int wx = (int)(World.toTile(pos.getX()) + Tmp.v1.x), wy = (int)(World.toTile(pos.getY()) + Tmp.v1.y); Tile tile = world.tiles.getc(wx, wy); + //try not to block the spawn point + if(spawner.getSpawns().contains(t -> t.within(tile, tilesize * 40f))){ + continue; + } + Seq parts = null; //pick a completely random base part, and place it a random location diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index ca5bf9a0d0..5d0c45348d 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1293,6 +1293,14 @@ public class Fx{ }); }), + coreBurn = new Effect(23, e -> { + randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> { + float len = e.fout() * 4f; + color(Pal.accent, Color.gray, e.fin()); + Fill.circle(e.x + x, e.y + y, len/2f); + }); + }), + plasticburn = new Effect(40, e -> { randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> { color(Color.valueOf("e9ead3"), Color.gray, e.fin()); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 2b3ec1df0c..f7ba45b156 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1654,7 +1654,7 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.5f; drag = 0.05f; - speed = 2.8f; + speed = 3f; rotateSpeed = 15f; accel = 0.1f; itemCapacity = 30; @@ -1675,7 +1675,7 @@ public class UnitTypes implements ContentList{ lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.09f; + tileDamageMultiplier = 0.03f; }}; }}); }}; @@ -1689,7 +1689,7 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.75f; drag = 0.05f; - speed = 3f; + speed = 3.3f; rotateSpeed = 17f; accel = 0.1f; itemCapacity = 50; @@ -1716,7 +1716,7 @@ public class UnitTypes implements ContentList{ lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.1f; + tileDamageMultiplier = 0.03f; }}; }}); }}; @@ -1730,7 +1730,7 @@ public class UnitTypes implements ContentList{ mineTier = 2; buildSpeed = 1f; drag = 0.05f; - speed = 3.5f; + speed = 3.55f; rotateSpeed = 19f; accel = 0.11f; itemCapacity = 70; @@ -1755,7 +1755,7 @@ public class UnitTypes implements ContentList{ lifetime = 70f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.1f; + tileDamageMultiplier = 0.03f; homingPower = 0.04f; }}; }}); diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 273fdb5899..d3758eebfb 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -1,19 +1,11 @@ package mindustry.content; -import arc.*; import arc.graphics.*; -import arc.graphics.Texture.*; -import arc.graphics.g2d.*; -import arc.math.*; -import arc.util.*; import mindustry.ctype.*; -import mindustry.gen.*; import mindustry.type.*; -import mindustry.world.*; +import mindustry.type.weather.*; import mindustry.world.meta.*; -import static mindustry.Vars.*; - public class Weathers implements ContentList{ public static Weather rain, @@ -23,317 +15,52 @@ public class Weathers implements ContentList{ @Override public void load(){ - snow = new Weather("snow"){ - TextureRegion region; - float yspeed = 2f, xspeed = 0.25f, padding = 16f, size = 12f, density = 1200f; + snow = new ParticleWeather("snow"){{ + sizeMax = 13f; + sizeMin = 2.6f; + density = 1200f; + attrs.set(Attribute.light, -0.15f); + }}; - { - attrs.set(Attribute.light, -0.15f); - } + rain = new RainWeather("rain"){{ + attrs.set(Attribute.light, -0.2f); + attrs.set(Attribute.water, 0.2f); + status = StatusEffects.wet; + }}; - @Override - public void load(){ - super.load(); + sandstorm = new ParticleWeather("sandstorm"){{ + color = stormColor = Color.valueOf("f7cba4"); + drawStorm = true; + useWindVector = true; + sizeMax = 140f; + sizeMin = 70f; + minAlpha = 0f; + maxAlpha = 0.2f; + density = 1500f; + baseSpeed = 6.1f; + attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.water, -0.1f); + opacityMultiplier = 0.8f; + force = 0.1f; + }}; - region = Core.atlas.find("circle-shadow"); - } - - @Override - public void drawOver(WeatherState state){ - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()); - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.2f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); - - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.rect(region, x, y, size * sscl, size * sscl); - } - } - } - }; - - rain = new Weather("rain"){ - float yspeed = 5f, xspeed = 1.5f, padding = 16f, size = 40f, density = 1200f; - TextureRegion[] splashes = new TextureRegion[12]; - - { - attrs.set(Attribute.light, -0.2f); - attrs.set(Attribute.water, 0.2f); - status = StatusEffects.wet; - } - - @Override - public void load(){ - super.load(); - - for(int i = 0; i < splashes.length; i++){ - splashes[i] = Core.atlas.find("splash-" + i); - } - } - - @Override - public void drawOver(WeatherState state){ - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()); - Lines.stroke(0.75f); - float alpha = Draw.getColor().a; - Draw.color(Color.royal, Color.white, 0.3f); - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.2f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); - float tint = rand.random(1f) * alpha; - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(tint); - Lines.lineAngle(x, y, Angles.angle(xspeed * scl2, - yspeed * scl), size*sscl/2f); - } - } - } - - @Override - public void drawUnder(WeatherState state){ - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()) / 2; - Lines.stroke(0.75f); - - float t = Time.time() / 22f; - - for(int i = 0; i < total; i++){ - float offset = rand.random(0f, 1f); - float time = t + offset; - - int pos = (int)((time)); - float life = time % 1f; - float x = (rand.random(0f, world.unitWidth()) + pos*953); - float y = (rand.random(0f, world.unitHeight()) - pos*453); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, life * 4f).overlaps(Tmp.r2)){ - Tile tile = world.tileWorld(x, y); - - if(tile != null && tile.floor().liquidDrop == Liquids.water){ - Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(state.opacity())); - Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); - }else if(tile != null && tile.floor().liquidDrop == null && !tile.floor().solid){ - Draw.color(Color.royal, Color.white, 0.3f); - Draw.alpha(Mathf.slope(life) * state.opacity()); - - float space = 45f; - for(int j : new int[]{-1, 1}){ - Tmp.v1.trns(90f + j*space, 1f + 5f * life); - Lines.lineAngle(x + Tmp.v1.x, y + Tmp.v1.y, 90f + j*space, 3f * (1f - life)); - } - } - } - } - } - }; - - sandstorm = new Weather("sandstorm"){ - TextureRegion region; - float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; - float force = 0.4f * 0; - Color color = Color.valueOf("f7cba4"); - Texture noise; - - { - attrs.set(Attribute.light, -0.1f); - opacityMultiplier = 0.8f; - } - - @Override - public void load(){ - region = Core.atlas.find("circle-shadow"); - noise = new Texture("sprites/noiseAlpha.png"); - noise.setWrap(TextureWrap.repeat); - noise.setFilter(TextureFilter.linear); - } - - @Override - public void dispose(){ - noise.dispose(); - } - - @Override - public void update(WeatherState state){ - float speed = force * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - for(Unit unit : Groups.unit){ - unit.impulse(windx, windy); - } - } - - @Override - public void drawOver(WeatherState state){ - Draw.tint(color); - float speed = baseSpeed * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - float scale = 1f / 2000f; - float scroll = Time.time() * scale; - Tmp.tr1.texture = noise; - Core.camera.bounds(Tmp.r1); - Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-windx * scroll, windy * scroll); - Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); - - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / invDensity * state.intensity()); - Draw.tint(color); - float baseAlpha = Draw.getColor().a; - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); - float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); - float alpha = rand.random(0.2f); - - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(alpha * baseAlpha); - Draw.rect(region, x, y, size * sscl, size * sscl); - } - } - } - }; - - sporestorm = new Weather("sporestorm"){ - TextureRegion region; - float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f * 0; - Color color = Color.valueOf("7457ce"); - Texture noise; - - { - attrs.set(Attribute.spores, 1f); - attrs.set(Attribute.light, -0.15f); - status = StatusEffects.sporeSlowed; - statusGround = false; - opacityMultiplier = 0.85f; - } - - @Override - public void load(){ - region = Core.atlas.find("circle-shadow"); - noise = new Texture("sprites/noiseAlpha.png"); - noise.setWrap(TextureWrap.repeat); - noise.setFilter(TextureFilter.linear); - } - - @Override - public void update(WeatherState state){ - float speed = force * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - for(Unit unit : Groups.unit){ - unit.impulse(windx, windy); - } - } - - @Override - public void dispose(){ - noise.dispose(); - } - - @Override - public void drawOver(WeatherState state){ - Draw.alpha(state.opacity * 0.8f); - Draw.tint(color); - - float speed = baseSpeed * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - float scale = 1f / 2000f; - float scroll = Time.time() * scale; - Tmp.tr1.texture = noise; - Core.camera.bounds(Tmp.r1); - Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-windx * scroll, windy * scroll); - Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); - - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / invDensity * state.intensity()); - Draw.tint(color); - float baseAlpha = state.opacity; - Draw.alpha(baseAlpha); - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); - float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); - float alpha = rand.random(0.1f, 0.8f); - - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(alpha * baseAlpha); - Fill.circle(x, y, size * sscl / 2f); - } - } - } - }; + sporestorm = new ParticleWeather("sporestorm"){{ + color = stormColor = Color.valueOf("7457ce"); + particleRegion = "circle"; + drawStorm = true; + statusGround = false; + useWindVector = true; + sizeMax = 5f; + sizeMin = 2.5f; + minAlpha = 0.1f; + maxAlpha = 0.8f; + density = 2000f; + baseSpeed = 4.3f; + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); + status = StatusEffects.sporeSlowed; + opacityMultiplier = 0.85f; + force = 0.1f; + }}; } } diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 727fad8bed..d3f21845ad 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -50,9 +50,7 @@ public abstract class UnlockableContent extends MappableContent{ } /** Intializes stats on demand. Should only be called once. Only called before something is displayed. */ - @CallSuper public void setStats(){ - stats.intialized = true; } /** Generate any special icons for this content. Called asynchronously.*/ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 30f0100b2d..2140f08271 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -187,7 +187,7 @@ public class Universe{ } //add production, making sure that it's capped - sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * seconds * scl), sector.info.storageCapacity - sector.info.items.get(item)))); + sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * newSecondsPassed * scl), sector.info.storageCapacity - sector.info.items.get(item)))); sector.saveInfo(); } diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 9a1118c22d..0d88d01034 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -303,6 +303,20 @@ public class ContentParser{ return unit; }, + ContentType.weather, (TypeParser)(mod, name, value) -> { + Weather item; + if(locate(ContentType.weather, name) != null){ + item = locate(ContentType.weather, name); + readBundle(ContentType.weather, name, value); + }else{ + readBundle(ContentType.weather, name, value); + Class type = resolve(getType(value), "mindustry.type.weather"); + item = make(type); + } + currentContent = item; + read(() -> readFields(item, value)); + return item; + }, ContentType.item, parser(ContentType.item, Item::new), ContentType.liquid, parser(ContentType.liquid, Liquid::new) //ContentType.sector, parser(ContentType.sector, SectorPreset::new) diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 86e44c0174..675e378541 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -1,6 +1,8 @@ package mindustry.type; +import arc.*; import arc.func.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -10,6 +12,7 @@ import mindustry.content.*; import mindustry.ctype.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.*; import mindustry.world.blocks.*; import static mindustry.Vars.*; @@ -90,6 +93,138 @@ public abstract class Weather extends UnlockableContent{ } + public void drawParticles(TextureRegion region, Color color, + float sizeMin, float sizeMax, + float density, float intensity, float opacity, + float windx, float windy, + float minAlpha, float maxAlpha, + float sinSclMin, float sinSclMax, float sinMagMin, float sinMagMax){ + rand.setSeed(0); + Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); + Tmp.r1.grow(sizeMax * 1.5f); + Core.camera.bounds(Tmp.r2); + int total = (int)(Tmp.r1.area() / density * intensity); + Draw.color(color, opacity); + + for(int i = 0; i < total; i++){ + float scl = rand.random(0.5f, 1f); + float scl2 = rand.random(0.5f, 1f); + float size = rand.random(sizeMin, sizeMax); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); + float alpha = rand.random(minAlpha, maxAlpha); + + x += Mathf.sin(y, rand.random(sinSclMin, sinSclMax), rand.random(sinMagMin, sinMagMax)); + + x -= Tmp.r1.x; + y -= Tmp.r1.y; + x = Mathf.mod(x, Tmp.r1.width); + y = Mathf.mod(y, Tmp.r1.height); + x += Tmp.r1.x; + y += Tmp.r1.y; + + if(Tmp.r3.setCentered(x, y, size).overlaps(Tmp.r2)){ + Draw.alpha(alpha * opacity); + Draw.rect(region, x, y, size, size); + } + } + } + + public void drawRain(float sizeMin, float sizeMax, float xspeed, float yspeed, float density, float intensity, float stroke, Color color){ + float padding = sizeMax*0.9f; + + Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); + Tmp.r1.grow(padding); + Core.camera.bounds(Tmp.r2); + int total = (int)(Tmp.r1.area() / density * intensity); + Lines.stroke(stroke); + float alpha = Draw.getColor().a; + Draw.color(color); + + for(int i = 0; i < total; i++){ + float scl = rand.random(0.5f, 1f); + float scl2 = rand.random(0.5f, 1f); + float size = rand.random(sizeMin, sizeMax); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); + float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float tint = rand.random(1f) * alpha; + + x -= Tmp.r1.x; + y -= Tmp.r1.y; + x = Mathf.mod(x, Tmp.r1.width); + y = Mathf.mod(y, Tmp.r1.height); + x += Tmp.r1.x; + y += Tmp.r1.y; + + if(Tmp.r3.setCentered(x, y, size).overlaps(Tmp.r2)){ + Draw.alpha(tint); + Lines.lineAngle(x, y, Angles.angle(xspeed * scl2, - yspeed * scl), size/2f); + } + } + } + + public void drawSplashes(TextureRegion[] splashes, float padding, float density, float intensity, float opacity, float timeScale, float stroke, Color color, Liquid splasher){ + Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); + Tmp.r1.grow(padding); + Core.camera.bounds(Tmp.r2); + int total = (int)(Tmp.r1.area() / density * intensity) / 2; + Lines.stroke(stroke); + + float t = Time.time() / timeScale; + + for(int i = 0; i < total; i++){ + float offset = rand.random(0f, 1f); + float time = t + offset; + + int pos = (int)((time)); + float life = time % 1f; + float x = (rand.random(0f, world.unitWidth()) + pos*953); + float y = (rand.random(0f, world.unitHeight()) - pos*453); + + x -= Tmp.r1.x; + y -= Tmp.r1.y; + x = Mathf.mod(x, Tmp.r1.width); + y = Mathf.mod(y, Tmp.r1.height); + x += Tmp.r1.x; + y += Tmp.r1.y; + + if(Tmp.r3.setCentered(x, y, life * 4f).overlaps(Tmp.r2)){ + Tile tile = world.tileWorld(x, y); + + //only create splashes on specific liquid. + if(tile != null && tile.floor().liquidDrop == splasher){ + Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(opacity)); + Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); + }else if(tile != null && tile.floor().liquidDrop == null && !tile.floor().solid){ + Draw.color(color); + Draw.alpha(Mathf.slope(life) * opacity); + + float space = 45f; + for(int j : new int[]{-1, 1}){ + Tmp.v1.trns(90f + j*space, 1f + 5f * life); + Lines.lineAngle(x + Tmp.v1.x, y + Tmp.v1.y, 90f + j*space, 3f * (1f - life)); + } + } + } + } + } + + public void drawNoise(Texture noise, Color color, float noisescl, float opacity, float baseSpeed, float intensity, Vec2 windVector){ + Draw.alpha(opacity); + Draw.tint(color); + + float speed = baseSpeed * intensity; + float windx = windVector.x * speed, windy = windVector.y * speed; + + float scale = 1f / noisescl; + float scroll = Time.time() * scale; + Tmp.tr1.texture = noise; + Core.camera.bounds(Tmp.r1); + Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); + Tmp.tr1.scroll(-windx * scroll, -windy * scroll); + Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); + } + @Override public boolean isHidden(){ return true; diff --git a/core/src/mindustry/type/weather/ParticleWeather.java b/core/src/mindustry/type/weather/ParticleWeather.java new file mode 100644 index 0000000000..facb4d7297 --- /dev/null +++ b/core/src/mindustry/type/weather/ParticleWeather.java @@ -0,0 +1,79 @@ +package mindustry.type.weather; + +import arc.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class ParticleWeather extends Weather{ + public String particleRegion = "circle-shadow"; + public Color color = Color.white.cpy(); + public TextureRegion region; + public float yspeed = -2f, xspeed = 0.25f, padding = 16f, sizeMin = 2.4f, sizeMax = 12f, density = 1200f, minAlpha = 1f, maxAlpha = 1f, force = 0, noiseScale = 2000f, baseSpeed = 6.1f; + public float sinSclMin = 30f, sinSclMax = 80f, sinMagMin = 1f, sinMagMax = 7f; + + public Color stormColor = color; + public boolean drawStorm = false, drawParticles = true, useWindVector = false; + public String noisePath = "noiseAlpha"; + public @Nullable Texture noise; + + public ParticleWeather(String name){ + super(name); + } + + @Override + public void load(){ + super.load(); + + region = Core.atlas.find(particleRegion); + + //load noise texture + //TODO mod support + if(drawStorm){ + Core.assets.load("sprites/" + noisePath + ".png", Texture.class); + } + } + + @Override + public void update(WeatherState state){ + float speed = force * state.intensity; + if(speed > 0.001f){ + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; + + for(Unit unit : Groups.unit){ + unit.impulse(windx, windy); + } + } + } + + @Override + public void drawOver(WeatherState state){ + + if(drawStorm){ + if(noise == null){ + noise = Core.assets.get("sprites/" + noisePath + ".png", Texture.class); + noise.setWrap(TextureWrap.repeat); + noise.setFilter(TextureFilter.linear); + } + + drawNoise(noise, stormColor, noiseScale, state.opacity, baseSpeed, state.intensity, state.windVector); + } + + if(drawParticles){ + float windx, windy; + if(useWindVector){ + float speed = baseSpeed * state.intensity; + windx = state.windVector.x * speed; + windy = state.windVector.y * speed; + }else{ + windx = this.xspeed; + windy = this.yspeed; + } + + drawParticles(region, color, sizeMin, sizeMax, density, state.intensity, state.opacity, windx, windy, minAlpha, maxAlpha, sinSclMin, sinSclMax, sinMagMin, sinMagMax); + } + } +} diff --git a/core/src/mindustry/type/weather/RainWeather.java b/core/src/mindustry/type/weather/RainWeather.java new file mode 100644 index 0000000000..78fd096062 --- /dev/null +++ b/core/src/mindustry/type/weather/RainWeather.java @@ -0,0 +1,38 @@ +package mindustry.type.weather; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.content.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class RainWeather extends Weather{ + public float yspeed = 5f, xspeed = 1.5f, padding = 16f, density = 1200f, stroke = 0.75f, sizeMin = 8f, sizeMax = 40f, splashTimeScale = 22f; + public Liquid liquid = Liquids.water; + public TextureRegion[] splashes = new TextureRegion[12]; + public Color color = Color.valueOf("7a95eaff"); + + public RainWeather(String name){ + super(name); + } + + @Override + public void load(){ + super.load(); + + for(int i = 0; i < splashes.length; i++){ + splashes[i] = Core.atlas.find("splash-" + i); + } + } + + @Override + public void drawOver(WeatherState state){ + drawRain(sizeMin, sizeMax, xspeed, yspeed, density, state.intensity, stroke, color); + } + + @Override + public void drawUnder(WeatherState state){ + drawSplashes(splashes, sizeMax, density, state.intensity, state.opacity, splashTimeScale, stroke, color, liquid); + } +} diff --git a/core/src/mindustry/world/blocks/storage/StorageBlock.java b/core/src/mindustry/world/blocks/storage/StorageBlock.java index 71045e166b..32b3713350 100644 --- a/core/src/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/mindustry/world/blocks/storage/StorageBlock.java @@ -30,7 +30,7 @@ public class StorageBlock extends Block{ Tile edge = Edges.getFacingEdge(source, self); Tile edge2 = Edges.getFacingEdge(self, source); if(edge != null && edge2 != null){ - Fx.fuelburn.at((edge.worldx() + edge2.worldx())/2f, (edge.worldy() + edge2.worldy())/2f); + Fx.coreBurn.at((edge.worldx() + edge2.worldx())/2f, (edge.worldy() + edge2.worldy())/2f); } } } From c27251cfb09b7a9a39c9ff5488ff371e8c68d79f Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 19 Oct 2020 18:28:37 -0400 Subject: [PATCH 29/44] Fog --- core/assets/bundles/bundle.properties | 1 + core/assets/shaders/default.frag | 9 ++++ core/assets/sprites/fog.png | Bin 0 -> 48485 bytes core/src/mindustry/content/Weathers.java | 33 +++++++++++--- core/src/mindustry/core/World.java | 3 +- core/src/mindustry/type/UnitType.java | 4 +- core/src/mindustry/type/Weather.java | 6 +-- .../type/weather/ParticleWeather.java | 41 +++++++++++------- core/src/mindustry/world/Block.java | 2 +- 9 files changed, 72 insertions(+), 27 deletions(-) create mode 100644 core/assets/shaders/default.frag create mode 100644 core/assets/sprites/fog.png diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 1a3b4b1dde..d95145dfb6 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: diff --git a/core/assets/shaders/default.frag b/core/assets/shaders/default.frag new file mode 100644 index 0000000000..93be3cffc9 --- /dev/null +++ b/core/assets/shaders/default.frag @@ -0,0 +1,9 @@ +varying lowp vec4 v_color; +varying lowp vec4 v_mix_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +void main(){ + vec4 c = texture2D(u_texture, v_texCoords); + gl_FragColor = v_color * mix(c, vec4(v_mix_color.rgb, c.a), v_mix_color.a); +} \ No newline at end of file diff --git a/core/assets/sprites/fog.png b/core/assets/sprites/fog.png new file mode 100644 index 0000000000000000000000000000000000000000..5121693e582c7a231147c9f919e2c5d917ad588b GIT binary patch literal 48485 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 literal 0 HcmV?d00001 diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index d3758eebfb..6f75d477ef 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -1,6 +1,7 @@ package mindustry.content; import arc.graphics.*; +import arc.util.*; import mindustry.ctype.*; import mindustry.type.*; import mindustry.type.weather.*; @@ -11,7 +12,8 @@ public class Weathers implements ContentList{ rain, snow, sandstorm, - sporestorm; + sporestorm, + fog; @Override public void load(){ @@ -29,8 +31,8 @@ public class Weathers implements ContentList{ }}; sandstorm = new ParticleWeather("sandstorm"){{ - color = stormColor = Color.valueOf("f7cba4"); - drawStorm = true; + color = noiseColor = Color.valueOf("f7cba4"); + drawNoise = true; useWindVector = true; sizeMax = 140f; sizeMin = 70f; @@ -45,9 +47,9 @@ public class Weathers implements ContentList{ }}; sporestorm = new ParticleWeather("sporestorm"){{ - color = stormColor = Color.valueOf("7457ce"); + color = noiseColor = Color.valueOf("7457ce"); particleRegion = "circle"; - drawStorm = true; + drawNoise = true; statusGround = false; useWindVector = true; sizeMax = 5f; @@ -62,5 +64,26 @@ public class Weathers implements ContentList{ opacityMultiplier = 0.85f; force = 0.1f; }}; + + fog = new ParticleWeather("fog"){{ + duration = 15f * Time.toMinutes; + noiseLayers = 3; + noiseLayerSclM = 0.8f; + noiseLayerAlphaM = 0.7f; + noiseLayerSpeedM = 2f; + noiseLayerSclM = 0.6f; + baseSpeed = 0.05f; + color = noiseColor = Color.grays(0.4f); + noiseScale = 1100f; + noisePath = "fog"; + drawParticles = false; + drawNoise = true; + useWindVector = false; + xspeed = 1f; + yspeed = 0.01f; + attrs.set(Attribute.light, -0.3f); + attrs.set(Attribute.water, 0.05f); + opacityMultiplier = 0.45f; + }}; } } diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 41472410f4..60beec266b 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -310,7 +310,7 @@ public class World{ //TODO bad code boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow"); - boolean hasRain = !hasSnow && floors[0].name.contains("water"); + boolean hasRain = !hasSnow && content.contains(Liquids.water) && !floors[0].name.contains("sand"); boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand"); boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted"); @@ -320,6 +320,7 @@ public class World{ if(hasRain){ state.rules.weather.add(new WeatherEntry(Weathers.rain)); + state.rules.weather.add(new WeatherEntry(Weathers.fog)); } if(hasDesert){ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 55c1784fd3..43d5f05bd9 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -159,11 +159,11 @@ public class UnitType extends UnlockableContent{ table.table(bars -> { bars.defaults().growX().height(20f).pad(4); - bars.add(new Bar("blocks.health", Pal.health, unit::healthf).blink(Color.white)); + bars.add(new Bar("stat.health", Pal.health, unit::healthf).blink(Color.white)); bars.row(); if(state.rules.unitAmmo){ - bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("blocks.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); + bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("stat.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); bars.row(); } }).growX(); diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 675e378541..4d17ab7c0e 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -209,15 +209,15 @@ public abstract class Weather extends UnlockableContent{ } } - public void drawNoise(Texture noise, Color color, float noisescl, float opacity, float baseSpeed, float intensity, Vec2 windVector){ + public void drawNoise(Texture noise, Color color, float noisescl, float opacity, float baseSpeed, float intensity, float vwindx, float vwindy, float offset){ Draw.alpha(opacity); Draw.tint(color); float speed = baseSpeed * intensity; - float windx = windVector.x * speed, windy = windVector.y * speed; + float windx = vwindx * speed, windy = vwindy * speed; float scale = 1f / noisescl; - float scroll = Time.time() * scale; + float scroll = Time.time() * scale + offset; Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); diff --git a/core/src/mindustry/type/weather/ParticleWeather.java b/core/src/mindustry/type/weather/ParticleWeather.java index facb4d7297..060e9cbe62 100644 --- a/core/src/mindustry/type/weather/ParticleWeather.java +++ b/core/src/mindustry/type/weather/ParticleWeather.java @@ -15,8 +15,10 @@ public class ParticleWeather extends Weather{ public float yspeed = -2f, xspeed = 0.25f, padding = 16f, sizeMin = 2.4f, sizeMax = 12f, density = 1200f, minAlpha = 1f, maxAlpha = 1f, force = 0, noiseScale = 2000f, baseSpeed = 6.1f; public float sinSclMin = 30f, sinSclMax = 80f, sinMagMin = 1f, sinMagMax = 7f; - public Color stormColor = color; - public boolean drawStorm = false, drawParticles = true, useWindVector = false; + public Color noiseColor = color; + public boolean drawNoise = false, drawParticles = true, useWindVector = false; + public int noiseLayers = 1; + public float noiseLayerSpeedM = 1.1f, noiseLayerAlphaM = 0.8f, noiseLayerSclM = 0.99f, noiseLayerColorM = 1f; public String noisePath = "noiseAlpha"; public @Nullable Texture noise; @@ -32,7 +34,7 @@ public class ParticleWeather extends Weather{ //load noise texture //TODO mod support - if(drawStorm){ + if(drawNoise){ Core.assets.load("sprites/" + noisePath + ".png", Texture.class); } } @@ -52,27 +54,36 @@ public class ParticleWeather extends Weather{ @Override public void drawOver(WeatherState state){ - if(drawStorm){ + float windx, windy; + if(useWindVector){ + float speed = baseSpeed * state.intensity; + windx = state.windVector.x * speed; + windy = state.windVector.y * speed; + }else{ + windx = this.xspeed; + windy = this.yspeed; + } + + if(drawNoise){ if(noise == null){ noise = Core.assets.get("sprites/" + noisePath + ".png", Texture.class); noise.setWrap(TextureWrap.repeat); noise.setFilter(TextureFilter.linear); } - drawNoise(noise, stormColor, noiseScale, state.opacity, baseSpeed, state.intensity, state.windVector); + float sspeed = 1f, sscl = 1f, salpha = 1f, offset = 0f; + Color col = Tmp.c1.set(noiseColor); + for(int i = 0; i < noiseLayers; i++){ + drawNoise(noise, noiseColor, noiseScale * sscl, state.opacity * salpha * opacityMultiplier, baseSpeed * sspeed, state.intensity, windx, windy, offset); + sspeed *= noiseLayerSpeedM; + salpha *= noiseLayerAlphaM; + sscl *= noiseLayerSclM; + offset += 0.29f; + col.mul(noiseLayerColorM); + } } if(drawParticles){ - float windx, windy; - if(useWindVector){ - float speed = baseSpeed * state.intensity; - windx = state.windVector.x * speed; - windy = state.windVector.y * speed; - }else{ - windx = this.xspeed; - windy = this.yspeed; - } - drawParticles(region, color, sizeMin, sizeMax, density, state.intensity, state.opacity, windx, windy, minAlpha, maxAlpha, sinSclMin, sinSclMax, sinMagMin, sinMagMax); } } diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index f977a24743..09814e1333 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -343,7 +343,7 @@ public class Block extends UnlockableContent{ } public void setBars(){ - bars.add("health", entity -> new Bar("blocks.health", Pal.health, entity::healthf).blink(Color.white)); + bars.add("health", entity -> new Bar("stat.health", Pal.health, entity::healthf).blink(Color.white)); if(hasLiquids){ Func current; From d3e26c7c166723f726afb8632df425305616387f Mon Sep 17 00:00:00 2001 From: summetdev Date: Tue, 20 Oct 2020 13:33:28 +0300 Subject: [PATCH 30/44] Admin chat command --- core/src/mindustry/core/NetServer.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index d9f944c1aa..1bdf70f771 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -299,6 +299,15 @@ public class NetServer implements ApplicationListener{ } }); + clientCommands.register("a", "", "Send a message only to admins.", (args, player) -> { + if(!player.admin){ + player.sendMessage("[scarlet]You must be admin to use this command."); + return; + } + + Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[#FF4000]" + NetClient.colorizeName(player.id, player.name))); + }); + //duration of a a kick in seconds int kickDuration = 60 * 60; //voting round duration in seconds From 89fca49b91681b6969fa273ac98c89583211742d Mon Sep 17 00:00:00 2001 From: summetdev Date: Tue, 20 Oct 2020 13:51:21 +0300 Subject: [PATCH 31/44] Put admin color to Pal --- core/src/mindustry/core/NetServer.java | 3 ++- core/src/mindustry/graphics/Pal.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 1bdf70f771..304cc7bbb4 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -18,6 +18,7 @@ import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.net.*; import mindustry.net.Administration.*; import mindustry.net.Packets.*; @@ -305,7 +306,7 @@ public class NetServer implements ApplicationListener{ return; } - Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[#FF4000]" + NetClient.colorizeName(player.id, player.name))); + Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[" + Pal.adminChat + "]" + NetClient.colorizeName(player.id, player.name))); }); //duration of a a kick in seconds diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 753bbbbbed..62e48199bb 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -94,5 +94,7 @@ public class Pal{ redDust = Color.valueOf("ffa480"), redderDust = Color.valueOf("ff7b69"), - plasticSmoke = Color.valueOf("f1e479"); + plasticSmoke = Color.valueOf("f1e479"), + + adminChat = Color.valueOf("ff4000"); } From 9f95aa035d76f21e5b862de921dceed5701fde79 Mon Sep 17 00:00:00 2001 From: summetdev Date: Tue, 20 Oct 2020 13:56:09 +0300 Subject: [PATCH 32/44] Indents --- core/src/mindustry/graphics/Pal.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 62e48199bb..8bb3cd9e70 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -96,5 +96,5 @@ public class Pal{ plasticSmoke = Color.valueOf("f1e479"), - adminChat = Color.valueOf("ff4000"); + adminChat = Color.valueOf("ff4000"); } From 0c1c0f95574c474a651b3d38f00d96412f15fc94 Mon Sep 17 00:00:00 2001 From: summetdev Date: Tue, 20 Oct 2020 13:56:53 +0300 Subject: [PATCH 33/44] Admin -> A --- core/src/mindustry/core/NetServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 304cc7bbb4..082d94101d 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -306,7 +306,7 @@ public class NetServer implements ApplicationListener{ return; } - Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[" + Pal.adminChat + "]" + NetClient.colorizeName(player.id, player.name))); + Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[" + Pal.adminChat + "]" + NetClient.colorizeName(player.id, player.name))); }); //duration of a a kick in seconds From ffb94576ac6e749af5544cffe3ba5b801a33d3a7 Mon Sep 17 00:00:00 2001 From: Summet Date: Tue, 20 Oct 2020 15:04:03 +0300 Subject: [PATCH 34/44] Better colors Co-authored-by: Patrick 'Quezler' Mounier --- core/src/mindustry/core/NetServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 082d94101d..198b1bdaae 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -306,7 +306,7 @@ public class NetServer implements ApplicationListener{ return; } - Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[" + Pal.adminChat + "]" + NetClient.colorizeName(player.id, player.name))); + Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[#" + Pal.adminChat.toString() + "]" + NetClient.colorizeName(player.id, player.name))); }); //duration of a a kick in seconds From 9060a9518a34586e13b59d5d069784d83bbbb093 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 09:05:41 -0400 Subject: [PATCH 35/44] Fixed #3037 --- core/src/mindustry/maps/SectorDamage.java | 19 +++++++++++++------ .../blocks/defense/turrets/ItemTurret.java | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 0400d28717..b084f75c10 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -185,14 +185,18 @@ public class SectorDamage{ } //create sparse tile array for fast range query - int sparseSkip = 6; + int sparseSkip = 5, sparseSkip2 = 3; //TODO if this is slow, use a quadtree Seq sparse = new Seq<>(path.size / sparseSkip + 1); + Seq sparse2 = new Seq<>(path.size / sparseSkip2 + 1); for(int i = 0; i < path.size; i++){ if(i % sparseSkip == 0){ sparse.add(path.get(i)); } + if(i % sparseSkip2 == 0){ + sparse2.add(path.get(i)); + } } //regen is in health per second @@ -202,8 +206,11 @@ public class SectorDamage{ //first, calculate the total health of blocks in the path - for(Tile t : path){ - int radius = 2; + //radius around the path that gets counted + int radius = 7; + IntSet counted = new IntSet(); + + for(Tile t : sparse2){ //radius is square. for(int dx = -radius; dx <= radius; dx++){ @@ -212,7 +219,7 @@ public class SectorDamage{ if(wx >= 0 && wy >= 0 && wx < world.width() && wy < world.height()){ Tile tile = world.rawTile(wx, wy); - if(tile.build != null && tile.team() == state.rules.defaultTeam){ + if(tile.build != null && tile.team() == state.rules.defaultTeam && counted.add(tile.pos())){ //health is divided by block size, because multiblocks are counted multiple times. sumHealth += tile.build.health / tile.block().size; totalPathBuild += 1f / tile.block().size; @@ -228,7 +235,7 @@ public class SectorDamage{ for(Building build : Groups.build){ float e = build.efficiency(); if(e > 0.08f){ - if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range()))){ + if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + radius*tilesize))){ if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){ sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e; } @@ -304,7 +311,7 @@ public class SectorDamage{ //enemy units like to aim for a lot of non-essential things, so increase resulting health slightly info.sumHealth = sumHealth * 1.2f; //players tend to have longer range units/turrets, so assume DPS is higher - info.sumDps = sumDps * 1.2f; + info.sumDps = sumDps * 1.5f; info.sumRps = sumRps; //finally, find an equation to put it all together and produce a 0-1 number diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 8544ca2cce..e3a9ed97eb 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -83,7 +83,7 @@ public class ItemTurret extends Turret{ public void displayBars(Table bars){ super.displayBars(bars); - bars.add(new Bar("blocks.ammo", Pal.ammo, () -> (float)totalAmmo / maxAmmo)).growX(); + bars.add(new Bar("stat.ammo", Pal.ammo, () -> (float)totalAmmo / maxAmmo)).growX(); bars.row(); } From 9ab272a01fd25f477a658176f1ccf296069491f2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 11:21:47 -0400 Subject: [PATCH 36/44] Better server colors --- core/src/mindustry/Vars.java | 19 +- core/src/mindustry/core/NetClient.java | 4 +- core/src/mindustry/core/NetServer.java | 8 +- .../mindustry/ctype/UnlockableContent.java | 8 + core/src/mindustry/game/Universe.java | 6 + core/src/mindustry/io/legacy/LegacyIO.java | 33 ++++ core/src/mindustry/mod/Scripts.java | 8 +- core/src/mindustry/net/Administration.java | 5 +- core/src/mindustry/net/NetworkIO.java | 2 - gradle.properties | 2 +- .../src/mindustry/server/ServerControl.java | 184 +++++++++--------- .../src/mindustry/server/ServerLauncher.java | 8 +- tests/src/test/java/ApplicationTests.java | 2 +- .../src/test/java/power/PowerTestFixture.java | 2 +- tools/src/mindustry/tools/ImagePacker.java | 4 +- 15 files changed, 176 insertions(+), 119 deletions(-) diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 2653b55975..2cf07cbea6 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -89,7 +89,7 @@ public class Vars implements Loadable{ /** duration of time between turns in ticks */ public static final float turnDuration = 2 * Time.toMinutes; /** chance of an invasion per turn, 1 = 100% */ - public static final float baseInvasionChance = 1f / 25f; + public static final float baseInvasionChance = 1f / 30f; /** how many turns have to pass before invasions start */ public static final int invasionGracePeriod = 20; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ @@ -285,10 +285,10 @@ public class Vars implements Loadable{ if(loadedLogger) return; String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""}; - String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + String[] stags = {"&lc&fb[D]", "&lb&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; Seq logBuffer = new Seq<>(); - Log.setLogger((level, text) -> { + Log.logger = (level, text) -> { String result = text; String rawText = Log.format(stags[level.ordinal()] + "&fr " + text); System.out.println(rawText); @@ -304,9 +304,9 @@ public class Vars implements Loadable{ } } - ui.scriptfrag.addMessage(Log.removeCodes(result)); + ui.scriptfrag.addMessage(Log.removeColors(result)); } - }); + }; Events.on(ClientLoadEvent.class, e -> logBuffer.each(ui.scriptfrag::addMessage)); @@ -319,18 +319,19 @@ public class Vars implements Loadable{ settings.setAppName(appName); Writer writer = settings.getDataDirectory().child("last_log.txt").writer(false); - LogHandler log = Log.getLogger(); - Log.setLogger((level, text) -> { + LogHandler log = Log.logger; + //ignore it + Log.logger = (level, text) -> { log.log(level, text); try{ - writer.write("[" + Character.toUpperCase(level.name().charAt(0)) +"] " + Log.removeCodes(text) + "\n"); + writer.write("[" + Character.toUpperCase(level.name().charAt(0)) +"] " + Log.removeColors(text) + "\n"); writer.flush(); }catch(IOException e){ e.printStackTrace(); //ignore it } - }); + }; loadedFileLogger = true; } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index ae8c7d9a7c..3c6214fd85 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -194,14 +194,14 @@ public class NetClient implements ApplicationListener{ } //server console logging - Log.info("&y@: &lb@", player.name, message); + Log.info("&fi@: @", "&lc" + player.name, "&lw" + message); //invoke event for all clients but also locally //this is required so other clients get the correct name even if they don't know who's sending it yet Call.sendMessage(message, colorizeName(player.id(), player.name), player); }else{ //log command to console but with brackets - Log.info("<&y@: &lm@&lg>", player.name, message); + Log.info("<&fi@: @&fr>", "&lk" + player.name, "&lw" + message); //a command was sent, now get the output if(response.type != ResponseType.valid){ diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index d9f944c1aa..74e3ebb9c5 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -508,7 +508,8 @@ public class NetServer implements ApplicationListener{ Call.playerDisconnect(player.id()); } - if(Config.showConnectMessages.bool()) Log.info("&lm[@] &lc@ has disconnected. &lg&fi(@)", player.uuid(), player.name, reason); + String message = Strings.format("&lb@&fi&lk has disconnected. &fi&lk[&lb@&fi&lk] (@)", player.name, player.uuid(), reason); + if(Config.showConnectMessages.bool()) Log.info(message); } player.remove(); @@ -736,7 +737,8 @@ public class NetServer implements ApplicationListener{ if(Config.showConnectMessages.bool()){ Call.sendMessage("[accent]" + player.name + "[accent] has connected."); - Log.info("&lm[@] &y@ has connected.", player.uuid(), player.name); + String message = Strings.format("&lb@&fi&lk has connected. &fi&lk[&lb@&fi&lk]", player.name, player.uuid()); + Log.info(message); } if(!Config.motd.string().equalsIgnoreCase("off")){ @@ -785,7 +787,7 @@ public class NetServer implements ApplicationListener{ public void openServer(){ try{ net.host(Config.port.num()); - info("&lcOpened a server on port @.", Config.port.num()); + info("Opened a server on port @.", Config.port.num()); }catch(BindException e){ Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); state.set(State.menu); diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index d3f21845ad..9020cd0ff1 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -112,6 +112,14 @@ public abstract class UnlockableContent extends MappableContent{ } } + /** Unlocks this content, but does not fire any events. */ + public void quiteUnlock(){ + if(!unlocked()){ + unlocked = true; + Core.settings.put(name + "-unlocked", true); + } + } + public boolean unlocked(){ if(net.client()) return state.rules.researched.contains(name); return unlocked || alwaysUnlocked; diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 2140f08271..9b1064a791 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -6,6 +6,7 @@ import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; +import mindustry.io.legacy.*; import mindustry.maps.*; import mindustry.type.*; import mindustry.world.blocks.storage.*; @@ -260,6 +261,11 @@ public class Universe{ private void load(){ seconds = Core.settings.getInt("utimei"); turn = Core.settings.getInt("turn"); + + if(Core.settings.has("unlocks")){ + LegacyIO.readResearch(); + Core.settings.remove("unlocks"); + } } } diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/legacy/LegacyIO.java index 545487d8ca..0bb84f3fc7 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/legacy/LegacyIO.java @@ -2,6 +2,8 @@ package mindustry.io.legacy; import arc.*; import arc.struct.*; +import mindustry.*; +import mindustry.ctype.*; import mindustry.ui.dialogs.JoinDialog.*; import java.io.*; @@ -48,4 +50,35 @@ public class LegacyIO{ return arr; } + public static void readResearch(){ + try{ + byte[] bytes = Core.settings.getBytes("unlocks"); + DataInputStream stream = new DataInputStream(new ByteArrayInputStream(bytes)); + + int length = stream.readInt(); + if(length > 0){ + stream.readUTF(); //name of key type + stream.readUTF(); //name of value type + + //each element is an array list + for(int i = 0; i < length; i++){ + ContentType type = ContentType.all[stream.readInt()]; + int arrLength = stream.readInt(); + if(arrLength > 0){ + stream.readUTF(); //type of contents (String) + for(int j = 0; j < arrLength; j++){ + String name = stream.readUTF(); + Content out = Vars.content.getByName(type, name); + if(out instanceof UnlockableContent u){ + u.unlock(); + } + } + } + } + } + }catch(Exception e){ + e.printStackTrace(); + } + } + } diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 1aa260e8fa..f372586863 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -59,12 +59,12 @@ public class Scripts implements Disposable{ if(o instanceof Undefined) o = "undefined"; return String.valueOf(o); }catch(Throwable t){ - return getError(t); + return getError(t, false); } } - private String getError(Throwable t){ - t.printStackTrace(); + private String getError(Throwable t, boolean log){ + if(log) Log.err(t); return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); } @@ -138,7 +138,7 @@ public class Scripts implements Disposable{ if(currentMod != null){ file = currentMod.name + "/" + file; } - log(LogLevel.err, file, "" + getError(t)); + log(LogLevel.err, file, "" + getError(t, true)); return false; } } diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index f185744c28..ccf5f76755 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -577,7 +577,10 @@ public class Administration{ autosave("Whether the periodically save the map when playing.", false), autosaveAmount("The maximum amount of autosaves. Older ones get replaced.", 10), autosaveSpacing("Spacing between autosaves in seconds.", 60 * 5), - debug("Enable debug logging", false, () -> Log.setLogLevel(debug() ? LogLevel.debug : LogLevel.info)); + debug("Enable debug logging", false, () -> { + LogLevel level = debug() ? LogLevel.debug : LogLevel.info; + Log.level = level; + }); public static final Config[] all = values(); diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index acaf9f9640..f4494e1c4f 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -58,8 +58,6 @@ public class NetworkIO{ state.rules = JsonIO.read(Rules.class, stream.readUTF()); state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream)); - Log.info("READ RULES: @", state.rules.researched); - state.wave = stream.readInt(); state.wavetime = stream.readFloat(); diff --git a/gradle.properties b/gradle.properties index 0ebd9ffd28..5cda8698c7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=46ebdb4aeb1e03ca6b3b4c27a93533dc92278a33 +archash=723aa43b053b753631ed54906e7669132cddfdc6 diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 48f529b187..7e1be67c52 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -30,6 +30,7 @@ import java.time.*; import java.time.format.*; import java.util.*; +import static arc.util.ColorCodes.*; import static arc.util.Log.*; import static mindustry.Vars.*; @@ -37,7 +38,7 @@ public class ServerControl implements ApplicationListener{ private static final int roundExtraTime = 12; private static final int maxLogLength = 1024 * 512; - protected static String[] tags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + protected static String[] tags = {"&lc&fb[D]&fr", "&lb&fb[I]&fr", "&ly&fb[W]&fr", "&lr&fb[E]", ""}; protected static DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss"), autosaveDate = DateTimeFormatter.ofPattern("MM-dd-yyyy_HH-mm-ss"); @@ -74,22 +75,27 @@ public class ServerControl implements ApplicationListener{ lastMode = Gamemode.survival; } - Log.setLogger((level, text) -> { - String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr"); + logger = (level1, text) -> { + String result = bold + lightBlack + "[" + dateTime.format(LocalDateTime.now()) + "] " + reset + format(tags[level1.ordinal()] + " " + text + "&fr"); System.out.println(result); if(Config.logging.bool()){ - logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + formatColors(tags[level.ordinal()] + " " + text + "&fr", false)); + logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + formatColors(tags[level1.ordinal()] + " " + text + "&fr", false)); } if(socketOutput != null){ try{ socketOutput.println(formatColors(text + "&fr", false)); - }catch(Throwable e){ - err("Error occurred logging to socket: @", e.getClass().getSimpleName()); + }catch(Throwable e1){ + err("Error occurred logging to socket: @", e1.getClass().getSimpleName()); } } - }); + }; + + formatter = (text, useColors, arg) -> { + text = Strings.format(text.replace("@", "&fb&lb@&fr"), arg); + return useColors ? addColors(text) : removeColors(text); + }; Time.setDeltaProvider(() -> Core.graphics.getDeltaTime() * 60f); @@ -115,12 +121,12 @@ public class ServerControl implements ApplicationListener{ if(args.length > 0){ commands.addAll(Strings.join(" ", args).split(",")); - info("&lmFound @ command-line arguments to parse.", commands.size); + info("Found @ command-line arguments to parse.", commands.size); } if(!Config.startCommands.string().isEmpty()){ String[] startup = Strings.join(" ", Config.startCommands.string()).split(","); - info("&lmFound @ startup commands.", startup.length); + info("Found @ startup commands.", startup.length); commands.addAll(startup); } @@ -128,7 +134,7 @@ public class ServerControl implements ApplicationListener{ CommandResponse response = handler.handleMessage(s); if(response.type != ResponseType.valid){ err("Invalid command argument sent: '@': @", s, response.type.name()); - err("Argument usage: &lc , "); + err("Argument usage: &lb , "); } } }); @@ -141,7 +147,7 @@ public class ServerControl implements ApplicationListener{ if(Version.build == -1){ warn("&lyYour server is running a custom build, which means that client checking is disabled."); - warn("&lyIt is highly advised to specify which version you're using by building with gradle args &lc-Pbuildversion=&lm&ly."); + warn("&lyIt is highly advised to specify which version you're using by building with gradle args &lb&fb-Pbuildversion=&lr"); } //set up default shuffle mode @@ -154,9 +160,9 @@ public class ServerControl implements ApplicationListener{ Events.on(GameOverEvent.class, event -> { if(inExtraRound) return; if(state.rules.waves){ - info("&lcGame over! Reached wave &ly@&lc with &ly@&lc players online on map &ly@&lc.", state.wave, Groups.player.size(), Strings.capitalize(state.map.name())); + info("Game over! Reached wave @ with @ players online on map @.", state.wave, Groups.player.size(), Strings.capitalize(state.map.name())); }else{ - info("&lcGame over! Team &ly@&lc is victorious with &ly@&lc players online on map &ly@&lc.", event.winner.name, Groups.player.size(), Strings.capitalize(state.map.name())); + info("Game over! Team @ is victorious with @ players online on map @.", event.winner.name, Groups.player.size(), Strings.capitalize(state.map.name())); } //set next map to be played @@ -209,11 +215,11 @@ public class ServerControl implements ApplicationListener{ String fileName = "auto_" + mapName + "_" + date + "." + saveExtension; Fi file = saveDirectory.child(fileName); - info("&lbAutosaving..."); + info("Autosaving..."); try{ SaveIO.save(file); - info("&lbAutosave completed."); + info("Autosave completed."); }catch(Throwable e){ err("Autosave failed.", e); } @@ -241,25 +247,25 @@ public class ServerControl implements ApplicationListener{ Timer.schedule(() -> Core.settings.forceSave(), saveInterval, saveInterval); if(!mods.list().isEmpty()){ - info("&lc@ mods loaded.", mods.list().size); + info("@ mods loaded.", mods.list().size); } toggleSocket(Config.socketInput.bool()); - info("&lcServer loaded. Type &ly'help'&lc for help."); + info("Server loaded. Type @ for help.", "'help'"); } private void registerCommands(){ handler.register("help", "Displays this command list.", arg -> { info("Commands:"); for(Command command : handler.getCommandList()){ - info(" &y" + command.text + (command.paramText.isEmpty() ? "" : " ") + command.paramText + " - &lm" + command.description); + info(" &b&lb " + command.text + (command.paramText.isEmpty() ? "" : " &lc&fi") + command.paramText + "&fr - &lw" + command.description); } }); handler.register("version", "Displays server version info.", arg -> { - info("&lmVersion: &lyMindustry @-@ @ / build @", Version.number, Version.modifier, Version.type, Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); - info("&lmJava Version: &ly@", System.getProperty("java.version")); + info("Version: Mindustry @-@ @ / build @", Version.number, Version.modifier, Version.type, Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); + info("Java Version: @", System.getProperty("java.version")); }); handler.register("exit", "Exit the server application.", arg -> { @@ -299,7 +305,7 @@ public class ServerControl implements ApplicationListener{ result = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); if(result == null){ - err("No map with name &y'@'&lr found.", arg[0]); + err("No map with name '@' found.", arg[0]); return; } }else{ @@ -329,21 +335,21 @@ public class ServerControl implements ApplicationListener{ if(!maps.all().isEmpty()){ info("Maps:"); for(Map map : maps.all()){ - info(" &ly@: &lb&fi@ / @x@", map.name(), map.custom ? "Custom" : "Default", map.width, map.height); + info(" @: &fi@ / @x@", map.name(), map.custom ? "Custom" : "Default", map.width, map.height); } }else{ info("No maps found."); } - info("&lyMap directory: &lb&fi@", customMapDirectory.file().getAbsoluteFile().toString()); + info("Map directory: &fi@", customMapDirectory.file().getAbsoluteFile().toString()); }); handler.register("reloadmaps", "Reload all maps from disk.", arg -> { int beforeMaps = maps.all().size; maps.reload(); if(maps.all().size > beforeMaps){ - info("&lc@&ly new map(s) found and reloaded.", maps.all().size - beforeMaps); + info("@ new map(s) found and reloaded.", maps.all().size - beforeMaps); }else{ - info("&lyMaps reloaded."); + info("Maps reloaded."); } }); @@ -352,23 +358,23 @@ public class ServerControl implements ApplicationListener{ info("Status: &rserver closed"); }else{ info("Status:"); - info(" &lyPlaying on map &fi@&fb &lb/&ly Wave @", Strings.capitalize(state.map.name()), state.wave); + info(" Playing on map &fi@ / Wave @", Strings.capitalize(state.map.name()), state.wave); if(state.rules.waves){ - info("&ly @ enemies.", state.enemies); + info(" @ enemies.", state.enemies); }else{ - info("&ly @ seconds until next wave.", (int)(state.wavetime / 60)); + info(" @ seconds until next wave.", (int)(state.wavetime / 60)); } - info(" &ly@ FPS, @ MB used.", Core.graphics.getFramesPerSecond(), Core.app.getJavaHeap() / 1024 / 1024); + info(" @ FPS, @ MB used.", Core.graphics.getFramesPerSecond(), Core.app.getJavaHeap() / 1024 / 1024); if(Groups.player.size() > 0){ - info(" &lyPlayers: @", Groups.player.size()); + info(" Players: @", Groups.player.size()); for(Player p : Groups.player){ - info(" &y@ / @", p.name(), p.uuid()); + info(" @ / @", p.name, p.uuid()); } }else{ - info(" &lyNo players connected."); + info(" No players connected."); } } }); @@ -377,30 +383,30 @@ public class ServerControl implements ApplicationListener{ if(!mods.list().isEmpty()){ info("Mods:"); for(LoadedMod mod : mods.list()){ - info(" &ly@ &lcv@", mod.meta.displayName(), mod.meta.version); + info(" @ &fi@", mod.meta.displayName(), mod.meta.version); } }else{ info("No mods found."); } - info("&lyMod directory: &lb&fi@", modDirectory.file().getAbsoluteFile().toString()); + info("Mod directory: &fi@", modDirectory.file().getAbsoluteFile().toString()); }); handler.register("mod", "", "Display information about a loaded plugin.", arg -> { LoadedMod mod = mods.list().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); if(mod != null){ - info("Name: &ly@", mod.meta.displayName()); - info("Internal Name: &ly@", mod.name); - info("Version: &ly@", mod.meta.version); - info("Author: &ly@", mod.meta.author); - info("Path: &ly@", mod.file.path()); - info("Description: &ly@", mod.meta.description); + info("Name: @", mod.meta.displayName()); + info("Internal Name: @", mod.name); + info("Version: @", mod.meta.version); + info("Author: @", mod.meta.author); + info("Path: @", mod.file.path()); + info("Description: @", mod.meta.description); }else{ - info("No mod with name &ly'@'&lg found."); + info("No mod with name '@' found."); } }); handler.register("js", "", "Run arbitrary Javascript.", arg -> { - info("&lc" + mods.getScripts().runConsole(arg[0])); + info("&fi&lw&fb" + mods.getScripts().runConsole(arg[0])); }); handler.register("say", "", "Send a message to all players.", arg -> { @@ -411,7 +417,7 @@ public class ServerControl implements ApplicationListener{ Call.sendMessage("[scarlet][[Server]:[] " + arg[0]); - info("&lyServer: &lb@", arg[0]); + info("&fi&lcServer: &fr@", "&lw" + arg[0]); }); @@ -426,7 +432,7 @@ public class ServerControl implements ApplicationListener{ JsonValue base = JsonIO.json().fromJson(null, rules); if(arg.length == 0){ - Log.info("&lyRules:\n@", JsonIO.print(rules)); + Log.info("Rules:\n@", JsonIO.print(rules)); }else if(arg.length == 1){ Log.err("Invalid usage. Specify which rule to remove or add."); }else{ @@ -438,7 +444,7 @@ public class ServerControl implements ApplicationListener{ boolean remove = arg[0].equals("remove"); if(remove){ if(base.has(arg[1])){ - Log.info("Rule &lc'@'&lg removed.", arg[1]); + Log.info("Rule '@' removed.", arg[1]); base.remove(arg[1]); }else{ Log.err("Rule not defined, so not removed."); @@ -462,7 +468,7 @@ public class ServerControl implements ApplicationListener{ base.remove(value.name); } base.addChild(arg[1], value); - Log.info("Changed rule: &ly@", value.toString().replace("\n", " ")); + Log.info("Changed rule: @", value.toString().replace("\n", " ")); }catch(Throwable e){ Log.err("Error parsing rule JSON: @", e.getMessage()); } @@ -501,7 +507,7 @@ public class ServerControl implements ApplicationListener{ handler.register("playerlimit", "[off/somenumber]", "Set the server player limit.", arg -> { if(arg.length == 0){ - info("Player limit is currently &lc@.", netServer.admins.getPlayerLimit() == 0 ? "off" : netServer.admins.getPlayerLimit()); + info("Player limit is currently @.", netServer.admins.getPlayerLimit() == 0 ? "off" : netServer.admins.getPlayerLimit()); return; } if(arg[0].equals("off")){ @@ -521,11 +527,11 @@ public class ServerControl implements ApplicationListener{ handler.register("config", "[name] [value...]", "Configure server settings.", arg -> { if(arg.length == 0){ - info("&lyAll config values:"); + info("All config values:"); for(Config c : Config.all){ - Log.info("&ly| &lc@:&lm @", c.name(), c.get()); - Log.info("&ly| | @", c.description); - Log.info("&ly|"); + Log.info("&lk| @: @", c.name(), "&lc&fi" + c.get()); + Log.info("&lk| | &lw" + c.description); + Log.info("&lk|"); } return; } @@ -533,7 +539,7 @@ public class ServerControl implements ApplicationListener{ try{ Config c = Config.valueOf(arg[0]); if(arg.length == 1){ - Log.info("&lc'@'&lg is currently &lc@.", c.name(), c.get()); + Log.info("'@' is currently @.", c.name(), c.get()); }else{ if(c.isBool()){ c.set(arg[1].equals("on") || arg[1].equals("true")); @@ -548,7 +554,7 @@ public class ServerControl implements ApplicationListener{ c.set(arg[1]); } - Log.info("&lc@&lg set to &lc@.", c.name(), c.get()); + Log.info("@ set to @.", c.name(), c.get()); Core.settings.forceSave(); } }catch(IllegalArgumentException e){ @@ -558,9 +564,9 @@ public class ServerControl implements ApplicationListener{ handler.register("subnet-ban", "[add/remove] [address]", "Ban a subnet. This simply rejects all connections with IPs starting with some string.", arg -> { if(arg.length == 0){ - Log.info("Subnets banned: &lc@", netServer.admins.getSubnetBans().isEmpty() ? "" : ""); + Log.info("Subnets banned: @", netServer.admins.getSubnetBans().isEmpty() ? "" : ""); for(String subnet : netServer.admins.getSubnetBans()){ - Log.info("&ly " + subnet + ""); + Log.info("&lw " + subnet + ""); } }else if(arg.length == 1){ err("You must provide a subnet to add or remove."); @@ -572,7 +578,7 @@ public class ServerControl implements ApplicationListener{ } netServer.admins.addSubnetBan(arg[1]); - Log.info("Banned &ly@&lc**", arg[1]); + Log.info("Banned @**", arg[1]); }else if(arg[0].equals("remove")){ if(!netServer.admins.getSubnetBans().contains(arg[1])){ err("That subnet isn't banned."); @@ -580,7 +586,7 @@ public class ServerControl implements ApplicationListener{ } netServer.admins.removeSubnetBan(arg[1]); - Log.info("Unbanned &ly@&lc**", arg[1]); + Log.info("Unbanned @**", arg[1]); }else{ err("Incorrect usage. You must provide add/remove as the second argument."); } @@ -589,12 +595,12 @@ public class ServerControl implements ApplicationListener{ handler.register("whitelisted", "List the entire whitelist.", arg -> { if(netServer.admins.getWhitelisted().isEmpty()){ - info("&lyNo whitelisted players found."); + info("No whitelisted players found."); return; } - info("&lyWhitelist:"); - netServer.admins.getWhitelisted().each(p -> Log.info("- &ly@", p.lastName)); + info("Whitelist:"); + netServer.admins.getWhitelisted().each(p -> info("- @", p.lastName)); }); handler.register("whitelist-add", "", "Add a player to the whitelist by ID.", arg -> { @@ -605,7 +611,7 @@ public class ServerControl implements ApplicationListener{ } netServer.admins.whitelist(arg[0]); - info("Player &ly'@'&lg has been whitelisted.", info.lastName); + info("Player '@' has been whitelisted.", info.lastName); }); handler.register("whitelist-remove", "", "Remove a player to the whitelist by ID.", arg -> { @@ -616,18 +622,18 @@ public class ServerControl implements ApplicationListener{ } netServer.admins.unwhitelist(arg[0]); - info("Player &ly'@'&lg has been un-whitelisted.", info.lastName); + info("Player '@' has been un-whitelisted.", info.lastName); }); handler.register("shuffle", "[none/all/custom/builtin]", "Set map shuffling mode.", arg -> { if(arg.length == 0){ - info("Shuffle mode current set to &ly'@'&lg.", maps.getShuffleMode()); + info("Shuffle mode current set to '@'.", maps.getShuffleMode()); }else{ try{ ShuffleMode mode = ShuffleMode.valueOf(arg[0]); Core.settings.put("shufflemode", mode.name()); maps.setShuffleMode(mode); - info("Shuffle mode set to &ly'@'&lg.", arg[0]); + info("Shuffle mode set to '@'.", arg[0]); }catch(Exception e){ err("Invalid shuffle mode."); } @@ -638,7 +644,7 @@ public class ServerControl implements ApplicationListener{ Map res = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); if(res != null){ nextMapOverride = res; - Log.info("Next map set to &ly'@'.", res.name()); + Log.info("Next map set to '@'.", res.name()); }else{ Log.err("No map '@' found.", arg[0]); } @@ -694,9 +700,9 @@ public class ServerControl implements ApplicationListener{ if(bans.size == 0){ info("No ID-banned players have been found."); }else{ - info("&lyBanned players [ID]:"); + info("Banned players [ID]:"); for(PlayerInfo info : bans){ - info(" &ly @ / Last known name: '@'", info.id, info.lastName); + info(" @ / Last known name: '@'", info.id, info.lastName); } } @@ -705,13 +711,13 @@ public class ServerControl implements ApplicationListener{ if(ipbans.size == 0){ info("No IP-banned players have been found."); }else{ - info("&lmBanned players [IP]:"); + info("Banned players [IP]:"); for(String string : ipbans){ PlayerInfo info = netServer.admins.findByIP(string); if(info != null){ - info(" &lm '@' / Last known name: '@' / ID: '@'", string, info.lastName, info.id); + info(" '@' / Last known name: '@' / ID: '@'", string, info.lastName, info.id); }else{ - info(" &lm '@' (No known name or info)", string); + info(" '@' (No known name or info)", string); } } } @@ -765,7 +771,7 @@ public class ServerControl implements ApplicationListener{ netServer.admins.unAdminPlayer(target.id); } if(playert != null) playert.admin = add; - info("Changed admin status of player: &ly@", target.lastName); + info("Changed admin status of player: @", target.lastName); }else{ err("Nobody with that name or ID could be found. If adding an admin by name, make sure they're online; otherwise, use their UUID."); } @@ -777,7 +783,7 @@ public class ServerControl implements ApplicationListener{ if(admins.size == 0){ info("No admins have been found."); }else{ - info("&lyAdmins:"); + info("Admins:"); for(PlayerInfo info : admins){ info(" &lm @ / ID: '@' / IP: '@'", info.lastName, info.id, info.lastIP); } @@ -788,10 +794,10 @@ public class ServerControl implements ApplicationListener{ if(Groups.player.size() == 0){ info("No players are currently in the server."); }else{ - info("&lyPlayers: @", Groups.player.size()); + info("Players: @", Groups.player.size()); for(Player user : Groups.player){ PlayerInfo userInfo = user.getInfo(); - info(" &lm @ / ID: '@' / IP: '@' / Admin: '@'", userInfo.lastName, userInfo.id, userInfo.lastIP, userInfo.admin); + info(" &lm @ / ID: @ / IP: @ / Admin: @", userInfo.lastName, userInfo.id, userInfo.lastIP, userInfo.admin); } } }); @@ -849,7 +855,7 @@ public class ServerControl implements ApplicationListener{ info("Save files: "); for(Fi file : saveDirectory.list()){ if(file.extension().equals(saveExtension)){ - info("| &ly@", file.nameWithoutExtension()); + info("| @", file.nameWithoutExtension()); } } }); @@ -860,7 +866,7 @@ public class ServerControl implements ApplicationListener{ return; } - info("&lyCore destroyed."); + info("Core destroyed."); inExtraRound = false; Events.fire(new GameOverEvent(Team.crux)); }); @@ -870,16 +876,16 @@ public class ServerControl implements ApplicationListener{ ObjectSet infos = netServer.admins.findByName(arg[0]); if(infos.size > 0){ - info("&lgPlayers found: @", infos.size); + info("Players found: @", infos.size); int i = 0; for(PlayerInfo info : infos){ - info("&lc[@] Trace info for player '@' / UUID @", i++, info.lastName, info.id); - info(" &lyall names used: @", info.names); - info(" &lyIP: @", info.lastIP); - info(" &lyall IPs used: @", info.ips); - info(" &lytimes joined: @", info.timesJoined); - info(" &lytimes kicked: @", info.timesKicked); + info("[@] Trace info for player '@' / UUID @", i++, info.lastName, info.id); + info(" all names used: @", info.names); + info(" IP: @", info.lastIP); + info(" all IPs used: @", info.ips); + info(" times joined: @", info.timesJoined); + info(" times kicked: @", info.timesKicked); } }else{ info("Nobody with that name could be found."); @@ -891,11 +897,11 @@ public class ServerControl implements ApplicationListener{ ObjectSet infos = netServer.admins.searchNames(arg[0]); if(infos.size > 0){ - info("&lgPlayers found: @", infos.size); + info("Players found: @", infos.size); int i = 0; for(PlayerInfo info : infos){ - info("- &lc[@] &ly'@'&lc / &lm@", i++, info.lastName, info.id); + info("- [@] '@' / @", i++, info.lastName, info.id); } }else{ info("Nobody with that name could be found."); @@ -906,10 +912,10 @@ public class ServerControl implements ApplicationListener{ int pre = (int)(Core.app.getJavaHeap() / 1024 / 1024); System.gc(); int post = (int)(Core.app.getJavaHeap() / 1024 / 1024); - info("&ly@&lg MB collected. Memory usage now at &ly@&lg MB.", pre - post, post); + info("@ MB collected. Memory usage now at @ MB.", pre - post, post); }); - handler.register("yes", "Run the above \"did you mean\" suggestion.", arg -> { + handler.register("yes", "Run the last suggested incorrect command.", arg -> { if(yes == null){ err("There is nothing to say yes to."); }else{ @@ -1036,7 +1042,7 @@ public class ServerControl implements ApplicationListener{ serverSocket.bind(new InetSocketAddress(Config.socketInputAddress.string(), Config.socketInputPort.num())); while(true){ Socket client = serverSocket.accept(); - info("&lmReceived command socket connection: &lb@", serverSocket.getLocalSocketAddress()); + info("&lkReceived command socket connection: &fi@", serverSocket.getLocalSocketAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); socketOutput = new PrintWriter(client.getOutputStream(), true); String line; @@ -1044,7 +1050,7 @@ public class ServerControl implements ApplicationListener{ String result = line; Core.app.post(() -> handleCommandString(result)); } - info("&lmLost command socket connection: &lb@", serverSocket.getLocalSocketAddress()); + info("&lkLost command socket connection: &fi@", serverSocket.getLocalSocketAddress()); socketOutput = null; } }catch(BindException b){ diff --git a/server/src/mindustry/server/ServerLauncher.java b/server/src/mindustry/server/ServerLauncher.java index 4c8a2bb8e6..ad274954ea 100644 --- a/server/src/mindustry/server/ServerLauncher.java +++ b/server/src/mindustry/server/ServerLauncher.java @@ -29,10 +29,10 @@ public class ServerLauncher implements ApplicationListener{ Vars.platform = new Platform(){}; Vars.net = new Net(platform.getNet()); - Log.setLogger((level, text) -> { - String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr"); - System.out.println(result); - }); + logger = (level1, text) -> { + String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level1.ordinal()] + " " + text + "&fr"); + System.out.println(result); + }; new HeadlessApplication(new ServerLauncher(), null, throwable -> CrashSender.send(throwable, f -> {})); }catch(Throwable t){ CrashSender.send(t, f -> {}); diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 01cf659df2..67d30e5ff9 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -36,7 +36,7 @@ public class ApplicationTests{ try{ boolean[] begins = {false}; Throwable[] exceptionThrown = {null}; - Log.setUseColors(false); + Log.useColors = false; ApplicationCore core = new ApplicationCore(){ @Override diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 7bd7e821b2..ceed02b530 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -37,7 +37,7 @@ public class PowerTestFixture{ Vars.state = new GameState(); Vars.tree = new FileTree(); content.createBaseContent(); - Log.setUseColors(false); + Log.useColors = false; Time.setDeltaProvider(() -> 0.5f); } diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index 2533f99af9..1142de8a26 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -28,10 +28,10 @@ public class ImagePacker{ Vars.headless = true; ArcNativesLoader.load(); - Log.setLogger(new NoopLogHandler()); + Log.logger = new NoopLogHandler(); Vars.content = new ContentLoader(); Vars.content.createBaseContent(); - Log.setLogger(new DefaultLogHandler()); + Log.logger = new DefaultLogHandler(); Fi.get("../../../assets-raw/sprites_out").walk(path -> { if(!path.extEquals("png")) return; From 7731cee219b83a1db5b318a036bd38670261b8a2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 11:24:41 -0400 Subject: [PATCH 37/44] arc --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5cda8698c7..b68357b926 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=723aa43b053b753631ed54906e7669132cddfdc6 +archash=c8a841f5fa99089c742a4e123581f511d627ef03 From 03707ea6cfdd02d75cf70873b5050d8552655ee5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 11:41:34 -0400 Subject: [PATCH 38/44] arc --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b68357b926..1642144d7a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=c8a841f5fa99089c742a4e123581f511d627ef03 +archash=4965359d2857f529f7010c73bc89876d347fa424 From 9a9b1d1a90f1955e25eda8623fe3dce49959f021 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 11:41:54 -0400 Subject: [PATCH 39/44] Fixed log level code --- .../src/main/java/mindustry/annotations/BaseProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 710bef22ca..3cf9ac44b0 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -204,10 +204,10 @@ public abstract class BaseProcessor extends AbstractProcessor{ context = ((JavacProcessingEnvironment)env).getContext(); maker = TreeMaker.instance(javacProcessingEnv.getContext()); - Log.setLogLevel(LogLevel.info); + Log.level = LogLevel.info; if(System.getProperty("debug") != null){ - Log.setLogLevel(LogLevel.debug); + Log.level = LogLevel.debug; } } From 82fe66b9318f65b25e310c050b43303b142b4d93 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 12:14:53 -0400 Subject: [PATCH 40/44] Titanium fuse ammo --- core/src/mindustry/content/Blocks.java | 15 ++++++++++++--- core/src/mindustry/content/Weathers.java | 2 +- core/src/mindustry/logic/Controllable.java | 3 +++ core/src/mindustry/logic/LExecutor.java | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index bd59e3d092..60908d8337 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1644,11 +1644,20 @@ public class Blocks implements ContentList{ float brange = range + 10f; - ammo(Items.thorium, new ShrapnelBulletType(){{ + ammo( + Items.thorium, new ShrapnelBulletType(){{ length = brange; damage = 105f; - ammoMultiplier = 6f; - }}); + ammoMultiplier = 5f; + }}, + Items.titanium, new ShrapnelBulletType(){{ + length = brange; + damage = 65f; + ammoMultiplier = 4f; + width = 17f; + reloadMultiplier = 1.3f; + }} + ); }}; ripple = new ItemTurret("ripple"){{ diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 6f75d477ef..b120b7ef2b 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -83,7 +83,7 @@ public class Weathers implements ContentList{ yspeed = 0.01f; attrs.set(Attribute.light, -0.3f); attrs.set(Attribute.water, 0.05f); - opacityMultiplier = 0.45f; + opacityMultiplier = 0.47f; }}; } } diff --git a/core/src/mindustry/logic/Controllable.java b/core/src/mindustry/logic/Controllable.java index 3785eae4b6..025559b4b9 100644 --- a/core/src/mindustry/logic/Controllable.java +++ b/core/src/mindustry/logic/Controllable.java @@ -1,7 +1,10 @@ package mindustry.logic; +import mindustry.game.*; + /** An object that can be controlled with logic. */ public interface Controllable{ void control(LAccess type, double p1, double p2, double p3, double p4); void control(LAccess type, Object p1, double p2, double p3, double p4); + Team team(); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index baf9566ca3..e2cbd581fd 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -510,7 +510,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ Object obj = exec.obj(target); - if(obj instanceof Controllable cont){ + if(obj instanceof Controllable cont && cont.team() == exec.team){ if(type.isObj){ cont.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); }else{ From 30abfc0619c41dc6e10d13bc1200214ae4a834ef Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 14:02:10 -0400 Subject: [PATCH 41/44] Fixed #3045 --- core/assets/baseparts/1603214918168.msch | 2 ++ core/assets/baseparts/1603214945791.msch | 2 ++ core/assets/baseparts/1603214967392.msch | 1 + core/assets/baseparts/1603214996033.msch | 3 +++ core/assets/baseparts/1603215024189.msch | Bin 0 -> 162 bytes core/assets/baseparts/1603215113546.msch | 2 ++ core/assets/baseparts/1603215171294.msch | 2 ++ core/assets/baseparts/1603215272794.msch | 1 + core/assets/baseparts/1603215345320.msch | 4 ++++ core/assets/baseparts/1603215415778.msch | 2 ++ core/assets/baseparts/1603215454977.msch | Bin 0 -> 216 bytes core/assets/baseparts/1603215491407.msch | 2 ++ core/assets/baseparts/1603215563717.msch | Bin 0 -> 160 bytes core/assets/baseparts/1603215697527.msch | Bin 0 -> 262 bytes core/assets/baseparts/1603215771822.msch | Bin 0 -> 239 bytes core/assets/baseparts/1603215801163.msch | 1 + core/assets/baseparts/1603216038407.msch | Bin 0 -> 304 bytes core/assets/baseparts/1603216102310.msch | 1 + core/assets/baseparts/1603216240041.msch | 3 +++ core/assets/baseparts/1603216539888.msch | Bin 0 -> 449 bytes core/src/mindustry/content/Blocks.java | 2 +- .../mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/logic/LExecutor.java | 17 ++++++++++------- core/src/mindustry/logic/LStatements.java | 6 ++++-- core/src/mindustry/logic/LUnitControl.java | 2 +- .../blocks/defense/turrets/LiquidTurret.java | 6 ++++++ .../world/blocks/defense/turrets/Turret.java | 6 ------ .../world/blocks/logic/LogicBlock.java | 5 ++++- 28 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 core/assets/baseparts/1603214918168.msch create mode 100644 core/assets/baseparts/1603214945791.msch create mode 100644 core/assets/baseparts/1603214967392.msch create mode 100644 core/assets/baseparts/1603214996033.msch create mode 100644 core/assets/baseparts/1603215024189.msch create mode 100644 core/assets/baseparts/1603215113546.msch create mode 100644 core/assets/baseparts/1603215171294.msch create mode 100644 core/assets/baseparts/1603215272794.msch create mode 100644 core/assets/baseparts/1603215345320.msch create mode 100644 core/assets/baseparts/1603215415778.msch create mode 100644 core/assets/baseparts/1603215454977.msch create mode 100644 core/assets/baseparts/1603215491407.msch create mode 100644 core/assets/baseparts/1603215563717.msch create mode 100644 core/assets/baseparts/1603215697527.msch create mode 100644 core/assets/baseparts/1603215771822.msch create mode 100644 core/assets/baseparts/1603215801163.msch create mode 100644 core/assets/baseparts/1603216038407.msch create mode 100644 core/assets/baseparts/1603216102310.msch create mode 100644 core/assets/baseparts/1603216240041.msch create mode 100644 core/assets/baseparts/1603216539888.msch diff --git a/core/assets/baseparts/1603214918168.msch b/core/assets/baseparts/1603214918168.msch new file mode 100644 index 0000000000..6d69a2c362 --- /dev/null +++ b/core/assets/baseparts/1603214918168.msch @@ -0,0 +1,2 @@ +mschxœ5Ë +! E¯Ïy-J·ý‡ù(q¤£Gú÷„ââä&'›„Î.Å}SÆm‹tWØÏKæuÅXGÅq¤ àY¬z\P?E½:ÅYŽ ªÍΤÅÔ¢h)(¦%UDK½”½(¶.©%Ð#èV0F¨­N#Ô \ No newline at end of file diff --git a/core/assets/baseparts/1603214967392.msch b/core/assets/baseparts/1603214967392.msch new file mode 100644 index 0000000000..0e30b20a82 --- /dev/null +++ b/core/assets/baseparts/1603214967392.msch @@ -0,0 +1 @@ +mschxœ%ÍAƒ …á§€ÖZc\ô.z$ƒÓdƒÐ¤·/täƒ?“3†ÚoŽ`Þù¢Æ.ùL< ±$N›çìVü‡¾!b>=e·%¶ëù80r"·^!GKÐu€g9耦Ð×{S_@+±•¨$jÁÐWê\oJSÀMú Ü…±¢0ý?ÂCâTŠªhÁÔqW \ No newline at end of file diff --git a/core/assets/baseparts/1603214996033.msch b/core/assets/baseparts/1603214996033.msch new file mode 100644 index 0000000000..83690987ae --- /dev/null +++ b/core/assets/baseparts/1603214996033.msch @@ -0,0 +1,3 @@ +mschxœ%Á +à ƒÓªmic×½C/{£bU‡ÕÁÞ~¦ÿA>“ˆ·:nÁÁ¼ëé^XvwÚì?ŧ<Š/[ô5¬6ůû¥Œû'º¶âíºgX|qa=SÍÖAsCNµ¸ àÙNÛA×0ðÞQ½˜=Mb‚¢9óMID‰Ò’ÔÑb‰Q§ÆÆAјٟZ¯}<ò™ê +sFŠ£†‘©U.Œ‚ÖüBIÙ \ No newline at end of file diff --git a/core/assets/baseparts/1603215024189.msch b/core/assets/baseparts/1603215024189.msch new file mode 100644 index 0000000000000000000000000000000000000000..75d8474c96359e866455ba537673b9b94a5cef75 GIT binary patch literal 162 zcmc~TPR?Mgm}7b-knfO!0Lz8Ug=?c0f4%Jd67+?fVoT?W;bO=Xvc+_Lkdi7uAYB3l^EM zoV8_`w_^3g#h19eE;y-wIixVBWplw#a}BwYmzq~L=tdV7a#qUix)jpOëòÿÖ Ÿ×}‹Ãc‰û|ÙÒt¾æt¿#¤-Îççºç)ø䃑Åd©qPÒ’Žr$½b¤@ê*bÙÅ2r¡ôtÒ³RZÒ‘@ޤW<»x©“Æ^oWʵ5Ïj=+SjÔ0³Ñq•@Ê€­¦XÁ:À—RÚ±´“?¨” +•,#G<©ICZÒ‘@ޤ''%H³òZ…žœÈ@^ôÅG<©ICZÍÉ+y#ïäC>órá#³ \ No newline at end of file diff --git a/core/assets/baseparts/1603215171294.msch b/core/assets/baseparts/1603215171294.msch new file mode 100644 index 0000000000..eaef917ff3 --- /dev/null +++ b/core/assets/baseparts/1603215171294.msch @@ -0,0 +1,2 @@ +mschxœ%ᎃ „A±ú£i߃‡âpïB¢`ÛøîM®» +!ß0;060É/û»oäKÀ8ÑJ\kÌ èa|­T k~Sq)O-Éûšh_|ÁM%Î35VŸâ¾¸Ó‹Ž\ðØòì‹[}¢Ù±ú#Œ±Òâ¶¼—@0ò-€'hhÅ0½†úÿ@Á —W Ý@†JÐCi4bjœÛp´…2gㄽÐ_¸]䡎EÓ±°-ÎK+¾–þ·.é \ No newline at end of file diff --git a/core/assets/baseparts/1603215272794.msch b/core/assets/baseparts/1603215272794.msch new file mode 100644 index 0000000000..b2351a3857 --- /dev/null +++ b/core/assets/baseparts/1603215272794.msch @@ -0,0 +1 @@ +mschxœMKnÄ D Œ1±£É̲æPÈ&#$ ¶ó9yv™tCYÀë_Ñ%ðŒ«„Jnõ˜ÞÎÝo®Äè>1-~ŸKØŽð„i?ËÝÛ#øBIŽ®ØÍ%q;ÂáR8W;çôî¿rÁË–ü¹º#Ìv)!F\7ÖÙ”oIy÷¸ý{â¯4…ïvÏg™=›!;®ú^é`4èEä `¨–õ ºah¨:I:!ê¬Òu0hRFCåÇ7†Ç½¨:« T›W0tƒá=÷z*] %wX ›#ÝéæH7Gºé4}mWW³À0¸3õÄ®§æbÀÈ6 eòÀ> \ No newline at end of file diff --git a/core/assets/baseparts/1603215345320.msch b/core/assets/baseparts/1603215345320.msch new file mode 100644 index 0000000000..8c97534bdf --- /dev/null +++ b/core/assets/baseparts/1603215345320.msch @@ -0,0 +1,4 @@ +mschxœEÏën‚@àÃÅ\EíÕôøÛ÷!ºdͲ´éÃ:ÃiÒøqvfÇاȇöæP^¦Ñ]|ˆ°g7žBw€ +¹Vpˆ]l‡nº5'?|¹`»ènÍè§pr°};ºÐœC×÷0ÁOÑìïþ[vM߆«Œ½¼4÷vpýß‘'¡‰Ú*á¿àHäY~2dJNVÄ(©¦BµL¦­r ­ +bH¡èw-cKM™¤52e«ó*þWÅ R!K²L–{XÝ# SAJR‘5±dC¶¤V6r]m`Ët~ÌóüŒ´ÔHÁ覵Rv™¾ÓX +2H©ÉNk{Þ8'òL^È+y#ï +p”U%%%JAJ$¿æ?M \ No newline at end of file diff --git a/core/assets/baseparts/1603215415778.msch b/core/assets/baseparts/1603215415778.msch new file mode 100644 index 0000000000..6f7f75ab97 --- /dev/null +++ b/core/assets/baseparts/1603215415778.msch @@ -0,0 +1,2 @@ +mschxœ-‹k +1 „ÇMÅîуôPÅ ²PÛÒ®èÕEdM¬?’o2“Á€cý1e_BðÏš‚/g®—²äuI08åôàâbšÙI~eŒõ.p«ú°RöÚÆù×wÙGÿO`ÁÁîÑmȾadh{ÑN²Þ‚:õŒ‚Ä'Õ"IZ}ä°í²z}‰o)" \ No newline at end of file diff --git a/core/assets/baseparts/1603215454977.msch b/core/assets/baseparts/1603215454977.msch new file mode 100644 index 0000000000000000000000000000000000000000..c0a53057ed741f285cd16fe930a9f2bd0cc2ec2b GIT binary patch literal 216 zcmc~TPR?Mgm}A;^yQ{@Oz$H6rkK5dt?r6zI%OMwN<%&2eYWxE3Kp2zgs@dTW|V!uJgR_1-X}nzTf_TghhPQ z{bj~+nI9|UcJJS2*`E4q*@krtc10f=0wZR$@8OnEp6*eZ85HWU?P|z^KkX^5o*^#2 zCNAD3Ey`7{s=kX~h?)kUy<%WGYt5fTZ%Kcb)p7Q@C3B`d?b|e&)wljqpp}_ys{hT+ ZH-q`6FwbUw>S4LbGRRJJzgMAp8vr!JW_|zw literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/1603215491407.msch b/core/assets/baseparts/1603215491407.msch new file mode 100644 index 0000000000..ba578a4a55 --- /dev/null +++ b/core/assets/baseparts/1603215491407.msch @@ -0,0 +1,2 @@ +mschxœ5Ïኃ0à1µµmjï9äàÞ(h~ÔHŒÂ½ýeÁufCÄn +Õj‡Ç¶ÍÅÝÎgøA7¹}Œ~K>¬@ }ÚcNè“OvõÇ2Œa=ÝoˆÐ×Úcƒ\Dç“[†=qt0ÛêŽÅ&?Sôó à(Р(p=òR¤$Ñ‚’ôJ T&ge¦Öù âªJ¬IM¡Ê´Ò* ´ü~#÷”d÷|ÚEE4©I#t¹©„Fxpzpzʤ3% hù¹'³›/™4 ol¸`¸`¸`¸ðæÂ›SÏfÏfÏfÏìÃæG¦?J (, \ No newline at end of file diff --git a/core/assets/baseparts/1603215563717.msch b/core/assets/baseparts/1603215563717.msch new file mode 100644 index 0000000000000000000000000000000000000000..460c1d9f8b55a2cf31f26543d84be9bf0ca3824c GIT binary patch literal 160 zcmc~TPR?Mgm}BdAk?)WKkBymtxJlhfyRIA?0rLY)hX3}yjXBdQSH9QDFi~p3Z>*`D9{;97uq*V3bN7`WYcR{lD(^gZjkXJ;?R)No0^nRNM9^5NR<^>WvDKJ)W# zuulE_lC#?GAAjJxPrM%T}vK zv-E{!+tMFBdBxdk3%xfQyubNe^T(#hSwG758$R5{9==WU_f5T%>$ShkWIdL?{igCX z6KjTe2iCLm4_#P&{qt9szrUQF*Q=fVvS9yGDPBiM&5}D?Sz1>qn*{WPUEtiZK%A#3 zFo8wd_hx>DuDvHWBW1z5+{S%Lhrgdwux_sC)!Fp7 Vvs_DgWzP~LqfCpd_QtbZ9RNoqe53#X literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/1603215771822.msch b/core/assets/baseparts/1603215771822.msch new file mode 100644 index 0000000000000000000000000000000000000000..68ee586ea5ec58d88238857e0b4a0e2ab592b927 GIT binary patch literal 239 zcmc~TPR?Mgn4{bGIOo0Z_9lG z*4^-ZUa{n;Q|08`OW8&DoS!P!M#Vl7FWvW6)auC9tbC8-+U{Oo@|wQ>7y8iny7Sjo z0p3}&xcLHAJEj?U=)I1Z-ZRfI=4pxTtCorCJy))VmGGQ=A<3Maaz{e=R-fHTh4qT* ytM2i3=_%iNy|1%rftHGAX=?o1jX(c7>a(3OX%RcW=fSzJ#*YI(vTu^J3o7ZB%(~|x(@(|PMJpGI6e4>sau1zeh7go8yKit*lsqMJ0BBx)r zq~dgd#a@Xmwa}tczTnfgF?R7+z84?v{8@8&Lst5;#_jyg$J{pa%)Wp4M8fTr zycg>?{@gVq(r4a9x3_Qh@hmQ%|LivVo$HbA#+?Rl%^q#^I{x5K%DDGW+W%Ot zJHfrkD}b}~knTdy4B=fZ)lU6;TpY#gSf`xozh3yDXwL*$`!yO76FnzMhum2*Wm}Mo z>f*w0VVok_j}!&JJE|qDdv;NEqj=!bIg2K7zo=AR_vu`)g}icD%wM&~+)YPy4=Np; PnXNG|;S2Z1{IIJ4yk3}l literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/1603216102310.msch b/core/assets/baseparts/1603216102310.msch new file mode 100644 index 0000000000..a05dbc61ed --- /dev/null +++ b/core/assets/baseparts/1603216102310.msch @@ -0,0 +1 @@ +mschxœ%Ž[jÄ0 EoœØ“©K¡]†e2¢58Ö ;SºûJI]¡">¶–OÂ}ü°ô\_Œø ~HyŽÂ ¸!öK¾) þ%QÁ5KzæF±æN’RªŠ2èL/9Ÿ£ŒÜÊu¦ƒÛ‹þX„¯¡ü¼|iÀíX˜9u+8¬–¬ØpózÝà­Áà&Ö‰mÂOh!¼>àt^m1ì÷‰·‰ˆ%(ÞMí6´A—ýÖe)“ \ No newline at end of file diff --git a/core/assets/baseparts/1603216240041.msch b/core/assets/baseparts/1603216240041.msch new file mode 100644 index 0000000000..c0960c09d5 --- /dev/null +++ b/core/assets/baseparts/1603216240041.msch @@ -0,0 +1,3 @@ +mschxœM‘IRÃ0E¿åÙJâk.àcp—£ +*3nm;;O#9 zs)HNLy6Wb2zOeo`gQwHZk*X2)JnqL$-9t?0e*)DeB;Qj?s%`=-;id~*lwnsZM{*cGh z8*{nWO|v=dz{Dn$QX#1)^-}VU= type = value == null ? void.class : value.getClass().isAnonymousClass() ? value.getClass().getSuperclass() : value.getClass(); + Class type = value == null ? void.class : value.getClass().isAnonymousClass() || value.getClass().getSimpleName().startsWith("adapter") ? value.getClass().getSuperclass() : value.getClass(); if(builder != null && builder.isPlayer()){ lastAccessed = builder.getPlayer().name; diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index e2cbd581fd..6b4f9ced0a 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -47,6 +47,7 @@ public class LExecutor{ public LongSeq graphicsBuffer = new LongSeq(); public StringBuilder textBuffer = new StringBuilder(); public Building[] links = {}; + public IntSet linkIds = new IntSet(); public Team team = Team.derelict; public boolean initialized(){ @@ -212,9 +213,9 @@ public class LExecutor{ public LLocate locate = LLocate.building; public BlockFlag flag = BlockFlag.core; public int enemy, ore; - public int outX, outY, outFound; + public int outX, outY, outFound, outBuild; - public UnitLocateI(LLocate locate, BlockFlag flag, int enemy, int ore, int outX, int outY, int outFound){ + public UnitLocateI(LLocate locate, BlockFlag flag, int enemy, int ore, int outX, int outY, int outFound, int outBuild){ this.locate = locate; this.flag = flag; this.enemy = enemy; @@ -271,6 +272,7 @@ public class LExecutor{ cache.found = false; exec.setnum(outFound, 0); } + exec.setobj(outFound, res != null && res.build != null && res.build.team == exec.team ? res.build : null); }else{ exec.setbool(outFound, cache.found); exec.setnum(outX, cache.x); @@ -446,13 +448,13 @@ public class LExecutor{ float range = Math.max(unit.range(), buildingRange); if(!unit.within(x1, y1, range)){ exec.setobj(p3, null); - exec.setnum(p4, 0); + exec.setobj(p4, null); }else{ Tile tile = world.tileWorld(x1, y1); //any environmental solid block is returned as StoneWall, aka "@solid" Block block = tile == null ? null : !tile.synthetic() ? (tile.solid() ? Blocks.stoneWall : Blocks.air) : tile.block(); exec.setobj(p3, block); - exec.setnum(p4, tile != null && tile.build != null ? tile.build.rotation : 0); + exec.setobj(p4, tile != null && tile.build != null ? tile.build : null); } } case itemDrop -> { @@ -510,11 +512,11 @@ public class LExecutor{ @Override public void run(LExecutor exec){ Object obj = exec.obj(target); - if(obj instanceof Controllable cont && cont.team() == exec.team){ + if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){ if(type.isObj){ - cont.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); }else{ - cont.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + b.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); } } } @@ -607,6 +609,7 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); + //TODO should remote enemy buildings be senseable? if(target instanceof Senseable se){ if(sense instanceof Content){ exec.setnum(to, se.sense(((Content)sense))); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index ba4d31e9a1..57adbdb7fe 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -819,7 +819,7 @@ public class LStatements{ public LLocate locate = LLocate.building; public BlockFlag flag = BlockFlag.core; public String enemy = "true", ore = "@copper"; - public String outX = "outx", outY = "outy", outFound = "found"; + public String outX = "outx", outY = "outy", outFound = "found", outBuild = "building"; @Override public void build(Table table){ @@ -905,6 +905,8 @@ public class LStatements{ table.add(" found ").left(); fields(table, outFound, str -> outFound = str); + table.add(" building ").left(); + fields(table, outBuild, str -> outBuild = str); } @@ -915,7 +917,7 @@ public class LStatements{ @Override public LInstruction build(LAssembler builder){ - return new UnitLocateI(locate, flag, builder.var(enemy), builder.var(ore), builder.var(outX), builder.var(outY), builder.var(outFound)); + return new UnitLocateI(locate, flag, builder.var(enemy), builder.var(ore), builder.var(outX), builder.var(outY), builder.var(outFound), builder.var(outBuild)); } } } diff --git a/core/src/mindustry/logic/LUnitControl.java b/core/src/mindustry/logic/LUnitControl.java index 2166b00690..b4c7f8254c 100644 --- a/core/src/mindustry/logic/LUnitControl.java +++ b/core/src/mindustry/logic/LUnitControl.java @@ -15,7 +15,7 @@ public enum LUnitControl{ mine("x", "y"), flag("value"), build("x", "y", "block", "rotation"), - getBlock("x", "y", "result", "resRot"), + getBlock("x", "y", "type", "building"), within("x", "y", "radius", "result"); public final String[] params; diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 15716b4a94..25725cd0a9 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -37,6 +37,10 @@ public class LiquidTurret extends Turret{ super.setStats(); stats.add(Stat.ammo, new AmmoListValue<>(ammoTypes)); + } + + @Override + public void init(){ consumes.add(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){ @Override public boolean valid(Building entity){ @@ -53,6 +57,8 @@ public class LiquidTurret extends Turret{ } }); + + super.init(); } public class LiquidTurretBuild extends TurretBuild{ diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 2361c429af..58abb26b12 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -24,7 +24,6 @@ import mindustry.type.*; import mindustry.world.blocks.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; -import mindustry.world.meta.values.*; import static mindustry.Vars.*; @@ -60,7 +59,6 @@ public abstract class Turret extends ReloadTurret{ public boolean alternate = false; public boolean targetAir = true; public boolean targetGround = true; - public boolean acceptCoolant = true; public Sortf unitSort = Unit::dst2; @@ -105,10 +103,6 @@ public abstract class Turret extends ReloadTurret{ stats.add(Stat.reload, 60f / reloadTime * shots, StatUnit.none); stats.add(Stat.targetsAir, targetAir); stats.add(Stat.targetsGround, targetGround); - - if(acceptCoolant){ - stats.add(Stat.booster, new BoosterListValue(reloadTime, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); - } } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index e1b5c857e4..488c44604d 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -279,10 +279,13 @@ public class LogicBlock extends Block{ //store link objects executor.links = new Building[links.count(l -> l.valid && l.active)]; + executor.linkIds.clear(); int index = 0; for(LogicLink link : links){ if(link.active && link.valid){ - executor.links[index ++] = world.build(link.x, link.y); + Building build = world.build(link.x, link.y); + executor.links[index ++] = build; + if(build != null) executor.linkIds.add(build.id); } } From 8f582283179dfa7dc17ae29eb5e693466ba71978 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 15:43:06 -0400 Subject: [PATCH 42/44] More base parts --- core/assets/baseparts/1603219216674.msch | Bin 0 -> 213 bytes core/assets/baseparts/1603219241094.msch | Bin 0 -> 167 bytes core/assets/baseparts/1603219316221.msch | Bin 0 -> 249 bytes core/assets/baseparts/1603219367279.msch | 2 ++ core/assets/baseparts/1603219428262.msch | Bin 0 -> 176 bytes core/assets/baseparts/1603219511695.msch | Bin 0 -> 104 bytes core/assets/baseparts/1603219540119.msch | 2 ++ core/assets/baseparts/1603222786081.msch | 2 ++ core/assets/baseparts/1603222833941.msch | Bin 0 -> 251 bytes core/assets/baseparts/1603222912251.msch | Bin 0 -> 302 bytes core/src/mindustry/ai/types/FlyingAI.java | 2 -- core/src/mindustry/ai/types/FormationAI.java | 2 +- core/src/mindustry/ai/types/GroundAI.java | 16 ---------------- core/src/mindustry/content/Blocks.java | 2 +- .../mindustry/entities/comp/CommanderComp.java | 2 +- 15 files changed, 9 insertions(+), 21 deletions(-) create mode 100644 core/assets/baseparts/1603219216674.msch create mode 100644 core/assets/baseparts/1603219241094.msch create mode 100644 core/assets/baseparts/1603219316221.msch create mode 100644 core/assets/baseparts/1603219367279.msch create mode 100644 core/assets/baseparts/1603219428262.msch create mode 100644 core/assets/baseparts/1603219511695.msch create mode 100644 core/assets/baseparts/1603219540119.msch create mode 100644 core/assets/baseparts/1603222786081.msch create mode 100644 core/assets/baseparts/1603222833941.msch create mode 100644 core/assets/baseparts/1603222912251.msch diff --git a/core/assets/baseparts/1603219216674.msch b/core/assets/baseparts/1603219216674.msch new file mode 100644 index 0000000000000000000000000000000000000000..95e7a00d9ab2c6e8f779f7c2c038a4c1132e1ed5 GIT binary patch literal 213 zcmc~TPR?Mgn4@|=Hm}8ihvfkykIw0TQ&zRV;O4g#N?L3t)S}ViwYN66jic7$;6!$L z2``TsVeMu=CB(nC{(Jf@vir?;hAR@A&If-uZgnpDM`?ZZA!D}kHNoFL|M04dyzu+Y zwZi*-Ce|i#^IrCyw);oYh#f@Iq^cXOaODys_u~tc5~6zak@- MF8;^-TU+%%0Dxa+SO5S3 literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/1603219241094.msch b/core/assets/baseparts/1603219241094.msch new file mode 100644 index 0000000000000000000000000000000000000000..d80f4f4b19d069b35cb8f04368cc8652868d40d5 GIT binary patch literal 167 zcmc~TPR?Mgn4{Wvn(MHFfa`iSwM-`6*e}L+zVsjQ&_2SR#r5~M)!d^6&*YvRN;s-z z=q4=l>`}4Z9pT&WR=r*LQ-rbg_39aazMXv;6SH=Q`F)=+=@-n7_Wxei)Vce{uh0vo zbB|ixDJn@fI2*lJyk3SuuGYYrqhsG6MTtp<25xOhJ}fu6gT6JlUUJBM5zrO4#7$gT aRBd`6~7g_v+L2WpKE9TvD^07=I^fk zmI}$tTAsact==yzx6q$_`*_~x+TT2N5)3v^Tw5-4{yH+T=D3T~5*N28E{;=L6txZs znLdiJS`sRq?Q%<_W9dh4<&}P&BC|z|Ug-CQ{5$4*RYv~E@_RELuM1u{G33IE$Olc2 zm(8wH{rbuFZedIXM_bdv1PQ~QkS|(#+IqUS-sdlE?ul^As@kfjxMTGNgPR7GVSkwY HRh_Eyr%}E}d`Jb~p0N3=^NC z)yE_5&-6O`Bu+*wK8-7y*OF0o*`&qFyLUcW{Pg-xp;hs@C#}!QoH|#(?ODJ2miF7p zMU lIKmS}@(%qyQsB7#&Y#O4BTE;xx*0fWmoSOf87FIT0sy-ZRTBUJ literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/1603219511695.msch b/core/assets/baseparts/1603219511695.msch new file mode 100644 index 0000000000000000000000000000000000000000..ad1b2081190d43f46eec12e1de164b38c6b6d725 GIT binary patch literal 104 zcmc~TPR?Mgn4{Yj$kl8h!m`|O(W8D_55BJ*{DMhBLI+Pzzcr<-zU)RMn_6>kk;YÒcZÉrëF¸_\ôçn—?é™2^xŠÝ(Rv…éì íöHg^}N'Ï‚ù¿Àþ–ª $6r4TËl„Ò"=ZÞ‚ÚëbAó4WØ'&wtà²æ„3-l`PÕÈçC?6ŒÍõs}+ñié«y¨fññ$15¦ª™ªa-~âˆYØ/gD>X \ No newline at end of file diff --git a/core/assets/baseparts/1603222833941.msch b/core/assets/baseparts/1603222833941.msch new file mode 100644 index 0000000000000000000000000000000000000000..565eecf779464c69bf9f53a8fa9618272e81557a GIT binary patch literal 251 zcmc~TPR?Mgm}5F2JFitiptb+O>RZwI;ulnZEcRBiGE|8%=%`(@H}j2SFvrhlh0lDL z*m$^>n)4q_c(i3!#vJ2#L*4f;(r+%yxSrC?KCd9TH0Fr6iKfdH!#AEvag%+I-TrIn zcd-71dGxHX9qS(kKYDRkXR&di;Fka2UTi;bX@`_P-(F+s*5WOFoxYzWwr@D@$*||4 z&8h~glhF>VjV%`HPZ3|m{k8R()9i(uQ%hTx@m)xrwp};-)epcde9>Mp7Wdw^WK`ZRrY><)F}2eZF%=s!MA0+lVu-$N@K2CbvR`&ubLj? z^3YYy@#o44+N8QR#3&zKZsGp;`Rh~(@&8%*Q?_y{bEW^$=#BGPQvUn@n$oo7#lg;ygjhV=;6k% Mfm7_aW(Mm30H#!u(f|Me literal 0 HcmV?d00001 diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index f88a125e93..10aea42e2f 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -43,8 +43,6 @@ public class FlyingAI extends AIController{ return null; } - //TODO clean up - protected void attack(float circleLength){ vec.set(target).sub(unit); diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index ed175524d8..3226fbc300 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -94,7 +94,7 @@ public class FormationAI extends AIController implements FormationMember{ @Override public float formationSize(){ - return unit.hitSize * 1f; + return unit.hitSize * 1.1f; } @Override diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index 0134a424fc..2a711235c9 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -13,8 +13,6 @@ import java.util.*; import static mindustry.Vars.*; public class GroundAI extends AIController{ - //static final float commandCooldown = 60f * 10; - //float commandTimer = 60*3; @Override public void updateMovement(){ @@ -57,19 +55,5 @@ public class GroundAI extends AIController{ unit.lookAt(unit.vel().angle()); } - //auto-command works but it's very buggy - /* - if(unit instanceof Commanderc){ - Commanderc c = (Commanderc)unit; - //try to command when missing members - if(c.controlling().size <= unit.type().commandLimit/2){ - commandTimer -= Time.delta; - - if(commandTimer <= 0){ - c.commandNearby(new SquareFormation(), u -> !(u.controller() instanceof FormationAI) && !(u instanceof Commanderc)); - commandTimer = commandCooldown; - } - } - }*/ } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 056b94d27b..414fe99d36 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1186,7 +1186,7 @@ public class Blocks implements ContentList{ requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phasefabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; powerProduction = 4.5f; - itemDuration = 60 * 15f; + itemDuration = 60 * 18f; }}; solarPanel = new SolarGenerator("solar-panel"){{ diff --git a/core/src/mindustry/entities/comp/CommanderComp.java b/core/src/mindustry/entities/comp/CommanderComp.java index e03147d63c..124eb06d91 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -74,7 +74,7 @@ abstract class CommanderComp implements Entityc, Posc{ void command(Formation formation, Seq units){ clearCommand(); - float spacing = hitSize * 0.65f; + float spacing = hitSize * 0.8f; minFormationSpeed = type.speed; controlling.addAll(units); From 18e6a43a870b5f123dffe54fc3f8772c8bdacb6f Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Oct 2020 17:24:51 -0400 Subject: [PATCH 43/44] Added weather to some built-in maps --- core/assets/maps/caldera.msav | Bin 11896 -> 11988 bytes core/assets/maps/fork.msav | Bin 15869 -> 15958 bytes core/assets/maps/islands.msav | Bin 11405 -> 11522 bytes core/assets/maps/ruinousShores.msav | Bin 17831 -> 18170 bytes core/assets/maps/saltFlats.msav | Bin 18553 -> 18919 bytes core/assets/maps/shattered.msav | Bin 17059 -> 17146 bytes core/assets/maps/tarFields.msav | Bin 14893 -> 15136 bytes core/assets/maps/tendrils.msav | Bin 15888 -> 15986 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/assets/maps/caldera.msav b/core/assets/maps/caldera.msav index fae2a2e8626498a12514e992cbd87807dd27843d..57bb5c382f6d83490a6335dd2fe1927d298137f2 100644 GIT binary patch delta 11856 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 delta 11769 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 Gh93YPc~5Wv diff --git a/core/assets/maps/fork.msav b/core/assets/maps/fork.msav index f4bf6985fe66fa8eef20cdbd89b6969170892e64..2fd62bd91b6b35b498d06ef2f0a84c269a442184 100644 GIT binary patch literal 15958 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 Xf0x~+2ahxzT>kH@|Ie=*t+pHh%dL)I diff --git a/core/assets/maps/islands.msav b/core/assets/maps/islands.msav index 1b833e98d072ad82d39a161b8d132779a56e629f..90159d57e021f0aac3cf4d97f1ff2642e885a510 100644 GIT binary patch literal 11522 zcmb=Jv$ZC&SjK%@Tv_?oeN4T13^5Fo9{4pJ@(P-xefH{8k8-o#v?Y-?tFOGsWAHWG zwJ^>jQBA}!zfXFb{F@KF_LheP%YGc>@B7eP-*o>k_aEUu(sR^5KPflrX6?AnXWX=6 z&6&yR_Uis=q1Ttk*L=xd8nPthWBtlyT61`1f4e&4%0-5s^1khJ1M^pXTF?I1JpJ*?Rd?^-tljmyqPn>L z`N_v`*|qGY%8yU}7n0g5s_k^sqmOHEV_~C~8zn}h$jK4gGzg?@^LY}8uYwy;@i!N_mHuv9O`Ot4?7noZI z&b-^Ku2p_XUS|H8H@;;?^52%X{{J{Va(}T^?Z4@FpVv$F^sy~IxaR-GmoI<(%rSaj z|NE_4r;Vxk?7b&{yeWSi`2VwCzQKIE`*-i(n=`NUUeB`g_5Y{OOnY3pzPRSj{G4y@ zd!JiZt+_49=XU&jx%qE*_rLGn{PZ~gx9oCLnfhFFXWr@?_HsS*-ru&Yp0WA!kA%&| zR`dGPPG0VBo9j7W{r#I;H~mw}E{UY|J%1zcI`;HDf!bY`wvu1k_v*)-cNAK-`Dei` z#$~n%Lf^K_tNYo!Es?$K&wIZ5Hs@qvR=%D0eIMDK`@QY*gMZ~8HvK+huzCIwADP$h z%7iw(yqRG1?%W(x{(FoU`2>37zpL*(`JhxN+j{qH&PDGmPx9#<5wtilxjZ0zQ$qZC z>!erdyE%*A9{uoU@7izMXK>48#K(L*aQIZQ?x#BbqF#05xhBi^WQgN}BEa-SfRS{_YF<@y*sFsA==*km_6C%G-}c%lzB9 z-uU6kry_dE1txWO3pcB}zS;ly&AFUQKabtacrJVB<%3HJ^UHpxZ?0=P{x)~NbHlG0 zYE`U-Y1L{K-~O+xuv&cc&zFKrj$(i74}9Ha&ob}r+wzIJmN%T2*VJ2I%sRLF+hf12 zyZ@dOyLz-l-uOh{*tlWuTE}}| ztT#{o=hD36+7e@l+8BpZ~r1-Otb8=V#qGd-YZ>t;X0-)i&0 z89^G(3)BDK6ux^|w!hsrcB0Mw>Q5!VPkwv6oINVeJ*Ud;>)9L|%fJ7fik{!xyxgB( z?!C>=Z~gaIb-WUpdMog0T>Y)NJm)gn);;zL+5c5NIdleZ+T4o?b*nywYzS0d z?OArtVNarKcRGZk~K@%l^_UmUDP^t+JWx-}gIu?!$tbbzN@G(dm!pt&+Xe zv-aJOFFw*6mcKq%JgMrM|H}VsjpjD4?5!U(a4s zd+7S|n%ZO6zlYv?bhE5i_WF&|Ufb(8%6plwS1jt=j-Q>yS-Sa*|zoa>OI#svCYVGo|7@*&ce7k z?Z#8>C0{4)`0X`&U2)AVL*MKTO^4Skx|gts`~Kxh|EE<}pSJjJzP0PtiHQdVeM=M9 z8ZrB>S@1t+=Iu#}t9M>HT6*%g#djO4 zrqYu}k~~{Y+#JpRa9`P`*$`#6gj>wv{JH?{h4E(PGXG4ct8Y8E!t8R@O#XD{eJhKD zZp@nZtv#i^?ez=4XLlRZJY3ha9iEuwdC8!%AuW4v(Z36xUrk%5pOiTe`rhx{areVN z7i=%J`r%eSC0A~vx#@J5A9lw#cU}G$>E18!?OwvF#S7|J{k*XG=5wCMs&aOZZ+BI1N2)0VN}tNs+50nL*{UrsjhJTK zo^|cSnNxY~?ak{oyJWuCtS+8Ig2av7I)^!evjRuYr(m6wcS##cAnajVnTAO`k&E5$AH}h7!SYj+u#5+^E z%q_O*jZevwpm{QU*7sjn=9lc5k-EjW#@FK4ajTBfuZFYFxzD}a*wy!}q-S~d`OS(~ zwVvNq6xCg-ysF8+WaB?Kf2+$AtuJ2mnz`e+d*$-wTiyf}Ej?3UqqwtVuSe4S)tlD+ zEeMt^jl0}*a{F7q_2x4I>t=k}y20w+Gq>>TXMPng3!mwC=tb85*~VvQeC;X7sJu4c zcha*EwW^~Rdgk<&3NFuzTCj84r#bJnubo`}c;`9)bARLe*=_gwyx7|*tuagb^7})* z?lC()&Usj{u6S1Io5cS+F5BK$GQT|UX0Y$O8L!`3iUdlPmE=SjXx zX5VKY^qIZ8&gzBVu_+$A%X-)HA3uI8esAC8;;6$*oTpn^Mb69Co+$kJtYT{Ws=2E# z%jTMz)VmaGzqu0U-x*cSv^L>eo9w2v_j8)vw2G!~S=(T2#j{0wcdFfLu}~AEqaPmD z7+tb<4z;*+^xk~mY&$F2{mZ7!^M3kf_CKH0(zCa%)m1a*UvS=;>AwEFZS0$wTjw!+ zjrCIx*emwp(($#H+it493ppt3yz<2auKjx=E5793YuTLl;%U0k#g%KO2X9|-Xqm85 ztYOf{xPtUBk@9CUPN`=NnK(b~T3qza!sqFm#MxaL_WrXsoy?X!Q)#Ce7P+~3nSfDx zuhw$z-NkS9e%|~s`{T^Kl(RDh-m;xBi+lP;uup5pX11yCU!T1^lP@UtRNt{(Q{?#1 zmquGp=`#5^FKnCJoVh$(PHw%&rfk)2KWENsp1Cu>v1?h|U9Ap0don=1W-V82=&M*4 z_v7o?lwF^OPAeA@e7hw#HNWgYjQQ=dXBjmyA*rF8HvZfFFC|C&zkgfFvv|u{J*MyH zOH|za5~BY3V1~{7y22zmX_IAYJHOg3<=vn6vgvJxoz**@dcWPXge3hJ*Dn?gxU%i< z5gDBqMeF@N>#qH;DOmFOM#`CUPg>WRwg1gurM33yoPLe%zFPv1dHwx*e|d=4N^!5y zD{VpNS1esIbx~Mblxx<~m8lPuvX-u#%5+D5#a7?7LT;O{{IW|ESrK}m$2n_nyQKY* zjJBxdigw0PEYEJdP+u^SDV*z$_L&=u)0Rjs`&!Br^YBvOOzj^$TWddjPd<>k(v-)& zUMxwnCFX5w!TJS?$^EfCbzW-)x6W&e@@BrjTHrI|)>GmK_x4}xckbUI<5wczT+PP+ z+v3Z@@CQ4&=B62xv-quUFy3=zg=w=|>Xi#?gR-Ui?3(?>gq}&+>Nos8A2R!E%z`js zo6|g(e|5RZADWu&aCKp$@2^Z>|6Mo1XOg)&VHm923PucjC$tkVO$p(4Hl)kQQ+HWNDS+8kbpCtE$TuYzg zwp(mlk3H;BEx6idEaJGB<>YM{)1QuNOQ(X*i&+@)@HB>FL*%P1H8v5Mm) zkI>qR8;hRqJlo}a*k(~j_LWsmf0!n4O_p3>zDCzU@KkZ-^BJBqRtIc+vbCyXCreqp zYQnnq8S9+|4gFNl1wSyE>+o3BDW)mHWMAH6^MoQnkIN2Mw@MA_KyIrO`dgq6K-F3lG^lO*~3rq3eP3(pKVURynTv7ARpuG z?KiJIjONQ+;w065A|^6n+ST`3A3POxIG4_C*y*@7J}A32D))r~`5g-vrLLULb!VqCQ}!0Y6Bu01o3Y<^R?^`L9h#Z2bxq86~{Q^+E2&nH#xIo?TTfTD4EcR{PD{H8~f=51&bm3SZDH#ZlXE(e=oJi{5%i%0+$L z7HCWAiApK3u1$5$n%}DJCuZ_#gO8bxmC=le&7xutm`*G9ie5O;zBBg6?mo##m9;Xz zW-ZXZ6Rt4P>D;}mZp8}|qvU^SCn+~J^X%9!mSyzz>T&ay5KOq%!kzHlgWoql=hl^{OV^G@H7y}qUpt+pilmt1>L*RkHv@{TCJ zATJJ4=lrg~=mSxK4Stsw?&nBToXIYI)IfpdZ|MSkCzhKEcN#cK1&p{(x3{Q-d0&|2 z5+|j-oM{!?8ZFb_M055Xu{Sa%drWgM>b)a(bDDOw%Qlrsr6Pu0YT61dDK`VdPVt^Q z(7$Hu5o=lY>;c^;)d%F1jYPLiF&Lshrz)zP+&ORMw?d zZ)xtfDRsONYOM;9n-+dl%+`=r%bOqU?mO)dTZ!t{*7&Ba69bsuo^smCsk5lrR%Nk{ zm;&qDPlC;lUA5*Fy-4KhT;6ce^~dMr?Ap6kLVB)0H*7eWv`$1ql4awCvn`2HO?*D_ zwju%7Yyw*hN*WwO6e4*x=PItr*qj)4vf-ps$RtK-w%XIT?nGV{FyipKutQ}3Siv<#WZr9GnZMc5*fn6?##?cus*7MbD z%J*rvni{HmO}sJq-rcP;o4+gMTZL@2*zoDo-qUZr1D1zq6nUxlsc?FoQ{T*CaBu0h znX7AG?e1cjyi~W9Wk1*X&fMoB-`quaIJE36vJ#GDId>`BL&NE9+>3gxB^wh=U;f!C z!p6eB+c}@FPQK-ZJj2SIH?so#u4+AJo${hane*ylmVag|Qj0DtecCaztU2ntGy6XN z&mISBPCuI?Zc)FJ=ipuz7W0)`Ta5IXn2J*h#cjB!?G{gb_*m(=LaDTXe#bjD`3HAA zJ5HBYEI+dJK{TUS%Xc+F|aS%IrTGa^-k^%+;Lh!xxS`orDV4ps7s zac+FUCl*c06+aLqUCWx#w^7sD4H@tICj1OuvGw%E6E{1SY~kM6k<*l_ zcxA$eAa=1zjy3zFyPS(sd`r{WH+4@mff6pbwWjtdrh0^s;-VGzYBS~ zPqfr^v&X@mxXGVZDES&zaV2;LA-> zOx0SmbV*jABJW96*C)$NcId}>IV-+CDd>?Cy+7si{Ks}>r~Vl%DLgxEgWvZ_uEk=f z+v3lf8kRG^4&y22tka+I`GJ?#EtxQvlY*{mq9uQ9w%O@%lk4VFmxUWUYU0_y3%MVi z(6*-cDNBvg0)@2)GS{`8)aXwNlM~TUm^#_4a?y^CHQO83DE*t>YBl{qXZN*z`W2-U zmD^5yF56x|`EdT^J7Q}-v;PbFRP%yWKcstMgk?at&Hnn?ZGmN{+tz)aRN~=$@1=%= za}mQvhMMmTI{X*kH|AL_$@bZu9qc z))nW(oYRxv$aZl?YpCy$^-aCUTytCu;^dAzJ>up!Ir)gH!YTzh#VWbhBd-?-#;#)i z<}y7qN#Edv@v0MIZGF8xu^dchS`nv<78D9!6i!ZNRe9Q&uMZlIIr>< zscUkIk*%97?^-;%Ibp|*8qSs{FXGNcdUKp?S1hc&w`0lyH`$3wS^BLxN8(B%I3^yu zvEsmcSN6aa3x&Q+cV1Yj=p58|id#DHh2WtmPJ7FxUP=W~6c=Ok~vHQ!P7tH9pEsdokb@=92;pFS~h z#hepQ*IGr-nP0pur=;cE!fHn;?_W0s_O99gPkFl7`%OF_d_TxI-*@qvyfmgyaWY5f zo)+=R$<5bKXBVve@15n^b4_te&cbaIR-KWmV%;aUcw5UN^Uhf!UPS_`vwd!I zT$nEIsZ!}Y@4bGjNs{!7--^9rf8OWoed4HexYp$2`E9~<8`rpdY^)}mI8BTmcj^2tTviq?}XPiRk__QzmJ#^dj-{->K# zxV_HAdTnCZ-aB{YDJKQ}wMYDzd{@M74&4#_F)QPsnUhD{*4!lP>Ff(5%qCk*`sHQT zf7;+wsKEJ#AEh_evP|kO*etUrBFK#^Y-(_?M#;KVmfeb){I|~@5LGzQu2P)%;E2bs z{F_##ZVS6yPjSq2To@y|tB65*v9|kLr|lA#&K|H%e*I6&B7)af?a0zwG23Qdxas`m z&HkJxI?8pT)ho59h4y$&+bHRqm_FBiV+5~n^nMR%BdzzpJx=vHwLQ_5`skVH5tp6g zps&_9tKiEFzE2B3b30!(_{3FESy`{4d9b^DnX}oagvA|85;%05dR0{zF3x%q+-c6a z`o?R|B)LTAIu(Vb-E(56J5??<&}mS-=q=}I(EQZzn}z3jt0S|Qv`i4b!y_>%`IphJ z6z-)50&)z`G%Eg6oo?)ZDQiF1v0{S^#gH;?F7M=plU{j?txDR%Q!#sbmPNSSwUf@N z8&_$li#dH-7a*Fa#vk?MmOC79u{Y75UDr*A5i86HkCj4N%Po?I|T z@XRN*EIXY=+zu1?cM9EHGOb@gKL78egCEuTSzGqYOxiN%V0UP;{n^R)cZJ$G^(n42 zOjbIcF3wp>=SINLU-Yg2N&+P}~D z#p^Z(J9H|)-*=Mx9&3WT_c(lUzr)=XE1Bwx}-fI8eyPwK3jAD;iSr&f2% z`acI0zI`!0HdW^L>Gda*|4co2-}c7Z3e9jg_GcM2vPDbuo~{x&rG32ZkfWr`5i?%T z^Fd1sCMTt|9+e)G`NGd>-Pj>)Rj}qp-`|KM0{intpOpmgT27dscQTlv zQZ{tWE~dDY)4J=eycCr(U4*XK^}P9?cl+#wqN)8t<^t}07u*hQ3f?y(;PiLxiPM!2 z2;OR#DDAOxyP+?~$)6JhtUgF^sZ5fuo_YL!_qEw`WHvqWI5(~Q-eeUkkAS&*40a}P z+qK8_MfUu-x?z`K=M&4xDhGYHY*O^J`&xbQ{R6!lcRQnlE9Cb-l;=71&Sjh9M)Tjv z{Z&tH1k|lkv{&^!7{z@}_;#J{(fQd0JS$l$yE#AE9fvhLd4dT~Y~vKmx#4dN z9T{!9KZ`rvd{Ua*{6&i6Xx!U9jr&%I@wu;HbE?d)aMzf>;0XJR-Eu;=I4*u(mOb~# ze#iPep-a+Vj&D`6&iWDU?)ofZa;bNnrb5mg{-?g`8wzEWsH@5 z5{}Xv<&VX#=#`LG%lawXUK+Gf*q%9S6Yr$GjVeD>*!y1YW6Tl_&=z zd(bi+{l*KMJjKm|wq5iC>ysn$Ag;Ub-R#j>o&wz4?s-gqH*VS4V`M;>V#KiGSPfo@4FPn_s?rQo!XS8%z%GY!m-yuweFV&c8|rvH-mzY=($Jz(_F(<1jgI%Zif8E@ z5axfV`swcW$1D~PBU`P`CgthP(Y_!4(`d`Y9E&IEztY|XcKF*xCA|2jxus{$?30Tk zS;T%?^>}EqZ&2Iydx2W~3gMep3lh`TFm0~cdGySS)`HU)8uv6Q#ThRg!KEI0=xzNPwq2crT{Ricj3a__nTP=O+u5V!>%r8;+DMc`7h}Pk0ow z-ASILc;@e)Cq(gVt}*pl^FeXN(M?@7r5ev3zub`ep;pRm%ER+h^3_hyHho~`mK?uN z@cp04j!3_xmfvg@_c+&T?Wt+&@Sl~v=ZW75Z=q?n6@Jn`dQ#5>e*C_oltF4))=kzs zN;R8A&i&xrdXKr+^~?nIR`$D*3J3ruZ+DIFmO2 zd-sL-C*K*nPgJRGd-7bLZGPl#d;Y!Wde$x6%9ML2)PL*N@1_TrclG%P|C)92`l5Zy zzE0iuQu<|fRD7__Kla+Y*RBhFPyhP$H&6J5>r97bU%js8`R@Gg{EOEs&FBB>?m7Pc zf6K?EGu9>T6FL0$!yXHn*!_LI;(9O2Kjhgxyqo^Z{@KSh`}p?$n_u~vP42F3{vXlP zp1*EC{pbI+G-X4_oy>XvPaQ5^u>NVw$L~A;C!hBd@3pS|`S|>ebMn>SYL5O1iIkUY zlQ)zPl~b=Wt)073F2?@h`d6>7yskg?FQDV#vvxFzg~atvFW~f+NnP@KG)9u z`lEMIPww08ufLX0HTqJrb499hoo2J`RmSAEcN6SOs$S2i*i=<<;;-Og+iTb7EppiU z_)|S!_e(c@bgjCZWR>@4-bH)Szh&!^MnQR?E1-eD%iBI*WJeNv$sz0=^L|x795yz!`{1R^U*D3rPXs2Ply-gBsXPN z89HvL-c{Rtd=-!M$E{~KX-)gMGB5t=My=m|ZOPYOmQ4J(Z~bj;o3O7RQY!dPZd>!Xq|ICAZ}iXk4xj zzj)pK?Hsk=eVZ?eww*1Qb79p7Z~kqM9>yl#=vcq~>sRwP_kF*$iXIa-%x(Iq`+MW# z>rW@7@^3q{rT+QBU8QLk?`S7K?{U9oz}b z3Od#|#XidB`?O#0e_i{#oYnHo$~@gu8~lG;NdMY(!p>ul`As>#bg#dAe;u^{6Z+TG z_1C5UpZ-tIc)dUKvw8BrXJ_v3`5A3e@BJ+Q=AX4Q_Mf>UthVn&-{qv|aS3W3H@jsd z3J*Rio*toDI&XI9DUL4=7yB-A-AZ|Eebm}w(a#AF#cW%z*#0REGyCYm_p#$)G-pAb zk-wqrq5o6&ZL{ROVrwN5V9IxB3;X@VA4Z3l-&C9}SJU>;^W3_^kl6;Wa~@c|R{Zqf z7ti#1_8p?O^McDJMknsFllge_^7YWv?mjN{W2-iG%N}{Kip#HHHm$P3M~1K zi7s}0Jt6j)ay924qx<1J_rtcIzBfm7n&I(cE}!OOTW7zD-Ed(=#lih&_DxEU%!r$r z8hCGNPDsF(`P(aEHhF8$eh}MK@Plj3WTwmcAHQ~#z7#4~OZ>;gu6}Ux`zbfVuG?1i z{TF?__*!_EjKAu##}DS#-Qo#^Tz0v`P~_nLG^`Q7q8AJBUGd*g{e$j1|IPfnB>X<^eY9G-{IlHa-No1BKRUWPoxTvdi=$@MziXSjU(c_u zuus~XQ~3Y;RFN~f$KL;1|LKqMv-YHy%y;)6Gb}q+6@F*`Im5qQF9q-Q@BKGj$KUPd zoV4Nw-Hvyg|908rcmBQ9yZcV@IZ@iTC?Yi{;w{6}PePh#a zxU&D?-}(#Jqvr^}ulT$F`9H4j_fu^D^nDEYANx*y_y1`RU$@Dx-o9FA{-f-P5A!zN zzms0Ow&;$V&v&)Ql_wsbo-_H9Tzu*I_wNjCyG}EnzW(Lc^rXMvBhPc+sdsNZdQy4W z?gN!?9M|kWRTesDzT5^oxlQ|4zY*_`SpR*Gg>voHia(0C?>;qE=l@t9eY2+URK=TL zxyN7r<2&Bky?o)mx~E_JlfUQj{`G3Doc64IW?Y~rqe}tvyYUQnir++11A3Xj!dz<#hoyTj|R+Rk`?Vmh9r}}Z1LfUnvo@_5A0H{ z)2E2s)XU?XckOH$&p)}}lkMw5Z+?Beyhs22Pr;KDgU$ZOJhUh($g@@1S2iWKKUz)S z>JHQEoJlO7lfOOoIC-q;lgrG+=?4BY5BK=`r#+3$^gB8`ICb~GfSX?(Hr}nBA$9x~ z|I}FK;GAgoVDq{S`G019V!di)A5_MxQlt89vb4>N^&rSHad(X>HfnCp+&CEOe z_^r>$Ti&~JKHZtKX=mxd=D8c=Z=7Ad)>`K6N^`f*>$G?CulQ_p=x$QoHKAjCd-m7Ozf)>L)|~G%`K7AQ+SOQJvk(2fCOrD| zI%EF4KiR4LVnK7FSA_kJe)`RSO8eVe0`Kjgnzmls*T19w;*C(V%k{_qPT3##Y1Z~L zf6ds|^z~1<+pKH6Zd*~iOo;xCs8wf^Pw!!yWdFDEp@vzxM7S;6=j^`uJ?!4>UY33K z?6cEvWNXF9ZuAyN=uZJ09^rwvU;;{`71A>c8eY|C`;`ytn`0$5+4dH^kq2 z`sahZ&@b*bdCQve^tAFbSC6Uv{ax-Q$Fu9RBD;H~&UqV4i|+|19~N8PP59CA_mR8K zZ@be~t|u+$H=i|_Uw?kv{q(5SbNuJ%q@HVJ`OUoVU7^g{P4}(mo&0W}_~-q`y09s8 zy2B#Y7oA(d6E7*e`L~*S?#I%bv)zBJSNQ)%`hL#F*muQm^0lJ(Z%Hb?voGQ5>|*zm zjb+W5`XBDFPP;qTQeb}ene>#R_NkvIZu;uxeUtgS(d(qclQW%9?%Q#)o{ z`Ewuta^8J|UDtJ5@2lgc-wc0W@SAD-()8L|{`dA9DiVs$*}d=o{*$r$#HLe^uO}-1 zzHo7_^zGUiPxT+))Jv)hpOC)RCcO9jX=d%;6Eu!^SKUmrymQ#QeAFZNf^%*bRe7|s0`ijVB z`;XOFSLbf#4@vsG?^BUW*UvLX^JI>5-+VYT=viXc)aScDf7K8DAz+jAD|6oe;H5nA zq5Sz*H@}{5W4(Ltp3|LEnCp*~^QF*#gr)7#mb@96Z4+g4h6or_pmW}URpi0As} zW1912jQ^VS%O8ESz{0OD((nIL&O_C&UT%K*@Uwi><Hq)T)6VJh?C#oi|M@VL{r$I^O#c1#VZmuXi{<{f zd&$XI*}BcEH=nWphj9br<^K&YuiM(6tonTS@I#T`j|G2UZ|`89c-mHExy6sElh`{% zpBbMoe0Y4P{rY2{W%hSHzHnB*x^T|NM`vEnKUV+l;n$B-_U!O5{694!=33>v_x_ph zy*}H2{bTZI$6_0Aecrpz>i*yC`P@Cfy5f$vRo{BH&zlz?+HA7uyX0|CnR#!@jxQFU zzx{Yw&gYs-%1=$L7F#6LOp!0ItO-1MT8QtR`l)><0z>oSGd{mm>i>V`^Yh(a^OlR* z{xs(Ce=az`@W@$To_OfQ#jn>X*}yrY}Tni)J6 zvNGl91ZAsPJ=$j}vrYcZhQt1S1ue35ADWf_Jox|c|3i-dY|l^H{G59xXyWDTT>{$L zpP$@3e{ynU>#rxD`|B1@>6)VDwrXkD^TqFO|NM}%z-afXAIpAMCFB+D?k^9mTbBQO z)wc4IFJB72|4ncA=jZ1OHF=lS@ZpvG%n^ph2{`YykY@dJI{$sZqV&a2-s!}h-YoxAhqmf!D5KmY&3^_^*tEB9AdSG97BxJa zu=w$V`7KWBa~{U4JubJrzrUsUewlmbA*;XVw}`)udvi~`=xb58pD%O|8{*;L*w zHCAci*PnTDuK(`)7JuK@wokCAQa4E7d+=w?gh!_AyQi~En{9jb=8cvAW}dPAqgTB9 z@y|zZDsH)6`=x%a-c};<-Me??52Kk3N@jg858nFL=7GUWhTprVM_w8Gs)SZ6a^jl2w zeN(=e#}`cdVjg#DePwU{Y#uACxl6`y`mH_IGUwU<%2wZgS-yO|N2PUQ{mm~o%VZ6{ z*_pr3N`9gB`U=NgW7Wy){6f}jUBj4mOF-Y$<6(rp_~M;i@qQ&IuT(Gfy>4s!de$=2 zh>M9~f%O(wpI*GVXgyc$+vZ!#Dsy9VpPYEmk+$nk(9VTwVOQ$Q&g9;la5d(o(3+gw z)LS1vrYxM^xpI}zjlSL5g1p>;8%^HyI%Y(vGUw0!dsJd?SlMlvv&>D;oppE2O`kRK zXY`D{bM*SsSAA@|Q|zuE)I8U&GC$HP%UJO7($PyRZf@&v?%A>1 z>hyzmrB7F0J(@GKtko%XOR>?c7q7NGz5C|N?pq=uj=$&re)!h0qI$`yl(lm|zpF5~ z)Vi*IyZjwlmh$$4u^mr4wPss8yB~et{5UyQ@-@db?pGximo7=L-u$2+bbA>?*3Aie zQ4F@by>wgZj@~K!aXoh44a?vr!g zmK^t`XBP*~kJ;%{&*)$G;K9YRm}*;nPkr6>k4q|6i5JiP(p@aOR*h{d>oK)$FIIiE z`RO&?Q^aP)ls)Hmm3&jLntbEJ(~R@%7Z$E5o@=)59Ea=M!1e6;rSFBVbgv705OwF~ z8^7~gw*I~p{3pxs-OSd_3&mIed+E^jDs18o{fz4-d=^(^gHOG_6FB45(pfQ{*3-(S zJ!UnGQuZvFvHzy!RnC~J;!9X|uAh@Be#dZ9*0yuI^D~cr&n)I&oHvKJ1EcL6^A}rS=Gj>@+`ATXlG2wwX*-3r@gszS<2?6QJ?bW z)bIW=i*MI8_4f2C*Ljcky}a2J^vZ+%Q^f|0%bClM%Zk3Oj$*Az{w&-)>uX*5hu(EU zYn{Jq6zhsz3;wjO27QZDe4uQJYm&K3H_?Y2a}e4TEAPWSLUjc_fFTUx+&YYqfMu0*JC-yvgKAqn*M!mck{o@F}I34 zV{}V)ubNDAuU}m*e%@y?49y zleAmLzgHcV<=#87Md{Syb$!0v7p9n57uGDBZXDZ}QM_OB+}54a>4)!?ICXAGzkcIb zM$xLjS6^5BoOaFN<%Okve$(=|PCe22^Vy6|&S%eEec887YL@+?ox){V>zBK%wQUSD zs6NaWxxM_Hqq68uuUlaUEM?hlO}%S0Km4?o)a;}m6^62}Z6|5Xdy({Bf7w=v`Mz<% z-shJVeLI`5?$fSkZ}+RJX3W3f+!`6a{(Noho0(hZF?@}6R1erI_Ttjv&SYvPOz4}h*y!w5gbEV4p ze)<{a31%BtCGbm!TztDC)aJtM<;Ai~c1@A>FVVD>+&}c-#{FyG zd{s-TI##+lb9#vD)Z7{W>kQ`JSoHs~pe$Fo|1#mT-;T3|e6!yAGRb0|PTKtaCeKfu zoq00*uYU&nn&@3&){#B_yBEh_Xj|q}cKOBqjGNxK*2vGkyLH_cwkh|YH=l1)w`%d- z^u{m#g;TM~k7dg?MIAXhM zvTK(EvLhcdGwV$wpZ(uB|ZTcAtMxy<4-mci!{^f0wU1T%{MZnsr`kTV}22V*ZDxN*BDkbinLx z-sN28YgWq|kC*&5ka>~#!0xVDV@OHEvot!Ow zjQ`9P@Hoa-a$-TQklGBjWoH>2dEeBf-reoIZuxV)=tsNWi&;#S{GRZG>EP3Yd3tlI z`TdlQwMcg*PP+UEUSGN1LD)-_6cPsla(DQ>$ZwpHz6k7&WwM&l_Ci+PT2 zd$_GKK`-KMmQMDSEC#(pcZ{Med-@tw+fsR^l_o?oiU|v_?%00t5?AnPj(}NN<7yFRg zSS`4V$2BF_>~>O(+qOHdGtRzvD^ScG>7cY=dXxVg?S&_+uV^W?OV(VSu>W!Qhtwby z|HI+?r)W2)N-mB}=xlWTqJH|(`wQa9d2G`JEA@}m2+vr0#@OzQ<*!d>#ujI|?4~s4 zOq#F!FN|C4 zn5#Ieo9oVM-Bw)NviNOxfMn}Y2D9w%q1iz=p2xjIqhf=v%^ZSK0rQgtz^ zg=4Q+mwfAsRK=;HIlMvF1Z|u4y=a|qIgck;WP(|3d-Xx?#+e)WPM%#=En2lt##Z~y z-8DHErXMePS=TzK41&nXvi$){8M2Gp@D&>$>6d zP=Wp3`qo)zs=j72eCPPFWYLNRQyKN&3$nWwC`@%a_^bAT^v?ixL5s5s^QEmO#9n+_ zqPjK2>E!1Ndq3{tJu!{@<*a?j7fxAJn0(cCQCPziA*ZDmW(!@JwjoSp;pLnc`c07@ z#}XEcu(d4M&-X>OLqWPlT3{iglUrh;hey&@p0%D&Qa2W9Eyy~wD(JFA8F$0&_TFus zDUvFiPrRL&yK|F!insDj2f@V&o0Ob9rpcx*z4M6Y&xt7SJ(mkNFz%|fs27pi#}+88 zoulb!=5TF2?&4e$)!?#PGl=W^ zrs$l5A0j16G_Snm+ZyJuR%F@wm>p-|wuFU-P1cLCiZEF6CHs((B+JPz-d_Gl=br|J zzvozGZF*w9P@wMXyp zeEI0tudhum(Cj*VNUeWoP{I>|BTnYxZJCl*2DQBb4w0W-1P@&hWD0Cd(LA&5=!QjS z+ap!k)w}~d`En$_!CR`eI%<(V)ABvLUmLK$cf6Og zBB?Op>C@`zx5F3stqgcF#ZSglXv!S_XMzcPyx$sxw_hn2WmNNyX5*}roj3W$In6iy zs|p%9il3IKZQ_`-)O z=s9kUi$C3@R<&#X$qhXHWLfHyLgTk=Ti>p4d$Gle*TySjD7fV;> zl;5Aa_#>S z5X~nuW9MnjA9+lt=R2>B?Q=cnrm{4)!!<=%$9rL0%XGF4C!7<$ZvSW+{9&f(nKdWl z8RCBi^_nZpwz+8dI!w0nc*T+B5sR}rR$LW%d(C;B(2rXm9@(bM4?WWE5!cGEnvoJ{ zqnZ)J*vq$S;&*|MvMGCaz1_`I>?ECiU{BWM2i#gQ%xAVA_}n^UwdOUWf>51{8+*;g zdu3Dhx~=GSc@pZB#Z}ODS-R|Fxs7;Yt8a!fzov1bu4-sESEh%arlNW3!P=KWQe2V# zeGWpme~HfiFY~=K_*=VTZ}zs9(p}SaqBcZq`;)bON&d-qQ!?KRr=O)=rr&+e2A-Cv0^W7Ye>odx(PD_Zc zn{u*n;-2S<&#we_P5JH=U;Uin_{F;|^OPmFv?i@#QPb9p=`_2vgzEla@XbS+}I6*Lj_b z^UVEcL)qj48`eEBbZ@!ppxALV%CaS;XXk0f`pPAjjzljHJh4vZ!bxdk)-xV^)*N`g zQTE4FZkLT0le5-V`t1AAU(}`f=G5haNMy~DE>C^ionlsKEUZwWv`a!qPN@hwD z`fP=k8z)|V!cxfDA=TmDG0$D`BU^^c^j8hG7gJ{);pX|&qqV7ZVX|_%cvC~K*0oJc z8FyU1sN9HP_N-hmYeLMn!$E9QoVSJ_4n54VxpAwz$F&7He&&4@b}D*i@r;U=yQUXk zGjjTr=n*r|eBF`_7af*#+&Zl&-6<|R&1ngz*{ToK7ac{iR`C244akT)F(G8Zr$cTc zRV^E?@jUjJx7016_j>&FSFcYv&z-<~Q_nRa+477+=XK{7Y}OH=Fi+TD`6Bw?*p&8|_Ky>b(J_tkDius_)uf zm@n)&s>>@p7pkxaZaO(-?E|w<6C!tC&j~8M!gK!YgjpgPo#F9M-h>J{ zG)d)`Y^w-;-Eb?A%ha&^(T9z5ot(dXXW)#>m?2PAHqm90`IDdjygZaQHtv(ZlyUg~ zzjsRg6WCL7J*K4bSDp-h@-#QVL3zHDGW)ug-zHM!j?QK|t~1od^>n;7cTKvb!=GiD zva-cC@9^PMVc*Zmb*4tIn#d9x8S$vV)yMkN!{chv747;9#17{!<;fnSHcJs^hfriBgMSo9>!h zB{=W-D(g9I57*6!Iu3Cww>)WARF&SZUlApzayuaDVbCPk9l4KuLdBRWGgS+PGMwJd zT6<`2*L7#^G6APgt8%$-@04f}y6N-CTwe7o+4<}?6gy>e&Mf1Fo7-R9tiO38((RAd$DnYf)e=+JBpJ^-c+Sdg zV+6PF?HwM{Mq2NGdz|WZYI~w9_0coYBQ86~Nnfoms^Cit-=hmZTNg%2RJ!iiv&VkQ zvIutn`>$RpoFS|6(>&2YalL7vm&rBeF!rvY)AJlzQ% zUxbu7pKZ8vQcnGCWP8QrDFQ`JvzeWXeBvGF=PVSF@X~2xH8`^WNzpUU=(pDoRxq;Z zww=mzPK?wE393Em6zVmN@%^VD?&qftTUD;m2@`#);^c8pbk)JLPaL~#;-*~>S|T#3 zea%0AMJ8U)sneRHPs~$kYg0KQI^k6CJegCH2X*on9ZM99Wofc_;*~Nv%Fd}~&u4G8 z??<5+md5G9SZ78Bxgh)nZ8J4wo;Qt^PFIBJ+XJG z+8XcG)ASyN#Hk7Uc|S0bFVZ^YCo}8E`TF=DNBsm<`}X`+)2|S3RPD8|{A$v>UucK_ z9!}*yCl$ktpZJ?Zw&}ip;J+uh$WM^d!SCqPn|_>swoZ^e{ek(v?;o>sdE5RpyX}wT zo)hZF9=;*0qxR|2K+A&}t-HKF1RXC@iV|L(=5$h6X2zoLQqN8aZ{(@*<-4I;`9pu7 zb+q2n57XQIt~>t=IWb@4Oq>1Z&)<44?EA#reB|Ic0T{#(EiPE_Ts^2{%lZ*m_Sr~Gery$~Uw6=ONzfDB zr6+zf6hECT>MGFhaLJ&AHAt)^ZsTzl*AF`9;(1ahU*F1mDO+Jm#n#Vkzt%-r$}F_v zIC||vU%;G2N7!HNmJ_-y)4pdSwCgleSg}G7 z*w0VUJ$2!w=!FvworNA}um2D$Gt1o*x%p}MiBD_3YdtEmZGETq!Bx)m;~R&XpS%lf zCg?4nFePSB-=X_UJbqr?SE>G?Pt?>SO3O85VKn>QtgfV|$}ZP8ywTWwiM1rZ+C=7K zPp+!W%h;2vA1q*WpR`~y|Noo?Q#n)jzz?+|hZ?Yq1QM1AF?e>Th)Hb*fag;O(_oqPT6( zE72W|p{jlBnkLwI1sW{=v&m&zr&yW9r&C*NT$gp_C|><4nkBkHru%t}dt;$)Yk;)b zF7_{?(W@;cS*~$6oOb@U!v;w$pF<9@Ehf@d9;PK<yinAokKbT1)8YHuZtpyB@#*Kh@Sv<&EYrd)u75Zr&sI`g zyl}sS&iSwNdww)#9NzLynP=O=>Cp$KN0jpJ+yD7neqXbYMXf;Cw6=Ho8F`%FCI~Cc zoc*KgV)B8vht9IxXJhi&_x3|@%d8sKr`%^Ih)0Mk&e1H`&oXCD-IoQXKcgZI=LE8( zF@HBz(q~j(ul&Q`cH4{SM8CL85@5|;dY>y(W#5F1DCaX1Sl_Cqr8N9ZJyFZ#w{N#8 z&%;}aF?>R`qHYa3uR;?#omZb)?z*2VSA|_A^+%q}soA{GS8ed$S6swanflJXA(~59 zdFHV%CztbI+LvO)QZL_NZ|M?nVg7^3{clnQ#EyL*Sdc#{SW%h?+ zDrF|^=J1w{5VF4H)!~0ndoA<)6t<1)8-Kfc=r%^~lTr)&A#g<~(siHJln)fi4u|EF|BN8RvHt+37e)-cgHJJ%!2&zi;+sXtNWJ9T63P*qXEZ%&6&E5H}ap`X67owWY-mO}G z>sI@$2f?n#mrK^3eVOeUzxkKf{V%;=Ojoa$l>5JU-@8}YGk<^n^{ci``&IVDhkaka z+P3``{QmsQ*E6&I|EeB){Js9n4D>RW(fnW6Q)@OV_!N@m}lN zpO4SqIA{Om&Cjl%D>vE|@z|%?W!d+!XI}r`^LOEl2KB!>hVk6% z=db(Ubo_Nq?dmBH7a#i0d+o7#m(jMZ_xD}DAAIV<<)@3L_5N7O^DTtEXKVT7zZYJv z&3<(9)kDSa?mXWk;(vEBUG2M{Zdq)zZ|!>Zdq0@{?@P9={^a#iE}hc#r9vi>_I_!S9{a{3#!2$DIi~YaTFfm1mO8qrzG7X)|vfyEcW1b=jGJ zk!f>smu+2tdp3{rzJLU2VV~38oK3bD-b&kqCEw^+FFP%CV~>C7Z>|2TH_D4-Hv26< z-SfTnZrtOIv)a{<7kg||t=+qP%E$NpBDwocT%Xz)oA@s_$7IjW)Md`kC9nM7w}|!r zsb?=N{+~3Mo0Ig8cd3uPy+0E;(PcizmZ}|)E zZ`Z%RFwAp#)zujH??6RJ3xlul+cb!2_-{Y3B*7(W|q5SWq4!hOtUAumN z>i@ir`fCj5bz};kd4Ho{cE4WxnyL+=%l=mLUt4Q@`dOT$^>dqBeAk{%(z(6pWLYpz zwR`;kgoHJ3=bm3*RXkUA`V^zGC4VkH+qwP9|4ZB7+3TK2^efE{?5n+X{N|PGsoxwQ z?LGRfz{2>I{1yIxPwiLLpP8`l%l;qr!nuFVv;RFibHC}Q^z8krpSS1y3p;av)z8ys zY!e@yeq)ha_D(geY0BO+jT1$5EX!M`UV5;za%qnPzsOsQwF`93_66^0R-VN#nRheT z1=GGcbG zyvNGjyGs1e>Nnbkr=31)>2!Zum$G=#qQ85NKAsdCc9Z43P|M-)l(`}^>t?T4U*kP} zN3rJT=@u58^J$aW9ZK=qJlhZckdl-6>G0;G z2z zM6S^OX>a}N6z2_RJZjFSI9ky5UNrvhj@jQM?(a?gD<~hL zvV}KxY4?HUuio44-tn)s{k!tD(|q6S<2?`FN&BSp`RK&`C6D#K-+3})*}vH~>remPxUpTA zYvq6Lt`T|NM92pZ=S@rv1LL+^hYk|E7Gu zZ&-8qL-N5+Z`|OrP%OS)=Vu9y7qYW!=HC;m$?^Oru>YG z`|q{rzuoJ~&fo7>Y_O<2QZn75-`3;H^&9KDK3`_OcHH?|dGFsxg0H{M6Hi~V-m2d| zW%uqq&z>m$%hR5%e@>!5cK=(8yZ0aNDEMe{>AL>jf1Z!-tz8(u%HaH^KXR9~H8mSJ z@=pBaegALTB&Qwc>b`gVmaf@WA^rA^EKlGbU!DjUUxVYo@T%E;A3sI zb8pj5KmF42+$ME?aE`Zl_1q(OeCK&rRUZ1)FBv}bdB7agO1_Uf4p!8kD)ES~%=c@1 z`Lo!q=l)aQ>HS7F=BG<$%jG}!x)ygSwfni)l(TES<=)Ksdnhk1_wK`t^Lq?umB-$! zb!dJr_|EL}=7~mSPrm9-iM8LiJm>8DUm3o?A6S2xc;CkV%g&mr>(beuW~^phd8~5& z&jlN=zd5{J_^)y4iK?wz->7|laBP3rw*`&M`W_^W59)Q|ltNPrZA6=ibBZbKc*z3VgIfNIqjBxh_~;o=(B~#vzOUi*|0%xe=yJeCo&Ju zYidWHKan@v>(lD|>pYJ?6<)D;H_0N;cs;-H2HSHxw?~@)tC)M7TgQ3cLnAqUew)2I zhPmwi`~GCh#XtP0uP><{|Lf2bkMP~mGtTd=h)$GP`sQEa)z|;cZNdxV_B?;evFYLd zv^j>a&z#&Sc0lG(e14Jr&+GfWzO1kKV0o;3a&p4d%7yjOclIyI+4pz;{g3-rzG-~* zKOkuNorL}6f1_*ao$voIe?RZro&UYha|->In?B#a$$p3J729VY_pAJRUnFDkBRa1B z+Uxx%|8BqOck-WZU-b1B~B&xwb-t&MjluQM}ydA~m7Q^JM0{FWA{ zk_|sUd2pv$wf+3dlJ1Af-@4^DziHQbEvovwhR^JH%|GVb|0ZOvEw(G%6k@?H^oIXO z)q%n-=jz^9sNMfRyY#e?JntT=;s@Z08MMHaw|*HR1b=F#Yd8y?#jZ+ztx*oIkT-Ymv!~dny03 z)zU5Q-rBsy==|Q(#U0xhSv_g5E$e&D|29c}%ajPSRr2OHj=yoXPW`szdc=0SJ^v3p zYCLJ#zQ^9~3A>KcX{-MD_TD$n?&Wzo-xH_ppOe13<7ce%yse*NOzrgf*Sv9FB%uE? zb^6l+e*L?VO^=(;y^cEdj`MD_)$f9hs$-TTj~s_@4QF>9nBaGvo6WTr&D8?de`K+gF;- zdw=fw{(y(hA39#9SN=Oc#i-`0%^uV9>*~L~dGqa)o_Y}9AIsZYPnIbA$5oyv%Q#o` z*(UDOlb2eS$xCm&ZTWf1Fy_AW@|vPkUpCv+P1?}>$igz!^6zvtj`uT{pP$x#zCOeE z`oc-ZoL!5jd&SMu_^|i!Y58*fMxMPNx0%mNw%h;d&)v10q4UJ6f0gU|*F1fB`R(Qt z{PC3^^3G5H`r&uFspz!*4-VEZd2(>!<>V(n%P0Tzwquqs`pZ9~?(pZyd(7|K%ADI^ zKW{^QZHI-x&O6S9UCr^@l?@T8cFBF*_UHaqmd<e&{EgtxrzQPp+`)|8b>x|KXx7wza#bS90+0t@-SIzHZ~B>B3QO p)|Xexon1aX)-E_v?&gEnvx>G(F-jMT{I}lc-Lv}t{LD`{tNQtsxVYR<>^47P9o!t5vVo>2-ejlIGv#<7s&| zchZuORb@AAFSju=e>qcc4zrN9PJbTIITl} zzewoS&<1`rhiB98i+}v~{n63xj{f;}f9~lqq%d%uPZZ%&XJ0!#eePj1m+XLwi&giw z#b3%czot-~weOvCX>IoFZ_jSswVu8GdVap+vlXdQA-kW?UHtg-<@WP^yWa+%uz$ZL zevZt1r?;nmy|tcgel0BT{+{CGw^~p7`@ZLNznOgPV5W4@+Rw(9j|NO|O<8{N|DT)d z&&AE#vOT^edhX_Q?YE2nzWus&>gCDT;-0^F`R(k~%X_ai?){Z@)bviiZSAdh>umDu z-^%2!SKkt|e`8|3*-rMxWpZ3H`YX@h>Rmha+QW}OFW&s7`)=Fy+`Se8KGBzQFTXB5 z{qIg(rhVn5d#`VQf99)t`S?!97Nb{Rx2C9FU)pc-R=IDs=cLy!g@c}#-kRViZ98|@ z+vjf=U%M#z_12EnOo8*RMGBSg`_;N}{^n~pHJ8+V6@9`Vt$r=<({uOzHdb|oEL-h)hvwwSi>fYvS7vpYol;+lEKRtQyW8w7!_V?^;t?jbb+t^v$`~9@+ z`X9qPHQWyKxAIA>*c(?{Q&YF${<}Ks3%xZGJ9hrLw&LBJt^2t*EML30wk=yPK3wFx zZ%9SOrK-Xw3l{IRv3oD`#yP80)~NmX?_&jZX?gozyqRy?{N>m!sVDQcTKmtRyHo$> zyPuA~P5zeGm0rt}otO7NtM+$z{MtKr{)HaDaX#?*n!kGwAAbCH^SjF5tJjC+EZG?U z=Be|x+t%4;5_>GH?k>~#@?^o)-2F-%8!P1{SO5COsJU|c;UBv;YH}Vj?+E_8dw<=E zT@fOliLW2Ut>;S=FD`Jj@Miju`rCuOgPZC0pW72Wvd^gj2_ zoh{$3+~3bHk4~SPym-p(D_-yJL>{-UK7O42x7v)n{5v;yY~EM;_}jFH9TR6dzSlTX z_Wj#gi%nm5&z^0VGHn^d&1Z9??KXYwjW&P3?*5HEf3NEAYvQpIad{nZFMs~KQfu`a zhkM?sp3%M)TjEzU%RX1S)6Q~RGvk$XZU*KF#X-$y9CvT!KYI9EL6OM~8>2G37eSO5?y-dlOilmM6f)<}Tx%paV^;gf= zh1)l?KfV0<-Q{mtuOB@4p(^6<@ADiZwca_&vB!z6x|Fm%WiLa5?P5awQ zR$n%?FmQ4xd%xiG6V4|&6QY)%pZ#U0858S)G-7E2WyQ)5Fu}I>9ViSmez7(BE5AE=sL3P%hZD z>3XG9^n#|d6-x{c8Cb-0Z#w*NUqr*VRT;N;pZ@zs@@~FlXu`R7_xDKF-R0Py=g7KsYt<#IEcqE5 zum3MI{;^H4<~Gm1)_^?6lXaUb6zVV4{kg$&?O5~K6Sv;VNaU?)nDblw!>v|^JwQ#;XSwM(5sh;(#AXz52UN_e%{-s$YHeq zjf~8}6>PlH>>IXE)IQ2D>^FaL_01EC8(vl4oqpV(@0|7T)$Mcj&-8BUR(|K*+ssjW zK5+e`%->5==P7*odv4{&rf&-u9{!>>dvnWlzjORNr_N0m>lZxuD(?1@Q*+gy``-?D zCo|LGR++;ozov7`*!JqLR$FP%yIRNWdXmKtuiRI1-?v@Oc*C}J^@IztixvM%Z`GK1 z;KR>`xX;1j4R?e0E?Yjc*5s+szp39c*zd%xo0;|gobi;?8_FMNK3_R=`HThe7RL9o zYA<9wIPpuYPRdgLf1~8-isUr@Ito&DS{$u-~RZ~Gc}mNRJI^PbEo z<~K8>V|!kgC|@^y$uVn^p-!?+|M`g*w2G4M{5kq6SopxgvOcE^@1Hs+H?5u)?0n7h zwQ8EFUEVI|1+Uw4=P;M}cx|aFs;gjn`fj77QQR(l(KA+jKLhVM+_Zl`$MI^!=Hvr) zYb879Sl+w)xcQv?B5}j7U#^~bGd*CrzS7)TUhN5+3*KD6bn+wjV+Qx*zjF`w#!NmL zz*f-qU2*sQgJD09mo+T~{k)v~5A=cD5sA#+6vw-}o{)UG?=JmXtt+Vj1 zDc@~Qsj%JY{(ILyy`0>9($!ny%f1b@o9jz&>!weh>ujtv|KxW@e{qQ*{vKudt>^iD zZ`@ogotj+j#`5LpQT42>*jM^X0|Si&H0HFnhyOGloEI*_WSv9HUDB^ujHf49^W%QVUu0T zr_p{!_Q97+TXIT!pC`?+vB;=R{I$p6UsC(UYX^&4F4kquxsf8DzWllS+QWP)^X4Qc zo_sP-oqfjYJ$I}RELr-6<+a~=pIQG7l~@_hyKQ=}YhuOxSN!em7H^UYj-L3irMqTk zjo{5X&eX}jPfmXo_}Y?h#+TAHTle3$JpAKAu5?=O{<+bSrf+@}C%MfGJ9PQvH*xhg zgLKJ8$BN_NRzNKkJ-26y=eNA<;S0^*=_u3Z~yMi?8HN7 zynZ-dtlRkg=G_;ZyQRNcT3DDHo|XLO_&YQE{Zp-3GdG^8l~^YIJZ+UqlZNb;p8Q>G z%vHW_bL>qH&-8Tf*%e=Mu4mWl_PKlC8M0lnH9vNZzi+-&_18R`>dxdD_Y79{aZc0k zopzz)<>}-ezR>H}Tde0~N&FIco>j3q=e5wWq_-T;_DyiScE{Z80#Ay?3+hLUz%;ztc5Xl7*iI zzT1*|?0N0vH#axRNzcl+6m~cpkq{&=SA6HGTo8Nf<@CARJehpudO!OmAGi20V}0f8 zbI%U(*xy~pnflu@BdM*|ICHXL(x*6socT9<4*iJzePr39yJgQ`3L1Ud!)n=cX2!Yy z4=cItjnCg^*PSz^biQ=@xyx&$Ht8nMdeN>fyLhVciJ3>)Ik_y&=e9LTww&jeFOQy(Kl|k6&cdL{r{rX3hy42SVChaXHde{zn)@8L8P1hi zyFGQwo4YuER^*|_@4SThe=>GRk5+jbw<`&?hp(0c0B_;HI*wf8EM{@ido z6ZU=INi+Ui@ga(-KWyv|-MD7zWy$s3X@jze>~{B=al#M(3fck(_{GACQQqlT@gApuefNc7y~~`!_ovp z7KTp>x)#%(%C$U5cTN-elf`slk@EEzUeCvDaZ8;T-k%6{bGWI--#V?0L6%E%>)m^N zswK>fE=tw6*D7uC@!rnJxHKpB&}v=A4-*~EaW`BIn6vF}bVaGR$ghq=cO~c;LDS^KxE8fYF1#}9 zg|w4*m`r-)uUlop6{Z5evQ%Q40;(*JEQ?t*N4e&M01La&qpz(2PF1CzA8u7Yt}s7RRHa?syYEE2RGQqkf+*^@*b;Z{<$5-!6e+$kOa*6z7C2!W*;%(~l zyCiDenr&H^l8thQG-En>f~XdO`2RbRsU=;|DW^^EKXog~(;`Tg|iN~7Y~jFrl)nb%uZI&~My z++1BGu``Hqsb8Izr}q9dkG885`=VJVPE9pXUh>jm0;lax1^>`p!iwCy-%IB-2^#H9 zoM!KCaA6IdRaGKf^t~&>g z^CaDuy~MsbO6-GI)RU7_cr~9!JczjD@xey)uIxqklhs)ZGUlA=_Aq(3Oyyb1#1CtP z?;6bf6LBJpYrWPX9}y#q2?8QTPHYxa&YW3uWACN{?H6m>>z1cHc8rBs0N}loN z_kHYr=&33vt7PIrrSQmyLGH^=FPyX5srKS#mt}E>W5VWL6L!k9m{J|%rue)v-R{is z)P?t~Jk7rR2wEY+vEOUQy}&(ZFT539|I6LY$x-pib+$ZHJ=vq$i`LHhBH{2VU+L@7 z3D5Sp+nV0O+%t-ahYEyXu`hLk~V>jb;KK}{EO$}_l* zK5Dt};3STe9V*#qXppiJx?Ewd`1wVq~gkU4$|sW!RhYE-r@NL&Jq)_naroE-l_QHdeA0eeD=cmc zO7(p@>yGr%>gh7u+Gg&ZwSKqK^VnXGtQOUsU2`7IoL2OLu{iNVgm_a?)16JG?++M% zs?pdGku|GSiigQH%*0rH)(cU`7RIdhJE_O~?>(1U6zRWf_eRIywXy6xp=+0>UOC&^ z7ATc-{#D)Qh09E}BPM;kb4h*WXFksM`O8}DKCEl1Fje(u?GjE`QwdLJ;da{LYu}b) zv;SGm)QS9E7uQs&9SsjvT%i(pK)uL~<(hXln{MUc%Dc;JY$lfp60m)6Bh2<|G;y*<795{3;d5y+?-I-6aGPyF`m~q)ltS!)lu=e z&&;2)g3hZfA7>>!R`az{SJB|<^j^2A^{t!Yg;d5Uk^dWJRt7i3xdyCe(h9RU)uo_z zbce`_-rdtxdtw{|%vCHe3QX~CxWp4Ht};!hLvOls#r37_eiPTX)QY=mdW&EFr2JC4 zv!Lja=v9Gvp>MlxoDNl&Vf)qDaLHoIq-u+I_Fjzq6CyJ1^tyaATrg`|YRjeHoQZl| z>qP?H1Zw4)u6HeDi!c0Up~MlmY|d}V4>wspgnmmoer?T-fSjnQ;=+5y+1$E0gjcy+ zJ_vL^cs*r{SL=gTE%(3GoL5$>UuUhcI4N(y7$G%tmfFe(AE=<&u{onNtvv5 z=HHa|^zMlw3Q14Gjw)VK+?n6@=*pEV`X{rsPKIQj>SX*m(e&EKx{$!PjVn)eFp4{$ zi28De&vkkDMDg`A967cos5AR2p6%mKUdJvxrEIH~nufZfuG@rL0Xc5+o2^6_RW+PB zP`%H z_PaNx`t+1vRVrdSHS28>lkwst)y;ap)6={b<~}*nkSv^h)oIFsu%d7Fv(L=t%TRcD zY?{?{VUF#Wujgc#WZi34nlxpGM(Way8%~DkR-3Q~+h{L5Ie{m8_sa=AikxntGkKmY z{UxpExMAkUsn?DloEfLEuu?znt6NyCoNp&@<{O>1g$W)`2e(A5xs~b1aj78r>fH|E zBa6ISz2pQMk1knl7s0vsRH%y4b^R%Po*KC-$C$tU?Qu_Wi1%lBP|dt(kH<4xO-X|i zo};bT-M?i;t&kG&J9!~H;KGX2hkA~w)$0ZrU$`0mU~ZY;CFyeAPv)#Y7g$s~C;5e* z2>7PF{D)-ZyH~E6+?u;Q=5{LQ|4NBikk9yDTS7q6=QKlzppo00=^uq|bS%HX_UWMW z?E)Ju_QDfMr(0bnz1`RKw`)Tc^ZHMHRm)OO6-=+_SdRLS$ zw2K=4d+BoGuts2C{nmg4S4JyIw*G?xpB8v5)(C&!nI__{CUUOhvzy+d{`SQIJQt_* z)P;St=Qw!Y(RZ%MpA77JY2b7cCgjtUdGHpv%Tru%%z`q83sbbb+g z2b)v8Ece0JyN-orsB(n_tFcCjYhRq;rfhilcZ^bVT8~12(ZW>i6^l+NXp4Ppd+{R3 zX$JGfK(!~~D}%E4KNe-bap>5RSUr}|;@aN_HZR#LdF-6Tlr1N`7CuQ`bM?v>KBvIe zsM8yZfA_22yWYUQRPhOlv^y@)yH~g&@`XA=J zJ4pG;nlE<)&Z$1ns$CGV%C2Miqcxip3#(UYZ!VDQ>_}HNUD4qldFh$(Cd;#KZq96P zlM1yMi@cug;@YYCX{RpgBiLlo(D=z*^_KNgH0vwW;Orsi_<5~>glaFRt#n4oSCXNMRdmp)7#E} z8$2>%GB#S&z4_CTd9tJBK&}OcmTL&Jg!(GAM?tTBgGw)LcoJy(n){8H#{@A|JJHWG z#UAo_e(9U}V#D;atQw)VVn*vu?Rffc7I$sV+=)vbsWQ%=#u39;d}fB&l!19TZr=6GbqAZDH}eAKhYnvI#Q3$CLLwu+PYc`GV##2`*Vp0m z_Ctxh0QQey|} zPr+PwgK*a43Hp4xoGyuSjZrtQo~^BXG1qyIdXXDLe}}i&jZ*#HnUBiWw8blXpZt}7 zvUhdQ**+i9gN?Ha?u&2xw9P@2qqa={W7mc0!WGg=cN-_H zlINJR#-luT!3&-}8q8C#UfXcNoWn8pm9Sx*$Rp+I^Y1KnJ>%&+E?4@d$YbhL=I2}c zQ*2)adM=15l@sXEn-~zv`#4l2ywtQ}I)f?ET}*rxzWpT)0!?Qm@N0 zuA5$;7QT4v$Ry%B@0U~HuQjrN0{*-RmMq=6%21=w`J2z1G?sZ`SM2>H{@P8xqjZ~p zp6;>Cn-AF^{`h!;yT^Cd3zf!6Z|!$$W_}NJvP@Gq$-jGJ8vj+<<~jZXbLS~u3bEOy zu%r7s*QYB6cM zSoPtP;?norQ|7l;bx(~;JG|(5OSt_D=AZilesMQ0Kj|4?u~~6Sy{gPv&j;IVj~()H zEM0l}Wqo{=OVeStzdt9O{;%_P&2L|?-4ajgd2J%%gm19S(EoMAgxd#JKP&s+-D)Fq?aXnPBT@S|Ehq^- z+tG1^sg`F?SRX@0V#|6ZN0v)@26rTYcroLQOu+Cab?Md9+!Bgdg1%$^WwbyfJI)#*dDTb4s_oP?WN( zU8ekPH7Aqe32~PVSDo5->waui`K6_|&a_(VkQK+``W?KVG9M&QEb}UKJ(HxcL{;>X z)9Us)$5$=CvASx4`lr6yeXFcE4MSa@i~7X-ZQ*iCQLzi=s;%<0kmA~T#*;tx{wd4f zkAH?mtuoeJX!-m_^69?0mp0T{s%m*#zxw$lE-ap;<>ynyJSTFx)m)=d7^SbOET+)rD4|TFG~fyaw3@yJ(wn_@!reg zOh>_=-jIWvV!e7+Kji6rd76W@Y^kI8{Ha=|6Ha(8cJ$o0)oRY|_gOs*ot@X_sk^G| zvOc&dr_2AcobxsgU;X6J;H@rqZ^nyh2RcS{{|Im^ySr#Xlq`RG@~RcfULOqM?bx+> zUcyW!%V!@itY5uhWsRE2`Id?C$A5S$Zo7G5Nzw%6#-7P_;e`>Ce3`eMob#k5jB(=` zb0HVwg$Z9L_=}b>JQrB^R;S3O?te$z0s);{%Z?s0JN)qOeZCW#ovEcU8zSV_6n?G!EVHB`*)(F1oCplj~#p(0KLhd=|BKKQ93|F_3y7VPslAL>&3-`(k zi#0eleNT`mn|gCnz|>dn^Y`vj3`tG>w8FS2r0L$2eK&&E9y__lW!;UC`lu(%zwTGc zxbR#%_OsTBtCzGjd*4=jbWWc-H`n0o#zzis_GrF)TWKN^6e_-Q?Fktj-Fb_iwZ?*j7&(AFh+MVZLT$EhFLw7utNi#3gqiIh{59$kAlWaFI#Xo&vU?-Ig_c*dow( z>_JzKavy8#+0=^7oWDipb=odJ^t0#C=Hlt6FDXC2xg*TJD*Pm$;JvjhzuM+Hm8M3% ze7(8zkAuV0Io-x97EXBS|BLZQDigyhzwZmPoYz?`j44=sYTdN8^(t?}p1yk9A~);d z-`It(bTg-muL|m$_8{bFI;Z#k?}sGiJ&vs5+7rW}uNsqeuHa4J`MS8tl{00Xvz4}5 zPMrF#zO%QaUV$yg_x;|2E^~z?nR{!mN|rKc6*?u;9bI zt`{Z-`^336>V0^pV&LH&y*JwJUz>PMDdQGThtlJ>CrF1^pZvN!z9!Vq;Y;wVM(;MY_A+abDP6c&@rRHRpWGyc0VVxqMq|{={5ap?qYH!YnbD zDxMMxllN<+3nVYDo$yPaHAIcpyzOKyj_RE%aPv!fh=(uZbk_*SFwk1b9d`^mboz0cH z@aX7Mf%Q{Gb(>gjKHM?ES~V|Wb;7SQrC2d-b%9LIMStJcOr56fE%nwiu}LgNpzQ4F-n?m!#+(ozbxG#J-{WPle z=$>NtY4v3pyG}Amb8&ik+RPBDcyRFXMN3td$cwSUGmoue6ID!(nsB{k!9$ka*STKK zhEVc)MnhU)+$=KJ7w<6kC(j{ zHS}Caa(?3b@zxEA_0Lv_p4hb|TI@+iOqteajj|jTr=#IVgo=yuZ*oieOkJy)<1slx ziF8Mx}-Qj}^ZZ=5#6K<1TNneuLB5xA$CEUAsB@t&8GU zLHmjoew*~%R;+WJ>8|kc#?L&}WV0!4@BYSe>WFu!3)=|TfXm^O*Kw8OODCqLGeArk$TOtUU)tu^eLaFDKS)v_6@8DE)ePF6YTr&o^~TAIxr5oZ@CU#nCV4?5PDZ*Cf3Z zpYMuIa@up~zK>(wPG#

xnC(gSN_w&aHQ{f1siL$fteJP22J%@u`hp4ON(@?u&2= z&kvgPM7ufl*v7@iCn9*gj@SCWEiGDh+2eHnt?oqL{b31@8(B?-jtN;$5Ig$$&CQ_7 zlPkiR7ff9F@O_{cck}hbCsw_`b+yseegBPT(q8>FUbgp2qO@**vRIhq!6quP%x_nY z%<`!vcQ-HIU1OoO+?nn0_LK&_O~?FxnmVVQa>^6Y(%L39<)cK-FRQGsv{j4veFeRp zG9}Jd1Y9><@5$UfZ>6Rh3%^u&wR+ja@}*PHH$1ChIvZIiUUfP0@O-}4-kDz&0(1O* zJU;jFeF7_Zd-@K6fVESN-l6aTOHq}icK~u%reN_WQwcj7n^8Xpo zQC76^NX)yeb>=D|yj)L8Ji3=%whCA|z1O-sL2`=limr=Erkgc{m?ln`_vTCd;R9PT zVlIDYxwLPA!g_C3uf#nED^$3D-Rn8E>dZBz>rPWxCACj+zUgm$lP=`seUE!uqk_o$ z*ga9@->W`OQ#o|>)9*lW$3H1%|M+%&xSDNUl4Crh^99?=8@HC<{aNhp5+r)*%UfPo zMc?~QW=bg$E;}1|^2JuH@4cpLp8d%9OTKT@L(Ok&>pW~Cg*{?rvf5^y>=Y{!G7R;p z>eBpXZ~i7Y`pU7DPuES_tr$LY0#EGcAft@@xaPFRRm!51r|G=eE9$s1a%x_lTG37C zm$`a(cD!4oSK#R-^h4|I#Dg_A_CDXvIx+s+qsk1O=u3xlOT`_T^e3Oyunw~1+_co; zxA(#@UCHPo|8CRO4r54@zP9%J_a$>%ZA4XacTaTKr`CFF%9jm?_VL=3iL=amrf}Iv zVwuay<{;jVy^c@2ZUns9UzfsCWcBdn6rR0N+~>LZYB$a}x=|&HfpdXv^^DnmmAf-5 zttM_b=~-+$_wvh+ytZ%hS4Q!DyeIO0qlF#E#+M&?=lVp-xNf|mz0mX~^SLO!U;7T6 zZm&4LcjAue{cFyg`rPEZGW`4IhYvkH4lbD9_{u0+e@~Z-z|-q$vge(Csij;r)MnoM z)>`kQs&G*1=Vreb^2!gD(%zWzGz&>=4cN#zC;v#6%~_Tc)16Oz$=jkfZ*kK48v+%x zo-a||u{QaBtAJPRq53t;W^tGPY;(BwGheM`kH!Z#7Oyo$LSLKL{4Yt0RY;$cZ^(Cd zlZncWDgCQHEd0;rG~GidKihAT@2V}nsu9au_vqXTe|gMo**@hDZ=B+lm+(7PC<{rx za(WpcvGc><@O2jUuhuM4tbQlaHSgP%|J{>HCS5(&yPaj;yxuF46+%yL+}>7lQbG98 z=GFU36y|*od=dR2skJ!!alTjl?n#!amY))S5 zsm&_7@W8eAFXI=n9N(Fhmm-i zdpzzNFYI{7siYb4(cUBAbfU{Hvp{j*>^)J=AEqBE`zo>c-NBBQ?W+~@x4cv;h!B`E zrEyb7>Hbf|USc`RG={jd!ve z6(e;kUSv4*f^!7DN^uco6D?-$drH@ZJ}iw&mCZIN%}gc?TY`-=##M@wLjaH zJlvq^%oFb_)WhcV#LD8ug)(~;Wz}Y9ub$OU*8Q+`c)y#)=)i2D>l-RICq^yQ=VIN+ zG5grk(@T){v_PHXs+}AG2e#FAj!@RrO(&SOStksW4V#SPt(8Oy+vKvqJ9PY zhPSS2`g|<0-gO!S3+L3f`l;L=5*LNf?qXI_E}F@;^3r4dS%t69Y*h)-?YQl4se9w2 z^V3Tz>GGnrd!*K1tvnMak{|iu(L9Ikrs**suC@H_SrEc{qa)>c^RAqjBCdcb#z}oS zV&Cp^hS_=>WoeuW^t3dcklMQas6fpdpG4OK%UNn152VWkh%MST!7Y5@rAIzoR~Bta zH(Fe$k?l00$V4*gcXh@4;KIu}_MDnF-Dl^0TKqlNNMrZ?Z;K7MB9y+Sm`$BuQg+?@ z<@dRa<}df(u4@Xfc;)>6a;AZt;i9C9_v%bX_x-!T^)b(5er?w3{r2U|p_BV~Ph0i< z{l7JjyZ>$4_ox4K7Ji(4=}Fs!Kw+7%4(mj7t64TazqT6hlW$>owa~U+kKs#epQ+*e z)0Zq%x4dZhRwq#$(qT2XTH!&vOUV=w)9Pu9s-~QASkIwhRc!cXdQFaEmZyVmdvANp z6L~>9x0VHLdp$B71N4~t13zgkZdcK^u9cm*!boY0$&0U!VqR_>;TowAZB(~BS-O7L z{JAGyZ92E5M{oMkhRsa*3=1!)sh64B7bj;PSx}=Aka7B1hs#evrE-T1&(7sO93of0 z>@i-KxPO_Iw3FmCxh%_FS0;06&Mmx=b4%Fa;&;YB4(m#MuBpD6A^e(a%Rl}n8jS9- z8oeeCH z`CF!T*~T{mdZt zzP-d=sfPDZbHSw&`T6_bek?!ydj6vGx&7<1pB2yA$1fnW?DwRfcNYDNPh6CL@bY7~HT7M;lJ{%RyE|p?zw0(XvY#2VTiE2x{8)SR6wA|^lQr>X^GiQR ze*Dt-_xZ~Do3G=ymoV;FoXsU)A7ogOTKR6?)3aZBE_QAE*7lU~vFIxvop-B_F8q+j z!S`*Z!F*vrhS0VzR{ZcxKhSP20LM?{s~XeC~ec`i!YpySBcjl-Uu zD-U$vpP%g){q5e8>+3V@xKru{Kbk#xxFhfO3Lg0b^W7(I?D_qfVSnF&zke!O{^m6= z&AHdDW4fAk=>i84AK_~!>dFNbeM5Xy0vHdjznpZqTSauWq&n-fD}mdRcFy@|qx1Zt zxZpmi$kbDhepk2cwYqbg<%e?G`M+N(4IHlgD0}$j-4pvqKlfgq{!8-TnWKN~UAI}Q zl>OfwFtsnx*zrbDi>>dKvlDVEzA)X6TdW%N`QY_sNfRnMf1OAZI%H_9v`Wk-()5L~ zlGeTE>1>gL@8(ZnJhpF9%I^uyidA>Gb#oRJA2PY|u$gs=`lPmwBU2`Pc+cCk@ycI) zTX_Tf@BeZ&y6vx}-#>bmo8|nRv=goqE^BfAu=-VHfB{@Pb})NHX~_sS@FR&R-8t*J^@MnBK~{{P_mw$;7Ye*SMN z%lWtL&HXKZXK$|m{4M|DKi!-AQ-5zy`ag-~R0@A4zvXSt`tOI$>W)9m`pcyGM=$>3 zl>JZt{rG%d`R`w&PpbAWU3t28BJB{J!o#Xs8rxOMQlwD^^q>bB|6E9@U% z+%CJA`+(}X(+#^7{vBbE=P`Ep^K-I>;)};Ce*Zs`@w4<;sJ&R6(#C|ocjr9|{kFS2 zdU5*qh3lp+XL{X}ZmOiaMZDFx{h~`W;JFEF{sywIrO-nk;dAoBdo}eF6YAD6TkV~_HDSMF zR`XvwWt$uM%y-`CrB?5f6xz1FdQa}9&z$E2w(qICe&B3}m}j&^h#vDb2H~2oN=Nt9 z{hFjy^t1Sl=##`(MKf=ln%KqtX!(9`pWt|T#i>^rRn&WaUD)*CV$sPNi!YCi!~|5?!8b6HbIb zI$_`tcf5EXr_)ZyYv;eR{>f}wy*?!+V~@v^^$s!W-{)=mlQ(lCbI!!IUb|#fu9pP; zVaqe{;8?bHWBx&2rvRn@CI`=-Skce8yNNmN7Vo0>Y&$o4p2%g)7Hz0u-LAJ|+h-M< zCr_988f?}56tZ{0+0>$Xk#`0UW7KD=Y<1if#=*DkpwoS>tt+b*=CsvFJ3nOGx|d7a z>`3D6uIJgtPpZQ^;`4UrSe70;6m~9mIfsAmgYXsSm1_Aaa@SYot_z&8+wE7H)$ydw z(`OxjY}#de;-$dKa=sWN`O2D*j(<{L56*eU%k@9_$<80aOZV0F9j?`GNk4UIPg3UW z1$L4J#vAKugP&MPTnj%aDp(_-@p;eJ__-Y+9&Q>u z*Bkub$LYV+MH`pDf!~-}j9m?jdR{#LSMD*Lxy3yH>-xWv_Mi6i>A6kY`)~Wo{|RgU z3*7w5@YVfKcFX=3H!tNbs_*zE?#btT?f8xva+d_2Cr-#&@$z8OuGJ5Y{SUm9Y00*n z!-~I^r6Tf`{fmRr%Wed!S06rDd!;*;hxzSWqk|G#3vWMMFVLH;BHyyn(?IRbW?d=q zIeYsnw*@k;{g`-PYOCw-2-Uwn4SHHJYX9Zb|7iGMyRP!_z~P?;U-!QLD!Ih&jj`~8 zpHEg@PoMq4cfuR(xcP#gnmG>{dl*js-81>Uu1ECp&xVs^UuAbbIb?Kf#x`fO%?`h0 zKmAJeQ0u<3{>{s0iVvfE9!f8*lU#paWo!AyOTFdFa&l8@&DzwJe(kt#aC8gfdi&## zPOCWYzyI7t{?uNF`N~JEmqqg)I_!0XZN4y z&LNra=~ky6a5YZv_~%%_oj23&@2ex`*Xs&4?v;Gq{{6nnzP8L7-9R5{w&|ZgI9*Fw z!w{)pRkZQ9JI}qMauK&p#r>+2J3Uy^_iMBKweS~AmwC(mWUcZ8 zqnLQ6z$TZ+Eua6cc|Oy1lS-eR<^_%@g+0n9yFyjHc9i|t$)LB&a1YbL!yQ+aoKL(I zbJNX9JXPz8I`^F3qLlLc;+%OmC!aQ`teI@resa_6l!MMH(|KO}a+vmEX~#4zS9STa zdy@|`eK1<@7AKc@`pMFF$1ldH{w+v*a`^egDG!+s>I9@=PEs1FL?gP-Q4e-zx65#Q+sMAaW5A9IEjV(XUwMrQBU)VddV$1E&rmvCoKDQ z;K`1{qs>!4{ju@>w42SU_|zmni*p-fr>;25a&&d&B*k>s8_&!hCjRdCXpeA}P>4U( zlqYyf$Y)+@9Mklf3wZ7;&Hd!D$FYWYLM?w)?MC0pzZSjS%d0mpH^@g;UHXw-{=sP} zC-NuC7FgzWrx@_<@}2N|uct}EesjhQ+Z#6-(p4WXxILNeP}oY%jjYLl)mJx zUPF#>=XduTrIWtKUb@S^V7Aeug2L!258EI7sk@YYc;7bP+e2=jHYG)M$0&y~lP>>S>9^+nax-udt_<&;F1!KYD@WzS}pJ z6wcj#ZSB!to9YwqYc4wblYic+qT3%VwuSHAcKqIE^W=g@=RXwp%=>FIZT;1~+e{~! z>(A;r{;THoNlj(dx~ImAKa(GU@OA4kIeBRQ*`?83sM=N8IA;&tIX{cGdR%tfa^KFBpN{$xZ~BsNE0mrVvUp=Qk0Ebj4adR1zDb2QvJZ#OVf+;P=im(s z_ar@mH*WTUf7rK2{5|g3eYN1=XP0+(R;-zMUm>tFlGCmB+=I^#jJibvcX~{;n0RXa zT6^|E&^K3U~879QCi#P6+o6mMnxT&hNMt{QM<&K-1IZD2rixhfv z@ZuY(jIf#fYi6dO&<^5%G`Dy0mG8T*Z|BHsYplJ`I@gh>`j2Rfe`{fH&h6eSdv4xh zJ*IT1vhN)j4v+bO6W6I>?Pgo7Y8a96tjl6!c zN%~9J3j2UPD<<9f!zlW9rCZVSe`~@Q+%S2{TQdD%?!5GPN#%+?>x!m6@NG!jF_~q0 z`Yhjq%|}-sF#TO1a9&_;>Z{|C?sFgbG3M`zU%0Ag^`RviX>04lB|WD}xE*@eF#A$Z zHII>_RqZ7qLH(%p-=`dr@rg@GRC7N#-^^;pM0R8ELu;#h?tgu;`}M)1<;)fh)>5y( zL@xGk2~>Uf_`FfZ%_Ng!#!}+bnB7krXo>83bw%CxzGd$Drgtg*9PVvAMtst}yzS-N z9r#MJj%_XNUTwAajNm)Lrbf-r3YICd6&LRvENE^oR*`d9y`cL;%#?k?&4ryW9%jB1 zJ-;Dvy+q7TmnmxLE)vd9G)(!A-QKt_GGd{tjJbh`NB*9OQISp3D(`;)`WB*8tLR<3Ds4Fw_|-xn{D-6@6ChI4|^7vf6e2 z_LXmywm!XKb<{9EyvI1#@$4kKUt8~fnKYm4>%q)#CSPYV zZ9ib-QPx?zZ4YC|Z=J?z+{=?|Pc2x!ZrRH7W?wS{=1X1>4%&0zD6_Kv_CPj^9cP=T zNwsnEPj^&Hstpk1zM}rL)=lNM<0j8Od&!7}jp2zrRaUMy_q_kfKYg>;5ogYl?X_Jm zRyK6M-6N0_ulqpNmE(7u&GmAPq86smY3kErr(SI=o6321^E1ZcpDqEFi;VbIc}&u4 zT&7c;Vmbf&IR`G5w3ep(G8t#57{4e?s_LEbmsN7IzZc(@vKuV-TpzHxi&(vTcVO1p z#c@JKp4PidcO0FsWVn+lN-^bC#eaq%bH7yw=KJq^S@-k(lVkH|Nh|-0Y`TA_zJ%rI zjN@&>afkmW*Uj2aM6Av^R~s`n|tq;sr?C`$b4D(jmZlm0j{6C7cL*MvGkfe z;kxF&|0$Orl&U2MFNN(Hy?K2W;(gt+w!s7g7~lO z*Pc5*D?MlR?^yi?ws$?Y>9e+XwB-wa_jNk>S}R)Q{XV;{qw@~E660O27kWeFk#NnE z*NWaHoA$Yz{O&4$wtKa+^|i{|>iJKfPC7pQ(W3b2@408r?aoYWI5XYz;oY4!hI@WV zS#R6_ba7zkt!nvym)x#?7w%qApZV_3VvVv{Z=>Hc?A_9K?Q>OHsc_6kBfU>k{|Ww$ zo~F`fGHb@4LCMU;axs-~NsdcSFAW z&A7nvPx{aI2GPq)^zHMMUj5JzkeATU-yk`Sst{%@Cra%9e+LC|!ut3wX2}WX{?a#cgPc^)+`sSxZ{GYz*=6Wtu3p6sOZP@Pk z-5|}eJnSQ%@jSLTrSq>Gzgew0cPS*}<)LX2ZRZ6fB{{aQS8ieC*sdCX=J(Mng{^6V z|9H|_7jb<5{BHf(`S#o`DSjq<+%6VFqxzG* zk6mZ|*vI(aV&3XM`#4 z>l=qscZ5IM82n|MJX8LZXH(U;^6G@% z*(netRk1MeWtHt8(SoJceCFC zy$d%#k}^rUHp{pnNk z_0J_a_L<*ZW4tCE5>ve_zOm!=@fR0sB6{y13}d=CX({_ku@jGlA|l&FE&J_#6QmC8 zo>?m2^Z%0DJzx7rsUDq^UL7>k4PZF1IU^;3;m#w8poZ6ctQV$VPIVAJDzhxVph!-5 ztD55R(3g=;X6|eO47JPSHQU~NHF$9Aerk~3I@PmB4L(%cOE9l5-^ZU^_Q9Z zXGyD+CRWSH|2%QlBvZlv(@vi@GyWPKr{BE|(f&_(9c&7;3&xdxGun<-PeHy{OLSmT3e3)t7?PJs+6ow{Z)0 zyGS2?$mMwJ^LMF>8(;1WXv=BiU#2f8Q`afrUtS~eqehw0O{%1x_ZC+^_u7WM-*HU$ zWR^1aKi&20r_-#QS4KN}TUh(oxo+BDXYkBZZBIL6sz~F$)EUeo?c7r$g&pqM9zOq5 zgZFvPPl>rTF5QI;H**CKDMYBwoBiNWINulETpsJ^2d|YETHWB@;QHsoh9@=i(w#+{ zEG3&yeoUVGrY+HpWpe);UV&Pj@OidsCmRw!8LqEEe@#($ z$}0J7x^WBLB0t5kwb`nFOz6Hh`w5rT6YeqD5qpk1rN3LQhx60^ zUF^)M#-9Hk{%QCd{q@Xoj@1YBw|(eOTzQ_CX}{;?i&m~1x)$W`e>R;x;4W zrt;C$^yfUniM;{RZKl`QuL&J}X1VDq&zciyNp+n^DtgT8PMaNvdrn7mC~u3gP` z*JqVryH%lzKQ^bx@7XxBKjTx~yc4JXSkF4L#4)?Nu&H>SV(l|d7tXkea}UqieC#=Y zCfBaXDHb{fW)fyje(&yF+T1p^ ziY8XUVn2Ktetl!{`*h6lyx&KM>dusj5xXiAv&FtIO>2x5(zf}hD9xwnGgH2e&EwLZ zt)(p*(W06gcD}e4wdBIi#naL+-77sinMMA^!$&6=GO8vs-+fm#_k)?EKdbS)SJ$f~ zXKrpXyim%i$NTU?px=R$w{0e_(?0OuMq#1ajpwNkq7tGQ@3x%IXOU#93!a*EI9KEH zv{`aIf9}0+dGyh=;Bt#rWaiz^%UGN2ervrD&sF{vJ8%E1NF{aQ1=0oD4}|VY6&}f7 zv~t3pdkTGV;mYyv%ake~KPcL(vgwpc#u?5^9qsRXcF(OBKDgVefw^Dvj%rt*@q*ja zW2IJa{!uh(_5ORh+t+V*Q+ggQ@qv+RUCRe;#R9$xbw*2-e^xhaz90Tr!}aBYKiiiL zLh@IS@BFfa{Ws&u3H*l@bh8)eKY6%!PfY3m+N^e_-JHLK=H==?NPPFFxS&$ve>mr# zgSOA#2d(?4c(J$mMCOCXkNDoVuz!!eaGk%vo-gS1g7$59y!*c#2%VMl!fr=Rb?=nZ z@86uCkZD}YdSUvckK9L#p1hD~c;9%geZqd$rpe0-CVzVndeU#F*QxfcKk9`o=B_`$ zf8gmyo18R&>fnzkK(qZQr>) z+lsZepImz9-7*v92?8D-Jrg7pS^AY{Ocb!`kuY4p=R=DF2j{(qjpB6-`U3Gsw!6%! z&b#&QBZta{l>3`qYNBhRYXl4b91Xw!+mIoJk!yRRMAz}(Z>OhMv&(i|TkvDi-`wN( zQm(CA>-g@&(1E-%fA=3zm$1Xd+y~0WkvhSD@y8qUH!ax@;ObBeRp5) zv9Pmh{q^)~^mg<0YuDb{RrmYWEl~{_xwkjOb}oPW_cGs;+t1UNbuUzCKjF9d|EI6{ z=i=nb-|e%=d_UJV{-w;jd$IA+mbQ8C-^kkSuC9GrvV3p;`hC%byydsg&nxu{n^!XL zt?a#6|ID3rxrhJVd?Lp(t4gC_&l0=r>v?Oo@b{hLKmYFDlRRtnx8lE>UbdCo{!(>! zOMTwjl6iJ--+Xyf{dd=-myho#I7xo}6=gN~^(FUN-vo|-H91-Om2>51t6Y!ez3cqc z=jL0tzddaHYHOi8>mr-An^p4azjH6PPk*~PxTF5FtO(z&<6-$+&)e_I$nCXg`E~B% z!<#2B{;Ny>-p;lsaP{ZEwHo%XW$f#NC&KmWaZ?&R&pyeEeboP8R-xGI17=jn{!w$$!8U2yj4 z>#j$QAGzXXx5vv^y;z~=fA0IYa>cmV_BRJFt_z&A{_J7#>fPz*6*q6(#`g31+`Z}N z&)@NV_oQZju~hw!*_-`-Klt)4|JwV1&vs9JU0%OA{mb)$_iH}yZEjw?J6-+x-1qyU zH_khD@5br%5&8M+Bhx=T`tU`sa^dpdZzrFN?-DMW@P9x5FYccU;>-E2PTqfudF>nd zt>yja&YyW9)oZb1cX3HgPJq#sty|yMeUwcJR8@#-Kb7~qwaIC#*Xr+>;^5e(q!utEm7XD+YUh_^yRz`YTnXgNIpzf{kyGk;M&xi0_0d*5GsUH5N)`JGQhW{&B;i09p}Yc?JfpIuYf zte@wUx&5+b-9@uy{WBT8Jl1%RhScah~GwZ^hFif9L=E^7G`+$-x{fi-s z@6fq@ACGI4OYi21`BP|-ixxw+Vi<2zwK(0+P^=mnUSZ;eD&^J9c)^>VXg#Ge-JtKa5s&b#UD)yvI% zZB{QHvsY}`IkduOA#?BnGVk3*6eLOmuH8ZxfE+>ci&v%dtGjv zNdVJoYuU-0-rCyMUu!&dZ((7(Ec=p2EEzo)mK6NGcXkzL)w06grO%>x*tTC;_Rugt znpa&eV7J!EJEl?}-mh?-`K0yz?=Q3NTbaMQ_sVqd*>{W7rhkmj?9V#z_UWvZ-{#r4 z@8qfCpZC_*_~)j=yGM^6ST@^ri-tvkEAp-N&t9$*TyG=AW6~}6ZL2@unT+?ZCO>*VNB-T7 z57!M8)4xZ$$6uYR@YF8fL|8KG%}jRn7js`a{yV}F6Qa5}!Yy*%9OZ?kPmV+e zN}IOUJ-bj}Qupb|i-zwRDc6rII@h`J`rZYZZ=bxGSsra^YqVp|`j)!)ZC7WXeZAyz znbywogrIfCJKukHW0rljZ{y>`=YBSRw6gxPASvWLM`PZc>P5@UGS-*Xm6knPFtz+b zZry7Q+grE!<07Z$B>m8{QZD{0vU%<{*-5Kv3o7<)zHe#H_~Z6AMrPGH3EM8ZJAV8l z5XvFka`&_HK&{+?Y6-+s5|zrnZyP{of7mR_xrI|GDpSa`IyJV|o{#zq=**ezUO3%_qet zE_$z+amObwtNm@hq0ptb9@XXL?|F3pFG>DkFs&r-s6i(4>5ZK7Z>Ma3JU3oe`bpk} z!{Lk5=Wd?7#qO%GFgK6lad)+oO}jq+dEPd8dP#h#R83V$o(=!&Z`<9gcdIeX=$REi zRyP|L@<^t+i;`dzKaXqS}b)n&)%bdOupRtS4esJn)t{QMP{!zUFf-(w764daq)$QHw&-! zt3Ow7Pus_Ibh(=GZ_~KcxRP@dN{kOY)2qK_mRNFqNrIWme5v%zcb|@3m7Ja{B*Mr0 zt|WuT>t<*w|KliH7m?xT3W3ZhyyX@H^m(Iz;k4wrv8}L<{=NnhXN*hNWzCV-q zPurpV+Y{X9X9hj{^M2m;kJ}xL%}#9XRa@vP^Ir1fT*rGV5&CCeJbNP|E}T8tSYq{= z-8ZE~dS>MlCIGoEkZmxE_uISUH zieoX=_btK?_nf@v!*$OnGf;Vg4rK=q* zJ^AHut&Ugd{CP5xzvON$v-0+sV*1-}E&I*COzJ()PN}&1pXZ;y_51b$qX4&)(jWAB zCaW47@CW{2+cMK#F0tWf(fgGfHC|7r!*65M@Ld}2&(lm5ELp^m%OdYNrum9>AKIT^i?$h@P~wMM5o zQqh;$(QM0;MSDVD_OHcf3G;sSSZbUJjGZAlS-YUIU-HPlXcM_JS*{1PGbgGChb_6W@xZ-xpbg!M7YQD#nC#~)* zun|(;EO}{8M!3jQKk2oLdR{GwxoI=8XEM90vdqoIH4mnink&o6a|X{=;kuH1>=A2T z#f=%iVm$UvlI||}R1`Yl7&FrWDZi7BaxSh(hol#UGaE5HI1w88Qlj*?BGdWDhN^Ej zJrc?5czQG`HSF-Ig{MRJPxCE2@#^}NgH2y9nC#Pu*>*%UrL}cc%+nU{UZ3esme*T; zOq<@j2^qyEDgC7v7Wd)Z6l-$U;NlUf1q>L3@f9-qeoU z+P`K;Q__j`rFT}vNF7~m6jk~1V*8bN_gCJEXIcBJvi3~<*w*xQm8wvEe8$B$QOOw> zKil2C_3}4wX}hiu?~Hv(9`oZg9an6NHfc>NbXxJr*y&02BbyLOuZ0Juc*t^vK8^8s z()M|7V|UAhpxQ9M%ILSQ#ixy9>#|qMi${4GZQ)$HQRe1~-ECi7g;r>=2Tt*EGZQiF z2vWbHwQ7Q%m{1_|nL)AzkaUoB|^EH26PR!m(zy zSZUO@Ii^h_Db7(LvvVFU*0d{h)sW!PoKdiyagoWBPJ?ABJziax^;1^7Jzsq(_tKL? zLSHmG=ZJbH?`i61tFGB1*JjGg?%B{sm0^;As8E`@z5 zamR`@TgpSLUWoiGx>4@PmiqDP7Mp4NCUU6jhXry!ytyz|uy*I8mctJA;sLMPlPcQ^ z{}=MeC~Um2L$>pcu!E`YX|ARGL3d(A;xrenQTS!VvR>4=bYIdNPZxnjJ#&9be%LAU z!E{^7@oQUN1SCa;3W)BNw{p`;l=@KlV8y}*uZ7k=64(>)bj5#z)~c;f+8Xp*-X%us zED%$g^=VGDaP~7Ek={(}$2wCQpB-LsQ}{)S#-#pWqt>P!?6Q)geN+EVYd&Q0%1^4X z#m;XcTSencMd9XE-)&Baws*KMRJ2&L@iy1r-*RWg6TLaq#V$s=gjw5jmkK%UnYH>$ zrAcvr)8f{{E@3k~7rXN67=FIaxb@4;U!T7_uTq*=p(5JTb>gVi+P1|C9%?#!ZlBZ% z3ZC@ti;NqU#Jo1Sil)_{I=uO)2bTb6QFfBR%n5g@7h0H_e)aw|%gZQq zR?#Box}2${Tf{>{suNaiT6AEkz$P)<_ic+VuRifP{ER}&;skZ(Vy9WX+{)|Ng{Ks5 z)l$>Y*VA>J@G2n5ZT!!4(POX#G^IrLO>aI|Uo~JVPM6PB;Znox`a|O>^?|7V$ojP&eM5B1e6S|yFnqo4g zL|c{iJ)dZ%s^pil;Elx5pf$y}{bEiYsfadJ(qFLVmfjKrW1T3Yx0~wImdU(wixaUh zG`tqr5p=`r{J-UwDla#%J<7{jS*+PwU|oB*)obyqyZTCFGANTO#B(QuEZhcWy&i1gxlw< zT-d&pS~ApKQ*RbOxkr6k!$Lz5@i_V0tCs~_)mOGv4*A-?vCu2v9LK2$mSshm7XO#8 zbmRWKdYOG^v%tj$jb*IA^12#(JA=1=*p~9;x+`a?cypf##~u%z{E)o0_wF}Ni@x&t z&#_qyvLf{Y?GEm$*&nYP%v!hRC2zm0rI=Cj!aJ^eBo8jE&_2}jORZiv!1%&S?hj^j zCzkwgfUg$ef=OJTBeszOkNb_4N;{9;`@@QnOi{T=DG{ z^TBKKk4|v)t$MJ6Lw>Q7EmLiX=+pdVPI4}JH~(LCZk)>UqT+?kFXt0~m3k+|)M_X% zw%D|=plyz6kzl<^j}xbhu+ZN(2mULt*elxwMk-{de7MeXWyg!|&tyBhM_u zCWn)4v(_%~Qfi))am3olZLNqoyOG;#4P1k2P1Xd@*yn$hdV@^7C)=JNK_=W?w2Qd75R)Zl+Y11vh?t+ZO`<XHD!;m^^9Lf;%}zMe_fZ8hzMEckt)1_Y5t6adV%uC_W!C)p5%Xf-YFB?dwqTkq|Mer8nG9R>c|!P8KQ7R6 znA%#JpE=cgM(u&Z0*{oe!CfwE1_@1=V~X7oL!0v{BQG zObFlmW?Ad)jkD@{b*6p2zo~n5&sn!+s~#NieYxks!LJ{)Z@g=(7IO%krQH|b_GzAj zCRc5l{>QEh)5R;KmG17Fuu7g|${dgK*aa_m_NX+T>bth!!gYSf*jL4Ybs~?Ff1i10 z5mm-@e4{(>ZlR#mp9d=6CP(&H#fWKy&tYY`s4BE7YvKMb=iE&-Io!1xM~;UrGe7LH zNn+R1Nf*{gi)4|{Hnwz>Ltv8rZ{=9E3$KOIX;qu+3(ue`t& zJ3lLSr?^e@!^?+Cn2KCe9F8`Mz3sSOx@^uF&zvo%yv|J!lu2z|^YzG_%glFG4_N(U zxF0u3aE|CKZ>75)DXS)|RoOqOuzCiQ>*VG00;brlX74}Jw{OCV)uFw0AEh^?Cs}KM z*s|zfq}P|*lkO;8=boo~Ec50=_QXFw7Cx7VHo54@ta`hCTXN?2OfSo4?hC74AKT_+ zafkCntH{Ndl1jcug}IyTkEOd-W^eRunXvW7`tV(I&#pReFLTlQl?DgKw@}!tG{##{PFjA)8cuT{P@58@qL)FB>LUA6WgY?0Aqj>y;c?F0He_BRRcr-h9sa(;s#^<%G@I zFQPH6wWcFCaz*(28E;uDRYacayIM?p)+D_A-8Zh5*fg#n#r{(ber;MGN-Y?sRn2a{ zI)h*RBg-DUou|A^X7F7tyb)YEt?gaXg_&n>tls!?m!n!MKX<;zlHUOvdY4&jYU|N= zwZC`XzuH7nzvYAKKQyPDyiT3$PKxdmCcnimpf=M@2;Hj?9oBBw}O)1b5&ym zbG*ER?}a_pdLMYM{&tk5QQ!%;(v7Tz58t)jaFVJGeSSSERy2|KP=% zh$VA_V#Kz-;LhxHj>`Bt;d8`Rk?N})pIq*3JRfeVuDEQ~lQm5*PoG}VBp}&&c8c@t zIFUX!C%w;?oUd>HT#O;0`Lgi&9W-QMZKH{->6B?>kr zMM*gwoFaXYA)mRa_vb&Kxj(mx__UrkY1BE9@wGMCQs=Ss$*Gejio35)S+VH3>q_0r zYX!WLBAJ|?PZQOU@3218Rq&@bL@;cs#fTP6P}AbJ@;L; znsYmUbw9($&anB%T~&5jA6zs?c=j^ewl#vY;?!0xTh+O1^M0kMMNJ!|K6bj4-CeX` zv6a-hVeGxzl}F-y7q^*-_e9Ade~ixOuiR(#*i zT;!D$DJz;|_~Uu!U5+Td&5s^j^*^R`IdS64DMx-Bd3V00L^PFchhF|hUCwQV2g3w% zUcFzgI{Dc$EDl&6nzL3|U=g zq&`pE@M?b7pDq8wnM!}vEX|H{-5IrK!lfho+9TGic~sJz=_kT2^xU^F|NP^|39H&X za$TP#NNyCd)t@q9s#?*kpO-9s&&@y15*?Z2)_*Qz?tWFN*Xt8l8FjrL#(Y%UaYeMq zX_Uu};!caA^OMIuUT1+B>y*FiPCpf4 z(9KuxktFMAPc@Z1Zmhrd0mD2C?Hx*L^G@tsG~v!P zg{pV1%NjoP2=twL(3Rud#~OP!wc@hoZ;^T3cE=yqxIMhN^R(*AiQh|NR?FXAox;xX zK8>rkInSXqHS*=_jh!{|4o~NH8n0-a@bY{$;}11fhS25J0b3Qrs~5%;tUk4E+FE(< z-Jv_H^q01$RqR&}*{l7Q%PI6t2B%+W&QhJf_xRIm6y!FmefXrfCt}ByIS)@Pp7(Z- z-e)6e=hsSGB_~dOSMTYv>%JiCwpHH~EsnkxzO?1uzE@MM7(^}A&j!?Kt*Wta3Fm+P zcH8@{1{NB7(v_@Ad*s`kaya(f*5tW#DeU{SiTfW}#>X<`3I^Q$X!hVymif+qU%J<8 zX?D~-(ycXEbX#$Cp@r+pwpL}Ujpt4!Ow7Jn>fUhAv*_Mi9pP%VFD}PSB`;V!dHmd{ zXXEpyl7YbjFAXmo4A@(&_rPe;Y{jqp#R4WPu2^%WTlefY>FCgW&*sdT-i!u9=c;mz zx`i`->{j~5vaLyDm)u;&z?E(u>%#sfU8p$MnH}eFGxFl^g`s~+J?)Pzare{M8dYOH z<${0fLGMXUJ>Kzm6W7-kJ1w!Q-O4aWdWUe+bXBYCu6mmnCPjIru`QFN^IH&GXV z^;eaHuVqrwCqwTNx4h8!bfs4lbMh8`^^{!^5ft0~C+vo9pp`}o%gb$Dii#TIlcp&c zP1Bw->$b^)qut($aoXBZES#GT2P&33ojDM8@XKqLT{>Z&ikF03e&7D7r5rxZm)3KpwwT0v?vmZ5&%vqnMJU$H)yMYe$}g%e%a3!Fn9UY_eR0b+je{4=F6K^m z&G_}SXzih-dplK6+ee$+O=;w9VLAGUUyVhs;)8|Nai=qPS;@X+|Trz6k#^79J<(586q1x^+L;*KP#d;ibN5S%RL``uXPN5drFwBw)616a)a*$5 z$X;2vD(dp4+Wd+%DTVFPm%hm49WwrL`j+m0=1?z3SDQ(4r>_cMGN0?i{B*lU@g?Wg zm77jIPGfm0FniaX*K*TyEQ;>w|2%4@``ex;Q`6dO=CmVe{CCY3H!Zk)?BL7eh3-4V zO8+oE;5XWmp?Qk$O0r^ds7>koo~C)#;ZIDs--PMCzIMM*=u*D;MzBydO3gpcdq@~iuj6+uRmVQ_Fpk$(HhaH@E8kWc>3$}7s!Nn)uip(VnT%EVRPy)NrZ z3$oDt|61|aM%U~kRWtnUB?LKZr8edCuU@$3%CgdrmXn$`&ud%Pt)yz?J=fv4--gzo zDGxrZ`Sa#G|EYIc4N0~fx+__OE+mE(` za3tkGUFwo2EobFU3fZYQZOwKK6X<-pc}r^C*$JihBE&kgX9PT7=6-*X!=u}a1aEJg zVchZOPwEvHzUTGN^SUp!CVaFM{w2P9@*TCBvf8WDCcOC&Q&gw?V~s(}C5=|26W!|~ zB|{EbIa@x7+3wxb8TwZ#wYU zP@&PwUT5KI^NlJ$PbIV#=Dg%F3T(c#WBtm#e&Oo5ALJ&nN2)69@3nPoV!d^pXU(U`{hU&@=jE1=ZBGlGu1?|6 z3hr2tNIg+6?JF%WiJTQmM)b#XtZKUz|;jt`_43ZaJV>C zZMyuQhxziNI^X@m9>1HK_UQ4kwSHv#=ppuHujEu&qv-A!?m#isu#lh|@|-u%FWWJ# z>A4QGqsBe!immVFl|I((Zufrj{qVWwA18A@NtZlaetp}E8)*i@7kPs^xBBn?{Cr!- z6162SuS9x^$*N&vU*l)^tDEJX~%*2RIY7=%@n27iJ z#JMTz%LN}@vV4Zn|L1MB+1lu!?zx_*-E~ekDs*k@Fc|zFn(l%MnC#jlOj$Jy;^;@jq zjUJcHS;tvIJjs$z>Q=I;>|0P2S)%cAe_aY|k=oO@EiG|tTg6%0>mtrPikK3}P`Dtr zdPa2Khi%56%5+jEPkvTqwfyp9>8cy|gSLu1+N*ahxv)ki>GES~tC^cDycTVo?wq@c zea_aHFSU)~93T6tChnNsKj+LT?k3-r;h#6Zdzk6rxPN-%E2C)hJ*z4No?cgzJ@5SM zSjt61^~QVOWJUi^;$6Av=fSuPdFO{pX^)I~{yvh}8nE$Yjf8hlwoS3-1pU?tFK=h) z+PEJL+o<@#n%<+b&&YQ762Oerer3a_q`?)_Jin zX7jvk7PvQ|qOC2!N}x*b&%deK=lHF4Gf&O4ZdqVv$ss~@W`U0;{twN&G0{OZiKEt(U){$4ZjijwgB zI!R93=A&&VPll*B2#ow`(qDZMyzxTKT+%uBJ~+_RKJj2;a5zbm134 z*Er29PuF>I#oe7TOI&`M;GW5vHw+rT@V(D)ichZItorKsuXwhXIm_Seapm8$v77O3 z#oM}-tQ={_qb7%Ot#WEyd;fBMr;yC^Rl84^be!aKmsx8NE&FR;!sW;HF5J_nXe%Y{ zUbpaYY&l=t`C22Tzvo(%cIkI4NjUo7u_=pB`O?pqa+7!bsEO6l6)Q?DOw`NCblYtolS3mZ$pCz`yCkM?xdaAxy$9RKn>p)uj@ zzE!Rtv;QXU{_fhIvh~44`=&LPCgI#7OLRnhx;@N}Tvj=y^fxJbqCsydo1Max70*qU z)}6Y0>Rp%p%7hJgTO+iI@+5>^^qN#U9>)Br@Pj_IeNH*l{ zHWyze`fFi8?EkHqd)BVVHaOGyc;j<+?!JAFKjq3Bd?%msXjyBW|CMF&zy2~U=1K9V z|L+S4Oj)qhUiRgzfY6d_7BAMH5Nc3Z81#L85o4ip)uPC9hZI*mVa3p@Kd#1kb9YW_ zT~%rLo70@jtZqe2RLYyfMsnhhwKzonH zs{+!Z!S@lgH^1RG<>wkYe<=FQnCruR>>shQ3s23?)y!d3Z$-c5<-hE{(-Z>-iU6P*XQEwJ%Q2R9R4?6_9cI*@TLpib~u4 zGdhn39b@V0`?4l@o#XyxR`+H3 zYt(=KCmO8o&KkXQ9zWF9U3sQ;g1YmGT@OCaobA9rag9#sE`#O&Kc~AcDfEnKymjWe z+UJ^_XErk$k3BQbt}Em#Ir&HIY<@~z_=~^aU&`IqopoRSvhB9{=KEQ*wtJnoSE~@* zTJQ2+@ZF@JYcKxg`J1-lzVoa03b8Zq`(M~zsP*}Nr~cOB?%(TY-JdTc&-|t4(w}2- zyT89Q_kPRGAogDUi;Ysv#h%`#_UPSj4!+BGjrN`{}vn>Ttk zD?iIVaw_ZQEB*<4mUrgM_0Rb_dqsUh=E+I>QW@^9I^4O-&e7_S4Uh1fN$ke&FYbSJ zQ15c}mPVtOpLX3nbFQeo)@a_ni#wCD#XZ93-kRzu7TNUjjnnTnmn8Tv?LMDj({5v% zw!<<%MrqgisF~Kcj~f13x^tfK^&dHRUWXg)cfGW~qeA*aLCn_NkT(8@{fkco{7<-6 zW>o*rqUlO{LguWmHC}g5#TSZmmQViR`t9D&CZ31#-Us;)#+%nop2xqk>9_r_U$%0& z&fV;5?rqL}YWqv+P`G++kM6$v#(S;DOA{`}Fa@j_j0k(`layMdFN z%f&tFi#>n!b~N!nJd>bts5yCg;X~O|##2Q~jxC-ioY*=?Fzp~4mzYoE2}y-dNsj;5 z^ISRj;^2D8g+Gh``#TFB`SU2(ZdbsmGf~rW7$R3sG+BRWze(>;{fL+DDbhKwbBfQD zIhuSaUGney+1QhlraJOGJY8Jz{x3^)H## zS}*_5-tgb#gY}<&_%r_3d}yEgXL-~AkdN}uwmTi3`%z$%)Q7$A>p#{V`ByD?e*at9 ztQWUmch~&9ctOGfwYSY?y9yS0B7{)aU#DWyvD-wQ>PR#7@;!oLc-Q zuStnv`f5GKJewcP%o`s*js13BzQj72r}qDHr)#g-%(&-}iRF4yUI=4k+MOl_7nR*%8e`s6nvtN++wyoDo zaSn5%Jq&uiy*4p2eZ^&y8ogc#9dJD~Q*q91m;5)a+0UM9El}P4lHuFy*=DBs~C^E9)hJE>#;+Sx(Qa*HNrF?cA6eO-`zZ}H;PmpeF)&)>Dd(EHNQ%U|5Z zy-PYSRrzEV+^Q2USRb`LByH_O)sOAD&mU@2;%w@r zluM+SJhO2=ZeRRBOC*vrN1S`7`877lk1eSscU>4Zn68rIO|_R?AbfAOR<*rje$>)9 zbK^4hy*_Fk3wK>|4!j#9TYTGd(OW6WRVN#A-=>Q;_%OX*v+k{qC-2W4d7G_syZ>B? zyZB5<(!#5BLczMpHkWQG#A>s!-%jYwX}xvDCf(Fkt*2c2$~P{ZX!W+-)$<~KC(evj ztK0c@($g!MoZ4pF=PKBgHpMTs@8N@D<<^>FfJFWHQ&2Wa?#!g2Qw;amLEJ&bw`$~=kXEedB3jN z-g56K+pmA^@H)YBMh9nj9QaWAf;D;Syy+QlmU*{-QuZI@XdYaNVW5np3` z;H%Se>&q<6>CvwIVWKe&`V|JtG!-4HcDhM5d*6JWvY53gR4pR%lKr}?#eYlN5-fM_ zIHK-f+xTUP*T2T+hc}!26Fj+L&IQF|!V~{4?)j~o%MjD9CuDb~`0fvD8_NqR*^S2* zyy<-}+jKoW_l9axMDq*tj(}N<+#-#s8*We>ZFXeeLp@ z;j8=2?}BG$)I8z1c>Ztx<%n;B_nKtu-=6=WtZn&RSv&53^p*Yg7wa3o?CSre{Ll1I z{HKzaVi)Zl{(7slGiE2pwDVC-EP;p(2s|?XJ~P*5&V&=jDYsW@p^k z?w1>AAC_5j%;ELN=_mHNbK0Mpd^~$j#e)nxkJ|SYwZB&K-##Oe@oLAbuRFbe9P{`V zy8gVt&4UsTU#ibPS?hN4+q0!>r9TT!lI^>$bh0(I$L_8B664P%`zqt!{1v)q z4vq;`t?ne`%KKpFc=ls95wXT*c~B=kv-# zl9eBnH$7L}q~3NuyPtItw@pR<(hbo{O2zrY8Tx$5j~ez?OI@x#{_f@(Ct89A{ZM6rF4eyI0(zuNIZ{q_yS-t3TW41KJB;C0b4j zJ0W#f-o3c@Si7-;yq&vG8$Zi_mo3j;nDaYqwcoBZjd`v6*XDOU52ikFom6{svgLV! z-@5Phm`_*j7ky>#adG*J%Eykc`jfvHzls;ke`Un+XYx|J<}1&|zW$tb>k|)$NBQ)Q zbBXKUzMm}qVCv#ZsrQ2YZS5|vdAstaujpMT^_r{ey#2SoGk&~Pmxz3%{%KG7E^Iqnn>^U#GUdnl# z_j;gYd&&Ck!81*#Jtp>9vuyUW_bKW~t=L+#UJnpZ}XFh*M=6uYd$2_?Vch)Ud`^fho%~bVJy!yP4 z_uh7J{ytY-m)epu$$O6A$4PA5KV!ZmOwGvo@KY$`F8kZ94-fWKA4u6>c(Ylwx@?~E zPu=Eo6N*gK-lRwLpSqIP^XID0$qAd~bBen^Z20GH(iWlnLOJ?WdioMOPW zYjWT3yUJ1d~7O*_k1%6}>qzjB=MrtzgRc86~vD!-NAu$}zH z*L(N)g546A3JRmAJXC-1rtVJm;caEpZ`H7@D>8fc@s#!Ad&|xE-|VoqKUTD6!oEH3 z$@TJc-p}{R{H%BJ-FC;hdY2^DU9|1@Zha!tcx+l+ZNxU-OU~Eq-vuwUd+;?;^6Nz2 z^b8xLCH&r3rl+4uy>vAC!0z@t5@xo0>)U@Vc#|g>_oi6bWOBK6!os=TFBo7M+jw^pI3+ zS|NC7^^*^7YYQL!zcbS>rIn?T&7N=Ff|@sbceCqN&TdH6`o81qyx&V=PRqS3Kd74P zo7H{l3RB#&Cu>{%9G7`Iyq{d;d(dd=#gg3YreC`pPV-&$wcWYo+w~JCKW*FF^IXGF zFh=!`&C|rEJEt%$W}6lBrCEFH#>FSUzxcg3e4T%6%maDlJ2r2h8yTrv)%eB z{J-r~%e2WK{m)O&jM@2MHD{cCVEajSt8%|9+z*60W~_)-XrJwNcXsa#?hVNgu9a76 z%lJP!u$Z?c%t!8y#*+iSR}L&rZ~0}%w*Ae4S_{vY%GQrm-We4X-Qvxj!So{aQ2)}W znirYe)o=5kdQ+A3q^?!koLrXVde9lbpwtFLW~8 z&bYFGd;Caja~29+JJh6_(0{I zKR*h;UFlc!{GZJ_hq_EAlXbC7+gs=4rnWrzD0EV^$((K0kv`#=c|PYFXA8tJ>g{hg zwDv9uTOqG5#@l4gxaVulOfLO(7lbCCkE);T>E1WPB`L3Y_R5|rA45Sa?MtWl*ITYH z58Wl>6Q`VbtnJ`@UaJ`s*^S+qax2c<`}kt_51K5@mTh0aBB<%AgUJkG0?ezB(``}H-q(rYu+ z?>MtC8$YZwI>h#2*6!wqOl`(;d^1chn3k;5yzh4)L(tZydhZ)e<34Sxkad4jPA~`_ zV~}*e+x#(ZQ9j?aOx|Ox%}Tw}>q|eav3552@H6(p-rs9p*qnZ}ulvgK7bm$g)>!U+ z*c<$3j<)sTFV?=F9A+l*R`ZoSJ8i@8P~*}K{>wi$#BI*I^Et)(#lckpDB~RhRPb+dVJC+VOGFvTZiTQeInR6=R>DG6+9*Z|SxgyCuutYMNebt9FL2S~(bv7qi9$zf#a5m_!CHH7@iy)&(`ru(Y+YNK zJ8`{d0jJx%_WC-fxNzb6ed> z7u>>i!{^J&hI!^$LGyQCNuTt~r*R(dqpzBLZ8qI*k_is8S=TD?2+6I>>rwr+Kc%|#mn zu({8ZAv-1bS>U6JUW>o1nUnlI<+jLKupDxJMUTJ*_h@ao*yvbeS_TOr$7DLSa$lo`@LKwa3Rxebz>V(0c+Vjc`C0ouPbeM7fmR-HmqQb{bdeYCiUN~KB{j2r2B=idN z-t2|%l`5Z?F)3xN>)%xSXO}q_oAkZiy&W|klZ4Y*e#YtttnA;s-fr9Ui^sDc@U<5& zs+e4`Uv$oOPK))$cNF5krX3L9#WnA>2y<-BeUVAKc^`cJxJ1&w|8uLYi{;lc?Sp-u z_d-rer|#tXn7whEdE!UWp0g?{cip*8x_np{K5t`e^JZGu=pL< zlle1m@0Vp&-+nJD`p@Oq${OL&oqX%!W{AA;@<0Fk+mRE8swY%@PXF@Vciz60ojDEH zRN6I}HkKt{+V-pKSMI;F{VsnNw5R@8Ipja#j(yn|*AMa!?HxZnR}bV@yHj&sFka=+ z#oe*hypJwx91H&coH5n&iS0So_>v1+wh_4kFZay-VO9B8<>id5eH)k5PvJ<7s)$|o z_oCM3*9S~nOJ=GhewJzRzwln5#_sSrp0$_XM|sKB8MaA2P+eQE61iCN%MFcV^=9?| znY;h<=j;rFxo_MeWs^oHJB`n7PXrrpo8 zL0_lqW-ahG*>m~(+>rXfmf&nY`M=SNeqOPgw;=P&p5sD7g@V%gpKLTW;-sY(RI(ah zVVJ9@&yde!!G9us*3K`V#h2a`egDD#oUmqn#1fBH!okP>YKgwAo8*~U{BVm-=I8a> zYqj!&`)VK3UiFjrr! z)n3(nqGyMi^ozFa;OeDzCGLy6@5jqj?Y4QJrOF6G!%Jh};xz*@tGT;5c z?fS}xu3s6_ziy9bRA=6^X_?AizIR#-vJQoD`swr4w(w2v8t&k#>|}cq z8d+kbvxJrNd-(R!l;D(aS)$U46H{!CKe#40_hGp3sSy00~M z*N;5cD(p~e*njWQgHMO*v|Im|o=Vn##ux5%(czxe z#2(K8wZ`(>uhjVd@2=i+yZVH8#HExeN3M!UFg#eP8+4yNub2H}GV5NBU%eZ3Ufk+C z{CQdWcEi+J%4c?LvhtmgmT{$fL41m~y1`z)nwY)2T$H<3D;jhD_>;-mc3!(ozVY^n zqd}$1BkxZCyQBWz>+|Z4lm8ZT?pwzBUSaEQ)u8ep_u21S_h)PTlq-^4@NM>zt>qp5 zQ+#`GE#7zbQpeZJ9*NaG`88roJU{7AsL`9)c9!Y=_3L%c55kUA+~ztzP3y{fj$Quy z9)5kip8u1i;I=>0+RGJ}+J7oP{Q7)#?R1Z_y}v$Iwg(3kCZP;2OqA#_+iW8_Qv<-K?x}iH>jPceS5G6>WzW-1@mQ|cc>7=2mlshAe_yjEPfIzp`olz1o4-yv)oR~F zG&Wl@{M^I2|GBZ;oMKU-l211kk1;OUuFA1DzPDl?^Yfjb7TkZHbfc1gTb=L4gY(); zAGIq_+*~{C$zps zuP@oSU$Xw^30=;YKQ`oj)Y3jRDg3eIx1Jx(rN2!2S1;^lFSSQq!#EC;n3>vqoY zUmxzN?`@k9>ap&G@ciV61$Hr^r<&*edS?1j@KUsV*wlnn+lW6`_hjbZ*N%jbVAVtm@rKmYZ_TE91Lj{Khr3UVjvTw0~0zAorcD%+b0VO<~l>o%NE z*i^IsvU}3AyEB|!uC3~5`08BVtW(_{54TfUrcmEjSYD$=q?SFm#z&!3s!-&MulYM;GTWDC=-#3}Z6h8%wa zRgSh;>&%)qNu}hUOL6(xGRZq73*2Vi{GgLDFTp>a;rAg~!~J(p&(pt@A;0(`%cRp9 zYc99ve^FKsopj#%$l=!>|4ZjDy=cOvSL(fZsne$;BK^+6OJ677`eV+!YxX(o7c(Yo zJ@MYRF>iUP=Ssih+L~#9to-k&UA8(oqyOY*zB;|s59#a$R^`^L#!LQ{Zm5)MUs%cX z<%*}+mn}TZ`@_sV+FW`FOZzQ)z>ZQhXqn}#@>NW25 z{xtf-5aV_3q5*f+oj<}CCNVExB{TD9v-zJ+wvx;9g?0YfwAJhNZI7&Di&BeVyW8`N z^@WKB(?5^vMh~Of^d0{TcdK4#eRtmR{Hu>&TI@x_+6yEniJ$oReIfgMqZe0R80W7M zcUWHaXC}A8-LJpnCw|zOguS&dYr|Jx4O*@0ts9-2{d(Hc8`Dy~yQW+8tvxF3_vy-CmAyZ{ zPKr}GE$5uW&g5y($av_$^nRYxJkAP?YAI|^O~%3}d>Rrtc{mLoGPfOIkU#uq=Ffc} znpXywzM8Yk`)>99*VkWdyZC$GyXt)1<$iOmqUWxP{yuTDx;}^ECMS{laGtJ5NqdWG zmzsr(u4GJ>fUuNFEzX$9BXT;Blj98`DeP^jx?M|&vQ?E|d z=JsCnJLK!nQ;+@}+Pcv;S^atV{MB7DTXyT%eLvH!eO-L@@pSF!`r*^Rg+EX4_us$e z{^YWaRXfev=;dwKD|M=SPWeTq@~^tTaQeKdPofx$mc-Y1iabkUZ}e%s`tx~;|8v*pXAb>2 zb;)UO++16AMsKZk*IqBG*=be3GAw?j-pQ)-9s=Uw*QD;+&VcH7@p?d|lzvsF~4r{~jHDtiNx|{|g_*vxT13avYdb8Az!?hA@ubA6TfrsCjL z_adFoFthV9@UAlI?CN(DS1$PxHI+}!N}%a|V)OfuH!FPF%gp;c-1*v0 zTzz=qnAo(iC3cZ!qWmo(HXeE*Kx_9-}pEF+{AMZQG_4~Qj`Ql3llim9qqH_OT zc@>npbQ{B?_N5w6Pt3h+l$w^f&`#U;!pCO!<^8gDHNPJ=>)ZaGq|tPC#@aO@N8IOE zetdN4Q1R8Dzh7}1pZ7fb?@iqa>pF)?iYAX2Xg{8y{dj}+;|}d)uUnUOZpclv(zunj z`n0k4R@WC(N@7nv*c38-fy@)JX{(C@^mH{2Ywy}7-ugnU(zjsZ+Hmd7i%h~}SH`Rh zpElj~$Umnt4CYAzIYzcZ}vX!wbX2X(A>FK`kOaTUHZJC zV)DH&o4hW6pBv(4pB|=FWH9aZ)YGdj8;5?Fwq!|1(~?a^^_z^tQzrg7%4IQaQ9-I> zmACQvlM7eJ%v-%8+BU(JIWi?Z+xwF6tmwI-KO;3~6!{bvl{{5Q7wvho>B}CMWopve zr|Kua+PG%c)QHCKOOJcq71z^Sb1hwU+1r4eOEyy%@Ww9k-M&y>#Gy1i=;_zDZ(i9f zeYNlP?O$EX4<5Z$Bl>#f?KQvV$M4&;rK&KpB$oNxoGH`RSy^)5iGId%aiQXwE8)|x zGU&#yys}zIFQ!CV_Sd}K%pEh9`@LzdoaVPoMSRiHcefovUQM3Doma z304W}a-ZzvzS;S8mPxEVdGu7xR=dgzpG!`BF1hi!^5S>M^$fovAM`e!^<&Vi=7iF-I!ktS7NdHV(DaT^Sp-H%2sfYvoFh)lwd_mo0dcpZ)k4Ky(XsZe~8?V15=h)H*cL< z#QNe=x@ye2*lB#NA-|4_YOeKSd&+S}`)1SXC7%yfFOgvYbZyg2Xalt_|NQkO(WX0hSZ&w1HBD^E$sOzD zZymIrWgN-MnOe4Wo064^`D?xv$NfAfiry`s8@qn5_>vO|{r!{D&Ufn7D7-2$DizqK z*jJ^auNO0!$v|KI>?ZS)ew}8y16)hG@8s}$iRzuIEGvDv>%{?So!k0f54fJR+;q{? z^0#~8YeU;7OV*`+C|J{SF!H5p$n+%#uGz3!PYctF?$15Vy-9Vgu516-gdew0To2m1 zsB)8;y6z_~+w$mSMy;)Std;wAS*c$=$D_8z^WJ2Y1MF+(Z&JT*6DfJ=ekXdEZVrnqS!TMeMna67sbzCPyOMUvPQ@AB&%)Y`tW(vOV@c;2BvKZ z+RtUMYWh+E@At{6m8JWP!i8^ouNK%bY2WiC*_x@ZjY|unPEA)>SL#~z<9fer0`2C)=MM7xeQP!77I{j`g483{! z^^ZI2X4X_DhQ3li{4ZQQYx5daTq z1mlx4H!tEBRuFJ)(YUT1WLDakx6fTo?~G@$+Fe1*JJ++ci+1dOmSybCy}%=VOYhrN z`Z3e~WU0pNeEt7uLDPZ6bNo{ZeOQ;Ro2H;rS8JBCFX%ewi;O{ITH?k zVKz!xUT4HJOEmJaXEwiu@==FPn+!i&Uew<7`IO|o9lK2Qmrq?(;b~Q^zhd{*pF3Mu z7pT8(vaVjcOR4D6^SOKZTqf8kZvJ#yG;@CX(#^|rY(=K{SFUtesyks_|3=GSWo#RS zk3QAjx~ha}seG-V%>E`Ln@<}T9ErT=@pHtNE>|B|B0`TMtQQ7E)u zeCqR(<;j^_&Gv8DRr9TjYf8Dk_EWRp94?$s=9b*hTYD~k-Ie={n`asE%wwtd6SMQ_LJ#@$L&tHqaaHeFZyZ@cWBmEv2at8ZJZ8T98h?_OK5y>-DJ(Mx3kI~jM} z_TO2#%i76e`NMVM@3i9ngxsy(YZ72uRB+wZbeqsQ%~jSeKN5E@J65^lbRh4-#4emSzj?RNom7qRsnTt`Q?tZZK3l1{$0W3L_eyuIT$Xq1s$OeVXzD)+T)l3k zndbtzmMuo50Tql(_GIt`i*L(PGYQ~gd8)XIu}0yz21lyEyEcwfxr%GdU0Wm;Zt-ji z|HPLuKTYNG_UwD_p0Aj0d3Kv)nuKD^j(64`9$Ztx7A(B$wpLdtEVHSmr9iH2i_O>V z9;MrZ?ixKjE}~zx(u|>8;dfGxL?7#O&Ll?1O!XJ*T>eTZR_x9Yna0`NzVhzmEBzv0 z%h?ZFb7#I~ntCzv>gV4XTl^|qov+%aa4y;@tu%-6z)cxP&&i)o2<;K+3{dYC>wjmax)p!WJH7n7d^>*Y>8pnB z&R_V^)_L*&g92TfRlZ-~Sk|c*Gkxbuw$j#e7Jq?rb3?xCw!G{QjGe|XZTsJr%(<8T z*)IJ%SxoUTk5;br)ZgY;ZUtY7Qh&N{^1FL(<*utfs$8w;DoS7JF8M03ZN>+~RU7-W z_B>naHtorY<=y86RqcIEYh+GmuJq85jjOAS`DeX+fsgZDrmsd%mxi{zd#9lBcuE=L z0*!N)TmheE{qMPA=V!Xk$#QD7&tsc)7j0)Rlj>qiU&-cu%FsJaMWpp*;bO;gLHg%6 z896PKzHV}%v|M<~?G?R}Ud_jgU7KQ-2!<>;H+j!pUsJxo-sB^RG0M(c>e*j*Sg(91 z63CoU;Fs}h=EO9O%;}|JA=M2E+l8NS9XKr%78}yM)>hd4rRme2#`6i8J8pN*_Bx`< zwO=m(evwJun&aFoPvx5CES5TdVTSgJRlL^(o3FUtT>W!%i)QkI1vb7Px?D~Qo(eVF zIo)FSgQYKR4=LZRy?1S%$_dt{J-tQS1@wIG+7$Agejxc?W6Bm2sm}8PbC0jsUn``~ zyP*3*YVzVMCzOx$X);xXZICi_n7Px9v&O!`|75*?%7Z@MlvzL4dwfaWdzvrP-qU|p z#xFBVGocrm9@W}~I??;tH-0o+6}aV?Z|MiQzwbNO96MiP?^+Y3=5%MZp{zPixc-U0OsP#Ko~JxG^kk)`D@eWR`6}cT8I-x^%lFF< zM4ecsO%|9L;mZ^_KCMTq`Dqv^sO+w>(%mhaap;LJ%4bv zW|O%iN9)$pQk`cz^NUtj*?F1VU_PQJ@$%Z+RVPm|zDk%iMbP|++OGD1*GnHhGrMAN z&uPtc7n>pBOToOyz#B zoc{Na&)r`f>GKMvl=3Ru%J?2z(2}`*?j@@S>s)G{W`8&HYCd>b_8EJJBr<1N3QDN2`0v(-$_6mU1b zUu5FSk!n{fs33M(?(&7!DQ?cDmg_d!pU>2EN}eH=9?qPk9Q0AbYPoKS?Loaqt3TWQ z3|P#6xR&uX+r<;Xrf!SR-;Q5;No~t2`Rit0=f7t<)y=!{e9wnRmpm66EHG_8$hs=_ zL8sxh0}t)`FP|vnnXzhP%gr?=Qy*L9E#wyOoPY9kfXIG_6|pCR^4z|MUppHhoh4`L zlq+L&#kB0!jg;2EDqClB?F|0J_NV9|-<;~InF|kP>NA8U>#&GRxY<6=UOe&L_eYa1 zGW4k2zBlRPFNQrzCt0Jnsd)(SG9)IZ3f%I#YoEgscK%bh-c+-vs+`vIHM1)O4pfTG z5&4+XwnffgDnfZhkSGvHllEk7HxPBdq>kg^6SJs`M z|7J~+eA0M$W}2q&1kvrQt(WeNROD|7 z2>SYhanS{iz>Fzwp%+WkKhD~`l~1>M*;czlahiW4S81>4l|3STYP-bePi{B4clImr zXWOQ{DC%_Sb^asclB;}ng7CZrHwqv9-Xdr!eCw;jO|LnRxuvx_Z@Dc#^_iP4YiXYD{n2*8Ai|$8@%w?GUJFO=pISSgo&2 zcCtQx?bb(whelq%*7qNaxw_Y(v_JU%w^tuczb!t0d)E54UAse*^|Li(FXk6q{G0lx zFYsONk-1&URx92$Y=0NIs!;rCpP>AdmW}z5YeRWN67=5IeG&L3b0qx3yJh<}hV%%^ ze+h^>ml5c@U&is>*Go_19!;0i-6||m`ADJZQ0nyQ-NsG2lXt%Uc&S0T@op4<<({v< zImM^VE1Pt1tx1oj{-ZP7z6UwmnA$IHKfcC8gSDQUk@eD<33C_cK`qxdLty?0UHn=N_U+i&?! zRI2vzVF}}}X9>MjO zTcZ3bc(|>Vmha&ZJU&Y_&g9=NZrQpI%Z@dtblsEgT*u#afm<%^Oz1;V?uLo?nMyYV z8!KKn&3&UXr+!M?$1P^E`xs8P@X5ZIdDuVT;qSez!6r7hSAH6w@QOGGgIm>WAn<$-Nv?A>T7NkR?K{`bjymF$JtMo^$TWMI<0l~ zVM#l)=P0un-_~W74$|!B-KNcDNu97@kJsBxL2uP7+FL$GiF8_Ot$R>w{j!67rOa(3 zxd73lCo8RWJsyeP*UtZ};P{VgsjPrpYTu(Xja?e_(n)LLJCyR;~G$~R?|1exe`pQ({G+h=UBeDl2Ju^VW|G-fcROa%$zSeYIR!{1c*9{Seb{FAbF5u=e7oT04hdah4Nyb9koCxXCql z;qLZ5&6nP_)|i+6s@#;NRbszTbe`hxXpQo?4Q@s|x$ep7_O8mWDDP9AwdZciRJNJo zT-&(%l-L%gtU1nEt=N0r?q;H3$#uWKPfzl{zMQ<^xvZmxnUiYNODJ-PfZnx77p6*o<&uE_?n%uw=xVE^-xO$q+3hph@ zE|(X~HF0MDy4I;&X2O%ZMVWV5mrQ77WS5?j__Jl%g_ga`Gq|Uo4v1}StZM!vfMaYs# z75A?1Ieq)sUX^8DfA2p!YwKD2c<#aU3>|Tf{g)MY&R5)8*Ou|$d&;+lX*QMLPft1a zdrQcllI7EvyaUIzx=Lz#2ojqVusr@;cGwq z97+yeaJ~3b@X;LkrA2c?`j*G{Pl&Yfe>zXe?@ZwC{Oi9CB&@&nW6K90hEU6U)hDYL z)$^SyJg|PU+x+6n^ktVU*QiI@Z42!6uljw_Ipp!v)YQdwZ3@pl?L_|m(wJUq_HM4B z#FG_wjYGaqZ!wgOb(ti$-k^3;QU77C{A1j!JQmz=*f-t7NYz^LN>s`0ea1}7vNX=F z@AxaY>bCNQV2jht=hu`sJSY{|W7L^ve=ylRf6k4hqZ;ovR|=`k%lnpfw@yk>|8O$_JGD3WU3brFX-i+>c=+x08RhLfuCpa=>a#0fB^>ju3vA9tX9!?_#0uIB%AOpnw(mnfYuojcO}W6+el zDwj)`PM$3OmcAlSdSN!Zd$W_xlU(P-(i66MM&E5ilKBrxtMcu>`iVb)&GeDX)g7~s zr0O$PcuYRhqINUZVV!a2oZrnZNA@lWl`}G0yGk-Wea^S&839MwIXvTIrJD=Srlrk2 zml5a?UOjuy%x{iTPs#;u$}f5M`PBCH?y+ea=YD?k`S9w5>=A`Mo!bvL&o|{-zS85= zZ435~J3r<*C&?a5;Q!Jn@bR@8Uvh8=pJTIG^CstnwJ!`x-&!{Ztk3)ub8SJ|#@|NnH zHd!dReVh4*q?~DOg%K5EJvEoVT6gT6Qnlmg?H&1gAx+1)r#124IIRKD!@XO7s4vs*UYce7dd zV5Mo|*6G3~&9j!oD?Ezv5Eh=~yDjG1;eIF=OI-^<#teHs4~!&hd09Q|x<<@sMy zzLdS1IO{{-#RorMaV2qgbiBA8B5$-d@@>)GE!*=PH+QA~-gD@IqwbAm#}>ET5A;os z`#j&F{fk84CLh~Jw(40%tL_Pfzy4h=9Q?dvl1yXBZ~l9a-X7m#aG5>yhvBIkZmseQ z7-Ktpf{zuLf6Tl&d-b!D#VY4q=RR}noj(2ht8*1*j=x`>I~Z$kcxT=OvjWAl4q++} zzw^486dubIcHbcNo;mgFhS2`oEw%w~ls{Ix{t?rO_UrS0x>E1By1aqgI~~dTY~Akd zFF(Eh^eXn2p03{G9ZMG8GkElrn=f^9*2AyIBAt5uMFm`L6dwx9T-6rGouagA_jh5D z>izx#az4-2irdxXOa538F!@%`M&1YEDR|p#-Al7oQ>!+o zT=>w&xkl>Mt*d^E-Q*SAl(OsfTqXa6Ef(s%|0OJVlc}4~1}}^G-=_s1+S1+9x$sN0 zis9O~%dG7VKS;hOmD{4X?^5E7hvv>J4w@Q;JQiDZFi^X%V&m)M^A5>*eZCqXwbEs$ zjC@t^yLG~Uf8?6gRsVc@#3bj(yX8_c7gN;#S2k^$d*qAes*jIV=Daz{)7g1Iit)U3 ze{k%*s55oHw+HLrJo-*~&dtY?>gOu09d~+|e!JwM9b+`BxT5p&l;3hm?s0Ci%3;rL zoZ#o~zoC6mRxPGtr=oZ1%||sY7K{3CCG1-9R)}lAy>eedW{CHZJzfuIZ~J4v=qiKb zvkx~uyF6!H^;=fX=c_EcR)y%4*oB8#o}Sly8@Imi!S?SJk%i`=zppoib|2^1e9leL ztm$w3Ne0ecyB*5k^E*y|tp8`1oW5aU`2Pd9^Yj;5J9y2%Uj0u$@?5=ATIjMr;jG+~ zkFWTA<TazUc@ zxx#LdLc{rLCLS!+og%Jnr)nDv{)TP3!OA=H`cd22`9Ct2T+f^^bB?Rl@%)E1hqP_A zz6Ty^eS5L`(6a<_nn`r?fJAi%f{u$#`EW+i`!Nl zvs`##DuR{SX+M&>J@r=&(ZY9kJ;)gk8!@T+b_6fy47T5Rx3B=^ShrI zrdjIR-qrM+ni)9xx?<(qsn+5>S3Uf)$g=Y7p`z%Gdqt+P*UT4i zaORc&a5DMl=TEZ^f0{6F>UCX^2@gJ-R#wVRIY0MPm0z6qr&$MUG|Y9@_j4=!-g3lu zJNJiMYd#%X)V%O@M`(U`sNAdNIu?sP@`L40@t%He^hkfrC(YG!6OZt}_{f)FHTB)v z{{qwUCtu&P{@;QMDC_4%J~>{q(h{%!t| zk7i##uiCGmfBBJK_c7P*FoS0YqLWWpADBJ&Mj7XOe}#L>5$WQWzDu6b*P7vUQAxMu zP^r{yOV1sz_w5rtz9HpmW8Kq&8pi3&7JlkF`^-v>J^Xh}6P0b5v^H@`WhBR&<@=rq z^b4Da@o4-0y>75AA&T#~VslOIt7Xikyzzc3za103Ym%qB+CMi!eBJk?`9>$K&nvB| zTN+;aQzY(mhqwGC{(0wr6udZI*7$C3SJ-U-RqzmKT$PHm!V^ z8o2FNO+k@{b)-(bLq-0hSsnrRzqxNaNonSS`AZ}eZk-w&SZ*qjo(zctxbI!^5PYm;yPqXpy- ze}3ztKJ78zo@t%wrS~-Dd+eq#EB|Jm7Slh8@9Lkz{h{J7uC-QtOO#!>#PhXf$fD*nJPx4K&&EnS~3=P2KOPSztk zc>8&++xitENjIaG=InKWm)cHO%t;QHUe{K3hLrde@HEk@^guP{eWpVKz! zvgYOO3sYNP{sPVXRuOJiz6GjpUp>8L z60W#VGSg*&*ILQ%(Sf^qOj}kSyz8-0XIIs+r+4)d3J-8*1=Pf(^#+8o%~Ab0chjf# z-s_(~PElhQky+G~`Oz`*!{Sq}N1Zs2m-1}XOVIz6F|kTVukE9(pv;`+lc(jlk1fcW zU}*f^sV1az+tnZZuUibgIHp|CNEHwj_e!uR|M5&Sa!$9;jyF~DJhQh32u$|M=r~}d z!Sv3FPm{4}ns}4Uk2r6Q#0_~H)5IMn3YOgP>eT$)8S*2(sOEEr{*t8^>hC|3K3IFg zNBNLT{hS|`oU06*&-}K3d!k440gLSA-DYp@n$1bS^=Om$^V`Z6)B6|H_?&O5Kl`X! z`%z@TN`b4X%3Gz~lYXlmDxYt#@oPa%s&&@8^c z{Nexd$#%!~tT@E@@O@@f?vk}}`_JcdM$Hh|VD4}`Gsr_&L&$Z>eZiiZCl~k32rzk4 zZt`mLmwk+9e53v}`A8|aI~ndsydUq;xg*DM8(Tzvzi5C_3Tykr4Wbi`Q)CZx+>}#Q zY4mi>P>K-g75QIjc%yfr&gL+N{XMOW7LRUkc&fO^t~cU-($%wy#$S|-dy;;I^?2@U zx^{KSTqk$_lF1hrDs$8a)fm0_P#bi2&eujm#j?#QOsCf}pIC2gz+|rUCFm%lc*JLR z>vNWuvXl;6mOLqOi8y|8m-DQ~6XnYr8s;~OuS%R7TYY2c#Ir(%299DAPe#<9Ex?2qRj z{rL8%Lf-WfuVVb2n-6~66JD}HK!3%OV6~U6Q*r}x9IvsdmOPUWUAWRq(W7<2I!UAc zD^hM+Gc(@`F1aQqaxGIlG3m#LxT`fbv1k6+MDBcX@3p<7({$mg{arVw3trpaaqfWL zqOJV3Uo@6S8!c%2>v-1j`LCy64a&+Srfz9|JK5x5vSg6d30d8FHU^d^Q{6(`1;S^X zwSRc%d}ByL&W@QAE~%OXM#i5O*jaD1Csl4nxH6mR3~?hTMG;<=(#TnI1}w}r0!<5# zsv2@Bbws`R&}vY*{OKhLMx)t+w^;MbZm1`G|0X56Z!L2LkNoBUgB)9h3jWLUG^TOB zOcidi%w>4}KCk7zsg_tbJLtVwRj4>yruCw)E&&$T^432P*L``h zzd&m9Jr~m+xd(oX)&{u;eHXoO{?PFDQdPk=g%>uPG~UEk?wV?4y{_N%AonLG!CQ?z zv%}9B%S?M9bJOz6+U<`rq*_^bR&5RM_}^CBY^0`^%(VXPi3#;Rna(fnAAaAzLC#|8 zT~Zu{~r6k?+eboJ7)CY$-E=gdzVl6Zu?j2 z+eedSjqTrDzqmixtDU@hzs7ogj&G0lWjvkz+<3@}+B}+b_@VJ^8@`t4KNpTLY-?<} zuympd&kyE<8$F_f^WE8v!`4nO4Rd^Pvdqy(S^sc8*YodZ`+|j@e`R00B%F8Nw5`6v zKBx7}Crixn-lM<9?UM`lRtDSZ3G>`UXRhsAu8lQ}00Y%8(;}MV^i~B){hkuk*O>Rx zesO_?w&O!Zl_PVV*01^N7m|4SkYR~+ojKQBMxC0N7e{}(w7&NX3RrOXtxm>0rp6}q zMOIUHB#24sw)$FgGu4+UuiKu?Dlko6uypNIyS_zH{+%tJ7k)`;_3sYQT^KxJn?#U!p-HqUf=PJFz73|o+oOvK>OmuhUt6PaWrx52;6r(;Qe}SnWX{# zy?<4GVm3$HJXPXo*^no!b1Hl-XZSA1{(0F}RD!neZe@O+T9^<5>Z(_FcO3fuZS~!|6T^_uBOjwi}*)vBl>8t(niH zk|jOe73OW0UYPOtF{}PR3+cQJodruSPF>w;X(ur;Lv6|>k*&g}cO>k$uh$HErug=o z#;p5FTOMD0xwtetId@%J+Dd4q#>}i>RM|T1L_(VG)X&)~ z_t^dAs=mbz!>~}5()$aiU(_y-4}P7MptJaN?a{sej=5dfdF<8$odc_W@A8rH zo%?IUy4gbUqV}1xaf`M^?~(JHAT55J|Ej9_x}O(ZXIprz&HA@HIVxGHpZ2OG1Cz>CcrK=J%sx@*q0T1W=vHYQ`fuR^TP4W4}*P+Kj!Lj%>BP6 zvf%NWtROQXvDF>RZZbZacblcYisjs!=I@8ktxGjspexhsYjGxD?^@+zl|$i;lV5CS zP)(MQjN$tHcdp@;{O3wdU-|4>HS>(V?p9AQ+oxy8>3w~flioy&{Qm0qS8u*n`nKz? zQ2dM16+hh0=gQ}*34F}h!Bp^S;iRQ&wyk$PDss55B7%8O<1&-wDx#U^-g^8x?wrJ@ zSLOcZY_eXd(C2F$*WPuW$X>VJy47wv_oea&*OsZrh|Zbq_`P-F|If1m*0<F-0<9*-ulG=a2qf+h9|%ocY8j^}7>hRrj}**O{D}nJ{UR zCGX@y;nltp*CL-Eak%qc`cZo6xnoBc9!~DAR}|bW8U012YDuzp@FrWeFOqx(x4i1N zsacrr7JC#U9(WMFF*6xX(G-<+iW;d#*N4Yak0daAN`>%9C= zZUILllcSxE-(X&=d(mWF;i@#&dL8k&lW$#D&5IZR$LpK(?C$Ke7j~OA_SM%x8ugm>ldee*m~b?%B*7ESDVE4G2OZ2v3C0MmojaJiFW#vk8~ETcz&bMbMc&+ zg_Sw6Pjt@6Z9Sl7YCLV5TZ@#{&q?*FOIuY zXdAK$tjlBVaI|^4z{=D|_v}Q^1oE(FOL&^Iev9_n!2|Svz^O%jN%{luszUTHQJ>6jY zknfDU@Vf&wS0+6c>pT6o@KNS5*9T3v53g&Q$@XG#JqUa0rB z)9!A7>edezt0(-^z9+;f=X~DxPG6qON=>`Wr&*zr<_nrzTl-~fpD0z|l7ICuH)S7V zsmwklmlF&1Zhm;^f3Mm6ke%?2{);@*rSo2Hc(>jC^$W2%YFq6@Je2Qk=%{muJAb6b zVqe2$*>sb|hIKh}Se0kxmHgZ6W>jr_ui^E9#>tN# z>f!mx?$>#@oLZU@y({fUVBxHWLnj_@6}P{7O*>)V?1uEUJr&0-?#<@?8m@efrzdcA zcJvWXy%lOUQ9S)z$GB4c1FUoXPG)bNW7QX$)2XPlsKIi@zJKg->`YG#UV3r=-I)6M z;IXnP+qRqOJc+C{SN+A zV-egm=Z(RgV=1O7Sx+B4auah+I{#V!anY>gt*ef{p3rzUPB}ZFV0rPE9v>Oe?}E=y zcTW6~%5M{Sq;6}paL@MmeG1+8e@MnSZ4vIcc-k=OiH(s>0n?3k^E{{QiYv7@u9tg0 zF-uzXw!--Ow$Bsw@80n#IksNIutdua<8_t(NR9=|-S>zwVr%obDp7o#;}O6+5=s2Mg#D+|v0?)p)^(e+}J^B*N9m)>0} zi(lPd8Wq(R81=2iUBQ@_EAYwnWU2Cm8l~xb8|7H)d6eD0D3$f9iYxL6+Y894)k(W8 zYYTBGX|dVW^JCYK(yhU-^pDgVO_g!H*z$YtnVYXFpWNQ$+GgWsQ?^3?(yO;2-`&_x z2X$V1aqUF1=A|QVJoic!RMh7>%iQy*E76Oyi2wc8Tc{)F^XnMl+c{sq3+Jod^QkFT z*%cr1XE*Q6CRP4-mVcNQA20r4mazVpfyJD_#iix@wU*XS+3nP{{h)30hUvU9xwypXocBE5-|UG2h#Kc}5S5-QSO;AFFOGw~uoW`$gp(rY8%0hA8QJ4@F*>5Y7R`=seJQh3g0hl z%N535_B_m67C*VYm_6|4?wZA7^6I@3i_VIuS1G^w=-pP)ay?^y!nWOs|86|DW^?^f z@mQ|1-o50=GC@T?+eemFg&#_q_Wt;J?d6;uM<(nIlol)g%(i}#uaQjCyV!5pOYfB} z+QA=rZcp5;UcXbEj5_7c_E~TLeu~I&Q89Suo%U((#mDbz8V^Z6%TZizlB+%E2T$9Z z|G#{fdxhda?h_88k;v*!`!>weFb+fAYk&rhGeS;2b$PJ6R* z%dvvYi@WkquJg*@{c$m;{oCfLg-!Dh>h>MjoG*A!(_wXgLScYLp7>w!N9RmC?k3$y zns@i^tUC8i8A@?EGvoL(?&j*5eaPQm^lARt0)d5ZT%Kwa7)?0V8+`o9-^P@+M>`Vi zPD)Ccd;MN}+(zW<@9o|9FIY;;rhF}&Zhhk4rXxR|Wj2@#UpKt?e7kyxq@b3?mbU7P zkH7LJethuH;LXwJW`6D}UzSYXy|r+gmTH}glUe;$w!-ohue>+bq|(pVlogoqPXKu^fAJM(^{tZ!gXYNl@PW z{Hr~a&dR)i?)LjCH{x6cXGtzHEmCCkzA^u6HCy8(@3kA^I%?-HY|uI!m?#FD%tJ7zu!~LyTo3whR1zh(7g*S$+bLJv?sD@F|xbv`#bfJ zw$Bl_f@l2OUQNho+bQ&NkI$yZZ`$F1u2BI;?vlp`uae$T5zPVU?>k)!_0q=rLl z0vj_loSyJ}ZC#i1q9WI$NJo78wb-sVLNar9GE4sd@hhVs&M^N^&Y=XG>(yq7&!hZu zOZn2d%R5z~J+towe(*dP{AuI)s*jCz{!5dLq^HlfNG^3guhT2y`JXHK4_9Kb7kk|v zqstu?>wD!NoxI#%mK$WEd{1{n_F+MG7VG2ZEVH-f?%KSMdBsH5f1ky^?PV9u)R*zK zSk9)LWhD03E?U{=@|jP*>!WNg3Lh%$JYUCXS3POz<_W%S*_%0{&Aus%3jQluv-pO_ zRoQGSnS!I2?DH2fNN?77Y{&H=SZJekzwrK>%dbS9n=erP=e=6DXIoc^_VOmatB>!0 z{;&G6{bBXL-)qa+7iPHq@&73LG4v<<>{lO-SJ&6>T77YH)a=ip)`86jyW4iFXl>_Q zdr)cr%U$!1<({^xJEWSl><-UYq3e;~1%5=$xyrHWNYx78lc`4zE?Rq;;~Y<&@?v9! zdGVt0!3!U+@A#kBHGS<5BN4CFO!cbW7xZ27+I4sOYOY*9|KY7^I~U9TnAz5}=iM}+ zJ^pKMuPL6beYmp1v+2RE!;g9NA7o!OPyb-O_*`W~vhih8saa}k`;C)#&wu>q_^CSQ zP4CTBjQ{I@ZC@kvq3_?VCpk}wO0>_X8Z2AWv+PaSM#sYA9EO}ZTt8-nSaw|K{l7GC z!rEPloflszzI!uy$A-4zwA#a4oK7drS<5ZH);;OSo21JRDvUq!&eFKTecAdkk4yLo zp&uDSz3*$HQ*B$U{rVO=2hLwQcW0e?__@qn{TnNPUz+y$@JwD#;le7-9q#rk3WYfI+;)CQet6Pk_m$Y4Md;YM;~Sf zY~1zj!zOvTW4B_@=F40)3XC{??lMPT6!Vo>y%oxVHByRIh0oWv&iCBHnQD0RV*gy_Kg{3X(LSa0{Fb+rX5c!nUM?SDccEi% zqDoGNa+D^;-t86I*!I2XSdi+Tpd~X)>h@`_Ec{Tsu{+(#fBI8#v8LO*=IFmV63S(2 z>tx|`UMi4d(w#=91JafKKZ;{>lgn7Q%o90yvbR~psmFYc!=$XY`y4y%e<_XU%_FIV-6q1tbpmBO zIL!Z5MK1pIHg?LU1^?SaKIk7xKg({GS0DN(^T)BbJ|1)4>t9{o@Mz-6Hx0Ams z>dBPua24CXl!0H;`(IJT`}vboAGZ};zH$7kM@@0<6^$g}8O@4++n(5W?dLI9QSFWo zUgSQf?qEpc{pms*iZ*?1WGuP;>%$uXjjS6My{jJ{Tk}Ib?e0U~_33jCYd(E9b<_8b z_4y}KR!n)(t?0R5XVGIr#lA(!_jwBzRJ$M2@5;|%@Qv6wZBCTshWWkzjHdUwOw;?m z9r5j$H6@eTzWvdJ(CeCpPd+c3^G5#f^OVHn7SnWuZpia;{#9fDo$R-7M#dGTKBc>| zU)t_ZDfpsodG{=vO#6fCcBNLSmG`BDejG@=zU-pM$tCs1dw6!A>lBm@G3V`*etYei z(<39tWuD(uA8_pKpBQl8%2#>m++B-jd`Mooy(M{VxRj8obUI_tueokrhuMxUP!gQh z+Zm$a`|?N7o!1u^CtBJ5+!^%WN9due+dXC;$;_7?|JVNL`C%M<;N#!PU(?Hy=LR>% zp4#y6HUH83GY*|gnD*?KX;g5&+vVF~TNWG;DK}X8dGa5NzOQy4^k-H-Em%Bh?Zj`B z9+@#3yK7fBz0d#m$Zg$~Eo*1jY|(M}uqpm)zSQ61&E4jmg~lI`6}czWUD@R(HS>lk z(^Yv*w%}Qlmz6NY+nrSFR<_7l-uNoymh3~*w@Z&csO!3Sto*8t-0b&TIyrMnFCXLl zC0TVZy}F{vEb%~z#>d$k4UOBsT0S*T>Me*`%X!Er-RVX6Jf$>??6Qm3z1Jzl?7Xn~ z?Ba5RoZN?wWwz6FRPXxKDyJx%oc`CvKr=vT@(+n~8{F+C8fW`XW($2`@XgzwbN{24 za{_OkF1`F}k8-2%e>stMrMmV__I^&%bK_H-lC1Uoa=wIY+V_I@@Q2*ZDyOn)BMro# zEcy0e;@ZVKa8Xq_|fiTE^!;KBpv6T7B5o2`Jw!Y?#qob4;`0&+|~K*Zp9gAK1+>``F<-8%e-}2 zSSD{WPtj)P`gPV8d`p&H>D#5EuzfZEW%oHu5`SEJoa@Ce2BZ{RUC{8{Or$VUXildY z<2~<9OaHu^z!oigy=2Xb9H*7{TRP4CuU2kWsR~a@FuDBb^P~L4$5S;YZ2k7esj+8^ zS^a9UDR%1rw(CvGId#8dNaPhE?_RU+rS6uZ{){&Vw zk^8qAd;eqYdxc-tKdo~u`aHc?$K<$A-2?@N`izz(l@ogEyb>k(^&Hv-EzdpUzSW#{ zf8V^CvWqkJ2mbh$mXy5i$n3IP+tU7~=TEB({=F(nQ##eU%y~*~_w%atJF-;IW>}WR zT5xMGW_>EK=-%n8YU`aXs&6ZQ(KIqpe(!G)eS7wWKDlaTzUROE?@F_azo=*LD+oOM z;;YyLop+b?PQNyI_vE(r7i;Sct8P7y488ERe1+AVI+YK0Z6yZ}-#^}QcjDBPg1>8P zZ(fZ$@!i}x>6z?~1w8(mDgSsTvBhP#zTPHqiAVXR+r~Rvwi@qu{hLyt*uD1R@|Ehf zHA^2JpOF9g*xJZe9g*pUtSei3G(OB)Xso|{A*8jSnC)V7xyR>@XA6?nOezqicnWyY?O#U}fCUna)rPq^o|#GBtrH2KGz!iy)>dUl%UJLku$NAl^O zu66J>K@cep< zT)sx;xyvscx%jlj@_EG5uP22xJQmKGXw4#XrT1+)*Kf}2??q=d2Z{ZyzM|s!eZQ{U z&l`*ehLabTK6E?#Q}f{#_dA9!KI|8{wczQ7B2Wcmp{QqvH#cV!-wt^-k8Pq zD{$d`O9oD@Ib%{@^)9qoGDY`WRP<__Qui2n`4KIQ|`H|9SJi{%uMv9 zB@VK^VYc*fmXv?Zp%X5UV`p?@gXQsKH#aOa6`3=cx4GU>Eg>`3{6g>bvMJTfJEpKK zkUS$*cOiTFg~k^)OlC%RGa1YF>|3+3fpK?6p+L>XlI0ip<|iIp!@r_FwKDkZi!(Df zUVaq2$$GoeNB4>LXBYmTD|q)KW6nuVxwbnB`tOg4r?Z^8T$bp>y}{7=y_COlvCE^W z3G$VbDknYDx?uU<<;O*48TXT0p4Fmcre8|E!ioqS#?@0q~d+(UCT zm-0^P&E_jC=?J^9Hhz9XLzvcij~45~8)qM#5_pv@{O-N;wmXgC&QHvQ{(e2MUN9`L z=WTb`{>wY=vHfL>PhWlE49lZi-OOpfa*b2{T;?&zpZsU|K7!%La>2PKQVRuh?ybnG z=ufv^6fQP#^MkLpOc_x&of^vopWbzPom#NC=R1eYWyJ`UmZzLkT$;iYh4#*2YT4be z?d&nOoLdVn)QJn6+c7h3X4ct1w}qm_1b!!HI557}bvmB=dqSDp(ag#6|NiOr94~BP z6tdFUve)GCh5Uo3ILdnFxjjC6{88rCYVJqdc#oHIUo+0@_$W1RlNeWNf?IW6wZQtf z9M8j^%;vGX{dF7X+pbwv4bLNWraN2sC;#M`rvKyA{P3q0U-{SF7YaJQM{IgniMSU3 zFXQgi%@Jn(squnMFOuTcdPhF}9AVeJK6zMZ4Kk|(wPBA_^B-hKX z;qeEdT`wfHWpDiri(%7$U@`abm+K#Y7M}SZ>V5d|=fxcF!=G$rzRkRAUu;|>zg^SQ zZxI#DfA6>bsONwCBDtIKsobHmxW%#af-|O-{%xP2Cx7hE;Vp+9AOB^z^wX@SPV6)9 z-2RA~%oq9ck1N*i`KI~r(o6qjYxRxwX`0^@E)_C8v~T@!xBIErj5_vdw_8gpg-*|P m*pWJ`J@ZddhUM`I>-<-IayscP^}og7c=W0J|JmI-c_IOcCELOP literal 18553 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 literal 17059 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 GP6q(Iaib;x literal 14893 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 WI^F&2E$_4SWd3;npOG_H;64D@B6k-6 delta 15770 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 From 54fd2e03b45410a23243f3191f6e3b8c77889256 Mon Sep 17 00:00:00 2001 From: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com> Date: Tue, 20 Oct 2020 15:57:48 -0700 Subject: [PATCH 44/44] resolve conflicts --- core/assets/bundles/bundle.properties | 44 +----------- .../mindustry/world/blocks/defense/Wall.java | 6 +- core/src/mindustry/world/meta/BlockStat.java | 71 ------------------- core/src/mindustry/world/meta/Stat.java | 3 + 4 files changed, 9 insertions(+), 115 deletions(-) delete mode 100644 core/src/mindustry/world/meta/BlockStat.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 02632100bb..3e88aef2e1 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -583,47 +583,6 @@ error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.memorycapacity = Memory Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -blocks.basedeflectchance = Base Deflect Chance -blocks.lightningchance = Lightning Chance -blocks.lightningdamage = Lightning Damage stat.input = Input stat.output = Output @@ -669,6 +628,9 @@ stat.ammo = Ammo stat.shieldhealth = Shield Health stat.cooldowntime = Cooldown Time stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage stat.flammability = Flammability stat.radioactivity = Radioactivity stat.heatcapacity = HeatCapacity diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index bc99d814cc..a23a2583cd 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -43,10 +43,10 @@ public class Wall extends Block{ public void setStats(){ super.setStats(); - if(chanceDeflect > 0f) stats.add(BlockStat.baseDeflectChance, chanceDeflect, StatUnit.none); + if(chanceDeflect > 0f) stats.add(Stat.baseDeflectChance, chanceDeflect, StatUnit.none); if(lightningChance > 0f){ - stats.add(BlockStat.lightningChance, lightningChance * 100f, StatUnit.percent); - stats.add(BlockStat.lightningDamage, lightningDamage, StatUnit.none); + stats.add(Stat.lightningChance, lightningChance * 100f, StatUnit.percent); + stats.add(Stat.lightningDamage, lightningDamage, StatUnit.none); } } diff --git a/core/src/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java deleted file mode 100644 index 5b3e71b14f..0000000000 --- a/core/src/mindustry/world/meta/BlockStat.java +++ /dev/null @@ -1,71 +0,0 @@ -package mindustry.world.meta; - -import arc.*; - -import java.util.*; - -/** Describes one type of stat for a block. */ -public enum BlockStat{ - health(StatCategory.general), - size(StatCategory.general), - displaySize(StatCategory.general), - buildTime(StatCategory.general), - buildCost(StatCategory.general), - memoryCapacity(StatCategory.general), - baseDeflectChance(StatCategory.general), - lightningChance(StatCategory.general), - lightningDamage(StatCategory.general), - - itemCapacity(StatCategory.items), - itemsMoved(StatCategory.items), - launchTime(StatCategory.items), - maxConsecutive(StatCategory.items), - - liquidCapacity(StatCategory.liquids), - - powerCapacity(StatCategory.power), - powerUse(StatCategory.power), - powerDamage(StatCategory.power), - powerRange(StatCategory.power), - powerConnections(StatCategory.power), - basePowerGeneration(StatCategory.power), - - tiles(StatCategory.crafting), - input(StatCategory.crafting), - output(StatCategory.crafting), - productionTime(StatCategory.crafting), - drillTier(StatCategory.crafting), - drillSpeed(StatCategory.crafting), - maxUnits(StatCategory.crafting), - linkRange(StatCategory.crafting), - instructions(StatCategory.crafting), - - speedIncrease(StatCategory.shooting), - repairTime(StatCategory.shooting), - range(StatCategory.shooting), - shootRange(StatCategory.shooting), - inaccuracy(StatCategory.shooting), - shots(StatCategory.shooting), - reload(StatCategory.shooting), - powerShot(StatCategory.shooting), - targetsAir(StatCategory.shooting), - targetsGround(StatCategory.shooting), - damage(StatCategory.shooting), - ammo(StatCategory.shooting), - shieldHealth(StatCategory.shooting), - cooldownTime(StatCategory.shooting), - - booster(StatCategory.optional), - boostEffect(StatCategory.optional), - affinities(StatCategory.optional); - - public final StatCategory category; - - BlockStat(StatCategory category){ - this.category = category; - } - - public String localized(){ - return Core.bundle.get("blocks." + name().toLowerCase(Locale.ROOT)); - } -} diff --git a/core/src/mindustry/world/meta/Stat.java b/core/src/mindustry/world/meta/Stat.java index bb872f98c4..94e4c17b2c 100644 --- a/core/src/mindustry/world/meta/Stat.java +++ b/core/src/mindustry/world/meta/Stat.java @@ -22,6 +22,9 @@ public enum Stat{ buildSpeed, mineSpeed, mineTier, + baseDeflectChance, + lightningChance, + lightningDamage, itemCapacity(StatCat.items), itemsMoved(StatCat.items),