From f60b892029eed6e8028917480fd412f9ca8ac049 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 31 Oct 2025 23:31:24 -0400 Subject: [PATCH] Patcher support for icon regions --- .../mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/mod/ContentParser.java | 18 +++++++++++++++++- .../ui/fragments/PlacementFragment.java | 2 +- tests/src/test/java/PatcherTests.java | 9 +++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index e4f2fb4a81..b9844129be 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1509,7 +1509,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //TODO duplicated code? table.table(t -> { t.left(); - t.add(new Image(block.getDisplayIcon(tile))).size(8 * 4); + t.add(new Image(block.getDisplayIcon(tile))).scaling(Scaling.fit).size(8 * 4); t.labelWrap(block.getDisplayName(tile)).left().width(190f).padLeft(5); }).growX().left(); diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index a7c4038a51..dd93a8a1df 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -8,6 +8,7 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.serialization.*; @@ -99,7 +100,22 @@ public class ContentParser{ } } }); - put(TextureRegion.class, (type, data) -> Core.atlas == null ? null : Core.atlas.find(data.asString())); + put(TextureRegion.class, (type, data) -> { + if(Core.atlas == null) return null; + String str = data.asString(); + if(str.startsWith("icon-")){ + var icon = Icon.icons.get(str.substring("icon-".length())); + if(icon != null){ + icon.getRegion().scale = 1f / Scl.scl(1f); + return icon.getRegion(); + } + } + TextureRegion result = Core.atlas.find(str); + if(!result.found()){ + warn("Sprite not found: '" + str + "'"); + } + return result; + }); put(Color.class, (type, data) -> Color.valueOf(data.asString())); put(StatusEffect.class, (type, data) -> { if(data.isString()){ diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index eb8baf410b..7df456cb0c 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -379,7 +379,7 @@ public class PlacementFragment{ } String keyComboFinal = keyCombo; header.left(); - header.add(new Image(displayBlock.uiIcon)).size(8 * 4); + header.add(new Image(displayBlock.uiIcon)).scaling(Scaling.fit).size(8 * 4); header.labelWrap(() -> !unlocked(displayBlock) ? Core.bundle.get("block.unknown") : displayBlock.localizedName + keyComboFinal) .left().width(190f).padLeft(5); header.add().growX(); diff --git a/tests/src/test/java/PatcherTests.java b/tests/src/test/java/PatcherTests.java index 7ea2de59bc..14108cc46c 100644 --- a/tests/src/test/java/PatcherTests.java +++ b/tests/src/test/java/PatcherTests.java @@ -250,6 +250,15 @@ public class PatcherTests{ assertEquals(1, Vars.state.patcher.patches.first().warnings.size); } + @Test + void testNoIdAssign() throws Exception{ + Vars.state.patcher.apply(Seq.with(""" + block.router.id: 9231 + """)); + + assertEquals(1, Vars.state.patcher.patches.first().warnings.size); + } + @Test void testUnknownFieldWarn() throws Exception{ Vars.state.patcher.apply(Seq.with("""