三个包字段不同:chupai1 带牌型信息、chupai1/2 带 nextseat 与 mustcard, chupai3 带 maxseat 与本轮得分。 两个易错点已覆盖:cardsinhand 只有出牌者自己有,别人出牌时缺该字段不能抹掉 自己的手牌;mustcard 只对当前轮有效,没给就要清空,否则上一轮的建议会残留。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
85 lines
3.8 KiB
JavaScript
85 lines
3.8 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// EQW_PlayHandler: 出牌(chupai1 / 2 / 3)///////////
|
||
///////////////////////////////////////////////////////////////
|
||
// 协议 §11–§13。三个包字段不完全相同:
|
||
// chupai1 首家独有:shuaicuo 甩错标志 / count 出牌数量 / flower 出牌花色 /
|
||
// cardtype 牌型 / shuai 甩牌分量构成
|
||
// chupai1/2 有:nextseat 下一个出牌者 / mustcard 必出牌(只发给 nextseat 那一家)
|
||
// chupai3 末家独有:maxseat 本轮谁最大 / grade 本轮闲家得分
|
||
// 共有:seat / cards / seatlist(仅可查牌) / countdown / baozhu /
|
||
// cardsinhand(仅出牌者自己有) / curmultiple(1 和 3 有)
|
||
//
|
||
// 【cardsinhand 只有出牌者自己有】:收到就更新自己的手牌;别人出牌时没这个字段,
|
||
// 绝不能抹掉自己的手牌——这正是「缺字段不兜底」要防的。
|
||
//
|
||
// 【mustcard 没有就要清空】:它是「本轮跟牌的必出牌」,只对当前这一轮有效。
|
||
// 上一轮的建议残留下来会让界面自动选中错误的牌。
|
||
var EQW_PlayHandler = EQW_PlayHandler || {
|
||
|
||
//order: 1/2/3,对应 chupai1/2/3
|
||
handle: function (data, order) {
|
||
if (!data.hasOwnProperty('seat') || !data.hasOwnProperty('cards')) {
|
||
console.error('[EQW_PlayHandler] chupai' + order + ' 缺 seat 或 cards,已跳过该包');
|
||
return;
|
||
}
|
||
|
||
//—— 本轮桌面:记下这一手(谁出的、出了什么、首家的牌型信息)——
|
||
if (!EQW_GameState.table.playproc) { EQW_GameState.table.playproc = {}; }
|
||
var proc = EQW_GameState.table.playproc;
|
||
proc.order = order;
|
||
EQW_GameState._apply(proc, data, {
|
||
seat: 'seat',
|
||
cards: 'cards',
|
||
count: 'count',
|
||
flower: 'flower',
|
||
cardtype: 'cardtype',
|
||
shuai: 'shuai',
|
||
shuaicuo: 'shuaicuo'
|
||
});
|
||
|
||
//—— 自己的手牌:只有出牌者本人才收到 cardsinhand ——
|
||
EQW_GameState._apply(EQW_GameState.my, data, { cards: 'cardsinhand' });
|
||
|
||
//—— 必出牌:本轮有效,没给就清空 ——
|
||
if (data.hasOwnProperty('mustcard')) {
|
||
EQW_GameState.my.mustCard = data.mustcard;
|
||
} else {
|
||
EQW_GameState.my.mustCard = [];
|
||
}
|
||
|
||
//—— 牌况与报无主(仅可查牌模式下发)——
|
||
EQW_GameState._apply(EQW_GameState.table, data, { seatlist: 'seatlist' });
|
||
EQW_GameState._apply(EQW_GameState.aset, data, {
|
||
baozhu: 'baozhu',
|
||
curmultiple: 'curmultiple'
|
||
});
|
||
|
||
//—— 控制权与倒计时 ——
|
||
EQW_GameState._apply(EQW_GameState.turn, data, {
|
||
seat: 'nextseat',
|
||
countdown: 'countdown'
|
||
});
|
||
|
||
EventBus.emit(EQW_Events.EQW_CARD_PLAYED);
|
||
if (data.hasOwnProperty('cardsinhand')) { EventBus.emit(EQW_Events.EQW_HAND_CHANGED); }
|
||
|
||
//—— 末家出完:本轮结束,记下谁最大、闲家得了多少分 ——
|
||
if (order === 3) {
|
||
if (!EQW_GameState.result.chupai) { EQW_GameState.result.chupai = {}; }
|
||
EQW_GameState._apply(EQW_GameState.result.chupai, data, {
|
||
seat: 'seat',
|
||
cards: 'cards',
|
||
maxseat: 'maxseat',
|
||
grade: 'grade'
|
||
});
|
||
//本轮闲家得分累加进小局捡分;没得分时不带 grade,累计值保持不变
|
||
if (data.hasOwnProperty('grade')) {
|
||
EQW_GameState.aset.grade = EQW_GameState.aset.grade + data.grade;
|
||
}
|
||
EventBus.emit(EQW_Events.EQW_TRICK_END);
|
||
}
|
||
|
||
EventBus.emit(EQW_Events.EQW_TURN_CHANGED);
|
||
}
|
||
};
|