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