More work on vaults

This commit is contained in:
simon 2018-03-01 10:42:24 -05:00
parent 039088ac00
commit 0ada6c29d4
9 changed files with 154 additions and 28 deletions

View File

@ -72,18 +72,22 @@ public class CubotLaser extends CpuHardware {
// TODO
} else if (a == LASER_ATTACK) {
if (cubot.spendEnergy(70)) {
//Get object directly in front of the Cubot
Point frontTile = cubot.getFrontTile();
ArrayList<GameObject> objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y);
if (cubot.getCurrentAction() == Action.IDLE) {
if (cubot.spendEnergy(70)) {
//Get object directly in front of the Cubot
Point frontTile = cubot.getFrontTile();
ArrayList<GameObject> objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y);
//todo: Add option in config to allow PvP
if (objects.size() > 0 && objects.get(0) instanceof Attackable && !(objects.get(0) instanceof Cubot)) {
((Attackable) objects.get(0)).damage(LASER_DAMAGE);
}
if (objects.size() > 0 && objects.get(0) instanceof Attackable) {
((Attackable) objects.get(0)).damage(LASER_DAMAGE);
}
cubot.setCurrentAction(Action.ATTACKING);
}
}
}

View File

@ -1,20 +1,74 @@
package net.simon987.npcplugin;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import net.simon987.server.GameServer;
import net.simon987.server.game.Attackable;
import net.simon987.server.game.GameObject;
import net.simon987.server.game.Updatable;
import net.simon987.server.logging.LogManager;
import org.json.simple.JSONObject;
public class ElectricBox extends Obstacle implements Updatable {
public class ElectricBox extends GameObject implements Updatable, Attackable {
public static final int STYLE = 1;
public static final int ID = 7;
private static final int maxHp = GameServer.INSTANCE.getConfig().getInt("electric_box_hp");
private static final int damage = GameServer.INSTANCE.getConfig().getInt("electric_box_damage");
private static final int energyGiven = GameServer.INSTANCE.getConfig().getInt("electric_box_energy_given");
public ElectricBox() {
super(maxHp);
private int hp;
setStyle(STYLE);
public ElectricBox() {
this.hp = maxHp;
}
@Override
public void setHealRate(int hp) {
//no op
}
@Override
public int getHp() {
return hp;
}
@Override
public void setHp(int hp) {
this.hp = hp;
}
@Override
public int getMaxHp() {
return hp;
}
@Override
public void setMaxHp(int hp) {
//No op
}
@Override
public void heal(int amount) {
//No op
}
@Override
public void damage(int amount) {
hp -= amount;
//YOU ARE DEAD
if (hp <= 0) {
setDead(true);
LogManager.LOGGER.severe("BOX DEAD");
}
}
@Override
public char getMapInfo() {
return Obstacle.MAP_INFO;
}
@Override
@ -22,6 +76,43 @@ public class ElectricBox extends Obstacle implements Updatable {
}
@Override
public JSONObject serialise() {
JSONObject json = new JSONObject();
json.put("i", getObjectId());
json.put("x", getX());
json.put("y", getY());
json.put("t", ID);
json.put("hp", hp);
return json;
}
@Override
public BasicDBObject mongoSerialise() {
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("i", getObjectId());
dbObject.put("x", getX());
dbObject.put("y", getY());
dbObject.put("t", ID);
dbObject.put("hp", getHp());
return dbObject;
}
public static ElectricBox deserialize(DBObject obj) {
ElectricBox electricBox = new ElectricBox();
electricBox.setHp((int) obj.get("hp"));
electricBox.setObjectId((long) obj.get("i"));
electricBox.setX((int) obj.get("x"));
electricBox.setY((int) obj.get("y"));
return electricBox;
}
@Override
public boolean onDeadCallback() {
getWorld().decUpdatable();

View File

@ -48,6 +48,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C
return VaultDoor.deserialize(obj);
} else if (objType == Obstacle.ID) {
return Obstacle.deserialize(obj);
} else if (objType == ElectricBox.ID) {
return ElectricBox.deserialize(obj);
}
return null;

View File

@ -13,6 +13,7 @@ import org.json.simple.JSONObject;
public class Obstacle extends GameObject implements Attackable {
public static final int ID = 6;
public static final int MAP_INFO = 0x0400;
/**
* Style of the obstacle. Will tell the client which sprite to display
@ -77,7 +78,7 @@ public class Obstacle extends GameObject implements Attackable {
@Override
public char getMapInfo() {
return 0x0400;
return MAP_INFO;
}
public int getStyle() {
@ -96,6 +97,7 @@ public class Obstacle extends GameObject implements Attackable {
dbObject.put("x", getX());
dbObject.put("y", getY());
dbObject.put("t", ID);
dbObject.put("hp", hp);
dbObject.put("style", style);
return dbObject;
@ -117,7 +119,6 @@ public class Obstacle extends GameObject implements Attackable {
public static Obstacle deserialize(DBObject obj) {
//Doesn't matter if we don't store maxHP, since obstacles can't be healed
Obstacle obstacle = new Obstacle((int) obj.get("hp"));
obstacle.setObjectId((long) obj.get("i"));
obstacle.setX((int) obj.get("x"));

View File

@ -17,6 +17,8 @@ public class VaultDimension {
*/
private String name;
private World homeWorld;
public VaultDimension(long vaultDoorId) {
name = "v" + vaultDoorId + "-";
@ -42,6 +44,8 @@ public class VaultDimension {
int maxLayerCount = 6;
int minAttachedWorld = 0;
int maxAttachedWorld = 4; //todo cap at 4 to avoid infinite loop
int minElectricBoxCount = 2;
int maxElectricBoxCount = 4;
HashMap<Integer, ArrayList<WorldBluePrint>> worldLayers = new HashMap<>();
VaultWorldGenerator generator = new VaultWorldGenerator();
@ -50,11 +54,11 @@ public class VaultDimension {
int layerCount = random.nextInt(maxLayerCount - minLayerCount) + minLayerCount;
//1. Create home world
WorldBluePrint homeWorld = new WorldBluePrint();
homeWorld.coords.x = 0x7FFF;
homeWorld.coords.y = 0x7FFF;
WorldBluePrint homeWorldBluePrint = new WorldBluePrint();
homeWorldBluePrint.coords.x = 0x7FFF;
homeWorldBluePrint.coords.y = 0x7FFF;
worldLayers.put(0, new ArrayList<>());
worldLayers.get(0).add(homeWorld);
worldLayers.get(0).add(homeWorldBluePrint);
//2. For each world in the current layer, attach a random number of new worlds
for (int i = 1; i <= layerCount; i++) {
@ -100,9 +104,21 @@ public class VaultDimension {
World vWorld = generator.generateVaultWorld(bp.coords.x, bp.coords.y, bp.openings, name);
GameServer.INSTANCE.getGameUniverse().addWorld(vWorld);
ArrayList<ElectricBox> newBoxes = VaultWorldUtils.generateElectricBoxes(vWorld, minElectricBoxCount,
maxElectricBoxCount);
for (ElectricBox blob : newBoxes) {
vWorld.addObject(blob);
vWorld.incUpdatable();
}
if (key == layerCount - 1) {
lastLayerWorlds.add(vWorld);
}
if (key == 0) {
this.homeWorld = vWorld;
//TODO: generate exit door here and save the coords
}
}
}
@ -117,6 +133,10 @@ public class VaultDimension {
return worldLayers.values().stream().flatMap(Collection::stream).anyMatch(bp -> bp.coords.equals(coords));
}
World getHomeWorld() {
return homeWorld;
}
/**
* Helper class to plan the layout of a vault dimension
*/

View File

@ -55,6 +55,7 @@ public class VaultDoor extends GameObject implements Programmable, Enterable, Up
} else {
VaultDimension vaultDimension = new VaultDimension(getObjectId());
homeWorld = vaultDimension.getHomeWorld();
}
}
@ -111,7 +112,13 @@ public class VaultDoor extends GameObject implements Programmable, Enterable, Up
LogManager.LOGGER.fine("VAULT enter " + open);
if (open) {
//TODO: Enter in the vault
object.getWorld().decUpdatable();
object.getWorld().removeObject(object);
homeWorld.incUpdatable();
homeWorld.addObject(object);
object.setWorld(homeWorld);
return true;

View File

@ -53,10 +53,11 @@ public class VaultWorldUpdateListener implements GameEventListener {
if (GameServer.INSTANCE.getGameUniverse().getTime() >= waitUntil) {
//If the timer was set less than respawn_time ticks ago, respawn the blobs
ArrayList<ElectricBox> newBlobs = VaultWorldUtils.generateElectricBoxes(world, minElectricBoxCount,
ArrayList<ElectricBox> newBoxes = VaultWorldUtils.generateElectricBoxes(world, minElectricBoxCount,
maxElectricBoxCount);
for (ElectricBox blob : newBlobs) {
for (ElectricBox blob : newBoxes) {
world.addObject(blob);
world.incUpdatable();
}
//Set the 'waitUntil' time to 0 to indicate that we are not waiting

View File

@ -6,6 +6,8 @@ public enum Action {
WALKING,
WITHDRAWING,
DEPOSITING,
LISTENING
LISTENING,
_PLACEHOLDER_,
ATTACKING,
}

View File

@ -240,15 +240,13 @@ public class DebugHandler implements MessageHandler {
if (object instanceof Updatable) {
object.getWorld().decUpdatable();
world.incUpdatable();
}
object.getWorld().removeObject(object);
object.setWorld(world);
world.addObject(object);
if (object instanceof Updatable) {
world.incUpdatable();
}
object.setWorld(world);
object.setX(x);
object.setY(y);