mirror of
https://github.com/Anuken/Mindustry.git
synced 2026-04-27 07:50:54 -07:00
Bugfixes
This commit is contained in:
parent
f4a838df98
commit
7482e2a988
8 changed files with 176 additions and 157 deletions
|
|
@ -385,7 +385,7 @@ editor.exportimage = Export Terrain Image
|
|||
editor.exportimage.description = Export an image file containing only basic terrain
|
||||
editor.loadimage = Import 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.mapname = Map Name:
|
||||
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
||||
|
|
|
|||
|
|
@ -649,11 +649,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||
}
|
||||
|
||||
private void tryExit(){
|
||||
if(!saved){
|
||||
ui.showConfirm("@confirm", "@editor.unsaved", this::hide);
|
||||
}else{
|
||||
hide();
|
||||
}
|
||||
ui.showConfirm("@confirm", "@editor.unsaved", this::hide);
|
||||
}
|
||||
|
||||
private void addBlockSelection(Table table){
|
||||
|
|
|
|||
|
|
@ -165,9 +165,10 @@ public class Saves{
|
|||
}
|
||||
|
||||
public void deleteAll(){
|
||||
saves.clear();
|
||||
for(Fi file : saveDirectory.list()){
|
||||
file.delete();
|
||||
for(SaveSlot slot : saves.copy()){
|
||||
if(!slot.isSector()){
|
||||
slot.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -187,7 +188,7 @@ public class Saves{
|
|||
current = this;
|
||||
totalPlaytime = meta.timePlayed;
|
||||
savePreview();
|
||||
}catch(Exception e){
|
||||
}catch(Throwable e){
|
||||
throw new SaveException(e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||
if(commander.isCommanding()){
|
||||
commander.clearCommand();
|
||||
}else{
|
||||
FormationPattern pattern = new SquareFormation();
|
||||
SquareFormation pattern = new SquareFormation();
|
||||
Formation formation = new Formation(new Vec3(player.x, player.y, player.unit().rotation), 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.truncate(player.unit().type().commandLimit);
|
||||
|
||||
if(units.any()) pattern.spacing = units.max(u -> u.hitSize).hitSize * 2.4f;
|
||||
|
||||
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.g2d.*;
|
||||
import arc.input.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.scene.*;
|
||||
import arc.scene.event.*;
|
||||
import arc.scene.ui.*;
|
||||
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 outCol = Pal.place, inCol = Pal.remove;
|
||||
|
||||
private Element selected;
|
||||
private Element entered;
|
||||
private Seq<LogicNode> nodes = new Seq<>();
|
||||
|
||||
{
|
||||
LogicElement e = new LogicElement();
|
||||
e.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f);
|
||||
addChild(e);
|
||||
e.pack();
|
||||
for(int i = 0; i < 3; i++){
|
||||
LogicElement e = new LogicElement();
|
||||
e.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f);
|
||||
addChild(e);
|
||||
e.pack();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -53,17 +59,45 @@ public class LogicCanvas extends WidgetGroup{
|
|||
Draw.reset();
|
||||
|
||||
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;
|
||||
NodeField[] fields = {new NodeField(true, "input 1"), new NodeField(true, "input 2"), new NodeField(false, "output 1"), new NodeField(false, "output 2")};
|
||||
|
||||
LogicElement(){
|
||||
background(Tex.whitePane);
|
||||
setColor(Pal.accent.cpy().mul(0.9f).shiftSaturation(-0.3f));
|
||||
touchable = Touchable.enabled;
|
||||
|
||||
margin(0f);
|
||||
|
||||
table(Tex.whiteui, t -> {
|
||||
|
|
@ -72,6 +106,7 @@ public class LogicCanvas extends WidgetGroup{
|
|||
});
|
||||
|
||||
t.margin(8f);
|
||||
t.touchable = Touchable.enabled;
|
||||
|
||||
t.add("Node").style(Styles.outlineLabel).color(color);
|
||||
t.add().growX();
|
||||
|
|
@ -79,6 +114,27 @@ public class LogicCanvas extends WidgetGroup{
|
|||
//TODO disconnect things
|
||||
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);
|
||||
|
||||
row();
|
||||
|
|
@ -91,28 +147,6 @@ public class LogicCanvas extends WidgetGroup{
|
|||
}
|
||||
|
||||
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
|
||||
|
|
@ -128,13 +162,15 @@ public class LogicCanvas extends WidgetGroup{
|
|||
}
|
||||
}
|
||||
|
||||
static class NodeField extends Table{
|
||||
class NodeField extends Table{
|
||||
boolean input;
|
||||
ImageButton button;
|
||||
Element connection;
|
||||
|
||||
NodeField(boolean input, String name){
|
||||
this.input = input;
|
||||
setColor(input ? inCol : outCol);
|
||||
//TODO color should depend on data type
|
||||
setColor(outCol);
|
||||
|
||||
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(){
|
||||
float s = 30f;
|
||||
Cell<ImageButton> c = button(Tex.logicNode, Styles.colori, () -> {
|
||||
|
|
@ -171,6 +216,39 @@ public class LogicCanvas extends WidgetGroup{
|
|||
}else{
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue