Bugfixes
This commit is contained in:
@@ -385,7 +385,7 @@ editor.exportimage = Export Terrain Image
|
|||||||
editor.exportimage.description = Export an image file containing only basic terrain
|
editor.exportimage.description = Export an image file containing only basic terrain
|
||||||
editor.loadimage = Import Terrain
|
editor.loadimage = Import Terrain
|
||||||
editor.saveimage = Export Terrain
|
editor.saveimage = Export Terrain
|
||||||
editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit?
|
editor.unsaved = Are you sure you want to exit?\n[scarlet]Any unsaved changes will be lost.
|
||||||
editor.resizemap = Resize Map
|
editor.resizemap = Resize Map
|
||||||
editor.mapname = Map Name:
|
editor.mapname = Map Name:
|
||||||
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
||||||
|
|||||||
@@ -649,11 +649,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void tryExit(){
|
private void tryExit(){
|
||||||
if(!saved){
|
ui.showConfirm("@confirm", "@editor.unsaved", this::hide);
|
||||||
ui.showConfirm("@confirm", "@editor.unsaved", this::hide);
|
|
||||||
}else{
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addBlockSelection(Table table){
|
private void addBlockSelection(Table table){
|
||||||
|
|||||||
@@ -165,9 +165,10 @@ public class Saves{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void deleteAll(){
|
public void deleteAll(){
|
||||||
saves.clear();
|
for(SaveSlot slot : saves.copy()){
|
||||||
for(Fi file : saveDirectory.list()){
|
if(!slot.isSector()){
|
||||||
file.delete();
|
slot.delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,7 +188,7 @@ public class Saves{
|
|||||||
current = this;
|
current = this;
|
||||||
totalPlaytime = meta.timePlayed;
|
totalPlaytime = meta.timePlayed;
|
||||||
savePreview();
|
savePreview();
|
||||||
}catch(Exception e){
|
}catch(Throwable e){
|
||||||
throw new SaveException(e);
|
throw new SaveException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -262,7 +262,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
if(commander.isCommanding()){
|
if(commander.isCommanding()){
|
||||||
commander.clearCommand();
|
commander.clearCommand();
|
||||||
}else{
|
}else{
|
||||||
FormationPattern pattern = new SquareFormation();
|
SquareFormation pattern = new SquareFormation();
|
||||||
Formation formation = new Formation(new Vec3(player.x, player.y, player.unit().rotation), pattern);
|
Formation formation = new Formation(new Vec3(player.x, player.y, player.unit().rotation), pattern);
|
||||||
formation.slotAssignmentStrategy = new DistanceAssignmentStrategy(pattern);
|
formation.slotAssignmentStrategy = new DistanceAssignmentStrategy(pattern);
|
||||||
|
|
||||||
@@ -278,6 +278,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
units.sort(u -> u.dst2(player.unit()));
|
units.sort(u -> u.dst2(player.unit()));
|
||||||
units.truncate(player.unit().type().commandLimit);
|
units.truncate(player.unit().type().commandLimit);
|
||||||
|
|
||||||
|
if(units.any()) pattern.spacing = units.max(u -> u.hitSize).hitSize * 2.4f;
|
||||||
|
|
||||||
commander.command(formation, units);
|
commander.command(formation, units);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
31
core/src/mindustry/logic/BinaryOp.java
Normal file
31
core/src/mindustry/logic/BinaryOp.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package mindustry.logic;
|
||||||
|
|
||||||
|
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),
|
||||||
|
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);
|
||||||
|
|
||||||
|
final OpLambda function;
|
||||||
|
final String symbol;
|
||||||
|
|
||||||
|
BinaryOp(String symbol, OpLambda function){
|
||||||
|
this.symbol = symbol;
|
||||||
|
this.function = function;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double get(double a, double b){
|
||||||
|
return function.get(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OpLambda{
|
||||||
|
double get(double a, double b);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,9 @@ import arc.*;
|
|||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.input.*;
|
import arc.input.*;
|
||||||
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.scene.*;
|
||||||
import arc.scene.event.*;
|
import arc.scene.event.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
@@ -18,13 +20,17 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
private static final Color backgroundCol = Color.black, gridCol = Pal.accent.cpy().mul(0.2f);
|
private static final Color backgroundCol = Color.black, gridCol = Pal.accent.cpy().mul(0.2f);
|
||||||
private static final Color outCol = Pal.place, inCol = Pal.remove;
|
private static final Color outCol = Pal.place, inCol = Pal.remove;
|
||||||
|
|
||||||
|
private Element selected;
|
||||||
|
private Element entered;
|
||||||
private Seq<LogicNode> nodes = new Seq<>();
|
private Seq<LogicNode> nodes = new Seq<>();
|
||||||
|
|
||||||
{
|
{
|
||||||
LogicElement e = new LogicElement();
|
for(int i = 0; i < 3; i++){
|
||||||
e.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f);
|
LogicElement e = new LogicElement();
|
||||||
addChild(e);
|
e.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f);
|
||||||
e.pack();
|
addChild(e);
|
||||||
|
e.pack();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -53,17 +59,45 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
super.draw();
|
super.draw();
|
||||||
|
|
||||||
|
for(Element e : getChildren()){
|
||||||
|
if(e instanceof LogicElement){
|
||||||
|
LogicElement l = (LogicElement)e;
|
||||||
|
|
||||||
|
for(NodeField field : l.fields){
|
||||||
|
field.drawConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selected != null){
|
||||||
|
NodeField field = (NodeField)selected.userObject;
|
||||||
|
Vec2 dest = selected.localToStageCoordinates(Tmp.v1.set(selected.getWidth()/2f, selected.getHeight()/2f));
|
||||||
|
Vec2 mouse = Core.input.mouse();
|
||||||
|
drawCurve(dest.x, dest.y, mouse.x, mouse.y, field.color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class LogicElement extends Table{
|
void drawCurve(float x, float y, float x2, float y2, Color color){
|
||||||
|
Lines.stroke(4f, color);
|
||||||
|
Lines.curve(
|
||||||
|
x, y,
|
||||||
|
x2, y,
|
||||||
|
x, y2,
|
||||||
|
x2, y2,
|
||||||
|
Math.max(3, (int)(Mathf.dst(x, y, x2, y2) / 5))
|
||||||
|
);
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
class LogicElement extends Table{
|
||||||
LogicNode node;
|
LogicNode node;
|
||||||
NodeField[] fields = {new NodeField(true, "input 1"), new NodeField(true, "input 2"), new NodeField(false, "output 1"), new NodeField(false, "output 2")};
|
NodeField[] fields = {new NodeField(true, "input 1"), new NodeField(true, "input 2"), new NodeField(false, "output 1"), new NodeField(false, "output 2")};
|
||||||
|
|
||||||
LogicElement(){
|
LogicElement(){
|
||||||
background(Tex.whitePane);
|
background(Tex.whitePane);
|
||||||
setColor(Pal.accent.cpy().mul(0.9f).shiftSaturation(-0.3f));
|
setColor(Pal.accent.cpy().mul(0.9f).shiftSaturation(-0.3f));
|
||||||
touchable = Touchable.enabled;
|
|
||||||
|
|
||||||
margin(0f);
|
margin(0f);
|
||||||
|
|
||||||
table(Tex.whiteui, t -> {
|
table(Tex.whiteui, t -> {
|
||||||
@@ -72,6 +106,7 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
});
|
});
|
||||||
|
|
||||||
t.margin(8f);
|
t.margin(8f);
|
||||||
|
t.touchable = Touchable.enabled;
|
||||||
|
|
||||||
t.add("Node").style(Styles.outlineLabel).color(color);
|
t.add("Node").style(Styles.outlineLabel).color(color);
|
||||||
t.add().growX();
|
t.add().growX();
|
||||||
@@ -79,6 +114,27 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
//TODO disconnect things
|
//TODO disconnect things
|
||||||
remove();
|
remove();
|
||||||
});
|
});
|
||||||
|
t.addListener(new InputListener(){
|
||||||
|
float lastx, lasty;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||||
|
Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y));
|
||||||
|
lastx = v.x;
|
||||||
|
lasty = v.y;
|
||||||
|
toFront();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void touchDragged(InputEvent event, float x, float y, int pointer){
|
||||||
|
Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y));
|
||||||
|
|
||||||
|
moveBy(v.x - lastx, v.y - lasty);
|
||||||
|
lastx = v.x;
|
||||||
|
lasty = v.y;
|
||||||
|
}
|
||||||
|
});
|
||||||
}).growX().padBottom(6);
|
}).growX().padBottom(6);
|
||||||
|
|
||||||
row();
|
row();
|
||||||
@@ -91,28 +147,6 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
}
|
}
|
||||||
|
|
||||||
marginBottom(7);
|
marginBottom(7);
|
||||||
|
|
||||||
addListener(new InputListener(){
|
|
||||||
float lastx, lasty;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
|
|
||||||
Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y));
|
|
||||||
lastx = v.x;
|
|
||||||
lasty = v.y;
|
|
||||||
toFront();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void touchDragged(InputEvent event, float x, float y, int pointer){
|
|
||||||
Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y));
|
|
||||||
|
|
||||||
moveBy(v.x - lastx, v.y - lasty);
|
|
||||||
lastx = v.x;
|
|
||||||
lasty = v.y;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -128,13 +162,15 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class NodeField extends Table{
|
class NodeField extends Table{
|
||||||
boolean input;
|
boolean input;
|
||||||
ImageButton button;
|
ImageButton button;
|
||||||
|
Element connection;
|
||||||
|
|
||||||
NodeField(boolean input, String name){
|
NodeField(boolean input, String name){
|
||||||
this.input = input;
|
this.input = input;
|
||||||
setColor(input ? inCol : outCol);
|
//TODO color should depend on data type
|
||||||
|
setColor(outCol);
|
||||||
|
|
||||||
float marg = 24f;
|
float marg = 24f;
|
||||||
|
|
||||||
@@ -154,6 +190,15 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawConnection(){
|
||||||
|
if(connection != null){
|
||||||
|
Vec2 from = localToStageCoordinates(Tmp.v2.set(button.getX() + button.getWidth()/2f, button.getY() + button.getHeight()/2f));
|
||||||
|
Vec2 to = connection.localToStageCoordinates(Tmp.v1.set(connection.getWidth()/2f, connection.getHeight()/2f));
|
||||||
|
|
||||||
|
drawCurve(from.x, from.y, to.x, to.y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void addIcon(){
|
void addIcon(){
|
||||||
float s = 30f;
|
float s = 30f;
|
||||||
Cell<ImageButton> c = button(Tex.logicNode, Styles.colori, () -> {
|
Cell<ImageButton> c = button(Tex.logicNode, Styles.colori, () -> {
|
||||||
@@ -171,6 +216,39 @@ public class LogicCanvas extends WidgetGroup{
|
|||||||
}else{
|
}else{
|
||||||
c.padRight(-pad);
|
c.padRight(-pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button.addListener(new InputListener(){
|
||||||
|
@Override
|
||||||
|
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode code){
|
||||||
|
if(selected == null){
|
||||||
|
selected = button;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enter(InputEvent event, float x, float y, int pointer, Element fromActor){
|
||||||
|
entered = button;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode code){
|
||||||
|
localToStageCoordinates(Tmp.v1.set(x, y));
|
||||||
|
Element element = entered;
|
||||||
|
|
||||||
|
if(element != null && element.userObject instanceof NodeField){
|
||||||
|
NodeField field = (NodeField)element.userObject;
|
||||||
|
if(field != NodeField.this && field.input != input){
|
||||||
|
connection = element;
|
||||||
|
//field.connection = button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selected == button){
|
||||||
|
selected = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,114 +0,0 @@
|
|||||||
package mindustry.logic;
|
|
||||||
|
|
||||||
import mindustry.gen.*;
|
|
||||||
|
|
||||||
import java.nio.*;
|
|
||||||
|
|
||||||
public class LogicExecutor{
|
|
||||||
Instruction[] instructions;
|
|
||||||
ByteBuffer memory = ByteBuffer.allocate(1024 * 512);
|
|
||||||
int counter;
|
|
||||||
|
|
||||||
void step(){
|
|
||||||
if(instructions.length == 0) return;
|
|
||||||
|
|
||||||
instructions[counter].exec();
|
|
||||||
counter ++;
|
|
||||||
|
|
||||||
//loop counter
|
|
||||||
if(counter >= instructions.length) counter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Building device(short id){
|
|
||||||
return null; //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Instruction{
|
|
||||||
void exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
static class RegisterI implements Instruction{
|
|
||||||
/** operation to perform */
|
|
||||||
Op op;
|
|
||||||
/** destination memory */
|
|
||||||
int dest;
|
|
||||||
/** memory to take data from. -1 for immediate values. */
|
|
||||||
int left, right;
|
|
||||||
/** left/right immediate values, only used if no registers are present. */
|
|
||||||
double ileft, iright;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void exec(){
|
|
||||||
//memory.putDouble(dest, op.function.get(left == -1 ? ileft : registers[left], right == -1 ? iright : registers[right]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class ReadI implements Instruction{
|
|
||||||
/** register to write result to */
|
|
||||||
short dest;
|
|
||||||
/** device to read from */
|
|
||||||
short device;
|
|
||||||
/** the type of data to be read */
|
|
||||||
ReadOp op;
|
|
||||||
/** any additional read parameters */
|
|
||||||
int parameter;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void exec(){
|
|
||||||
//registers[dest] = op.function.get(device(device), parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class WriteI implements Instruction{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void exec(){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ReadOp{
|
|
||||||
item((tile, id) -> tile.items == null ? 0 : tile.items.get(id)),
|
|
||||||
itemTotal((tile, param) -> tile.items == null ? 0 : tile.items.total());
|
|
||||||
|
|
||||||
final ReadOpLambda function;
|
|
||||||
final String symbol;
|
|
||||||
|
|
||||||
ReadOp(ReadOpLambda function){
|
|
||||||
this.symbol = name();
|
|
||||||
this.function = function;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ReadOpLambda{
|
|
||||||
int get(Building tile, int parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Op{
|
|
||||||
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),
|
|
||||||
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);
|
|
||||||
|
|
||||||
final OpLambda function;
|
|
||||||
final String symbol;
|
|
||||||
|
|
||||||
Op(String symbol, OpLambda function){
|
|
||||||
this.symbol = symbol;
|
|
||||||
this.function = function;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OpLambda{
|
|
||||||
double get(double a, double b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,29 @@
|
|||||||
package mindustry.logic;
|
package mindustry.logic;
|
||||||
|
|
||||||
public class LogicNode{
|
import arc.func.*;
|
||||||
|
|
||||||
|
public abstract class LogicNode{
|
||||||
|
|
||||||
|
public void run(){}
|
||||||
|
|
||||||
|
public NodeInput[] inputs(){
|
||||||
|
return new NodeInput[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BinaryOpNode{
|
||||||
|
public BinaryOp op = BinaryOp.add;
|
||||||
|
public double a, b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class NodeInput<T>{
|
||||||
|
public boolean num;
|
||||||
|
public String name;
|
||||||
|
public SetNum setNum;
|
||||||
|
public Cons<T> setObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface SetNum{
|
||||||
|
void set(double val);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user