diff --git a/engine/src/main/java/org/ethelred/games/core/BaseGame.java b/engine/src/main/java/org/ethelred/games/core/BaseGame.java
index c2dc7847..61fafee1 100644
--- a/engine/src/main/java/org/ethelred/games/core/BaseGame.java
+++ b/engine/src/main/java/org/ethelred/games/core/BaseGame.java
@@ -16,6 +16,8 @@ public abstract class BaseGame
implements Game
private String shortCode;
private volatile Status status = Status.PRESTART;
+ private int playAgainCount = 0;
+
enum ReadyState {
PRESTART,
READY,
@@ -86,6 +88,7 @@ public void playerReady(Player player)
if (readyPlayers.values().stream().allMatch(x -> x == ReadyState.READY)
&& players.size() >= minPlayers())
{
+ currentPlayerIndex = playAgainCount % playerCount();
start();
status = Status.IN_PROGRESS;
}
@@ -224,4 +227,14 @@ public Set actionsFor(Player player) {
public void log(Player player, Action action) {
log.push(player, action);
}
+
+ @Override
+ public int playAgainCount() {
+ return playAgainCount;
+ }
+
+ @Override
+ public void playAgainCount(int i) {
+ playAgainCount = i;
+ }
}
diff --git a/engine/src/main/java/org/ethelred/games/core/Game.java b/engine/src/main/java/org/ethelred/games/core/Game.java
index a5265628..91b3df14 100644
--- a/engine/src/main/java/org/ethelred/games/core/Game.java
+++ b/engine/src/main/java/org/ethelred/games/core/Game.java
@@ -15,6 +15,7 @@ public interface Game extends Identifiable
void log(Player player, Action action);
+
enum Status
{
PRESTART, IN_PROGRESS, ENDED
@@ -33,4 +34,7 @@ enum Status
Player currentPlayer();
Player nextPlayer();
+ int playAgainCount();
+
+ void playAgainCount(int i);
}
diff --git a/engine/src/main/java/org/ethelred/games/core/InMemoryEngineImpl.java b/engine/src/main/java/org/ethelred/games/core/InMemoryEngineImpl.java
index 00f33567..ac860e1a 100644
--- a/engine/src/main/java/org/ethelred/games/core/InMemoryEngineImpl.java
+++ b/engine/src/main/java/org/ethelred/games/core/InMemoryEngineImpl.java
@@ -145,6 +145,7 @@ private MessagePlayerView handlePlayAgain(Channel channel, Game game, Collection
return new MessagePlayerView(null, game.playerView(playerManager.get(channel.playerId())));
}
var newGame = createInternal(channel.gameType(), game.id());
+ newGame.playAgainCount(game.playAgainCount() + 1);
players.forEach(newGame::addPlayer);
players.forEach(newGame::playerReady);
players.forEach(p -> messageSender.accept(new Channel(game.id(), game.type(), p.id()), newGame.playerView(p)));