Facade the SDK's GameManager out
authorJBM <jbm@codingame.com>
Thu, 11 Jun 2020 09:45:32 +0000 (11:45 +0200)
committerJBM <jbm@codingame.com>
Thu, 11 Jun 2020 09:45:32 +0000 (11:45 +0200)
src/main/java/com/codingame/game/GameManager.java [new file with mode: 0644]
src/main/java/com/codingame/game/Model.java
src/main/java/com/codingame/game/Referee.java
src/main/java/com/codingame/game/View.java

diff --git a/src/main/java/com/codingame/game/GameManager.java b/src/main/java/com/codingame/game/GameManager.java
new file mode 100644 (file)
index 0000000..3c1f429
--- /dev/null
@@ -0,0 +1,23 @@
+package com.codingame.game;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.codingame.gameengine.core.MultiplayerGameManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GameManager {
+    @Inject private MultiplayerGameManager<Player> gameManager;
+
+    Player getPlayer(int index) { return gameManager.getPlayer(index); }
+    List<Player> getPlayers() { return gameManager.getPlayers(); }
+    List<Player> getActivePlayers() {
+        return gameManager.getPlayers().stream()
+            .filter(p -> p.isActive() && !p.model.hit)
+            .collect(Collectors.toList());
+    }
+
+    void endGame() { gameManager.endGame(); }
+}
index 6eb0546..108b5a6 100644 (file)
@@ -9,6 +9,7 @@ import com.google.inject.Inject;
 
 class Model {
     @Inject private MultiplayerGameManager<com.codingame.game.Player> gameManager;
 
 class Model {
     @Inject private MultiplayerGameManager<com.codingame.game.Player> gameManager;
+    long seed;
     Random random;
     int roadLength;
     int initialStones;
     Random random;
     int roadLength;
     int initialStones;
@@ -18,8 +19,12 @@ class Model {
     class Player {
         com.codingame.game.Player gp;
         int index;
     class Player {
         com.codingame.game.Player gp;
         int index;
+        boolean hit;
 
 
-        Player(int i) { index = i; }
+        Player(int i) {
+            index = i;
+            hit = false;
+        }
 
         private int castlePosition;
         public int getCastlePosition() { return castlePosition; }
 
         private int castlePosition;
         public int getCastlePosition() { return castlePosition; }
@@ -76,7 +81,8 @@ class Model {
         }
     }
 
         }
     }
 
-    void init(long seed) {
+    void init() {
+        seed = gameManager.getSeed();
         random = new Random(seed);
         switch (random.nextInt(4)) {
         case 0:
         random = new Random(seed);
         switch (random.nextInt(4)) {
         case 0:
index 67d96e0..3de5140 100644 (file)
@@ -7,14 +7,12 @@ import java.util.Random;
 
 import com.codingame.gameengine.core.AbstractPlayer.TimeoutException;
 import com.codingame.gameengine.core.AbstractReferee;
 
 import com.codingame.gameengine.core.AbstractPlayer.TimeoutException;
 import com.codingame.gameengine.core.AbstractReferee;
-import com.codingame.gameengine.core.GameManager;
-import com.codingame.gameengine.core.MultiplayerGameManager;
 import com.codingame.game.GodModeManager;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
 public class Referee extends AbstractReferee {
 import com.codingame.game.GodModeManager;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
 public class Referee extends AbstractReferee {
-    @Inject private MultiplayerGameManager<Player> gameManager;
+    @Inject private GameManager gameManager;
     @Inject private GodModeManager gm;
 
     @Inject private View view;
     @Inject private GodModeManager gm;
 
     @Inject private View view;
@@ -25,24 +23,23 @@ public class Referee extends AbstractReferee {
     @Override
     public void init() {
         gm.init();
     @Override
     public void init() {
         gm.init();
-        model.init(gameManager.getSeed());
+        model.init();
         gameManager.getPlayer(0).model = model.p0;
         gameManager.getPlayer(1).model = model.p1;
 
         for (Player p: gameManager.getPlayers()) {
             p.gameInit(model.roadLength, model.initialStones,
         gameManager.getPlayer(0).model = model.p0;
         gameManager.getPlayer(1).model = model.p1;
 
         for (Player p: gameManager.getPlayers()) {
             p.gameInit(model.roadLength, model.initialStones,
-                       gameManager.getSeed(), gm.getSalt());
+                       model.seed, gm.getSalt());
         }
 
         view.init(model);
         gameManager.getPlayer(0).view = view.p0;
         gameManager.getPlayer(1).view = view.p1;
         }
 
         view.init(model);
         gameManager.getPlayer(0).view = view.p0;
         gameManager.getPlayer(1).view = view.p1;
-        gameManager.setFrameDuration(2000);
     }
 
     private void disqualify(Player player, String popup, String message) {
         player.deactivate(player.getNicknameToken() + " " + popup);
     }
 
     private void disqualify(Player player, String popup, String message) {
         player.deactivate(player.getNicknameToken() + " " + popup);
-        gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " " + message));
+        player.view.disqualify(message);
         player.setScore(-1);
     }
 
         player.setScore(-1);
     }
 
@@ -108,7 +105,7 @@ public class Referee extends AbstractReferee {
             player.view.displayMessage(player.messageString);
         }
 
             player.view.displayMessage(player.messageString);
         }
 
-        /* Update game model and view.
+        /* Update game model and view, stones' part.
          *
          * As a special case, the "cheater" (sending out negative
          * stones) handling is deferred here because we need to update
          *
          * As a special case, the "cheater" (sending out negative
          * stones) handling is deferred here because we need to update
@@ -135,7 +132,9 @@ public class Referee extends AbstractReferee {
             }
         }
 
             }
         }
 
-        /* If a player cheated, delta is unusable as is.
+        /* Update game model and view, troll part.
+         *
+         * If a player cheated, delta is unusable as is.
          * (Consider the case the player on the right sent
          * INT_MIN.  INT_MIN * (-1) = INT_MIN, so that player
          * would both glean the stones *and* push the troll away.
          * (Consider the case the player on the right sent
          * INT_MIN.  INT_MIN * (-1) = INT_MIN, so that player
          * would both glean the stones *and* push the troll away.
index 40aae3d..cdc4428 100644 (file)
@@ -153,6 +153,10 @@ class View {
             graphicEntityModule.commitEntityState(0.0, stoneReminder);
         }
 
             graphicEntityModule.commitEntityState(0.0, stoneReminder);
         }
 
+        void disqualify(String message) {
+            gameManager.addToGameSummary(GameManager.formatErrorMessage(nicknameToken + " " + message));
+        }
+
         void victory() {
             gameManager.addToGameSummary(GameManager.formatSuccessMessage(nicknameToken + " wins."));
             View.this.endgameFrame();
         void victory() {
             gameManager.addToGameSummary(GameManager.formatSuccessMessage(nicknameToken + " wins."));
             View.this.endgameFrame();
@@ -274,6 +278,8 @@ class View {
 
     void init(Model m) {
         model = m;
 
     void init(Model m) {
         model = m;
+
+        gameManager.setFrameDuration(2000);
         drawBackground();
 
         /*
         drawBackground();
 
         /*