From b54f7ee2fb52ad038a119bbbd7a0fd62acb710a2 Mon Sep 17 00:00:00 2001 From: Chris Kearney <chris.kearney@urbanairship.com> Date: Fri, 29 Aug 2014 21:19:06 -0700 Subject: [PATCH] made a fight service because threads --- .../creeper/command/commands/KillCommand.java | 6 ++- .../{managers => fight}/FightManager.java | 42 +++++---------- .../creeper/fight/FightResults.java | 12 +++++ .../creeper/fight/FightResultsBuilder.java | 20 +++++++ .../comandante/creeper/fight/FightRun.java | 53 +++++++++++++++++++ .../creeper/managers/GameManager.java | 1 + 6 files changed, 102 insertions(+), 32 deletions(-) rename src/main/java/com/comandante/creeper/{managers => fight}/FightManager.java (76%) create mode 100644 src/main/java/com/comandante/creeper/fight/FightResults.java create mode 100644 src/main/java/com/comandante/creeper/fight/FightResultsBuilder.java create mode 100644 src/main/java/com/comandante/creeper/fight/FightRun.java 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 a905b661..dce351cc 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 06269ca1..f0ae6187 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 00000000..919476b8 --- /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 00000000..52bd27b7 --- /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 00000000..80ab8998 --- /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 741cf3ba..4baacd54 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; -- GitLab