From 54499e9c2cc7b294d975333aebed29a6d1464057 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 8 Feb 2022 01:40:12 -0500 Subject: [PATCH] Added editor playtest button --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/core/Control.java | 16 +++++++- core/src/mindustry/core/GameState.java | 2 + .../src/mindustry/editor/MapEditorDialog.java | 41 +++++++++++++++++-- .../mindustry/ui/dialogs/MapPlayDialog.java | 9 +++- .../mindustry/ui/dialogs/PausedDialog.java | 7 +++- 6 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e095a1acb4..c79859cb0e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -383,6 +383,7 @@ editor.waves = Waves: editor.rules = Rules: editor.generation = Generation: editor.ingame = Edit In-Game +editor.playtest = Playtest editor.publish.workshop = Publish On Workshop editor.newmap = New Map editor.center = Center diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index fb77e0270d..b66b55d903 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -295,17 +295,31 @@ public class Control implements ApplicationListener, Loadable{ } public void playMap(Map map, Rules rules){ + playMap(map, rules, false); + } + + public void playMap(Map map, Rules rules, boolean playtest){ ui.loadAnd(() -> { logic.reset(); world.loadMap(map, rules); state.rules = rules; + if(playtest) state.playtestingMap = map; state.rules.sector = null; state.rules.editor = false; logic.play(); - if(settings.getBool("savecreate") && !world.isInvalidMap()){ + if(settings.getBool("savecreate") && !world.isInvalidMap() && !playtest){ control.saves.addSave(map.name() + " " + new SimpleDateFormat("MMM dd h:mm", Locale.getDefault()).format(new Date())); } Events.fire(Trigger.newGame); + + //booted out of map, resume editing + if(world.isInvalidMap() && playtest){ + Dialog current = scene.getDialog(); + ui.editor.resumeAfterPlaytest(map); + if(current != null){ + current.update(current::toFront); + } + } }); } diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 6ed3800eb1..8fa8d2e635 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -34,6 +34,8 @@ public class GameState{ public Teams teams = new Teams(); /** Number of enemies in the game; only used clientside in servers. */ public int enemies; + /** Map being playtested (not edited!) */ + public @Nullable Map playtestingMap; /** Current game state. */ private State state = State.menu; diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 0d714263bc..2a98804146 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -39,6 +39,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ private MapResizeDialog resizeDialog; private MapGenerateDialog generateDialog; private SectorGenerateDialog sectorGenDialog; + private MapPlayDialog playtestDialog; private ScrollPane pane; private BaseDialog menu; private Table blockSelection; @@ -56,6 +57,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ infoDialog = new MapInfoDialog(); generateDialog = new MapGenerateDialog(true); sectorGenDialog = new SectorGenerateDialog(); + playtestDialog = new MapPlayDialog(); menu = new BaseDialog("@menu"); menu.addCloseButton(); @@ -122,6 +124,12 @@ public class MapEditorDialog extends Dialog implements Disposable{ file.writePng(out); out.dispose(); }))); + + t.row(); + + t.button("@editor.ingame", Icon.right, this::editInGame); + + t.button("@editor.playtest", Icon.play, this::playtest); }); menu.cont.row(); @@ -172,14 +180,12 @@ public class MapEditorDialog extends Dialog implements Disposable{ menu.cont.row(); } - menu.cont.button("@editor.ingame", Icon.right, this::playtest).padTop(!steam && !experimental ? -3 : 1).size(swidth * 2f + 10, 60f); - menu.cont.row(); menu.cont.button("@quit", Icon.exit, () -> { tryExit(); menu.hide(); - }).size(swidth * 2f + 10, 60f); + }).padTop(!steam && !experimental ? -3 : 1).size(swidth * 2f + 10, 60f); resizeDialog = new MapResizeDialog((x, y) -> { if(!(editor.width() == x && editor.height() == y)){ @@ -249,7 +255,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ editor.renderer.updateAll(); } - private void playtest(){ + private void editInGame(){ menu.hide(); ui.loadAnd(() -> { lastSavedRules = state.rules; @@ -283,6 +289,33 @@ public class MapEditorDialog extends Dialog implements Disposable{ }); } + public void resumeAfterPlaytest(Map map){ + beginEditMap(map.file); + } + + private void playtest(){ + menu.hide(); + Map map = save(); + + if(map != null){ + //skip dialog, play with survival or attack when shift clicked + if(Core.input.shift()){ + hide(); + //auto pick best fit + control.playMap(map, map.applyRules( + Gamemode.survival.valid(map) ? Gamemode.survival : + Gamemode.attack.valid(map) ? Gamemode.attack : + Gamemode.sandbox), true + ); + }else{ + playtestDialog.playListener = this::hide; + //TODO skip dialog? or reuse + //TODO set playtesting map, do not create save. + playtestDialog.show(map, true); + } + } + } + public @Nullable Map save(){ boolean isEditor = state.rules.editor; state.rules.editor = false; diff --git a/core/src/mindustry/ui/dialogs/MapPlayDialog.java b/core/src/mindustry/ui/dialogs/MapPlayDialog.java index 730762932c..a0d61ea154 100644 --- a/core/src/mindustry/ui/dialogs/MapPlayDialog.java +++ b/core/src/mindustry/ui/dialogs/MapPlayDialog.java @@ -12,6 +12,8 @@ import mindustry.ui.*; import static mindustry.Vars.*; public class MapPlayDialog extends BaseDialog{ + public @Nullable Runnable playListener; + CustomRulesDialog dialog = new CustomRulesDialog(); Rules rules; Gamemode selectedGamemode = Gamemode.survival; @@ -31,6 +33,10 @@ public class MapPlayDialog extends BaseDialog{ } public void show(Map map){ + show(map, false); + } + + public void show(Map map, boolean playtesting){ this.lastMap = map; title.setText(map.name()); cont.clearChildren(); @@ -79,7 +85,8 @@ public class MapPlayDialog extends BaseDialog{ addCloseButton(); buttons.button("@play", Icon.play, () -> { - control.playMap(map, rules); + if(playListener != null) playListener.run(); + control.playMap(map, rules, playtesting); hide(); ui.custom.hide(); }).size(210f, 64f); diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index e1a0da90bb..c26ee4f1ef 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -105,13 +105,18 @@ public class PausedDialog extends BaseDialog{ }else{ quit.run(); } - } public void runExitSave(){ if(state.isEditor() && !wasClient){ ui.editor.resumeEditing(); return; + }else if(state.playtestingMap != null){ + //no exit save here + var testing = state.playtestingMap; + logic.reset(); + ui.editor.resumeAfterPlaytest(testing); + return; } if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || wasClient){