GameState 是服务端快照的镜像、前端 SSOT:只镜像不派生、字段名对齐协议、 缺字段不兜底。reset 清对局态但保留 mySeat 与 options(跨局不变)。 事件只带「发生了什么」,数据由订阅者从 GameState 读,避免同一份数据两处存。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
38 lines
2.0 KiB
JavaScript
38 lines
2.0 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// EQW_Events: 玩法事件常量 ///////////////////////////
|
||
///////////////////////////////////////////////////////////////
|
||
// 前端红线:框架保持游戏中立,玩法专属事件由子游戏追加到 EventBus.Events。
|
||
//
|
||
// 【事件只带「发生了什么」,不带数据】——订阅者从 EQW_GameState 读。
|
||
// 这样同一份数据不会在事件载荷与状态里各存一份(SSOT)。
|
||
// 唯一例外是 EQW_RPC_FAILED,它带 {rpc, errcode}:那是一次性的错误信息,
|
||
// 不属于对局状态、不该进 GameState。
|
||
var EQW_Events = EQW_Events || {
|
||
|
||
EQW_RESET: 'eqw.reset', //新一局发牌,全部清场
|
||
EQW_HAND_CHANGED: 'eqw.hand_changed', //自己手牌变化
|
||
EQW_CALL_CHANGED: 'eqw.call_changed', //叫分推进
|
||
EQW_BANKER_SET: 'eqw.banker_set', //上庄
|
||
EQW_MAIN_SET: 'eqw.main_set', //选主
|
||
EQW_BURY_DONE: 'eqw.bury_done', //埋牌完成
|
||
EQW_CARD_PLAYED: 'eqw.card_played', //有人出牌
|
||
EQW_TRICK_END: 'eqw.trick_end', //一轮结束(chupai3 带 maxseat)
|
||
EQW_TURN_CHANGED: 'eqw.turn_changed', //控制权或倒计时变化
|
||
EQW_MINGPAI: 'eqw.mingpai', //收到明牌数据
|
||
EQW_TIP: 'eqw.tip', //收到对家提示
|
||
EQW_ASET_RESULT: 'eqw.aset_result', //小局结算
|
||
EQW_ACCOUNT_RESULT: 'eqw.account_result', //大局/解散结算
|
||
EQW_READY_CHANGED: 'eqw.ready_changed', //有人准备
|
||
EQW_RESYNC_ALL: 'eqw.resync_all', //重连/开局全量重画
|
||
EQW_RPC_FAILED: 'eqw.rpc_failed' //失败回包 {rpc, errcode}
|
||
};
|
||
|
||
//追加到框架事件总线的事件表(框架不认识玩法事件,由子游戏注册)
|
||
if (typeof EventBus !== 'undefined' && EventBus.Events) {
|
||
for (var _eqwEvtKey in EQW_Events) {
|
||
if (EQW_Events.hasOwnProperty(_eqwEvtKey)) {
|
||
EventBus.Events[_eqwEvtKey] = EQW_Events[_eqwEvtKey];
|
||
}
|
||
}
|
||
}
|