diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 93b24effe3..4d80207da0 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2951,7 +2951,7 @@ public class Blocks{ }}; coreAcropolis = new CoreBlock("core-acropolis"){{ - requirements(Category.effect, with(Items.beryllium, 8000, Items.silicon, 7000, Items.tungsten, 6000, Items.carbide, 5000, Items.oxide, 4000)); + requirements(Category.effect, with(Items.beryllium, 6000, Items.silicon, 5000, Items.tungsten, 5000, Items.carbide, 3000, Items.oxide, 3000)); unitType = UnitTypes.emanate; health = 30000; diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index 5b3cf0ffbc..ffcde5bf90 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -56,8 +56,10 @@ public class ErekirTechTree{ var costMultipliers = new ObjectFloatMap(); //these are hard to make costMultipliers.put(Items.oxide, 0.5f); - costMultipliers.put(Items.surgeAlloy, 0.8f); - costMultipliers.put(Items.carbide, 0.35f); + costMultipliers.put(Items.surgeAlloy, 0.7f); + costMultipliers.put(Items.carbide, 0.3f); + + for(var item : content.items()) costMultipliers.put(item, 0.9f); Planets.erekir.techTree = nodeRoot("erekir", coreBastion, true, () -> { context().researchCostMultipliers = costMultipliers; diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 8069c135d6..eb537f1164 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -105,6 +105,7 @@ public class SectorPresets{ planetaryTerminal = new SectorPreset("planetaryTerminal", serpulo, 93){{ difficulty = 10; + isLastSector = true; }}; //endregion @@ -183,6 +184,7 @@ public class SectorPresets{ origin = new SectorPreset("origin", erekir, 12){{ difficulty = 10; + isLastSector = true; }}; //endregion diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index ad4cd9d365..2f15ccc9a9 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -161,6 +161,10 @@ public class Control implements ApplicationListener, Loadable{ Events.on(SectorCaptureEvent.class, e -> { app.post(this::checkAutoUnlocks); + + if(e.sector.preset != null && e.sector.preset.isLastSector && e.initialCapture){ + ui.campaignComplete.show(e.sector.planet); + } }); //delete save on campaign game over diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 1179c61c4c..1f84613165 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -339,10 +339,12 @@ public class Logic implements ApplicationListener{ return; } + boolean initial = !state.rules.sector.info.wasCaptured; + state.rules.sector.info.wasCaptured = true; //fire capture event - Events.fire(new SectorCaptureEvent(state.rules.sector)); + Events.fire(new SectorCaptureEvent(state.rules.sector, initial)); //disable attack mode state.rules.attackMode = false; diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 4f054fc293..2084e413f9 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -73,6 +73,7 @@ public class UI implements ApplicationListener, Loadable{ public ColorPicker picker; public LogicDialog logic; public FullTextDialog fullText; + public CampaignCompleteDialog campaignComplete; public Cursor drillCursor, unloadCursor, targetCursor; @@ -199,6 +200,7 @@ public class UI implements ApplicationListener, Loadable{ schematics = new SchematicsDialog(); logic = new LogicDialog(); fullText = new FullTextDialog(); + campaignComplete = new CampaignCompleteDialog(); Group group = Core.scene.root; diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 1c15e83f71..69eed5aaf6 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -195,9 +195,11 @@ public class EventType{ /** Called when a sector is conquered, e.g. a boss or base is defeated. */ public static class SectorCaptureEvent{ public final Sector sector; + public final boolean initialCapture; - public SectorCaptureEvent(Sector sector){ + public SectorCaptureEvent(Sector sector, boolean initialCapture){ this.sector = sector; + this.initialCapture = initialCapture; } } diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index 1015335cc4..174d9fac6a 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -18,6 +18,8 @@ public class SectorPreset extends UnlockableContent{ public float startWaveTimeMultiplier = 2f; public boolean addStartingItems = false; public boolean noLighting = false; + /** If true, this is the last sector in its planetary campaign. */ + public boolean isLastSector; public boolean showSectorLandInfo = true; /** If true, uses this sector's launch fields instead */ public boolean overrideLaunchDefaults = false; diff --git a/core/src/mindustry/ui/dialogs/BaseDialog.java b/core/src/mindustry/ui/dialogs/BaseDialog.java index 3087addd32..7f55222895 100644 --- a/core/src/mindustry/ui/dialogs/BaseDialog.java +++ b/core/src/mindustry/ui/dialogs/BaseDialog.java @@ -12,6 +12,7 @@ import static mindustry.Vars.*; public class BaseDialog extends Dialog{ protected boolean wasPaused; + /** If true, this dialog will pause the game while open. */ protected boolean shouldPause; public BaseDialog(String title, DialogStyle style){ diff --git a/core/src/mindustry/ui/dialogs/CampaignCompleteDialog.java b/core/src/mindustry/ui/dialogs/CampaignCompleteDialog.java new file mode 100644 index 0000000000..45aaad2a67 --- /dev/null +++ b/core/src/mindustry/ui/dialogs/CampaignCompleteDialog.java @@ -0,0 +1,29 @@ +package mindustry.ui.dialogs; + +import mindustry.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class CampaignCompleteDialog extends BaseDialog{ + + public CampaignCompleteDialog(){ + super(""); + + addCloseListener(); + shouldPause = true; + + buttons.defaults().size(210f, 64f); + buttons.button("@menu", Icon.left, () -> Vars.ui.paused.runExitSave()); + + buttons.button("@continue", Icon.left, this::hide); + } + + public void show(Planet planet){ + //TODO obviously needs different text. + cont.clear(); + + cont.add("[accent]Congrations. You done it.[]\n\nThe enemy on " + planet.localizedName + " has been defeated."); + + show(); + } +} diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 51ba4ed8a5..c68eb89c76 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -100,8 +100,6 @@ public class PausedDialog extends BaseDialog{ void showQuitConfirm(){ Runnable quit = () -> { - wasClient = net.client(); - if(net.client()) netClient.disconnectQuietly(); runExitSave(); hide(); }; @@ -125,6 +123,9 @@ public class PausedDialog extends BaseDialog{ } public void runExitSave(){ + wasClient = net.client(); + if(net.client()) netClient.disconnectQuietly(); + if(state.isEditor() && !wasClient){ ui.editor.resumeEditing(); return;