二七王:前端 CardCodec,cardId 转牌面帧号

清单 §0.4 的唯一权威转换:服务端花色段序与美术帧顺序相反,
转换把花色段反过来数。用清单给的 10 条样例逐条锁死,
另加两副牌同帧、值域、单射三组断言。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-26 19:56:32 +08:00
co-authored by Claude Opus 5
parent 3b9828c8ca
commit 65a73c5c2a
2 changed files with 79 additions and 0 deletions
@@ -0,0 +1,22 @@
///////////////////////////////////////////////////////////////
////////// EQW_CardCodec: 牌 id → 牌面资源帧号(纯逻辑)//////////
///////////////////////////////////////////////////////////////
// 清单 §0.4:牌面资源统一 10 列 × 6 行 = 60 帧,行优先编号
// 帧 1–13 黑桃 A–K / 14–26 红桃 / 27–39 梅花 / 40–52 方块
// 帧 53 小王 / 54 大王 / 55–60 牌背 1–6(二七王用帧 55)
// 服务端牌 id 的花色段序是 方块→梅花→红心→黑桃(class.pai.js:16),
// 与美术帧的花色顺序【正好相反】,转换必须把花色段反过来数。
// 【全前端只此一处实现】其余模块一律调用它,不得另写一份。
var EQW_CardCodec = EQW_CardCodec || {
//牌背帧号(二七王固定用牌背 1)
CARD_BACK_FRAME: 55,
//牌 id → 牌面资源帧号。deck1 与 deck2 的同一张牌共用同一帧(牌面完全相同)
cardIdToFrame: function (cardId) {
var n = cardId % 54; // 去掉副数
if (n === 52) { return 53; } // 小王
if (n === 53) { return 54; } // 大王
return (3 - Math.floor(n / 13)) * 13 + (n % 13) + 1;
}
};