diff --git a/src/main/java/com/comandante/creeper/Items/ItemSpawner.java b/src/main/java/com/comandante/creeper/Items/ItemSpawner.java index e4e2309d803ea52da2ee8dd746bfee78572360de..76e081066d2ef6fd3b55547df5d6835c1eee11c6 100644 --- a/src/main/java/com/comandante/creeper/Items/ItemSpawner.java +++ b/src/main/java/com/comandante/creeper/Items/ItemSpawner.java @@ -21,7 +21,7 @@ public class ItemSpawner extends CreeperEntity { this.gameManager = gameManager; } - public void incTicks(){ + public void incTicks() { noTicks++; } @@ -32,33 +32,49 @@ public class ItemSpawner extends CreeperEntity { @Override public void run() { incTicks(); - int numberCurrentlyInRoom = 0; if (noTicks >= itemSpawnRule.getSpawnIntervalTicks()) { - Set<String> itemIds = gameManager.getRoomManager().getRoom(roomId).getItemIds(); - for (String i: itemIds) { - Item currentItem = gameManager.getEntityManager().getItemEntity(i); - ItemType currentItemType = ItemType.itemTypeFromCode(currentItem.getItemTypeId()); - if (currentItemType.equals(spawnItemType)) { - numberCurrentlyInRoom++; - } + if (itemSpawnRule.getRandomChance().isPresent()) { + processRandom(); + } else { + processNormal(); } - while (numberCurrentlyInRoom < itemSpawnRule.getMaxPerRoom()) { - if (itemSpawnRule.getRandomChance().isPresent()) { - if (random.nextInt(100) < itemSpawnRule.getRandomChance().get()) { - Item item = spawnItemType.create(); - gameManager.getEntityManager().addItem(item); - gameManager.placeItemInRoom(roomId, item.getItemId()); - numberCurrentlyInRoom++; - continue; - } - Item item = spawnItemType.create(); - gameManager.getEntityManager().addItem(item); - gameManager.placeItemInRoom(roomId, item.getItemId()); - numberCurrentlyInRoom++; - } + } + } + + private void processRandom() { + int randomPercentage = itemSpawnRule.getRandomChance().get(); + int numberOfAttempts = itemSpawnRule.getMaxPerRoom() - countNumberInRoom(); + for (int i = 0; i < numberOfAttempts; i++) { + if (random.nextInt(100) < randomPercentage) { + createAndAddItem(); } } } + private void processNormal() { + int numberToCreate = itemSpawnRule.getMaxPerRoom() - countNumberInRoom(); + for (int i = 0; i < numberToCreate; i++) { + createAndAddItem(); + } + } + + private int countNumberInRoom() { + int numberCurrentlyInRoom = 0; + Set<String> itemIds = gameManager.getRoomManager().getRoom(roomId).getItemIds(); + for (String i : itemIds) { + Item currentItem = gameManager.getEntityManager().getItemEntity(i); + ItemType currentItemType = ItemType.itemTypeFromCode(currentItem.getItemTypeId()); + if (currentItemType.equals(spawnItemType)) { + numberCurrentlyInRoom++; + } + } + return numberCurrentlyInRoom; + } + + private void createAndAddItem() { + Item item = spawnItemType.create(); + gameManager.getEntityManager().addItem(item); + gameManager.placeItemInRoom(roomId, item.getItemId()); + } } diff --git a/src/main/java/com/comandante/creeper/builder/RoomBuilders.java b/src/main/java/com/comandante/creeper/builder/RoomBuilders.java index ee1e70041b70ef7957a1e0971f0804d9a0d37e33..5be7fc8486c57629102cc8c85d49c1c1ed9b28b2 100644 --- a/src/main/java/com/comandante/creeper/builder/RoomBuilders.java +++ b/src/main/java/com/comandante/creeper/builder/RoomBuilders.java @@ -27,7 +27,7 @@ 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(10, 3), gameManager)); + basicRoom.addItemSpawner(new ItemSpawner(ItemType.BEER, new ItemSpawnRule(2, 3), gameManager)); basicRoom.addItemSpawner(new ItemSpawner(ItemType.KEY, new ItemSpawnRule(5, 1, 10), gameManager)); entityManager.addEntity(basicRoom);