From 9425b934e8e0e58fe89d3d1532692e691452228a Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris.kearney@urbanairship.com>
Date: Thu, 28 Aug 2014 22:20:56 -0700
Subject: [PATCH] Npcspawners

---
 .../comandante/creeper/Items/ItemSpawner.java | 18 ++---
 .../{ItemSpawnRule.java => SpawnRule.java}    |  6 +-
 .../creeper/builder/RoomBuilders.java         | 10 ++-
 .../creeper/model/FightManager.java           |  4 +-
 .../comandante/creeper/model/NpcSpawner.java  | 80 +++++++++++++++++++
 .../com/comandante/creeper/model/Player.java  |  2 +-
 .../com/comandante/creeper/model/Room.java    | 13 ++-
 .../com/comandante/creeper/npc/Derper.java    |  6 ++
 .../java/com/comandante/creeper/npc/Npc.java  |  2 +
 9 files changed, 121 insertions(+), 20 deletions(-)
 rename src/main/java/com/comandante/creeper/Items/{ItemSpawnRule.java => SpawnRule.java} (79%)
 create mode 100644 src/main/java/com/comandante/creeper/model/NpcSpawner.java

diff --git a/src/main/java/com/comandante/creeper/Items/ItemSpawner.java b/src/main/java/com/comandante/creeper/Items/ItemSpawner.java
index cef81e75..0ec42286 100644
--- a/src/main/java/com/comandante/creeper/Items/ItemSpawner.java
+++ b/src/main/java/com/comandante/creeper/Items/ItemSpawner.java
@@ -9,17 +9,17 @@ import java.util.Set;
 public class ItemSpawner extends CreeperEntity {
 
     private final ItemType spawnItemType;
-    private final ItemSpawnRule itemSpawnRule;
+    private final SpawnRule spawnRule;
     private final GameManager gameManager;
     private Integer roomId;
     private int noTicks = 0;
     private final Random random = new Random();
 
-    public ItemSpawner(ItemType spawnItemType, ItemSpawnRule itemSpawnRule, GameManager gameManager) {
+    public ItemSpawner(ItemType spawnItemType, SpawnRule spawnRule, GameManager gameManager) {
         this.spawnItemType = spawnItemType;
-        this.itemSpawnRule = itemSpawnRule;
+        this.spawnRule = spawnRule;
         this.gameManager = gameManager;
-        this.noTicks = itemSpawnRule.getSpawnIntervalTicks();
+        this.noTicks = spawnRule.getSpawnIntervalTicks();
     }
 
     public void incTicks() {
@@ -33,8 +33,8 @@ public class ItemSpawner extends CreeperEntity {
     @Override
     public void run() {
         incTicks();
-        if (noTicks >= itemSpawnRule.getSpawnIntervalTicks()) {
-            if (itemSpawnRule.getRandomChance().isPresent()) {
+        if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
+            if (spawnRule.getRandomChance().isPresent()) {
                 processRandom();
             } else {
                 processNormal();
@@ -44,8 +44,8 @@ public class ItemSpawner extends CreeperEntity {
     }
 
     private void processRandom() {
-        int randomPercentage = itemSpawnRule.getRandomChance().get();
-        int numberOfAttempts = itemSpawnRule.getMaxPerRoom() - countNumberInRoom();
+        int randomPercentage = spawnRule.getRandomChance().get();
+        int numberOfAttempts = spawnRule.getMaxPerRoom() - countNumberInRoom();
         for (int i = 0; i < numberOfAttempts; i++) {
             if (random.nextInt(100) < randomPercentage) {
                 createAndAddItem();
@@ -54,7 +54,7 @@ public class ItemSpawner extends CreeperEntity {
     }
 
     private void processNormal() {
-        int numberToCreate = itemSpawnRule.getMaxPerRoom() - countNumberInRoom();
+        int numberToCreate = spawnRule.getMaxPerRoom() - countNumberInRoom();
         for (int i = 0; i < numberToCreate; i++) {
             createAndAddItem();
         }
diff --git a/src/main/java/com/comandante/creeper/Items/ItemSpawnRule.java b/src/main/java/com/comandante/creeper/Items/SpawnRule.java
similarity index 79%
rename from src/main/java/com/comandante/creeper/Items/ItemSpawnRule.java
rename to src/main/java/com/comandante/creeper/Items/SpawnRule.java
index c5db5d06..5ce18a49 100644
--- a/src/main/java/com/comandante/creeper/Items/ItemSpawnRule.java
+++ b/src/main/java/com/comandante/creeper/Items/SpawnRule.java
@@ -2,18 +2,18 @@ package com.comandante.creeper.Items;
 
 import com.google.common.base.Optional;
 
-public class ItemSpawnRule {
+public class SpawnRule {
 
     private Optional<Integer> randomChance = Optional.absent();
     private final int spawnIntervalTicks;
     private final int maxPerRoom;
 
-    public ItemSpawnRule(int spawnIntervalTicks, int maxPerRoom) {
+    public SpawnRule(int spawnIntervalTicks, int maxPerRoom) {
         this.spawnIntervalTicks = spawnIntervalTicks;
         this.maxPerRoom = maxPerRoom;
     }
 
-    public ItemSpawnRule(int spawnIntervalTicks, int maxPerRoom, int randomPercent) {
+    public SpawnRule(int spawnIntervalTicks, int maxPerRoom, int randomPercent) {
         this.spawnIntervalTicks = spawnIntervalTicks;
         this.maxPerRoom = maxPerRoom;
         this.randomChance = Optional.of(randomPercent);
diff --git a/src/main/java/com/comandante/creeper/builder/RoomBuilders.java b/src/main/java/com/comandante/creeper/builder/RoomBuilders.java
index 9820d7b1..0995b73a 100644
--- a/src/main/java/com/comandante/creeper/builder/RoomBuilders.java
+++ b/src/main/java/com/comandante/creeper/builder/RoomBuilders.java
@@ -1,11 +1,13 @@
 package com.comandante.creeper.builder;
 
-import com.comandante.creeper.Items.ItemSpawnRule;
+import com.comandante.creeper.Items.SpawnRule;
 import com.comandante.creeper.Items.ItemSpawner;
 import com.comandante.creeper.Items.ItemType;
 import com.comandante.creeper.managers.EntityManager;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.model.BasicRoom;
+import com.comandante.creeper.model.NpcSpawner;
+import com.comandante.creeper.npc.Derper;
 import com.google.common.base.Optional;
 
 /**
@@ -27,10 +29,10 @@ public class RoomBuilders {
                 Optional.<Integer>absent(),
                 "You are standing before the Federation Training Encampment. A huge wall surrounds the base. To the north you see a two doors leading inside. Above the doors you sits the symbol of the Federation, a single red star with five points and a raised fist in the center. Sentries along the encampment walls begin to eye you suspiciously. You then remember that malingering in front of a Federation base could prove to be a fatal mistake.\r\n");
 
-        basicRoom.addItemSpawner(new ItemSpawner(ItemType.BEER, new ItemSpawnRule(20, 3), gameManager));
-        basicRoom.addItemSpawner(new ItemSpawner(ItemType.KEY, new ItemSpawnRule(30, 1, 10), gameManager));
+        basicRoom.addItemSpawner(new ItemSpawner(ItemType.BEER, new SpawnRule(20, 3), gameManager));
+        basicRoom.addItemSpawner(new ItemSpawner(ItemType.KEY, new SpawnRule(30, 1, 10), gameManager));
+        basicRoom.addNpcSpawner(new NpcSpawner(new Derper(gameManager, basicRoom.getRoomId()), gameManager, new SpawnRule(10, 5)));
         entityManager.addEntity(basicRoom);
-
         entityManager.addEntity(new BasicRoom(
                 2,
                 "Quarter Deck",
diff --git a/src/main/java/com/comandante/creeper/model/FightManager.java b/src/main/java/com/comandante/creeper/model/FightManager.java
index d3bed202..5d2941f3 100644
--- a/src/main/java/com/comandante/creeper/model/FightManager.java
+++ b/src/main/java/com/comandante/creeper/model/FightManager.java
@@ -73,7 +73,7 @@ public class FightManager {
             channelUtils.writeNoPrompt(player.getPlayerId(), "You miss " + npc.getName());
         }
         try {
-            Thread.sleep(1100);
+            Thread.sleep(600);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
@@ -89,7 +89,7 @@ public class FightManager {
             channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " misses you");
         }
         try {
-            Thread.sleep(1100);
+            Thread.sleep(600);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
diff --git a/src/main/java/com/comandante/creeper/model/NpcSpawner.java b/src/main/java/com/comandante/creeper/model/NpcSpawner.java
new file mode 100644
index 00000000..1d9694e5
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/model/NpcSpawner.java
@@ -0,0 +1,80 @@
+package com.comandante.creeper.model;
+
+
+import com.comandante.creeper.Items.SpawnRule;
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.npc.Npc;
+
+import java.util.Random;
+import java.util.Set;
+
+public class NpcSpawner extends CreeperEntity {
+
+    private final Npc npc;
+    private final GameManager gameManager;
+    private final SpawnRule spawnRule;
+    private int noTicks = 0;
+    private final Random random = new Random();
+    private Integer roomId;
+
+    public NpcSpawner(Npc npc, GameManager gameManager, SpawnRule spawnRule) {
+        this.npc = npc;
+        this.gameManager = gameManager;
+        this.spawnRule = spawnRule;
+    }
+
+    public void incTicks() {
+        noTicks++;
+    }
+
+    public void setRoomId(Integer roomId) {
+        this.roomId = roomId;
+    }
+
+    @Override
+    public void run() {
+        incTicks();
+        if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
+            if (spawnRule.getRandomChance().isPresent()) {
+                processRandom();
+            } else {
+                processNormal();
+            }
+            noTicks = 0;
+        }
+    }
+
+    private void processRandom() {
+        int randomPercentage = spawnRule.getRandomChance().get();
+        int numberOfAttempts = spawnRule.getMaxPerRoom() - countNumberInRoom();
+        for (int i = 0; i < numberOfAttempts; i++) {
+            if (random.nextInt(100) < randomPercentage) {
+                createAndAddItem();
+            }
+        }
+    }
+
+    private void processNormal() {
+        int numberToCreate = spawnRule.getMaxPerRoom() - countNumberInRoom();
+        for (int i = 0; i < numberToCreate; i++) {
+            createAndAddItem();
+        }
+    }
+
+    private int countNumberInRoom() {
+        int numberCurrentlyInRoom = 0;
+        Set<String> npcIds = gameManager.getRoomManager().getRoom(roomId).getNpcIds();
+        for (String i : npcIds) {
+            Npc currentNpc = gameManager.getEntityManager().getNpcEntity(i);
+            if (currentNpc.getName().equals(npc.getName())) {
+                numberCurrentlyInRoom++;
+            }
+        }
+        return numberCurrentlyInRoom;
+    }
+
+    private void createAndAddItem() {
+        Npc newNpc = npc.create(gameManager, roomId);
+        gameManager.getEntityManager().addEntity(newNpc);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/model/Player.java b/src/main/java/com/comandante/creeper/model/Player.java
index 1a392540..9cf22a9c 100644
--- a/src/main/java/com/comandante/creeper/model/Player.java
+++ b/src/main/java/com/comandante/creeper/model/Player.java
@@ -52,7 +52,7 @@ public class Player extends CreeperEntity {
 
         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.");
+            gameManager.getChannelUtils().writeNoPrompt(Main.createPlayerId(playerName), "Health healed by 10.");
         }
 
     }
diff --git a/src/main/java/com/comandante/creeper/model/Room.java b/src/main/java/com/comandante/creeper/model/Room.java
index 81ee78a3..bbf17355 100644
--- a/src/main/java/com/comandante/creeper/model/Room.java
+++ b/src/main/java/com/comandante/creeper/model/Room.java
@@ -25,6 +25,8 @@ public abstract class Room extends CreeperEntity {
     private final Set<String> npcIds = Sets.newConcurrentHashSet();
     private final Set<String> itemIds = Sets.newConcurrentHashSet();
     private List<ItemSpawner> itemSpawners = Lists.newArrayList();
+    private List<NpcSpawner> npcSpawners = Lists.newArrayList();
+
 
     public Room(Integer roomId,
                 String roomTitle,
@@ -136,6 +138,11 @@ public abstract class Room extends CreeperEntity {
         itemSpawners.add(itemSpawner);
     }
 
+    public void addNpcSpawner(NpcSpawner npcSpawner) {
+        npcSpawner.setRoomId(roomId);
+        npcSpawners.add(npcSpawner);
+    }
+
     @Override
     public void run() {
         Iterator<ItemSpawner> iterator = itemSpawners.iterator();
@@ -143,6 +150,10 @@ public abstract class Room extends CreeperEntity {
             ItemSpawner next = iterator.next();
             next.run();
         }
-
+        Iterator<NpcSpawner> npcSpawnerIterator = npcSpawners.iterator();
+        while (npcSpawnerIterator.hasNext()) {
+            NpcSpawner next = npcSpawnerIterator.next();
+            next.run();
+        }
     }
 }
diff --git a/src/main/java/com/comandante/creeper/npc/Derper.java b/src/main/java/com/comandante/creeper/npc/Derper.java
index fd9aea0c..0978dbea 100644
--- a/src/main/java/com/comandante/creeper/npc/Derper.java
+++ b/src/main/java/com/comandante/creeper/npc/Derper.java
@@ -27,6 +27,12 @@ public class Derper extends Npc {
         this.random = new Random();
     }
 
+
+    @Override
+    public Derper create(GameManager gameManager, Integer roomId) {
+        return new Derper(gameManager, roomId);
+    }
+
     @Override
     public void run() {
         super.run();
diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java
index 3d2049a6..150450db 100644
--- a/src/main/java/com/comandante/creeper/npc/Npc.java
+++ b/src/main/java/com/comandante/creeper/npc/Npc.java
@@ -23,6 +23,8 @@ public abstract class Npc extends CreeperEntity {
     private final Stats stats;
     private final String dieMessage;
 
+    public abstract Derper create(GameManager gameManager, Integer roomId);
+
     @Override
     public void run() {
         //System.out.println(getName() + " tick...");
-- 
GitLab