提交 082c4031 authored 作者: lidongxu's avatar lidongxu

同步所有人分数

上级 3799d748
...@@ -100,6 +100,7 @@ function initSocket(httpServer) { ...@@ -100,6 +100,7 @@ function initSocket(httpServer) {
broadcastToRoom, broadcastToRoom,
joinRoom, joinRoom,
leaveAllRooms, leaveAllRooms,
roomSubscribers,
}); });
const screenCleanup = registerScreenHandlers(ws, { const screenCleanup = registerScreenHandlers(ws, {
......
...@@ -6,6 +6,12 @@ const prisma = require('../prisma/client'); ...@@ -6,6 +6,12 @@ const prisma = require('../prisma/client');
*/ */
const waitingRooms = new Map(); const waitingRooms = new Map();
/**
* 游戏结束分数收集表:roomId → Map<playerId, {score, nickname}>
* 用于收集房间内所有玩家的最终分数
*/
const gameOverScores = new Map();
/** 房间玩家计数:roomId → number,用于分配递增的 playerId */ /** 房间玩家计数:roomId → number,用于分配递增的 playerId */
const roomPlayerCounter = new Map(); const roomPlayerCounter = new Map();
...@@ -38,7 +44,7 @@ const roomTimers = new Map(); ...@@ -38,7 +44,7 @@ const roomTimers = new Map();
* @param {{ broadcastToRoom, joinRoom, leaveAllRooms }} helpers * @param {{ broadcastToRoom, joinRoom, leaveAllRooms }} helpers
* @returns {Function} cleanup 函数,ws 关闭时调用 * @returns {Function} cleanup 函数,ws 关闭时调用
*/ */
function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms }) { function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, roomSubscribers }) {
if (!ws._handlers) ws._handlers = {}; if (!ws._handlers) ws._handlers = {};
// ── room:create ──────────────────────────────────────────────────────────── // ── room:create ────────────────────────────────────────────────────────────
...@@ -230,9 +236,34 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms }) ...@@ -230,9 +236,34 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms })
where: { roomId }, where: { roomId },
data: { status: 'finished' }, data: { status: 'finished' },
}); });
// 广播给大屏(含 playerId 和分数)
broadcastToRoom(roomId, 'room:gameOver', { roomId, score, playerId, nickname }, ws); // 收集该玩家的分数
console.log(`[Room] 游戏正常结束 roomId=${roomId} playerId=${playerId} score=${score ?? 0}`); if (!gameOverScores.has(roomId)) {
gameOverScores.set(roomId, new Map());
}
const roomScores = gameOverScores.get(roomId);
roomScores.set(playerId, { score: score ?? 0, nickname });
// 获取房间内所有连接的 minigame 玩家数量
const subs = roomSubscribers.get(roomId);
const minigamePlayers = subs ? [...subs].filter(s => s.ctx?.role === 'minigame') : [];
const totalPlayers = minigamePlayers.length;
const reportedPlayers = roomScores.size;
console.log(`[Room] 游戏结束分数收集 roomId=${roomId} playerId=${playerId} score=${score ?? 0} (${reportedPlayers}/${totalPlayers})`);
// 广播当前收集到的分数给所有人(让客户端可以实时显示)
const scoresObj = {};
for (const [pid, data] of roomScores) {
scoresObj[pid] = data.score;
}
broadcastToRoom(roomId, 'room:gameOver', { roomId, scores: scoresObj, playerId, nickname });
// 如果所有玩家都已上报分数,清理收集表
if (reportedPlayers >= totalPlayers) {
console.log(`[Room] 所有玩家分数收集完成 roomId=${roomId}`);
gameOverScores.delete(roomId);
}
} catch (err) { } catch (err) {
console.error('[room:gameOver] 错误:', err); console.error('[room:gameOver] 错误:', err);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论