diff --git a/src/main/java/com/comandante/creeper/command/commands/KillCommand.java b/src/main/java/com/comandante/creeper/command/commands/KillCommand.java index a905b661d22e9bb7f3f003845eacc354362bc830..dce351cc6b206657e244471536ac761293e70184 100644 --- a/src/main/java/com/comandante/creeper/command/commands/KillCommand.java +++ b/src/main/java/com/comandante/creeper/command/commands/KillCommand.java @@ -1,7 +1,8 @@ package com.comandante.creeper.command.commands; +import com.comandante.creeper.fight.FightRun; import com.comandante.creeper.managers.GameManager; -import com.comandante.creeper.managers.FightManager; +import com.comandante.creeper.fight.FightManager; import com.comandante.creeper.player.Player; import com.comandante.creeper.room.Room; import com.comandante.creeper.npc.Npc; @@ -42,7 +43,8 @@ public class KillCommand extends Command { for (String npcId: npcIds) { Npc npcEntity = getGameManager().getEntityManager().getNpcEntity(npcId); if (npcEntity.getName().equals(target)) { - fightManager.fight(player, npcEntity); + FightRun fightRun = new FightRun(player, npcEntity, getGameManager()); + fightManager.fight(fightRun); return; } } diff --git a/src/main/java/com/comandante/creeper/managers/FightManager.java b/src/main/java/com/comandante/creeper/fight/FightManager.java similarity index 76% rename from src/main/java/com/comandante/creeper/managers/FightManager.java rename to src/main/java/com/comandante/creeper/fight/FightManager.java index 06269ca125494d19c41ed6fcfa3be2b39e5a6ddb..f0ae6187bcd104b39dfa47293aebd515c6fa9ce0 100644 --- a/src/main/java/com/comandante/creeper/managers/FightManager.java +++ b/src/main/java/com/comandante/creeper/fight/FightManager.java @@ -1,15 +1,17 @@ -package com.comandante.creeper.managers; +package com.comandante.creeper.fight; import com.comandante.creeper.entity.EntityManager; -import com.comandante.creeper.stat.Stats; -import com.comandante.creeper.player.PlayerManager; -import com.comandante.creeper.room.RoomManager; import com.comandante.creeper.npc.Npc; import com.comandante.creeper.player.Player; -import com.comandante.creeper.player.PlayerMetadata; +import com.comandante.creeper.player.PlayerManager; +import com.comandante.creeper.room.RoomManager; import com.comandante.creeper.server.ChannelUtils; +import com.comandante.creeper.stat.Stats; import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class FightManager { @@ -19,39 +21,19 @@ public class FightManager { private final ChannelUtils channelUtils; private static final Random random = new Random(); + private final ExecutorService fightService; + public FightManager(ChannelUtils channelUtils, EntityManager entityManager, RoomManager roomManager, PlayerManager playerManager) { this.channelUtils = channelUtils; this.entityManager = entityManager; this.roomManager = roomManager; this.playerManager = playerManager; + this.fightService = Executors.newFixedThreadPool(10); } - public void fight(Player player, Npc npc) { - PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(player.getPlayerId()); - Stats npcStats = npc.getStats(); - Stats playerStats = playerMetadata.getStats(); - - while (npcStats.getCurrentHealth() > 0) { - if (playerStats.getCurrentHealth() <= 0) { - break; - } - fightTurn(playerStats, npcStats, 3, player, npc); - } - - playerManager.savePlayerMetadata(playerMetadata); - - if (playerStats.getCurrentHealth() <= 0) { - channelUtils.write(player.getPlayerId(), "You died."); - channelUtils.writeToRoom(player.getPlayerId(), player.getPlayerName() + " is now dead."); - return; - } - if (npcStats.getCurrentHealth() <= 0) { - channelUtils.writeNoPrompt(player.getPlayerId(), "You killed " + npc.getName()); - channelUtils.writeToRoom(player.getPlayerId(), npc.getDieMessage()); - entityManager.deleteNpcEntity(npc.getEntityId()); - return; - } + public Future<FightResults> fight(FightRun fightRun) { + return fightService.submit(fightRun); } public void fightTurn(Stats challenger, Stats victim, int numRoundsPerTurns, Player player, Npc npc) { diff --git a/src/main/java/com/comandante/creeper/fight/FightResults.java b/src/main/java/com/comandante/creeper/fight/FightResults.java new file mode 100644 index 0000000000000000000000000000000000000000..919476b8ff3228fe0d8841dbd6579805c9728219 --- /dev/null +++ b/src/main/java/com/comandante/creeper/fight/FightResults.java @@ -0,0 +1,12 @@ +package com.comandante.creeper.fight; + +public class FightResults { + + private final boolean npcWon; + private final boolean playerWon; + + public FightResults(boolean npcWon, boolean playerWon) { + this.npcWon = npcWon; + this.playerWon = playerWon; + } +} diff --git a/src/main/java/com/comandante/creeper/fight/FightResultsBuilder.java b/src/main/java/com/comandante/creeper/fight/FightResultsBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..52bd27b725f66347a38fd074040fd75a8c579447 --- /dev/null +++ b/src/main/java/com/comandante/creeper/fight/FightResultsBuilder.java @@ -0,0 +1,20 @@ +package com.comandante.creeper.fight; + +public class FightResultsBuilder { + private boolean npcWon; + private boolean playerWon; + + public FightResultsBuilder setNpcWon(boolean npcWon) { + this.npcWon = npcWon; + return this; + } + + public FightResultsBuilder setPlayerWon(boolean playerWon) { + this.playerWon = playerWon; + return this; + } + + public FightResults createFightResults() { + return new FightResults(npcWon, playerWon); + } +} \ No newline at end of file diff --git a/src/main/java/com/comandante/creeper/fight/FightRun.java b/src/main/java/com/comandante/creeper/fight/FightRun.java new file mode 100644 index 0000000000000000000000000000000000000000..80ab89987b10de8d71419d3e9d19ce40bb555961 --- /dev/null +++ b/src/main/java/com/comandante/creeper/fight/FightRun.java @@ -0,0 +1,53 @@ +package com.comandante.creeper.fight; + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.npc.Npc; +import com.comandante.creeper.player.Player; +import com.comandante.creeper.player.PlayerMetadata; +import com.comandante.creeper.stat.Stats; + +import java.util.concurrent.Callable; + + +public class FightRun implements Callable<FightResults> { + + private final Player player; + private final Npc npc; + private final GameManager gameManager; + + public FightRun(Player player, Npc npc, GameManager gameManager) { + this.player = player; + this.npc = npc; + this.gameManager = gameManager; + } + + @Override + public FightResults call() throws Exception { + Stats npcStats = npc.getStats(); + PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(player.getPlayerId()); + Stats playerStats = gameManager.getPlayerManager().getPlayerMetadata(player.getPlayerId()).getStats(); + + while (npcStats.getCurrentHealth() > 0) { + if (playerStats.getCurrentHealth() <= 0) { + break; + } + gameManager.getFightManager().fightTurn(playerStats, npcStats, 3, player, npc); + } + + gameManager.getPlayerManager().savePlayerMetadata(playerMetadata); + + if (playerStats.getCurrentHealth() <= 0) { + gameManager.getChannelUtils().write(player.getPlayerId(), "You died."); + gameManager.getChannelUtils().writeToRoom(player.getPlayerId(), player.getPlayerName() + " is now dead."); + return new FightResultsBuilder().setNpcWon(true).setPlayerWon(false).createFightResults(); + } + + if (npcStats.getCurrentHealth() <= 0) { + gameManager.getChannelUtils().writeNoPrompt(player.getPlayerId(), "You killed " + npc.getName()); + gameManager.getChannelUtils().writeToRoom(player.getPlayerId(), npc.getDieMessage()); + gameManager.getEntityManager().deleteNpcEntity(npc.getEntityId()); + return new FightResultsBuilder().setNpcWon(false).setPlayerWon(true).createFightResults(); + } + return new FightResultsBuilder().setNpcWon(false).setPlayerWon(false).createFightResults(); + } +} diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 741cf3bac6447d043d2a28a41d155530a65f3624..4baacd54f5ee7a2a08d0fa6e6c728c4f56041dea 100644 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -4,6 +4,7 @@ package com.comandante.creeper.managers; import com.comandante.creeper.Items.Item; import com.comandante.creeper.Items.ItemDecayManager; import com.comandante.creeper.entity.EntityManager; +import com.comandante.creeper.fight.FightManager; import com.comandante.creeper.player.PlayerMovement; import com.comandante.creeper.player.Player; import com.comandante.creeper.player.PlayerManager;