From 3776070689a258121ac1dbd3eb02e16852ec70d7 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 27 Nov 2018 16:02:21 -0500 Subject: [PATCH] Fixes #170, #155 --- .../java/net/simon987/cubotplugin/Cubot.java | 3 +- .../net/simon987/cubotplugin/CubotLidar.java | 4 +- .../net/simon987/npcplugin/ElectricBox.java | 3 +- .../java/net/simon987/npcplugin/Factory.java | 2 +- .../net/simon987/npcplugin/HarvesterNPC.java | 1 - .../npcplugin/NonPlayerCharacter.java | 2 +- .../java/net/simon987/npcplugin/Obstacle.java | 2 +- .../java/net/simon987/npcplugin/Portal.java | 2 +- .../net/simon987/npcplugin/RadioTower.java | 2 +- .../net/simon987/npcplugin/VaultDoor.java | 2 +- .../simon987/npcplugin/VaultExitPortal.java | 2 - .../simon987/biomassplugin/BiomassBlob.java | 2 +- .../RadioactiveObstacle.java | 3 +- .../server/game/objects/ItemsContainer.java | 6 +- .../simon987/server/game/world/TileMap.java | 2 +- .../net/simon987/server/game/world/World.java | 82 ++++--------------- Server/src/main/resources/static/js/mar.js | 2 +- Server/src/main/typescript/World.ts | 2 +- 18 files changed, 36 insertions(+), 88 deletions(-) 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 5da34cc..710540a 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java @@ -21,8 +21,7 @@ import java.util.*; public class Cubot extends GameObject implements Updatable, ControllableUnit, MessageReceiver, Attackable, Rechargeable, HardwareHost { - private static final char MAP_INFO = 0x0080; - + private static final char MAP_INFO = 0x0200; /** * Hit points diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLidar.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLidar.java index 04c1093..04da704 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLidar.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLidar.java @@ -107,8 +107,8 @@ public class CubotLidar extends CubotHardwareModule { //Write map data to the location specified by register X int i = getCpu().getRegisterSet().getRegister("X").getValue(); - for (int y = 0; y < cubot.getWorld().getWorldSize(); y++) { - for (int x = 0; x < cubot.getWorld().getWorldSize(); x++) { + for (int x = 0; x < cubot.getWorld().getWorldSize(); x++) { + for (int y = 0; y < cubot.getWorld().getWorldSize(); y++) { getCpu().getMemory().set(i++, mapInfo[x][y]); } } diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java index 97b10d2..5c0dffb 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java @@ -16,6 +16,7 @@ import java.util.ArrayList; */ public class ElectricBox extends GameObject implements Updatable, Attackable { + private static final char MAP_INFO = 0x0301; /** * Hit points */ @@ -98,7 +99,7 @@ public class ElectricBox extends GameObject implements Updatable, Attackable { @Override public char getMapInfo() { - return Obstacle.MAP_INFO; + return MAP_INFO; } /** diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/Factory.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/Factory.java index 613d64e..c721dab 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/Factory.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/Factory.java @@ -15,7 +15,7 @@ import java.util.List; */ public class Factory extends Structure implements Updatable { - private static final int MAP_INFO = 0x0200; + private static final int MAP_INFO = 0x0401; /** * Maximum number of NonPlayerCharacters assigned to this Factory diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java index ea7b579..f15219f 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java @@ -12,7 +12,6 @@ public class HarvesterNPC extends NonPlayerCharacter { public static final int MAX_HEALTH = GameServer.INSTANCE.getConfig().getInt("harvester_hp_max"); public static final int HEAL_RATE = GameServer.INSTANCE.getConfig().getInt("harvester_regen"); - public HarvesterNPC() { setTask(new HarvestTask()); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java index 1220ed0..a11c7d6 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java @@ -15,7 +15,7 @@ import java.util.ArrayList; */ public abstract class NonPlayerCharacter extends GameObject implements Updatable, Attackable { - private static final int MAP_INFO = 0x0040; + private static final char MAP_INFO = 0x0501; /** * Maximum distance to travel from its factory, in Worlds diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java index b4680e0..322f29e 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java @@ -10,7 +10,7 @@ import org.json.simple.JSONObject; */ public class Obstacle extends GameObject implements Attackable { - public static final int MAP_INFO = 0x0400; + public static final int MAP_INFO = 0x0701; /** * Style of the obstacle. Will tell the client which sprite to display diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/Portal.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/Portal.java index 9b942d4..331b5c2 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/Portal.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/Portal.java @@ -17,7 +17,7 @@ public class Portal extends Structure implements Enterable { */ private Location destination; - public static final int MAP_INFO = 0x0020; + public static final int MAP_INFO = 0x0801; public Portal() { super(1, 1); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/RadioTower.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/RadioTower.java index 249acb9..e867774 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/RadioTower.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/RadioTower.java @@ -12,7 +12,7 @@ import java.util.ArrayList; public class RadioTower extends Structure implements MessageReceiver, Updatable { - private static final int MAP_INFO = 0x1000; + private static final int MAP_INFO = 0x0901; public static final int MAX_RANGE = GameServer.INSTANCE.getConfig().getInt("radio_tower_range"); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java index c2b686c..3408b4d 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java @@ -12,7 +12,7 @@ import java.util.Arrays; public class VaultDoor extends Structure implements MessageReceiver, Enterable, Updatable { - private static final int MAP_INFO = 0x0800; + private static final int MAP_INFO = 0x0B00; /** * Password to open the vault door diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java index c6f305e..dba3101 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java @@ -29,9 +29,7 @@ public class VaultExitPortal extends Portal { @Override public boolean enter(GameObject object) { - //TODO: Trigger vault complete event instead - return super.enter(object); } } diff --git a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java index d373a21..59ff076 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java @@ -8,7 +8,7 @@ import org.json.simple.JSONObject; public class BiomassBlob extends GameObject implements InventoryHolder { - private static final char MAP_INFO = 0x4000; + private static final char MAP_INFO = 0x0101; /** * Yield of the blob, in biomass units diff --git a/Plugin Radioactive Cloud/src/main/java/net/simon987/pluginradioactivecloud/RadioactiveObstacle.java b/Plugin Radioactive Cloud/src/main/java/net/simon987/pluginradioactivecloud/RadioactiveObstacle.java index ade7e3e..5576e5f 100644 --- a/Plugin Radioactive Cloud/src/main/java/net/simon987/pluginradioactivecloud/RadioactiveObstacle.java +++ b/Plugin Radioactive Cloud/src/main/java/net/simon987/pluginradioactivecloud/RadioactiveObstacle.java @@ -9,10 +9,11 @@ import net.simon987.server.game.objects.Radioactive; public class RadioactiveObstacle extends GameObject implements Radioactive, Enterable { private final static int corruptionBlockSize = GameServer.INSTANCE.getConfig().getInt("radioactive_obstacle_corruption_block_size"); + private final static int MAP_INFO = 0x0A01; //10 @Override public char getMapInfo() { - return 0; + return MAP_INFO; } @Override diff --git a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java index 042d85c..7d9e275 100644 --- a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java +++ b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java @@ -4,11 +4,13 @@ import net.simon987.server.game.item.Item; import org.bson.Document; import org.json.simple.JSONObject; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; public class ItemsContainer extends GameObject implements InventoryHolder { - private static final char MAP_INFO = 0x0240; + private static final char MAP_INFO = 0x0601; private final List items; private int containerCapacity; diff --git a/Server/src/main/java/net/simon987/server/game/world/TileMap.java b/Server/src/main/java/net/simon987/server/game/world/TileMap.java index 3058156..c42d47d 100755 --- a/Server/src/main/java/net/simon987/server/game/world/TileMap.java +++ b/Server/src/main/java/net/simon987/server/game/world/TileMap.java @@ -126,7 +126,7 @@ public class TileMap implements JSONSerialisable, MongoSerializable { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { - terrain.add(tiles[y][x].getId()); + terrain.add(tiles[x][y].getId()); } } diff --git a/Server/src/main/java/net/simon987/server/game/world/World.java b/Server/src/main/java/net/simon987/server/game/world/World.java index 38c98b3..3d74162 100644 --- a/Server/src/main/java/net/simon987/server/game/world/World.java +++ b/Server/src/main/java/net/simon987/server/game/world/World.java @@ -25,11 +25,6 @@ public class World implements MongoSerializable { */ private int worldSize; - //TODO: This info should be pulled from the Tile class - private static final char INFO_BLOCKED = 0x8000; - private static final char INFO_IRON = 0x0200; - private static final char INFO_COPPER = 0x0100; - private int x; private int y; @@ -115,20 +110,6 @@ public class World implements MongoSerializable { return matchingObjects; } - - public ArrayList findObjects(int mapInfo) { - - ArrayList matchingObjects = new ArrayList<>(2); - - for (GameObject obj : gameObjects.values()) { - if ((obj.getMapInfo() & mapInfo) == mapInfo) { - matchingObjects.add(obj); - } - } - - return matchingObjects; - } - public ArrayList findGameObjects(String type) { ArrayList matchingObjects = new ArrayList<>(2); @@ -209,11 +190,13 @@ public class World implements MongoSerializable { @Override public String toString() { - StringBuilder str = new StringBuilder("World (" + x + ", " + y + ")\n"); + StringBuilder str = new StringBuilder(String.format("World (%04X, %04X)\n", x, y)); - for (int x = 0; x < worldSize; x++) { - for (int y = 0; y < worldSize; y++) { - str.append(tileMap.getTileIdAt(x, y)).append(" "); + char[][] mapInfo = getMapInfo(); + + for (int y = 0; y < worldSize; y++) { + for (int x = 0; x < worldSize; x++) { + str.append(String.format("%04X ", (int) mapInfo[x][y])); } str.append("\n"); } @@ -251,40 +234,30 @@ public class World implements MongoSerializable { * Get a binary representation of the map as an array of 16-bit bit fields, one word for each * tile. *

