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

同步所有人分数

上级 3799d748
......@@ -100,6 +100,7 @@ function initSocket(httpServer) {
broadcastToRoom,
joinRoom,
leaveAllRooms,
roomSubscribers,
});
const screenCleanup = registerScreenHandlers(ws, {
......
......@@ -6,6 +6,12 @@ const prisma = require('../prisma/client');
*/
const waitingRooms = new Map();
/**
* 游戏结束分数收集表:roomId → Map<playerId, {score, nickname}>
* 用于收集房间内所有玩家的最终分数
*/
const gameOverScores = new Map();
/** 房间玩家计数:roomId → number,用于分配递增的 playerId */
const roomPlayerCounter = new Map();
......@@ -38,7 +44,7 @@ const roomTimers = new Map();
* @param {{ broadcastToRoom, joinRoom, leaveAllRooms }} helpers
* @returns {Function} cleanup 函数,ws 关闭时调用
*/
function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms }) {
function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, roomSubscribers }) {
if (!ws._handlers) ws._handlers = {};
// ── room:create ────────────────────────────────────────────────────────────
......@@ -230,9 +236,34 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms })
where: { roomId },
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) {
console.error('[room:gameOver] 错误:', err);
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论