leaderboard api ahora entrega el score de cada ronda

This commit is contained in:
2025-08-28 00:17:06 -06:00
parent 5321870336
commit acb3edde3b

View File

@@ -809,36 +809,136 @@ const ACTION_EVENTS = [
'p1_propose','p1_no_offer','p2_snatch','p2_accept','p2_force','p2_no_force','p2_reject','p1_shame','p1_no_shame','p1_report','p1_no_report'
];
// Calculate scores based on game variant and role
function calculateScore(pavoTokens: number, eloteTokens: number, role: string): number {
if (role === 'P1') {
return pavoTokens * 1 + eloteTokens * 2;
} else if (role === 'P2') {
return pavoTokens * 2 + eloteTokens * 1;
}
return 0;
}
// Check if event triggers score calculation for the game variant
function isScoreEvent(kind: string, gameVariant: string): boolean {
const variant = (gameVariant || '').toUpperCase();
switch (variant) {
case 'G1':
case 'G2':
case 'G5':
return ['p1_no_offer', 'p2_accept', 'p2_reject', 'p2_snatch'].includes(kind);
case 'G3':
return ['p1_no_offer', 'p2_accept', 'p2_reject', 'p1_shame', 'p1_no_shame'].includes(kind);
case 'G4':
return ['p1_no_offer', 'p2_accept', 'p2_reject', 'p1_report', 'p1_no_report'].includes(kind);
default:
return false;
}
}
async function sendPlayersActionsUpdate(client?: Response) {
try {
const nameManager = NameManager.getInstance();
const uuids = nameManager.getAllKnownUuids?.() || [];
const players = uuids.map((uuid: string) => {
const history = nameManager.getSystemHistory(uuid) || [];
const counts: any = Object.fromEntries(ACTION_EVENTS.map(k => [k, 0]));
const detailedHistory: any[] = [];
// Track room scores for this specific player
const playerRoomScoreMap = new Map<string, Array<{
round: number;
variant: string;
increment: number;
score: number;
role: string;
}>>();
// Track round/variant/increment combinations per room for this player
const roomGameTracker = new Map<string, Map<string, number>>(); // roomId -> "round-variant" -> increment
// First pass: process all events for score calculation
for (const entry of history) {
const kind = (entry as any)?.kind || '';
const roomId = (entry as any)?.roomId;
const round = (entry as any)?.round;
const gameVariant = (entry as any)?.gameVariant || (entry as any)?.variant;
const role = (entry as any)?.role;
const pavoTokens = (entry as any)?.pavoTokens || 0;
const eloteTokens = (entry as any)?.eloteTokens || 0;
// Process score calculation if this is a score-triggering event
if (roomId && round && gameVariant && isScoreEvent(kind, gameVariant) && (pavoTokens > 0 || eloteTokens > 0)) {
// Track game progression for increment calculation
if (!roomGameTracker.has(roomId)) {
roomGameTracker.set(roomId, new Map());
}
const gameKey = `${round}-${gameVariant}`;
const currentIncrement = roomGameTracker.get(roomId)!.get(gameKey) || 0;
roomGameTracker.get(roomId)!.set(gameKey, currentIncrement + 1);
// Calculate score
const score = calculateScore(pavoTokens, eloteTokens, role);
// Add to this player's room score history
if (!playerRoomScoreMap.has(roomId)) {
playerRoomScoreMap.set(roomId, []);
}
playerRoomScoreMap.get(roomId)!.push({
round: parseInt(round),
variant: gameVariant,
increment: currentIncrement + 1,
score,
role
});
}
}
// Second pass: process action events for counts and detailed history
for (const entry of history) {
const kind = (entry as any)?.kind || '';
const roomId = (entry as any)?.roomId;
const round = (entry as any)?.round;
const gameVariant = (entry as any)?.gameVariant || (entry as any)?.variant;
const role = (entry as any)?.role;
if (!ACTION_EVENTS.includes(kind)) continue;
if (!isActionMade(kind, (entry as any)?.role)) continue;
if (!isActionMade(kind, role)) continue;
counts[kind] = (counts[kind] || 0) + 1;
// Include detailed event info
detailedHistory.push({
kind,
round: (entry as any)?.round,
gameVariant: (entry as any)?.gameVariant || (entry as any)?.variant,
roomId: (entry as any)?.roomId
round,
gameVariant,
roomId
});
}
// Build RoomScoreHistory array for this player
const roomScoreHistory = Array.from(playerRoomScoreMap.entries()).map(([roomId, scores]) => ({
roomId,
scores: scores.sort((a, b) => {
// Sort by round, then variant, then increment
if (a.round !== b.round) return a.round - b.round;
if (a.variant !== b.variant) return a.variant.localeCompare(b.variant);
return a.increment - b.increment;
})
}));
const total = ACTION_EVENTS.reduce((acc, k) => acc + (counts[k] || 0), 0);
return {
uuid,
name: nameManager.getPlayerName(uuid) || null,
counts,
total,
detailedHistory
detailedHistory,
rawHistory: history,
roomScoreHistory
};
}).filter((p: any) => p.total > 0 || p.name);