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