From 3f6ab92fcbb61b1291b5bf2f26c8233c63244d7f Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 26 Jun 2022 14:07:58 -0400 Subject: [PATCH] Map objective editor fixes --- core/src/mindustry/content/SectorPresets.java | 2 +- .../mindustry/editor/MapObjectivesDialog.java | 84 ++++++++++++------- core/src/mindustry/game/MapObjectives.java | 17 ++-- 3 files changed, 63 insertions(+), 40 deletions(-) diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index f635257929..808306fc02 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -192,7 +192,7 @@ public class SectorPresets{ ), new DestroyBlockObjective(Blocks.largeShieldProjector, 210, 278, Team.malis).withMarkers( new TextMarker("The enemy is protected by shields.\nAn experimental shield breaker module has been detected in this sector.\nFind and activate it using tungsten.", 276f * 8f, 164f * 8f), - new MinimapMarker(23f, 137f, Pal.accent) + new MinimapMarker(23, 137, Pal.accent) ) ); }; diff --git a/core/src/mindustry/editor/MapObjectivesDialog.java b/core/src/mindustry/editor/MapObjectivesDialog.java index 9654390136..a1201e3f3f 100644 --- a/core/src/mindustry/editor/MapObjectivesDialog.java +++ b/core/src/mindustry/editor/MapObjectivesDialog.java @@ -16,6 +16,7 @@ import mindustry.game.MapObjectives.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.io.*; +import mindustry.type.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; @@ -25,6 +26,8 @@ import java.lang.reflect.*; import static mindustry.Vars.*; public class MapObjectivesDialog extends BaseDialog{ + private static final Seq worldFields = Seq.with("x", "y"); + private Seq objectives = new Seq<>(); private Table list = new Table(); @@ -183,9 +186,9 @@ public class MapObjectivesDialog extends BaseDialog{ var type = field.getType(); if(type == String.class){ - f.field(Reflect.get(objective, field), text -> { + f.area(Reflect.get(objective, field), text -> { Reflect.set(objective, field, text); - }); + }).height(60f); }else if(type == boolean.class){ f.check("", Reflect.get(objective, field), val -> Reflect.set(objective, field, val)); }else if(type == int.class){ @@ -195,9 +198,11 @@ public class MapObjectivesDialog extends BaseDialog{ } }).valid(Strings::canParseInt); }else if(type == float.class){ - f.field(Reflect.get(objective, field) + "", text -> { + float multiplier = worldFields.contains(field.getName()) ? tilesize : 1f; + + f.field((Reflect.get(objective, field) / multiplier) + "", text -> { if(Strings.canParsePositiveFloat(text)){ - Reflect.set(objective, field, Strings.parseFloat(text)); + Reflect.set(objective, field, Strings.parseFloat(text) * multiplier); } }).valid(Strings::canParseFloat); }else if(type == UnlockableContent.class){ @@ -216,6 +221,13 @@ public class MapObjectivesDialog extends BaseDialog{ setup(); }, b -> ((Block)b).synthetic()); }).pad(4); + }else if(type == Item.class){ + f.button(b -> b.image(Reflect.get(objective, field).uiIcon).size(iconSmall), () -> { + showContentSelect(ContentType.item, result -> { + Reflect.set(objective, field, result); + setup(); + }, b -> true); + }).pad(4); }else if(type == Team.class){ f.button(b -> b.image(Tex.whiteui).color(Reflect.get(objective, field).color).size(iconSmall), () -> { showTeamSelect(result -> { @@ -274,7 +286,6 @@ public class MapObjectivesDialog extends BaseDialog{ f.row(); f.add(strings).colspan(2).fill(); - }else if(type == ObjectiveMarker[].class){ Runnable[] rebuild = {null}; @@ -290,7 +301,6 @@ public class MapObjectivesDialog extends BaseDialog{ ObjectiveMarker[] array = Reflect.get(objective, field); - //TODO very very broken for(var marker : array){ t.button(b -> { b.left(); @@ -326,7 +336,7 @@ public class MapObjectivesDialog extends BaseDialog{ selectedMarker = marker; rebuild[0].run(); } - }).width(310f).growX().height(46f).pad(-6f).padBottom(12f).row(); + }).width(280f).growX().height(46f).pad(-6f).padBottom(12f).row(); if(selectedMarker == marker){ t.table(b -> { @@ -346,36 +356,46 @@ public class MapObjectivesDialog extends BaseDialog{ }).padTop(-12f).grow().row(); } } + + t.button("+ Add", () -> { + var selection = new BaseDialog("@add"); + selection.cont.pane(p -> { + p.background(Tex.button); + p.marginRight(14); + p.defaults().size(195f, 56f); + int i = 0; + for(var gen : MapObjectives.allMarkerTypes){ + var marker = gen.get(); + + p.button(marker.typeName(), Styles.flatt, () -> { + Reflect.set(objective, field, Structs.add(Reflect.get(objective, field), marker)); + rebuild[0].run(); + selection.hide(); + }).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left); + + if(++i % 3 == 0) p.row(); + } + }).scrollX(false); + + selection.addCloseButton(); + selection.show(); + }).height(40f).width(140f).left().padLeft(-18f).padTop(-6f).row(); }; rebuild[0].run(); - }).width(310f).pad(8f).colspan(2).row(); - - f.button("+ Add", () -> { - var selection = new BaseDialog("@add"); - selection.cont.pane(p -> { - p.background(Tex.button); - p.marginRight(14); - p.defaults().size(195f, 56f); - int i = 0; - for(var gen : MapObjectives.allMarkerTypes){ - var marker = gen.get(); - - p.button(marker.typeName(), Styles.flatt, () -> { - Reflect.set(objective, field, Structs.add(Reflect.get(objective, field), marker)); - rebuild[0].run(); - selection.hide(); - }).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left); - - if(++i % 3 == 0) p.row(); - } - }).scrollX(false); - - selection.addCloseButton(); - selection.show(); - }).height(40f).width(140f).left().row(); + }).width(280f).pad(8f).colspan(2).row(); + }else if(type == byte.class){ + f.table(t -> { + byte value = Reflect.get(objective, field); + t.left().defaults().left(); + t.check("background", (value & WorldLabel.flagBackground) != 0, val -> + Reflect.set(objective, field, (byte)(val ? value | WorldLabel.flagBackground : value & ~WorldLabel.flagBackground))).padTop(4f).padBottom(4f); + t.row(); + t.check("outline", (value & WorldLabel.flagOutline) != 0, val -> + Reflect.set(objective, field, (byte)(val ? value | WorldLabel.flagOutline : value & ~WorldLabel.flagOutline))); + }); }else{ f.add("[red]UNFINISHED"); } diff --git a/core/src/mindustry/game/MapObjectives.java b/core/src/mindustry/game/MapObjectives.java index 0eacfa35d8..a6a4736629 100644 --- a/core/src/mindustry/game/MapObjectives.java +++ b/core/src/mindustry/game/MapObjectives.java @@ -489,22 +489,22 @@ public class MapObjectives{ /** Displays a circle on the minimap. */ public static class MinimapMarker extends ObjectiveMarker{ - //in tiles. - public float x, y, radius = 5f, stroke = 11f; + public int x, y; + public float radius = 5f, stroke = 11f; public Color color = Color.valueOf("f25555"); - public MinimapMarker(float x, float y){ + public MinimapMarker(int x, int y){ this.x = x; this.y = y; } - public MinimapMarker(float x, float y, Color color){ + public MinimapMarker(int x, int y, Color color){ this.x = x; this.y = y; this.color = color; } - public MinimapMarker(float x, float y, float radius, float stroke, Color color){ + public MinimapMarker(int x, int y, float radius, float stroke, Color color){ this.x = x; this.y = y; this.stroke = stroke; @@ -530,7 +530,7 @@ public class MapObjectives{ /** Displays a shape with an outline and color. */ public static class ShapeMarker extends ObjectiveMarker{ - public float x, y, radius = 6f, rotation = 0f, stroke = 1f; + public float x, y, radius = 8f, rotation = 0f, stroke = 1f; public boolean fill = false, outline = true; public int sides = 4; public Color color = Color.valueOf("ffd37f"); @@ -552,6 +552,9 @@ public class MapObjectives{ @Override public void draw(){ + //in case some idiot decides to make 9999999 sides and freeze the game + int sides = Math.min(this.sides, 200); + if(!fill){ if(outline){ Lines.stroke(stroke + 2f, Pal.gray); @@ -611,7 +614,7 @@ public class MapObjectives{ //TODO localize public String typeName(){ - return getClass().getSimpleName().replace("Objective", ""); + return getClass().getSimpleName().replace("Marker", ""); } /** Called in the overlay draw layer.*/