Feat: Added in-game player-id rename propagation for active games

This commit is contained in:
Jona Walpert
2026-04-15 21:05:25 +02:00
parent 7ff274269e
commit b86f18a11c
3 changed files with 84 additions and 0 deletions
@@ -61,6 +61,35 @@ public class GameController {
engine.getState().addPlayer(name, chips); 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 * 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. * dealer, dealing hole cards, posting blinds, and setting the first active player.
@@ -49,6 +49,16 @@ public class Player {
return id; 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. * Returns the display name of the player. Currently identical to the player ID.
* *
@@ -174,6 +174,51 @@ public class GameState {
holeCards.computeIfAbsent(id, k -> new ArrayList<>()); 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 <T> void moveMapEntry(
Map<PlayerId, T> map, PlayerId oldId, PlayerId newId, T fallback) {
T value = map.remove(oldId);
map.put(newId, value != null ? value : fallback);
}
// Betting // Betting
public int getCurrentBet(PlayerId playerId) { public int getCurrentBet(PlayerId playerId) {
return currentBets.getOrDefault(playerId, 0); return currentBets.getOrDefault(playerId, 0);