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 1/9] 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 2/9] 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 3/9] 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 4/9] 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 5/9] 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 6/9] 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 7/9] 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 8/9] 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 9/9] 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;