// §4.6 坐庄轮换 do_prepare(庄赢连庄 / 闲赢·投降下家)。期望取自 design §4.6 require('./_shim'); const D = require('../class.desk.js'); const t = require('./_assert')(); // 造一个牌桌,压入一局"已结束"的牌局(banker/result),三家都准备后开新局,取新局 firstseat function nextFirstseat(banker, result) { const o_room = { seatlist: [{ conmode: 0, fromid: 0 }, { conmode: 0, fromid: 1 }, { conmode: 0, fromid: 2 }], asetcount: 6, method: { sendpack_toother: () => { } } }; const desk = D.new(o_room); desk.paiju_list.push({ banker, result, tmp_jiesuan_aset: {} }); D.do_prepare(desk, 0); D.do_prepare(desk, 1); D.do_prepare(desk, 2); return desk.paiju_list[desk.paiju_list.length - 1].firstseat; } t.eq('轮庄 庄1赢(result0)连庄', nextFirstseat(1, 0), 1); t.eq('轮庄 庄1闲赢(result1)下家2', nextFirstseat(1, 1), 2); t.eq('轮庄 庄1投降(result2)下家2', nextFirstseat(1, 2), 2); t.eq('轮庄 庄2赢连庄', nextFirstseat(2, 0), 2); t.eq('轮庄 庄2闲赢下家(回0)', nextFirstseat(2, 1), 0); t.eq('轮庄 庄0闲赢下家1', nextFirstseat(0, 1), 1); // ============ I-3 发牌包必须自带阶段 step 与控制权 seat ============ // 红线「状态机唯一在服务端」:阶段与「轮到谁」必须由服务端在包里显式给出。 // 曾经 fapai 只有 seat 没有 step,前端只能按 rpc 名硬编码 step=1——那就是把阶段推导 // 搬到了前端。反向验证:把 class.desk.js 里的 msg.data.step 删掉,本组第一条必转红。 function firstFapai() { const sent = []; const o_room = { seatlist: [{ conmode: 0, fromid: 0 }, { conmode: 0, fromid: 1 }, { conmode: 0, fromid: 2 }], asetcount: 6, method: { sendpack_toother: () => { } } }; const prevApp = global.youle_erqiwang.app; global.youle_erqiwang.app = { SendPack: m => sent.push(JSON.parse(JSON.stringify(m))) }; const desk = D.new(o_room); D.do_new_paiju(desk, 1); // 首个叫分者 = 1 号位(刻意不用 0,避免"恒等于 0"的假绿) global.youle_erqiwang.app = prevApp; return { desk, pj: desk.paiju_list[desk.paiju_list.length - 1], fapai: sent.filter(m => m.rpc === 'fapai') }; } const fp = firstFapai(); t.eq('发牌 fapai 带 step,且 = 牌局的真实阶段(1 叫分)', fp.fapai.map(m => m.data.step), [1, 1, 1]); t.eq('发牌 fapai.step 与 paiju.step 同源(不是写死的常量)', fp.fapai[0].data.step, fp.pj.step); t.eq('发牌 fapai 控制权 seat = 当前等待叫分者(firstseat=1)', fp.fapai.map(m => m.data.seat), [1, 1, 1]); t.eq('发牌 fapai.seat 与 get_callgrade_seat() 同源', fp.fapai[0].data.seat, fp.pj.method.get_callgrade_seat()); process.exit(t.done('desk') ? 0 : 1);