fapai 是一局起点,先 reset 清上局残留(保留 mySeat 与 options)。 叫分里 0(不叫)与 null(还没叫)严格区分。上庄的 bottomcards/cards 只有庄家有, 缺字段时保持原值、不抹掉闲家已有手牌——GameState 的「缺字段不兜底」在此体现。 新增 GameState._apply 助手:按 {目标键:源键} 映射写入,源键不存在就不写。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
与服务端 class.config.js 的 parse() 同规则;缺失/非字符串/过短一律按 '0', 这是协议 §0.5 明文规定的行为。已逐位对照服务端确认。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GameState 是服务端快照的镜像、前端 SSOT:只镜像不派生、字段名对齐协议、 缺字段不兜底。reset 清对局态但保留 mySeat 与 options(跨局不变)。 事件只带「发生了什么」,数据由订阅者从 GameState 读,避免同一份数据两处存。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>