summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/controllers/GameController.java55
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/Game.java5
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/lobby/Player.java15
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/game/GameTest.java4
4 files changed, 63 insertions, 16 deletions
diff --git a/backend/src/main/java/org/luxons/sevenwonders/controllers/GameController.java b/backend/src/main/java/org/luxons/sevenwonders/controllers/GameController.java
index 4c8891cb..c5723658 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/controllers/GameController.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/controllers/GameController.java
@@ -1,12 +1,14 @@
package org.luxons.sevenwonders.controllers;
import java.security.Principal;
+import java.util.List;
import org.jsondoc.core.annotation.Api;
import org.jsondoc.core.annotation.ApiMethod;
import org.luxons.sevenwonders.actions.PrepareMoveAction;
import org.luxons.sevenwonders.game.Game;
import org.luxons.sevenwonders.game.api.PlayerTurnInfo;
+import org.luxons.sevenwonders.game.api.Table;
import org.luxons.sevenwonders.game.cards.CardBack;
import org.luxons.sevenwonders.lobby.Lobby;
import org.luxons.sevenwonders.lobby.Player;
@@ -35,7 +37,39 @@ public class GameController {
this.playerRepository = playerRepository;
}
- @ApiMethod(description = "Prepares the user's next move. When all players have prepared their moves, all moves "
+ @ApiMethod(description = "Notifies the game that the player is ready to receive his hand.")
+ @MessageMapping("/game/sayReady")
+ public void ready(Principal principal) {
+ Player player = playerRepository.find(principal.getName());
+ player.setReady(true);
+ Game game = player.getGame();
+ logger.info("Game '{}': player '{}' is ready for the next turn", game.getId(), player);
+
+ Lobby lobby = player.getLobby();
+ List<Player> players = lobby.getPlayers();
+
+ boolean allReady = players.stream().allMatch(Player::isReady);
+ if (allReady) {
+ logger.info("Game '{}': all players ready, sending turn info", game.getId());
+ players.forEach(p -> p.setReady(false));
+ sendTurnInfo(players, game);
+ } else {
+ sendPlayerReady(game.getId(), player);
+ }
+ }
+
+ private void sendTurnInfo(List<Player> players, Game game) {
+ for (PlayerTurnInfo turnInfo : game.getCurrentTurnInfo()) {
+ Player player = players.get(turnInfo.getPlayerIndex());
+ template.convertAndSendToUser(player.getUsername(), "/queue/game/turn", turnInfo);
+ }
+ }
+
+ private void sendPlayerReady(long gameId, Player player) {
+ template.convertAndSend("/topic/game/" + gameId + "/playerReady", player.getUsername());
+ }
+
+ @ApiMethod(description = "Prepares the player's next move. When all players have prepared their moves, all moves "
+ "are executed.")
@MessageMapping("/game/prepareMove")
public void prepareMove(PrepareMoveAction action, Principal principal) {
@@ -45,23 +79,20 @@ public class GameController {
PreparedCard preparedCard = new PreparedCard(player, preparedCardBack);
logger.info("Game '{}': player {} prepared move {}", game.getId(), principal.getName(), action.getMove());
- if (game.areAllPlayersReady()) {
+ if (game.allPlayersPreparedTheirMove()) {
logger.info("Game '{}': all players have prepared their move, executing turn...", game.getId());
- game.playTurn();
- sendTurnInfo(player.getLobby(), game);
+ Table table = game.playTurn();
+ sendPlayedMoves(game.getId(), table);
} else {
- sendPreparedCard(preparedCard, game);
+ sendPreparedCard(game.getId(), preparedCard);
}
}
- private void sendPreparedCard(PreparedCard preparedCard, Game game) {
- template.convertAndSend("/topic/game/" + game.getId() + "/prepared", preparedCard);
+ private void sendPlayedMoves(long gameId, Table table) {
+ template.convertAndSend("/topic/game/" + gameId + "/tableUpdates", table);
}
- private void sendTurnInfo(Lobby lobby, Game game) {
- for (PlayerTurnInfo turnInfo : game.getCurrentTurnInfo()) {
- Player player = lobby.getPlayers().get(turnInfo.getPlayerIndex());
- template.convertAndSendToUser(player.getUsername(), "/queue/game/turn", turnInfo);
- }
+ private void sendPreparedCard(long gameId, PreparedCard preparedCard) {
+ template.convertAndSend("/topic/game/" + gameId + "/prepared", preparedCard);
}
}
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/Game.java b/backend/src/main/java/org/luxons/sevenwonders/game/Game.java
index 45f12be0..ed11913b 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/game/Game.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/Game.java
@@ -120,12 +120,12 @@ public class Game {
move.validate(table, hand);
}
- public boolean areAllPlayersReady() {
+ public boolean allPlayersPreparedTheirMove() {
long nbExpectedMoves = currentTurnInfo.values().stream().filter(pti -> pti.getAction() != Action.WAIT).count();
return preparedMoves.size() == nbExpectedMoves;
}
- public void playTurn() {
+ public Table playTurn() {
makeMoves();
if (endOfAgeReached()) {
executeEndOfAgeEvents();
@@ -136,6 +136,7 @@ public class Game {
rotateHandsIfRelevant();
startNewTurn();
}
+ return table;
}
private void rotateHandsIfRelevant() {
diff --git a/backend/src/main/java/org/luxons/sevenwonders/lobby/Player.java b/backend/src/main/java/org/luxons/sevenwonders/lobby/Player.java
index 6698c476..6143dfb5 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/lobby/Player.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/lobby/Player.java
@@ -11,6 +11,8 @@ public class Player {
private int index;
+ private boolean ready;
+
private transient Lobby lobby;
private transient Game game;
@@ -40,6 +42,14 @@ public class Player {
this.index = index;
}
+ public boolean isReady() {
+ return ready;
+ }
+
+ public void setReady(boolean ready) {
+ this.ready = ready;
+ }
+
@JsonIgnore
public Lobby getLobby() {
return lobby;
@@ -57,4 +67,9 @@ public class Player {
public void setGame(Game game) {
this.game = game;
}
+
+ @Override
+ public String toString() {
+ return "'" + displayName + "' (" + username + ")";
+ }
}
diff --git a/backend/src/test/java/org/luxons/sevenwonders/game/GameTest.java b/backend/src/test/java/org/luxons/sevenwonders/game/GameTest.java
index e9f7facf..56829951 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/game/GameTest.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/game/GameTest.java
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertTrue;
public class GameTest {
@Test
- public void test() {
+ public void testFullGame() {
int nbPlayers = 5;
Game game = createGame(nbPlayers);
@@ -51,7 +51,7 @@ public class GameTest {
game.prepareMove(turnInfo.getPlayerIndex(), move);
}
}
- assertTrue(game.areAllPlayersReady());
+ assertTrue(game.allPlayersPreparedTheirMove());
game.playTurn();
}
bgstack15