diff --git a/server/games/erqiwang/class.export.js b/server/games/erqiwang/class.export.js index f6cb47f..dfc6fa2 100644 --- a/server/games/erqiwang/class.export.js +++ b/server/games/erqiwang/class.export.js @@ -185,10 +185,16 @@ var cls_youle_erqiwang_export = cls_youle_erqiwang_export || { deskinfo.PushCards.pushlist[pai.playround - 1][owner - 1].push(i); } } - //按大小排序 + //按大小排序:外层下标=轮次、内层恒为 3 个座位;排序须按本局主牌花色 + //(内层曾误用轮次数作上界,会把内层数组撑成轮次长度并填入 undefined; + // 且曾误用上一个循环泄漏出来的 pai.flower——那是最后一张牌大王的花色 5, + // 等于按「无主牌」排序) for (var i = 0; i < deskinfo.PushCards.pushlist.length; i++) { - for (var j = 0; j < deskinfo.PushCards.pushlist.length; j++) { - deskinfo.PushCards.pushlist[i][j] = cls_youle_erqiwang_arith.order_cards(pai.flower, deskinfo.PushCards.pushlist[i][j]); + if (!deskinfo.PushCards.pushlist[i]){ + continue; + } + for (var j = 0; j < 3; j++) { + deskinfo.PushCards.pushlist[i][j] = cls_youle_erqiwang_arith.order_cards(paiju.flower, deskinfo.PushCards.pushlist[i][j]); } } break; diff --git a/server/games/erqiwang/test/test_rpc.js b/server/games/erqiwang/test/test_rpc.js index 6d56c10..0f3cf49 100644 --- a/server/games/erqiwang/test/test_rpc.js +++ b/server/games/erqiwang/test/test_rpc.js @@ -130,6 +130,44 @@ t.eq('埋牌 不查牌 闲家无liangpai', mpXian && mpXian.data.liangpai, undef t.eq('重连 可查牌 PushCards有seatlist', E.get_deskinfo(e.o_room, 1).PushCards.seatlist !== undefined, true); t.eq('重连 不查牌 PushCards无seatlist', E.get_deskinfo(en.o_room, 1).PushCards.seatlist, undefined); +// ===================== 重连 PushCards.pushlist:结构恒 3 座位 + 按本局主牌花色排序 ===================== +// 造 5 轮已出牌的牌局(每轮每家 1 张),外加 seat0 在第 1 轮同时出「主5 + 副♥A」用于验证排序 +function mkPushlist() { + const pj = { + idx: 1, step: 5, banker: 0, call: 65, flower: 1, callproc: [], + seatlist: [[[0, 0], [0, 0], [0, 0], [0, 0], [-1, -1]], [[0, 0], [0, 0], [0, 0], [0, 0], [-1, -1]], [[0, 0], [0, 0], [0, 0], [0, 0], [-1, -1]]], + playproc: { round: 5, start: 0, currseat: 0, cards: [[], [], []] }, + cards: make108() + }; + for (let i = 0; i < 108; i++) pj.cards[i].dealowner = (i % 3) + 1; + // 每轮每家一张 + let next = 0; + for (let r = 1; r <= 5; r++) for (let s = 0; s < 3; s++) { + for (let i = next; i < 108; i++) { + if (pj.cards[i].dealowner === s + 1 && pj.cards[i].playround === -1) { pj.cards[i].playround = r; break; } + } + } + // seat0 第1轮补出:主5(flower1) 与 副♥A(flower3),主牌必须排在副牌前 + const zhu5 = id(1, 1, 5), fuA = id(1, 3, 1); + for (const c of [zhu5, fuA]) { pj.cards[c].dealowner = 1; pj.cards[c].playround = 1; } + pj.method = { + get_seat_cards: s => P.get_seat_cards(pj, s), + get_jian_grade: () => P.get_jian_grade(pj), + get_burycard: () => P.get_burycard(pj), + get_liangpai: () => null + }; + return { pj, zhu5, fuA }; +} +const pl = mkPushlist(); +const plRoom = setup("00000", pl.pj).o_room; +const di = E.get_deskinfo(plRoom, 1).PushCards.pushlist; +t.eq('重连 pushlist 轮数=5', di.length, 5); +t.eq('重连 pushlist 每轮恒3个座位', di.map(r => r.length), [3, 3, 3, 3, 3]); +t.eq('重连 pushlist 不含 undefined', di.some(r => r.some(x => x === undefined)), false); +// 第1轮 seat0 的牌:主5 必须排在副♥A 之前(按 paiju.flower=1 排序,而非泄漏的大王花色5) +t.eq('重连 pushlist 按本局主牌花色排序(主5在副A前)', + di[0][0].indexOf(pl.zhu5) < di[0][0].indexOf(pl.fuA), true); + // ===================== §7.3 下发面 multiple 必须随「爬坡」开关取值(与结算 aset.multiple 同源)===================== // 叫 45 分:常规算子基础子数 6(design §7.1「50 及以下统一 6」),爬坡 7(design §7.3.1) const A = require('../class.arith.js');