leaderboard api ahora entrega el score de cada ronda
This commit is contained in:
@@ -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'
|
'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) {
|
async function sendPlayersActionsUpdate(client?: Response) {
|
||||||
try {
|
try {
|
||||||
const nameManager = NameManager.getInstance();
|
const nameManager = NameManager.getInstance();
|
||||||
const uuids = nameManager.getAllKnownUuids?.() || [];
|
const uuids = nameManager.getAllKnownUuids?.() || [];
|
||||||
|
|
||||||
const players = uuids.map((uuid: string) => {
|
const players = uuids.map((uuid: string) => {
|
||||||
const history = nameManager.getSystemHistory(uuid) || [];
|
const history = nameManager.getSystemHistory(uuid) || [];
|
||||||
const counts: any = Object.fromEntries(ACTION_EVENTS.map(k => [k, 0]));
|
const counts: any = Object.fromEntries(ACTION_EVENTS.map(k => [k, 0]));
|
||||||
const detailedHistory: any[] = [];
|
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) {
|
for (const entry of history) {
|
||||||
const kind = (entry as any)?.kind || '';
|
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 (!ACTION_EVENTS.includes(kind)) continue;
|
||||||
if (!isActionMade(kind, (entry as any)?.role)) continue;
|
if (!isActionMade(kind, role)) continue;
|
||||||
counts[kind] = (counts[kind] || 0) + 1;
|
counts[kind] = (counts[kind] || 0) + 1;
|
||||||
|
|
||||||
// Include detailed event info
|
// Include detailed event info
|
||||||
detailedHistory.push({
|
detailedHistory.push({
|
||||||
kind,
|
kind,
|
||||||
round: (entry as any)?.round,
|
round,
|
||||||
gameVariant: (entry as any)?.gameVariant || (entry as any)?.variant,
|
gameVariant,
|
||||||
roomId: (entry as any)?.roomId
|
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);
|
const total = ACTION_EVENTS.reduce((acc, k) => acc + (counts[k] || 0), 0);
|
||||||
return {
|
return {
|
||||||
uuid,
|
uuid,
|
||||||
name: nameManager.getPlayerName(uuid) || null,
|
name: nameManager.getPlayerName(uuid) || null,
|
||||||
counts,
|
counts,
|
||||||
total,
|
total,
|
||||||
detailedHistory
|
detailedHistory,
|
||||||
|
rawHistory: history,
|
||||||
|
roomScoreHistory
|
||||||
};
|
};
|
||||||
}).filter((p: any) => p.total > 0 || p.name);
|
}).filter((p: any) => p.total > 0 || p.name);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user