diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index cf6be1cb93..113927a31b 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1704,6 +1704,11 @@ lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.unitcontrol = Control the currently bound unit. lst.unitradar = Locate units around the currently bound unit. lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. +lst.getblock = Get tile data at any location. +lst.setblock = Set tile data at any location. +lst.spawnunit = Spawn unit at a location. +lst.packcolor = Pack [0, 1] RGBA components into a single number for drawing or rule-setting. +lst.setrule = Set a game rule. logic.nounitbuild = [red]Unit building logic is not allowed here. @@ -1723,6 +1728,7 @@ lacess.speed = Top speed of a unit, in tiles/sec. graphicstype.clear = Fill the display with a color. graphicstype.color = Set color for next drawing operations. +graphicstype.col = Equivalent to color, but packed.\nPacked colors are written as hex codes with a [accent]%[] prefix.\nExample: [accent]%ff0000[] would be red. graphicstype.stroke = Set line width. graphicstype.line = Draw line segment. graphicstype.rect = Fill a rectangle. diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 837601b8cb..b2ee761cfa 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -52,7 +52,7 @@ public enum LAccess{ shoot("x", "y", "shoot"), shootp(true, "unit", "shoot"), config(true, "to"), - color("r", "g", "b"); + color("to"); public final String[] params; public final boolean isObj; diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index e907a10eeb..ed6f4ec73d 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -111,6 +111,7 @@ public class LAssembler{ g = Strings.parseInt(symbol, 16, 0, 3, 5), b = Strings.parseInt(symbol, 16, 0, 5, 7), a = symbol.length() == 9 ? Strings.parseInt(symbol, 16, 0, 7, 9) : 255; + return Color.toDoubleBits(r, g, b, a); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 81e56ff055..5fea84b467 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,5 +1,6 @@ package mindustry.logic; +import arc.graphics.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -880,7 +881,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ //graphics on headless servers are useless. - if(Vars.headless) return; + if(Vars.headless || exec.graphicsBuffer.size >= maxGraphicsBuffer) return; int num1 = exec.numi(p1); @@ -888,12 +889,27 @@ public class LExecutor{ num1 = exec.obj(p1) instanceof UnlockableContent u ? u.iconId : 0; } - //add graphics calls, cap graphics buffer size - if(exec.graphicsBuffer.size < maxGraphicsBuffer){ + //explicitly unpack colorPack, it's pre-processed here + if(type == LogicDisplay.commandColorPack){ + double packed = exec.num(x); + + int value = (int)(Double.doubleToRawLongBits(packed)), + r = ((value & 0xff000000) >>> 24), + g = ((value & 0x00ff0000) >>> 16), + b = ((value & 0x0000ff00) >>> 8), + a = ((value & 0x000000ff)); + + exec.graphicsBuffer.add(DisplayCmd.get(LogicDisplay.commandColor, pack(r), pack(g), pack(b), pack(a), 0, 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)))); } } + static int pack(int value){ + return value & 0b0111111111; + } + static int packSign(int value){ return (Math.abs(value) & 0b0111111111) | (value < 0 ? 0b1000000000 : 0); } @@ -1061,7 +1077,7 @@ public class LExecutor{ } } - //TODO lookup color instruction and inverse lookup + //TODO inverse lookup public static class LookupI implements LInstruction{ public int dest; public int from; @@ -1082,6 +1098,26 @@ public class LExecutor{ } } + public static class PackColorI implements LInstruction{ + public int result, r, g, b, a; + + public PackColorI(int result, int r, int g, int b, int a){ + this.result = result; + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public PackColorI(){ + } + + @Override + public void run(LExecutor exec){ + exec.setnum(result, Color.toDoubleBits(Mathf.clamp(exec.numf(r)), Mathf.clamp(exec.numf(g)), Mathf.clamp(exec.numf(b)), Mathf.clamp(exec.numf(a)))); + } + } + //endregion //region privileged / world instructions @@ -1203,6 +1239,7 @@ public class LExecutor{ public void run(LExecutor exec){ switch(rule){ case waveTimer -> state.rules.waveTimer = exec.bool(value); + case currentWaveTime -> state.wavetime = exec.numf(value) * 60f; case waves -> state.rules.waves = exec.bool(value); case attackMode -> state.rules.attackMode = exec.bool(value); case waveSpacing -> state.rules.waveSpacing = exec.numf(value) * 60f; diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 0b1d85cd25..d515aaf2f4 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -180,6 +180,9 @@ public class LStatements{ row(s); fields(s, "a", p2, v -> p2 = v); } + case col -> { + fields(s, "color", x, v -> x = v).width(144f); + } case stroke -> { s.add().width(4); fields(s, x, v -> x = v); @@ -722,6 +725,35 @@ public class LStatements{ } } + @RegisterStatement("packcolor") + public static class PackColorStatement extends LStatement{ + public String result = "result", r = "1", g = "0", b = "0", a = "1"; + + @Override + public void build(Table table){ + fields(table, result, str -> result = str); + + table.add(" = pack "); + + row(table); + + fields(table, r, str -> r = str); + fields(table, g, str -> g = str); + fields(table, b, str -> b = str); + fields(table, a, str -> a = str); + } + + @Override + public Color color(){ + return Pal.logicOperations; + } + + @Override + public LInstruction build(LAssembler builder){ + return new PackColorI(builder.var(result), builder.var(r), builder.var(g), builder.var(b), builder.var(a)); + } + } + @RegisterStatement("end") public static class EndStatement extends LStatement{ @Override @@ -1217,7 +1249,7 @@ public class LStatements{ table.button(b -> { b.label(() -> rule.name()).growX().wrap().labelAlign(Align.center); b.clicked(() -> showSelect(b, LogicRule.all, rule, o -> rule = o, 2, c -> c.width(150f))); - }, Styles.logict, () -> {}).size(150f, 40f).pad(4f).color(table.color); + }, Styles.logict, () -> {}).size(160f, 40f).pad(4f).color(table.color); table.add(" = "); diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index c51e7054f9..50652c5d10 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -166,8 +166,8 @@ public class LogicDialog extends BaseDialog{ t.button(example.name(), style, () -> { canvas.add(prov.get()); dialog.hide(); - }).size(140f, 50f).self(c -> tooltip(c, "lst." + example.name())); - if(++i % 2 == 0) t.row(); + }).size(130f, 50f).self(c -> tooltip(c, "lst." + example.name())); + if(++i % 3 == 0) t.row(); } }); dialog.addCloseButton(); diff --git a/core/src/mindustry/logic/LogicRule.java b/core/src/mindustry/logic/LogicRule.java index f89e801ca5..d78aa9bc93 100644 --- a/core/src/mindustry/logic/LogicRule.java +++ b/core/src/mindustry/logic/LogicRule.java @@ -1,6 +1,7 @@ package mindustry.logic; public enum LogicRule{ + currentWaveTime, waveTimer, waves, waveSpacing, diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index 7e6bb10e29..7c3d087f8e 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -17,14 +17,16 @@ public class LogicDisplay extends Block{ public static final byte commandClear = 0, commandColor = 1, - commandStroke = 2, - commandLine = 3, - commandRect = 4, - commandLineRect = 5, - commandPoly = 6, - commandLinePoly = 7, - commandTriangle = 8, - commandImage = 9; + //virtual command, unpacked in instruction + commandColorPack = 2, + commandStroke = 3, + commandLine = 4, + commandRect = 5, + commandLineRect = 6, + commandPoly = 7, + commandLinePoly = 8, + commandTriangle = 9, + commandImage = 10; public int maxSides = 25; @@ -125,6 +127,8 @@ public class LogicDisplay extends Block{ public enum GraphicsType{ clear, color, + //virtual + col, stroke, line, rect, @@ -132,7 +136,7 @@ public class LogicDisplay extends Block{ poly, linePoly, triangle, - image; + image,; public static final GraphicsType[] all = values(); } diff --git a/core/src/mindustry/world/blocks/power/LightBlock.java b/core/src/mindustry/world/blocks/power/LightBlock.java index e81eda7cb0..2636923fb8 100644 --- a/core/src/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/mindustry/world/blocks/power/LightBlock.java @@ -63,7 +63,7 @@ public class LightBlock extends Block{ @Override public void control(LAccess type, double p1, double p2, double p3, double p4){ if(type == LAccess.color){ - color = Color.rgba8888(Mathf.clamp((float)p1), Mathf.clamp((float)p2), Mathf.clamp((float)p3), 1f); + color = Tmp.c1.fromDouble(p1).rgba8888(); } super.control(type, p1, p2, p3, p4); diff --git a/gradle.properties b/gradle.properties index 7e9e4ce0a8..c50f6b3d4d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=a1e1841832 +archash=f95111f269