From f56244aa621c231f45b7bec686f038a2fcab229e Mon Sep 17 00:00:00 2001 From: josedario87 Date: Sat, 16 Aug 2025 00:23:32 -0600 Subject: [PATCH] sistema de verguenza persistente --- server/src/adminApi.ts | 9 +++++++-- server/src/rooms/GameRoom.ts | 23 +++++++++++++++++++++-- server/src/rooms/schemas/GameState.ts | 12 ++++++++++++ server/src/utils/nameManager.ts | 11 +++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/server/src/adminApi.ts b/server/src/adminApi.ts index 22299d7..dcec1bc 100644 --- a/server/src/adminApi.ts +++ b/server/src/adminApi.ts @@ -365,11 +365,16 @@ adminRouter.post("/admin/shuffle-players", async (req: Request, res: Response) = // Collect players with their full info if (roomState.players && roomState.players.length > 0) { roomState.players.forEach((player: any) => { + const uuid = player.uuid || player.sessionId; + const shame = Number(player.shameTokens || 0); + // Persist sticky shame for this UUID before clearing rooms + try { NameManager.getInstance().setShameTokens(uuid, shame); } catch {} allPlayers.push({ - uuid: player.uuid || player.sessionId, // Use actual UUID if available + uuid, name: player.name, color: player.color, - sessionId: player.sessionId + sessionId: player.sessionId, + shameTokens: shame }); }); } diff --git a/server/src/rooms/GameRoom.ts b/server/src/rooms/GameRoom.ts index 3e2c2ce..65852c6 100644 --- a/server/src/rooms/GameRoom.ts +++ b/server/src/rooms/GameRoom.ts @@ -229,6 +229,12 @@ export class GameRoom extends Room { const p2 = this.state.p2Id ? this.state.players.get(this.state.p2Id) : undefined; if (p2) { p2.shameTokens += 1; + // Persist sticky shame per UUID + try { + const { NameManager } = require("../utils/nameManager"); + const u = (p2 as any)?.uuid; + if (u) NameManager.getInstance().setShameTokens(u, p2.shameTokens); + } catch {} // Notify dashboard of token change broadcastDashboardUpdate(); } @@ -320,11 +326,17 @@ export class GameRoom extends Room { const playerColor = (options.playerColor && typeof options.playerColor === 'string') ? options.playerColor : "#667eea"; const player = this.state.addPlayer(client.sessionId, playerName); - // Persist selected color + // Persist selected color and restore sticky values const p = this.state.players.get(client.sessionId); if (p) { p.color = playerColor; - if (uuid) (p as any).uuid = uuid; + if (uuid) { + (p as any).uuid = uuid; + try { + const { NameManager } = require("../utils/nameManager"); + p.shameTokens = NameManager.getInstance().getShameTokens(uuid); + } catch {} + } } client.send("playerInfo", { @@ -781,6 +793,13 @@ export class GameRoom extends Room { player.color = playerColor; (player as any).uuid = uuid; this.sessionToUuid.set(client.sessionId, uuid); + // Restore sticky shame tokens for this UUID + try { + const { NameManager } = require("../utils/nameManager"); + const count = NameManager.getInstance().getShameTokens(uuid); + const p = this.state.players.get(client.sessionId); + if (p) p.shameTokens = count; + } catch {} // Set role IDs if (expectedRole === 'P1') { diff --git a/server/src/rooms/schemas/GameState.ts b/server/src/rooms/schemas/GameState.ts index 16ca458..082849a 100644 --- a/server/src/rooms/schemas/GameState.ts +++ b/server/src/rooms/schemas/GameState.ts @@ -55,10 +55,15 @@ export class GameState extends Schema { } startGame(): void { + // Preserve sticky values across new game start as well + const shameSnapshot: Record = {}; + this.players.forEach((p, key) => { shameSnapshot[key] = p.shameTokens; }); + this.gameStatus = GameStatus.PLAYING; this.startTime = Date.now(); this.timeRemaining = 0; this.resetAllPlayers(); + this.players.forEach((p, key) => { p.shameTokens = shameSnapshot[key] || 0; }); // Initialize tokens by role if (this.p1Id) { const p1 = this.players.get(this.p1Id); @@ -88,6 +93,10 @@ export class GameState extends Schema { } restartGame(): void { + // Preserve sticky values (e.g., shameTokens) across restarts + const shameSnapshot: Record = {}; + this.players.forEach((p, key) => { shameSnapshot[key] = p.shameTokens; }); + this.gameStatus = GameStatus.WAITING; this.timeRemaining = 0; this.winner = ""; @@ -99,6 +108,9 @@ export class GameState extends Schema { this.requestPavo = this.requestElote = 0; this.offerActive = false; this.resetAllPlayers(); + + // Restore preserved sticky values + this.players.forEach((p, key) => { p.shameTokens = shameSnapshot[key] || 0; }); } private resetAllPlayers(): void { diff --git a/server/src/utils/nameManager.ts b/server/src/utils/nameManager.ts index 9fd2623..5129bf9 100644 --- a/server/src/utils/nameManager.ts +++ b/server/src/utils/nameManager.ts @@ -2,6 +2,7 @@ export class NameManager { private static instance: NameManager; private uuidToName: Map = new Map(); private uuidToColor: Map = new Map(); + private uuidToShame: Map = new Map(); // For shuffle functionality private roomAssignments: Map = new Map(); @@ -70,6 +71,16 @@ export class NameManager { return Array.from(this.uuidToName.values()); } + // Sticky shame tokens per UUID + setShameTokens(uuid: string, count: number): void { + const n = Math.max(0, Math.floor(count || 0)); + this.uuidToShame.set(uuid, n); + } + + getShameTokens(uuid: string): number { + return this.uuidToShame.get(uuid) || 0; + } + // Current game room assignment (for reconnection by UUID) setCurrentRoom(uuid: string, roomId: string): void { if (!uuid || !roomId) return;