diff --git a/core/src/mindustry/logic/BinaryOp.java b/core/src/mindustry/logic/BinaryOp.java deleted file mode 100644 index 97601a231d..0000000000 --- a/core/src/mindustry/logic/BinaryOp.java +++ /dev/null @@ -1,46 +0,0 @@ -package mindustry.logic; - -import arc.math.*; - -public enum BinaryOp{ - add("+", (a, b) -> a + b), - sub("-", (a, b) -> a - b), - mul("*", (a, b) -> a * b), - div("/", (a, b) -> a / b), - mod("%", (a, b) -> a % b), - equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1), - lessThan("<", (a, b) -> a < b ? 1 : 0), - lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), - greaterThan(">", (a, b) -> a > b ? 1 : 0), - greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), - pow("^", Math::pow), - shl(">>", (a, b) -> (int)a >> (int)b), - shr("<<", (a, b) -> (int)a << (int)b), - or("or", (a, b) -> (int)a | (int)b), - and("and", (a, b) -> (int)a & (int)b), - xor("xor", (a, b) -> (int)a ^ (int)b), - max("max", Math::max), - min("min", Math::min), - atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), - dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)); - - public static final BinaryOp[] all = values(); - - public final OpLambda function; - public final String symbol; - - BinaryOp(String symbol, OpLambda function){ - this.symbol = symbol; - this.function = function; - } - - @Override - public String toString(){ - return symbol; - } - - interface OpLambda{ - double get(double a, double b); - } -} diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 21a3c95e8b..ceda4050a7 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -106,6 +106,26 @@ public class LAssembler{ arr = new String[]{line}; } + String type = arr[0]; + + //legacy stuff + if(type.equals("bop")){ + arr[0] = "op"; + + //field order for bop used to be op a, b, result, but now it's op result a b + String res = arr[4]; + arr[4] = arr[3]; + arr[3] = arr[2]; + arr[2] = res; + }else if(type.equals("uop")){ + arr[0] = "op"; + + //field order for uop used to be op a, result, but now it's op result a + String res = arr[3]; + arr[3] = arr[2]; + arr[2] = res; + } + LStatement st = LogicIO.read(arr); if(st != null){ @@ -121,6 +141,7 @@ public class LAssembler{ } } }catch(Exception parseFailed){ + parseFailed.printStackTrace(); //when parsing fails, add a dummy invalid statement statements.add(new InvalidStatement()); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index a61a23a04a..485743a016 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -377,40 +377,26 @@ public class LExecutor{ } } - public static class BinaryOpI implements LInstruction{ - public BinaryOp op = BinaryOp.add; + public static class OpI implements LInstruction{ + public LogicOp op = LogicOp.add; public int a, b, dest; - public BinaryOpI(BinaryOp op, int a, int b, int dest){ + public OpI(LogicOp op, int a, int b, int dest){ this.op = op; this.a = a; this.b = b; this.dest = dest; } - BinaryOpI(){} + OpI(){} @Override public void run(LExecutor exec){ - exec.setnum(dest, op.function.get(exec.num(a), exec.num(b))); - } - } - - public static class UnaryOpI implements LInstruction{ - public UnaryOp op = UnaryOp.negate; - public int value, dest; - - public UnaryOpI(UnaryOp op, int value, int dest){ - this.op = op; - this.value = value; - this.dest = dest; - } - - UnaryOpI(){} - - @Override - public void run(LExecutor exec){ - exec.setnum(dest, op.function.get(exec.num(value))); + if(op.unary){ + exec.setnum(dest, op.function1.get(exec.num(a))); + }else{ + exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + } } } diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index bcfbb9c3f3..a983023e32 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -56,15 +56,23 @@ public class LStatements{ } } - @RegisterStatement("getlink") - public static class GetLinkStatement extends LStatement{ - public String output = "result", address = "0"; + @RegisterStatement("read") + public static class ReadStatement extends LStatement{ + public String output = "result", target = "cell1", address = "0"; @Override public void build(Table table){ + table.add(" read "); + field(table, output, str -> output = str); - table.add(" = link# "); + table.add(" = "); + + fields(table, target, str -> target = str); + + row(table); + + table.add(" at "); field(table, address, str -> address = str); } @@ -76,7 +84,7 @@ public class LStatements{ @Override public LInstruction build(LAssembler builder){ - return new GetLinkI(builder.var(output), builder.var(address)); + return new ReadI(builder.var(target), builder.var(address), builder.var(output)); } } @@ -112,38 +120,6 @@ public class LStatements{ } } - @RegisterStatement("read") - public static class ReadStatement extends LStatement{ - public String output = "result", target = "cell1", address = "0"; - - @Override - public void build(Table table){ - table.add(" read "); - - field(table, output, str -> output = str); - - table.add(" = "); - - fields(table, target, str -> target = str); - - row(table); - - table.add(" at "); - - field(table, address, str -> address = str); - } - - @Override - public LCategory category(){ - return LCategory.io; - } - - @Override - public LInstruction build(LAssembler builder){ - return new ReadI(builder.var(target), builder.var(address), builder.var(output)); - } - } - @RegisterStatement("draw") public static class DrawStatement extends LStatement{ public GraphicsType type = GraphicsType.clear; @@ -253,6 +229,26 @@ public class LStatements{ } } + @RegisterStatement("print") + public static class PrintStatement extends LStatement{ + public String value = "\"frog\""; + + @Override + public void build(Table table){ + field(table, value, str -> value = str).width(0f).growX().padRight(3); + } + + @Override + public LInstruction build(LAssembler builder){ + return new PrintI(builder.var(value)); + } + + @Override + public LCategory category(){ + return LCategory.io; + } + } + @RegisterStatement("drawflush") public static class DrawFlushStatement extends LStatement{ public String target = "display1"; @@ -274,26 +270,6 @@ public class LStatements{ } } - @RegisterStatement("print") - public static class PrintStatement extends LStatement{ - public String value = "\"frog\""; - - @Override - public void build(Table table){ - field(table, value, str -> value = str).width(0f).growX().padRight(3); - } - - @Override - public LInstruction build(LAssembler builder){ - return new PrintI(builder.var(value)); - } - - @Override - public LCategory category(){ - return LCategory.control; - } - } - @RegisterStatement("printflush") public static class PrintFlushStatement extends LStatement{ public String target = "message1"; @@ -315,6 +291,30 @@ public class LStatements{ } } + @RegisterStatement("getlink") + public static class GetLinkStatement extends LStatement{ + public String output = "result", address = "0"; + + @Override + public void build(Table table){ + field(table, output, str -> output = str); + + table.add(" = link# "); + + field(table, address, str -> address = str); + } + + @Override + public LCategory category(){ + return LCategory.blocks; + } + + @Override + public LInstruction build(LAssembler builder){ + return new GetLinkI(builder.var(output), builder.var(address)); + } + } + @RegisterStatement("control") public static class ControlStatement extends LStatement{ public LAccess type = LAccess.enabled; @@ -561,62 +561,51 @@ public class LStatements{ } } - @RegisterStatement("bop") - public static class BinaryOpStatement extends LStatement{ - public BinaryOp op = BinaryOp.add; - public String a = "a", b = "b", dest = "result"; + @RegisterStatement("op") + public static class OperationStatement extends LStatement{ + public LogicOp op = LogicOp.add; + public String dest = "result", a = "a", b = "b"; @Override public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + field(table, dest, str -> dest = str); table.add(" = "); - row(table); + if(op.unary){ + opButton(table); - field(table, a, str -> a = str); + field(table, a, str -> a = str); + }else{ + row(table); + field(table, a, str -> a = str); + + opButton(table); + + field(table, b, str -> b = str); + } + } + + void opButton(Table table){ table.button(b -> { b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, BinaryOp.all, op, o -> op = o)); + b.clicked(() -> showSelect(b, LogicOp.all, op, o -> { + op = o; + rebuild(table); + })); }, Styles.logict, () -> {}).size(60f, 40f).pad(4f).color(table.color); - - field(table, b, str -> b = str); } @Override public LInstruction build(LAssembler builder){ - return new BinaryOpI(op,builder.var(a), builder.var(b), builder.var(dest)); - } - - @Override - public LCategory category(){ - return LCategory.operations; - } - } - - @RegisterStatement("uop") - public static class UnaryOpStatement extends LStatement{ - public UnaryOp op = UnaryOp.negate; - public String value = "b", dest = "result"; - - @Override - public void build(Table table){ - field(table, dest, str -> dest = str); - - table.add(" = "); - - table.button(b -> { - b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, UnaryOp.all, op, o -> op = o)); - }, Styles.logict, () -> {}).size(50f, 40f).pad(3f).color(table.color); - - field(table, value, str -> value = str); - } - - @Override - public LInstruction build(LAssembler builder){ - return new UnaryOpI(op, builder.var(value), builder.var(dest)); + return new OpI(op,builder.var(a), builder.var(b), builder.var(dest)); } @Override diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index f201c7535b..a9f2debfbb 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -61,7 +61,12 @@ public class LogicDialog extends BaseDialog{ for(Prov prov : LogicIO.allStatements){ LStatement example = prov.get(); if(example instanceof InvalidStatement) continue; - t.button(example.name(), Styles.cleart, () -> { + + TextButtonStyle style = new TextButtonStyle(Styles.cleart); + style.fontColor = example.category().color; + style.font = Fonts.outline; + + t.button(example.name(), style, () -> { canvas.add(prov.get()); dialog.hide(); }).size(140f, 50f); diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java new file mode 100644 index 0000000000..b53a60d5de --- /dev/null +++ b/core/src/mindustry/logic/LogicOp.java @@ -0,0 +1,76 @@ +package mindustry.logic; + +import arc.math.*; + +public enum LogicOp{ + add("+", (a, b) -> a + b), + sub("-", (a, b) -> a - b), + mul("*", (a, b) -> a * b), + div("/", (a, b) -> a / b), + mod("%", (a, b) -> a % b), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0), + notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1), + lessThan("<", (a, b) -> a < b ? 1 : 0), + lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), + greaterThan(">", (a, b) -> a > b ? 1 : 0), + greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), + pow("^", Math::pow), + shl(">>", (a, b) -> (int)a >> (int)b), + shr("<<", (a, b) -> (int)a << (int)b), + or("or", (a, b) -> (int)a | (int)b), + and("and", (a, b) -> (int)a & (int)b), + xor("xor", (a, b) -> (int)a ^ (int)b), + max("max", Math::max), + min("min", Math::min), + atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), + dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), + + negate("-", a -> -a), + not("not", a -> ~(int)(a)), + abs("abs", Math::abs), + log("log", Math::log), + log10("log10", Math::log10), + sin("sin", d -> Math.sin(d * 0.017453292519943295D)), + cos("cos", d -> Math.cos(d * 0.017453292519943295D)), + tan("tan", d -> Math.tan(d * 0.017453292519943295D)), + floor("floor", Math::floor), + ceil("ceil", Math::ceil), + sqrt("sqrt", Math::sqrt), + rand("rand", d -> Mathf.rand.nextDouble() * d), + + ; + + public static final LogicOp[] all = values(); + + public final OpLambda2 function2; + public final OpLambda1 function1; + public final boolean unary; + public final String symbol; + + LogicOp(String symbol, OpLambda2 function){ + this.symbol = symbol; + this.function2 = function; + this.function1 = null; + this.unary = false; + } + + LogicOp(String symbol, OpLambda1 function){ + this.symbol = symbol; + this.function1 = function; + this.function2 = null; + this.unary = true; + } + + @Override + public String toString(){ + return symbol; + } + + interface OpLambda2{ + double get(double a, double b); + } + + interface OpLambda1{ + double get(double a); + } +} diff --git a/core/src/mindustry/logic/UnaryOp.java b/core/src/mindustry/logic/UnaryOp.java deleted file mode 100644 index 80e8fd1ef3..0000000000 --- a/core/src/mindustry/logic/UnaryOp.java +++ /dev/null @@ -1,38 +0,0 @@ -package mindustry.logic; - -import arc.math.*; - -public enum UnaryOp{ - negate("-", a -> -a), - not("not", a -> ~(int)(a)), - abs("abs", Math::abs), - log("log", Math::log), - log10("log10", Math::log10), - sin("sin", d -> Math.sin(d * 0.017453292519943295D)), - cos("cos", d -> Math.cos(d * 0.017453292519943295D)), - tan("tan", d -> Math.tan(d * 0.017453292519943295D)), - floor("floor", Math::floor), - ceil("ceil", Math::ceil), - sqrt("sqrt", Math::sqrt), - rand("rand", d -> Mathf.rand.nextDouble() * d), - ; - - public static final UnaryOp[] all = values(); - - public final UnaryOpLambda function; - public final String symbol; - - UnaryOp(String symbol, UnaryOpLambda function){ - this.symbol = symbol; - this.function = function; - } - - @Override - public String toString(){ - return symbol; - } - - interface UnaryOpLambda{ - double get(double a); - } -}