- 登录成功后调用 /api/auth/me 获取当前房间,自动切到 online 模式并定位对应游戏, 按 name 匹配恢复用户座位与 credentials(同浏览器缓存优先复用,避免旧会话占座 409)。 - 新增 WelcomeScreen:纯 CSS 动画(漂浮棋子 + 呼吸社标 + 旋转环),不含"欢迎"字样, 联机模式无对局时显示,登录/未登录文案不同。 - 新增 GAME_ORDER 常量,游戏下拉与默认选中改为 德州扑克(Holdem) 第一、Mill 第二、其余靠后。 - 文档:docs/texas/13-login-redirect-welcome-gamelist.md + 索引更新。 Co-Authored-By: CodeBuddy Code <codebuddy@tencent.com>
4.6 KiB
4.6 KiB
Texas / 通用问题 — 分析与实施计划索引
本目录对应一次用户集中反馈(10 个编号问题 + 1 个通用登录问题)。 所有问题均基于对现有代码(
packages/engine、packages/ui、packages/server、apps/web)的精读定位, 每个文件给出根因 + 拟采用的修复方案。
问题清单与优先级
| 编号 | 主题 | 文件 | 范围 | 优先级 |
|---|---|---|---|---|
| 1 | 改名后牌桌 UI 不刷新 | 01-rename-not-refreshing.md | UI / engine | P0(最影响体验) |
| 2 | 删除房间 / 房主心跳 / 房主退出自动关房 / 踢人 | 02-room-delete-host-heartbeat-kick.md | server / ui(通用,全部游戏) | P0(基础设施) |
| 3 | 结束后未重置房间;德州有人筹码≤0 给补码/退出;其他游戏无限轮回 | 03-reset-room-rebuy.md | engine / ui(通用 + holdem) | P1 |
| 4 | all-in 与比牌归属权问题 | 04-allin-hand-comparison.md | engine(holdem) | P1 |
| 5 | 打牌顺序(标准德州顺序 + 每次 raise 后顺序) | 05-betting-order.md | 调查 + engine(holdem) | P1 |
| 6 | 结算开最大人的牌;All-in 必须翻两边牌,不盖自己的牌 | 06-showdown-reveal-cards.md | ui / engine(holdem) | P2 |
| 9 | 筹码滑块分段,每段 5,每 5 一段 | 09-chip-slider-segments.md | ui(holdem) | P2 |
| 10 | 每人筹码区增加“总已下”,累计每次下注 | 10-chip-total-bet.md | ui / engine(holdem) | P2 |
| 8(通用) | 用户登录:名称+密码身份加入 | 08-user-login.md | server / ui(通用) | P2(独立大功能) |
| 8/2 延伸 | 登录落地 + 踢人修正 + 单房间约束 + 管理员越权 + UI 清理 | 12-auth-kick-single-room.md | server / ui / engine(通用) | 已完成(本会话) |
| 9(UI 收尾) | 登录后自动跳转对局 + 动态欢迎界面(无"欢迎"字样)+ 游戏列表排序(德州第一/Mill 第二) | 13-login-redirect-welcome-gamelist.md | apps/web(通用) | 已完成(本会话) |
注意:编号按用户原始序号,缺失的 7 是用户未给出。问题 8 虽编号靠后,但是“通用问题”,与 2 同属 server 基础设施。
关键架构事实(定位依据)
- boardgame.io 0.50.2:Lobby REST 仅有
create/join/leave/playAgain/update,没有 delete / heartbeat / kick。leave:最后一个玩家离开时db.wipe(matchID)删除房间(server.js:2331)。update(/games/:name/:id/update):只改metadata.players[playerID].name,不触碰游戏状态 G。
- 两个名字来源(问题 1 根因):
- Lobby
metadata.players[pid].name(房间列表 pill 显示用) - 游戏内
G.players[pid].name(牌桌 HoldemBoard 显示用,由sitDownMove写入) 二者相互独立,改名只更新了 (1)。
- Lobby
server对象(Server()返回值)暴露app / db / auth / router,可在packages/server/src/index.ts里给server.app挂自定义 koa 路由:- 删除房间:
server.db.wipe(matchID)(配合server.db.setMetadata清 metadata)。 - 心跳/在线:在
metadata或一张内存表里记录lastSeen[pid]。 - 踢人:复用
metadata.players[pid]清 name/credentials + 同时在 G 里把该座位seated=false。
- 删除房间:
- Holdem 行动权机制(
holdem.ts):ActivePlayers.ALL+ move 内isActor校验; 推进用advance()→events.endTurn({next})或endPhase();首行动者G.firstToAct由 phase.onBegin 设置。 - 改名信任模型:现有
sitDownMove已直接信任客户端传入的playerID(move内me = playerID ?? ctx.currentPlayer), 故新增的renamemove 沿用同一信任模型即可(局域网/单机休闲场景可接受)。
实施顺序建议
- 基础设施(server):问题 2(删除/心跳/踢人)+ 问题 8 登录的账号后端 → 影响全局。
- UI/engine 联动:问题 1(改名刷新)→ 依赖 server 名字打通。
- 游戏内循环:问题 3(重置/补码/轮回)、问题 4(all-in 比牌)、问题 5(顺序核实+修正)。
- 展示细节:问题 6(亮牌)、问题 9(滑块分段)、问题 10(总已下)。
- 登录前端:问题 8。