Feat: Added in-game player-id rename propagation for active games
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user