package mindustry.logic; import arc.func.*; import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.logic.LCanvas.*; import mindustry.logic.LExecutor.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.meta.*; import static mindustry.world.blocks.logic.LogicDisplay.*; public class LStatements{ //TODO broken //@RegisterStatement("#") public static class CommentStatement extends LStatement{ public String comment = ""; @Override public void build(Table table){ table.area(comment, Styles.nodeArea, v -> comment = v).growX().height(90f).padLeft(2).padRight(6).color(table.color); } @Override public Color color(){ return Pal.logicControl; } @Override public LInstruction build(LAssembler builder){ return null; } } @RegisterStatement("noop") public static class InvalidStatement extends LStatement{ @Override public void build(Table table){ } @Override public Color color(){ return Pal.logicOperations; } @Override public LInstruction build(LAssembler builder){ return new NoopI(); } } @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 Color color(){ return Pal.logicIo; } @Override public LInstruction build(LAssembler builder){ return new ReadI(builder.var(target), builder.var(address), builder.var(output)); } } @RegisterStatement("write") public static class WriteStatement extends LStatement{ public String input = "result", target = "cell1", address = "0"; @Override public void build(Table table){ table.add(" write "); field(table, input, str -> input = str); table.add(" to "); fields(table, target, str -> target = str); row(table); table.add(" at "); field(table, address, str -> address = str); } @Override public Color color(){ return Pal.logicIo; } @Override public LInstruction build(LAssembler builder){ return new WriteI(builder.var(target), builder.var(address), builder.var(input)); } } @RegisterStatement("draw") public static class DrawStatement extends LStatement{ public GraphicsType type = GraphicsType.clear; public String x = "0", y = "0", p1 = "0", p2 = "0", p3 = "0", p4 = "0"; @Override public void build(Table table){ rebuild(table); } void rebuild(Table table){ table.clearChildren(); table.left(); table.button(b -> { b.label(() -> type.name()); b.clicked(() -> showSelect(b, GraphicsType.all, type, t -> { type = t; if(type == GraphicsType.color){ p2 = "255"; } if(type == GraphicsType.image){ p1 = "@copper"; p2 = "32"; p3 = "0"; } rebuild(table); }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); if(type != GraphicsType.stroke){ row(table); } table.table(s -> { s.left(); s.setColor(table.color); switch(type){ case clear -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); } case color -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); row(s); fields(s, "a", p2, v -> p2 = v); } case stroke -> { s.add().width(4); fields(s, x, v -> x = v); } case line -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "x2", p1, v -> p1 = v); fields(s, "y2", p2, v -> p2 = v); } case rect, lineRect -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "width", p1, v -> p1 = v); fields(s, "height", p2, v -> p2 = v); } case poly, linePoly -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "sides", p1, v -> p1 = v); fields(s, "radius", p2, v -> p2 = v); row(s); fields(s, "rotation", p3, v -> p3 = v); } case triangle -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "x2", p1, v -> p1 = v); fields(s, "y2", p2, v -> p2 = v); row(s); fields(s, "x3", p3, v -> p3 = v); fields(s, "y3", p4, v -> p4 = v); } case image -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "image", p1, v -> p1 = v); fields(s, "size", p2, v -> p2 = v); row(s); fields(s, "rotation", p3, v -> p3 = v); } } }).expand().left(); } @Override public void afterRead(){ //0 constant alpha for colors is not allowed if(type == GraphicsType.color && p2.equals("0")){ p2 = "255"; } } @Override public Color color(){ return Pal.logicIo; } @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)); } } @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 Color color(){ return Pal.logicIo; } } @RegisterStatement("drawflush") public static class DrawFlushStatement extends LStatement{ public String target = "display1"; @Override public void build(Table table){ table.add(" to "); field(table, target, str -> target = str); } @Override public Color color(){ return Pal.logicBlocks; } @Override public LInstruction build(LAssembler builder){ return new DrawFlushI(builder.var(target)); } } @RegisterStatement("printflush") public static class PrintFlushStatement extends LStatement{ public String target = "message1"; @Override public void build(Table table){ table.add(" to "); field(table, target, str -> target = str); } @Override public Color color(){ return Pal.logicBlocks; } @Override public LInstruction build(LAssembler builder){ return new PrintFlushI(builder.var(target)); } } @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 Color color(){ return Pal.logicBlocks; } @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; public String target = "block1", p1 = "0", p2 = "0", p3 = "0", p4 = "0"; @Override public void build(Table table){ rebuild(table); } void rebuild(Table table){ table.clearChildren(); table.left(); table.add(" set "); table.button(b -> { b.label(() -> type.name()); b.clicked(() -> showSelect(b, LAccess.controls, type, t -> { type = t; rebuild(table); }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); table.add(" of "); field(table, target, v -> target = v); row(table); //Q: why don't you just use arrays for this? //A: arrays aren't as easy to serialize so the code generator doesn't handle them int c = 0; for(int i = 0; i < type.params.length; i++){ fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); if(++c % 2 == 0) row(table); } } @Override public Color color(){ return Pal.logicBlocks; } @Override public LInstruction build(LAssembler builder){ return new ControlI(type, builder.var(target), builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4)); } } @RegisterStatement("radar") public static class RadarStatement extends LStatement{ public RadarTarget target1 = RadarTarget.enemy, target2 = RadarTarget.any, target3 = RadarTarget.any; public RadarSort sort = RadarSort.distance; public String radar = "turret1", sortOrder = "1", output = "result"; @Override public void build(Table table){ table.defaults().left(); if(buildFrom()){ table.add(" from "); fields(table, radar, v -> radar = v); row(table); } for(int i = 0; i < 3; i++){ int fi = i; Prov get = () -> (fi == 0 ? target1 : fi == 1 ? target2 : target3); table.add(i == 0 ? " target " : " and "); table.button(b -> { b.label(() -> get.get().name()); b.clicked(() -> showSelect(b, RadarTarget.all, get.get(), t -> { if(fi == 0) target1 = t; else if(fi == 1) target2 = t; else target3 = t; }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); if(i == 1){ row(table); } } table.add(" order "); fields(table, sortOrder, v -> sortOrder = v); table.row(); table.add(" sort "); table.button(b -> { b.label(() -> sort.name()); b.clicked(() -> showSelect(b, RadarSort.all, sort, t -> { sort = t; }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); table.add(" output "); fields(table, output, v -> output = v); } public boolean buildFrom(){ return true; } @Override public Color color(){ return Pal.logicBlocks; } @Override public LInstruction build(LAssembler builder){ return new RadarI(target1, target2, target3, sort, builder.var(radar), builder.var(sortOrder), builder.var(output)); } } @RegisterStatement("sensor") public static class SensorStatement extends LStatement{ public String to = "result"; public String from = "block1", type = "@copper"; private transient int selected = 0; private transient TextField tfield; @Override public void build(Table table){ field(table, to, str -> to = str); table.add(" = "); row(table); tfield = field(table, type, str -> type = str).padRight(0f).get(); table.button(b -> { b.image(Icon.pencilSmall); //240 b.clicked(() -> showSelectTable(b, (t, hide) -> { Table[] tables = { //items new Table(i -> { i.left(); int c = 0; for(Item item : Vars.content.items()){ if(!item.unlockedNow()) continue; i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { stype("@" + item.name); hide.run(); }).size(40f); if(++c % 6 == 0) i.row(); } }), //liquids new Table(i -> { i.left(); int c = 0; for(Liquid item : Vars.content.liquids()){ if(!item.unlockedNow()) continue; i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { stype("@" + item.name); hide.run(); }).size(40f); if(++c % 6 == 0) i.row(); } }), //sensors new Table(i -> { for(LAccess sensor : LAccess.senseable){ i.button(sensor.name(), Styles.cleart, () -> { stype("@" + sensor.name()); hide.run(); }).size(240f, 40f).row(); } }) }; Drawable[] icons = {Icon.box, Icon.liquid, Icon.tree}; Stack stack = new Stack(tables[selected]); ButtonGroup