From 65aae06f013d0821964b96ae8d02b4de6b6e19d1 Mon Sep 17 00:00:00 2001 From: PolarStar <107398572+PoIarStar@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:32:11 +0300 Subject: [PATCH 01/26] FH host replacement (#10443) --- servers_v7.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 8da07d012808..553bb165150b 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -284,7 +284,15 @@ "frost-heaven.ru", "frost-heaven.ru:6568", "91.200.150.116", - "frost-heaven.ru:6570" + "frost-heaven.ru:6570", + "mindustry.frost-heaven.ru:6567", + "mindustry.frost-heaven.ru:6568", + "mindustry.frost-heaven.ru:6569", + "mindustry.frost-heaven.ru:6570", + "mindustry.frost-heaven.ru:6571", + "mindustry.frost-heaven.ru:6597", + "mindustry.frost-heaven.ru:6598", + "mindustry.frost-heaven.ru:6599" ] }, { From 6c31853c11a8de962028b96d8f347f3e8101d5e9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 21:30:38 -0500 Subject: [PATCH 02/26] WIP Interplanetary Accelerator animation --- .../sprites/effects/select-arrow-small.png | Bin 0 -> 193 bytes core/assets/bundles/bundle.properties | 4 +- core/assets/shaders/blockbuild.frag | 8 +- core/src/mindustry/content/Fx.java | 6 + core/src/mindustry/core/Control.java | 4 +- core/src/mindustry/core/Logic.java | 4 +- core/src/mindustry/core/Renderer.java | 47 ++- .../mindustry/ui/dialogs/PlanetDialog.java | 2 +- .../world/blocks/LaunchAnimator.java | 19 +- .../world/blocks/campaign/Accelerator.java | 343 ++++++++++++------ .../world/blocks/storage/CoreBlock.java | 24 +- 11 files changed, 290 insertions(+), 171 deletions(-) create mode 100644 core/assets-raw/sprites/effects/select-arrow-small.png diff --git a/core/assets-raw/sprites/effects/select-arrow-small.png b/core/assets-raw/sprites/effects/select-arrow-small.png new file mode 100644 index 0000000000000000000000000000000000000000..6d021c0ddb05e0a1e6ae75b124f13415226340f2 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^)*#Hm3?x7OW@-ddjKx9jP7LeL$-D$|I0Jk_T!Hle z|Nntx@v-JYAjMn~{27nmwv-&-B>Z{E~>o~ij^CufJfdp32KYieF-XY{q-YgfO2 aUe44JBFVavu|yhZ1%s!npUXO@geCwQMMzly literal 0 HcmV?d00001 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 264a3e1f3b3a..5047010b9cfd 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1091,7 +1091,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Better Drill Required -bar.nobatterypower = Insufficieny Battery Power +bar.nobatterypower = Insufficient Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1100,7 +1100,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.boost = Boost: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} +bar.powerbuffer = Batteries: {0}/{1} bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/shaders/blockbuild.frag b/core/assets/shaders/blockbuild.frag index 78cfd6e9c89a..dc58d207615b 100644 --- a/core/assets/shaders/blockbuild.frag +++ b/core/assets/shaders/blockbuild.frag @@ -27,6 +27,10 @@ bool cont(vec2 T, vec2 v){ id(T + vec2(-step, -step) * v, base) || id(T + vec2(-step, step) * v, base)); } +vec4 blend(vec4 dst, vec4 src){ + return src * src.a + dst * (1.0 - src.a); +} + void main(){ vec2 t = v_texCoords.xy; @@ -41,11 +45,11 @@ void main(){ float dst = (abs(center.x - coords.x) + abs(center.y - coords.y))/2.0; if((mod(u_time / 1.5 + value, 20.0) < 15.0 && cont(t, v))){ - gl_FragColor = v_color; + gl_FragColor = blend(color, v_color); }else if(dst > (1.0-u_progress) * (center.x)){ gl_FragColor = color; }else if((dst + 2.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){ - gl_FragColor = v_color; + gl_FragColor = blend(color, v_color); }else{ gl_FragColor = vec4(0.0); } diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 16e42a0fbf04..c8a44b0e124f 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -2464,6 +2464,12 @@ public class Fx{ }); }), + launchAccelerator = new Effect(22, e -> { + color(Pal.accent); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 160f); + }), + launch = new Effect(28, e -> { color(Pal.command); stroke(e.fout() * 2f); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index da36e8009a49..58f7fa65e3f1 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -199,9 +199,9 @@ public Control(){ float coreDelay = 0f; if(!settings.getBool("skipcoreanimation") && !state.rules.pvp){ - coreDelay = core.landDuration(); + coreDelay = core.launchDuration(); //delay player respawn so animation can play. - player.deathTimer = Player.deathDelay - core.landDuration(); + player.deathTimer = Player.deathDelay - core.launchDuration(); //TODO this sounds pretty bad due to conflict if(settings.getInt("musicvol") > 0){ //TODO what to do if another core with different music is already playing? diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 4b4f0be7d362..ed9271e5196d 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -405,7 +405,9 @@ public static void researched(Content content){ @Override public void dispose(){ //save the settings before quitting - netServer.admins.forceSave(); + if(netServer != null){ + netServer.admins.forceSave(); + } Core.settings.manualSave(); } diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index b1f0787749cf..47acb4c45404 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -50,7 +50,7 @@ public class Renderer implements ApplicationListener{ public TextureRegion[][] fluidFrames; //currently landing core, null if there are no cores or it has finished landing. - private @Nullable LaunchAnimator landCore; + private @Nullable LaunchAnimator launchAnimator; private Color clearColor = new Color(0f, 0f, 0f, 1f); private float //target camera scale that is lerp-ed to @@ -59,8 +59,6 @@ public class Renderer implements ApplicationListener{ camerascale = targetscale, //starts at coreLandDuration, ends at 0. if positive, core is landing. landTime, - //timer for core landing particles - landPTimer, //intensity for screen shake shakeIntensity, //reduction rate of screen shake @@ -170,21 +168,21 @@ public void update(){ pixelate = settings.getBool("pixelate"); //don't bother drawing landing animation if core is null - if(landCore == null) landTime = 0f; + if(launchAnimator == null) landTime = 0f; if(landTime > 0){ - if(!state.isPaused()) landCore.updateLaunching(); + if(!state.isPaused()) launchAnimator.updateLaunch(); weatherAlpha = 0f; - camerascale = landCore.zoomLaunching(); + camerascale = launchAnimator.zoomLaunch(); if(!state.isPaused()) landTime -= Time.delta; }else{ weatherAlpha = Mathf.lerpDelta(weatherAlpha, 1f, 0.08f); } - if(landCore != null && landTime <= 0f){ - landCore.endLaunch(); - landCore = null; + if(launchAnimator != null && landTime <= 0f){ + launchAnimator.endLaunch(); + launchAnimator = null; } camera.width = graphics.getWidth() / camerascale; @@ -376,9 +374,14 @@ public void draw(){ Draw.draw(Layer.overlayUI, overlays::drawTop); if(state.rules.fog) Draw.draw(Layer.fogOfWar, fog::drawFog); Draw.draw(Layer.space, () -> { - if(landCore == null || landTime <= 0f) return; - landCore.drawLanding(); + if(launchAnimator == null || landTime <= 0f) return; + launchAnimator.drawLaunch(); }); + if(launchAnimator != null){ + Draw.z(Layer.space); + launchAnimator.drawLaunchGlobalZ(); + Draw.reset(); + } Events.fire(Trigger.drawOver); blocks.drawBlocks(); @@ -507,27 +510,19 @@ public float getLandTime(){ } public float getLandTimeIn(){ - if(landCore == null) return 0f; - float fin = landTime / landCore.landDuration(); + if(launchAnimator == null) return 0f; + float fin = landTime / launchAnimator.launchDuration(); if(!launching) fin = 1f - fin; return fin; } - public float getLandPTimer(){ - return landPTimer; - } - - public void setLandPTimer(float landPTimer){ - this.landPTimer = landPTimer; - } - public void showLanding(LaunchAnimator landCore){ - this.landCore = landCore; + this.launchAnimator = landCore; launching = false; - landTime = landCore.landDuration(); + landTime = landCore.launchDuration(); landCore.beginLaunch(false); - camerascale = landCore.zoomLaunching(); + camerascale = landCore.zoomLaunch(); } public void showLaunch(LaunchAnimator landCore){ @@ -535,9 +530,9 @@ public void showLaunch(LaunchAnimator landCore){ control.input.planConfig.hide(); control.input.inv.hide(); - this.landCore = landCore; + this.launchAnimator = landCore; launching = true; - landTime = landCore.landDuration(); + landTime = landCore.launchDuration(); Music music = landCore.launchMusic(); music.stop(); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index e28459c31c90..a7ec97573553 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -1287,7 +1287,7 @@ void playSelected(){ Runnable doLaunch = () -> { renderer.showLaunch(core); //run with less delay, as the loading animation is delayed by several frames - Time.runTask(core.landDuration() - 8f, () -> control.playSector(from, sector)); + Time.runTask(core.launchDuration() - 8f, () -> control.playSector(from, sector)); }; //load launchFrom sector right before launching so animation is correct diff --git a/core/src/mindustry/world/blocks/LaunchAnimator.java b/core/src/mindustry/world/blocks/LaunchAnimator.java index 4bba63a5f41d..62a3366ff3b4 100644 --- a/core/src/mindustry/world/blocks/LaunchAnimator.java +++ b/core/src/mindustry/world/blocks/LaunchAnimator.java @@ -1,22 +1,29 @@ package mindustry.world.blocks; import arc.audio.*; +import mindustry.gen.*; public interface LaunchAnimator{ - void drawLanding(); + void drawLaunch(); + + default void drawLaunchGlobalZ(){} void beginLaunch(boolean launching); void endLaunch(); - void updateLaunching(); + void updateLaunch(); - float landDuration(); + float launchDuration(); - Music landMusic(); + default Music landMusic(){ + return Musics.land; + } - Music launchMusic(); + default Music launchMusic(){ + return Musics.launch; + } - float zoomLaunching(); + float zoomLaunch(); } diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index 9968fdc87453..74292dc5261c 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -7,7 +7,6 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.scene.actions.*; import arc.scene.event.*; import arc.scene.ui.*; @@ -15,7 +14,6 @@ import arc.struct.*; import arc.util.*; import arc.util.io.*; -import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.core.*; @@ -33,7 +31,8 @@ import static mindustry.Vars.*; public class Accelerator extends Block{ - public @Load("launch-arrow") TextureRegion arrowRegion; + public @Load(value = "@-launch-arrow", fallback = "launch-arrow") TextureRegion arrowRegion; + public @Load("select-arrow-small") TextureRegion selectArrowRegion; /** Core block that is launched. Should match the starting core of the planet being launched to. */ public Block launchBlock = Blocks.coreNucleus; @@ -41,9 +40,26 @@ public class Accelerator extends Block{ /** Override for planets that this block can launch to. If null, the planet's launch candidates are used. */ public @Nullable Seq launchCandidates; + //TODO: launching needs audio! + public Music launchMusic = Musics.coreLaunch; - public float launchDuration = 160f; + public float launchDuration = 120f; + public float chargeDuration = 220f; public float buildDuration = 120f; + public Interp landZoomInterp = Interp.pow4In, chargeZoomInterp = Interp.pow4In; + public float landZoomFrom = 0.02f, landZoomTo = 4f, chargeZoomTo = 5f; + + public int chargeRings = 4; + public float ringRadBase = 60f, ringRadSpacing = 25f, ringRadPow = 1.6f, ringStroke = 3f, ringSpeedup = 1.4f, chargeRingMerge = 2f, ringArrowRad = 3f; + public float ringHandleTilt = 0.8f, ringHandleLen = 30f; + public Color ringColor = Pal.accent; + + public int launchLightning = 20; + public Color lightningColor = Pal.accent; + public float lightningDamage = 40; + public float lightningOffset = 24f; + public int lightningLengthMin = 5, lightningLengthMax = 25; + public double lightningLaunchChance = 0.8; protected int[] capacities = {}; @@ -55,6 +71,9 @@ public Accelerator(String name){ hasPower = true; itemCapacity = 8000; configurable = true; + emitLight = true; + lightRadius = 70f; + lightColor = Pal.accent; } @Override @@ -90,7 +109,8 @@ public boolean outputsItems(){ public class AcceleratorBuild extends Building implements LaunchAnimator{ public float heat, statusLerp; public float progress; - public float time; + public float time, launchHeat; + public boolean launching; protected float cloudSeed; @@ -100,7 +120,13 @@ public void updateTile(){ heat = Mathf.lerpDelta(heat, efficiency, 0.05f); statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); - time += Time.delta * efficiency; + if(!launching){ + time += Time.delta * efficiency; + }else{ + time = Mathf.slerpDelta(time, 0f, 0.4f); + } + + launchHeat = Mathf.lerpDelta(launchHeat, launching ? 1f : 0f, 0.1f); if(efficiency >= 0f){ progress += Time.delta * efficiency / buildDuration; @@ -128,56 +154,63 @@ public void draw(){ } { - Drawf.shadow(x, y, launchBlock.size * tilesize * 2f, progress); - Draw.draw(Layer.blockBuilding, () -> { - Draw.color(Pal.accent, heat); + if(launching){ + Draw.reset(); + Draw.rect(launchBlock.fullIcon, x, y); + }else{ + Drawf.shadow(x, y, launchBlock.size * tilesize * 2f, progress); + Draw.draw(Layer.blockBuilding, () -> { + Draw.color(Pal.accent, heat); - for(TextureRegion region : launchBlock.getGeneratedIcons()){ - Shaders.blockbuild.region = region; - Shaders.blockbuild.time = time; - Shaders.blockbuild.progress = progress; + for(TextureRegion region : launchBlock.getGeneratedIcons()){ + Shaders.blockbuild.region = region; + Shaders.blockbuild.time = time; + Shaders.blockbuild.progress = progress; - Draw.rect(region, x, y); - Draw.flush(); - } - - Draw.color(); - }); + Draw.rect(region, x, y); + Draw.flush(); + } - //TODO: build line? - //Draw.z(Layer.blockBuilding + 1); - //Draw.color(Pal.accent, heat); + Draw.color(); + }); + } - //Lines.lineAngleCenter(x + Mathf.sin(time, 10f, Vars.tilesize / 2f * recipe.size + 1f), y, 90, recipe.size * Vars.tilesize + 1f); Draw.reset(); } if(heat < 0.0001f) return; - float rad = size * tilesize / 2f * 0.74f; + float rad = size * tilesize / 2f * 0.74f * Mathf.lerp(1f, 1.3f, launchHeat); float scl = 2f; Draw.z(Layer.bullet - 0.0001f); Lines.stroke(1.75f * heat, Pal.accent); - Lines.square(x, y, rad * 1.22f, 45f); + Lines.square(x, y, rad * 1.22f, Mathf.lerp(45f, 0f, launchHeat)); + + //TODO: lock time when launching Lines.stroke(3f * heat, Pal.accent); - Lines.square(x, y, rad, Time.time / scl); - Lines.square(x, y, rad, -Time.time / scl); + Lines.square(x, y, rad * Mathf.lerp(1f, 1.3f, launchHeat), 45f + time / scl); + Lines.square(x, y, rad * Mathf.lerp(1f, 1.8f, launchHeat), Mathf.lerp(45f, 0f, launchHeat) - time / scl); Draw.color(team.color); Draw.alpha(Mathf.clamp(heat * 3f)); for(int i = 0; i < 4; i++){ - float rot = i*90f + 45f + (-Time.time /3f)%360f; - float length = 26f * heat; + float rot = i*90f + 45f + (-time/3f)%360f; + float length = 26f * heat * Mathf.lerp(1f, 1.5f, launchHeat); Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f); } Draw.reset(); } + @Override + public void drawLight(){ + Drawf.light(x, y, lightRadius, lightColor, launchHeat); + } + public boolean canLaunch(){ return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f; } @@ -204,8 +237,6 @@ public void buildConfiguration(Table table){ ui.planet.showPlanetLaunch(state.rules.sector, launchCandidates == null ? state.rules.sector.planet.launchCandidates : launchCandidates, sector -> { if(canLaunch()){ - //TODO: animation! - consume(); power.graph.useBatteries(powerBufferRequirement); progress = 0f; @@ -214,7 +245,7 @@ public void buildConfiguration(Table table){ renderer.showLaunch(this); - Time.runTask(core.landDuration() - 8f, () -> { + Time.runTask(core.launchDuration() - 8f, () -> { //unlock right before launch sector.planet.unlockedOnLand.each(UnlockableContent::unlock); @@ -260,34 +291,9 @@ public void read(Reads read, byte revision){ } //launch animator stuff: - - @Override - public float zoomLaunching(){ - CoreBlock core = (CoreBlock)launchBlock; - Core.camera.position.set(this); - return core.landZoomInterp.apply(Scl.scl(core.landZoomFrom), Scl.scl(core.landZoomTo), renderer.getLandTimeIn()); - } - @Override - public void updateLaunching(){ - float in = renderer.getLandTimeIn() * landDuration(); - float tsize = Mathf.sample(CoreBlock.thrusterSizes, (in + 35f) / landDuration()); - - renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta); - if(renderer.getLandTime() >= 1f){ - tile.getLinkedTiles(t -> { - if(Mathf.chance(0.4f)){ - Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); - } - }); - - renderer.setLandPTimer(0f); - } - } - - @Override - public float landDuration(){ - return launchDuration; + public float launchDuration(){ + return launchDuration + chargeDuration; } @Override @@ -303,67 +309,112 @@ public Music launchMusic(){ @Override public void beginLaunch(boolean launching){ + if(!launching) return; + + this.launching = true; + Fx.coreLaunchConstruct.at(x, y, launchBlock.size); + cloudSeed = Mathf.random(1f); - if(launching){ - Fx.coreLaunchConstruct.at(x, y, launchBlock.size); - } + float margin = 30f; + + Image image = new Image(); + image.color.a = 0f; + image.touchable = Touchable.disabled; + image.setFillParent(true); + image.actions(Actions.delay((launchDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); + image.update(() -> { + image.toFront(); + ui.loadfrag.toFront(); + if(state.isMenu()){ + image.remove(); + } + }); + Core.scene.add(image); - if(!headless){ - // Add fade-in and fade-out foreground when landing or launching. - if(renderer.isLaunching()){ - float margin = 30f; - - Image image = new Image(); - image.color.a = 0f; - image.touchable = Touchable.disabled; - image.setFillParent(true); - image.actions(Actions.delay((landDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); - image.update(() -> { - image.toFront(); - ui.loadfrag.toFront(); - if(state.isMenu()){ - image.remove(); - } - }); - Core.scene.add(image); - }else{ - Image image = new Image(); - image.color.a = 1f; - image.touchable = Touchable.disabled; - image.setFillParent(true); - image.actions(Actions.fadeOut(35f / 60f), Actions.remove()); - image.update(() -> { - image.toFront(); - ui.loadfrag.toFront(); - if(state.isMenu()){ - image.remove(); - } - }); - Core.scene.add(image); + Time.run(chargeDuration, () -> { + Fx.coreLaunchConstruct.at(x, y, launchBlock.size); + Fx.launchAccelerator.at(x, y); + Effect.shake(10f, 14f, this); - Time.run(landDuration(), () -> { - CoreBlock core = (CoreBlock)launchBlock; - core.launchEffect.at(this); - Effect.shake(5f, 5f, this); + for(int i = 0; i < launchLightning; i++){ + float a = Mathf.random(360f); + Lightning.create(team, lightningColor, lightningDamage, x + Angles.trnsx(a, lightningOffset), y + Angles.trnsy(a, lightningOffset), a, Mathf.random(lightningLengthMin, lightningLengthMax)); + } - if(state.isCampaign() && Vars.showSectorLandInfo && (state.rules.sector.preset == null || state.rules.sector.preset.showSectorLandInfo)){ - ui.announce("[accent]" + state.rules.sector.name() + "\n" + - (state.rules.sector.info.resources.any() ? "[lightgray]" + Core.bundle.get("sectors.resources") + "[white] " + - state.rules.sector.info.resources.toString(" ", UnlockableContent::emoji) : ""), 5); + float spacing = 12f; + for(int i = 0; i < 13; i++){ + int fi = i; + Time.run(i * 1.1f, () -> { + float radius = block.size/2f + 1 + spacing * fi; + int rays = Mathf.ceil(radius * Mathf.PI * 2f / 6f); + for(int r = 0; r < rays; r++){ + if(Mathf.chance(0.7f - fi * 0.02f)){ + float angle = r * 360f / (float)rays; + float ox = Angles.trnsx(angle, radius), oy = Angles.trnsy(angle, radius); + Tile t = world.tileWorld(x + ox, y + oy); + if(t != null){ + Fx.coreLandDust.at(t.worldx(), t.worldy(), angle + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.7f + Mathf.range(0.15f))); + } + } } }); } + + + }); + } + + @Override + public void endLaunch(){ + launching = false; + } + + @Override + public float zoomLaunch(){ + float rawTime = launchDuration() - renderer.getLandTime(); + + Core.camera.position.set(this); + + if(rawTime < chargeDuration){ + float fin = rawTime / chargeDuration; + + return chargeZoomInterp.apply(Scl.scl(landZoomTo), Scl.scl(chargeZoomTo), fin); + }else{ + float rawFin = renderer.getLandTimeIn(); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + + return landZoomInterp.apply(Scl.scl(landZoomFrom), Scl.scl(landZoomTo), fin); } } @Override - public void endLaunch(){} + public void updateLaunch(){ + float in = renderer.getLandTimeIn() * launchDuration(); + float tsize = Mathf.sample(CoreBlock.thrusterSizes, (in + 35f) / launchDuration()); + + float rawFin = renderer.getLandTimeIn(); + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float chargeFout = 1f - chargeFin; + + if(in > launchDuration){ + if(Mathf.chanceDelta(lightningLaunchChance * Interp.pow3In.apply(chargeFout))){ + float a = Mathf.random(360f); + Lightning.create(team, lightningColor, lightningDamage, x + Angles.trnsx(a, lightningOffset), y + Angles.trnsy(a, lightningOffset), a, Mathf.random(lightningLengthMin, lightningLengthMax)); + } + } + } @Override - public void drawLanding(){ + public void drawLaunch(){ var clouds = Core.assets.get("sprites/clouds.png", Texture.class); - float fin = renderer.getLandTimeIn(); + float rawFin = renderer.getLandTimeIn(); + float rawTime = launchDuration() - renderer.getLandTime(); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float chargeFout = 1f - chargeFin; + float cameraScl = renderer.getDisplayScale(); float fout = 1f - fin; @@ -378,7 +429,9 @@ public void drawLanding(){ }); Draw.color(); - drawLanding(x, y); + if(rawTime >= chargeDuration){ + drawLanding(fin, x, y); + } Draw.color(); Draw.mixcol(Color.white, Interp.pow5In.apply(fout)); @@ -412,11 +465,73 @@ public void drawLanding(){ } } - public void drawLanding(float x, float y){ - float fin = renderer.getLandTimeIn(); + @Override + public void drawLaunchGlobalZ(){ + float rawFin = renderer.getLandTimeIn(); + + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + float fout = 1f - fin; + float chargeFout = 1f - chargeFin; + + //fade out rings during launch. + chargeFout = Mathf.clamp(chargeFout - fout * 2f); + + float + spacing = 1f / (chargeRings + chargeRingMerge); + + for(int i = 0; i < chargeRings; i++){ + float cfin = Mathf.clamp((chargeFout*ringSpeedup - spacing * i) / (spacing * (1f + chargeRingMerge))); + if(cfin > 0){ + drawRing(ringRadBase + ringRadSpacing * Mathf.pow(i, ringRadPow), cfin); + } + } + } + + protected void drawRing(float radius, float fin){ + Draw.z(Layer.effect); + + float fout = 1f - fin; + float rotate = Interp.pow4In.apply(fout) * 90f; + float rad = radius + 20f * Interp.pow4In.apply(fout); + + Lines.stroke(ringStroke * fin, ringColor); + + Draw.color(Pal.command, ringColor, fin); + + //handles + for(int i = 0; i < 4; i++){ + float angle = i * 90f + 45f + rotate; + Lines.beginLine(); + Lines.linePoint(Tmp.v1.trns(angle - ringHandleLen, rad * ringHandleTilt).add(x, y)); + Lines.linePoint(Tmp.v2.trns(angle, rad).add(x, y)); + Lines.linePoint(Tmp.v3.trns(angle + ringHandleLen, rad * ringHandleTilt).add(x, y)); + Lines.endLine(false); + + } + + Draw.scl(fin); + + //selection triangles + for(int i = 0; i < 4; i++){ + float angle = i * 90f + rotate; + + + Draw.rect(selectArrowRegion, x + Angles.trnsx(angle, rad), y + Angles.trnsy(angle, rad), angle + 180f + 45f); + + //shape variant: + //Lines.poly(x + Angles.trnsx(angle, rad), y + Angles.trnsy(angle, rad), 3, ringArrowRad * fin, angle + 180f); + } + + Draw.scl(); + + } + + protected void drawLanding(float fin, float x, float y){ + float rawTime = launchDuration() - renderer.getLandTime(); float fout = 1f - fin; - float scl = Scl.scl(4f) / renderer.getDisplayScale(); + float scl = rawTime < chargeDuration ? 1f : Scl.scl(4f) / renderer.getDisplayScale(); float shake = 0f; float s = launchBlock.region.width * launchBlock.region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout); float rotation = Interp.pow2In.apply(fout) * 135f; @@ -498,15 +613,5 @@ protected void drawLandingThrusters(float x, float y, float rotation, float fram } Draw.alpha(1f); } - - public void drawThrusters(float frame){ - CoreBlock core = (CoreBlock)launchBlock; - float length = core.thrusterLength * (frame - 1f) - 1f/4f; - for(int i = 0; i < 4; i++){ - var reg = i >= 2 ? core.thruster2 : core.thruster1; - float dx = Geometry.d4x[i] * length, dy = Geometry.d4y[i] * length; - Draw.rect(reg, x + dx, y + dy, i * 90); - } - } } } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 3dd29fc6b157..5aff273ddcdf 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -238,7 +238,7 @@ public class CoreBuild extends Building implements LaunchAnimator{ public float iframes = -1f; public float thrusterTime = 0f; - protected float cloudSeed; + protected float cloudSeed, landParticleTimer; @Override public void draw(){ @@ -260,7 +260,7 @@ public void draw(){ } @Override - public float landDuration(){ + public float launchDuration(){ return landDuration; } @@ -290,7 +290,7 @@ public void beginLaunch(boolean launching){ image.color.a = 0f; image.touchable = Touchable.disabled; image.setFillParent(true); - image.actions(Actions.delay((landDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); + image.actions(Actions.delay((launchDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); image.update(() -> { image.toFront(); ui.loadfrag.toFront(); @@ -314,7 +314,7 @@ public void beginLaunch(boolean launching){ }); Core.scene.add(image); - Time.run(landDuration(), () -> { + Time.run(launchDuration(), () -> { launchEffect.at(this); Effect.shake(5f, 5f, this); thrusterTime = 1f; @@ -333,7 +333,7 @@ public void beginLaunch(boolean launching){ public void endLaunch(){} @Override - public void drawLanding(){ + public void drawLaunch(){ var clouds = Core.assets.get("sprites/clouds.png", Texture.class); float fin = renderer.getLandTimeIn(); @@ -551,25 +551,25 @@ public void updateTile(){ /** @return Camera zoom while landing or launching. May optionally do other things such as setting camera position to itself. */ @Override - public float zoomLaunching(){ + public float zoomLaunch(){ Core.camera.position.set(this); return landZoomInterp.apply(Scl.scl(landZoomFrom), Scl.scl(landZoomTo), renderer.getLandTimeIn()); } @Override - public void updateLaunching(){ - float in = renderer.getLandTimeIn() * landDuration(); - float tsize = Mathf.sample(thrusterSizes, (in + 35f) / landDuration()); + public void updateLaunch(){ + float in = renderer.getLandTimeIn() * launchDuration(); + float tsize = Mathf.sample(thrusterSizes, (in + 35f) / launchDuration()); - renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta); - if(renderer.getLandTime() >= 1f){ + landParticleTimer += tsize * Time.delta; + if(landParticleTimer >= 1f){ tile.getLinkedTiles(t -> { if(Mathf.chance(0.4f)){ Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); } }); - renderer.setLandPTimer(0f); + landParticleTimer = 0f; } } From 4cf9d54c3dd06d79a478b672343f479645d42b8a Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 21:59:40 -0500 Subject: [PATCH 03/26] Re-added old ingame editor UI, hid new UI behind a toggle --- .../mindustry/ui/fragments/HudFragment.java | 65 ++++--------------- .../ui/fragments/PlacementFragment.java | 17 ++--- 2 files changed, 18 insertions(+), 64 deletions(-) diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 23c6d1a7424b..87733e627c0b 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -326,71 +326,32 @@ public void build(Group parent){ editorMain.name = "editor"; editorMain.table(Tex.buttonEdge4, t -> { t.name = "teams"; + + t.top().table(teams -> { teams.left(); - int i = 0; for(Team team : Team.baseTeams){ - ImageButton button = teams.button(Tex.whiteui, Styles.clearNoneTogglei, 38f, () -> Call.setPlayerTeamEditor(player, team)) - .size(50f).margin(6f).get(); + ImageButton button = teams.button(Tex.whiteui, Styles.clearNoneTogglei, 33f, () -> Call.setPlayerTeamEditor(player, team)) + .size(45f).margin(6f).get(); button.getImageCell().grow(); button.getStyle().imageUpColor = team.color; button.update(() -> button.setChecked(player.team() == team)); - - if(++i % 6 == 0){ - teams.row(); - } } - }).top().left(); - t.row(); + teams.button(Icon.downOpen, Styles.emptyi, () -> Core.settings.put("editor-blocks-shown", !Core.settings.getBool("editor-blocks-shown"))) + .size(45f).update(m -> m.getStyle().imageUp = (Core.settings.getBool("editor-blocks-shown") ? Icon.upOpen : Icon.downOpen)); + }).top().left().row(); - t.table(control.input::buildPlacementUI).growX().left().with(in -> in.left()).row(); - - //hovering item display - t.table(h -> { - Runnable rebuild = () -> { - h.clear(); - h.left(); - - Displayable hover = blockfrag.hovered(); - UnlockableContent toDisplay = control.input.block; - - if(toDisplay == null && hover != null){ - if(hover instanceof Building b){ - toDisplay = b.block; - }else if(hover instanceof Tile tile){ - toDisplay = - tile.block().itemDrop != null ? tile.block() : - tile.overlay().itemDrop != null || tile.wallDrop() != null ? tile.overlay() : - tile.floor(); - }else if(hover instanceof Unit u){ - toDisplay = u.type; - } - } + t.collapser(blocks -> { + addBlockSelection(blocks); + }, () -> Core.settings.getBool("editor-blocks-shown")); - if(toDisplay != null){ - h.image(toDisplay.uiIcon).scaling(Scaling.fit).size(8 * 4); - h.add(toDisplay.localizedName).ellipsis(true).left().growX().padLeft(5); - } - }; - Object[] hovering = {null}; - h.update(() -> { - Object nextHover = control.input.block != null ? control.input.block : blockfrag.hovered(); - if(nextHover != hovering[0]){ - hovering[0] = nextHover; - rebuild.run(); - } - }); - }).growX().left().minHeight(36f).row(); - t.table(blocks -> { - addBlockSelection(blocks); - }).fillX().left(); - }).width(dsize * 5 + 4f); + }).width(dsize * 5 + 4f).top(); if(mobile){ editorMain.row().spacerY(() -> { - if(control.input instanceof MobileInput mob){ + if(control.input instanceof MobileInput mob && Core.settings.getBool("editor-blocks-shown")){ if(Core.graphics.isPortrait()) return Core.graphics.getHeight() / 2f / Scl.scl(1f); if(mob.hasSchematic()) return 156f; if(mob.showCancel()) return 50f; @@ -398,6 +359,8 @@ public void build(Group parent){ return 0f; }); } + + editorMain.row().add().growY(); editorMain.visible(() -> shown && state.isEditor()); //fps display diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 6b42c3c3fc52..228d60289f54 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -265,14 +265,7 @@ boolean gridUpdate(InputHandler input){ public void build(Group parent){ parent.fill(full -> { toggler = full; - full.bottom().right().visible(() -> { - if(state.rules.editor){ - //force update the mouse picking, since it otherwise would not happen - updatePick(control.input); - } - - return ui.hudfrag.shown && !state.rules.editor; - }); + full.bottom().right().visible(() -> ui.hudfrag.shown); full.table(frame -> { @@ -750,12 +743,10 @@ boolean hasInfoBox(){ /** @return the thing being hovered over. */ public @Nullable Displayable hovered(){ - if(!state.rules.editor){ - Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); + Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); - //if the mouse intersects the table or the UI has the mouse, no hovering can occur - if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; - } + //if the mouse intersects the table or the UI has the mouse, no hovering can occur + if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; //check for a unit Unit unit = Units.closestOverlap(player.team(), Core.input.mouseWorldX(), Core.input.mouseWorldY(), 5f, u -> !u.isLocal() && u.displayable()); From a7f38ac2a66c8e9c785b2c9959a094f0d5711fad Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 22:34:07 -0500 Subject: [PATCH 04/26] Make patrol stance pursue targets --- core/src/mindustry/ai/types/CommandAI.java | 9 +++++++++ core/src/mindustry/input/DesktopInput.java | 2 +- core/src/mindustry/input/InputHandler.java | 12 ++++++++---- core/src/mindustry/input/MobileInput.java | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 9446e72aa3f4..097c464884a5 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -82,6 +82,15 @@ public void updateUnit(){ commandTarget(target, false); } + //pursue the target for patrol, keeping the current position + if(stance == UnitStance.patrol && target != null && attackTarget == null){ + //commanding a target overwrites targetPos, so add it to the queue + if(targetPos != null){ + commandQueue.add(targetPos.cpy()); + } + commandTarget(target, false); + } + //remove invalid targets if(commandQueue.any()){ commandQueue.removeAll(e -> e instanceof Healthc h && !h.isValid()); diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 78ac0604a7c2..0ec79e1ab6a7 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -288,7 +288,7 @@ public void update(){ } //validate commanding units - selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid()); + selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid() || u.team != player.team()); if(commandMode && !scene.hasField() && !scene.hasDialog()){ if(input.keyTap(Binding.select_all_units)){ diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 0ec67129218f..36c55360cd77 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1096,10 +1096,16 @@ public void drawCommanded(boolean flying){ //draw command overlay UI for(Unit unit : selectedUnits){ - if(unit.isFlying() != flying) continue; + CommandAI ai = unit.command(); Position lastPos = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; + if(flying && ai.attackTarget != null && ai.currentCommand().drawTarget){ + Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove); + } + + if(unit.isFlying() != flying) continue; + //draw target line if(ai.targetPos != null && ai.currentCommand().drawTarget){ Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; @@ -1135,9 +1141,7 @@ public void drawCommanded(boolean flying){ //Lines.poly(unit.x, unit.y, sides, rad + 1.5f); Draw.reset(); - if(ai.attackTarget != null && ai.currentCommand().drawTarget){ - Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove); - } + if(lastPos == null){ lastPos = unit; diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 20490ccd5c3e..d67ed72d3320 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -762,7 +762,7 @@ public void update(){ } //validate commanding units - selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid()); + selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid() || u.team != player.team()); if(!commandMode){ commandBuildings.clear(); From e308afb2a01585bd7eeaa2f41246cca8f6e434b6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:28:36 -0500 Subject: [PATCH 05/26] Fixed accelerator timing --- .../mindustry/world/blocks/campaign/Accelerator.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index 74292dc5261c..254985bf3f15 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -117,7 +117,7 @@ public class AcceleratorBuild extends Building implements LaunchAnimator{ @Override public void updateTile(){ super.updateTile(); - heat = Mathf.lerpDelta(heat, efficiency, 0.05f); + heat = Mathf.lerpDelta(heat, launching ? 1f : efficiency, 0.05f); statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); if(!launching){ @@ -212,7 +212,7 @@ public void drawLight(){ } public boolean canLaunch(){ - return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f; + return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f && !launching; } @Override @@ -224,7 +224,7 @@ public Cursor getCursor(){ public void drawSelect(){ super.drawSelect(); - if(power.graph.getBatteryStored() < powerBufferRequirement){ + if(power.graph.getBatteryStored() < powerBufferRequirement && !launching){ drawPlaceText(Core.bundle.get("bar.nobatterypower"), tile.x, tile.y, false); } } @@ -241,12 +241,11 @@ public void buildConfiguration(Table table){ power.graph.useBatteries(powerBufferRequirement); progress = 0f; - var core = team.core(); - renderer.showLaunch(this); - Time.runTask(core.launchDuration() - 8f, () -> { + Time.runTask(launchDuration() - 6f, () -> { //unlock right before launch + launching = false; sector.planet.unlockedOnLand.each(UnlockableContent::unlock); universe.clearLoadoutInfo(); From d75a5a8f405db8015867d752c2c05c43be70c872 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:41:24 -0500 Subject: [PATCH 06/26] Fixed #10444 --- core/src/mindustry/ai/types/CommandAI.java | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 097c464884a5..f8fd59379427 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -132,6 +132,14 @@ void tryPickupUnit(Payloadc pay){ } } + @Override + public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){ + if(!unit.type.autoFindTarget && !(targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range()))){ + return null; + } + return super.findMainTarget(x, y, range, air, ground); + } + public void defaultBehavior(){ if(!net.client() && unit instanceof Payloadc pay){ @@ -183,18 +191,7 @@ public void defaultBehavior(){ } updateVisuals(); - //only autotarget if the unit supports it - if((targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range())) || unit.type.autoFindTarget){ - updateTargeting(); - }else if(attackTarget == null){ - //if the unit does not have an attack target, is currently moving, and does not have autotargeting, stop attacking stuff - target = null; - for(var mount : unit.mounts){ - if(mount.weapon.controllable){ - mount.target = null; - } - } - } + updateTargeting(); if(attackTarget != null && invalid(attackTarget)){ attackTarget = null; From 5cd97f6ff11fcea6c387349c43ead6960d379efd Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:49:55 -0500 Subject: [PATCH 07/26] Fixed #10439 --- core/src/mindustry/ui/fragments/PlacementFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 228d60289f54..d798d69f9651 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -746,7 +746,7 @@ boolean hasInfoBox(){ Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); //if the mouse intersects the table or the UI has the mouse, no hovering can occur - if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; + if(Core.scene.hasMouse(Core.input.mouseX(), Core.input.mouseY()) || topTable.hit(v.x, v.y, false) != null) return null; //check for a unit Unit unit = Units.closestOverlap(player.team(), Core.input.mouseWorldX(), Core.input.mouseWorldY(), 5f, u -> !u.isLocal() && u.displayable()); From 84dcd07b20857e082c26130a176fa715629f0973 Mon Sep 17 00:00:00 2001 From: emi <112279985+yfwemi@users.noreply.github.com> Date: Wed, 29 Jan 2025 04:50:18 +0000 Subject: [PATCH 08/26] Update servers_v7.json (#10447) --- servers_v7.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index 553bb165150b..3117b6c24787 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -236,11 +236,12 @@ { "name": "Exdustry", "address": [ - "exd.noxia.cloud:6001", - "exd.noxia.cloud:6002", - "exd.noxia.cloud:6003", - "exd.noxia.cloud:6004", - "exd.noxia.cloud:6006" + "play.exdustry.xyz:6001", + "play.exdustry.xyz:6002", + "play.exdustry.xyz:6003", + "play.exdustry.xyz:6004", + "play.exdustry.xyz:6005", + "play.exdustry.xyz:6006" ] }, { From cbeac8e995a40b10d2dcb2c1a28b27152a3d32b0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 29 Jan 2025 15:08:54 -0500 Subject: [PATCH 09/26] Fixed mobile menu layout issues --- .../mindustry/ui/fragments/HudFragment.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 87733e627c0b..0b414e59d4c7 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -290,8 +290,19 @@ public void build(Group parent){ Table wavesMain, editorMain; - cont.stack(wavesMain = new Table(), editorMain = new Table()).height(wavesMain.getPrefHeight()) - .name("waves/editor"); + cont.stack(wavesMain = new Table(), editorMain = new Table(), new Element(){ + //this may seem insane, but adding an empty element of a specific height to this stack fixes layout issues on mobile. + + { + visible = false; + touchable = Touchable.disabled; + } + + @Override + public float getPrefHeight(){ + return Scl.scl(120f); + } + }).name("waves/editor"); wavesMain.visible(() -> shown && !state.isEditor()); wavesMain.top().left().name = "waves"; @@ -342,11 +353,7 @@ public void build(Group parent){ .size(45f).update(m -> m.getStyle().imageUp = (Core.settings.getBool("editor-blocks-shown") ? Icon.upOpen : Icon.downOpen)); }).top().left().row(); - t.collapser(blocks -> { - addBlockSelection(blocks); - }, () -> Core.settings.getBool("editor-blocks-shown")); - - + t.collapser(this::addBlockSelection, () -> Core.settings.getBool("editor-blocks-shown")); }).width(dsize * 5 + 4f).top(); if(mobile){ From bcb7cdae73352ad3c65ee88b783ba4c62e943ddb Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 29 Jan 2025 18:43:20 -0500 Subject: [PATCH 10/26] Allowed naval RTS AI --- core/src/mindustry/ai/types/CommandAI.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index f8fd59379427..48a465ceb99e 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -181,15 +181,6 @@ public void defaultBehavior(){ } } - //acquiring naval targets isn't supported yet, so use the fallback dumb AI - if(unit.team.isAI() && unit.team.rules().rtsAi && unit.type.naval){ - if(fallback == null) fallback = new GroundAI(); - - if(fallback.unit() != unit) fallback.unit(unit); - fallback.updateUnit(); - return; - } - updateVisuals(); updateTargeting(); From ab65c9d29ac9f3019f5a47aad2c7321df354fbea Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 31 Jan 2025 17:58:35 -0500 Subject: [PATCH 11/26] WIP launch pad rework --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/content/Blocks.java | 27 ++++++- .../mindustry/content/SerpuloTechTree.java | 4 +- .../mindustry/entities/comp/BuildingComp.java | 27 ++++--- core/src/mindustry/game/SectorInfo.java | 2 - core/src/mindustry/game/Universe.java | 30 ++------ .../world/blocks/campaign/LandingPad.java | 70 +++++++++++++++++++ .../world/blocks/campaign/LaunchPad.java | 8 ++- .../world/consumers/ConsumeLiquid.java | 13 ++++ 9 files changed, 136 insertions(+), 47 deletions(-) create mode 100644 core/src/mindustry/world/blocks/campaign/LandingPad.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5047010b9cfd..b3e8fcd35f57 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1748,7 +1748,7 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container -block.launch-pad.name = Launch Pad +block.launch-pad.name = Launch Pad (Legacy) block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4a5de1909e9b..0fca202a3b7e 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -163,7 +163,8 @@ public class Blocks{ worldProcessor, worldCell, worldMessage, worldSwitch, //campaign - launchPad, interplanetaryAccelerator + launchPad, advancedLaunchPad, landingPad, + interplanetaryAccelerator ; @@ -6353,14 +6354,36 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ //region campaign launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.debugOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); size = 3; itemCapacity = 100; launchTime = 60f * 20; hasPower = true; + acceptMultipleItems = true; consumePower(4f); }}; + advancedLaunchPad = new LaunchPad("advanced-launch-pad"){{ + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + size = 4; + itemCapacity = 100; + launchTime = 60f * 30; + hasPower = true; + consumeLiquid(Liquids.oil, 9f/60f); + consumePower(8f); + }}; + + landingPad = new LandingPad("landing-pad"){{ + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + size = 4; + + itemCapacity = 100; + + liquidCapacity = 2000; + addLiquidBar(Liquids.water); + consumeLiquid(Liquids.water, liquidCapacity).trigger(true).update(false); + }}; + interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000)); researchCostMultiplier = 0.1f; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index f158069c082f..989c3b043fc0 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -19,7 +19,7 @@ public static void load(){ node(junction, () -> { node(router, () -> { - node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { + node(advancedLaunchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { }); @@ -522,7 +522,7 @@ public static void load(){ new Research(sei), new Research(omura), new Research(spectre), - new Research(launchPad), + new Research(advancedLaunchPad), new Research(massDriver), new Research(impactReactor), new Research(additiveReconstructor), diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index b5611ca1782c..722fad354227 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -56,7 +56,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, static final BuildTeamChangeEvent teamChangeEvent = new BuildTeamChangeEvent(); static final BuildDamageEvent bulletDamageEvent = new BuildDamageEvent(); static int sleepingEntities = 0; - + @Import float x, y, health, maxHealth; @Import Team team; @Import boolean dead; @@ -1029,10 +1029,9 @@ public boolean dump(Item todump){ int itemSize = allItems.size; Object[] itemArray = allItems.items; - for(int i = 0; i < proximity.size; i++){ - Building other = proximity.get((i + dump) % proximity.size); - - if(todump == null){ + if(todump == null){ + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get((i + dump) % proximity.size); for(int ii = 0; ii < itemSize; ii++){ if(!items.has(ii)) continue; @@ -1045,16 +1044,22 @@ public boolean dump(Item todump){ return true; } } - }else{ + + incrementDump(proximity.size); + } + }else{ + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get((i + dump) % proximity.size); + if(other.acceptItem(self(), todump) && canDump(other, todump)){ other.handleItem(self(), todump); items.remove(todump, 1); incrementDump(proximity.size); return true; } - } - incrementDump(proximity.size); + incrementDump(proximity.size); + } } return false; @@ -1118,7 +1123,7 @@ public void powerGraphRemoved(){ } power.links.clear(); } - + public boolean conductsTo(Building other){ return !block.insulated; } @@ -1320,7 +1325,7 @@ public void configured(@Nullable Unit builder, @Nullable Object value){ if(value instanceof Block) type = Block.class; if(value instanceof Liquid) type = Liquid.class; if(value instanceof UnitType) type = UnitType.class; - + if(builder != null && builder.isPlayer()){ updateLastAccess(builder.getPlayer()); } @@ -1727,7 +1732,7 @@ public void removeFromProximity(){ public void updateProximity(){ tmpTiles.clear(); proximity.clear(); - + Point2[] nearby = Edges.getEdges(block.size); for(Point2 point : nearby){ Building other = world.build(tile.x + point.x, tile.y + point.y); diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 00ff25386705..85084e8ea126 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -80,8 +80,6 @@ public class SectorInfo{ public int waveVersion = -1; /** Whether this sector was indicated to the player or not. */ public boolean shown = false; - /** Temporary seq for last imported items. Do not use. */ - public transient ItemSeq lastImported = new ItemSeq(); /** Special variables for simulation. */ public float sumHealth, sumRps, sumDps, bossHealth, bossDps, curEnemyHealth, curEnemyDps; diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 502610145194..b159ca499112 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -163,31 +163,6 @@ public void runTurn(){ continue; } - //first pass: clear import stats - for(Sector sector : planet.sectors){ - if(sector.hasBase() && !sector.isBeingPlayed()){ - sector.info.lastImported.clear(); - } - } - - //second pass: update export & import statistics - for(Sector sector : planet.sectors){ - if(sector.hasBase() && !sector.isBeingPlayed()){ - - //export to another sector - if(sector.info.destination != null){ - Sector to = sector.info.destination; - if(to.hasBase() && to.planet == planet){ - ItemSeq items = new ItemSeq(); - //calculated exported items to this sector - sector.info.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * sector.getProductionScale()))); - to.addItems(items); - to.info.lastImported.add(items); - } - } - } - } - //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ @@ -202,6 +177,8 @@ public void runTurn(){ //increment seconds passed for this sector by the time that just passed with this turn if(!sector.isBeingPlayed()){ + //TODO: if a planet has sectors under attack and simulation is OFF, just don't simulate it + //increment time if attacked if(sector.isAttacked()){ sector.info.secondsPassed += turnDuration/60f; @@ -247,7 +224,8 @@ public void runTurn(){ sector.info.export.each((item, stat) -> { if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ //cap export by import when production is negative. - stat.mean = Math.min(sector.info.lastImported.get(item) / (float)newSecondsPassed, stat.mean); + //TODO remove + stat.mean = Math.min(0f, stat.mean); } }); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java new file mode 100644 index 000000000000..bb95caee6bfb --- /dev/null +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -0,0 +1,70 @@ +package mindustry.world.blocks.campaign; + +import arc.util.*; +import arc.util.io.*; +import mindustry.gen.*; +import mindustry.io.*; +import mindustry.type.*; +import mindustry.world.*; + +public class LandingPad extends Block{ + + public LandingPad(String name){ + super(name); + + hasItems = true; + solid = true; + update = true; + configurable = true; + acceptsItems = false; + + config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); + configClear((LandingPadBuild build) -> build.config = null); + } + + @Override + public boolean outputsItems(){ + return true; + } + + public class LandingPadBuild extends Building{ + public @Nullable Item config; + + @Override + public void updateTile(){ + if(items.total() > 0){ + dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); + } + } + + @Override + public boolean canDump(Building to, Item item){ + //hack: canDump is only ever called right before item offload, so count the item as "produced" before that. + //TODO: is this necessary? + produced(item); + return true; + } + + @Override + public boolean acceptItem(Building source, Item item){ + return false; + } + + @Override + public @Nullable Object config(){ + return config; + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + config = TypeIO.readItem(read); + } + + @Override + public void write(Writes write){ + super.write(write); + TypeIO.writeItem(write, config); + } + } +} diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 440029ebf4c4..517df73e2f3c 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -27,13 +27,14 @@ import static mindustry.Vars.*; public class LaunchPad extends Block{ - /** Time inbetween launches. */ + /** Time between launches. */ public float launchTime = 1f; public Sound launchSound = Sounds.none; public @Load("@-light") TextureRegion lightRegion; public @Load(value = "@-pod", fallback = "launchpod") TextureRegion podRegion; public Color lightColor = Color.valueOf("eab678"); + public boolean acceptMultipleItems = false; public LaunchPad(String name){ super(name); @@ -116,7 +117,7 @@ public void draw(){ @Override public boolean acceptItem(Building source, Item item){ - return items.total() < itemCapacity; + return items.total() < itemCapacity && (acceptMultipleItems || items.total() == 0 || items.first() == item); } @Override @@ -159,7 +160,8 @@ public void display(Table table){ @Override public void buildConfiguration(Table table){ - if(!state.isCampaign() || net.client()){ + //TODO: this UI should be on landing pads + if(!state.isCampaign() || net.client() || true){ deselect(); return; } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index a4a3ebc4604f..b1258f67d406 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -12,6 +12,7 @@ //TODO replace with ConsumeLiquids? public class ConsumeLiquid extends ConsumeLiquidBase{ public final Liquid liquid; + public boolean trigger; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); @@ -22,6 +23,11 @@ protected ConsumeLiquid(){ this(null, 0f); } + public ConsumeLiquid trigger(boolean trigger){ + this.trigger = trigger; + return this; + } + @Override public void apply(Block block){ super.apply(block); @@ -38,6 +44,13 @@ public void update(Building build){ build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build)); } + @Override + public void trigger(Building build){ + if(trigger){ + build.liquids.remove(liquid, amount); + } + } + @Override public float efficiency(Building build){ float ed = build.edelta() * build.efficiencyScale(); From cd9614f913cdf2012a40bd9c422ac046819aaf3f Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 31 Jan 2025 23:48:16 -0500 Subject: [PATCH 12/26] Fixed #10452 --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4a5de1909e9b..8c71a74b186c 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -5213,7 +5213,7 @@ Items.surgeAlloy, new BulletType(0f, 0f){{ shake = 6f; ammoPerShot = 15; - maxAmmo = 30; + maxAmmo = 45; shootY = -1; outlineColor = Pal.darkOutline; size = 4; From 18b78f4bf685150f7bcf24c940302585cbce9127 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 1 Feb 2025 20:46:08 -0500 Subject: [PATCH 13/26] Launch pad rework progress, base mechanics done --- core/src/mindustry/content/Blocks.java | 5 +- core/src/mindustry/core/Control.java | 4 + core/src/mindustry/core/Logic.java | 4 + core/src/mindustry/game/EventType.java | 2 + core/src/mindustry/game/SectorInfo.java | 34 +++- core/src/mindustry/game/Universe.java | 8 + .../mindustry/ui/dialogs/PlanetDialog.java | 36 ++--- .../world/blocks/campaign/LandingPad.java | 145 ++++++++++++++++++ .../world/blocks/campaign/LaunchPad.java | 30 ++-- .../world/blocks/sandbox/ItemSource.java | 1 + .../world/consumers/ConsumeLiquid.java | 12 -- gradle.properties | 2 +- 12 files changed, 225 insertions(+), 58 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 0fca202a3b7e..810dfc8e1267 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6379,9 +6379,8 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ itemCapacity = 100; - liquidCapacity = 2000; - addLiquidBar(Liquids.water); - consumeLiquid(Liquids.water, liquidCapacity).trigger(true).update(false); + liquidCapacity = 4000f; + consumeLiquidAmount = 2000f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 58f7fa65e3f1..dd49e90f88d4 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -215,6 +215,10 @@ public Control(){ } if(state.isCampaign()){ + if(state.rules.sector.info.importRateCache != null){ + state.rules.sector.info.refreshImportRates(state.rules.sector.planet); + } + //don't run when hosting, that doesn't really work. if(state.rules.sector.planet.prebuildBase){ toBePlaced.clear(); diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index ed9271e5196d..328d838c4c41 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -429,6 +429,8 @@ public void update(){ } if(!state.isPaused()){ + Events.fire(Trigger.beforeGameUpdate); + float delta = Core.graphics.getDeltaTime(); state.tick += Float.isNaN(delta) || Float.isInfinite(delta) ? 0f : delta * 60f; state.updateId ++; @@ -488,6 +490,8 @@ public void update(){ Groups.weather.each(w -> state.envAttrs.add(w.weather.attrs, w.opacity)); Groups.update(); + + Events.fire(Trigger.afterGameUpdate); } if(runStateCheck){ diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 39333fdf9695..ec3bac3628b0 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -38,6 +38,8 @@ public enum Trigger{ teamCoreDamage, socketConfigChanged, update, + beforeGameUpdate, + afterGameUpdate, unitCommandChange, unitCommandPosition, unitCommandAttack, diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 85084e8ea126..2ccb9cd3f28f 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -86,6 +86,9 @@ public class SectorInfo{ /** Wave where first boss shows up. */ public int bossWave = -1; + public ObjectFloatMap importCooldownTimers = new ObjectFloatMap<>(); + public @Nullable transient float[] importRateCache; + /** Counter refresh state. */ private transient Interval time = new Interval(); /** Core item storage input/output deltas. */ @@ -105,12 +108,6 @@ public void handleProduction(Item item, int amount){ productionDeltas[item.id] += amount; } - /** @return the real location items go when launched on this sector */ - public Sector getRealDestination(){ - //on multiplayer the destination is, by default, the first captured sector (basically random) - return !net.client() || destination != null ? destination : state.rules.sector.planet.sectors.find(Sector::hasBase); - } - /** Updates export statistics. */ public void handleItemExport(ItemStack stack){ handleItemExport(stack.item, stack.amount); @@ -125,6 +122,29 @@ public float getExport(Item item){ return export.get(item, ExportStat::new).mean; } + public void refreshImportRates(Planet planet){ + if(importRateCache == null || importRateCache.length != content.items().size){ + importRateCache = new float[content.items().size]; + }else{ + Arrays.fill(importRateCache, 0f); + } + eachImport(planet, sector -> sector.info.export.each((item, stat) -> { + importRateCache[item.id] += stat.mean; + })); + } + + public float[] getImportRates(Planet planet){ + if(importRateCache == null){ + refreshImportRates(planet); + } + return importRateCache; + } + + /** @return the import rate of an item as item/second. */ + public float getImportRate(Planet planet, Item item){ + return getImportRates(planet)[item.id]; + } + /** Write contents of meta into main storage. */ public void write(){ //enable attack mode when there's a core. @@ -291,7 +311,7 @@ public ObjectMap importStats(Planet planet){ /** Iterates through every sector this one imports from. */ public void eachImport(Planet planet, Cons cons){ for(Sector sector : planet.sectors){ - Sector dest = sector.info.getRealDestination(); + Sector dest = sector.info.destination; if(sector.hasBase() && sector.info != this && dest != null && dest.info == this && sector.info.anyExports()){ cons.get(sector); } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index b159ca499112..94945eae5526 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -163,9 +163,17 @@ public void runTurn(){ continue; } + //don't simulate the planet if there is an in-progress mission on that planet + if(!planet.allowWaveSimulation && planet.sectors.contains(s -> s.hasBase() && !s.isBeingPlayed() && s.isAttacked())){ + continue; + } + //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ + if(sector.info.importRateCache != null){ + sector.info.refreshImportRates(planet); + } //if it is being attacked, capture time is 0; otherwise, increment the timer if(sector.isAttacked()){ diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index a7ec97573553..55b564047fe5 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -504,11 +504,11 @@ public void renderSectors(Planet planet){ if(selected != null && selected != sec && selected.hasBase()){ //imports - if(sec.info.getRealDestination() == selected && sec.info.anyExports()){ + if(sec.info.destination == selected && sec.info.anyExports()){ planets.drawArc(planet, sec.tile.v, selected.tile.v, Color.gray.write(Tmp.c2).a(state.uiAlpha), Pal.accent.write(Tmp.c3).a(state.uiAlpha), 0.4f, 90f, 25); } //exports - if(selected.info.getRealDestination() == sec && selected.info.anyExports()){ + if(selected.info.destination == sec && selected.info.anyExports()){ planets.drawArc(planet, selected.tile.v, sec.tile.v, Pal.place.write(Tmp.c2).a(state.uiAlpha), Pal.accent.write(Tmp.c3).a(state.uiAlpha), 0.4f, 90f, 25); } } @@ -1219,24 +1219,24 @@ void playSelected(){ return; } + Planet planet = sector.planet; + //make sure there are no under-attack sectors (other than this one) - for(Planet planet : content.planets()){ - if(!planet.allowWaveSimulation && !debugSelect && planet.allowWaveSimulation == sector.planet.allowWaveSimulation){ - //if there are two or more attacked sectors... something went wrong, don't show the dialog to prevent softlock - Sector attacked = planet.sectors.find(s -> s.isAttacked() && s != sector); - if(attacked != null && planet.sectors.count(s -> s.isAttacked()) < 2){ - BaseDialog dialog = new BaseDialog("@sector.noswitch.title"); - dialog.cont.add(bundle.format("sector.noswitch", attacked.name(), attacked.planet.localizedName)).width(400f).labelAlign(Align.center).center().wrap(); - dialog.addCloseButton(); - dialog.buttons.button("@sector.view", Icon.eyeSmall, () -> { - dialog.hide(); - lookAt(attacked); - selectSector(attacked); - }); - dialog.show(); + if(!planet.allowWaveSimulation && !debugSelect){ + //if there are two or more attacked sectors... something went wrong, don't show the dialog to prevent softlock + Sector attacked = planet.sectors.find(s -> s.isAttacked() && s != sector); + if(attacked != null && planet.sectors.count(s -> s.isAttacked()) < 2){ + BaseDialog dialog = new BaseDialog("@sector.noswitch.title"); + dialog.cont.add(bundle.format("sector.noswitch", attacked.name(), attacked.planet.localizedName)).width(400f).labelAlign(Align.center).center().wrap(); + dialog.addCloseButton(); + dialog.buttons.button("@sector.view", Icon.eyeSmall, () -> { + dialog.hide(); + lookAt(attacked); + selectSector(attacked); + }); + dialog.show(); - return; - } + return; } } diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index bb95caee6bfb..676c2049163b 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,18 +1,46 @@ package mindustry.world.blocks.campaign; +import arc.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.io.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; public class LandingPad extends Block{ + static ObjectMap> waiting = new ObjectMap<>(); + static long lastUpdateId = -1; + + static{ + Events.on(ResetEvent.class, e -> { + waiting.clear(); + lastUpdateId = -1; + }); + } + + public float cooldownTime = 12f; + public float consumeLiquidAmount = 100f; + public Liquid consumeLiquid = Liquids.water; public LandingPad(String name){ super(name); hasItems = true; + hasLiquids = true; solid = true; update = true; configurable = true; @@ -22,19 +50,127 @@ public LandingPad(String name){ configClear((LandingPadBuild build) -> build.config = null); } + @Override + public void init(){ + consume(new ConsumeLiquid(consumeLiquid, consumeLiquidAmount){ + + @Override + public void build(Building build, Table table){ + table.add(new ReqImage(liquid.uiIcon, () -> build.liquids.get(liquid) >= amount)).size(iconMed).top().left(); + } + + @Override + public float efficiency(Building build){ + return build.liquids.get(consumeLiquid) >= amount ? 1f : 0f; + } + + @Override + public void display(Stats stats){ + stats.add(Stat.input, liquid, amount, false); + } + }).update(false); + + super.init(); + } + + @Override + public void setBars(){ + super.setBars(); + + addLiquidBar(consumeLiquid); + //TODO: does cooldown even need to exist? + addBar("heat", (LandingPadBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.cooldown)); + } + @Override public boolean outputsItems(){ return true; } + @Remote(called = Loc.server) + public static void landingPadLanded(Tile tile){ + if(tile == null || !(tile.build instanceof LandingPadBuild build)) return; + build.handleLanding(); + } + public class LandingPadBuild extends Building{ public @Nullable Item config; + //priority collisions are possible, but should be extremely rare + public int priority = Mathf.rand.nextInt(); + public float cooldown = 0f; + + + public void handleLanding(){ + if(!state.isCampaign() || config == null) return; + //TODO animation, etc + + cooldown = 1f; + items.set(config, itemCapacity); + liquids.remove(consumeLiquid, consumeLiquidAmount); + for(int i = 0; i < 10; i++){ + Fx.steam.at(this); + } + //TODO this is a temporary effect + Fx.shockwave.at(this); + + state.rules.sector.info.importCooldownTimers.put(config, 0f); + } + + public void updateTimers(){ + if(state.isCampaign() && lastUpdateId != state.updateId){ + lastUpdateId = state.updateId; + + float[] imports = state.rules.sector.info.getImportRates(state.getPlanet()); + + for(Item item : content.items()){ + float importedPerFrame = imports[item.id]/60f; + if(importedPerFrame > 0f){ + float framesBetweenArrival = itemCapacity / importedPerFrame; + + state.rules.sector.info.importCooldownTimers.increment(item, 0f, 1f / framesBetweenArrival * Time.delta); + } + } + + waiting.each((item, pads) -> { + if(pads.size > 0){ + pads.sort(p -> p.priority); + + var first = pads.first(); + var head = pads.peek(); + + Call.landingPadLanded(first.tile); + + + //swap priorities, moving this block to the end of the list (if there is only one block waiting, this does nothing) + var tmp = first.priority; + first.priority = head.priority; + head.priority = tmp; + + + pads.clear(); + } + }); + } + } @Override public void updateTile(){ + updateTimers(); + if(items.total() > 0){ dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); } + + if(config != null && state.isCampaign()){ + + cooldown -= delta() / cooldownTime; + + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + + //queue landing for next frame + waiting.get(config, Seq::new).add(this); + } + } } @Override @@ -45,6 +181,11 @@ public boolean canDump(Building to, Item item){ return true; } + @Override + public void buildConfiguration(Table table){ + ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); + } + @Override public boolean acceptItem(Building source, Item item){ return false; @@ -59,12 +200,16 @@ public boolean acceptItem(Building source, Item item){ public void read(Reads read, byte revision){ super.read(read, revision); config = TypeIO.readItem(read); + priority = read.i(); + cooldown = read.f(); } @Override public void write(Writes write){ super.write(write); TypeIO.writeItem(write, config); + write.i(priority); + write.f(cooldown); } } } diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 517df73e2f3c..1f63f5a17ae3 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -150,7 +150,7 @@ public void display(Table table){ table.row(); table.label(() -> { - Sector dest = state.rules.sector == null ? null : state.rules.sector.info.getRealDestination(); + Sector dest = state.rules.sector == null ? null : state.rules.sector.info.destination; return Core.bundle.format("launch.destination", dest == null || !dest.hasBase() ? Core.bundle.get("sectors.nonelaunch") : @@ -161,7 +161,7 @@ public void display(Table table){ @Override public void buildConfiguration(Table table){ //TODO: this UI should be on landing pads - if(!state.isCampaign() || net.client() || true){ + if(!state.isCampaign() || net.client()){ deselect(); return; } @@ -262,27 +262,23 @@ public void update(){ @Override public void remove(){ - if(!state.isCampaign()) return; + if(!state.isCampaign() || net.client()) return; - Sector destsec = state.rules.sector.info.getRealDestination(); + Sector destsec = state.rules.sector.info.destination; //actually launch the items upon removal - if(team() == state.rules.defaultTeam){ - if(destsec != null && (destsec != state.rules.sector || net.client())){ - ItemSeq dest = new ItemSeq(); - - for(ItemStack stack : stacks){ - dest.add(stack); + if(team() == state.rules.defaultTeam && destsec != null && destsec != state.rules.sector){ + ItemSeq dest = new ItemSeq(); - //update export - state.rules.sector.info.handleItemExport(stack); - Events.fire(new LaunchItemEvent(stack)); - } + for(ItemStack stack : stacks){ + dest.add(stack); - if(!net.client()){ - destsec.addItems(dest); - } + //update export statistics + state.rules.sector.info.handleItemExport(stack); + Events.fire(new LaunchItemEvent(stack)); } + + destsec.addItems(dest); } } } diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java index 0a7461a7ec54..28d42f86ec65 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -88,6 +88,7 @@ public void updateTile(){ while(counter >= limit){ items.set(outputItem, 1); dump(outputItem); + produced(outputItem); items.set(outputItem, 0); counter -= limit; } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index b1258f67d406..8d756cdbdcc2 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -12,7 +12,6 @@ //TODO replace with ConsumeLiquids? public class ConsumeLiquid extends ConsumeLiquidBase{ public final Liquid liquid; - public boolean trigger; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); @@ -23,10 +22,6 @@ protected ConsumeLiquid(){ this(null, 0f); } - public ConsumeLiquid trigger(boolean trigger){ - this.trigger = trigger; - return this; - } @Override public void apply(Block block){ @@ -44,13 +39,6 @@ public void update(Building build){ build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build)); } - @Override - public void trigger(Building build){ - if(trigger){ - build.liquids.remove(liquid, amount); - } - } - @Override public float efficiency(Building build){ float ed = build.edelta() * build.efficiencyScale(); diff --git a/gradle.properties b/gradle.properties index c5d42ecc57cf..a6c6ea3647e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=4940b68158 +archash=99a42db331 From c6d82bec66f116fb6402e535057379e436462ff4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 10:54:51 -0500 Subject: [PATCH 14/26] Allowed drills to output multiple items per frame --- core/src/mindustry/world/blocks/production/Drill.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 0068ed4d6549..64929d08fee8 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -315,7 +315,10 @@ public void updateTile(){ } if(dominantItems > 0 && progress >= delay && items.total() < itemCapacity){ - offload(dominantItem); + int amount = (int)(progress / delay); + for(int i = 0; i < amount; i++){ + offload(dominantItem); + } progress %= delay; From 7aee34bafa6bae5a6c066613329dd7107418ab61 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 18:10:15 -0500 Subject: [PATCH 15/26] Finalized launch pad mechanics --- .../campaign/advanced-launch-pad-light.png | Bin 0 -> 187 bytes .../campaign/advanced-launch-pad-pod.png | Bin 0 -> 1259 bytes .../blocks/campaign/advanced-launch-pad.png | Bin 0 -> 2782 bytes .../sprites/blocks/campaign/landing-pad.png | Bin 0 -> 2829 bytes core/assets/bundles/bundle.properties | 12 +- core/assets/icons/icons.properties | 2 + core/assets/logicids.dat | Bin 4694 -> 4728 bytes core/src/mindustry/content/Blocks.java | 11 +- core/src/mindustry/content/Fx.java | 22 ++ .../mindustry/content/SerpuloTechTree.java | 4 +- .../entities/effect/RadialEffect.java | 11 +- core/src/mindustry/game/SectorInfo.java | 49 ++-- core/src/mindustry/graphics/Pal.java | 3 +- .../mindustry/ui/dialogs/PlanetDialog.java | 2 +- .../world/blocks/campaign/LandingPad.java | 210 ++++++++++++++++-- .../world/blocks/campaign/LaunchPad.java | 28 ++- core/src/mindustry/world/meta/StatValues.java | 2 +- gradle.properties | 2 +- settings.gradle | 4 - 19 files changed, 310 insertions(+), 52 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-pod.png create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png create mode 100644 core/assets-raw/sprites/blocks/campaign/landing-pad.png diff --git a/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png b/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png new file mode 100644 index 0000000000000000000000000000000000000000..039c97f90992da673772cf57a10c55305d6daa0e GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|Nv`=%1q4n`WfcR-db;|# JtaD0e0stGiGM)ec literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-pod.png b/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-pod.png new file mode 100644 index 0000000000000000000000000000000000000000..93675a3d28d6f2331d801ad26d6bfed11a9014a1 GIT binary patch literal 1259 zcmV6#o5P;`I(8j_dqHuymsw0**R@wwRB|pMO2>Ahm3HSrV(jO7DlQde{SbAKQB9H@v zS6J8>5E8gBxyib-GqXFhmwcef-o3Z)?RWEb_hvT(=*Y>BHz%Zc&ZnPGNom3JdtXRt z!QkP}fD}WyMt%?F*!!fMfzd>F(BiE_FSbq}ImXHY2eyX#>V^XR=#&S(7?$%2;N+T$3cp60; z!!aqrg-GJ21rQKPu9ZojA`0T70wtw#5R_CB1kRG&D$<7d&>LL@N4?mifjS9v@nHCJGjgIFb{eN-<=O()mNL9~*%X+RH2)hD*fK_p3> z93)y&)k&LM+b5&Zs(5pp9C{x2jUAyQmZrWEHImFHY;J9zM@~tSwlNk#mU=m?l1v9v zIY>^Dr4d#^*7|c;B&iR~$w8&@2)s<}>zR+8$Vk{o0-S|z26NH@(%l4i_3B#8%T zne-ha7s0b)Lkb zZKSuP3k6R(^jPgYNn#n2&VPxJgJ|YST6#;G{}(9-Db16t^prFh@4OP_eE7Z6BnK)d zlBH<#kR;9GLA$E)di^gcEr^sOy{COtxjM9|Us2GVN4Mrb)4WZz9L+JclCUkBC8eSu zl!It9fQVPW;~@!2+aO6|1*LM3+Jrl0GTER1voucI=ak^?y(B5yNpo^2zrOz=rL&Ga zB^N>Iqgk3v=EzCSou78Vn#U=(%st?eU?4&CpGe+9-}5EE6b21Aqw&swJh|Mq-k4GkX24@ zB&(rCk~UR~NNrsDFkeEODhVCtxi70FNxRdvrf=}IlDMeSOc9O_rp0K<$$`=%mYe5* z)2L?o3WATDN590~J0}OEJ}8xBl_Mq5Jg|NRN!w781Da6`C8ZT>8`vtTH5&k#M-$s3 z$pP&==c?`k%ZTgzTmnh?UBnaNt-GO zS@uCLt0ZlzBy`~r=_Sbvl+qCAlx8Ef znSn?-pqVK4h@@PqR+GMMjZ&8_ct}(vNg}vNlCHx|0T9)>oEqI;{>LmvN;1tg_ V`bqVY%47fl002ovPDHLkV1oW@Kv4hy literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png b/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png new file mode 100644 index 0000000000000000000000000000000000000000..de14b807f84cb8b2209d94847f9234008cab2031 GIT binary patch literal 2782 zcmV<43L*80P)PxHcG55YV^WL5cv+v!Rx#zq) z-!mh}#NpBL1^1mhn{TT`5b85rf`>3h&K66P#i9Gh(-e}1k3zb3M&-}q7mTP^Ot7iJL3Y^25VoWKIEV> z9zH&}aL&2ublYuAw$KEAeRCZB?bhwxzlm5Rz{qWa z5(z@&H!+*dNooE3gH7%A=mo9UJe_VQf4{$Tijx2F>^(d3QPGS9i+{w(2lyi3kPpB_ zkowZ8>H=S;)k`K@%zZ6)Mi97Wh0xE!1%iRx407>`d>a^$9)UT8Kab6#+o_freodZIaJ9=B&8ABi+P=g4@``6C1 zGKD>xGmBU=`GAr|aA))F=Ln!7g48pT(9{R=0bPgyYYV`#xkVL_BLYf>LtVre`b0jU zO%ZU`VUB+P>BpsB!1KSprst9XKQq`&UmwYDLc4dsg}-2Sr4fil0uEBMh#~Zyd}j~| zI0&tl4)y{xM37Q$NCZP5AJByeVoT+t-M}0XP#Y=Wh#`>=Xj25KeG)5e03X~o0k_Vw zTJNSkHEbnP>ox(lNd_GW_rSA8397%H^H5H>;w5tloAOj zdl6$0PX`a3e9N@C!ph0VQUvh3e6ftwM!xh*wYIO7K9&!kuVw>r5domR) z9NW_O+l~ZMJ7&wmb46fDz7|Rmffo6Wx+2Iq=jJ=#lM<2i2-+ZDb0kemgp%q&`@Cdw zH*ovp73n!{Bq))5?47P6fyH6jtZ@J<5nyOzO1GqUL$Eq2ojnjl6@eDICZX%}IglKQ z%Q`CiQ>R(b(_6~P+eTgpt%30$Kd ztOYP|tOYP|m>v?fMp-})iRvr)+LJ*wBf1`-ujB)|I%>W|tgHy?3;DCzJbPLg8%gZT z_`u?**glaT`nM11wJ%irHQ~ zX0-(&LlQw>$amT+f`%Z1K9TP%mW1_L1brjlQ3b&5=l4+rwUJNF2f7{r3=LTXwUUo< zhMp4U7ifqgsFi#`j5GG-(U`#)Y8FB5k$Tzt&sJ2K@Q`%Nv zeh5hceEZ=f`rB+aXWwVrClQoF{;k`)Nxx!u2ci)mB!XrphbV%Q$OnY{O1U_ad`=)X zX*84zBugYe1nSkXq&5I$#&8Icpce97Wc5!7r~o+A#eEh*P2>Y8B1l#N(zODmR0pMF zW3uHwp1l_@@}weF9YiBQ&O(t=B0}fi9myVKu841%cH58!H8bB2|j}&@MfC;^IOdCoGv2ypvaU_X+~q{ zV9p_1I*a@`Je8qFE6>vSFa?W zyMANh-kqLBe}8v+=C0qEV970T`RWz->FGzw$p`p8=lYKF4r@AiEdn}n$p?VXCFE1UJ|bo|o4W`5_ZAz_508$6BZ;?e@1hMA zPVWFl%{b5!j&-^ixnM6eV)*pQ!Gep2j}O>q#AGiEzq_{^J&mBtNT3-tEYqcSp+n;Y zP4cBs*%wfn2rQ}$i*&i;CruG(knc1%hLj=#%l3k1y3)b3jmef8`A#Z;SY6Y#2-;{Y zYNVSpavJlor2co#xsmimmk2|#hM_YUHm(hAlaKi`s|t`r0t{B&of42!wwOU8OCr&_0?0{NPkNH(ik zf1H3*jb^n0QkYJ+g9N6+U`WZiBFMe!Hdh3pFFz%MoHmf;qZw;fY~ zj*YgfGOo|>?(L4oPH|8H%aF7YByptXCD#&LQu3ufg7>H*fJWt_5oj#}tYFygWR62E zZaC-I#PW)jl`8^l7STtuN3lY>RhuA%rbA*ok~xhht4lCA>m_50XqsE?G`D75ddHj38)2@d>K;PCFV&3*oTY`1#3qFOSR`Xn(F)# z@=pbYJ2JT%kw8*FZDKHc+Fz?>nNy&CxU8=`M+7Px<$4Nv%RCt{2T|H}@M-biOs`yIOhV zP6xwXbilw(ehx5$rdY+54hBnYx8U7k1H+&P_~rE1>f{?_1;&UdAz&HEH;IPqRmKlL zo;(<1%xJV{ws(h;c|$|n6D$k)Hhi97;SWGQU=>BMjN}7c5zPH?$p>IXaB)7J`~CdI zI5(d``^Qi3lFyyqZ?UEez@{xxZX2ccZ4u1=CqzCVB?32-0Itfg?bi?iHBE_f+u#zx zz#zy6ghUX^B%n02KKq&?$W2S4+?@6g_s4?)mVAIKf>b5}xtWdG*APKz8oA}Z{d8@* z?kf3QsR&4W0mc~9byw#0)3q@K@~O{a-;wI;DM;lZr`*OEv%NbsqtRaSxm^1IvH*-D z0t%!B(<)jP!Dh}&w%f7Y)cbcQs98k{%S1ll;(VIruD5rG=GF1bWWDCvCwl-p5nG`y z`Jun1u#Dsba?0jgyb0B7j(w5`@F~ov&|FXpFdFTdFNc4}pSe!E&=@fGF@rTgZcBCX z{@sap08h1#_5dNH)Cd$VVERTa)XEEoCqM~cO@11E6+zZ4pe9-*AJB5%Ldcp0)Iv@L z+x;{4efymw;y&1DL>m*-hNuU~od)_4BJa2BuY>QrojjTQjUmQ;#?Wjt_P&AG-ie5om%V%|4J1phRv#WYcU6 zASr^2^J#JeNoonWgg`0sYcF@(VQqttZ(h&!Ez(=8zMv9Jg_M#(?e{g()9exfZcO9C zEP&z(a^QLbt=2#xRLkvadjelTYn6o{XdT#A$wi1}e~w)c;@TX_MYW}1?7*;3gD@A^ zyw@BPEC@g&%nB5r5<#EI2ec#t-+6^O0cesB2#H`B$Op76f|&qnkPmQ0uuS9wS{1?I z0gBHjKv@%;L&8Nn|Fm$g$ z&;$7P1X?1$PpIt)VwYM3Jpcea0hRocDIJFVR$4zmI?vPw0eq!yG)W4;7-O!!`Hqx$ z>3p86#c+8MuJp9Gw156S9Z!lH1X3`?=HP-B3vj=q@t?d~YGvWBlUb7*A% z>Xz3f-{sARP2YS!r6Si8-2MB{!ZX@&^qSMguDenf!O`&J!r#8V`HN&D84m#9*c$d_ zSPC`P3^dc^sLRmhmBBGUUqn!I!AK)*N%Bo9DD?DxOFT-r1X7{i6uULL0}4{t)+T2G zEnLOsgJhgPmC#m~tuc2Nqo#qaU4E=_$fNHfz&6}X*Tsik{BZM(eC7J%v1(oysd>VO zdf5Yackmco^2GeKAHS%|MU4ESlR*?uV4tbyY8~3gyK-zulr?rqg$oM#CNu~<}mO3~+)IxX=^)KRSKjt&C*C;~~M zq(z`jzQN1_azvmR0!2x;2{40pvBRM)FOKvLl65J1I(RLDa!A)m&JqnkR!wp)CS$JODMQz&#gmG+Yc~&|Vhij6cvG&-mgG9;1Th zBZPhD0;myPq>CacAz^kHQ?09BIf$zfh2+|ygoIHex=>#afBs?|CI9Zv#gjn*i4#Iv zq|_qcM(kX`=ikF8gHG?aPXPpKujXJDDecXh@>Qs zwLc=26%^WnCuoIyQ;^5nSBdHcB^s zG(Eu@^WgY!uG%n7kDCKYO z4p|0o#8D#GU*8Da=$`eR$FZ)p9 z2~w>&B>d56Z}u*waZtt(-dRBH4?{?Kf|AxO^Vo52424 zP!8k{40A-VK_UP7i*fZ)D;70A9m@f5mu@mq;hv)H zy6{I9LKPb$+O@B7@FlmNv9l|KT?gSL`c^lv^}THi&? zt!Jz!5M2o36hUZI9V5ae4&zeYXJVH#gwp1m&mZoOMH^Dpg&-<&7KF;b7)ER9eOtNg z-A$n_S8&UD3jrm7P=9hZnW_%-04-K@tvrPW+pL2?vlc-VeI?&e#{i+}#o1)~z%f{% zOkd3Z6~DFfNBo)1GIF@>bFFxuO{NdN$Rg^tGI;PU`ryB0($Zh4a?GX7U<^cc_p1`h{R7IvLQHp%7G$`eh@EECvoLmUv_5^N) zNwpGAyIOhVP6xvsY9)|M1fc@9;wm*ET^Cr+&`ZIkB1jc%l|&$27Zk2YdjYv3z!qo~ fL?B%kRF3`w!*Pt}OivaZ00000NkvXXu0mjfR-!G| literal 0 HcmV?d00001 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b3e8fcd35f57..6e8e43183131 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -737,6 +737,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Add... guardian = Guardian @@ -778,6 +780,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1748,7 +1751,10 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container -block.launch-pad.name = Launch Pad (Legacy) +block.launch-pad.name = Launch Pad [lightgray](Legacy) +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad + block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2198,7 +2204,9 @@ block.vault.description = Stores a large amount of items of each type. Expands s block.container.description = Stores a small amount of items of each type. Expands storage when placed next to a core. Contents can be retrieved with an unloader. block.unloader.description = Unloads the selected item from nearby blocks. block.launch-pad.description = Launches batches of items to selected sectors. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Fires alternating bullets at enemies. block.scatter.description = Fires clumps of lead, scrap or metaglass flak at enemy aircraft. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index c2f98f347ff6..5c3bcdf0de6c 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -595,3 +595,5 @@ 63087=scathe-missile-phase|unit-scathe-missile-phase-ui 63086=scathe-missile-surge|unit-scathe-missile-surge-ui 63085=scathe-missile-surge-split|unit-scathe-missile-surge-split-ui +63084=advanced-launch-pad|block-advanced-launch-pad-ui +63083=landing-pad|block-landing-pad-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 2145ea1672e78ad50bebb8c008fadce2f92dc6f2..e690bd925b0a1118cbe7a2d1594f971da990e457 100644 GIT binary patch delta 50 zcmcbn@ { + color(Pal.accent); + stroke(e.fout() * 2f + 0.2f); + Lines.circle(e.x, e.y, e.fin() * 26f); + }), + explosion = new Effect(30, e -> { e.scaled(7, i -> { stroke(3f * i.fout()); @@ -1624,6 +1630,15 @@ public class Fx{ }); }), + steamCoolSmoke = new Effect(35f, e -> { + color(Pal.water, Color.lightGray, e.fin(Interp.pow2Out)); + alpha(e.fout(Interp.pow3Out)); + + randLenVectors(e.id, 4, e.finpow() * 7f, e.rotation, 30f, (x, y) -> { + Fill.circle(e.x + x, e.y + y, Math.max(e.fout(), Math.min(1f, e.fin() * 8f)) * 2.8f); + }); + }), + smokePuff = new Effect(30, e -> { color(e.color); @@ -2574,6 +2589,13 @@ public class Fx{ Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f)); }).layer(Layer.groundUnit + 1f), + podLandDust = new Effect(70f, e -> { + color(e.color, e.fout(0.1f)); + rand.setSeed(e.id); + Tmp.v1.trns(e.rotation, e.finpow() * 35f * rand.random(0.2f, 1f)); + Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 5f * rand.random(0.6f, 1f) * e.fout(0.2f)); + }).layer(Layer.groundUnit + 1f), + unitShieldBreak = new Effect(35, e -> { if(!(e.data instanceof Unit unit)) return; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index 989c3b043fc0..e791f676807b 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -20,8 +20,10 @@ public static void load(){ node(junction, () -> { node(router, () -> { node(advancedLaunchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { - node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + node(landingPad, () -> { + node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + }); }); }); diff --git a/core/src/mindustry/entities/effect/RadialEffect.java b/core/src/mindustry/entities/effect/RadialEffect.java index 1ac37f172f98..e6495c4b0f6b 100644 --- a/core/src/mindustry/entities/effect/RadialEffect.java +++ b/core/src/mindustry/entities/effect/RadialEffect.java @@ -8,7 +8,7 @@ /** Renders one particle effect repeatedly at specified angle intervals. */ public class RadialEffect extends Effect{ public Effect effect = Fx.none; - public float rotationSpacing = 90f, rotationOffset = 0f; + public float rotationSpacing = 90f, rotationOffset = 0f, effectRotationOffset = 0f; public float lengthOffset = 0f; public int amount = 4; @@ -16,14 +16,19 @@ public RadialEffect(){ clip = 100f; } - public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset){ + public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset, float effectRotationOffset){ this(); this.amount = amount; this.effect = effect; + this.effectRotationOffset = effectRotationOffset; this.rotationSpacing = spacing; this.lengthOffset = lengthOffset; } + public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset){ + this(effect, amount, spacing, lengthOffset, 0f); + } + @Override public void create(float x, float y, float rotation, Color color, Object data){ if(!shouldCreate()) return; @@ -31,7 +36,7 @@ public void create(float x, float y, float rotation, Color color, Object data){ rotation += rotationOffset; for(int i = 0; i < amount; i++){ - effect.create(x + Angles.trnsx(rotation, lengthOffset), y + Angles.trnsy(rotation, lengthOffset), rotation, color, data); + effect.create(x + Angles.trnsx(rotation, lengthOffset), y + Angles.trnsy(rotation, lengthOffset), rotation + effectRotationOffset, color, data); rotation += rotationSpacing; } } diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 2ccb9cd3f28f..8673e8206dfe 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -30,6 +30,9 @@ public class SectorInfo{ public ObjectMap rawProduction = new ObjectMap<>(); /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); + //TODO: there is an obvious exploit with launch pad redirection here; pads can be redirected after leaving a sector, which doesn't update calculations. + /** Import statistics, based on what launch pads are actually receiving. TODO: this is not actually used or displayed anywhere (yet) */ + public ObjectMap imports = new ObjectMap<>(); /** Items stored in all cores. */ public ItemSeq items = new ItemSeq(); /** The best available core type. */ @@ -118,10 +121,20 @@ public void handleItemExport(Item item, int amount){ export.get(item, ExportStat::new).counter += amount; } + /** Updates import statistics. */ + public void handleItemImport(Item item, int amount){ + imports.get(item, ExportStat::new).counter += amount; + } + public float getExport(Item item){ return export.get(item, ExportStat::new).mean; } + public boolean hasExport(Item item){ + var exp = export.get(item); + return exp != null && exp.mean > 0f; + } + public void refreshImportRates(Planet planet){ if(importRateCache == null || importRateCache.length != content.items().size){ importRateCache = new float[content.items().size]; @@ -140,7 +153,7 @@ public float[] getImportRates(Planet planet){ return importRateCache; } - /** @return the import rate of an item as item/second. */ + /** @return the import rate of an item as item/second. This is the *raw* max import rate, not what landing pads are actually using. */ public float getImportRate(Planet planet, Item item){ return getImportRates(planet)[item.id]; } @@ -239,19 +252,8 @@ public void update(){ //refresh throughput if(time.get(refreshPeriod)){ - //refresh export - export.each((item, stat) -> { - //initialize stat after loading - if(!stat.loaded){ - stat.means.fill(stat.mean); - stat.loaded = true; - } - - //add counter, subtract how many items were taken from the core during this time - stat.means.add(Math.max(stat.counter, 0)); - stat.counter = 0; - stat.mean = stat.means.rawMean(); - }); + updateStats(export); + updateStats(imports); if(coreDeltas == null) coreDeltas = new int[content.items().size]; if(productionDeltas == null) productionDeltas = new int[content.items().size]; @@ -268,6 +270,11 @@ public void update(){ //export can, at most, be the raw items being produced from factories + the items being taken from the core export.get(item).mean = Math.min(export.get(item).mean, rawProduction.get(item).mean + Math.max(-production.get(item).mean, 0)); } + + if(imports.containsKey(item)){ + //import can't exceed max import rate + imports.get(item).mean = Math.min(imports.get(item).mean, getImportRate(state.getPlanet(), item)); + } } Arrays.fill(coreDeltas, 0); @@ -275,6 +282,20 @@ public void update(){ } } + void updateStats(ObjectMap map){ + map.each((item, stat) -> { + //initialize stat after loading + if(!stat.loaded){ + stat.means.fill(stat.mean); + stat.loaded = true; + } + + stat.means.add(Math.max(stat.counter, 0)); + stat.counter = 0; + stat.mean = stat.means.rawMean(); + }); + } + void updateDelta(Item item, ObjectMap map, int[] deltas){ ExportStat stat = map.get(item, ExportStat::new); if(!stat.loaded){ diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 9b56be524bf3..ba63dcdb681b 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -5,6 +5,7 @@ public class Pal{ public static Color + water = Color.valueOf("596ab8"), darkOutline = Color.valueOf("2d2f39"), thoriumPink = Color.valueOf("f9a3c7"), coalBlack = Color.valueOf("272727"), @@ -107,7 +108,7 @@ public class Pal{ redderDust = Color.valueOf("ff7b69"), plasticSmoke = Color.valueOf("f1e479"), - + adminChat = Color.valueOf("ff4000"), neoplasmOutline = Color.valueOf("2e191d"), diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 55b564047fe5..c078fc36ac1c 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -962,7 +962,7 @@ void showStats(Sector sector){ //import if(sector.hasBase()){ - displayItems(c, 1f, sector.info.importStats(sector.planet), "@sectors.import", t -> { + displayItems(c, 1f, sector.info.imports, "@sectors.import", t -> { sector.info.eachImport(sector.planet, other -> { String ic = other.iconChar(); t.add(Iconc.rightOpen + " " + (ic == null || ic.isEmpty() ? "" : ic + " ") + other.name()).padLeft(10f).row(); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 676c2049163b..9b7cd5dfbd24 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,6 +1,8 @@ package mindustry.world.blocks.campaign; import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; @@ -8,6 +10,7 @@ import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -16,6 +19,7 @@ import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.liquid.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; @@ -32,10 +36,19 @@ public class LandingPad extends Block{ }); } - public float cooldownTime = 12f; + public @Load(value = "@-pod", fallback = "advanced-launch-pad-pod") TextureRegion podRegion; + public float arrivalDuration = 150f; + public float cooldownTime = 180f; public float consumeLiquidAmount = 100f; public Liquid consumeLiquid = Liquids.water; + public Effect landEffect = Fx.podLandShockwave; + public Effect coolingEffect = Fx.none; + public float coolingEffectChance = 0.2f; + + public float liquidPad = 2f; + public Color bottomColor = Pal.darkerMetal; + public LandingPad(String name){ super(name); @@ -45,6 +58,8 @@ public LandingPad(String name){ update = true; configurable = true; acceptsItems = false; + emitLight = true; + lightRadius = 90f; config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); configClear((LandingPadBuild build) -> build.config = null); @@ -97,21 +112,19 @@ public class LandingPadBuild extends Building{ public @Nullable Item config; //priority collisions are possible, but should be extremely rare public int priority = Mathf.rand.nextInt(); - public float cooldown = 0f; + public float cooldown = 0f, landParticleTimer; + public float arrivingTimer = 0f; + public @Nullable Item arriving; + public float liquidRemoved; public void handleLanding(){ if(!state.isCampaign() || config == null) return; - //TODO animation, etc cooldown = 1f; - items.set(config, itemCapacity); - liquids.remove(consumeLiquid, consumeLiquidAmount); - for(int i = 0; i < 10; i++){ - Fx.steam.at(this); - } - //TODO this is a temporary effect - Fx.shockwave.at(this); + arriving = config; + arrivingTimer = 0f; + liquidRemoved = 0f; state.rules.sector.info.importCooldownTimers.put(config, 0f); } @@ -128,6 +141,9 @@ public void updateTimers(){ float framesBetweenArrival = itemCapacity / importedPerFrame; state.rules.sector.info.importCooldownTimers.increment(item, 0f, 1f / framesBetweenArrival * Time.delta); + }else{ + //nothing is being imported, so reset the timer + state.rules.sector.info.importCooldownTimers.put(item, 0f); } } @@ -140,32 +156,144 @@ public void updateTimers(){ Call.landingPadLanded(first.tile); - //swap priorities, moving this block to the end of the list (if there is only one block waiting, this does nothing) var tmp = first.priority; first.priority = head.priority; head.priority = tmp; - pads.clear(); } }); } } + @Override + public void draw(){ + if(consumeLiquid != null){ + Draw.color(bottomColor); + Fill.square(x, y, size * tilesize/2f - liquidPad); + Draw.color(); + LiquidBlock.drawTiledFrames(block.size, x, y, liquidPad, liquidPad, liquidPad, liquidPad, consumeLiquid, liquids.get(consumeLiquid) / liquidCapacity); + } + + super.draw(); + + if(arriving != null){ + float fin = Mathf.clamp(arrivingTimer), fout = 1f - fin; + float alpha = Interp.pow5Out.apply(fin); + float scale = (1f - alpha) * 1.3f + 1f; + float + cx = x, + cy = y + Interp.pow4In.apply(fout) * (100f + Mathf.randomSeedRange(id() + 2, 30f)); + + float rotation = fout * (90f + Mathf.randomSeedRange(id(), 50f)); + + Draw.z(Layer.effect + 0.001f); + + Draw.color(Pal.engine); + + float rad = 0.15f + Interp.pow5Out.apply(Mathf.slope(fin)); + + Fill.light(cx, cy, 10, 25f * (rad + scale-1f), Tmp.c2.set(Pal.engine).a(alpha), Tmp.c1.set(Pal.engine).a(0f)); + + Draw.alpha(alpha); + for(int i = 0; i < 4; i++){ + Drawf.tri(cx, cy, 6f, 40f * (rad + scale-1f), i * 90f + rotation); + } + + Draw.color(); + + Draw.z(Layer.weather - 1); + + scale *= podRegion.scl(); + float rw = podRegion.width * scale, rh = podRegion.height * scale; + + Draw.alpha(alpha); + Drawf.shadow(cx, cy, size * tilesize, fin); + Draw.rect(podRegion, cx, cy, rw, rh, rotation); + + Tmp.v1.trns(225f, Interp.pow3In.apply(fout) * 250f); + + Draw.z(Layer.flyingUnit + 1); + Draw.color(0, 0, 0, 0.22f * alpha); + + Draw.rect(podRegion, cx + Tmp.v1.x, cy + Tmp.v1.y, rw, rh, rotation); + + }else if(cooldown > 0f){ + + Drawf.shadow(x, y, size * tilesize, cooldown); + Draw.alpha(cooldown); + Draw.mixcol(Pal.accent, 1f - cooldown); + Draw.rect(podRegion, x, y); + } + + Draw.reset(); + } + + @Override + public void drawLight(){ + Drawf.light(x, y, lightRadius, Pal.accent, Mathf.clamp(Math.max(cooldown, arrivingTimer * 1.5f))); + } + @Override public void updateTile(){ updateTimers(); + if(arriving != null){ + if(!headless){ //pod particles + float fin = arrivingTimer; + float tsize = Interp.pow5Out.apply(fin); + + landParticleTimer += tsize * Time.delta / 2f; + if(landParticleTimer >= 1f){ + tile.getLinkedTiles(t -> { + if(Mathf.chance(0.1f)){ + Fx.podLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); + } + }); + + landParticleTimer = 0f; + } + } + + arrivingTimer += Time.delta / arrivalDuration; + + float toRemove = Math.min(consumeLiquidAmount / arrivalDuration * Time.delta, consumeLiquidAmount - liquidRemoved); + liquidRemoved += toRemove; + + liquids.remove(consumeLiquid, toRemove); + + if(Mathf.chanceDelta(coolingEffectChance * Interp.pow5Out.apply(arrivingTimer))){ + coolingEffect.at(this); + } + + if(arrivingTimer >= 1f){ + //remove any leftovers to make sure it's precise + liquids.remove(consumeLiquid, consumeLiquidAmount - liquidRemoved); + + landEffect.at(this); + Effect.shake(3f, 3f, this); + + items.set(arriving, itemCapacity); + state.getSector().info.handleItemImport(arriving, itemCapacity); + + arriving = null; + arrivingTimer = 0f; + } + } + if(items.total() > 0){ dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); } - if(config != null && state.isCampaign()){ - + if(arriving == null){ cooldown -= delta() / cooldownTime; + cooldown = Mathf.clamp(cooldown); + } + + if(config != null && state.isCampaign()){ - if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ //queue landing for next frame waiting.get(config, Seq::new).add(this); @@ -184,6 +312,58 @@ public boolean canDump(Building to, Item item){ @Override public void buildConfiguration(Table table){ ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); + + if(!net.client()){ + table.row(); + + table.table(t -> { + t.background(Styles.black6); + + t.button(Icon.downOpen, Styles.clearNonei, 40f, () -> { + if(config != null && state.isCampaign()){ + for(Sector sector : state.getPlanet().sectors){ + if(sector.hasBase() && sector != state.getSector() && sector.info.destination != state.getSector() && sector.info.hasExport(config)){ + sector.info.destination = state.getSector(); + sector.saveInfo(); + } + } + state.getSector().info.refreshImportRates(state.getPlanet()); + } + }).disabled(b -> config == null || !state.isCampaign() || (!state.getPlanet().sectors.contains(s -> s.hasBase() && s.info.hasExport(config) && s.info.destination != state.getSector()))) + .tooltip("@sectors.redirect").get(); + }).fillX().left(); + } + } + + @Override + public void display(Table table){ + super.display(table); + + if(!state.isCampaign() || net.client() || team != player.team()) return; + + table.row(); + table.label(() -> { + if(config == null || !state.isCampaign()){ + return ""; + } + int sources = 0; + float perSecond = 0f; + for(var s : state.getPlanet().sectors){ + if(s != state.getSector() && s.hasBase() && s.info.destination == state.getSector()){ + float amount = s.info.getExport(config); + if(amount > 0){ + sources ++; + perSecond += s.info.getExport(config); + } + } + } + + String str = Core.bundle.format("landing.sources", sources == 0 ? Core.bundle.get("none") : sources); + if(perSecond > 0){ + str += "\n" + Core.bundle.format("landing.import", config.emoji(), (int)(perSecond * 60f)); + } + return str; + }).pad(4).wrap().width(200f).left(); } @Override diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 1f63f5a17ae3..cb2014ee98b6 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -22,6 +22,7 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.liquid.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -36,6 +37,13 @@ public class LaunchPad extends Block{ public Color lightColor = Color.valueOf("eab678"); public boolean acceptMultipleItems = false; + public float lightStep = 1f; + public int lightSteps = 3; + + public float liquidPad = 2f; + public @Nullable Liquid drawLiquid; + public Color bottomColor = Pal.darkerMetal; + public LaunchPad(String name){ super(name); hasItems = true; @@ -87,6 +95,13 @@ public double sense(LAccess sensor){ @Override public void draw(){ + if(hasLiquids && drawLiquid != null){ + Draw.color(bottomColor); + Fill.square(x, y, size * tilesize/2f - liquidPad); + Draw.color(); + LiquidBlock.drawTiledFrames(block.size, x, y, liquidPad, liquidPad, liquidPad, liquidPad, drawLiquid, liquids.get(drawLiquid) / liquidCapacity); + } + super.draw(); if(!state.isCampaign()) return; @@ -94,13 +109,11 @@ public void draw(){ if(lightRegion.found()){ Draw.color(lightColor); float progress = Math.min((float)items.total() / itemCapacity, launchCounter / launchTime); - int steps = 3; - float step = 1f; for(int i = 0; i < 4; i++){ - for(int j = 0; j < steps; j++){ - float alpha = Mathf.curve(progress, (float)j / steps, (j+1f) / steps); - float offset = -(j - 1f) * step; + for(int j = 0; j < lightSteps; j++){ + float alpha = Mathf.curve(progress, (float)j / lightSteps, (j+1f) / lightSteps); + float offset = -(j - 1f) * lightStep; Draw.color(Pal.metalGrayDark, lightColor, alpha); Draw.rect(lightRegion, x + Geometry.d8edge(i).x * offset, y + Geometry.d8edge(i).y * offset, i * 90); @@ -110,6 +123,7 @@ public void draw(){ Draw.reset(); } + Drawf.shadow(x, y, size * tilesize); Draw.rect(podRegion, x, y); Draw.reset(); @@ -169,7 +183,11 @@ public void buildConfiguration(Table table){ table.button(Icon.upOpen, Styles.cleari, () -> { ui.planet.showSelect(state.rules.sector, other -> { if(state.isCampaign() && other.planet == state.rules.sector.planet){ + var prev = state.rules.sector.info.destination; state.rules.sector.info.destination = other; + if(prev != null){ + prev.info.refreshImportRates(state.getPlanet()); + } } }); deselect(); diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index d0be047ebc25..854783461445 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -150,7 +150,7 @@ public static Table displayLiquid(Liquid liquid, float amount, boolean perSecond t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); add(t); } - }}).size(iconMed).padRight(3 + (amount != 0 && Strings.autoFixed(amount, 2).length() > 2 ? 8 : 0)).with(s -> withTooltip(s, liquid, false)); + }}).size(iconMed).padRight(3 + (amount != 0 ? (Strings.autoFixed(amount, 2).length() - 1) * 10 : 0)).with(s -> withTooltip(s, liquid, false)); if(perSecond && amount != 0){ t.add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); diff --git a/gradle.properties b/gradle.properties index a6c6ea3647e7..04720cf292c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=99a42db331 +archash=c8004178c4 diff --git a/settings.gradle b/settings.gradle index dafd6bdf99f4..b18346f65206 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,10 +15,6 @@ if(new File(settingsDir, 'local.properties').exists()){ if(System.getenv("JITPACK") == "true") hasSdk = false if(hasSdk){ - //hack: pretend the Android module doesn't exist when imported through IntelliJ - //why? because IntelliJ chokes on the new version of the Android plugin - - //UPDATE: it no longer chokes on AGP with the latest version, but instead gives a completely different error. brilliant. include 'android' }else{ println("No Android SDK found. Skipping Android module.") From bb9baa650e255ffe1aa9f7f74c5130f1e8f88043 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Sun, 2 Feb 2025 23:12:00 +0000 Subject: [PATCH 16/26] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 9 ++++++++- core/assets/bundles/bundle_bg.properties | 9 ++++++++- core/assets/bundles/bundle_ca.properties | 9 ++++++++- core/assets/bundles/bundle_cs.properties | 9 ++++++++- core/assets/bundles/bundle_da.properties | 9 ++++++++- core/assets/bundles/bundle_de.properties | 9 ++++++++- core/assets/bundles/bundle_es.properties | 9 ++++++++- core/assets/bundles/bundle_et.properties | 9 ++++++++- core/assets/bundles/bundle_eu.properties | 9 ++++++++- core/assets/bundles/bundle_fi.properties | 9 ++++++++- core/assets/bundles/bundle_fil.properties | 9 ++++++++- core/assets/bundles/bundle_fr.properties | 9 ++++++++- core/assets/bundles/bundle_hu.properties | 9 ++++++++- core/assets/bundles/bundle_id_ID.properties | 9 ++++++++- core/assets/bundles/bundle_it.properties | 9 ++++++++- core/assets/bundles/bundle_ja.properties | 9 ++++++++- core/assets/bundles/bundle_ko.properties | 9 ++++++++- core/assets/bundles/bundle_lt.properties | 9 ++++++++- core/assets/bundles/bundle_nl.properties | 9 ++++++++- core/assets/bundles/bundle_nl_BE.properties | 9 ++++++++- core/assets/bundles/bundle_pl.properties | 9 ++++++++- core/assets/bundles/bundle_pt_BR.properties | 9 ++++++++- core/assets/bundles/bundle_pt_PT.properties | 9 ++++++++- core/assets/bundles/bundle_ro.properties | 9 ++++++++- core/assets/bundles/bundle_ru.properties | 9 ++++++++- core/assets/bundles/bundle_sr.properties | 9 ++++++++- core/assets/bundles/bundle_sv.properties | 9 ++++++++- core/assets/bundles/bundle_th.properties | 9 ++++++++- core/assets/bundles/bundle_tk.properties | 9 ++++++++- core/assets/bundles/bundle_tr.properties | 9 ++++++++- core/assets/bundles/bundle_uk_UA.properties | 9 ++++++++- core/assets/bundles/bundle_vi.properties | 9 ++++++++- core/assets/bundles/bundle_zh_CN.properties | 9 ++++++++- core/assets/bundles/bundle_zh_TW.properties | 9 ++++++++- 34 files changed, 272 insertions(+), 34 deletions(-) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index c473fdbb3c8b..6310fc1e396a 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -714,6 +714,8 @@ addall = Дадаць всё launch.from = Запуск Ад: [accent]{0} launch.capacity = Ёмістасць Прадметаў Да Запуску: [accent]{0} launch.destination = Кропка Прызначэння: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Колькасць павінна быць лікам паміж 0 і {0}. add = Дадаць... guardian = Вартаўнік @@ -754,6 +756,7 @@ sectors.launch = Запусціць sectors.select = Выбраць sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічога (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Пераназваць Сектар sectors.enemybase = [scarlet]Варожая База sectors.vulnerable = [scarlet]Уразлівы @@ -1709,6 +1712,8 @@ block.meltdown.name = Іспепяліцель block.foreshadow.name = Прадвесце block.container.name = Кантэйнер block.launch-pad.name = Пускавая пляцоўка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Завод наземных адзінак block.air-factory.name = Завод паветраных адзінак @@ -2147,7 +2152,9 @@ block.vault.description = Захоўвае вялікая колькасць п block.container.description = Захоўвае невялікая колькасць прадметаў кожнага тыпу. Блок разгрузчка можа быць выкарыстаны для здабывання прадметаў з кантэйнера. block.unloader.description = Выгружае прадметы з любога нетранспортного блока. Тып прадмета, які неабходна выгрузіць, можна змяніць націскам. block.launch-pad.description = Запускае партыі прадметаў без неабходнасці запуску ядра. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Маленькая, танная турэль. Карысная супраць наземных юнітаў. block.scatter.description = Асноўная супрацьпаветраная турэль. Распыляе кавалкі свінцу або металалому на варожыя падраздзялення. block.scorch.description = Спальваеце любых наземных ворагаў побач з ім. Высокаэфектыўны на блізкай адлегласці. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index bcc42a6fb23d..7fdd12a0eeab 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -721,6 +721,8 @@ addall = Добави Всички launch.from = Изстреляй от: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Цел: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Количеството трябва да е между 0 и {0}. add = Добави... guardian = Guardian @@ -761,6 +763,7 @@ sectors.launch = Изстреляй sectors.select = Избери sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]няма (Слънцето) +sectors.redirect = Redirect Launch Pads sectors.rename = Преименувай Зоната sectors.enemybase = [scarlet]Вражеска база sectors.vulnerable = [scarlet]Уязвима @@ -1720,6 +1723,8 @@ block.meltdown.name = Разтопител block.foreshadow.name = Предвестител block.container.name = Контейнер block.launch-pad.name = Изстрелваща Площадка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземна Фабрика block.air-factory.name = Въздушна Фабрика @@ -2159,7 +2164,9 @@ block.vault.description = Съхранява голямо количество block.container.description = Съхранява малко количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварач. block.unloader.description = Разтоварва избран материал от близки блокове. block.launch-pad.description = Изстрелва патриди от елементи в избраните сектори. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Изстрелва редуващи се куршуми по враговете. block.scatter.description = Изстрелва топки олово, скрап или метастъкло на съчми срещу вражески въздушни единици. block.scorch.description = Изгаря всички наземни врагове в близост. Висока ефективност от близко разстояние. diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 348716815438..f7e67e49e73b 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -725,6 +725,8 @@ addall = Afegeix-ho tot launch.from = Llançant des de [accent]{0}. launch.capacity = Capacitat de càrrega per llançament: [accent]{0} launch.destination = Destinació: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La quantitat ha de ser un nombre entre 0 i {0}. add = Afegeix guardian = Guardià @@ -765,6 +767,7 @@ sectors.launch = Llança sectors.select = Selecciona sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]cap (sol) +sectors.redirect = Redirect Launch Pads sectors.rename = Reanomena el sector sectors.enemybase = [scarlet]Base enemiga sectors.vulnerable = [scarlet]Vulnerable @@ -1727,6 +1730,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contenidor block.launch-pad.name = Plataforma de llançament +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fàbrica d’unitats terrestres block.air-factory.name = Fàbrica d’unitats aèries @@ -2169,7 +2174,9 @@ block.vault.description = Emmagatzema una quantitat gran d’elements de cada ti block.container.description = Emmagatzema una quantitat petita d’elements de cada tipus. Millora la capacitat d’emmagatzemament al sector si es situa al costat d’un nucli. Es poden recuperar els continguts amb un descarregador. block.unloader.description = Descarrega els elements seleccionats dels blocs adjacents. block.launch-pad.description = Llança lots d’elements al sector seleccionat. -block.launch-pad.details = Sistema suborbital de transport de recursos punt a punt. Les càpsules de càrrega només sobreviuen una sola reentrada i no es poden reutilitzar. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara munició als enemics. block.scatter.description = Dispara projectils antiaeris de plom, ferralla o metavidre a les aeronaus enemigues. block.scorch.description = Crema els enemics terrestres que tingui a prop. La torreta és molt efectiva a distàncies curtes. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index d480d5c96af9..63e5a3244369 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -723,6 +723,8 @@ addall = Přidat vše launch.from = Vysláno z: [accent]{0} launch.capacity = Odpalovací kapacita: [accent]{0} launch.destination = Cíl: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Hodnota musí být číslo mezi 0 a {0}. add = Přidat... guardian = Strážce @@ -763,6 +765,7 @@ sectors.launch = Vyslat sectors.select = Vybrat sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]bez (slunce)[] +sectors.redirect = Redirect Launch Pads sectors.rename = Přejmenovat sektor sectors.enemybase = [scarlet]Nepřátelská základna sectors.vulnerable = [scarlet]Zranitelný @@ -1724,6 +1727,8 @@ block.meltdown.name = Rozpékač block.foreshadow.name = Znamení osudu block.container.name = Kontejnér block.launch-pad.name = Vysílací plošina +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Úsek block.ground-factory.name = Pozemní továrna block.air-factory.name = Letecká továrna @@ -2164,7 +2169,9 @@ block.vault.description = Ukládá velké množství předmětů od každého ty block.container.description = Ukládá menší množství předmětů od každého typu. K vyskladnění věcí z kontejneru je možné použít odbavovač. block.unloader.description = Vyskladňuje vybrané položky z okolních bloků. block.launch-pad.description = Vysílá dávky předmětů do přilehlých sektorů. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Střílí střídavé dávky kulek na nepřátele. block.scatter.description = Střílí kusy olova, pláty šrotu nebo střepy metaskla na nepřátelské letectvo. block.scorch.description = Sežehne pozemní jednotky blízkosti. Velmi efektivní na malé vzdálenosti. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 47e96ad1367a..bc36d38ecbbc 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -715,6 +715,8 @@ addall = Tilføj alle launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Mængde skal være mellem 0 og {0}. add = Tilføj... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Affyr sectors.select = Vælg sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ingen (solen) +sectors.redirect = Redirect Launch Pads sectors.rename = Omdøb sektor sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Beholder block.launch-pad.name = Affyringsrampe +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fodgænger-fabrik block.air-factory.name = Flyver-fabrik @@ -2147,7 +2152,9 @@ block.vault.description = Opbevarer en masse genstande. En aflæsser-blok kan br block.container.description = Opbevarer en lille mængde genstande. En aflæsser-blok kan bruges til at hive ting ud af en container. block.unloader.description = Aflæsser genstande fra sidestående blokke. Typen af blok, der skal aflæsses kan justeres. block.launch-pad.description = Affyrer samlinger af genstande løbende. Kræver ikke affyring af kernen. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = En bette, billig kanon. Effektiv mod fodgængere. block.scatter.description = Et vigtigt luftangreb. Skyder klumper af skud mod flyvere. block.scorch.description = Brænder alle forbipasserende fodgængere. Meget god til hvad den gør. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 8edef0b9a4f2..79a4797026e7 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -732,6 +732,8 @@ addall = Alle hinzufügen launch.from = Materialen werden von [accent]{0} []gestartet launch.capacity = Ressourcenkapazität: [accent]{0} launch.destination = Ziel: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. add = Hinzufügen... guardian = Boss @@ -773,6 +775,7 @@ sectors.launch = Start sectors.select = Auswählen sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]keiner (Sonne) +sectors.redirect = Redirect Launch Pads sectors.rename = Sektor umbenennen sectors.enemybase = [scarlet]Gegnerische Basis sectors.vulnerable = [scarlet]Angriffsgefährdet @@ -1737,6 +1740,8 @@ block.meltdown.name = Kernschmelze block.foreshadow.name = Vorschatten block.container.name = Behälter block.launch-pad.name = Launchpad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Bodenfabrik block.air-factory.name = Luftfabrik @@ -2190,7 +2195,9 @@ block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ei block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen. block.unloader.description = Entlädt Materialien aus einem Block. block.launch-pad.description = Startet Materialien in andere Sektoren. -block.launch-pad.details = Planetnahes Transportsystem für Ressourcen. Frachtpods sind zu instabil, um heil durch eine Atmosphäre zu fallen. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Schießt auf Gegner. block.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Lufteinheiten. block.scorch.description = Verbrennt alle Bodenfeinde in der Nähe. Hochwirksam im Nahbereich. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index bf68e0ca8d70..6a074dec4647 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -729,6 +729,8 @@ addall = Añadir todo launch.from = Lanzando desde: [accent]{0} launch.capacity = Capacidad de objetos por envío: [accent]{0} launch.destination = Destino: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La cantidad debe ser un número entre 0 y {0}. add = Añadir... guardian = Guardián @@ -769,6 +771,7 @@ sectors.launch = Lanzar sectors.select = Seleccionar sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Ninguno (sol) +sectors.redirect = Redirect Launch Pads sectors.rename = Renombrar sector sectors.enemybase = [scarlet]Base enemiga sectors.vulnerable = [scarlet]Vulnerable @@ -1733,6 +1736,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contenedor block.launch-pad.name = Plataforma de lanzamiento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fábrica terrestre block.air-factory.name = Fábrica aérea @@ -2182,7 +2187,9 @@ block.vault.description = Almacena una gran cantidad de objetos de cada tipo. Su block.container.description = Almacena una pequeña cantidad de objetos de cada tipo. Su contenido se puede recuperar con un descargador. block.unloader.description = Descarga el objeto seleccionado de bloques cercanos. block.launch-pad.description = Lanza lotes de recursos a los sectores seleccionados. -block.launch-pad.details = Sistema suborbital para transportar recursos. Las cápsulas de carga son frágiles e incapaces de sobrevivir al aterrizaje. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara balas sencillas a los enemigos. block.scatter.description = Dispara proyectiles de plomo, chatarra o metacristal a las unidades aéreas enemigas. block.scorch.description = Quema a cualquier enemigo terrestre cercano a él. Altamente efectivo a corto alcance. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 4bda6f7eeb8e..a6e54999b20a 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Arv peab olema 0 ja {0} vahel. add = Lisa... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Valguskiir block.foreshadow.name = Foreshadow block.container.name = Hoidla block.launch-pad.name = Stardiplatvorm +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Hoiustab suurt hulka igat tüüpi ressursse. Hoidlast block.container.description = Hoiustab väikest hulka igat tüüpi ressursse. Hoidlast ressursside kättesaamiseks kasutatakse mahalaadijat. block.unloader.description = Transpordib ressursse tuumikust ja hoidlatest konveieritele või külgnevatesse ehitistesse. Mahalaetava ressursi tüüpi saab valida mahalaadijale vajutades. block.launch-pad.description = Saadab ressursse tagasi emalaeva, ilma et oleks vaja tuumikuga lendu tõusta. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Väike ja odav kahur, mis on kasulik maapealsete väeüksuste tõrjumiseks. block.scatter.description = Õhutõrjekahur, mis tulistab pliid või vanametalli lendavate väeüksuste pihta. block.scorch.description = Heidab tuld maapealsetele väeüksustele. Eriti efektiivne lähedal asuvate väeüksuste tõrjumiseks. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 279d9ccb3a6c..cc29cc99c1ee 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -717,6 +717,8 @@ addall = Gehitu denak launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. add = Gehitu guardian = Guardian @@ -757,6 +759,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1713,6 +1716,8 @@ block.meltdown.name = Nukleofusio block.foreshadow.name = Foreshadow block.container.name = Edukiontzia block.launch-pad.name = Egozketa-plataforma +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2151,7 +2156,9 @@ block.vault.description = Mota bakoitzeko elementuen kopuru handiak biltegiratze block.container.description = Mota bakoitzeko elementuen kopuru txiki bat gordetzen du. Bloke deskargagailu bat erabili daiteke elementuak edukiontzitik ateratzeko. block.unloader.description = Edukiontzi, kripta edo muin batetik elementuak deskargatzen ditu garraiagailu batera edo zuzenean ondoan dagoen bloke batera. Deskargatu beharreko elementu mota sakatuz aldatu daiteke. block.launch-pad.description = Baliabide multzoak egotzi ditzake muina egotzi gabe. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dorre txiki eta merke bat. Lurreko unitateen aurka erabilgarria. block.scatter.description = Aire defentsarako ezinbesteko dorrea. Berun edo txatarrezko koskorrekin ihinztatzen ditu unitate etsaiak. block.scorch.description = Inguruko lurreko etsaiak kiskaltzen ditu. Oso eraginkorra distantzia hurbilera. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 664bc9826778..2dd291059acd 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -715,6 +715,8 @@ addall = Lisää kaikki launch.from = Laukaistaan kohteesta: [accent]{0} launch.capacity = Tavaratila laukaistaessa: [accent]{0} launch.destination = Määränpää: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Lukumäärän täytyy olla numero väliltä 0 ja {0}. add = Lisää... guardian = Vartija @@ -755,6 +757,7 @@ sectors.launch = Laukaise sectors.select = Valitse sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ei mitään (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Nimeä sektori sectors.enemybase = [scarlet]Vihollistukikohta sectors.vulnerable = [scarlet]Haavoittuvainen @@ -1712,6 +1715,8 @@ block.meltdown.name = Sulamispiste block.foreshadow.name = Foreshadow block.container.name = Säiliö block.launch-pad.name = Laukaisualusta +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segmentti block.ground-factory.name = Maatehdas block.air-factory.name = Ilmatehdas @@ -2151,7 +2156,9 @@ block.vault.description = Varastoi suuren määrän jokaista tavaratyyppiä. Pur block.container.description = Varastoi pienen määrän jokaista tavaratyyppiä. Purkajapalikkaa voi tavaroiden palauttamiseen säiliöstä. block.unloader.description = Purkaa tavaroita säiliöstä, holvista tai ytimestä liukuhihnalle tai suoraan viereiseen palikkaan. Purettavan tavaran tyyppi voidaan vaihtaa painamalla. block.launch-pad.description = Laukaisee tavarajoukkoja ilman tarvetta ytimen laukaisulle. -block.launch-pad.details = Kiertoradan alapuolinen järjestelmä resurssien pisteestä pisteeseen -kuljetukselle . Lastikapselit ovat herkästi särkyviä ja kykenemättömiä selviytymään uudelleensaapumista. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Pieni ja halpa tykki, hyvä maavihollisia vastaan. block.scatter.description = Olennainen tykki ilma-aluksia vastaan. Ampuu lyijy- tai romusirpalerykelmiä vihollisjoukkoihin. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 4957168bcc44..4a40279051c7 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Ang halaga ay dapat na isang numero sa pagitan ng 0 at {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1710,6 +1713,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2148,7 +2153,9 @@ block.vault.description = Stores a large amount of items of each type. An unload block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = An essential anti-air turret. Sprays clumps of lead, scrap or metaglass flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index d8550a4c6e9d..c041519d6dd4 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -735,6 +735,8 @@ addall = Ajouter TOUT launch.from = Décollage depuis : [accent]{0} launch.capacity = Capacité de Lancement d'Objets : [accent]{0} launch.destination = Destination : {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La quantité doit être un nombre compris entre 0 et {0}. add = Ajouter guardian = Gardien @@ -776,6 +778,7 @@ sectors.launch = Décoller sectors.select = Sélectionner sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Vide (soleil) +sectors.redirect = Redirect Launch Pads sectors.rename = Renommer le secteur sectors.enemybase = [scarlet]Base ennemie sectors.vulnerable = [scarlet]Vulnérable @@ -1741,6 +1744,8 @@ block.meltdown.name = Fusion block.foreshadow.name = Présage block.container.name = Conteneur block.launch-pad.name = Rampe de lancement +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Diviseur block.ground-factory.name = Usine d'Unités Terrestres block.air-factory.name = Usine d'Unités Aériennes @@ -2190,7 +2195,9 @@ block.vault.description = Stocke un grand nombre d'objets de chaque type. Utilis block.container.description = Stocke un petit nombre d'objets de chaque type. Utilisez un déchargeur pour les récupérer.\nUtile pour réguler le flux d'objets quand la demande de matériaux est inconstante. block.unloader.description = Permet de décharger l'objet choisi, depuis les blocs adjacents. block.launch-pad.description = Permet de transférer des ressources vers les secteurs sélectionnés. -block.launch-pad.details = Système suborbital pour le transport point à point de ressources. Les Charges utiles sont fragiles et incapables de survivre à la rentrée atmosphérique. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Une petite tourelle à faible coût. Fonctionne bien contre les ennemis terrestres. block.scatter.description = Une tourelle anti-aérienne essentielle. Mitraille les ennemis de débris de plomb, de ferraille ou de verre trempé. block.scorch.description = Brûle les ennemis terrestres près de lui. Très efficace à courte portée. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 7e5508d386d2..2931920375af 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -737,6 +737,8 @@ addall = Összes hozzáadása launch.from = Kilövés a(z) [accent]{0} szektorból launch.capacity = Nyersanyag-kapacitás a kilövéskor: [accent]{0} launch.destination = Úti cél: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A mennyiségnek 0 és {0} között kell lennie. add = Hozzáadás... guardian = Őrző @@ -778,6 +780,7 @@ sectors.launch = Kilövés sectors.select = Kiválasztás sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]semmi (nap) +sectors.redirect = Redirect Launch Pads sectors.rename = Szektor átnevezése sectors.enemybase = [scarlet]Ellenséges bázis sectors.vulnerable = [scarlet]Sebezhető @@ -1749,6 +1752,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konténer block.launch-pad.name = Kilövőállás +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Földiegységgyár block.air-factory.name = Repülőgépgyár @@ -2198,7 +2203,9 @@ block.vault.description = Nagy mennyiséget tárol minden nyersanyagtípusból. block.container.description = Kis mennyiséget tárol minden nyersanyagtípusból. Növeli a támaszpont tárolókapacitását, ha egy támaszpont mellé van helyezve. A tartalma kirakodó segítségével nyerhető ki. block.unloader.description = Kirakodja a szomszédos épületekből a kiválasztott nyersanyagot. block.launch-pad.description = Nyersanyagokat juttat el más szektorokba. -block.launch-pad.details = Szuborbitális rendszer a nyersanyagok szektorok között történő szállítására. A teherkapszulák törékenyek, ezért nem képesek túlélni a légkörbe való visszatérést. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Változatos lövedékekkel lő az ellenségre. block.scatter.description = Ólom-, törmelék- vagy ólomüvegdarabokat lő az ellenséges légi egységekre. block.scorch.description = Megégeti az ellenség közeli földi egységeit. Kis távolságra nagyon hatékony. diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index ec05daa035c5..d19baae4e889 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -737,6 +737,8 @@ addall = Tambah Semua launch.from = Meluncurkan Dari: [accent]{0} launch.capacity = Kapasitas Barang yang Diluncurkan: [accent]{0} launch.destination = Destinasi: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Jumlah harus berupa angka di antara 0 dan {0}. add = Tambahkan... guardian = Penjaga @@ -778,6 +780,7 @@ sectors.launch = Luncurkan sectors.select = Pilih sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nihil (matahari) +sectors.redirect = Redirect Launch Pads sectors.rename = Ganti Nama Sektor sectors.enemybase = [scarlet]Markas Musuh sectors.vulnerable = [scarlet]Rawan diserang @@ -1745,6 +1748,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Kontainer block.launch-pad.name = Alas Peluncur +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Pabrik Unit Darat block.air-factory.name = Pabrik Unit Udara @@ -2194,7 +2199,9 @@ block.vault.description = Menyimpan semua tipe bahan dalam jumlah besar. Bahan d block.container.description = Menyimpan semua tipe bahan dalam jumlah kecil. Bahan dapat dikeluarkan dengan pembongkar muatan. block.unloader.description = Mengeluarkan bahan yang ditentukan dari bangunan. block.launch-pad.description = Meluncurkan muatan bahan ke sektor yang dipilih. -block.launch-pad.details = Sistem sub-orbital untuk transportasi sumber daya point-to-point. Pod muatan mudah rapuh dan tidak dapat bertahan bila masuk ke tujuan. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Menembakkan peluru bergantian ke musuh. block.scatter.description = Menembakkan gumpalan timah, rongsokan atau metaglass ke target udara. block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 8d47d2270111..bfc53dc95c3f 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -719,6 +719,8 @@ addall = Aggiungi Tutti launch.from = Partenza da: [accent]{0} launch.capacity = Capacità di lancio oggetti: [accent]{0} launch.destination = Destinazione: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Il valore deve essere un numero compresto tra 0 e {0}. add = Aggiungi... guardian = Guardiano @@ -759,6 +761,7 @@ sectors.launch = Lancia sectors.select = Seleziona sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nessuno (sole) +sectors.redirect = Redirect Launch Pads sectors.rename = Rinomina Settore sectors.enemybase = [scarlet]Base Nemica sectors.vulnerable = [scarlet]Vulnerabile @@ -1721,6 +1724,8 @@ block.meltdown.name = Fusione block.foreshadow.name = Tenebra block.container.name = Contenitore block.launch-pad.name = Ascensore Spaziale +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segmentatore block.ground-factory.name = Fabbrica Terrestre block.air-factory.name = Fabbrica Aerea @@ -2160,7 +2165,9 @@ block.vault.description = Immagazzina grandi quantità di oggetti di ogni tipo. block.container.description = Imagazzina piccole quantità di oggetti di ogni tipo. Può essere svuotato con uno scaricatore. block.unloader.description = Scarica l'oggetto selezionato dai blocchi adiacenti. block.launch-pad.description = Lancia lotti di oggetti ai settori selezionati. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Spara proiettili ai nemici. block.scatter.description = Spara agglomerati di piombo, rottami o vetro metallico ai nemici aerei. block.scorch.description = Incenerisce qualsiasi unità terrena nelle vicinanze. Altamente efficace a distanza ravvicinata. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 1bc25d60d55c..39fa76b3c69d 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -723,6 +723,8 @@ addall = すべて追加 launch.from = [accent]{0}[] からの発射 launch.capacity = 発射アイテム容量: [accent]{0} launch.destination = 目的地: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 値は 0 から {0} の間でなければなりません。 add = 追加... guardian = ガーディアン @@ -763,6 +765,7 @@ sectors.launch = 打ち上げ sectors.select = 選択 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無し (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = セクター名を変更 sectors.enemybase = [scarlet]敵基地 sectors.vulnerable = [scarlet]脆弱 @@ -1724,6 +1727,8 @@ block.meltdown.name = メルトダウン block.foreshadow.name = フォーシャドウ block.container.name = コンテナー block.launch-pad.name = 発射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = セグメント block.ground-factory.name = 陸軍工場 block.air-factory.name = 空軍工場 @@ -2164,7 +2169,9 @@ block.vault.description = 各種類のアイテムを大量に保管します。 block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。 block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。 block.launch-pad.description = 離脱することなく、アイテムを回収することができます。 -block.launch-pad.details = 資源を地点間で輸送するための軌道上システムです。ペイロードポッドは壊れやすく、再突入に耐えることができません。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 小さく安価なタレットです。 block.scatter.description = 中規模の対空型タレットです。敵に鉛やスクラップの塊、メタガラスを分散するように発射します。 block.scorch.description = 近くの地上の敵を燃やします。近距離だと非常に効果的です。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index e411f182b8c2..bdfe38eba033 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -737,6 +737,8 @@ addall = 모두 추가 launch.from = 출격 출발지: [accent]{0}[] launch.capacity = 출격 자원 용량: [accent]{0} launch.destination = 목적지: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. add = 추가... guardian = 수호자 @@ -778,6 +780,7 @@ sectors.launch = 출격 sectors.select = 선택 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]없음 (태양)[] +sectors.redirect = Redirect Launch Pads sectors.rename = 지역 이름 변경하기 sectors.enemybase = [scarlet]적 기지[] sectors.vulnerable = [scarlet]취약함[] @@ -1748,6 +1751,8 @@ block.meltdown.name = 멜트다운 block.foreshadow.name = 포어쉐도우 block.container.name = 컨테이너 block.launch-pad.name = 지역 자원 수송기 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 세그먼트 block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 @@ -2197,7 +2202,9 @@ block.vault.description = 각 종류별로 많은 양의 자원을 저장합니 block.container.description = 각 종류별로 적은 양의 자원을 저장합니다. 코어 옆에 배치하면 저장 용량을 확장합니다. 언로더를 사용하여 내용물을 빼낼 수 있습니다. block.unloader.description = 선택한 자원을 근처의 블록에서 빼냅니다. 수송 블록 및 포탑을 대상으로 작동하지 않습니다. block.launch-pad.description = 선택한 지역으로 자원을 출격합니다. -block.launch-pad.details = 지역간 자원 운송을 위한 보조 궤도 시스템. 화물 추진체는 부서지기 쉽고 재진입이 불가능합니다. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 적을 향해 번갈아 탄환을 발사합니다. block.scatter.description = 공중 목표물을 향해 납, 고철, 또는 강화유리 조각 덩어리를 발사합니다. block.scorch.description = 주변의 모든 지상 적을 불태웁니다. 근거리에서 매우 효과적입니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 3b1d27e42555..0ea1629f7f19 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -715,6 +715,8 @@ addall = Pridėti visus launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Kiekis turi būti numeris tarp 0 ir {0}. add = Pridėti... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Talpykla block.launch-pad.name = Paleidimo Aikštelė +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Laiko didelį kiekį skirtingų rūšių medžiagų. G block.container.description = Laiko nedidelį kiekį skirtingų rūšių medžiagų. Gali būti naudojamas iškroviklis daiktų paėmimui iš talpyklos. block.unloader.description = Paima resursus iš gretimų ne gabenimui skirtų pastatų. Paimamos medžiagos rūšis gali būti pakeista paspaudus ant iškroviklio. block.launch-pad.description = Paleidžia daiktų paketus be branduolio paleidimo. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Mažas ir pigus bokštas. Naudingas prieš antžeminius vienetus. block.scatter.description = Pagrindinis bokštas skirtas kovai su oro pajėgomis. Šaudo švino arba metalo laužo gabalais į priešus. block.scorch.description = Degina visus netoliese esančius priešus. Itin efektyvus artimame nuotolyje. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 472aa4fe4169..eae62546c8a6 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -726,6 +726,8 @@ addall = Voeg Alles Toe launch.from = Lanceren van: [accent]{0} launch.capacity = Lanceercapaciteit: [accent]{0} launch.destination = Bestemming: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. add = Voeg toe... guardian = Bewaker @@ -766,6 +768,7 @@ sectors.launch = Lanceer sectors.select = Selecteer sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]geen (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Hernoem Sector sectors.enemybase = [scarlet]Vijandelijke Basis sectors.vulnerable = [scarlet]Kwetsbaar @@ -1723,6 +1726,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Doos block.launch-pad.name = Lanceerplatform +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Grondfabriek block.air-factory.name = Luchtfabriek @@ -2162,7 +2167,9 @@ block.vault.description = Stores a large amount of items of each type. Adjacent block.container.description = Stores a small amount of items of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index bd82f52dccf2..abcfc472470c 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items of each type. An[lightg block.container.description = Stores a small amount of items of each type. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 5a1dcee809e6..40f933f2bd79 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -721,6 +721,8 @@ addall = Dodaj wszystkie launch.from = Wystrzelony z: [accent]{0} launch.capacity = Wystrzelona Ilość Przedmiotów: [accent]{0} launch.destination = Cel: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. add = Dodaj... guardian = Zdrowie Strażnika @@ -761,6 +763,7 @@ sectors.launch = Wystrzel sectors.select = Wybierz sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Żaden (Słońce) +sectors.redirect = Redirect Launch Pads sectors.rename = Zmień Nazwę Sektora sectors.enemybase = [scarlet]Baza Wroga sectors.vulnerable = [scarlet]Wrażliwy @@ -1730,6 +1733,8 @@ block.meltdown.name = Roztapiacz block.foreshadow.name = Zeus block.container.name = Kontener block.launch-pad.name = Wyrzutnia +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fabryka Naziemna block.air-factory.name = Fabryka Powietrzna @@ -2170,7 +2175,9 @@ block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaj block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Zawartość kontenera można wyciągnąć za pomocą ekstraktorów. block.unloader.description = Wyciąga przedmioty z przyległych bloków. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie. block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdzenia. -block.launch-pad.details = System sub-orbitalny do transportu zasobów z punktu do punktu. Ładunki są kruche i nie są w stanie przetrwać ponownego wejścia. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Standardowa wieżyczka obronna, strzelająca naprzemian pociskami w jednostki wroga. block.scatter.description = Rażąca wieża przeciwlotnicza, rozsiewająca śrut z ołowiu, złomu lub metaszkła w powietrzne jednostki wroga. block.scorch.description = Podpalająca wieżyczka obronna, szczególnie efektywna wobec grupek wrogów naziemnych. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index ac4bb5d662af..6aa08a326509 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -729,6 +729,8 @@ addall = Adicionar Todos launch.from = Lançando de: [accent]{0} launch.capacity = Capacidade para Lançamento de Itens: [accent]{0} launch.destination = Destino: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardião @@ -769,6 +771,7 @@ sectors.launch = Lançar sectors.select = Selecionar sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nenhum (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Renomear Setor sectors.enemybase = [scarlet]Base Inimiga sectors.vulnerable = [scarlet]Vulnerável @@ -1730,6 +1733,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contêiner block.launch-pad.name = Plataforma de Lançamento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fábrica de Unidades Terrestres block.air-factory.name = Fábrica de Unidades Aéreas @@ -2178,7 +2183,9 @@ block.vault.description = Armazena uma grande quantidade de itens de cada tipo. block.container.description = Armazena uma pequena quantidade de itens de cada tipo. Expande o armazenamento quando colocado próximo a um núcleo. O conteúdo pode ser recuperado com um descarregador. block.unloader.description = Descarrega o item selecionado dos blocos próximos. block.launch-pad.description = Lança lotes de itens para setores selecionados. -block.launch-pad.details = Sistema sub-orbital para transporte ponto-a-ponto de recursos. As cápsulas de carga são frágeis e incapazes de sobreviver à reentrada. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara balas alternadas em inimigos. block.scatter.description = Dispara tiros aglomerados de chumbo, sucata ou metavidro em unidades aéreas. block.scorch.description = Queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index d706d20b4159..a1880961a35c 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -715,6 +715,8 @@ addall = Adiciona tudo launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Fusão block.foreshadow.name = Foreshadow block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Carrega uma alta quantidade de itens. Usado para criar block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Uma torre pequena e barata. block.scatter.description = Uma torre anti aerea media. Joga montes de cobre ou sucata aos inimigos. block.scorch.description = Queima qualquer inimigo terrestre próximo. Altamente efetivo a curta distncia. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 72c30695262d..782fc17d946a 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -723,6 +723,8 @@ addall = Adaugă-le pe toate launch.from = Lansează Din: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destinație: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. add = Adaugă... guardian = Gardian @@ -763,6 +765,7 @@ sectors.launch = Lansare sectors.select = Selectează sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nimic (soarele) +sectors.redirect = Redirect Launch Pads sectors.rename = Redenumește Sectorul sectors.enemybase = [scarlet]Bază Inamică sectors.vulnerable = [scarlet]Vulnerabil @@ -1724,6 +1727,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Platformă de Lansare +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fabrică Unități Artilerie block.air-factory.name = Fabrică Unități Aeriene @@ -2164,7 +2169,9 @@ block.vault.description = Stochează o mare cantitate de materiale de orice tip. block.container.description = Stochează o mică cantitate de materiale de orice tip. Conținutul poate fi recuperat folosind un descărcător. block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puțin cele de transport. block.launch-pad.description = Lansează grămezi de materiale către sectoarele selectate. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Trage cu gloanțe alternante către inamici. block.scatter.description = Trage cu bucățele de plumb, fier vechi sau metasticlă către aeronavele inamice. block.scorch.description = Arde orice artilerie inamică din apropiere. Foarte eficient la distanță mică. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 6d84a3a7c43c..e0b6e3e0cb26 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -723,6 +723,8 @@ addall = Добавить всё launch.from = Запуск из: [accent]{0} launch.capacity = Вместимость запускаемого предмета: [accent]{0} launch.destination = Место назначения: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Количество должно быть числом между 0 и {0}. add = Добавить... guardian = Страж @@ -764,6 +766,7 @@ sectors.launch = Высадка sectors.select = Выбор sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нет (солнце) +sectors.redirect = Redirect Launch Pads sectors.rename = Переименовать сектор sectors.enemybase = [scarlet]Вражеская база sectors.vulnerable = [scarlet]Уязвим @@ -1724,6 +1727,8 @@ block.meltdown.name = Испепелитель block.foreshadow.name = Знамение block.container.name = Контейнер block.launch-pad.name = Пусковая площадка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика @@ -2166,7 +2171,9 @@ block.vault.description = Хранит большое количество пр block.container.description = Хранит небольшое количество предметов каждого типа. Предметы можно извлечь при помощи разгрузчика. block.unloader.description = Выгружает выбранный предмет из соседних блоков. block.launch-pad.description = Запускает партии предметов в выбранные секторы. -block.launch-pad.details = Суборбитальная система транспортировки ресурсов методом «point-to-point». Разгрузочные капсулы хрупки и не способны выжить при повторном входе. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Стреляет по врагам чередующимися пулями. block.scatter.description = Стреляет кусками свинца, металлолома или метастекла по вражеским воздушным единицам. block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективен на близком расстоянии. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index ae8d2c4b1d84..85015a32be9d 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -724,6 +724,8 @@ addall = Dodaj Sve launch.from = Lansirati Od: [accent]{0} launch.capacity = Lansirni Kapacitet Materijala: [accent]{0} launch.destination = Destinacija: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Količina mora biti između 0 i {0}. add = Dodaj... guardian = Čuvar @@ -764,6 +766,7 @@ sectors.launch = Lansiraj sectors.select = Izaberi sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nema (sunce) +sectors.redirect = Redirect Launch Pads sectors.rename = Preimenuj Sektor sectors.enemybase = [scarlet]Neprijateljska Baza sectors.vulnerable = [scarlet]Vulnerable @@ -1726,6 +1729,8 @@ block.meltdown.name = Istopitelj block.foreshadow.name = Predznak block.container.name = Kontejner block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Zemna Fabrika block.air-factory.name = Vazdušna Fabrika @@ -2167,7 +2172,9 @@ block.vault.description = Skladišti veliku količinu od svake vrste materijala. block.container.description = Skladišti malu količinu od svake vrste materijala. Contents can be retrieved with an unloader. block.unloader.description = Istovaruje određeni materijal iz obližnih blokova. block.launch-pad.description = Lansira bačve resursa u izabrani sektor. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Ispaljuje metke naizmenično na neprijatelje. block.scatter.description = Fires clumps of lead, scrap or metaglass flak at enemy aircraft. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 74d631f20a8c..ef78987e6774 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Lägg till... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Skjuta upp sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Byt namn på sektor sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items of each type. An unload block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping. block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 52d53ba41764..9d36a0dc4528 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -724,6 +724,8 @@ addall = เพิ่มทั้งหมด launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0} launch.capacity = ความจุไอเท็มลงจอด: [accent]{0} launch.destination = จุดหมายปลายทาง: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0} add = เพิ่ม... guardian = ผู้พิทักษ์ @@ -765,6 +767,7 @@ sectors.launch = ลงจอด sectors.select = เลือก sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ไม่มี (ดวงอาทิตย์) +sectors.redirect = Redirect Launch Pads sectors.rename = เปลี่ยนชื่อเซ็กเตอร์ sectors.enemybase = [scarlet]ฐานทัพศัตรู sectors.vulnerable = [scarlet]เสี่ยงภัย @@ -1728,6 +1731,8 @@ block.meltdown.name = เมลท์ดาวน์ block.foreshadow.name = ฟอร์ชาโดว์ block.container.name = ตู้เก็บของ block.launch-pad.name = ฐานส่งทรัพยากร +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = เซ็กเมนต์ block.ground-factory.name = โรงงานยูนิตพื้นดิน block.air-factory.name = โรงงานยูนิตอากาศ @@ -2177,7 +2182,9 @@ block.vault.description = เก็บไอเท็มแต่ละชนิ block.container.description = เก็บไอเท็มแต่ละชนิดได้นิดหน่อย สามารถใช้ตัวถ่ายไอเท็มในการดึงไอเท็มออกมาได้ block.unloader.description = ดึงไอเท็มที่กำหนดไว้ออกมาจากบล็อกใกล้เคียง block.launch-pad.description = ส่งไอเท็มเป็นชุดๆ ไปยังเซ็กเตอร์ที่กำหนดไว้ -block.launch-pad.details = ระบบขนส่งทรัพยากรวงโคจรย่อยจากจุดหนึ่งไปอีกจุดหนึ่ง แคปซูลบรรทุกทรัพยากรนั้นเปราะบางและไม่สามารถทนความร้อนจากชั้นบรรยากาศได้ +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = ป้อมปืนขนาดเล็ก ยิงกระสุนที่อยู่ในตัวมันใส่เป้าหมายศัตรู block.scatter.description = ยิงก้อนตะกั่ว เศษเหล็กหรือกระจกเมต้าใส่ยานบินศัตรูที่อยู่ใกล้เคียง block.scorch.description = เผาศัตรูพื้นดินที่อยู่ใกล้ๆ มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index ea2cec636e29..f8d4fbec2674 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items. Use it for creating bu block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 5f41c6e7f6c4..29ad395959f3 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -723,6 +723,8 @@ addall = Hepsini Ekle launch.from = [accent]{0} dan fırlatılıyor. launch.capacity = Fırlatılan Malzeme Kapasitesi: [accent]{0} launch.destination = Varış Yeri: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. add = Ekle... guardian = Gardiyan @@ -763,6 +765,7 @@ sectors.launch = Fırlat sectors.select = Seç sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]yok (güneş) +sectors.redirect = Redirect Launch Pads sectors.rename = Sektörü Yeniden Adlandır sectors.enemybase = [scarlet]Düşman Üs sectors.vulnerable = [scarlet]Dayanıksız @@ -1722,6 +1725,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konteyner block.launch-pad.name = Fıralatış Rampası +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Yer Birimi Fabrikası block.air-factory.name = Hava Birimi Fabrikası @@ -2164,7 +2169,9 @@ block.vault.description = Her materyalden az miktarda saklar. Materyalleri kasad block.container.description = Her materyalden az miktarda saklar. Materyalleri konteynerden almak için bir boşaltıcı bloğu kullanılabilir. block.unloader.description = Materyalleri bir konteyner, depo veya merkezden çıkarıp; bir konveyöre veya dibindeki bir bloğa koyar. Çıkardığı materyal türü dokunularak değiştirilebilir. block.launch-pad.description = Başka Bir Sektöre item gönderir. -block.launch-pad.details = Yörüngesel Nokta-dan-Nokta ya malzeme aktarım sistemi. Kargo Kapsülleri dayanıksızdır ve yörüngeye girerken parçalanırlar. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Küçük, ucuz bir taret. Yer birimlerine karşı etkilidir. block.scatter.description = Önemli bir uçaksavar tareti. Düşman birimlerine hurda ya da kurşun uçaksavar mermileri atar. block.scorch.description = Etrafındaki düşmanları ateşe verir. Yakın mesafede çok etkilidir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 97c813a2cf6a..18cdac3ac7cf 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -731,6 +731,8 @@ addall = Додати все launch.from = Запуск з [accent]{0} launch.capacity = Місткість предметів, що запускаються: [accent]{0} launch.destination = Пункт призначення: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Кількість має бути числом між 0 та {0}. add = Додати… guardian = Вартовий @@ -772,6 +774,7 @@ sectors.launch = Запустити sectors.select = Вибрати sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічого (сонце) +sectors.redirect = Redirect Launch Pads sectors.rename = Перейменування сектору sectors.enemybase = [scarlet]Ворожа база sectors.vulnerable = [scarlet]Уразливий @@ -1735,6 +1738,8 @@ block.meltdown.name = Розплавлювач block.foreshadow.name = Передвісник block.container.name = Сховище block.launch-pad.name = Пусковий майданчик +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод @@ -2187,7 +2192,9 @@ block.vault.description = Англійська назва: Vault\nЗберіга block.container.description = Англійська назва: Container\nЗберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Англійська назва: Unloader\nВивантажує предмети з найближчих блоків block.launch-pad.description = Англійська назва: Launch Pad\nЗапускає партії предметів без необхідності запуску ядра. -block.launch-pad.details = Суборбітальна система для транспортування ресурсів від точки А до точки Б. Корпуси вантажу крихкі й не здатні вижити при повторному вході. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Англійська назва: Duo\nВистрілює чергами куль у ворогів. block.scatter.description = Англійська назва: Scatter\nВистрілює скупченням свинцю, брухту чи метаскла в повітряних противників. block.scorch.description = Англійська назва: Scorch\nПідпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 09ab6cbb4cb5..89d71f1417c5 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -737,6 +737,8 @@ addall = Thêm tất cả launch.from = Đang phóng từ: [accent]{0} launch.capacity = Sức chứa vật phẩm khi phóng: [accent]{0} launch.destination = Đích đến: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}. add = Thêm... guardian = Trùm @@ -778,6 +780,7 @@ sectors.launch = Phóng sectors.select = Chọn sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]không có (mặt trời) +sectors.redirect = Redirect Launch Pads sectors.rename = Đổi tên khu vực sectors.enemybase = [scarlet]Căn cứ địch sectors.vulnerable = [scarlet]Dễ bị tổn thất @@ -1749,6 +1752,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Thùng chứa block.launch-pad.name = Bệ phóng +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Nhà máy Bộ binh block.air-factory.name = Nhà máy Không quân @@ -2198,7 +2203,9 @@ block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. M block.container.description = Lưu trữ lượng nhỏ vật phẩm mỗi loại. Mở rộng kho lưu trữ khi đặt kế bên một lõi. Nội dung có thể được lấy ra với điểm dỡ hàng. block.unloader.description = Lấy các vật phẩm được chọn từ các khối gần đó. block.launch-pad.description = Phóng lô vật phẩm vào khu vực được chọn. -block.launch-pad.details = Hệ thống quỹ đạo phụ để vận chuyển tài nguyên từ điểm này sang điểm khác. Các nhóm khối hàng rất dễ vỡ và không có khả năng tồn tại khi tái nhập. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Bắn xen kẽ đạn vào kẻ địch. block.scatter.description = Bắn khối chì, phế liệu hoặc thuỷ tinh vào kẻ địch trên không. block.scorch.description = Đốt mọi kẻ địch trên mặt đất ở gần. Hiệu quả cao ở tầm gần. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6858fbc7e33b..c9e7979951b9 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -732,6 +732,8 @@ addall = 全部装运 launch.from = 发射自:[accent]{0} launch.capacity = 装运物品: [accent]{0} launch.destination = 目的地:{0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 数量必须在0到{0}之间。 add = 添加… guardian = Boss @@ -773,6 +775,7 @@ sectors.launch = 发射 sectors.select = 选择 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]无(自动销毁) +sectors.redirect = Redirect Launch Pads sectors.rename = 重命名区块 sectors.enemybase = [scarlet]敌方基地 sectors.vulnerable = [scarlet]易受攻击 @@ -1737,6 +1740,8 @@ block.meltdown.name = 熔毁 block.foreshadow.name = 厄兆 block.container.name = 容器 block.launch-pad.name = 发射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 裂解 block.ground-factory.name = 陆军工厂 block.air-factory.name = 空军工厂 @@ -2187,7 +2192,9 @@ block.vault.description = 大量存储各种类型的物品。 可使用装卸 block.container.description = 少量存储各种类型的物品。 可使用装卸器卸载物品。 block.unloader.description = 从周围的建筑卸载指定物品。 block.launch-pad.description = 将货物发射至指定区块。 -block.launch-pad.details = 用于资源点对点运输的亚轨道系统。 载荷仓很脆弱,再入大气时无法保留。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 交替向敌人发射子弹。 block.scatter.description = 向敌方战机发射铅、 废料或钢化玻璃高射炮弹。 block.scorch.description = 焚烧任何靠近它的地面敌人。 近距离内十分有效。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 7a2fdd19d996..24ab1fc1d503 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -729,6 +729,8 @@ addall = 全部加入 launch.from = 發射來源:[accent]{0} launch.capacity = 發射物品容量:[accent]{0} launch.destination = 目的地:{0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 數值必須介於 0 到 {0}。 add = 新增…… guardian = 頭目 @@ -769,6 +771,7 @@ sectors.launch = 發射 sectors.select = 選取 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無(太陽) +sectors.redirect = Redirect Launch Pads sectors.rename = 重新命名區域 sectors.enemybase = [scarlet]敵方基地 sectors.vulnerable = [scarlet]易受攻擊 @@ -1732,6 +1735,8 @@ block.meltdown.name = 熔毀砲 block.foreshadow.name = 狙擊砲 block.container.name = 容器 block.launch-pad.name = 小型發射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 片段 block.ground-factory.name = 地面工廠 block.air-factory.name = 航空工廠 @@ -2176,7 +2181,9 @@ block.vault.description = 儲存大量的每一種物品。當物品需求非恆 block.container.description = 儲存少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。 block.unloader.description = 將物品從容器、倉庫或核心卸載到傳輸帶上或直接卸貨到相鄰的方塊中。透過點擊卸貨器來更改要卸貨的物品類型。 block.launch-pad.description = 無需發射核心即可直接發射物品。 -block.launch-pad.details = 用於點對點運輸的亞軌道系統。載荷艙很脆弱,進入大氣層時會損毁。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 一種小而便宜的砲塔。 block.scatter.description = 不可或缺的中型防空砲塔。向敵方單位噴射鉛塊、廢料或是鋼化玻璃彈片。 block.scorch.description = 燃燒所有靠近它的地面敵人。在近距離非常有效。 From e4d56d8ce83e88f3a86fd951ceb4ca80a9f14414 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 18:15:34 -0500 Subject: [PATCH 17/26] Fixed #10455 --- core/src/mindustry/ui/dialogs/DatabaseDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 10e2ab9ddb54..81fbbf98958e 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -86,7 +86,7 @@ void rebuild(){ all.table(t -> { int i = 0; for(var content : allTabs){ - t.button(content == Planets.sun ? Icon.eyeSmall : content instanceof Planet ? Icon.planet : new TextureRegionDrawable(content.uiIcon), Styles.clearNoneTogglei, iconMed, () -> { + t.button(content == Planets.sun ? Icon.eyeSmall : content instanceof Planet p ? Icon.icons.get(p.icon, Icon.commandRally) : new TextureRegionDrawable(content.uiIcon), Styles.clearNoneTogglei, iconMed, () -> { tab = content; rebuild(); }).size(50f).checked(b -> tab == content).tooltip(content == Planets.sun ? "@all" : content.localizedName).with(but -> { From 24c1bbb870454a313dad66967ea1b562c255d581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D1=88=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA?= <127457914+VikoMin@users.noreply.github.com> Date: Mon, 3 Feb 2025 06:15:51 +0700 Subject: [PATCH 18/26] Update servers_v7.json (#10448) --- servers_v7.json | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index 3117b6c24787..92e4d1147940 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -282,18 +282,16 @@ { "name": "FrostHeaven", "address": [ - "frost-heaven.ru", - "frost-heaven.ru:6568", - "91.200.150.116", - "frost-heaven.ru:6570", - "mindustry.frost-heaven.ru:6567", - "mindustry.frost-heaven.ru:6568", - "mindustry.frost-heaven.ru:6569", - "mindustry.frost-heaven.ru:6570", - "mindustry.frost-heaven.ru:6571", - "mindustry.frost-heaven.ru:6597", - "mindustry.frost-heaven.ru:6598", - "mindustry.frost-heaven.ru:6599" + "194.164.245.218:6567", + "194.164.245.218:6568", + "194.164.245.218:6569", + "194.164.245.218:6570", + "194.164.245.218:6571", + "194.164.245.218:6597", + "194.164.245.218:6598", + "194.164.245.218:6599", + "194.164.245.218:6600", + "194.164.245.218:6601" ] }, { From a7dda7612c66b4c92a20e1644a104b9acd8afd94 Mon Sep 17 00:00:00 2001 From: grely <182034229+grelylrz@users.noreply.github.com> Date: Mon, 3 Feb 2025 04:15:58 +0500 Subject: [PATCH 19/26] Update servers_v7.json (#10453) --- servers_v7.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 92e4d1147940..e3d65239f009 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -6,7 +6,12 @@ "121.127.37.17:6568", "121.127.37.17:6569", "121.127.37.17:6570", - "121.127.37.17:6571" + "121.127.37.17:6571", + "121.127.37.17:6572", + "194.164.245.218:6570", + "194.164.245.218:6571", + "194.164.245.218:6572", + "194.164.245.218:6573" ] }, { From ccda69bda041ad015f83827711d0687b09bf74f3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 20:33:12 -0500 Subject: [PATCH 20/26] Minor launch/landing pad tweaks/fixes --- core/assets/bundles/bundle.properties | 4 ++-- core/src/mindustry/content/Blocks.java | 4 ++-- core/src/mindustry/game/SectorInfo.java | 2 +- core/src/mindustry/world/blocks/campaign/LandingPad.java | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6e8e43183131..59a147aff11d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -2142,7 +2142,7 @@ block.door.description = A wall that can be opened and closed. block.door-large.description = A wall that can be opened and closed. block.mender.description = Periodically repairs blocks in its vicinity.\nOptionally uses silicon to boost range and efficiency. block.mend-projector.description = Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. -block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. +block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. Does not stack. block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric increases shield size. block.shock-mine.description = Releases electric arcs upon enemy unit contact. block.conveyor.description = Transports items forward. @@ -2228,7 +2228,7 @@ block.parallax.description = Fires a tractor beam that pulls in air targets, dam block.tsunami.description = Fires powerful streams of liquid at enemies. Automatically extinguishes fires when supplied with water. block.silicon-crucible.description = Refines silicon from sand and coal, using pyratite as an additional heat source. More efficient in hot locations. block.disassembler.description = Separates slag into trace amounts of exotic mineral components at low efficiency. Can produce thorium. -block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. +block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. Does not stack. block.payload-conveyor.description = Moves large payloads, such as units from factories. Magnetic. Usable in zero-G environments. block.payload-router.description = Splits input payloads into 3 output directions. Functions as a sorter when a filter is set. Magnetic. Usable in zero-G environments. block.ground-factory.description = Produces ground units. Output units can be used directly, or moved into reconstructors for upgrading. diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index db7599635359..3455a893a9f3 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6382,8 +6382,8 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ itemCapacity = 100; coolingEffect = new RadialEffect(Fx.steamCoolSmoke, 4, 90f, 9.5f, 180f); - liquidCapacity = 5000f; - consumeLiquidAmount = 2500f; + liquidCapacity = 4000f; + consumeLiquidAmount = 2000f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 8673e8206dfe..d7a3bf367df4 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -31,7 +31,7 @@ public class SectorInfo{ /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); //TODO: there is an obvious exploit with launch pad redirection here; pads can be redirected after leaving a sector, which doesn't update calculations. - /** Import statistics, based on what launch pads are actually receiving. TODO: this is not actually used or displayed anywhere (yet) */ + /** Import statistics, based on what launch pads are actually receiving. */ public ObjectMap imports = new ObjectMap<>(); /** Items stored in all cores. */ public ItemSeq items = new ItemSeq(); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 9b7cd5dfbd24..8ff6367c0ec5 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -58,6 +58,7 @@ public LandingPad(String name){ update = true; configurable = true; acceptsItems = false; + canOverdrive = false; //overdriving can't do anything meaningful besides decrease cooldown, which is very small anyway, so don't bother emitLight = true; lightRadius = 90f; From 55e32f9580873ae3160a3b28254f38dc5c5cdd1d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 23:19:43 -0500 Subject: [PATCH 21/26] Fixed some landing pad state not saving / Renamed pad 'heat' to 'cooldown' --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/content/Blocks.java | 2 +- .../world/blocks/campaign/LandingPad.java | 19 +++++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 59a147aff11d..a5e15cc7e326 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1114,6 +1114,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3455a893a9f3..fc95d6916441 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6376,7 +6376,7 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ }}; landingPad = new LandingPad("landing-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 300, Items.graphite, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); size = 4; itemCapacity = 100; diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 8ff6367c0ec5..ab8a62135290 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -38,7 +38,7 @@ public class LandingPad extends Block{ public @Load(value = "@-pod", fallback = "advanced-launch-pad-pod") TextureRegion podRegion; public float arrivalDuration = 150f; - public float cooldownTime = 180f; + public float cooldownTime = 150f; public float consumeLiquidAmount = 100f; public Liquid consumeLiquid = Liquids.water; @@ -95,7 +95,7 @@ public void setBars(){ addLiquidBar(consumeLiquid); //TODO: does cooldown even need to exist? - addBar("heat", (LandingPadBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.cooldown)); + addBar("cooldown", (LandingPadBuild entity) -> new Bar("bar.cooldown", Pal.lightOrange, () -> entity.cooldown)); } @Override @@ -377,12 +377,23 @@ public boolean acceptItem(Building source, Item item){ return config; } + @Override + public byte version(){ + return 1; + } + @Override public void read(Reads read, byte revision){ super.read(read, revision); config = TypeIO.readItem(read); priority = read.i(); cooldown = read.f(); + + if(revision >= 1){ + arriving = TypeIO.readItem(read); + arrivingTimer = read.f(); + liquidRemoved = read.f(); + } } @Override @@ -391,6 +402,10 @@ public void write(Writes write){ TypeIO.writeItem(write, config); write.i(priority); write.f(cooldown); + + TypeIO.writeItem(write, arriving); + write.f(arrivingTimer); + write.f(liquidRemoved); } } } From 611d866d68747d55e0f4309f3640ac0db880e8a5 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 3 Feb 2025 04:20:46 +0000 Subject: [PATCH 22/26] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 6310fc1e396a..3688ddcf6252 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1082,6 +1082,7 @@ bar.capacity = Умяшчальнасць: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Вадкасці bar.heat = Нагрэў +bar.cooldown = Cooldown bar.instability = Нестабільнасць bar.heatamount = Нагрэў: {0} bar.heatpercent = Нагрэў: {0} ({1}%) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 7fdd12a0eeab..8e792e0f62c6 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1093,6 +1093,7 @@ bar.capacity = Капацитет: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Течност bar.heat = Топлина +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index f7e67e49e73b..a8b0e0b9389f 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1096,6 +1096,7 @@ bar.capacity = Capacitat: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquid bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Inestabilitat bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1} %) diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 63e5a3244369..dbf1e2a80fb5 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1095,6 +1095,7 @@ bar.capacity = Kapacita: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Chlazení bar.heat = Teplo +bar.cooldown = Cooldown bar.instability = Nestabilita bar.heatamount = Teplo: {0} bar.heatpercent = Teplo: {0} ({1}%) diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index bc36d38ecbbc..81afaadea43e 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1084,6 +1084,7 @@ bar.capacity = Kapacitet: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Væske bar.heat = Varme +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 79a4797026e7..b792aba5ac54 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1106,6 +1106,7 @@ bar.capacity = Kapazität: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Flüssigkeit bar.heat = Hitze +bar.cooldown = Cooldown bar.instability = Instabilität bar.heatamount = Hitze: {0} bar.heatpercent = Hitze: {0} ({1}%) diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 6a074dec4647..20a54101b801 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1102,6 +1102,7 @@ bar.capacity = Capacidad: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquido bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Inestabilidad bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1}%) diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index a6e54999b20a..eed737a07e4b 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1084,6 +1084,7 @@ bar.capacity = Mahutavus: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vedelik bar.heat = Kuumus +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index cc29cc99c1ee..57d1309e7b42 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1086,6 +1086,7 @@ bar.capacity = Edukiera: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Likidoa bar.heat = Beroa +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 2dd291059acd..b0fd5630aba3 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1083,6 +1083,7 @@ bar.capacity = Kapasiteetti: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Neste bar.heat = Lämpö +bar.cooldown = Cooldown bar.instability = Epävakaus bar.heatamount = Lämpö: {0} bar.heatpercent = Lämpö: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 4a40279051c7..245130b38ab0 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1083,6 +1083,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index c041519d6dd4..a1350d6bf795 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1108,6 +1108,7 @@ bar.capacity = Capacité: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquides bar.heat = Chaleur +bar.cooldown = Cooldown bar.instability = Instabilité bar.heatamount = Chaleur: {0} bar.heatpercent = Chaleur: {0} ({1}%) diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 2931920375af..033c760b3580 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1114,6 +1114,7 @@ bar.capacity = Tárhely: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Folyadék bar.heat = Hő +bar.cooldown = Cooldown bar.instability = Instabilitás bar.heatamount = Hő: {0} bar.heatpercent = Hő: {0} ({1}%) diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index d19baae4e889..39f2be18ec89 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1111,6 +1111,7 @@ bar.capacity = Kapasitas: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Zat Cair bar.heat = Panas +bar.cooldown = Cooldown bar.instability = Instabilitas bar.heatamount = Panas: {0} bar.heatpercent = Panas: {0} ({1}%) diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bfc53dc95c3f..d1f859e99992 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1089,6 +1089,7 @@ bar.capacity = Capacità: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquido bar.heat = Calore +bar.cooldown = Cooldown bar.instability = Instabilità bar.heatamount = Calore: {0} bar.heatpercent = Calore: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 39fa76b3c69d..10cb04c305ce 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1095,6 +1095,7 @@ bar.capacity = 容量: {0} bar.unitcap = {0} {1}/{2} bar.liquid = 液体 bar.heat = 熱 +bar.cooldown = Cooldown bar.instability = 不安定度 bar.heatamount = 熱: {0} bar.heatpercent = 熱: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index bdfe38eba033..e8f3e27623c6 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1113,6 +1113,7 @@ bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} bar.liquid = 액체 bar.heat = 발열 +bar.cooldown = Cooldown bar.instability = 불안정 bar.heatamount = 열: {0} bar.heatpercent = 열: {0} ({1}%) diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 0ea1629f7f19..2accf92543f4 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1084,6 +1084,7 @@ bar.capacity = Talpumas: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Skystis bar.heat = Karščiai +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index eae62546c8a6..418133003a9e 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1096,6 +1096,7 @@ bar.capacity = Capaciteit: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vloeistof bar.heat = Warmte +bar.cooldown = Cooldown bar.instability = Instabiliteit bar.heatamount = Warmte: {0} bar.heatpercent = Warmte: {0} ({1}%) diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index abcfc472470c..6350e68df971 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 40f933f2bd79..e459a7cd2991 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1093,6 +1093,7 @@ bar.capacity = Pojemność: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Płyn bar.heat = Ciepło +bar.cooldown = Cooldown bar.instability = Niestabilność bar.heatamount = Ciepło: {0} bar.heatpercent = Ciepło: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 6aa08a326509..2190055f550c 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1103,6 +1103,7 @@ bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquido bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Instabilidade bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index a1880961a35c..bad8364fe6fd 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquido bar.heat = Aquecimento +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 782fc17d946a..f1800a2dcf7b 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1095,6 +1095,7 @@ bar.capacity = Capacitate: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Lichid bar.heat = Căldură +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e0b6e3e0cb26..885fcfc0e0e3 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1095,6 +1095,7 @@ bar.capacity = Вместимость: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Жидкости bar.heat = Нагрев +bar.cooldown = Cooldown bar.instability = Нестабильность bar.heatamount = Нагрев: {0} bar.heatpercent = Нагрев: {0} ({1}%) diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 85015a32be9d..f7808473783a 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1097,6 +1097,7 @@ bar.capacity = Kapacitet: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Tečnost bar.heat = Toplota +bar.cooldown = Cooldown bar.instability = Nestabilnost bar.heatamount = Količina Toplote: {0} bar.heatpercent = Količina Toplote: {0} ({1}%) diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index ef78987e6774..cef3a8e71099 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vätska bar.heat = Hetta +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 9d36a0dc4528..dd89b0046c9c 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1098,6 +1098,7 @@ bar.capacity = ความจุ: {0} bar.unitcap = {0} {1}/{2} bar.liquid = ของเหลว bar.heat = ความร้อน +bar.cooldown = Cooldown bar.instability = ความไม่เสถียร bar.heatamount = ความร้อน: {0} bar.heatpercent = ความร้อน: {0} ({1}%) diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index f8d4fbec2674..2dc3da2f3d40 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 29ad395959f3..35d39455ffb6 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1093,6 +1093,7 @@ bar.capacity = Kapasite: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Sıvı bar.heat = Isı +bar.cooldown = Cooldown bar.instability = Dengesizlik bar.heatamount = Isı: {0} bar.heatpercent = Isı: {0} ({1}%) diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 18cdac3ac7cf..cc0243b3ed24 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1104,6 +1104,7 @@ bar.capacity = Місткість: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Рідина bar.heat = Нагрівання +bar.cooldown = Cooldown bar.instability = Нестабільність bar.heatamount = Нагрівання: {0} bar.heatpercent = Нагрівання: {0} ({1}%) diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 89d71f1417c5..7aa6ff6a3b74 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1114,6 +1114,7 @@ bar.capacity = Sức chứa: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Chất lỏng bar.heat = Nhiệt lượng +bar.cooldown = Cooldown bar.instability = Bất ổn định bar.heatamount = Nhiệt lượng: {0} bar.heatpercent = Nhiệt lượng: {0} ({1}%) diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index c9e7979951b9..6e8ae176d940 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1106,6 +1106,7 @@ bar.capacity = 容量:{0} bar.unitcap = {0} {1}/{2} bar.liquid = 液体 bar.heat = 热量 +bar.cooldown = Cooldown bar.instability = 不稳定性 bar.heatamount = 热量: {0} bar.heatpercent = 热量: {0} ({1}%) diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 24ab1fc1d503..d41dd8aaebd7 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1101,6 +1101,7 @@ bar.capacity = 容量:{0} bar.unitcap = {0} {1}/{2} bar.liquid = 液體 bar.heat = 熱 +bar.cooldown = Cooldown bar.instability = 不穩定度 bar.heatamount = 熱: {0} bar.heatpercent = 熱: {0} ({1}%) From 4e225f91909b87f29c3ae67b3c5e9d5e8f677a29 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 19:27:08 -0500 Subject: [PATCH 23/26] Internal support for legacy launch pads (hidden) --- core/assets/bundles/bundle.properties | 3 ++ core/src/mindustry/content/Blocks.java | 10 ++--- core/src/mindustry/content/Planets.java | 1 + core/src/mindustry/game/CampaignRules.java | 1 + core/src/mindustry/game/SectorInfo.java | 3 ++ core/src/mindustry/game/Universe.java | 43 ++++++++++++++++--- core/src/mindustry/type/Planet.java | 2 + .../ui/dialogs/CampaignRulesDialog.java | 5 +++ .../world/blocks/campaign/LandingPad.java | 11 +++-- .../world/blocks/campaign/LaunchPad.java | 4 +- .../mindustry/world/meta/BuildVisibility.java | 2 + 11 files changed, 69 insertions(+), 16 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a5e15cc7e326..6bd6affbf85e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index fc95d6916441..a3029ec77b62 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6354,7 +6354,7 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ //region campaign launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, BuildVisibility.debugOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.legacyLaunchPadOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); size = 3; itemCapacity = 100; launchTime = 60f * 20; @@ -6364,7 +6364,7 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ }}; advancedLaunchPad = new LaunchPad("advanced-launch-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 250, Items.lead, 300, Items.titanium, 200)); + requirements(Category.effect, BuildVisibility.notLegacyLaunchPadOnly, with(Items.copper, 350, Items.silicon, 250, Items.lead, 300, Items.titanium, 200)); size = 4; itemCapacity = 100; launchTime = 60f * 30; @@ -6376,14 +6376,14 @@ Items.surgeAlloy, new BasicBulletType(7f, 250){{ }}; landingPad = new LandingPad("landing-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); + requirements(Category.effect, BuildVisibility.notLegacyLaunchPadOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); size = 4; itemCapacity = 100; coolingEffect = new RadialEffect(Fx.steamCoolSmoke, 4, 90f, 9.5f, 180f); - liquidCapacity = 4000f; - consumeLiquidAmount = 2000f; + liquidCapacity = 3000f; + consumeLiquidAmount = 1500f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index d23ab25f4736..f44c61729113 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -134,6 +134,7 @@ public static void load(){ launchCapacityMultiplier = 0.5f; sectorSeed = 2; allowWaves = true; + allowLegacyLaunchPads = true; allowWaveSimulation = true; allowSectorInvasion = true; allowLaunchSchematics = true; diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index 7ed813cab7a6..0ff9a7122ca1 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -8,6 +8,7 @@ public class CampaignRules{ public boolean showSpawns; public boolean sectorInvasion; public boolean randomWaveAI; + public boolean legacyLaunchPads; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index d7a3bf367df4..0d8e8e1f060f 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -92,6 +92,9 @@ public class SectorInfo{ public ObjectFloatMap importCooldownTimers = new ObjectFloatMap<>(); public @Nullable transient float[] importRateCache; + /** Temporary seq for last imported items. Do not use. */ + public transient ItemSeq lastImported = new ItemSeq(); + /** Counter refresh state. */ private transient Interval time = new Interval(); /** Core item storage input/output deltas. */ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 94945eae5526..33fcc893c175 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -168,6 +168,33 @@ public void runTurn(){ continue; } + if(planet.campaignRules.legacyLaunchPads){ + //first pass: clear import stats + for(Sector sector : planet.sectors){ + if(sector.hasBase() && !sector.isBeingPlayed()){ + sector.info.lastImported.clear(); + } + } + + //second pass: update export & import statistics + for(Sector sector : planet.sectors){ + if(sector.hasBase() && !sector.isBeingPlayed()){ + + //export to another sector + if(sector.info.destination != null){ + Sector to = sector.info.destination; + if(to.hasBase() && to.planet == planet){ + ItemSeq items = new ItemSeq(); + //calculated exported items to this sector + sector.info.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * sector.getProductionScale()))); + to.addItems(items); + to.info.lastImported.add(items); + } + } + } + } + } + //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ @@ -229,13 +256,15 @@ public void runTurn(){ //add production, making sure that it's capped 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.info.export.each((item, stat) -> { - if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ - //cap export by import when production is negative. - //TODO remove - stat.mean = Math.min(0f, stat.mean); - } - }); + if(planet.campaignRules.legacyLaunchPads){ + sector.info.export.each((item, stat) -> { + if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ + //cap export by import when production is negative. + //TODO remove + stat.mean = Math.min(sector.info.lastImported.get(item) / (float)newSecondsPassed, stat.mean); + } + }); + } //prevent negative values with unloaders sector.info.items.checkNegative(); diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 7ef88ed9e45f..abf389716843 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -116,6 +116,8 @@ public class Planet extends UnlockableContent{ public boolean allowWaveSimulation = false; /** Whether to simulate sector invasions from enemy bases. */ public boolean allowSectorInvasion = false; + /** If true, legacy launch pads can be enabled. */ + public boolean allowLegacyLaunchPads = false; /** If true, sectors saves are cleared when lost. */ public boolean clearSectorOnLose = false; /** Multiplier for enemy rebuild speeds; only applied in campaign (not standard rules) */ diff --git a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java index 55e6fda0e727..cebe4c72b301 100644 --- a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java @@ -68,6 +68,11 @@ void rebuild(){ check("@rules.fog", b -> rules.fog = b, () -> rules.fog); check("@rules.showspawns", b -> rules.showSpawns = b, () -> rules.showSpawns); check("@rules.randomwaveai", b -> rules.randomWaveAI = b, () -> rules.randomWaveAI); + + //TODO: this is intentionally hidden until the new mechanics have been well-tested. I don't want people immediately switching to the old mechanics + if(planet.allowLegacyLaunchPads){ + // check("@rules.legacylaunchpads", b -> rules.legacyLaunchPads = b, () -> rules.legacyLaunchPads); + } }).growY(); } diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index ab8a62135290..d8b491d3451d 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -292,7 +292,7 @@ public void updateTile(){ cooldown = Mathf.clamp(cooldown); } - if(config != null && state.isCampaign()){ + if(config != null && state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads){ if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ @@ -344,9 +344,14 @@ public void display(Table table){ table.row(); table.label(() -> { - if(config == null || !state.isCampaign()){ - return ""; + if(!state.isCampaign()) return ""; + + if(state.getPlanet().campaignRules.legacyLaunchPads){ + return Core.bundle.get("landingpad.legacy.disabled"); } + + if(config == null) return ""; + int sources = 0; float perSecond = 0f; for(var s : state.getPlanet().sectors){ diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index cb2014ee98b6..80fb16c35309 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -296,7 +296,9 @@ public void remove(){ Events.fire(new LaunchItemEvent(stack)); } - destsec.addItems(dest); + if(state.getPlanet().campaignRules.legacyLaunchPads){ + destsec.addItems(dest); + } } } } diff --git a/core/src/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java index 5572b3cdf2bb..06d08323f255 100644 --- a/core/src/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -15,6 +15,8 @@ public class BuildVisibility{ worldProcessorOnly = new BuildVisibility(() -> Vars.state.rules.editor || Vars.state.rules.allowEditWorldProcessors), sandboxOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.infiniteResources), campaignOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.isCampaign()), + legacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || Vars.state.isCampaign() && Vars.state.getPlanet().campaignRules.legacyLaunchPads) && Blocks.advancedLaunchPad != null && Blocks.advancedLaunchPad.unlocked()), + notLegacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || Vars.state.isCampaign() && !Vars.state.getPlanet().campaignRules.legacyLaunchPads)), lightingOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.lighting || Vars.state.isCampaign()), ammoOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.unitAmmo), fogOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.fog || Vars.state.rules.editor); From 7bd8b9beaaea1699d5b90286dd693df38ed2d1cf Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 00:28:10 +0000 Subject: [PATCH 24/26] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 3 +++ core/assets/bundles/bundle_bg.properties | 3 +++ core/assets/bundles/bundle_ca.properties | 3 +++ core/assets/bundles/bundle_cs.properties | 3 +++ core/assets/bundles/bundle_da.properties | 3 +++ core/assets/bundles/bundle_de.properties | 3 +++ core/assets/bundles/bundle_es.properties | 3 +++ core/assets/bundles/bundle_et.properties | 3 +++ core/assets/bundles/bundle_eu.properties | 3 +++ core/assets/bundles/bundle_fi.properties | 3 +++ core/assets/bundles/bundle_fil.properties | 3 +++ core/assets/bundles/bundle_fr.properties | 3 +++ core/assets/bundles/bundle_hu.properties | 3 +++ core/assets/bundles/bundle_id_ID.properties | 3 +++ core/assets/bundles/bundle_it.properties | 3 +++ core/assets/bundles/bundle_ja.properties | 3 +++ core/assets/bundles/bundle_ko.properties | 3 +++ core/assets/bundles/bundle_lt.properties | 3 +++ core/assets/bundles/bundle_nl.properties | 3 +++ core/assets/bundles/bundle_nl_BE.properties | 3 +++ core/assets/bundles/bundle_pl.properties | 3 +++ core/assets/bundles/bundle_pt_BR.properties | 3 +++ core/assets/bundles/bundle_pt_PT.properties | 3 +++ core/assets/bundles/bundle_ro.properties | 3 +++ core/assets/bundles/bundle_ru.properties | 3 +++ core/assets/bundles/bundle_sr.properties | 3 +++ core/assets/bundles/bundle_sv.properties | 3 +++ core/assets/bundles/bundle_th.properties | 3 +++ core/assets/bundles/bundle_tk.properties | 3 +++ core/assets/bundles/bundle_tr.properties | 3 +++ core/assets/bundles/bundle_uk_UA.properties | 3 +++ core/assets/bundles/bundle_vi.properties | 3 +++ core/assets/bundles/bundle_zh_CN.properties | 3 +++ core/assets/bundles/bundle_zh_TW.properties | 3 +++ 34 files changed, 102 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 3688ddcf6252..0ecd6514b6c4 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1397,6 +1397,9 @@ rules.title.planet = Планета rules.lighting = Асвятленне rules.fog = Туман Вайны rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Агонь diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 8e792e0f62c6..9848be868ee9 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Planet rules.lighting = Светкавици rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Огън diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index a8b0e0b9389f..11f4a2afb0dd 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1411,6 +1411,9 @@ rules.title.planet = Planeta rules.lighting = Il·luminació rules.fog = Amaga el terreny inexplorat rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Foc diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index dbf1e2a80fb5..6f72df9c9cf5 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Planeta rules.lighting = Osvětlení rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Výstřel diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 81afaadea43e..a9c6ea54fdd9 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lys rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ild diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index b792aba5ac54..081c3d193fba 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1421,6 +1421,9 @@ rules.title.planet = Planet rules.lighting = Blitze rules.fog = Kriegsnebel rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Feuer diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 20a54101b801..f2626f0a79a6 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1417,6 +1417,9 @@ rules.title.planet = Planeta rules.lighting = Iluminación rules.fog = Ocultar terreno inexplorado (Fog of War) rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fuego diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index eed737a07e4b..92fdbb6ee062 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 57d1309e7b42..59b4b2225988 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1401,6 +1401,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index b0fd5630aba3..583c8e2e2f90 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1398,6 +1398,9 @@ rules.title.planet = Planeetta rules.lighting = Salamointi rules.fog = Sodan sumu (Fog of War) rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Tuli diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 245130b38ab0..4b1f6ea9cba2 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1398,6 +1398,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index a1350d6bf795..8fba5b6a65f1 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1425,6 +1425,9 @@ rules.title.planet = Planète rules.lighting = Éclairage rules.fog = Brouillard de Guerre rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Feu diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 033c760b3580..bafa116ee823 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Bolygó rules.lighting = Világítás rules.fog = A háború köde rules.invasions = Ellenséges szektorokból érkező inváziók +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Ellenséges kezdőpontok megjelenítése a minitérképen rules.randomwaveai = Kiszámíthatatlan ellenséges támadások (MI) rules.fire = Tűz diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 39f2be18ec89..cfcc41cf049b 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1428,6 +1428,9 @@ rules.title.planet = Planet rules.lighting = Penerangan rules.fog = Kabut Perang rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Api diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index d1f859e99992..8eb50582877e 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1404,6 +1404,9 @@ rules.title.planet = pianeta rules.lighting = Illuminazione rules.fog = Nebbia di guerra rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fuoco diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 10cb04c305ce..9f31c83a8a6a 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1410,6 +1410,9 @@ rules.title.planet = 惑星 rules.lighting = 霧 rules.fog = 戦場の霧 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 火災 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index e8f3e27623c6..e13fa0799f54 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1431,6 +1431,9 @@ rules.title.planet = 행성 rules.lighting = 조명 표시 rules.fog = 전장의 안개 rules.invasions = 적 지역 침공 +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = 적 스폰 표시 rules.randomwaveai = 무작위 단계 AI rules.fire = 방화 허용 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 2accf92543f4..513d61f59a76 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Apšvietimas rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 418133003a9e..39d61aba2246 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1411,6 +1411,9 @@ rules.title.planet = Planeet rules.lighting = Belichting rules.fog = Mist van de Oorlog rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Vuur diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 6350e68df971..dc2204a38bad 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index e459a7cd2991..932d1ce43376 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Planet rules.lighting = Oświetlenie rules.fog = Mgła Wojny rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ogień diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 2190055f550c..a20a704b37ad 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1418,6 +1418,9 @@ rules.title.planet = Planeta rules.lighting = Iluminação rules.fog = Névoa de Guerra rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fogo diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index bad8364fe6fd..3fef2bcb844c 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index f1800a2dcf7b..3e8201dffb13 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Planet rules.lighting = Luminozitate Ambientală rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Foc diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 885fcfc0e0e3..eaab89ae0e54 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Планета rules.lighting = Освещение rules.fog = Туман войны rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Огонь diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index f7808473783a..c925b9af3ae4 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1412,6 +1412,9 @@ rules.title.planet = Planeta rules.lighting = Osvetljenje rules.fog = Magla Rata rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Plamen diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index cef3a8e71099..1afdc82be600 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index dd89b0046c9c..3eda7e72e9f3 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1413,6 +1413,9 @@ rules.title.planet = ดาว rules.lighting = แสง rules.fog = หมอกแห่งสงคราม rules.invasions = การรุกรานของฐานทัพศัตรู +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = แสดงจุดเกิดศัตรู rules.randomwaveai = AI คลื่นแบบคาดเดาไม่ได้ rules.fire = ไฟ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 2dc3da2f3d40..f03cb0534b19 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 35d39455ffb6..feed3ded1110 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Gezegen rules.lighting = Işıklandırma rules.fog = Savaş Sisi rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ateş diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index cc0243b3ed24..c6046c3cee14 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1419,6 +1419,9 @@ rules.title.planet = Планета rules.lighting = Світлотінь rules.fog = Туман війни rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Вогонь diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 7aa6ff6a3b74..97bc94032703 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Hành Tinh rules.lighting = Ánh Sáng rules.fog = Sương Mù Chiến Tranh rules.invasions = Kẻ Địch Xâm Lược Khu Vực +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Hiện Khu Kẻ Địch Xuất Hiện rules.randomwaveai = Đợt Tấn Công AI Không Đoán Trước rules.fire = Lửa diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6e8ae176d940..2cc46aa13388 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1421,6 +1421,9 @@ rules.title.planet = 星球 rules.lighting = 环境光 rules.fog = 战争迷雾 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 允许火焰产生并蔓延 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index d41dd8aaebd7..96b922583db9 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1416,6 +1416,9 @@ rules.title.planet = 星球 rules.lighting = 光照 rules.fog = 戰爭迷霧 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 火 From 024a084a7a5907afce39b9f0dbf49ea60a22ec57 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 20:14:59 -0500 Subject: [PATCH 25/26] Fixed #10461 --- core/src/mindustry/world/blocks/defense/turrets/Turret.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index e56be0378a4b..617a9c375253 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -559,14 +559,14 @@ public BulletType useAmmo(){ /** @return whether the turret has ammo. */ public boolean hasAmmo(){ - //used for "side-ammo" like gas in some turrets - if(!canConsume()) return false; - //skip first entry if it has less than the required amount of ammo if(ammo.size >= 2 && ammo.peek().amount < ammoPerShot && ammo.get(ammo.size - 2).amount >= ammoPerShot){ ammo.swap(ammo.size - 1, ammo.size - 2); } + //used for "side-ammo" like gas in some turrets + if(!canConsume()) return false; + return ammo.size > 0 && (ammo.peek().amount >= ammoPerShot || cheating()); } From 9f03050d04e7784843da4740cbce1e829ea23df4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 21:55:33 -0500 Subject: [PATCH 26/26] Allow launch/landing pads outside of campaign as voids/sources --- .../world/blocks/campaign/LandingPad.java | 85 ++++++++++++++++--- .../world/blocks/campaign/LaunchPad.java | 9 +- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index d8b491d3451d..7435f6ebd509 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,6 +1,8 @@ package mindustry.world.blocks.campaign; import arc.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -62,8 +64,16 @@ public LandingPad(String name){ emitLight = true; lightRadius = 90f; - config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); - configClear((LandingPadBuild build) -> build.config = null); + config(Item.class, (LandingPadBuild build, Item item) -> { + if(!accessible()) return; + + build.config = item; + }); + configClear((LandingPadBuild build) -> { + if(!accessible()) return; + + build.config = null; + }); } @Override @@ -109,6 +119,10 @@ public static void landingPadLanded(Tile tile){ build.handleLanding(); } + public boolean accessible(){ + return state.rules.editor || state.rules.allowEditWorldProcessors || state.isCampaign(); + } + public class LandingPadBuild extends Building{ public @Nullable Item config; //priority collisions are possible, but should be extremely rare @@ -120,14 +134,16 @@ public class LandingPadBuild extends Building{ public float liquidRemoved; public void handleLanding(){ - if(!state.isCampaign() || config == null) return; + if(config == null) return; cooldown = 1f; arriving = config; arrivingTimer = 0f; liquidRemoved = 0f; - state.rules.sector.info.importCooldownTimers.put(config, 0f); + if(state.isCampaign() && !isFake()){ + state.rules.sector.info.importCooldownTimers.put(config, 0f); + } } public void updateTimers(){ @@ -276,7 +292,9 @@ public void updateTile(){ Effect.shake(3f, 3f, this); items.set(arriving, itemCapacity); - state.getSector().info.handleItemImport(arriving, itemCapacity); + if(!isFake()){ + state.getSector().info.handleItemImport(arriving, itemCapacity); + } arriving = null; arrivingTimer = 0f; @@ -292,29 +310,70 @@ public void updateTile(){ cooldown = Mathf.clamp(cooldown); } - if(config != null && state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads){ + if(config != null && (isFake() || (state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads))){ - if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && (isFake() || (state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f))){ - //queue landing for next frame - waiting.get(config, Seq::new).add(this); + if(isFake()){ + //there is no queue for enemy team blocks, it's all fake + Call.landingPadLanded(tile); + }else{ + //queue landing for next frame + waiting.get(config, Seq::new).add(this); + } } } } + /** @return whether this pad should receive items forever, essentially acting as an item source for maps. */ + public boolean isFake(){ + return team != state.rules.defaultTeam || !state.isCampaign(); + } + @Override public boolean canDump(Building to, Item item){ //hack: canDump is only ever called right before item offload, so count the item as "produced" before that. - //TODO: is this necessary? produced(item); return true; } + @Override + public void drawSelect(){ + if(config != null){ + float dx = x - size * tilesize/2f, dy = y + size * tilesize/2f, s = iconSmall / 4f; + Draw.mixcol(Color.darkGray, 1f); + Draw.rect(config.fullIcon, dx, dy - 1, s, s); + Draw.reset(); + Draw.rect(config.fullIcon, dx, dy, s, s); + } + } + + @Override + public Cursor getCursor(){ + return !accessible() ? SystemCursor.arrow : super.getCursor(); + } + + @Override + public boolean shouldShowConfigure(Player player){ + return accessible(); + } + + @Override + public boolean onConfigureBuildTapped(Building other){ + if(this == other || !accessible()){ + deselect(); + return false; + } + + return super.onConfigureBuildTapped(other); + } + @Override public void buildConfiguration(Table table){ + ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); - if(!net.client()){ + if(!net.client() && !isFake()){ table.row(); table.table(t -> { @@ -340,11 +399,11 @@ public void buildConfiguration(Table table){ public void display(Table table){ super.display(table); - if(!state.isCampaign() || net.client() || team != player.team()) return; + if(!state.isCampaign() || net.client() || team != player.team() || isFake()) return; table.row(); table.label(() -> { - if(!state.isCampaign()) return ""; + if(!state.isCampaign() || isFake()) return ""; if(state.getPlanet().campaignRules.legacyLaunchPads){ return Core.bundle.get("landingpad.legacy.disabled"); diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 80fb16c35309..1063b45460ac 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -104,8 +104,6 @@ public void draw(){ super.draw(); - if(!state.isCampaign()) return; - if(lightRegion.found()){ Draw.color(lightColor); float progress = Math.min((float)items.total() / itemCapacity, launchCounter / launchTime); @@ -136,7 +134,6 @@ public boolean acceptItem(Building source, Item item){ @Override public void updateTile(){ - if(!state.isCampaign()) return; //increment launchCounter then launch when full and base conditions are met if((launchCounter += edelta()) >= launchTime && items.total() >= itemCapacity){ @@ -172,9 +169,13 @@ public void display(Table table){ }).pad(4).wrap().width(200f).left(); } + @Override + public boolean shouldShowConfigure(Player player){ + return state.isCampaign(); + } + @Override public void buildConfiguration(Table table){ - //TODO: this UI should be on landing pads if(!state.isCampaign() || net.client()){ deselect(); return;