mirror of
https://github.com/simon987/Much-Assembly-Required.git
synced 2025-04-10 14:26:45 +00:00
Added Battery Hardware. #2
This commit is contained in:
parent
f7ea14275c
commit
a3fa3c4c09
@ -1,5 +1,6 @@
|
||||
package net.simon987.cubotplugin;
|
||||
|
||||
import net.simon987.server.GameServer;
|
||||
import net.simon987.server.game.ControllableUnit;
|
||||
import net.simon987.server.game.Direction;
|
||||
import net.simon987.server.game.GameObject;
|
||||
@ -30,6 +31,9 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit {
|
||||
|
||||
private User parent;
|
||||
|
||||
private int energy;
|
||||
private int maxEnergy;
|
||||
|
||||
public Cubot() {
|
||||
|
||||
}
|
||||
@ -43,8 +47,12 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit {
|
||||
public void update() {
|
||||
|
||||
if (currentAction == CubotAction.WALKING) {
|
||||
if (!incrementLocation()) {
|
||||
//Couldn't walk
|
||||
if (spendEnergy(100)) {
|
||||
if (!incrementLocation()) {
|
||||
//Couldn't walk
|
||||
currentAction = CubotAction.IDLE;
|
||||
}
|
||||
} else {
|
||||
currentAction = CubotAction.IDLE;
|
||||
}
|
||||
}
|
||||
@ -74,6 +82,7 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit {
|
||||
json.put("hp", hp);
|
||||
json.put("action", lastAction.ordinal());
|
||||
json.put("holo", (int) lastHologram);
|
||||
json.put("energy", (int) lastHologram);
|
||||
|
||||
if (parent != null) {
|
||||
json.put("parent", parent.getUsername()); //Only used client-side for now
|
||||
@ -91,6 +100,8 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit {
|
||||
cubot.hp = (int)(long)json.get("hp");
|
||||
cubot.setDirection(Direction.getDirection((int)(long)json.get("direction")));
|
||||
cubot.heldItem = (int)(long)json.get("heldItem");
|
||||
cubot.energy = (int) (long) json.get("energy");
|
||||
cubot.maxEnergy = GameServer.INSTANCE.getConfig().getInt("battery_max_energy");
|
||||
|
||||
return cubot;
|
||||
|
||||
@ -141,4 +152,33 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit {
|
||||
public char getHologram() {
|
||||
return lastHologram;
|
||||
}
|
||||
|
||||
|
||||
public int getEnergy() {
|
||||
return energy;
|
||||
}
|
||||
|
||||
public void setEnergy(int energy) {
|
||||
this.energy = energy;
|
||||
}
|
||||
|
||||
public boolean spendEnergy(int spent) {
|
||||
|
||||
if (energy - spent < 0) {
|
||||
return false;
|
||||
} else {
|
||||
energy -= spent;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void setMaxEnergy(int maxEnergy) {
|
||||
this.maxEnergy = maxEnergy;
|
||||
}
|
||||
|
||||
public int getMaxEnergy() {
|
||||
return maxEnergy;
|
||||
}
|
||||
}
|
||||
|
59
Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java
Normal file
59
Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java
Normal file
@ -0,0 +1,59 @@
|
||||
package net.simon987.cubotplugin;
|
||||
|
||||
import net.simon987.server.GameServer;
|
||||
import net.simon987.server.assembly.CpuHardware;
|
||||
import net.simon987.server.assembly.Status;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class CubotBattery extends CpuHardware {
|
||||
|
||||
public static final int DEFAULT_ADDRESS = 0x000A;
|
||||
|
||||
/**
|
||||
* Hardware ID (Should be unique)
|
||||
*/
|
||||
public static final char HWID = 0x000A;
|
||||
|
||||
private Cubot cubot;
|
||||
private static final int POLL = 1;
|
||||
private static final int GET_MAX_CAPACITY = 2;
|
||||
|
||||
public CubotBattery(Cubot cubot) {
|
||||
this.cubot = cubot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleInterrupt(Status status) {
|
||||
|
||||
int a = getCpu().getRegisterSet().getRegister("A").getValue();
|
||||
|
||||
if (a == POLL) {
|
||||
getCpu().getRegisterSet().getRegister("B").setValue(cubot.getEnergy());
|
||||
|
||||
} else if (a == GET_MAX_CAPACITY) {
|
||||
getCpu().getRegisterSet().getRegister("B").setValue(cubot.getMaxEnergy());
|
||||
} else if (a == 0xFFFF) {
|
||||
cubot.setEnergy(cubot.getMaxEnergy());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public char getId() {
|
||||
return HWID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialise() {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("hwid", (int) HWID);
|
||||
json.put("cubot", cubot.getObjectId());
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
public static CubotBattery deserialize(JSONObject hwJSON) {
|
||||
return new CubotBattery((Cubot) GameServer.INSTANCE.getGameUniverse().getObject((int) (long) hwJSON.get("cubot")));
|
||||
}
|
||||
|
||||
}
|
@ -40,19 +40,19 @@ public class CubotDrill extends CpuHardware {
|
||||
|
||||
} else if (a == GATHER_SLOW || a == GATHER_FAST) {
|
||||
|
||||
if (cubot.getAction() == CubotAction.IDLE) {
|
||||
int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY());
|
||||
if (cubot.spendEnergy(1400)) {
|
||||
if (cubot.getAction() == CubotAction.IDLE) {
|
||||
int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY());
|
||||
|
||||
if (tile == TileMap.IRON_TILE) {
|
||||
cubot.setHeldItem(TileMap.ITEM_IRON);
|
||||
cubot.setCurrentAction(CubotAction.DIGGING);
|
||||
if (tile == TileMap.IRON_TILE) {
|
||||
cubot.setHeldItem(TileMap.ITEM_IRON);
|
||||
cubot.setCurrentAction(CubotAction.DIGGING);
|
||||
|
||||
} else if (tile == TileMap.COPPER_TILE) {
|
||||
cubot.setHeldItem(TileMap.ITEM_COPPER);
|
||||
cubot.setCurrentAction(CubotAction.DIGGING);
|
||||
} else if (tile == TileMap.COPPER_TILE) {
|
||||
cubot.setHeldItem(TileMap.ITEM_COPPER);
|
||||
cubot.setCurrentAction(CubotAction.DIGGING);
|
||||
|
||||
} else {
|
||||
//System.out.println("FAILED: dig");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,9 @@ public class CubotInventory extends CpuHardware {
|
||||
getCpu().getRegisterSet().getRegister("B").setValue(cubot.getHeldItem());
|
||||
|
||||
} else if (a == CLEAR) {
|
||||
cubot.setHeldItem(0);
|
||||
if (cubot.spendEnergy(100)) {
|
||||
cubot.setHeldItem(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ public class CubotLaser extends CpuHardware {
|
||||
private Cubot cubot;
|
||||
|
||||
private static final int WITHDRAW = 1;
|
||||
private static final int DEPOSIT = 2;
|
||||
|
||||
|
||||
public CubotLaser(Cubot cubot) {
|
||||
@ -42,33 +43,29 @@ public class CubotLaser extends CpuHardware {
|
||||
|
||||
if(a == WITHDRAW) {
|
||||
|
||||
//System.out.println("withdraw");
|
||||
|
||||
Point frontTile = cubot.getFrontTile();
|
||||
ArrayList<GameObject> objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y);
|
||||
|
||||
|
||||
if (cubot.getAction() != CubotAction.IDLE && objects.size() > 0) {
|
||||
|
||||
//FIXME: Problem here if more than 1 object
|
||||
if (objects.get(0) instanceof InventoryHolder) {
|
||||
//Take the item
|
||||
if (((InventoryHolder) objects.get(0)).takeItem(b)) {
|
||||
if (((InventoryHolder) objects.get(0)).canTakeItem(b)) {
|
||||
if (cubot.spendEnergy(30)) {
|
||||
//Take the item
|
||||
((InventoryHolder) objects.get(0)).takeItem(b);
|
||||
|
||||
cubot.setHeldItem(b);
|
||||
//System.out.println("took " + b);
|
||||
cubot.setCurrentAction(CubotAction.WITHDRAWING);
|
||||
|
||||
} else {
|
||||
//The inventory holder can't provide this item
|
||||
//todo Add emote here
|
||||
// System.out.println("DEBUG: FAILED: take (The inventory holder can't provide this item)");
|
||||
cubot.setHeldItem(b);
|
||||
cubot.setCurrentAction(CubotAction.WITHDRAWING);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
//Nothing in front
|
||||
// System.out.println("DEBUG: FAILED: take (Nothing in front or Cubot is busy)");
|
||||
}
|
||||
|
||||
|
||||
} else if (a == DEPOSIT) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -39,11 +39,14 @@ public class CubotLeg extends CpuHardware implements JSONSerialisable {
|
||||
|
||||
if(a == SET_DIR){
|
||||
|
||||
|
||||
Direction dir = Direction.getDirection(b);
|
||||
|
||||
if(dir != null){
|
||||
cubot.setDirection(Direction.getDirection(b));
|
||||
status.setErrorFlag(false);
|
||||
if (cubot.spendEnergy(20)) {
|
||||
cubot.setDirection(Direction.getDirection(b));
|
||||
status.setErrorFlag(false);
|
||||
}
|
||||
} else {
|
||||
status.setErrorFlag(true);
|
||||
}
|
||||
|
@ -52,75 +52,79 @@ public class CubotLidar extends CpuHardware implements JSONSerialisable {
|
||||
getCpu().getRegisterSet().getRegister("Y").setValue(cubot.getY());
|
||||
break;
|
||||
case GET_PATH:
|
||||
int b = getCpu().getRegisterSet().getRegister("B").getValue();
|
||||
int destX = getCpu().getRegisterSet().getRegister("X").getValue();
|
||||
int destY = getCpu().getRegisterSet().getRegister("Y").getValue();
|
||||
if (cubot.spendEnergy(50)) {
|
||||
int b = getCpu().getRegisterSet().getRegister("B").getValue();
|
||||
int destX = getCpu().getRegisterSet().getRegister("X").getValue();
|
||||
int destY = getCpu().getRegisterSet().getRegister("Y").getValue();
|
||||
|
||||
//Get path
|
||||
ArrayList<Node> nodes = Pathfinder.findPath(cubot.getWorld(), cubot.getX(), cubot.getY(),
|
||||
destX, destY, b);
|
||||
//Get path
|
||||
ArrayList<Node> nodes = Pathfinder.findPath(cubot.getWorld(), cubot.getX(), cubot.getY(),
|
||||
destX, destY, b);
|
||||
|
||||
// System.out.println(nodes.size() + " nodes");
|
||||
//Write to memory
|
||||
byte[] mem = getCpu().getMemory().getBytes();
|
||||
|
||||
//Write to memory
|
||||
byte[] mem = getCpu().getMemory().getBytes();
|
||||
int counter = MEMORY_PATH_START;
|
||||
|
||||
int counter = MEMORY_PATH_START;
|
||||
if (nodes != null) {
|
||||
|
||||
if (nodes != null) {
|
||||
Node lastNode = null;
|
||||
|
||||
Node lastNode = null;
|
||||
for (Node n : nodes) {
|
||||
//Store the path as a sequence of directions
|
||||
|
||||
for (Node n : nodes) {
|
||||
//Store the path as a sequence of directions
|
||||
if (lastNode == null) {
|
||||
lastNode = n;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (n.x < lastNode.x) {
|
||||
//West
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 3;
|
||||
} else if (n.x > lastNode.x) {
|
||||
//East
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 1;
|
||||
} else if (n.y < lastNode.y) {
|
||||
//North
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 0;
|
||||
} else if (n.y > lastNode.y) {
|
||||
//South
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 2;
|
||||
}
|
||||
|
||||
if (lastNode == null) {
|
||||
lastNode = n;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (n.x < lastNode.x) {
|
||||
//West
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 3;
|
||||
} else if (n.x > lastNode.x) {
|
||||
//East
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 1;
|
||||
} else if (n.y < lastNode.y) {
|
||||
//North
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 0;
|
||||
} else if (n.y > lastNode.y) {
|
||||
//South
|
||||
mem[counter++] = 0;
|
||||
mem[counter++] = 2;
|
||||
}
|
||||
|
||||
lastNode = n;
|
||||
//Indicate end of path with 0xAAAA
|
||||
mem[counter++] = -86;
|
||||
mem[counter] = -86;
|
||||
} else {
|
||||
//Indicate invalid path 0xFFFF
|
||||
mem[counter++] = -1;
|
||||
mem[counter] = -1;
|
||||
}
|
||||
|
||||
//Indicate end of path with 0xAAAA
|
||||
mem[counter++] = -86;
|
||||
mem[counter] = -86;
|
||||
} else {
|
||||
//Indicate invalid path 0xFFFF
|
||||
mem[counter++] = -1;
|
||||
mem[counter] = -1;
|
||||
LogManager.LOGGER.fine("DEBUG: path to" + destX + "," + destY);
|
||||
}
|
||||
|
||||
LogManager.LOGGER.fine("DEBUG: path to" + destX + "," + destY);
|
||||
break;
|
||||
|
||||
case GET_MAP:
|
||||
char[][] mapInfo = cubot.getWorld().getMapInfo();
|
||||
if (cubot.spendEnergy(10)) {
|
||||
char[][] mapInfo = cubot.getWorld().getMapInfo();
|
||||
|
||||
int i = MEMORY_MAP_START;
|
||||
for (int y = 0; y < World.WORLD_SIZE; y++) {
|
||||
for (int x = 0; x < World.WORLD_SIZE; x++) {
|
||||
getCpu().getMemory().set(i++, mapInfo[x][y]);
|
||||
int i = MEMORY_MAP_START;
|
||||
for (int y = 0; y < World.WORLD_SIZE; y++) {
|
||||
for (int x = 0; x < World.WORLD_SIZE; x++) {
|
||||
getCpu().getMemory().set(i++, mapInfo[x][y]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case GET_WORLD_POS:
|
||||
getCpu().getRegisterSet().getRegister("X").setValue(cubot.getWorld().getX());
|
||||
|
@ -53,6 +53,8 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer,
|
||||
return Keyboard.deserialize(hwJson);
|
||||
case CubotHologram.HWID:
|
||||
return CubotHologram.deserialize(hwJson);
|
||||
case CubotBattery.HWID:
|
||||
return CubotBattery.deserialize(hwJson);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -9,9 +9,6 @@ public class Keyboard extends CpuHardware {
|
||||
|
||||
public static final int DEFAULT_ADDRESS = 4;
|
||||
|
||||
public static final String NAME = "Wireless Keyboard";
|
||||
|
||||
|
||||
private static final int CLEAR_BUFFER = 0;
|
||||
private static final int FETCH_KEY = 1;
|
||||
|
||||
|
@ -35,6 +35,8 @@ public class CpuInitialisationListener implements GameEventListener {
|
||||
invHw.setCpu(cpu);
|
||||
CubotHologram emoteHw = new CubotHologram((Cubot) user.getControlledUnit());
|
||||
emoteHw.setCpu(cpu);
|
||||
CubotBattery batteryHw = new CubotBattery((Cubot) user.getControlledUnit());
|
||||
batteryHw.setCpu(cpu);
|
||||
|
||||
cpu.attachHardware(legHw, CubotLeg.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(laserHw, CubotLaser.DEFAULT_ADDRESS);
|
||||
@ -44,5 +46,6 @@ public class CpuInitialisationListener implements GameEventListener {
|
||||
cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(emoteHw, CubotHologram.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(batteryHw, CubotBattery.DEFAULT_ADDRESS);
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,9 @@ public class UserCreationListener implements GameEventListener {
|
||||
|
||||
cubot.setHeldItem(GameServer.INSTANCE.getConfig().getInt("new_user_item"));
|
||||
|
||||
cubot.setEnergy(GameServer.INSTANCE.getConfig().getInt("battery_max_energy"));
|
||||
cubot.setMaxEnergy(GameServer.INSTANCE.getConfig().getInt("battery_max_energy"));
|
||||
|
||||
cubot.setParent(user);
|
||||
|
||||
Point point = cubot.getWorld().getRandomPassableTile();
|
||||
|
@ -19,7 +19,12 @@ public class CpuInitialisationListener implements GameEventListener {
|
||||
|
||||
CPU cpu = (CPU) event.getSource();
|
||||
|
||||
cpu.attachHardware(new RandomNumberGenerator(), RandomNumberGenerator.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(new Clock(), Clock.DEFAULT_ADDRESS);
|
||||
RandomNumberGenerator rngHW = new RandomNumberGenerator();
|
||||
rngHW.setCpu(cpu);
|
||||
Clock clock = new Clock();
|
||||
clock.setCpu(cpu);
|
||||
|
||||
cpu.attachHardware(rngHW, RandomNumberGenerator.DEFAULT_ADDRESS);
|
||||
cpu.attachHardware(clock, Clock.DEFAULT_ADDRESS);
|
||||
}
|
||||
}
|
@ -132,30 +132,28 @@ public class Plant extends GameObject implements Updatable, InventoryHolder{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canTakeItem(int item) {
|
||||
return item == ITM_BIOMASS && grown && biomassCount >= 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when an object attempts to take an item from this Plant.
|
||||
* If the object requests biomass, it will be subtracted from biomassCount, and
|
||||
* if it reaches 0, the plant is deleted
|
||||
*
|
||||
* @param item item id (see MarConstants.ITEM_*)
|
||||
* @return true if the requested item is ITEM_BIOMASS and if the plant is grown
|
||||
*/
|
||||
@Override
|
||||
public boolean takeItem(int item) {
|
||||
public void takeItem(int item) {
|
||||
|
||||
if (item == ITM_BIOMASS) {
|
||||
if (grown && biomassCount > 1) {
|
||||
biomassCount--;
|
||||
return true;
|
||||
} else if (grown) {
|
||||
//Delete plant
|
||||
setDead(true);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ import org.json.simple.JSONObject;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class GameServer implements Runnable {
|
||||
|
||||
@ -112,7 +113,9 @@ public class GameServer implements Runnable {
|
||||
}
|
||||
|
||||
//Process each worlds
|
||||
for (World world : gameUniverse.getWorlds()) {
|
||||
//Avoid concurrent modification
|
||||
ArrayList<World> worlds = new ArrayList<>(gameUniverse.getWorlds());
|
||||
for (World world : worlds) {
|
||||
world.update();
|
||||
}
|
||||
|
||||
|
@ -444,5 +444,11 @@ public class CPU implements JSONSerialisable{
|
||||
return str;
|
||||
}
|
||||
|
||||
public CpuHardware getHardware(int address) {
|
||||
|
||||
return attachedHardware.get(address);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -120,9 +120,6 @@ public abstract class GameObject implements JSONSerialisable {
|
||||
x = newX;
|
||||
y = newY;
|
||||
} else {
|
||||
//Display error when object is trying to walk in a wall
|
||||
//TODO Add emote here
|
||||
//System.out.println("DEBUG: FAILED walk");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -13,8 +13,12 @@ public interface InventoryHolder {
|
||||
/**
|
||||
* Take an item from the inventory
|
||||
* @param item Desired item id (see MarConstants.ITEM_*)
|
||||
* @return true is the take item action executed properly, true also means that the desired item
|
||||
* was removed from the inventory
|
||||
*/
|
||||
boolean takeItem(int item);
|
||||
void takeItem(int item);
|
||||
|
||||
/**
|
||||
* @param item item to take
|
||||
* @return true if the InventoryHolder can provide this item
|
||||
*/
|
||||
boolean canTakeItem(int item);
|
||||
}
|
||||
|
@ -41,6 +41,8 @@ plant_grow_time=32
|
||||
minTreeCount=3
|
||||
# Maximum tree count for the WorldGenerator
|
||||
maxTreeCount=10
|
||||
# Maximum energy of the battery hardware in kJ
|
||||
battery_max_energy=60000
|
||||
# ----------------------------------------------
|
||||
# Minimum center point count for the WorldGenerator
|
||||
wg_centerPointCountMin=5
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user