From 5f06ce0bff9a9495d4ec6740914b8970cae774ba Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Nov 2023 20:37:25 -0500 Subject: [PATCH] Added draw print instruction --- core/assets/bundles/bundle.properties | 4 +- core/assets/fonts/logic.ttf | Bin 0 -> 41208 bytes core/src/mindustry/logic/LExecutor.java | 49 ++++++++++++++++++ core/src/mindustry/logic/LStatements.java | 40 +++++++++++--- core/src/mindustry/ui/Fonts.java | 12 ++++- .../world/blocks/logic/LogicDisplay.java | 16 ++++-- 6 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 core/assets/fonts/logic.ttf diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index f9d668db70..bb16016601 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1785,7 +1785,6 @@ block.disperse.name = Disperse block.afflict.name = Afflict block.lustre.name = Lustre block.scathe.name = Scathe -block.fabricator.name = Fabricator block.tank-refabricator.name = Tank Refabricator block.mech-refabricator.name = Mech Refabricator block.ship-refabricator.name = Ship Refabricator @@ -2111,7 +2110,6 @@ block.logic-display.description = Displays arbitrary graphics from a logic proce block.large-logic-display.description = Displays arbitrary graphics from a logic processor. block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment. block.repair-turret.description = Continuously repairs the closest damaged unit in its vicinity. Optionally accepts coolant. -block.payload-propulsion-tower.description = Long-range payload transport structure. Shoots payloads to other linked payload propulsion towers. #Erekir block.core-bastion.description = Core of the base. Armored. Once destroyed, the sector is lost. @@ -2149,7 +2147,6 @@ block.impact-drill.description = When placed on ore, outputs items in bursts ind block.eruption-drill.description = An improved impact drill. Capable of mining thorium. Requires hydrogen. block.reinforced-conduit.description = Moves fluids forward. Doesn't accept non-conduit inputs to the sides. block.reinforced-liquid-router.description = Distributes fluids equally to all sides. -block.reinforced-junction.description = Acts as a bridge between two crossing conduits. block.reinforced-liquid-tank.description = Stores a large amount of fluids. block.reinforced-liquid-container.description = Stores a sizeable amount of fluids. block.reinforced-bridge-conduit.description = Transports fluids over structures and terrain. @@ -2350,6 +2347,7 @@ graphicstype.poly = Fill a regular polygon. graphicstype.linepoly = Draw a regular polygon outline. graphicstype.triangle = Fill a triangle. graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[]. +graphicstype.print = Draws text from the print buffer.\nClears the print buffer. lenum.always = Always true. lenum.idiv = Integer division. diff --git a/core/assets/fonts/logic.ttf b/core/assets/fonts/logic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0270cdfe3caa811e1b252cdcc5b179989c1b8ad6 GIT binary patch literal 41208 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 b>R(G#|5~E@*AmsgmZ<) 0){ + var data = Fonts.logic.getData(); + int advance = (int)data.spaceXadvance, lineHeight = (int)data.lineHeight; + + int xOffset, yOffset; + int align = p1; //p1 is not a variable, it's a raw align value. what a massive hack + + int maxWidth = 0, lines = 1, lineWidth = 0; + for(int i = 0; i < str.length(); i++){ + char next = str.charAt(i); + if(next == '\n'){ + maxWidth = Math.max(maxWidth, lineWidth); + lineWidth = 0; + lines ++; + }else{ + lineWidth ++; + } + } + maxWidth = Math.max(maxWidth, lineWidth); + + float + width = maxWidth * advance, + height = lines * lineHeight, + ha = ((Align.isLeft(align) ? -1f : 0f) + 1f + (Align.isRight(align) ? 1f : 0f))/2f, + va = ((Align.isBottom(align) ? -1f : 0f) + 1f + (Align.isTop(align) ? 1f : 0f))/2f; + + xOffset = -(int)(width * ha); + yOffset = -(int)(height * va) + (lines - 1) * lineHeight; + + + int curX = exec.numi(x), curY = exec.numi(y); + for(int i = 0; i < str.length(); i++){ + char next = str.charAt(i); + if(next == '\n'){ + //move Y down when newline is encountered + curY -= lineHeight; + curX = exec.numi(x); //reset + continue; + } + exec.graphicsBuffer.add(DisplayCmd.get(LogicDisplay.commandPrint, packSign(curX + xOffset), packSign(curY + yOffset), next, 0, 0, 0)); + curX += advance; + } + + exec.textBuffer.setLength(0); + } }else{ //add graphics calls, cap graphics buffer size exec.graphicsBuffer.add(DisplayCmd.get(type, packSign(exec.numi(x)), packSign(exec.numi(y)), packSign(num1), packSign(exec.numi(p2)), packSign(exec.numi(p3)), packSign(exec.numi(p4)))); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 3806254550..2c0c8159c4 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -6,6 +6,7 @@ import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; @@ -121,6 +122,20 @@ public class LStatements{ @RegisterStatement("draw") public static class DrawStatement extends LStatement{ + static final String[] aligns = {"center", "top", "bottom", "left", "right", "topLeft", "topRight", "bottomLeft", "bottomRight"}; + //yes, boxing Integer is gross but this is easier to construct and Integers <128 don't allocate anyway + static final ObjectMap nameToAlign = ObjectMap.of( + "center", Align.center, + "top", Align.top, + "bottom", Align.bottom, + "left", Align.left, + "right", Align.right, + "topLeft", Align.topLeft, + "topRight", Align.topRight, + "bottomLeft", Align.bottomLeft, + "bottomRight", Align.bottomRight + ); + public GraphicsType type = GraphicsType.clear; public String x = "0", y = "0", p1 = "0", p2 = "0", p3 = "0", p4 = "0"; @@ -147,6 +162,11 @@ public class LStatements{ p2 = "32"; p3 = "0"; } + + if(type == GraphicsType.print){ + p2 = "bottomLeft"; + } + rebuild(table); }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); @@ -221,14 +241,21 @@ public class LStatements{ row(s); fields(s, "rotation", p3, v -> p3 = v); } - //TODO - /* - case character -> { + case print -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); + row(s); - fields(s, "char", p1, v -> p1 = v); - }*/ + + s.add("align "); + + s.button(b -> { + b.label(() -> nameToAlign.containsKey(p1) ? p1 : "bottomLeft"); + b.clicked(() -> showSelect(b, aligns, p1, t -> { + p1 = t; + }, 2, cell -> cell.size(165, 50))); + }, Styles.logict, () -> {}).size(165, 40).color(s.color).left().padLeft(2); + } } }).expand().left(); } @@ -243,7 +270,8 @@ public class LStatements{ @Override public LInstruction build(LAssembler builder){ - return new DrawI((byte)type.ordinal(), 0, builder.var(x), builder.var(y), builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4)); + return new DrawI((byte)type.ordinal(), 0, builder.var(x), builder.var(y), + type == GraphicsType.print ? nameToAlign.get(p1, Align.bottomLeft) : builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4)); } @Override diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index b32847a353..6dd4ff1c24 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -35,7 +35,7 @@ public class Fonts{ private static TextureRegion[] iconTable; private static int lastCid; - public static Font def, outline, icon, iconLarge, tech; + public static Font def, outline, icon, iconLarge, tech, logic; public static TextureRegion logicIcon(int id){ return iconTable[id]; @@ -71,11 +71,13 @@ public class Fonts{ FreeTypeFontParameter param = fontParameter(); Core.assets.load("default", Font.class, new FreeTypeFontLoaderParameter(mainFont, param)).loaded = f -> Fonts.def = f; + Core.assets.load("icon", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{ size = 30; incremental = true; characters = "\0"; }})).loaded = f -> Fonts.icon = f; + Core.assets.load("iconLarge", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{ size = 48; incremental = false; @@ -83,6 +85,14 @@ public class Fonts{ borderWidth = 5f; borderColor = Color.darkGray; }})).loaded = f -> Fonts.iconLarge = f; + + Core.assets.load("logic", Font.class, new FreeTypeFontLoaderParameter("fonts/logic.ttf", new FreeTypeFontParameter(){{ + size = 16; + //generated all at once, it's fast enough anyway + incremental = false; + //ASCII only + characters = "\0ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!`?'.,;:()[]{}<>|/@\\^$€-%+=#_&~*"; + }})).loaded = f -> Fonts.logic = f; } public static TextureRegion getLargeIcon(String name){ diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index 453a3391bd..cfd5c45be8 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -28,7 +28,8 @@ public class LogicDisplay extends Block{ commandLinePoly = 8, commandTriangle = 9, commandImage = 10, - commandCharacter = 11; + //note that this command actually only draws 1 character, unpacked in instruction + commandPrint = 11; public int maxSides = 25; @@ -103,8 +104,14 @@ public class LogicDisplay extends Block{ var icon = Fonts.logicIcon(p1); Draw.rect(Fonts.logicIcon(p1), x, y, p2, p2 / icon.ratio(), p3); } - case commandCharacter -> { - //TODO + case commandPrint -> { + var glyph = Fonts.logic.getData().getGlyph((char)p1); + if(glyph != null){ + Tmp.tr1.set(Fonts.logic.getRegion().texture); + Tmp.tr1.set(glyph.u, glyph.v2, glyph.u2, glyph.v); + + Draw.rect(Tmp.tr1, x + Tmp.tr1.width/2f + glyph.xoffset, y + Tmp.tr1.height/2f + glyph.yoffset + Fonts.logic.getData().capHeight + Fonts.logic.getData().ascent, Tmp.tr1.width, Tmp.tr1.height); + } } } } @@ -151,7 +158,8 @@ public class LogicDisplay extends Block{ linePoly, triangle, image, - ;//character; + //note that this command actually only draws 1 character, unpacked in instruction + print; public static final GraphicsType[] all = values(); }