diff --git a/src/unitinfo/SUtils.java b/src/unitinfo/SUtils.java index 3c86426..c33e331 100644 --- a/src/unitinfo/SUtils.java +++ b/src/unitinfo/SUtils.java @@ -4,27 +4,19 @@ import arc.graphics.g2d.*; import arc.math.Mathf; import arc.scene.style.*; import arc.struct.Seq; -import arc.util.Nullable; -import arc.util.Strings; +import arc.util.*; import mindustry.Vars; import mindustry.core.UI; -import mindustry.entities.bullet.BulletType; -import mindustry.entities.bullet.LightningBulletType; -import mindustry.gen.BlockUnitUnit; -import mindustry.gen.Groups; -import mindustry.gen.Teamc; -import mindustry.gen.Unit; +import mindustry.entities.bullet.*; +import mindustry.gen.*; import mindustry.type.UnitType; -import mindustry.type.weapons.PointDefenseWeapon; -import mindustry.type.weapons.RepairBeamWeapon; +import mindustry.type.weapons.*; import mindustry.world.Tile; import java.lang.reflect.*; -import static unitinfo.SVars.locked; -import static unitinfo.SVars.target; -import static arc.Core.input; -import static arc.Core.settings; +import static unitinfo.SVars.*; +import static arc.Core.*; import static mindustry.Vars.player; public class SUtils { @@ -84,7 +76,7 @@ public class SUtils { return b.speed * a * Mathf.pow(1 - b.drag, b.lifetime / 2) * b.lifetime + Math.max(b.lightning > 0 || b instanceof LightningBulletType ? (b.lightningLength + b.lightningLengthRand) * 6 : 0, b.fragBullet != null ? bulletRange(b.fragBullet) * b.fragLifeMax * b.fragVelocityMax : b.splashDamageRadius); - }; + } public static float unitRange(UnitType u) { final float[] mrng = {0}; @@ -100,4 +92,14 @@ public class SUtils { field.setAccessible(true); return field.get(ut); } + + + public static boolean isOutCamera(float x, float y) { + return !isInCamera(x, y, 0); + } + + public static boolean isInCamera(float x, float y, float size) { + Tmp.r2.setCentered(x, y, size); + return Tmp.r1.overlaps(Tmp.r2); + } } diff --git a/src/unitinfo/SVars.java b/src/unitinfo/SVars.java index 0da5c2c..538ad3a 100644 --- a/src/unitinfo/SVars.java +++ b/src/unitinfo/SVars.java @@ -1,8 +1,6 @@ package unitinfo; -import unitinfo.core.*; -import unitinfo.shaders.LineShader; -import unitinfo.shaders.RangeShader; +import unitinfo.shaders.*; import arc.graphics.g2d.TextureRegion; import mindustry.gen.Teamc; @@ -11,10 +9,8 @@ import static arc.Core.atlas; public class SVars { public static TextureRegion clear = atlas.find("clear"); public static TextureRegion error = atlas.find("error"); - public static RangeShader turretRange; - public static LineShader lineShader; + public static RangeShader turretRange = new RangeShader(); public static Teamc target; public static boolean locked; - public static boolean jsonGen = false; public static float uiResumeRate = 3 * 60f; //default 3s } diff --git a/src/unitinfo/core/ContentJSON.java b/src/unitinfo/core/ContentJSON.java deleted file mode 100644 index e56624c..0000000 --- a/src/unitinfo/core/ContentJSON.java +++ /dev/null @@ -1,109 +0,0 @@ -package unitinfo.core; - -import arc.Core; -import arc.struct.Seq; -import arc.util.*; -import mindustry.*; -import mindustry.ctype.*; -import mindustry.entities.abilities.*; -import mindustry.entities.bullet.*; -import mindustry.type.*; -import mindustry.world.*; -import org.hjson.*; - -import java.lang.reflect.*; - -import static mindustry.Vars.modDirectory; - -public class ContentJSON { - static JsonValue parse(Object object) { - if(object instanceof Integer val) return JsonObject.valueOf(val); - else if(object instanceof Double val) return JsonObject.valueOf(val); - else if(object instanceof Float val) return JsonObject.valueOf(val); - else if(object instanceof Long val) return JsonObject.valueOf(val); - else if(object instanceof String val) return JsonObject.valueOf(val); - else if(object instanceof Boolean val) return JsonObject.valueOf(val); - else if(object instanceof Content) { - if(object instanceof Block c) return getContent(c, Block.class, new JsonObject()); - if(object instanceof BulletType c) return getContent(c, BulletType.class, new JsonObject()); - if(object instanceof Item c) return getContent(c, Item.class, new JsonObject()); - if(object instanceof Liquid c) return getContent(c, Liquid.class, new JsonObject()); - if(object instanceof UnitType c) return getContent(c, UnitType.class, new JsonObject()); - if(object instanceof Weather c) return getContent(c, Weather.class, new JsonObject()); - } - else if(object instanceof Weapon val) return getContent(val, new JsonObject()); - else if(object instanceof Ability val) return getContent(val, new JsonObject()); - else if(object instanceof Seq seq && seq.any()) { - JsonArray array = new JsonArray(); - for(int i = 0; i < seq.size; i++) { - if(seq.get(i) != null) array.add(parse(seq.get(i))); - } - return array; - } - else { - if(object.getClass().isArray()) { - JsonArray array = new JsonArray(); - for(int i = 0; i < Array.getLength(object); i++) { - if(Array.get(object, i) != null) array.add(parse(Array.get(object, i))); - } - return array; - } - } - return JsonObject.valueOf(object.toString()); - } - - static JsonObject getContent(T cont, JsonObject obj) { - return getContent(cont, cont.getClass(), obj); - } - - static JsonObject getContent(Object cont, Class objClass, JsonObject obj) { - obj.add("type", objClass.getName()); - for(Field field : objClass.getFields()){ - if(Modifier.isStatic(field.getModifiers())) continue; - try { - String name = field.getName(); - Object object = field.get(cont); - Object preval = obj.get(name); - if(preval != null) obj.set(name, preval + " or " + object); - else { - if(object == null) obj.add(name, "null"); - else if(!cont.getClass().isAssignableFrom(field.get(cont).getClass()) && !field.get(cont).getClass().isAssignableFrom(cont.getClass())){ - obj.add(name, parse(object)); - } - } - } catch(Throwable e) { - try { - Log.info(e + " ### " + cont + " ### " + objClass + " ### " + cont.getClass() + " ### " + field.get(cont)); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } - obj.add(field.getName(), "### ERROR ###"); - } - } - - return obj; - } - - static void save() { - for(Seq content : Vars.content.getContentMap()) { - if(content.isEmpty()) continue; - - JsonObject data = new JsonObject(); - content.each(cont -> { - JsonObject obj = new JsonObject(); - getContent(cont, obj); - - String name = cont.toString(); - if(cont instanceof MappableContent mapCont) name = mapCont.name; - data.add(name, obj); - }); - try { - modDirectory.child("unitinfo").child(content.peek().getContentType().toString() + ".json").writeString(data.toString(Stringify.FORMATTED)); - } catch (Throwable e){ - Log.warn(e.getMessage()); - } - } - Log.info("JSON file is completely updated!"); - Core.app.exit(); - } -} diff --git a/src/unitinfo/ui/EditorTool.java b/src/unitinfo/core/EditorTool.java similarity index 97% rename from src/unitinfo/ui/EditorTool.java rename to src/unitinfo/core/EditorTool.java index d3bc14c..15fff2c 100644 --- a/src/unitinfo/ui/EditorTool.java +++ b/src/unitinfo/core/EditorTool.java @@ -1,4 +1,4 @@ -package unitinfo.ui; +package unitinfo.core; import arc.func.Boolf; import arc.func.Cons; @@ -12,10 +12,9 @@ import mindustry.content.Blocks; import mindustry.game.Team; import mindustry.world.Block; import mindustry.world.Tile; -import unitinfo.ui.windows.MapEditorDisplay; +import unitinfo.ui.windows.*; -import static unitinfo.ui.windows.MapEditorDisplay.drawTeam; -import static unitinfo.ui.windows.MapEditorDisplay.drawBlock; +import static unitinfo.ui.windows.MapEditorWindow.*; import static unitinfo.ui.windows.Windows.editorTable; import static mindustry.Vars.world; @@ -114,7 +113,7 @@ public enum EditorTool{ Boolf tester; Cons setter; - Block drawBlock = MapEditorDisplay.drawBlock; + Block drawBlock = MapEditorWindow.drawBlock; if(drawBlock.isOverlay()){ Block dest = tile.overlay(); diff --git a/src/unitinfo/core/Main.java b/src/unitinfo/core/Main.java index a3d1a89..e8d760e 100644 --- a/src/unitinfo/core/Main.java +++ b/src/unitinfo/core/Main.java @@ -1,29 +1,22 @@ package unitinfo.core; import arc.input.KeyCode; -import arc.scene.ui.layout.Table; -import unitinfo.shaders.*; import unitinfo.ui.*; import unitinfo.ui.draws.OverDraws; import unitinfo.ui.windows.*; import arc.*; -import arc.struct.*; import mindustry.*; import mindustry.game.EventType.*; import mindustry.mod.*; import static unitinfo.SVars.*; import static arc.Core.*; -import static mindustry.Vars.*; import static unitinfo.SUtils.*; -import static unitinfo.ui.windows.WindowManager.windows; +import static unitinfo.ui.WindowManager.windows; public class Main extends Mod { @Override public void init(){ - turretRange = new RangeShader(); - lineShader = new LineShader(); - Core.app.post(() -> { Mods.ModMeta meta = Vars.mods.locateMod("unitinfo").meta; meta.displayName = "[#B5FFD9]Unit Information[]"; @@ -31,49 +24,35 @@ public class Main extends Mod { meta.description = bundle.get("shar-description"); }); - Events.run(Trigger.class, () -> { + Events.run(Trigger.update, () -> { try { BarInfo.getInfo(getTarget()); } catch (IllegalAccessException | NoSuchFieldException err) { err.printStackTrace(); } - }); - Events.run(Trigger.update, () -> { target = getTarget(); for (Window window : windows) { if(window instanceof Updatable u) u.update(); } + if((input.keyDown(KeyCode.shiftRight) || input.keyDown(KeyCode.shiftLeft))) { - if(input.keyTap(KeyCode.r)) lockTarget(); + if(input.keyTap(KeyCode.r)) { + if(target==getTarget()) locked = !locked; + target = getTarget(); + } } }); Events.on(ClientLoadEvent.class, e -> { Windows.load(); + SettingS.init(); WindowManager.init(); + DisplayManager.init(); OverDraws.init(); - OverDrawer.setEvent(); - - Seq.with(scene.root, - ui.picker, ui.editor, ui.controls, ui.restart, ui.join, ui.discord, - ui.load, ui.custom, ui.language, ui.database, ui.settings, ui.host, - ui.paused, ui.about, ui.bans, ui.admins, ui.traces, ui.maps, ui.content, - ui.planet, ui.research, ui.mods, ui.schematics, ui.logic - ).each(dialog-> dialog.addChild(new ElementDisplay(dialog))); - - Table table = ((Table) scene.find("minimap/position")).row(); - table.add(new SchemDisplay()); - new WaveInfoDisplay().addWaveInfoTable(); - - if(jsonGen) ContentJSON.save(); + OverDrawer.init(); }); } - - public static void lockTarget() { - if(target==getTarget()) locked = !locked; - target = getTarget(); - } } diff --git a/src/unitinfo/core/OverDrawer.java b/src/unitinfo/core/OverDrawer.java index 9a9c19c..f013ec1 100644 --- a/src/unitinfo/core/OverDrawer.java +++ b/src/unitinfo/core/OverDrawer.java @@ -18,7 +18,7 @@ import static mindustry.Vars.*; public class OverDrawer { - public static void setEvent(){ + public static void init(){ Events.run(EventType.Trigger.draw, () -> { float sin = Mathf.absin(Time.time, 6f, 1f); @@ -67,13 +67,4 @@ public class OverDrawer { for(OverDraw drawer : OverDraws.all) drawer.draw(); }); } - - public static boolean isOutCamera(float x, float y) { - return !isInCamera(x, y, 0); - } - - public static boolean isInCamera(float x, float y, float size) { - Tmp.r2.setCentered(x, y, size); - return Tmp.r1.overlaps(Tmp.r2); - } } diff --git a/src/unitinfo/core/SettingS.java b/src/unitinfo/core/SettingS.java index 24bc994..785b3cf 100644 --- a/src/unitinfo/core/SettingS.java +++ b/src/unitinfo/core/SettingS.java @@ -106,9 +106,6 @@ public class SettingS { Seq> settingSeq = new Seq<>(); Seq tapSeq = new Seq<>(); addGraphicSlideSetting("barstyle", 0, 0, 5, 1, s -> s == 0 ? bundle.get("default-bar") : s + bundle.get("th-bar"), tapSeq); - addGraphicTypeSetting("wavemax", 0, 200,100, true, () -> true, s -> s + "waves", tapSeq); - addGraphicCheckSetting("pastwave", false, tapSeq); - addGraphicCheckSetting("emptywave", true, tapSeq); addGraphicCheckSetting("schem", !mobile, tapSeq); //TODO: remove all drawing settings diff --git a/src/unitinfo/shaders/LineShader.java b/src/unitinfo/shaders/LineShader.java deleted file mode 100644 index 3584b4b..0000000 --- a/src/unitinfo/shaders/LineShader.java +++ /dev/null @@ -1,24 +0,0 @@ -package unitinfo.shaders; - -import arc.Core; -import arc.graphics.gl.Shader; -import arc.scene.ui.layout.Scl; -import arc.util.Time; -import mindustry.Vars; - -public class LineShader extends Shader { - public LineShader() { - super(Core.files.internal("shaders/screenspace.vert"), Vars.tree.get("shaders/line.frag")); - } - - @Override - public void apply(){ - setUniformf("u_dp", Scl.scl(1f)); - setUniformf("u_time", Time.time / Scl.scl(1f)); - setUniformf("u_offset", - Core.camera.position.x - Core.camera.width / 2, - Core.camera.position.y - Core.camera.height / 2); - setUniformf("u_texsize", Core.camera.width, Core.camera.height); - setUniformf("u_invsize", 1f/Core.camera.width, 1f/Core.camera.height); - } -} diff --git a/src/unitinfo/ui/DisplayManager.java b/src/unitinfo/ui/DisplayManager.java new file mode 100644 index 0000000..2439a5e --- /dev/null +++ b/src/unitinfo/ui/DisplayManager.java @@ -0,0 +1,28 @@ +package unitinfo.ui; + +import arc.scene.ui.layout.Table; +import arc.struct.Seq; +import unitinfo.ui.display.ElementDisplay; +import unitinfo.ui.display.SchemDisplay; +import unitinfo.ui.display.WaveInfoDisplay; + +import static arc.Core.scene; +import static mindustry.Vars.ui; + +public class DisplayManager { + public static void init() { + //layout debug + Seq.with(scene.root, + ui.picker, ui.editor, ui.controls, ui.restart, ui.join, ui.discord, + ui.load, ui.custom, ui.language, ui.database, ui.settings, ui.host, + ui.paused, ui.about, ui.bans, ui.admins, ui.traces, ui.maps, ui.content, + ui.planet, ui.research, ui.mods, ui.schematics, ui.logic + ).each(dialog-> dialog.addChild(new ElementDisplay(dialog))); + + //schem quick-slot + Table table = ((Table) scene.find("minimap/position")).row(); + table.add(new SchemDisplay()); + new WaveInfoDisplay().addWaveInfoTable(); + + } +} diff --git a/src/unitinfo/ui/windows/WindowManager.java b/src/unitinfo/ui/WindowManager.java similarity index 96% rename from src/unitinfo/ui/windows/WindowManager.java rename to src/unitinfo/ui/WindowManager.java index daaaa35..7c5b9a5 100644 --- a/src/unitinfo/ui/windows/WindowManager.java +++ b/src/unitinfo/ui/WindowManager.java @@ -1,10 +1,11 @@ -package unitinfo.ui.windows; +package unitinfo.ui; import arc.*; import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ui.*; +import unitinfo.ui.windows.Window; public class WindowManager { public static Seq windows = new Seq<>(); diff --git a/src/unitinfo/ui/ElementDisplay.java b/src/unitinfo/ui/display/ElementDisplay.java similarity index 98% rename from src/unitinfo/ui/ElementDisplay.java rename to src/unitinfo/ui/display/ElementDisplay.java index 0b24c3b..2ab7467 100644 --- a/src/unitinfo/ui/ElementDisplay.java +++ b/src/unitinfo/ui/display/ElementDisplay.java @@ -1,4 +1,4 @@ -package unitinfo.ui; +package unitinfo.ui.display; import arc.graphics.g2d.Draw; import arc.graphics.g2d.Lines; diff --git a/src/unitinfo/ui/SchemDisplay.java b/src/unitinfo/ui/display/SchemDisplay.java similarity index 99% rename from src/unitinfo/ui/SchemDisplay.java rename to src/unitinfo/ui/display/SchemDisplay.java index 3adaa15..63e9e18 100644 --- a/src/unitinfo/ui/SchemDisplay.java +++ b/src/unitinfo/ui/display/SchemDisplay.java @@ -1,4 +1,4 @@ -package unitinfo.ui; +package unitinfo.ui.display; import unitinfo.SUtils; import arc.Core; @@ -20,6 +20,7 @@ import mindustry.gen.*; import mindustry.graphics.Pal; import mindustry.ui.Styles; import mindustry.ui.dialogs.*; +import unitinfo.ui.Updatable; import static arc.Core.*; import static mindustry.Vars.*; diff --git a/src/unitinfo/ui/WaveInfoDisplay.java b/src/unitinfo/ui/display/WaveInfoDisplay.java similarity index 74% rename from src/unitinfo/ui/WaveInfoDisplay.java rename to src/unitinfo/ui/display/WaveInfoDisplay.java index f8d0e4e..41294b1 100644 --- a/src/unitinfo/ui/WaveInfoDisplay.java +++ b/src/unitinfo/ui/display/WaveInfoDisplay.java @@ -1,10 +1,13 @@ -package unitinfo.ui; +package unitinfo.ui.display; import arc.scene.ui.layout.*; import arc.util.*; import mindustry.gen.*; import mindustry.graphics.Pal; import mindustry.ui.*; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.environment.Floor; import static unitinfo.SUtils.*; import static unitinfo.SVars.*; @@ -20,11 +23,33 @@ public class WaveInfoDisplay { table.table(head -> { head.table(image -> { image.left(); - image.image(() -> getTile() == null || getTile().floor().uiIcon == error ? clear : getTile().floor().uiIcon).size(iconSmall); - image.image(() -> getTile() == null || getTile().overlay().uiIcon == error ? clear : getTile().overlay().uiIcon).size(iconSmall); - image.image(() -> getTile() == null || getTile().block().uiIcon == error ? clear : getTile().block().uiIcon).size(iconSmall); + image.image(() -> { + Tile tile = getTile(); + if(tile == null) return clear; + Floor floor = tile.floor(); + if(floor.uiIcon == error) return clear; + return floor.uiIcon; + }).size(iconSmall); + image.image(() -> { + Tile tile = getTile(); + if(tile == null) return clear; + Floor floor = tile.overlay(); + if(floor.uiIcon == error) return clear; + return floor.uiIcon; + }).size(iconSmall); + image.image(() -> { + Tile tile = getTile(); + if(tile == null) return clear; + Block floor = tile.block(); + if(floor.uiIcon == error) return clear; + return floor.uiIcon; + }).size(iconSmall); }); - head.label(() -> Strings.format("(@, @)", getTile() == null ? "NaN" : getTile().x, getTile() == null ? "NaN" : getTile().y)).center(); + head.label(() -> { + Tile tile = getTile(); + if(tile == null) return "(NaN, NaN)"; + return Strings.format("(@, @)", tile.x, tile.y); + }).center(); }); table.row(); table.image().height(4f).color(Pal.gray).growX().row(); diff --git a/src/unitinfo/ui/draws/BlockDraw.java b/src/unitinfo/ui/draws/BlockDraw.java index 9dbd612..7acacc9 100644 --- a/src/unitinfo/ui/draws/BlockDraw.java +++ b/src/unitinfo/ui/draws/BlockDraw.java @@ -3,7 +3,7 @@ package unitinfo.ui.draws; import arc.scene.style.TextureRegionDrawable; import mindustry.gen.Groups; -import static unitinfo.core.OverDrawer.isInCamera; +import static unitinfo.SUtils.*; import static arc.Core.settings; public class BlockDraw extends OverDraw { diff --git a/src/unitinfo/ui/draws/RangeDraw.java b/src/unitinfo/ui/draws/RangeDraw.java index b186f51..761c355 100644 --- a/src/unitinfo/ui/draws/RangeDraw.java +++ b/src/unitinfo/ui/draws/RangeDraw.java @@ -14,7 +14,7 @@ import mindustry.world.blocks.defense.turrets.TractorBeamTurret; import mindustry.world.blocks.defense.turrets.Turret; import static unitinfo.SVars.turretRange; -import static unitinfo.core.OverDrawer.isInCamera; +import static unitinfo.SUtils.*; import static arc.Core.*; import static mindustry.Vars.player; diff --git a/src/unitinfo/ui/draws/UnitDraw.java b/src/unitinfo/ui/draws/UnitDraw.java index 837a729..7b25272 100644 --- a/src/unitinfo/ui/draws/UnitDraw.java +++ b/src/unitinfo/ui/draws/UnitDraw.java @@ -25,8 +25,7 @@ import mindustry.world.blocks.units.CommandCenter; import java.util.Objects; -import static unitinfo.core.OverDrawer.isInCamera; -import static unitinfo.core.OverDrawer.isOutCamera; +import static unitinfo.SUtils.*; import static arc.Core.settings; import static mindustry.Vars.*; diff --git a/src/unitinfo/ui/windows/CoreDisplay.java b/src/unitinfo/ui/windows/CoreWindow.java similarity index 98% rename from src/unitinfo/ui/windows/CoreDisplay.java rename to src/unitinfo/ui/windows/CoreWindow.java index 23eefff..72635e3 100644 --- a/src/unitinfo/ui/windows/CoreDisplay.java +++ b/src/unitinfo/ui/windows/CoreWindow.java @@ -26,13 +26,13 @@ import mindustry.world.blocks.storage.CoreBlock; import static mindustry.Vars.*; -public class CoreDisplay extends Window implements Updatable { +public class CoreWindow extends Window implements Updatable { Vec2 scrollPos = new Vec2(0, 0); Table window; float heat; ObjectMap itemData = new ObjectMap<>(); - public CoreDisplay() { + public CoreWindow() { super(Icon.list, "core"); resetUsed(); } diff --git a/src/unitinfo/ui/windows/MapEditorDisplay.java b/src/unitinfo/ui/windows/MapEditorWindow.java similarity index 85% rename from src/unitinfo/ui/windows/MapEditorDisplay.java rename to src/unitinfo/ui/windows/MapEditorWindow.java index f874685..6cbcb4f 100644 --- a/src/unitinfo/ui/windows/MapEditorDisplay.java +++ b/src/unitinfo/ui/windows/MapEditorWindow.java @@ -1,12 +1,12 @@ package unitinfo.ui.windows; import arc.Events; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.Lines; +import arc.graphics.g2d.*; import arc.math.geom.Geometry; import mindustry.editor.MapEditor; import mindustry.game.EventType; import mindustry.graphics.Layer; +import unitinfo.core.EditorTool; import unitinfo.ui.*; import arc.Core; import arc.func.*; @@ -31,7 +31,7 @@ import mindustry.world.*; import static mindustry.Vars.*; -public class MapEditorDisplay extends Window implements Updatable { +public class MapEditorWindow extends Window implements Updatable { Vec2 scrollPos = new Vec2(0, 0); Table window; TextField search; @@ -39,13 +39,14 @@ public class MapEditorDisplay extends Window implements Updatable { final Vec2[][] brushPolygons = new Vec2[MapEditor.brushSizes.length][0]; float heat; float brushSize = -1; - boolean hold = false; - int pastX, pastY; + + boolean drawing; + int lastx, lasty; public static Team drawTeam = Team.sharded; public static Block drawBlock = Blocks.router; - public MapEditorDisplay() { + public MapEditorWindow() { super(Icon.map, "editor"); for(int i = 0; i < MapEditor.brushSizes.length; i++){ @@ -71,8 +72,9 @@ public class MapEditorDisplay extends Window implements Updatable { Draw.reset(); } + Tile tile = world.tileWorld(Core.input.mouseWorldX(), Core.input.mouseWorldY()); + if(tile == null || tool == null || brushSize < 1) return; - if(tool==null) return; int index = 0; for(int i = 0; i < MapEditor.brushSizes.length; i++){ if(brushSize == MapEditor.brushSizes[i]){ @@ -83,31 +85,24 @@ public class MapEditorDisplay extends Window implements Updatable { Lines.stroke(Scl.scl(2f), Pal.accent); if((!drawBlock.isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){ - if(tool == EditorTool.line && hold){ - Vec2 v = Core.input.mouseWorld(); - Lines.poly(brushPolygons[index], pastX, pastY, scaling); - float vx = Mathf.floor(v.x/8)*8-4, vy = Mathf.floor(v.y/8)*8-4; - Lines.poly(brushPolygons[index], vx, vy, scaling); + if(tool == EditorTool.line && drawing){ + Lines.poly(brushPolygons[index], lastx, lasty, scaling); + Lines.poly(brushPolygons[index], tile.x*8, tile.y*8, scaling); } - if((tool.edit || (tool == EditorTool.line && !hold)) && (!mobile || hold)){ - //pencil square outline - Vec2 v = Core.input.mouseWorld(); - float vx = Mathf.floor(v.x/8)*8-4, vy = Mathf.floor(v.y/8)*8-4; + if((tool.edit || (tool == EditorTool.line && !drawing)) && (!mobile || drawing)){ if(tool == EditorTool.pencil && tool.mode == 1){ - Lines.square(vx, vy, scaling * (brushSize + 0.5f)); + Lines.square(tile.x*8, tile.y*8, scaling * (brushSize + 0.5f)); }else{ - Lines.poly(brushPolygons[index], vx, vy, scaling); + Lines.poly(brushPolygons[index], tile.x*8-4, tile.y*8-4, scaling); } } }else{ - if((tool.edit || tool == EditorTool.line) && (!mobile || hold)){ - Vec2 v = Core.input.mouseWorld(); - float vx = Mathf.floor(v.x/8)*8-4, vy = Mathf.floor(v.y/8)*8-4; + if((tool.edit || tool == EditorTool.line) && (!mobile || drawing)){ float offset = (drawBlock.size % 2 == 0 ? scaling / 2f : 0f); Lines.square( - vx + scaling / 2f + offset, - vy + scaling / 2f + offset, + tile.x*8 + scaling / 2f + offset, + tile.y*8 + scaling / 2f + offset, scaling * drawBlock.size / 2f); } } @@ -137,29 +132,21 @@ public class MapEditorDisplay extends Window implements Updatable { heat = 0f; resetPane(); } - if(tool != null && drawBlock != null && !hasMouse()) { - if(Core.input.isTouched()) { - if(!(!mobile&&Core.input.keyDown(KeyCode.mouseLeft))) return; - if(tool== EditorTool.line) { - if(!hold) { - pastX = Mathf.round(Core.input.mouseWorldX() / 8); - pastY = Mathf.round(Core.input.mouseWorldY() / 8); - } - hold = true; - } - else { - pastX = Mathf.round(Core.input.mouseWorldX() / 8); - pastY = Mathf.round(Core.input.mouseWorldY() / 8); - } - tool.touched(pastX, pastY); - } - else if(tool== EditorTool.line) { - if(hold&&pastX>=0&&pastY>=0) tool.touchedLine(pastX, pastY, Mathf.round(Core.input.mouseWorldX() / 8), Mathf.round(Core.input.mouseWorldY() / 8)); - hold = false; - pastX = -1; - pastY = -1; - } + Tile tile = world.tileWorld(Core.input.mouseWorldX(), Core.input.mouseWorldY()); + if(tile == null || tool == null || brushSize < 1 || drawBlock == null || hasMouse()) return; + if(Core.input.isTouched()) { + if((tool == EditorTool.line && drawing) || (!mobile && !Core.input.keyDown(KeyCode.mouseLeft))) return; + drawing = true; + lastx = tile.x; + lasty = tile.y; + tool.touched(lastx, lasty); + } + else { + if(tool == EditorTool.line && drawing) tool.touchedLine(lastx, lasty, tile.x, tile.y); + drawing = false; + lastx = -1; + lasty = -1; } } @@ -184,7 +171,7 @@ public class MapEditorDisplay extends Window implements Updatable { tools.top().left(); tools.table(title -> title.left().background(Tex.underline2).add("Tools [accent]"+(tool==null?"":tool.name())+"[]")).growX().row(); tools.table(bt->{ - Cons addTool = tool -> { + Cons addTool = tool -> { ImageButton button = new ImageButton(ui.getIcon(tool.name()), Styles.clearTogglei); button.clicked(() -> { button.toggle(); @@ -203,11 +190,11 @@ public class MapEditorDisplay extends Window implements Updatable { bt.stack(button, mode); }; - addTool.get(unitinfo.ui.EditorTool.line); - addTool.get(unitinfo.ui.EditorTool.pencil); - addTool.get(unitinfo.ui.EditorTool.eraser); - addTool.get(unitinfo.ui.EditorTool.fill); - addTool.get(unitinfo.ui.EditorTool.spray); + addTool.get(EditorTool.line); + addTool.get(EditorTool.pencil); + addTool.get(EditorTool.eraser); + addTool.get(EditorTool.fill); + addTool.get(EditorTool.spray); ImageButton grid = new ImageButton(Icon.grid, Styles.clearTogglei); grid.clicked(() -> { diff --git a/src/unitinfo/ui/windows/PlayerDisplay.java b/src/unitinfo/ui/windows/PlayerWindow.java similarity index 97% rename from src/unitinfo/ui/windows/PlayerDisplay.java rename to src/unitinfo/ui/windows/PlayerWindow.java index b10b290..c492c4a 100644 --- a/src/unitinfo/ui/windows/PlayerDisplay.java +++ b/src/unitinfo/ui/windows/PlayerWindow.java @@ -20,14 +20,14 @@ import mindustry.ui.*; import static mindustry.Vars.*; -public class PlayerDisplay extends Window implements Updatable { +public class PlayerWindow extends Window implements Updatable { Vec2 scrollPos = new Vec2(0, 0); TextField search; ImageButton.ImageButtonStyle ustyle; @Nullable Player target; float heat; - public PlayerDisplay() { + public PlayerWindow() { super(Icon.players, "player"); } diff --git a/src/unitinfo/ui/windows/ToolDisplay.java b/src/unitinfo/ui/windows/ToolWindow.java similarity index 96% rename from src/unitinfo/ui/windows/ToolDisplay.java rename to src/unitinfo/ui/windows/ToolWindow.java index 651ff12..3d4381d 100644 --- a/src/unitinfo/ui/windows/ToolDisplay.java +++ b/src/unitinfo/ui/windows/ToolWindow.java @@ -13,12 +13,12 @@ import mindustry.gen.Tex; import mindustry.graphics.Pal; import mindustry.ui.Styles; -public class ToolDisplay extends Window implements Updatable { +public class ToolWindow extends Window implements Updatable { Vec2 scrollPos = new Vec2(0, 0); OverDraw selected; float heat; - public ToolDisplay() { + public ToolWindow() { super(Icon.edit, "tool"); } diff --git a/src/unitinfo/ui/windows/UnitDisplay.java b/src/unitinfo/ui/windows/UnitWindow.java similarity index 97% rename from src/unitinfo/ui/windows/UnitDisplay.java rename to src/unitinfo/ui/windows/UnitWindow.java index f119c81..42db370 100644 --- a/src/unitinfo/ui/windows/UnitDisplay.java +++ b/src/unitinfo/ui/windows/UnitWindow.java @@ -30,12 +30,12 @@ import static unitinfo.SVars.*; import static unitinfo.SUtils.*; import static mindustry.Vars.*; -class UnitDisplay extends Window { +class UnitWindow extends Window { final Seq lastColors = Seq.with(Color.clear,Color.clear,Color.clear,Color.clear,Color.clear,Color.clear); final Rect scissor = new Rect(); Vec2 scrollPos; - public UnitDisplay() { + public UnitWindow() { super(Icon.units, "unit"); } @@ -69,7 +69,10 @@ class UnitDisplay extends Window { } image.setDrawable(region); }); - image.clicked(Main::lockTarget); + image.clicked(()->{ + if(target==getTarget()) locked = !locked; + target = getTarget(); + }); tt.add(image).size(iconMed).padRight(12f); tt.label(() -> { @@ -86,7 +89,7 @@ class UnitDisplay extends Window { to.label(() -> target == null ? "(" + 0 + ", " + 0 + ")" : "(" + Strings.fixed(target.x() / tilesize, 2) + ", " + Strings.fixed(target.y() / tilesize, 2) + ")").row(); to.label(() -> target instanceof Unit u ? "[accent]"+ Strings.fixed(u.armor, 0) + "[] Armor" : ""); })).margin(12f).row(); - table.image().height(4f).color(player.team().color).growX().row(); + table.image().height(4f).color((target==null?player.unit():target).team().color).growX().row(); table.add(new OverScrollPane(new Table(bars -> { bars.top(); for (int i = 0; i < 6; i++) { diff --git a/src/unitinfo/ui/windows/WaveDisplay.java b/src/unitinfo/ui/windows/WaveWindow.java similarity index 74% rename from src/unitinfo/ui/windows/WaveDisplay.java rename to src/unitinfo/ui/windows/WaveWindow.java index 303fcda..301126d 100644 --- a/src/unitinfo/ui/windows/WaveDisplay.java +++ b/src/unitinfo/ui/windows/WaveWindow.java @@ -1,6 +1,8 @@ package unitinfo.ui.windows; +import mindustry.Vars; import mindustry.game.Team; +import mindustry.type.UnitType; import unitinfo.ui.OverScrollPane; import arc.Events; import arc.graphics.Color; @@ -24,12 +26,12 @@ import static arc.Core.settings; import static mindustry.Vars.*; -public class WaveDisplay extends Window implements Updatable { +public class WaveWindow extends Window implements Updatable { static Vec2 scrollPos = new Vec2(0, 0); Table window; float heat; - public WaveDisplay() { + public WaveWindow() { super(Icon.waves, "wave"); } @@ -38,9 +40,54 @@ public class WaveDisplay extends Window implements Updatable { window = table; table.top().background(Styles.black8); - ScrollPane pane = new OverScrollPane(rebuild(), Styles.nonePane, scrollPos).disableScroll(true, false); - table.add(pane).grow().name("wave-pane"); + table.add(pane).grow().name("wave-pane").row(); + table.table(total -> { + total.left(); + total.label(()->"~"+state.wave+"+"); + total.field(""+settings.getInt("wavemax"), f->{ + String str = f.replaceAll("\\D", ""); + if(str.isEmpty()) settings.put("wavemax", 0); + else settings.put("wavemax", Integer.parseInt(str)); + }); + total.table().update(units->{ + units.clear(); + units.center(); + + if(Groups.unit.count(u->u.team==state.rules.waveTeam) <= 0) { + units.add("[lightgray][]"); + return; + } + + int row = 0; + int max = Math.max(1, Math.round(window.getWidth()/2/8/2)); + for (UnitType unit : Vars.content.units()) { + int amount = Groups.unit.count(u->u.type==unit&&u.team==state.rules.waveTeam); + if(amount<=0) continue; + units.stack( + new Table(ttt -> { + ttt.center(); + ttt.image(unit.uiIcon).size(iconMed); + ttt.pack(); + }), + + new Table(ttt -> { + ttt.bottom().left(); + ttt.add(amount + "").padTop(2f).fontScale(0.9f); + ttt.pack(); + }) + ).pad(2f); + if(row++ % max == max-1){ + units.row(); + } + } + }).growX(); + }).growX().row(); + table.image().height(4f).color(Pal.gray).growX().row(); + table.table(option->{ + option.check("Show empty wave", settings.getBool("emptywave"), b->settings.put("emptywave", b)).margin(4f); + option.check("Show previous wave", settings.getBool("pastwave"), b->settings.put("pastwave", b)).margin(4f); + }); Events.on(EventType.WorldLoadEvent.class, e -> { pane.clearChildren(); pane.setWidget(rebuild()); @@ -90,6 +137,8 @@ public class WaveDisplay extends Window implements Updatable { for (int i = settings.getBool("pastwave") ? 1 : state.wave; i <= Math.min(state.wave + settings.getInt("wavemax"), (state.isCampaign() && state.rules.winWave > 0 ? state.rules.winWave : Integer.MAX_VALUE)); i++) { final int index = i; + if (state.rules.spawns.find(g -> g.getSpawned(index-1) > 0) == null && !settings.getBool("emptywave")) continue; + body.table(waveRow -> { waveRow.left(); diff --git a/src/unitinfo/ui/windows/Window.java b/src/unitinfo/ui/windows/Window.java index 7883ad2..fe14e4c 100644 --- a/src/unitinfo/ui/windows/Window.java +++ b/src/unitinfo/ui/windows/Window.java @@ -10,6 +10,7 @@ import arc.scene.ui.layout.*; import arc.util.*; import mindustry.gen.*; import mindustry.ui.*; +import unitinfo.ui.WindowManager; public class Window extends Table{ public TextureRegionDrawable icon; diff --git a/src/unitinfo/ui/windows/Windows.java b/src/unitinfo/ui/windows/Windows.java index 8ed8bfa..95f4630 100644 --- a/src/unitinfo/ui/windows/Windows.java +++ b/src/unitinfo/ui/windows/Windows.java @@ -1,25 +1,14 @@ package unitinfo.ui.windows; -import arc.util.*; -import mindustry.gen.*; -import unitinfo.ui.windows.*; - public class Windows { - public static MapEditorDisplay editorTable; + public static MapEditorWindow editorTable; public static void load(){ - new UnitDisplay(); - new WaveDisplay(); - new CoreDisplay(); - new PlayerDisplay(); - new ToolDisplay(); - editorTable = new MapEditorDisplay(); - new Window(Icon.box, "test-window", t -> { - t.labelWrap(() -> t.parent.x + ", " + t.parent.y).top().right().growX(); - t.row(); - t.labelWrap(() -> t.parent.getWidth() + ", " + t.parent.getHeight()).top().right().growX(); - t.row(); - t.labelWrap(() -> "T: " + Time.time).top().right().growX(); - }); + new UnitWindow(); + new WaveWindow(); + new CoreWindow(); + new PlayerWindow(); + new ToolWindow(); + editorTable = new MapEditorWindow(); } }