diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/ComPort.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/ComPort.java index fc3380c..f73507a 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/ComPort.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/ComPort.java @@ -17,9 +17,10 @@ public class ComPort extends CpuHardware { private Cubot cubot; + private static final int SELF_CLEAR = 0; private static final int POLL = 1; - - private static final int OUT = 2; + private static final int FRONT_PORT_OUT = 2; + private static final int SELF_OUT = 3; public ComPort(Cubot cubot) { this.cubot = cubot; @@ -32,20 +33,69 @@ public class ComPort extends CpuHardware { int a = getCpu().getRegisterSet().getRegister("A").getValue(); - if (a == POLL) { + if (a == SELF_CLEAR) { - /* No-op */ + cubot.getConsoleMessagesBuffer().clear(); + cubot.setConsoleMode(Cubot.ConsoleMode.CLEAR); - } else if (a == OUT) { + } else if (a == POLL) { - //Get object directly in front of the Cubot - Point frontTile = cubot.getFrontTile(); - ArrayList objects = cubot.getWorld().getGameObjectsBlockingAt(frontTile.x, frontTile.y); - - if (objects.size() > 0 && objects.get(0) instanceof Programmable) { + if (cubot.spendEnergy(4)) { int x = getCpu().getRegisterSet().getRegister("X").getValue(); + //Read all messages in the console buffer to memory at X + + for (char[] message : cubot.getConsoleMessagesBuffer()) { + if (x + MESSAGE_LENGTH >= getCpu().getMemory().getWords().length) { + //todo set interrupt ? + getCpu().getStatus().setErrorFlag(true); + } else { + System.arraycopy(message, 0, getCpu().getMemory().getWords(), x, MESSAGE_LENGTH); + } + } + + //Set B = number of messages + getCpu().getRegisterSet().getRegister("B").setValue(cubot.getConsoleMessagesBuffer().size()); + + } + + } else if (a == FRONT_PORT_OUT) { + + if (cubot.spendEnergy(20)) { + //Get object directly in front of the Cubot + Point frontTile = cubot.getFrontTile(); + //Todo will have to add getGameObjectsBlockingAt to enable Factory + ArrayList objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y); + + if (objects.size() > 0 && objects.get(0) instanceof Programmable) { + + int x = getCpu().getRegisterSet().getRegister("X").getValue(); + + if (x + MESSAGE_LENGTH >= getCpu().getMemory().getWords().length) { + //todo set interrupt ? + getCpu().getStatus().setErrorFlag(true); + } else { + + //Get MESSAGE_LENGTH-word message pointed by X + char[] message = new char[MESSAGE_LENGTH]; + System.arraycopy(getCpu().getMemory().getWords(), x, message, 0, MESSAGE_LENGTH); + + //Send it to the Programmable object + ((Programmable) objects.get(0)).sendMessage(message); + + System.out.println("Sent message to " + ((Cubot) objects.get(0)).getParent().getUsername()); + } + } + } + + } else if (a == SELF_OUT) { + + if (cubot.spendEnergy(1)) { + + int x = getCpu().getRegisterSet().getRegister("X").getValue(); + + //Write a single message to console buffer if (x + MESSAGE_LENGTH >= getCpu().getMemory().getWords().length) { //todo set interrupt ? getCpu().getStatus().setErrorFlag(true); @@ -54,9 +104,7 @@ public class ComPort extends CpuHardware { //Get MESSAGE_LENGTH-word message pointed by X char[] message = new char[MESSAGE_LENGTH]; System.arraycopy(getCpu().getMemory().getWords(), x, message, 0, MESSAGE_LENGTH); - - //Send it to the Programmable object - ((Programmable) objects.get(0)).sendMessage(message); + cubot.sendMessage(message); } } } diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java index bc9f07e..dfdfe75 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java @@ -8,7 +8,7 @@ import org.json.simple.JSONObject; import java.util.ArrayList; -public class Cubot extends GameObject implements Updatable, ControllableUnit { +public class Cubot extends GameObject implements Updatable, ControllableUnit, Programmable { private static final char MAP_INFO = 0x0080; public static final int ID = 1; @@ -16,7 +16,6 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { private int hologram = 0; private String hologramString = ""; private HologramMode hologramMode = HologramMode.CLEARED; - private HologramMode lastHologramMode = HologramMode.CLEARED; /** @@ -30,6 +29,11 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { private ArrayList keyboardBuffer = new ArrayList<>(); + private ArrayList consoleMessagesBuffer = new ArrayList<>(CONSOLE_BUFFER_MAX_SIZE); + private ArrayList lastConsoleMessagesBuffer = new ArrayList<>(CONSOLE_BUFFER_MAX_SIZE); + private ConsoleMode consoleMode = ConsoleMode.NORMAL; + private ConsoleMode lastConsoleMode = ConsoleMode.NORMAL; + private FloppyDisk floppyDisk; private User parent; @@ -38,6 +42,7 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { private int maxEnergy; private static final float SOLAR_PANEL_MULTIPLIER = 1; + private static final int CONSOLE_BUFFER_MAX_SIZE = 40; public Cubot() { @@ -75,6 +80,13 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { //Same principle for hologram lastHologramMode = hologramMode; hologramMode = HologramMode.CLEARED; + + //And the console + lastConsoleMode = consoleMode; + consoleMode = ConsoleMode.NORMAL; + + lastConsoleMessagesBuffer = new ArrayList<>(consoleMessagesBuffer); + consoleMessagesBuffer.clear(); } @Override @@ -228,8 +240,34 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { COLOR } + public enum ConsoleMode { + CLEAR, + NORMAL + } + @Override public void setAction(Action action) { currentAction = action; } + + @Override + public void sendMessage(char[] message) { + + if (consoleMessagesBuffer.size() < CONSOLE_BUFFER_MAX_SIZE) { + consoleMessagesBuffer.add(message); + } + } + + public ArrayList getConsoleMessagesBuffer() { + return lastConsoleMessagesBuffer; + } + + + public int getConsoleMode() { + return lastConsoleMode.ordinal(); + } + + public void setConsoleMode(ConsoleMode consoleMode) { + this.consoleMode = consoleMode; + } } diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLeg.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLeg.java index f3b0d81..b10a456 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLeg.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLeg.java @@ -55,16 +55,18 @@ public class CubotLeg extends CpuHardware implements JSONSerialisable { } else if (a == SET_DIR_AND_WALK) { - Direction dir = Direction.getDirection(b); + if (cubot.getMaxEnergy() >= 100) { + Direction dir = Direction.getDirection(b); - if (dir != null) { - cubot.setDirection(Direction.getDirection(b)); - status.setErrorFlag(false); - } else { - status.setErrorFlag(true); + if (dir != null) { + cubot.setDirection(Direction.getDirection(b)); + status.setErrorFlag(false); + } else { + status.setErrorFlag(true); + } + + cubot.setCurrentAction(Action.WALKING); } - - cubot.setCurrentAction(Action.WALKING); } } diff --git a/Server/src/main/java/net/simon987/server/assembly/Assembler.java b/Server/src/main/java/net/simon987/server/assembly/Assembler.java index ca3b02c..b6f5f8b 100755 --- a/Server/src/main/java/net/simon987/server/assembly/Assembler.java +++ b/Server/src/main/java/net/simon987/server/assembly/Assembler.java @@ -155,7 +155,7 @@ public class Assembler { String string = value.substring(1, value.length() - 1); string = StringEscapeUtils.unescapeJava(string); - out.write(string.getBytes(StandardCharsets.UTF_16)); + out.write(string.getBytes(StandardCharsets.UTF_16BE)); } else if (labels != null && labels.containsKey(value)) { //Handle label out.writeChar(labels.get(value)); diff --git a/Server/src/main/java/net/simon987/server/game/ControllableUnit.java b/Server/src/main/java/net/simon987/server/game/ControllableUnit.java index 7fdf561..31b279d 100644 --- a/Server/src/main/java/net/simon987/server/game/ControllableUnit.java +++ b/Server/src/main/java/net/simon987/server/game/ControllableUnit.java @@ -28,4 +28,8 @@ public interface ControllableUnit { void setAction(Action listening); World getWorld(); + + ArrayList getConsoleMessagesBuffer(); + + int getConsoleMode(); } diff --git a/Server/src/main/java/net/simon987/server/webserver/CodeRequestHandler.java b/Server/src/main/java/net/simon987/server/webserver/CodeRequestHandler.java index 273a3bb..dfa4272 100644 --- a/Server/src/main/java/net/simon987/server/webserver/CodeRequestHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/CodeRequestHandler.java @@ -9,7 +9,7 @@ public class CodeRequestHandler implements MessageHandler { if (json.get("t").equals("codeRequest")) { - LogManager.LOGGER.info("(WS) Code request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) Code request from " + user.getUser().getUsername()); if (user.isGuest()) { diff --git a/Server/src/main/java/net/simon987/server/webserver/CodeUploadHandler.java b/Server/src/main/java/net/simon987/server/webserver/CodeUploadHandler.java index 422b32f..1518241 100644 --- a/Server/src/main/java/net/simon987/server/webserver/CodeUploadHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/CodeUploadHandler.java @@ -12,7 +12,7 @@ public class CodeUploadHandler implements MessageHandler { public void handle(OnlineUser user, JSONObject json) { if (json.get("t").equals("uploadCode")) { - LogManager.LOGGER.info("(WS) Code upload from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) Code upload from " + user.getUser().getUsername()); if (user.isGuest()) { //Ignore diff --git a/Server/src/main/java/net/simon987/server/webserver/FloppyHandler.java b/Server/src/main/java/net/simon987/server/webserver/FloppyHandler.java index 115d929..a66f418 100644 --- a/Server/src/main/java/net/simon987/server/webserver/FloppyHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/FloppyHandler.java @@ -13,7 +13,7 @@ public class FloppyHandler implements MessageHandler { if (json.get("t").equals("floppyDown")) { - LogManager.LOGGER.info("(WS) Floppy download request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) Floppy download request from " + user.getUser().getUsername()); if (user.isGuest()) { return; @@ -27,7 +27,7 @@ public class FloppyHandler implements MessageHandler { } else if (json.get("t").equals("floppyUp")) { - LogManager.LOGGER.info("(WS) Floppy upload request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) Floppy upload request from " + user.getUser().getUsername()); //Check newly uploaded file on the database byte[] bytes = db.getFloppy(user.getUser().getUsername()); diff --git a/Server/src/main/java/net/simon987/server/webserver/KeypressHandler.java b/Server/src/main/java/net/simon987/server/webserver/KeypressHandler.java index 4b99783..a0cbd95 100644 --- a/Server/src/main/java/net/simon987/server/webserver/KeypressHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/KeypressHandler.java @@ -1,6 +1,5 @@ package net.simon987.server.webserver; -import net.simon987.server.logging.LogManager; import org.json.simple.JSONObject; import java.util.ArrayList; @@ -14,7 +13,7 @@ public class KeypressHandler implements MessageHandler { if (!user.isGuest()) { if (json.get("t").equals("k")) { - LogManager.LOGGER.info("(WS) Received keypress"); + //LogManager.LOGGER.fine("(WS) Received keypress"); int key = (int) (long) json.get("k"); diff --git a/Server/src/main/java/net/simon987/server/webserver/MessageEventDispatcher.java b/Server/src/main/java/net/simon987/server/webserver/MessageEventDispatcher.java index 7fe2bc2..c766c9f 100644 --- a/Server/src/main/java/net/simon987/server/webserver/MessageEventDispatcher.java +++ b/Server/src/main/java/net/simon987/server/webserver/MessageEventDispatcher.java @@ -33,11 +33,11 @@ public class MessageEventDispatcher { handler.handle(user, json); } } else { - LogManager.LOGGER.info("Malformed JSON sent by " + user.getUser().getUsername()); + LogManager.LOGGER.severe("Malformed JSON sent by " + user.getUser().getUsername()); } } catch (ParseException e) { - LogManager.LOGGER.info("Malformed JSON sent by " + user.getUser().getUsername()); + LogManager.LOGGER.severe("Malformed JSON sent by " + user.getUser().getUsername()); } } } diff --git a/Server/src/main/java/net/simon987/server/webserver/ObjectsRequestHandler.java b/Server/src/main/java/net/simon987/server/webserver/ObjectsRequestHandler.java index 767a45a..d023ca4 100644 --- a/Server/src/main/java/net/simon987/server/webserver/ObjectsRequestHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/ObjectsRequestHandler.java @@ -15,14 +15,14 @@ public class ObjectsRequestHandler implements MessageHandler { @Override public void handle(OnlineUser user, JSONObject json) { if (json.get("t").equals("object")) { - LogManager.LOGGER.info("(WS) Objects request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) Objects request from " + user.getUser().getUsername()); int x, y; try { x = Long.valueOf((long) json.get("x")).intValue(); y = Long.valueOf((long) json.get("y")).intValue(); } catch (Exception e) { - LogManager.LOGGER.info("(WS) Malformed Objects request from " + user.getUser().getUsername()); + LogManager.LOGGER.severe("(WS) Malformed Objects request from " + user.getUser().getUsername()); return; } diff --git a/Server/src/main/java/net/simon987/server/webserver/SocketServer.java b/Server/src/main/java/net/simon987/server/webserver/SocketServer.java index 3a1c713..cea9bea 100644 --- a/Server/src/main/java/net/simon987/server/webserver/SocketServer.java +++ b/Server/src/main/java/net/simon987/server/webserver/SocketServer.java @@ -2,6 +2,7 @@ package net.simon987.server.webserver; import net.simon987.server.GameServer; import net.simon987.server.ServerConfiguration; +import net.simon987.server.game.ControllableUnit; import net.simon987.server.logging.LogManager; import net.simon987.server.user.User; import org.java_websocket.WebSocket; @@ -175,17 +176,38 @@ public class SocketServer extends WebSocketServer { user.getWebSocket().send(json.toJSONString()); } else { - //Send keyboard updated buffer try { - ArrayList kbBuffer = user.getUser().getControlledUnit().getKeyboardBuffer(); + ControllableUnit unit = user.getUser().getControlledUnit(); + + System.out.println("Sent " + unit.getConsoleMessagesBuffer().size() + " messages to " + user.getUser().getUsername()); + + //Send keyboard updated buffer + ArrayList kbBuffer = unit.getKeyboardBuffer(); JSONArray keys = new JSONArray(); keys.addAll(kbBuffer); json.put("keys", keys); + + //Send console buffer + if (unit.getConsoleMessagesBuffer().size() > 0) { + + JSONArray buff = new JSONArray(); + + for (char[] message : unit.getConsoleMessagesBuffer()) { + buff.add(new String(message)); + } + + json.put("c", buff); + } + + json.put("cm", unit.getConsoleMode()); + + //Send tick message user.getWebSocket().send(json.toJSONString()); } catch (NullPointerException e) { //User is online but not completely initialised } + } diff --git a/Server/src/main/java/net/simon987/server/webserver/TerrainRequestHandler.java b/Server/src/main/java/net/simon987/server/webserver/TerrainRequestHandler.java index 6ae4dac..d47aa22 100644 --- a/Server/src/main/java/net/simon987/server/webserver/TerrainRequestHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/TerrainRequestHandler.java @@ -12,7 +12,7 @@ public class TerrainRequestHandler implements MessageHandler { public void handle(OnlineUser user, JSONObject json) { if (json.get("t").equals("terrain") && json.containsKey("x") && json.containsKey("y")) { - LogManager.LOGGER.info("Terrain request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("Terrain request from " + user.getUser().getUsername()); World world; try { world = GameServer.INSTANCE.getGameUniverse().getWorld( diff --git a/Server/src/main/java/net/simon987/server/webserver/UserInfoRequestHandler.java b/Server/src/main/java/net/simon987/server/webserver/UserInfoRequestHandler.java index 8c84268..ff370af 100644 --- a/Server/src/main/java/net/simon987/server/webserver/UserInfoRequestHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/UserInfoRequestHandler.java @@ -13,7 +13,7 @@ public class UserInfoRequestHandler implements MessageHandler { if (message.get("t").equals("userInfo")) { - LogManager.LOGGER.info("(WS) User info request from " + user.getUser().getUsername()); + LogManager.LOGGER.fine("(WS) User info request from " + user.getUser().getUsername()); JSONObject json = new JSONObject(); if (user.isGuest()) {