- * todo Performance cache this? + * Each tile is represented as such: OOOOOOOOTTTTTTTB where O is the object, + * T the tile and B if the tile is blocked or not */ public char[][] getMapInfo() { char[][] mapInfo = new char[worldSize][worldSize]; //Tile - for (int y = 0; y < worldSize; y++) { - for (int x = 0; x < worldSize; x++) { + for (int x = 0; x < worldSize; x++) { + for (int y = 0; y < worldSize; y++) { + Tile tile = tileMap.getTileAt(x, y); - if (tileMap.getTileIdAt(x, y) == TilePlain.ID) { - mapInfo[x][y] = 0; - - } else if (tileMap.getTileAt(x, y).isBlocked()) { - mapInfo[x][y] = INFO_BLOCKED; - - //TODO: Tiles should have their .getMapInfo() method - } else if (tileMap.getTileIdAt(x, y) == TileCopper.ID) { - mapInfo[x][y] = INFO_COPPER; - - } else if (tileMap.getTileIdAt(x, y) == TileIron.ID) { - mapInfo[x][y] = INFO_IRON; - } + mapInfo[x][y] = (char) (tile.isBlocked() ? 1 : 0); + mapInfo[x][y] |= (char) (tile.getId() << 1); } } - //Objects for (GameObject obj : gameObjects.values()) { + //Overwrite, only the last object on a tile is considered but the blocked bit is kept + mapInfo[obj.getX()][obj.getY()] &= 0x00FE; mapInfo[obj.getX()][obj.getY()] |= obj.getMapInfo(); - } return mapInfo; - } /** @@ -412,31 +385,6 @@ public class World implements MongoSerializable { return neighbouringWorlds; } - //Unused -// public ArrayList getNeighbouringExistingWorlds(){ -// ArrayList neighbouringWorlds = new ArrayList<>(); -// -// if (universe == null){ -// return neighbouringWorlds; -// } -// -// for (int dx=-1; dx<=+1; dx+=2){ -// World nw = universe.getWorld(x+dx,y,false); -// if (nw != null){ -// neighbouringWorlds.add(nw); -// } -// } -// for (int dy=-1; dy<=+1; dy+=2){ -// World nw = universe.getWorld(x,y+dy,false); -// if (nw != null){ -// neighbouringWorlds.add(nw); -// } -// } -// -// return neighbouringWorlds; -// } - - public boolean canUnload(){ return updatable==0; } diff --git a/Server/src/main/resources/static/js/mar.js b/Server/src/main/resources/static/js/mar.js index 1d837d9..1b23123 100644 --- a/Server/src/main/resources/static/js/mar.js +++ b/Server/src/main/resources/static/js/mar.js @@ -1640,7 +1640,7 @@ var World = (function () { } for (var x = 0; x < size; x++) { for (var y = 0; y < size; y++) { - var tile = Tile.createTile(terrain[y * size + x], x, y); + var tile = Tile.createTile(terrain[x * size + y], x, y); this.tiles.push(tile); mar.isoGroup.add(tile); } diff --git a/Server/src/main/typescript/World.ts b/Server/src/main/typescript/World.ts index a3a8a8c..114e16a 100644 --- a/Server/src/main/typescript/World.ts +++ b/Server/src/main/typescript/World.ts @@ -292,7 +292,7 @@ class World { for (let x = 0; x < size; x++) { for (let y = 0; y < size; y++) { - let tile: Tile = Tile.createTile(terrain[y * size + x], x, y); + let tile: Tile = Tile.createTile(terrain[x * size + y], x, y); this.tiles.push(tile); mar.isoGroup.add(tile);