diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/GameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/GameController.java index b90de4f..361879d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/GameController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/GameController.java @@ -61,6 +61,35 @@ public class GameController { engine.getState().addPlayer(name, chips); } + /** + * Renames a player id in the controller list and underlying game state. + * + * @param oldId old player id + * @param newId new player id + * @return true if rename succeeded + */ + public boolean renamePlayer(PlayerId oldId, PlayerId newId) { + if (oldId == null || newId == null) { + return false; + } + if (oldId.equals(newId)) { + return true; + } + + int idx = players.indexOf(oldId); + if (idx < 0 || players.contains(newId)) { + return false; + } + + boolean stateRenamed = engine.getState().renamePlayerId(oldId, newId); + if (!stateRenamed) { + return false; + } + + players.set(idx, newId); + return true; + } + /** * Initializes a new hand by preparing the deck, setting the phase to PREFLOP, rotating the * dealer, dealing hole cards, posting blinds, and setting the first active player. diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/player/Player.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/player/Player.java index f937e44..81576dd 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/player/Player.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/player/Player.java @@ -49,6 +49,16 @@ public class Player { return id; } + /** + * Updates the player's id. This is used when a username change is propagated into an already + * running game. + * + * @param id new player id + */ + public void setId(PlayerId id) { + this.id = id; + } + /** * Returns the display name of the player. Currently identical to the player ID. * diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/state/GameState.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/state/GameState.java index a018d6a..1732072 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/state/GameState.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/game/state/GameState.java @@ -174,6 +174,51 @@ public class GameState { holeCards.computeIfAbsent(id, k -> new ArrayList<>()); } + /** + * Renames a player id across all game-state structures. + * + * @param oldId existing player id + * @param newId new player id + * @return true if the rename was applied, false otherwise + */ + public synchronized boolean renamePlayerId(PlayerId oldId, PlayerId newId) { + if (oldId == null || newId == null) { + return false; + } + if (!players.containsKey(oldId)) { + return false; + } + if (oldId.equals(newId)) { + return true; + } + if (players.containsKey(newId)) { + return false; + } + + Player player = players.remove(oldId); + if (player == null) { + return false; + } + player.setId(newId); + players.put(newId, player); + + int idx = playerOrder.indexOf(oldId); + if (idx >= 0) { + playerOrder.set(idx, newId); + } + + moveMapEntry(currentBets, oldId, newId, 0); + moveMapEntry(playerBetCommitments, oldId, newId, 0); + moveMapEntry(holeCards, oldId, newId, new ArrayList<>()); + return true; + } + + private void moveMapEntry( + Map map, PlayerId oldId, PlayerId newId, T fallback) { + T value = map.remove(oldId); + map.put(newId, value != null ? value : fallback); + } + // Betting public int getCurrentBet(PlayerId playerId) { return currentBets.getOrDefault(playerId, 0);