In-game rule edit dialog

This commit is contained in:
Anuken
2024-06-24 14:11:56 -04:00
parent 2a95b0f8d2
commit 400db1b1e8
6 changed files with 40 additions and 7 deletions

View File

@@ -1335,6 +1335,8 @@ rules.disableworldprocessors = Disable World Processors
rules.schematic = Schematics Allowed rules.schematic = Schematics Allowed
rules.wavetimer = Wave Timer rules.wavetimer = Wave Timer
rules.wavesending = Wave Sending rules.wavesending = Wave Sending
rules.allowedit = Allow Editing Rules
rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu.
rules.waves = Waves rules.waves = Waves
rules.airUseSpawns = Air units use spawn points rules.airUseSpawns = Air units use spawn points
rules.attack = Attack Mode rules.attack = Attack Mode

View File

@@ -13,6 +13,7 @@ public enum Gamemode{
}, map -> map.spawns > 0), }, map -> map.spawns > 0),
sandbox(rules -> { sandbox(rules -> {
rules.infiniteResources = true; rules.infiniteResources = true;
rules.allowEditRules = true;
rules.waves = true; rules.waves = true;
rules.waveTimer = false; rules.waveTimer = false;
}), }),

View File

@@ -19,6 +19,8 @@ import mindustry.world.blocks.*;
* Does not store game state, just configuration. * Does not store game state, just configuration.
*/ */
public class Rules{ public class Rules{
/** Allows editing the rules in-game. Essentially a cheat mode toggle. */
public boolean allowEditRules = false;
/** Sandbox mode: Enables infinite resources, build range and build speed. */ /** Sandbox mode: Enables infinite resources, build range and build speed. */
public boolean infiniteResources; public boolean infiniteResources;
/** Team-specific rules. */ /** Team-specific rules. */

View File

@@ -30,16 +30,24 @@ public class CustomRulesDialog extends BaseDialog{
private Table main; private Table main;
private Prov<Rules> resetter; private Prov<Rules> resetter;
private LoadoutDialog loadoutDialog; private LoadoutDialog loadoutDialog;
public boolean showRuleEditRule;
public Seq<Table> categories; public Seq<Table> categories;
public Table current; public Table current;
public Seq<String> categoryNames; public Seq<String> categoryNames;
public String currentName; public String currentName = "";
public String ruleSearch = ""; public String ruleSearch = "";
public Seq<Runnable> additionalSetup; // for modding to easily add new rules public Seq<Runnable> additionalSetup; // for modding to easily add new rules
public CustomRulesDialog(){ public CustomRulesDialog(){
this(false);
}
public CustomRulesDialog(boolean showRuleEditRule){
super("@mode.custom"); super("@mode.custom");
this.showRuleEditRule = showRuleEditRule;
loadoutDialog = new LoadoutDialog(); loadoutDialog = new LoadoutDialog();
setFillParent(true); setFillParent(true);
@@ -49,8 +57,6 @@ public class CustomRulesDialog extends BaseDialog{
additionalSetup = new Seq<>(); additionalSetup = new Seq<>();
categories = new Seq<>(); categories = new Seq<>();
categoryNames = new Seq<>(); categoryNames = new Seq<>();
currentName = "";
ruleSearch = "";
buttons.button("@edit", Icon.pencil, () -> { buttons.button("@edit", Icon.pencil, () -> {
BaseDialog dialog = new BaseDialog("@waves.edit"); BaseDialog dialog = new BaseDialog("@waves.edit");
@@ -209,7 +215,6 @@ public class CustomRulesDialog extends BaseDialog{
main.left().defaults().fillX().left(); main.left().defaults().fillX().left();
main.row(); main.row();
category("waves"); category("waves");
check("@rules.waves", b -> rules.waves = b, () -> rules.waves); check("@rules.waves", b -> rules.waves = b, () -> rules.waves);
check("@rules.wavesending", b -> rules.waveSending = b, () -> rules.waveSending, () -> rules.waves); check("@rules.wavesending", b -> rules.waveSending = b, () -> rules.waveSending, () -> rules.waves);
@@ -352,6 +357,10 @@ public class CustomRulesDialog extends BaseDialog{
category("teams"); category("teams");
//not sure where else to put this
if(showRuleEditRule){
check("@rules.allowedit", b -> rules.allowEditRules = b, () -> rules.allowEditRules);
}
team("@rules.playerteam", t -> rules.defaultTeam = t, () -> rules.defaultTeam); team("@rules.playerteam", t -> rules.defaultTeam = t, () -> rules.defaultTeam);
team("@rules.enemyteam", t -> rules.waveTeam = t, () -> rules.waveTeam); team("@rules.enemyteam", t -> rules.waveTeam = t, () -> rules.waveTeam);

View File

@@ -14,7 +14,7 @@ import static mindustry.Vars.*;
public class MapPlayDialog extends BaseDialog{ public class MapPlayDialog extends BaseDialog{
public @Nullable Runnable playListener; public @Nullable Runnable playListener;
CustomRulesDialog dialog = new CustomRulesDialog(); CustomRulesDialog dialog = new CustomRulesDialog(true);
Rules rules; Rules rules;
Gamemode selectedGamemode = Gamemode.survival; Gamemode selectedGamemode = Gamemode.survival;
Map lastMap; Map lastMap;

View File

@@ -1,7 +1,10 @@
package mindustry.ui.dialogs; package mindustry.ui.dialogs;
import arc.*; import arc.*;
import arc.scene.ui.layout.*;
import mindustry.*;
import mindustry.editor.*; import mindustry.editor.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -10,12 +13,28 @@ public class PausedDialog extends BaseDialog{
private MapProcessorsDialog processors = new MapProcessorsDialog(); private MapProcessorsDialog processors = new MapProcessorsDialog();
private SaveDialog save = new SaveDialog(); private SaveDialog save = new SaveDialog();
private LoadDialog load = new LoadDialog(); private LoadDialog load = new LoadDialog();
private boolean wasClient = false; private CustomRulesDialog rulesDialog = new CustomRulesDialog();
public PausedDialog(){ public PausedDialog(){
super("@menu"); super("@menu");
shouldPause = true; shouldPause = true;
clearChildren();
add(titleTable).growX().row();
stack(cont, new Table(t -> {
t.bottom().left();
t.button(Icon.book, () -> {
Rules toEdit = Vars.state.rules.copy();
rulesDialog.show(toEdit, () -> state.rules.copy());
rulesDialog.hidden(() -> {
//apply rule changes only once it is hidden
Vars.state.rules = toEdit;
Call.setRules(toEdit);
});
}).size(70f).tooltip("@customize").visible(() -> state.rules.allowEditRules && (net.server() || !net.active()));
})).grow().row();
shown(this::rebuild); shown(this::rebuild);
addCloseListener(); addCloseListener();
@@ -130,7 +149,7 @@ public class PausedDialog extends BaseDialog{
} }
public void runExitSave(){ public void runExitSave(){
wasClient = net.client(); boolean wasClient = net.client();
if(net.client()) netClient.disconnectQuietly(); if(net.client()) netClient.disconnectQuietly();
if(state.isEditor() && !wasClient){ if(state.isEditor() && !wasClient){