diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java index 10b88c2775b4077e9567b7b984448d6928ae3d5b..054b787d8ded15d9aef44ae4bd2be0263a97d3de 100644 --- a/src/main/java/com/comandante/creeper/Main.java +++ b/src/main/java/com/comandante/creeper/Main.java @@ -7,7 +7,6 @@ import com.comandante.creeper.managers.EntityManager; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.managers.PlayerManager; import com.comandante.creeper.managers.RoomManager; -import com.comandante.creeper.model.Player; import com.comandante.creeper.model.PlayerMetadata; import com.comandante.creeper.model.Stats; import com.comandante.creeper.model.StatsBuilder; @@ -29,16 +28,17 @@ public class Main { .make(); RoomManager roomManager = new RoomManager(); - EntityManager entityManager = new EntityManager(roomManager, db); PlayerManager playerManager = new PlayerManager(db); + EntityManager entityManager = new EntityManager(roomManager, playerManager, db); + Stats chrisBrianStats = new StatsBuilder().setStrength(7).setWillpower(8).setAim(6).setAgile(5).setArmorRating(4).setMeleSkill(10).setHealth(100).setWeaponRatingMin(10).setWeaponRatingMax(20).setNumberweaponOfRolls(1).createStats(); - if (playerManager.getPlayerMetadata(new Player("chris").getPlayerId()) == null) { + if (playerManager.getPlayerMetadata(createPlayerId("chris")) == null) { System.out.println("Creating Chris User."); playerManager.savePlayerMetadata(new PlayerMetadata("chris", "poop", new String(Base64.encodeBase64("chris".getBytes())), chrisBrianStats)); } - if (playerManager.getPlayerMetadata(new Player("brian").getPlayerId()) == null) { + if (playerManager.getPlayerMetadata(createPlayerId("chris")) == null) { System.out.println("Creating Brian User."); playerManager.savePlayerMetadata(new PlayerMetadata("brian", "poop", new String(Base64.encodeBase64("brian".getBytes())), chrisBrianStats)); } @@ -67,4 +67,8 @@ public class Main { System.out.println("Creeper started."); } + + public static String createPlayerId(String playerName) { + return new String(Base64.encodeBase64(playerName.getBytes())); + } } diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java index e7c3cd9d4719b1955999e3b05d59e94465d31dcb..7ccd1e13d63473d21dece5ccaca5f286bfb89c03 100644 --- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java +++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java @@ -1,6 +1,7 @@ package com.comandante.creeper.command; +import com.comandante.creeper.Main; import com.comandante.creeper.command.commands.DropCommand; import com.comandante.creeper.command.commands.GossipCommand; import com.comandante.creeper.command.commands.InventoryCommand; @@ -15,7 +16,6 @@ import com.comandante.creeper.command.commands.UseCommand; import com.comandante.creeper.command.commands.WhoCommand; import com.comandante.creeper.command.commands.WhoamiCommand; import com.comandante.creeper.managers.GameManager; -import com.comandante.creeper.model.Player; import com.comandante.creeper.server.CreeperSession; import org.jboss.netty.channel.MessageEvent; @@ -33,7 +33,7 @@ public class DefaultCommandHandler { String originalMessage = (String) e.getMessage(); e.getChannel(); String rootCommand = originalMessage.split(" ")[0].toLowerCase(); - String playerId = new Player(creeperSession.getUsername().get()).getPlayerId(); + String playerId = Main.createPlayerId(creeperSession.getUsername().get()); if (GossipCommand.validTriggers.contains(rootCommand)) { GossipCommand gossipCommand = new GossipCommand(playerId, gameManager, originalMessage); commandService.processCommand(gossipCommand); diff --git a/src/main/java/com/comandante/creeper/managers/EntityManager.java b/src/main/java/com/comandante/creeper/managers/EntityManager.java index e5bfbebf230fd981e26ae4082406d40838923c2f..87ae9e3b8768f1b71c6b748abb8f392a0c98c127 100644 --- a/src/main/java/com/comandante/creeper/managers/EntityManager.java +++ b/src/main/java/com/comandante/creeper/managers/EntityManager.java @@ -3,6 +3,7 @@ package com.comandante.creeper.managers; import com.comandante.creeper.model.CreeperEntity; import com.comandante.creeper.Items.Item; import com.comandante.creeper.Items.ItemSerializer; +import com.comandante.creeper.model.Player; import com.comandante.creeper.model.Room; import com.comandante.creeper.npc.Npc; import org.mapdb.DB; @@ -22,15 +23,17 @@ public class EntityManager { private final ExecutorService tickService = Executors.newFixedThreadPool(1); private final ExecutorService ticketRunnerService = Executors.newFixedThreadPool(10); private final RoomManager roomManager; + private final PlayerManager playerManager; private final DB db; - public EntityManager(RoomManager roomManager, DB db) { + public EntityManager(RoomManager roomManager, PlayerManager playerManager, DB db) { this.roomManager = roomManager; if (db.exists("itemMap")) { this.items = db.get("itemMap"); } else { this.items = db.createHashMap("itemMap").valueSerializer(new ItemSerializer()).make(); } + this.playerManager = playerManager; this.db = db; tickService.submit(new Ticker()); } @@ -66,6 +69,13 @@ public class EntityManager { return npcs.get(npcId); } + public void updateNpcHealth(String npcId, int amt) { + synchronized (npcId){ + Npc npcEntity = getNpcEntity(npcId); + npcEntity.getStats().setHealth(npcEntity.getStats().getHealth() + amt); + } + } + public Item getItemEntity(String itemId) { return items.get(itemId); } @@ -81,6 +91,11 @@ public class EntityManager { Map.Entry<Integer, Room> next = rooms.next(); ticketRunnerService.submit(next.getValue()); } + Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers(); + while (players.hasNext()) { + Map.Entry<String, Player> next = players.next(); + ticketRunnerService.submit(next.getValue()); + } } catch (InterruptedException ie) { throw new RuntimeException("Problem with ticker."); } diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java index 7e188150ee47f8c8002daac12ae878e699da1e05..84d5cf56ffee74bdbd6c3fb4e17db0c27f093166 100644 --- a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java +++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java @@ -1,7 +1,7 @@ package com.comandante.creeper.managers; -import com.comandante.creeper.model.Player; +import com.comandante.creeper.Main; import com.comandante.creeper.model.PlayerMetadata; import com.comandante.creeper.model.PlayerStats; import com.comandante.creeper.server.CreeperSession; @@ -35,7 +35,7 @@ public class NewUserRegistrationManager { } private boolean setDesiredUsername(CreeperSession session, MessageEvent e) { - PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(new Player((String) e.getMessage()).getPlayerId()); + PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(Main.createPlayerId((String) e.getMessage())); if (playerMetadata != null) { e.getChannel().write("Username is in use.\r\n"); newUserRegistrationFlow(session, e); @@ -58,7 +58,7 @@ public class NewUserRegistrationManager { return; } session.setPassword(Optional.of(password)); - PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId(), PlayerStats.DEFAULT_PLAYER.createStats()); + PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), Main.createPlayerId(session.getUsername().get()), PlayerStats.DEFAULT_PLAYER.createStats()); playerManager.savePlayerMetadata(playerMetadata); e.getChannel().write("User created.\r\n"); session.setState(CreeperSession.State.newUserRegCompleted); diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManager.java b/src/main/java/com/comandante/creeper/managers/PlayerManager.java index 6d8e92bb11a583c00ae3ada4a4ebfdef3a5e5e3d..15e3846e99904fcfb1352b4db93bdc50fdc45da8 100644 --- a/src/main/java/com/comandante/creeper/managers/PlayerManager.java +++ b/src/main/java/com/comandante/creeper/managers/PlayerManager.java @@ -118,4 +118,13 @@ public class PlayerManager { return playerStats.toString(); } + public void updatePlayerHealth(String playerId, int amount) { + synchronized (playerId) { + PlayerMetadata playerMetadata = getPlayerMetadata(playerId); + Stats stats = playerMetadata.getStats(); + stats.setHealth(stats.getHealth() + amount); + savePlayerMetadata(playerMetadata); + } + } + } diff --git a/src/main/java/com/comandante/creeper/model/FightManager.java b/src/main/java/com/comandante/creeper/model/FightManager.java index 7fe1f3cd1626d7a4db5fff2ec81dc947e61fd407..80ec2e5b6f13a5a61044060480d567da795364e3 100644 --- a/src/main/java/com/comandante/creeper/model/FightManager.java +++ b/src/main/java/com/comandante/creeper/model/FightManager.java @@ -39,11 +39,14 @@ public class FightManager { if (playerStats.getHealth() <= 0) { channelUtils.write(player.getPlayerId(), "You died."); + channelUtils.writeToRoom(player.getPlayerId(), player.getPlayerName() + " is now dead."); return; } if (npcStats.getHealth() <= 0) { channelUtils.write(player.getPlayerId(), "You killed " + npc.getName()); + channelUtils.writeToRoom(player.getPlayerId(), npc.getDieMessage()); + entityManager.deleteNpcEntity(npc.getEntityId()); return; } } @@ -64,7 +67,7 @@ public class FightManager { damageToVictim = getAttack(challenger, victim); } if (damageToVictim > 0) { - doDamage(victim, damageToVictim); + doNpcDamage(npc.getEntityId(), damageToVictim); channelUtils.writeNoPrompt(player.getPlayerId(), damageToVictim + " damage done to " + npc.getName()); } else { channelUtils.writeNoPrompt(player.getPlayerId(), "You miss " + npc.getName()); @@ -75,15 +78,19 @@ public class FightManager { int chanceToHitBack = getChanceToHit(victim, challenger); int damageBack = getAttack(victim, challenger); if (randInt(0, 100) < chanceToHitBack) { - doDamage(challenger, damageBack); + doPlayerDamage(player.getPlayerId(), damageBack); channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " damages you for " + damageBack); } else { channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " misses you"); } } - private static void doDamage(Stats stats, int damageAmount) { - stats.setHealth(stats.getHealth() - damageAmount); + private void doPlayerDamage(String playerId, int damageAmount) { + playerManager.updatePlayerHealth(playerId, -damageAmount); + } + + private void doNpcDamage(String npcId, int damageAmount) { + entityManager.updateNpcHealth(npcId, -damageAmount); } private static int getChanceToHit(Stats challenger, Stats victim) { diff --git a/src/main/java/com/comandante/creeper/model/Player.java b/src/main/java/com/comandante/creeper/model/Player.java index e0ab45c381eece6198fb1757e9873d2aa286e3d5..1a39254026bf023da6fd0be2a51cdd18ea7b65d9 100644 --- a/src/main/java/com/comandante/creeper/model/Player.java +++ b/src/main/java/com/comandante/creeper/model/Player.java @@ -1,6 +1,8 @@ package com.comandante.creeper.model; +import com.comandante.creeper.Main; +import com.comandante.creeper.managers.GameManager; import com.google.common.base.Optional; import org.apache.commons.codec.binary.Base64; import org.jboss.netty.channel.Channel; @@ -10,9 +12,11 @@ public class Player extends CreeperEntity { private String playerName; private Channel channel; private Optional<String> returnDirection = Optional.absent(); + private final GameManager gameManager; - public Player(String playerName) { + public Player(String playerName, GameManager gameManager) { this.playerName = playerName; + this.gameManager = gameManager; } public String getPlayerName() { @@ -46,5 +50,10 @@ public class Player extends CreeperEntity { @Override public void run() { + if (gameManager.getPlayerManager().getPlayerMetadata(Main.createPlayerId(playerName)).getStats().getHealth() < 100) { + gameManager.getPlayerManager().updatePlayerHealth(Main.createPlayerId(playerName), 10); + gameManager.getChannelUtils().write(Main.createPlayerId(playerName), "Health healed by 10."); + } + } } diff --git a/src/main/java/com/comandante/creeper/npc/Derper.java b/src/main/java/com/comandante/creeper/npc/Derper.java index 29c67c93a4deab8fca0a8b9588c7096a3b09feb3..fd9aea0c582e2520f7a7099e664f014a293d7e95 100644 --- a/src/main/java/com/comandante/creeper/npc/Derper.java +++ b/src/main/java/com/comandante/creeper/npc/Derper.java @@ -18,11 +18,12 @@ public class Derper extends Npc { private final Random random; private final static String colorName = new StringBuilder() .append(GREEN) - .append("Federation Sentry") + .append("derper") .append(RESET).toString(); + public Derper(GameManager gameManager, Integer roomId) { - super(gameManager, roomId, NAME, colorName, 0, NpcStats.JOE_NPC.createStats()); + super(gameManager, roomId, NAME, colorName, 0, NpcStats.JOE_NPC.createStats(), "derper's face is melted"); this.random = new Random(); } diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java index 696aa76dcaa2f75ad4f998264557624209762c32..3d2049a64848dbf5e223bf93abc95cbc3b5ca5c9 100644 --- a/src/main/java/com/comandante/creeper/npc/Npc.java +++ b/src/main/java/com/comandante/creeper/npc/Npc.java @@ -21,6 +21,7 @@ public abstract class Npc extends CreeperEntity { private final String name; private final String colorName; private final Stats stats; + private final String dieMessage; @Override public void run() { @@ -31,13 +32,14 @@ public abstract class Npc extends CreeperEntity { return colorName; } - protected Npc(GameManager gameManager, Integer roomId, String name, String colorName, long lastPhraseTimestamp, Stats stats) { + protected Npc(GameManager gameManager, Integer roomId, String name, String colorName, long lastPhraseTimestamp, Stats stats, String dieMessage) { this.gameManager = gameManager; this.roomId = roomId; this.name = name; this.colorName = colorName; this.lastPhraseTimestamp = lastPhraseTimestamp; this.stats = stats; + this.dieMessage = dieMessage; } public Stats getStats() { @@ -60,6 +62,10 @@ public abstract class Npc extends CreeperEntity { return name; } + public String getDieMessage() { + return dieMessage; + } + public void npcSay(Integer roomId, String message) { StringBuilder sb = new StringBuilder(); sb.append(RED); diff --git a/src/main/java/com/comandante/creeper/server/ChannelUtils.java b/src/main/java/com/comandante/creeper/server/ChannelUtils.java index ed4085e3c75597f1ec8747d1942cb3cc0f73ad4b..06864bbe6c77fe2e1ec3248637de97452ff6f23a 100644 --- a/src/main/java/com/comandante/creeper/server/ChannelUtils.java +++ b/src/main/java/com/comandante/creeper/server/ChannelUtils.java @@ -5,6 +5,8 @@ import com.comandante.creeper.managers.RoomManager; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.Room; +import java.util.Set; + public class ChannelUtils { private final PlayerManager playerManager; @@ -25,6 +27,19 @@ public class ChannelUtils { player.getChannel().write(playerManager.getPrompt(playerId, playerCurrentRoom.getRoomId())); } + public void writeToRoom(String playerId, String message) { + Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(playerManager.getPlayer(playerId)).get(); + Set<String> presentPlayerIds = playerCurrentRoom.getPresentPlayerIds(); + for (String id : presentPlayerIds) { + Player presentPlayer = playerManager.getPlayer(id); + if (presentPlayer.getPlayerId().equals(playerId)) { + write(playerId, message); + } else { + writeNoPrompt(presentPlayer.getPlayerId(), message); + } + } + } + public void write(String playerId, String message) { write(playerId, message, true); } diff --git a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java index 37bebb6ed38d641776e09341b547ce1a612523fc..52b609f04216052ccbc6a513fb3e21191f1106f3 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java +++ b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java @@ -1,5 +1,6 @@ package com.comandante.creeper.server; +import com.comandante.creeper.Main; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.PlayerMetadata; @@ -15,7 +16,7 @@ public class CreeperMapDBAuthenticator implements CreeperAuthenticator { @Override public boolean authenticateAndRegisterPlayer(String username, String password, Channel channel) { - PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(new Player(username).getPlayerId()); + PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(Main.createPlayerId(username)); if (playerMetadata == null) { return false; } @@ -25,7 +26,7 @@ public class CreeperMapDBAuthenticator implements CreeperAuthenticator { if (gameManager.getPlayerManager().doesPlayerExist(username)) { gameManager.getPlayerManager().removePlayer(username); } - Player player = new Player(username); + Player player = new Player(username, gameManager); player.setChannel(channel); gameManager.getPlayerManager().addPlayer(player); if (!gameManager.getRoomManager().getPlayerCurrentRoom(player).isPresent()) {