package mindustry.editor; import arc.*; import arc.struct.*; import arc.graphics.*; import arc.input.*; import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.TextField.*; import arc.scene.ui.layout.*; import arc.util.*; import mindustry.*; import mindustry.content.*; import mindustry.ctype.ContentType; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.io.*; import mindustry.type.*; import mindustry.ui.Cicon; import mindustry.ui.dialogs.*; import static mindustry.Vars.*; import static mindustry.game.SpawnGroup.never; public class WaveInfoDialog extends FloatingDialog{ private final static int displayed = 20; private Array groups = new Array<>(); private Table table, preview; private int start = 0; private UnitType lastType = UnitTypes.dagger; private float updateTimer, updatePeriod = 1f; public WaveInfoDialog(MapEditor editor){ super("$waves.title"); shown(this::setup); hidden(() -> { state.rules.spawns = groups; }); keyDown(key -> { if(key == KeyCode.ESCAPE || key == KeyCode.BACK){ Core.app.post(this::hide); } }); addCloseButton(); buttons.addButton("$waves.edit", () -> { FloatingDialog dialog = new FloatingDialog("$waves.edit"); dialog.addCloseButton(); dialog.setFillParent(false); dialog.cont.defaults().size(210f, 64f); dialog.cont.addButton("$waves.copy", () -> { ui.showInfoFade("$waves.copied"); Core.app.setClipboardText(maps.writeWaves(groups)); dialog.hide(); }).disabled(b -> groups == null); dialog.cont.row(); dialog.cont.addButton("$waves.load", () -> { try{ groups = maps.readWaves(Core.app.getClipboardText()); buildGroups(); }catch(Exception e){ e.printStackTrace(); ui.showErrorMessage("$waves.invalid"); } dialog.hide(); }).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()); dialog.cont.row(); dialog.cont.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () -> { groups = JsonIO.copy(defaultWaves.get()); buildGroups(); dialog.hide(); })); dialog.show(); }).size(270f, 64f); } void setup(){ groups = JsonIO.copy(state.rules.spawns.isEmpty() ? defaultWaves.get() : state.rules.spawns); cont.clear(); cont.stack(new Table(Tex.clear, main -> { main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false); main.row(); main.addButton("$add", () -> { if(groups == null) groups = new Array<>(); groups.add(new SpawnGroup(lastType)); buildGroups(); }).growX().height(70f); }), new Label("$waves.none"){{ visible(() -> groups.isEmpty()); touchable(Touchable.disabled); setWrap(true); setAlignment(Align.center, Align.center); }}).width(390f).growY(); cont.table(Tex.clear, m -> { m.add("$waves.preview").color(Color.lightGray).growX().center().get().setAlignment(Align.center, Align.center); m.row(); m.addButton("-", () -> { }).update(t -> { if(t.getClickListener().isPressed()){ updateTimer += Time.delta(); if(updateTimer >= updatePeriod){ start = Math.max(start - 1, 0); updateTimer = 0f; updateWaves(); } } }).growX().height(70f); m.row(); m.pane(t -> preview = t).grow().get().setScrollingDisabled(true, true); m.row(); m.addButton("+", () -> { }).update(t -> { if(t.getClickListener().isPressed()){ updateTimer += Time.delta(); if(updateTimer >= updatePeriod){ start++; updateTimer = 0f; updateWaves(); } } }).growX().height(70f); }).growY().width(180f).growY(); buildGroups(); } void buildGroups(){ table.clear(); table.top(); table.margin(10f); if(groups != null){ for(SpawnGroup group : groups){ table.table(Tex.button, t -> { t.margin(0).defaults().pad(3).padLeft(5f).growX().left(); t.addButton(b -> { b.left(); b.addImage(group.type.icon(mindustry.ui.Cicon.medium)).size(32f).padRight(3); b.add(group.type.localizedName).color(Pal.accent); }, () -> showUpdate(group)).pad(-6f).padBottom(0f); t.row(); t.table(spawns -> { spawns.addField("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> { if(Strings.canParsePostiveInt(text)){ group.begin = Strings.parseInt(text) - 1; updateWaves(); } }).width(100f); spawns.add("$waves.to").padLeft(4).padRight(4); spawns.addField(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> { if(Strings.canParsePostiveInt(text)){ group.end = Strings.parseInt(text) - 1; updateWaves(); }else if(text.isEmpty()){ group.end = never; updateWaves(); } }).width(100f).get().setMessageText(Core.bundle.get("waves.never")); }); t.row(); t.table(p -> { p.add("$waves.every").padRight(4); p.addField(group.spacing + "", TextFieldFilter.digitsOnly, text -> { if(Strings.canParsePostiveInt(text) && Strings.parseInt(text) > 0){ group.spacing = Strings.parseInt(text); updateWaves(); } }).width(100f); p.add("$waves.waves").padLeft(4); }); t.row(); t.table(a -> { a.addField(group.unitAmount + "", TextFieldFilter.digitsOnly, text -> { if(Strings.canParsePostiveInt(text)){ group.unitAmount = Strings.parseInt(text); updateWaves(); } }).width(80f); a.add(" + "); a.addField(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { if(Strings.canParsePositiveFloat(text)){ group.unitScaling = 1f / Strings.parseFloat(text); updateWaves(); } }).width(80f); a.add("$waves.perspawn").padLeft(4); }); t.row(); t.addCheck("$waves.boss", b -> group.effect = (b ? StatusEffects.boss : null)).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)); t.row(); t.addButton("$waves.remove", () -> { groups.remove(group); table.getCell(t).pad(0f); t.remove(); updateWaves(); }).growX().pad(-6f).padTop(5); }).width(340f).pad(16); table.row(); } }else{ table.add("$editor.default"); } updateWaves(); } void showUpdate(SpawnGroup group){ FloatingDialog dialog = new FloatingDialog(""); dialog.setFillParent(true); dialog.cont.pane(p -> { int i = 0; for(UnitType type : content.units()){ p.addButton(t -> { t.left(); t.addImage(type.icon(mindustry.ui.Cicon.medium)).size(40f).padRight(2f); t.add(type.localizedName); }, () -> { lastType = type; group.type = type; dialog.hide(); buildGroups(); }).pad(2).margin(12f).fillX(); if(++i % 3 == 0) p.row(); } }); dialog.show(); } void updateWaves(){ preview.clear(); preview.top(); for(int i = start; i < displayed + start; i++){ int wave = i; preview.table(Tex.underline, table -> { table.add((wave + 1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center); table.row(); int[] spawned = new int[Vars.content.getBy(ContentType.unit).size]; for(SpawnGroup spawn : groups){ spawned[spawn.type.id] += spawn.getUnitsSpawned(wave); } for(int j = 0; j < spawned.length; j++){ if(spawned[j] > 0){ UnitType type = content.getByID(ContentType.unit, j); table.addImage(type.icon(Cicon.medium)).size(8f * 4f).padRight(4); table.add(spawned[j] + "x").color(Color.lightGray).padRight(6); table.row(); } } if(table.getChildren().size == 1){ table.add("$none").color(Pal.remove); } }).width(110f).pad(2f); preview.row(); } } }