Files
erqiwang_youle/client/js/01_SubGame/codes/config/Sprites_Result.js
T
joywayerandClaude Opus 5 6c339060bf 二七王:Sprites_Result.js 补 5 个 View 的布局说明注释
为 AsetResultView / ChongGuanOverlayView / AccountView / HistoryView /
MingPaiView 各补一块 JSDoc:分区标题标出 Layer 与 Group,正文含 ASCII 版式图
(小局结算三家光晕与底牌算式区、冲关叠加层三家牌位与遮罩、大局结算面板的
标题栏/玩家栏/规则栏/面板外按钮条、出牌历史与明牌的三排/两排版式),
另附元素说明、关闭方式对照、资源说明、精灵 ID 分配与 @see 出处。

纯注释改动,数据部分一字未动(精灵总数仍 378、布局节点仍 61)。
如实记下三处待补:判定结果动画 D-8 无设计稿;AccountView / HistoryView /
MingPaiView 尚无 EQW_Layout 布局节点,图中坐标为参考图目视实测。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 01:51:39 +08:00

495 lines
35 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////
////////// EQW_Sprites: 精灵结构(清单 §5.6/§5.6a/§5.7a/§5.7b 结算)
///////////////////////////////////////////////////////////////
// 子游戏精灵段 1001–2999。结构与 Sprites_Table.js 一致:
// View 下 Layer 为图层声明(一个 View 恰好一个图层),其余键是 group 容器;
// 容器内 id 为群组 ID、其余键才是精灵 id。
// 连号精灵逐条写全,不用循环生成。
var EQW_Sprites = EQW_Sprites || {};
// ============================================================================
// 小局结算面板 - Layer 302 (POPUP_ASET_RESULT), Group 240 (ASET_RESULT)
// ============================================================================
/**
* 小局结算面板 - AsetResultView
*
* 用途: 一小局打完后盖在牌桌之上,展示【埋牌底牌 + 扣底算式】与【三家得分】,
* 并给出「冲关牌型」「下一局」两个出口。本面板没有整块面板底图——
* 各元素直接摆在半透牌桌上(见参考图,牌桌仍隐约可见)。
*
* 布局说明(参考图 docs_dev/uiref/小局结算.png):
*
* ┌ 175,150 ─────────┐ ┌ 430,140 ────────────────┐ ┌ 865,150 ─────────┐
* │ │ │ ┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ │ │ │
* │ +20 │ │ └┘└┘└┘└┘└┘└┘└┘└┘ ×8 │ │ -10 │
* │ │ │ 叫分2子 底牌 20x0 │ │ │
* └──────────────────┘ └─────────────────────────┘ └──────────────────┘
* 牌局分 10 冲关分 10 牌局分 -5 冲关分 -5
* ↑ ↑ ↑ ↑
* RESULT_JF_LEFT RESULT_AW_LEFT RESULT_JF_RIGHT RESULT_AW_RIGHT
* (1808) (1811) (1809) (1812)
*
* ┌ 490,340 ─────────┐
* │ -10 │ ← RESULT_GLOW_SELF(1804) 光晕 225×100
* └──────────────────┘ RESULT_SCORE_SELF(1807) 总分大字
* 牌局分 -5 冲关分 -5 RESULT_JF_SELF(1810) / RESULT_AW_SELF(1813)
*
* ┌ 535,515 ────┐ ┌ 835,518 ───┐
* │ 冲关牌型 │ │ 下一局 │
* └─────────────┘ └────────────┘
* ↑ RESULT_BTN_CG(1815) ↑ RESULT_BTN_NEXT(1817)
* +_TEXT(1816) 183×63 +_TEXT(1818) 180×65
*
* 三家的位置与牌桌上各自的座位方位一致:左上家在左、右上家在右、自己在中央偏下。
* 底牌区面板 RESULT_BOTTOM_PANEL(1800) = point(430,140,420×148),
* 内含群组 215 的 8 张埋牌底牌(BuryCardsView,见 Sprites_Cards.js)与
* RESULT_BOTTOM_TEXT(1801)(attach 面板 center/bottom, offsetY=-14)。
*
* 每家一组三个数字(EQW_Layout.RESULT_GLOW / RESULT_SCORE_NUM / RESULT_JF_TEXT /
* RESULT_AW_TEXT,都用 bySeat 三变体):
* ┌───── 光晕 225×100 ─────┐
* │ +20 │ ← 总分大字:attach 光晕 center/middle
* └────────────────────────┘
* 牌局分 10 冲关分 10
* ↑ attach 光晕 left/bottom ↑ attach 光晕 right/bottom
* offset(-15,+24) offset(+15,+24)
*
* 元素说明:
* - 光晕帧: GLOW_RESULT 帧1=赢(橙) / 帧2=输(蓝),按该家 grade 的正负取帧。
* - 总分大字: 取 aset.seatlist[i].grade,正分橙带「+」、负分蓝带「-」;
* 按符号在 NUM_RESULT_WIN / NUM_RESULT_LOSE 两套资源里二选一绑定,
* 显示用 SpriteManager.setNumberImage(spriteId, '+20', charWidth)。
* 与大局结算的 ACC_TPL_SCORE_NUM(1914) 同一套资源与用法,两处得分显示保持一致。
* - 扣底文案: 格式「叫分{aset.multiple}子 底牌 {bottom.grade1}x{bottom.multiple}」——
* x 后面是【扣底倍数】(单张 ×1、主对 ×2、N 连对 ×2N)。闲家未扣底时 bottom 只有 cards,
* multiple/grade1/grade2 都不下发 → 倍数位显示 0(参考图的「底牌 20x0」即此情形)。
* - 【标签文案与字段】参考图两个小字标签已定案为「牌局分」/「冲关分」(清单 §1.8):
* 牌局分取 grade_jf(捡分子数得分)、冲关分取 grade_cg(算奖里的冲关分量,S-6 新增,
* 开傍王时不含傍王那部分)。精灵键名沿用早期的 _JF / _AW,与文案不完全同名,勿混。
* - 【判定结果不在本面板显示,D-8】大光/小光/过庄/升N级/投降由【动画】呈现,
* 故 1814 RESULT_JUDGE_TEXT 被判定不需要(见下方空号说明)。动画在两个时机播:
* 对局过程中 —— 依 curmultiple(随 chupai1/2/3 下发,带符号,S-8)档位跳变时提示
* 结算前 —— 依 aset.upgrade(带符号:3大光 2小光 1过庄 -N升N级 -99投降 0解散)
* 末轮打完、本面板出现【之前】播一次最终判定
* 【待设计稿】动画资源 EQW_Images.ANI_JUDGE(634) 帧数/尺寸待定,
* 播放参数在 EQW_Anim 里留白(AnimConstants.js 末尾「D-8 待补」)——本 View 无对应精灵。
* - 【容错】投降结算只有 aset、无 chupai 无 bottom → 面板必须容忍底牌区缺失,
* 不能因读不到 bottom.cards 就崩或显示空框。
* - 【时序】先 setXxx 把结算数据写进 this.data、再播动画;动画的开始/结束/出错回调里
* 只刷界面、不写核心数据。动画缺失或卡住时,面板与数据仍须正确。
*
* 资源说明:
* - 底牌区面板底: EQW_Images.PANEL_BOTTOM_CARDS (606), 1 帧, 420×148
* - 分数光晕: EQW_Images.GLOW_RESULT (607), 2 帧, 225×100, 帧1=赢(橙) 帧2=输(蓝)
* - 得分数字: EQW_Images.NUM_RESULT_WIN (632) / NUM_RESULT_LOSE (633),
* 各 16 帧固定帧序, 单字符 46×62, 整图 736×62;帧12=「+」帧13=「-」必出;
* charWidth 取 EQW_Layout.NUM_STYLE.RESULT_WIN / RESULT_LOSE.charWidth
* - 冲关牌型按钮: EQW_Images.BTN_CG_CARDS (542), 1 帧, 183×63, 蓝色渐变
* - 下一局按钮: EQW_Images.BTN_NEXT_ASET (541), 1 帧, 180×65, 金黄渐变
*
* 精灵ID分配: 1800–1813 / 1815–1818(群组 240);埋牌底牌 8 张复用群组 215(1258–1265)
*
* @see docs_dev/二七王-UI资源与精灵清单.md §1.8 末轮扣底 + 小局结算 / §5.6 / §6.9
* @see docs_dev/uiref/小局结算.png
*/
//小局结算面板(清单 §5.6,Layer 302 群组 240)
//
//以下键号在源清单中被显式判定「不需要」,本文件不占用,留空号以便追溯:
// 1814 RESULT_JUDGE_TEXT —— 结算面板不显示判定文字,改由动画呈现(§1.8,D-8)
EQW_Sprites.AsetResultView = {
Layer: EQW_Layers.POPUP_ASET_RESULT, //302
AsetResult: {
id: EQW_Groups.ASET_RESULT, //240
RESULT_BOTTOM_PANEL: 1800, //图片:底牌区面板底,资源 EQW_Images.PANEL_BOTTOM_CARDS
RESULT_BOTTOM_TEXT: 1801, //文字:「叫分{multiple}子 底牌 {grade1}x{bottom.multiple}」
//—— 三家分数光晕,资源 EQW_Images.GLOW_RESULT,帧1=赢(橙) 帧2=输(蓝) ——
RESULT_GLOW_LEFT: 1802,
RESULT_GLOW_RIGHT: 1803,
RESULT_GLOW_SELF: 1804,
//—— 三家总分(aset.seatlist[i].grade),多帧图数字精灵,正分橙带 `+`、负分蓝带 `-`,
// 资源 EQW_Images.NUM_RESULT_WIN(赢)/ NUM_RESULT_LOSE(输),按符号二选一绑资源,
// 显示用 SpriteManager.setNumberImage(spriteId, '+20', charWidth),charWidth 见
// EQW_Layout.NUM_STYLE.RESULT_WIN/RESULT_LOSE——与 ACC_TPL_SCORE_NUM(1914,大局结算总分)
// 同一套资源与用法,两处结算得分显示保持一致(2026-08-27 由文字精灵改为数字图精灵)——
RESULT_SCORE_LEFT: 1805,
RESULT_SCORE_RIGHT: 1806,
RESULT_SCORE_SELF: 1807,
//—— 三家捡分子数得分文字 grade_jf【T-13】——
RESULT_JF_LEFT: 1808,
RESULT_JF_RIGHT: 1809,
RESULT_JF_SELF: 1810,
//—— 三家算奖得分文字 grade_aw【T-13】——
RESULT_AW_LEFT: 1811,
RESULT_AW_RIGHT: 1812,
RESULT_AW_SELF: 1813,
RESULT_BTN_CG: 1815, //图片:「冲关牌型」按钮,资源 EQW_Images.BTN_CG_CARDS
RESULT_BTN_CG_TEXT: 1816, //文字:按钮文案「冲关牌型」
RESULT_BTN_NEXT: 1817, //图片:「下一局」按钮,资源 EQW_Images.BTN_NEXT_ASET
RESULT_BTN_NEXT_TEXT: 1818 //文字:按钮文案「下一局」
}
};
//> 底牌 8 张精灵复用 Sprites_Cards.js 群组 215(BuryCardsView.BuryCards,1258–1265),不在此重复。
// ============================================================================
// 冲关牌型叠加层 - Layer 302 (POPUP_ASET_RESULT), Group 244 (CHONGGUAN)
// ============================================================================
/**
* 冲关牌型叠加层 - ChongGuanOverlayView
*
* 用途: 在小局结算面板【之上】再盖一层半透黑遮罩,三家各摊开自己参与冲关的牌
* (aset.seatlist[i].cards),并在旁边标出奖数。点「冲关牌型」按钮打开。
*
* 布局说明(参考图 docs_dev/uiref/冲关牌型显示.png;牌的排布见
* EQW_Layout.CHONGGUAN_FAN: fan/horizontal, anchor center,
* 牌尺寸 CARD_SIZE.L 110×190, maxWidth=420, spacingMax=-40 spacingMin=-88):
*
* ┌──────────────────────────────────────────────────────────────┐ y=0
* │ ┌──┬──┬──┬────┐ ┌──┬──┬──┬────┐ │
* │ │K │K │K │ K │ │K │K │K │ K │ │ 260,120 / 1035,120
* │ └──┴──┴──┴────┘ └──┴──┴──┴────┘ │
* │ CG_BOX_LEFT(1821) CG_BOX_RIGHT(1822) │
* │ CG_COUNT_LEFT(1825) CG_COUNT_RIGHT(1826)│
* │ │
* │ (半透黑遮罩 CG_MASK(1820) 铺满全屏) │
* │ │
* │ ┌──┬──┬──┬────┐ │
* │ │K │K │K │ K │ ← CG_BOX_SELF(1823) 640,400│
* │ └──┴──┴──┴────┘ CG_COUNT_SELF(1827) │
* │ │
* │ ┌────────────┐ │
* │ │ 下一局 │ ← 遮罩之上│ 835,518
* │ └────────────┘ 仍可见可点│
* └──────────────────────────────────────────────────────────────┘ y=720
*
* 三家牌位与结算面板同方位:左上家、右上家在各自头像内侧,自己在中央偏下。
* 遮罩 EQW_Layout.CG_MASK = point(0,0,1280×720, opacity 0.72)。
*
* 元素说明:
* - 【牌用精灵复制,不预置固定张数】cards 长度不定——四王 + 一条长连对链 + 八个 7 +
* 八个 2 叠加时可达 20 余张,预置既可能不够、又在多数局里白占 ID。
* 编辑器里只需建 5 个精灵:3 个容器 + 1 个牌模板 + 1 个遮罩;奖数文字 3 个照常预置。
* 生成方式见下方原注释与清单 §5.6a 的代码片段(SpriteCopyUtils.create + setFrame)。
* - 【清理是硬要求】关闭叠加层 / 组件 onDestroy 时必须
* SpriteCopyUtils.removeRange(boxId, 0, cards.length),否则复制精灵残留。
* - 【关闭方式】遮罩本身就是关闭热区,点遮罩即关闭,不另设关闭按钮 →
* CG_MASK 必须注册点击事件;同时 RESULT_BTN_NEXT(1817/1818) 的层内层级须【高于】遮罩,
* 点它不被遮罩吃掉(「冲关牌型」按钮本身被遮住则无妨)。
* ⚠ 三个遮罩面板的关闭方式各不相同,别写混:
* 冲关牌型(本 View)→ 点遮罩关闭 遮罩可点
* 明牌 / 出牌历史 → 点遮罩关闭,明牌另可再点按钮切换 遮罩可点
* 亮牌 → 仅自动时长,到点自动收起 遮罩【不】注册点击
* - 奖数取 aset.seatlist[i].naward(该家总奖数,支付基数);chongguan / wang 可作明细选展。
* 前端【不重算冲关】,一律直接取服务端下发值。
*
* 资源说明:
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(出 1 张小图即可,拉伸满 1280×720)
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
*
* 精灵ID分配: 1820–1827(群组 244)
*
* @see docs_dev/二七王-UI资源与精灵清单.md §1.8「冲关」是什么 / §5.6a / §6.7
* @see docs_dev/uiref/冲关牌型显示.png
*/
//冲关牌型叠加层(清单 §5.6a,Layer 302 群组 244,精灵复制)——
//本层的牌用 SpriteCopyUtils 运行时复制,不预置固定张数(cards 长度不定,最多可达 20 余张)。
//编辑器里只需建 5 个精灵(3 容器 + 1 牌模板 + 1 遮罩);奖数文字 3 个照常预置。
//RESULT_BTN_NEXT(1817/1818)在遮罩之上仍需可见可点,其图层内层级须高于 CG_MASK。
//清理是硬要求:关闭叠加层/组件 onDestroy 时必须 SpriteCopyUtils.removeRange(boxId, 0, cards.length),否则复制精灵残留。
EQW_Sprites.ChongGuanOverlayView = {
Layer: EQW_Layers.POPUP_ASET_RESULT, //302
ChongGuan: {
id: EQW_Groups.CHONGGUAN, //244
CG_MASK: 1820, //图片:半透黑遮罩(拉伸满屏,兼作点击关闭热区),资源 EQW_Images.MASK_DIM
CG_BOX_LEFT: 1821, //容器:左上家冲关牌容器(SpriteCopyUtils 复制的父精灵)
CG_BOX_RIGHT: 1822, //容器:右上家冲关牌容器
CG_BOX_SELF: 1823, //容器:自己冲关牌容器
CG_CARD_TPL: 1824, //模板:冲关牌模板(编辑器里放好、默认隐藏,只作样式来源),资源 EQW_Images.CARD_FACE_L
//—— 三家奖数文字,与该家的冲关牌并列显示,取 aset.seatlist[i].naward ——
CG_COUNT_LEFT: 1825,
CG_COUNT_RIGHT: 1826,
CG_COUNT_SELF: 1827
}
};
// ============================================================================
// 大局总结算 / 解散结算 - Layer 303 (POPUP_ACCOUNT), Group 241 (ACCOUNT)
// ============================================================================
/**
* 大局总结算 / 解散结算 - AccountView
*
* 用途: 打完最后一局(或房间解散)时弹出的总账面板:标题栏 + 三条玩家栏 + 规则栏,
* 面板【外】底部另有 4 个功能按钮。解散结算复用同一面板,只是 aset 各项为 0。
*
* 布局说明(参考图 docs_dev/uiref/大局结算.png;面板居中于 1280×720,
* 实测约 x≈80–1180, y≈88–620,按钮条 y≈640–700):
*
* ┌──────────────────────────────────────────────────────────┐ ← ACC_TITLE_BAR(1901)
* │ 二七王-3人 房号654216 共24局 2025-12-14 11:45 [×] │ 1100×56,青绿底
* ├──────────────────────────────────────────────────────────┤ ↑ACC_TITLE_TEXT(1902)
* │ │ ↑ACC_BTN_CLOSE(1903)
* │ ⑴ [头像] 玩家1 基础分30 算奖分12 傍王分15 +135 │ ← 玩家栏(复制生成)
* │ ID:100001 总得分30 │
* │ ──────────────────────────────────────────────────────── │ ← ACC_TPL_DIVIDER(1915)
* │ ⑵ [头像] 玩家2 基础分-30 算奖分-12 傍王分-15 -45 │
* │ ID:100002 总得分-30 │
* │ ──────────────────────────────────────────────────────── │
* │ ⑶ [头像] 玩家3 …… -45 │
* │ │
* ├──────────────────────────────────────────────────────────┤ ← ACC_RULE_BAR(1904)
* │ 规则:可查牌、傍王、爬坡算子 │ 1100×62,浅绿底
* └──────────────────────────────────────────────────────────┘ ↑ACC_RULE_TEXT(1905)
* ↑ ACC_PANEL_BG(1900) 圆角浅灰绿 1100×540(标题栏与规则栏是它的上下封边)
*
* ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ← 面板【外】底部
* │ 再来一局 │ │ 分享好友 │ │ 复制战绩 │ │ 退出房间 │ 各 190×60
* └──────────┘ └──────────┘ └──────────┘ └──────────┘
* (1920/21) (1922/23) (1924/25) (1926/27)
* 黄 蓝 蓝 红
*
* 单条玩家栏的列序(左→右):
* 名次徽章 → 头像 → 昵称 /「ID:{playerid}」(两行) → 「基础分{n}」/「总得分{n}」(两行)
* → 「冲关分{n}」→「傍王分{n}」→ 右侧总分大字
* ⚠ 参考图第三列小字写的是「算奖分」,清单 §1.9 定案的字段是 grade_cg_total(冲关分);
* 四项 grade_jf_total / grade_cg_total / grade_bw_total 之和恒等于 score(S-6)。
*
* 元素说明:
* - 【玩家栏用精灵复制】三条结构完全相同、仅数据不同,用 SpriteCopyUtils 从 5 个模板
* (ACC_TPL_RANK / AVATAR / TEXT / SCORE_NUM / DIVIDER)复制生成;面板外壳与按钮预置。
* tag 分段见下方原注释;关闭面板时按各段 removeRange 清理。
* - 名次徽章按总分排名取帧(1金 / 2橙 / 3蓝,花瓣形)。
* - 总分大字与小局结算的 RESULT_SCORE_* 同一套资源与用法:正分橙带「+」、负分蓝带「-」,
* setNumberImage 走 TEXT/WIDTH 属性,_validateSpriteId 也接受复制精灵的字符串 ID,
* 故复制出来的玩家栏总分同样【一个精灵显示整串】。
* - 规则栏文案据 roomtype 位串拼出已启用项,不硬编码。
* - 【解散结算】投递方式与小局结算完全不同(协议 §14.1):rpc 是平台的 free_room、
* route 是 room,真实取值路径是 data.deskfree.data.aset / .account(多一层 data 包装),
* 且 data.deskfree 可能缺失(开战后、首局发牌前解散)→ 前端必须容忍。
* 解散的申请/投票/同意拒绝界面【由平台全包】(Layer 420),子游戏不做投票界面。
* - 【无布局节点·待补】Layout_Result.js 目前只配了小局结算与冲关遮罩,本 View 的
* ACC_* 一个布局节点都没有——上图坐标是参考图目视实测,尚未落进 EQW_Layout。
* 实现前须先补齐布局配置,不得在渲染代码里就地硬编码坐标(零裸值红线)。
*
* 资源说明:
* - 面板底: EQW_Images.PANEL_ACCOUNT (610), 1 帧, 1100×540, 圆角浅灰绿
* - 标题栏: EQW_Images.BAR_ACCOUNT_TITLE (611), 1 帧, 1100×56, 青绿底含圆角上沿
* - 规则栏: EQW_Images.BAR_ACCOUNT_RULE (612), 1 帧, 1100×62, 浅绿底含圆角下沿
* - 关闭钮: EQW_Images.BTN_ACC_CLOSE (547), 1 帧, 36×36
* - 名次徽章: EQW_Images.BADGE_RANK (579), 3 帧, 44×44, 帧=名次 1–3
* - 分隔线: EQW_Images.LINE_DIVIDER (613), 1 帧, 1060×2
* - 总分数字: EQW_Images.NUM_RESULT_WIN (632) / NUM_RESULT_LOSE (633), 16 帧, 单字符 46×62
* - 四个按钮: EQW_Images.BTN_ACCOUNT_AGAIN (543) / SHARE (544) / COPY (545) / EXIT (546),
* 各 1 帧, 190×60
*
* 精灵ID分配: 1900–1905 / 1910–1915 / 1920–1927(群组 241)
*
* @see docs_dev/二七王-UI资源与精灵清单.md §1.9 大局总结算 / §1.10 解散结算 / §5.7a
* @see docs_dev/uiref/大局结算.png
*/
//大局总结算 / 解散结算(清单 §5.7a,Layer 303 群组 241,玩家栏用精灵复制)——
//三条玩家栏结构完全相同、仅数据不同,用 SpriteCopyUtils 复制生成;面板外壳与按钮预置。
//tag 分段(SpriteCopyUtils.createTagManager):rank 1–20 / avatar 21–40 / text 41–140(每行 6 条文字)/ score 141–160 / divider 161–180。
//清理:关闭面板时按各段 removeRange。
//解散结算复用本面板(协议 §14.1,解散包也带 account),只是 aset 各项为 0。
EQW_Sprites.AccountView = {
Layer: EQW_Layers.POPUP_ACCOUNT, //303
Account: {
id: EQW_Groups.ACCOUNT, //241
ACC_PANEL_BG: 1900, //图片:面板底(圆角浅灰绿),资源 EQW_Images.PANEL_ACCOUNT
ACC_TITLE_BAR: 1901, //图片:标题栏(青绿底),资源 EQW_Images.BAR_ACCOUNT_TITLE
ACC_TITLE_TEXT: 1902, //文字:「二七王-3人 房号… 共…局 …」
ACC_BTN_CLOSE: 1903, //图片:右上角关闭按钮,资源 EQW_Images.BTN_ACC_CLOSE
ACC_RULE_BAR: 1904, //图片:底部规则栏(浅绿底),资源 EQW_Images.BAR_ACCOUNT_RULE
ACC_RULE_TEXT: 1905, //文字:「规则:可查牌、傍王、爬坡算子」
ACC_ROW_CONTAINER: 1910, //容器:玩家栏的复制父精灵
//—— 玩家栏复制模板(tag 分段见上)——
ACC_TPL_RANK: 1911, //模板:名次徽章,资源 EQW_Images.BADGE_RANK,帧=名次1–3
ACC_TPL_AVATAR: 1912, //模板:头像,运行时贴玩家头像
ACC_TPL_TEXT: 1913, //模板:通用文字(昵称/ID/各项分数,一行一个)
ACC_TPL_SCORE_NUM: 1914, //模板:右侧总分大字(多帧图数字精灵),资源 EQW_Images.NUM_RESULT_WIN / NUM_RESULT_LOSE,
//显示用 SpriteManager.setNumberImage(复制精灵ID, '+120', charWidth)——
//setNumberImage 走的是 TEXT/WIDTH 属性,_validateSpriteId 也接受复制精灵的字符串 ID,
//故复制出来的玩家栏总分同样一个精灵显示整串(2026-08-26 核对)
ACC_TPL_DIVIDER: 1915, //模板:行间分隔线,资源 EQW_Images.LINE_DIVIDER
//—— 底部 4 个功能按钮 ——
ACC_BTN_AGAIN: 1920, //图片:「再来一局」按钮,资源 EQW_Images.BTN_ACCOUNT_AGAIN
ACC_BTN_AGAIN_TEXT: 1921, //文字:按钮文案「再来一局」
ACC_BTN_SHARE: 1922, //图片:「分享好友」按钮,资源 EQW_Images.BTN_ACCOUNT_SHARE
ACC_BTN_SHARE_TEXT: 1923, //文字:按钮文案「分享好友」
ACC_BTN_COPY: 1924, //图片:「复制战绩」按钮,资源 EQW_Images.BTN_ACCOUNT_COPY
ACC_BTN_COPY_TEXT: 1925, //文字:按钮文案「复制战绩」
ACC_BTN_EXIT: 1926, //图片:「退出房间」按钮,资源 EQW_Images.BTN_ACCOUNT_EXIT
ACC_BTN_EXIT_TEXT: 1927 //文字:按钮文案「退出房间」
}
};
// ============================================================================
// 出牌历史 / 上一轮 / 亮牌 - Layer 304 (POPUP_HISTORY), Group 242 (HISTORY)
// ============================================================================
/**
* 出牌历史 / 上一轮 / 亮牌 - HistoryView
*
* 用途: 半透黑遮罩 + 每家一排牌的查看面板,【一套精灵三种用途】,只换数据源:
* 出牌历史 = pushlist 全部轮次摊平聚合到各家,三排
* 上一轮 = pushlist 末尾一项,三排
* 亮牌 = liangpai.cards(庄家的固定主牌),只用一排
*
* 布局说明(版式照 docs_dev/uiref/冲关牌型显示.png——本 View 与 MingPaiView、
* ChongGuanOverlayView 三者是同一种版式:遮罩 + 每家一排重叠排列的大牌):
*
* ┌──────────────────────────────────────────────────────────────┐ y=0
* │ ┌──┬──┬──┬──┬────┐ ┌──┬──┬──┬──┬────┐ │
* │ │K │K │K │K │ K │ │K │K │K │K │ K │ │
* │ └──┴──┴──┴──┴────┘ └──┴──┴──┴──┴────┘ │
* │ ↑CG_BOX 位同左上家 ↑位同右上家 │
* │ HIST_BOX_LEFT(1951) HIST_BOX_RIGHT(1952) │
* │ HIST_LABEL_LEFT(1955) HIST_LABEL_RIGHT(1956)│
* │ │
* │ (半透黑遮罩 HIST_MASK(1950) 铺满全屏,兼关闭热区)│
* │ │
* │ ┌──┬──┬──┬──┬────┐ │
* │ │K │K │K │K │ K │ ← HIST_BOX_SELF(1953) │
* │ └──┴──┴──┴──┴────┘ HIST_LABEL_SELF(1957) │
* └──────────────────────────────────────────────────────────────┘ y=720
*
* 三排的落点与各自座位方位一致(左上家在左、右上家在右、自己中央偏下),
* 与 ChongGuanOverlayView 同构;【亮牌】只显示庄家那一排,其余两个容器隐藏。
*
* 元素说明:
* - 【牌用精灵复制】张数不定(出牌历史摊平后可达整手 28 张以上),
* 编辑器里只建 1 个遮罩 + 3 个容器 + 1 个牌模板 + 3 个座位标签文字。
* 关闭 / onDestroy 时必须 removeRange 清理复制精灵。
* - 出牌历史与上一轮【仅可查牌模式】;不可查牌模式下底栏那两个按钮整体不出现。
* 数据在出牌过程中由前端逐包(chupai1/2/3)自行累积,重连时从 pushlist 恢复。
* - 出牌历史【不按轮次分组】(D-7 已定):每家出过的牌全部摊平聚合到该玩家名下,
* 再按手牌那套主牌序排序,三家各一排。前端自行摊平 + 排序,不需要改服务端。
* - 【亮牌的关闭方式与其余两个面板不同】:只按自动时长关闭
* (EQW_Anim.LIANGPAI_AUTO_CLOSE = 3000,清单原文时长「默认值待定」,现值为起始估值),
* 遮罩【不注册点击事件】;而出牌历史 / 上一轮是点遮罩关闭。同一批精灵、两种关闭策略,
* 实现时按用途分别挂事件,别写混。
* - 【亮牌时机 T-34 已定】埋牌后、出牌前——庄家埋牌完成、服务端下发 maipai 包(带 liangpai)
* 时弹出,出牌开始前收起;只有【闲家】会收到并弹出,庄家自己不弹。
* 一次性弹出、不是常驻入口;不阻塞出牌,若面板还开着就收到出牌推送,直接收起即可。
* - 【与 MingPaiView 的关系】版式相同、渲染逻辑可共用,但数据独立、图层不同
* (304 vs 305),故拆成两个 View——一个 View 恰好一个图层。
* - 【无布局节点·待补】Layout_*.js 里没有 HIST_* 布局节点;牌排可参照
* EQW_Layout.CHONGGUAN_FAN 的同构参数,实现前须补齐配置,不在渲染代码里硬编码坐标。
*
* 资源说明:
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(与冲关/明牌共用)
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
*
* 精灵ID分配: 1950–1957(群组 242)
*
* @see docs_dev/二七王-UI资源与精灵清单.md §1.6 亮牌 / §1.7 出牌历史 / §5.7b
* @see docs_dev/uiref/冲关牌型显示.png
*/
//出牌历史 / 上一轮 / 亮牌(清单 §5.7b,Layer 304,群组 242,牌用精灵复制)——
//三家都显示,数据 = pushlist 摊平聚合到各家(§1.7 D-7);上一轮同一套精灵,只取 pushlist 末尾一项;
//亮牌只显示一排(庄家固定主牌),数据 = liangpai.cards(§1.6),复用同一套遮罩+容器+牌模板,仅数据源与排数不同。
//与下方 MingPaiView(Layer 305)版式相同(遮罩 + 每家一排牌),差别只在数据源与家数,两个 View 共用同一套渲染逻辑,
//但各自数据独立、图层不同,故拆成两个 View(一个 View 恰好一个图层)。
EQW_Sprites.HistoryView = {
Layer: EQW_Layers.POPUP_HISTORY, //304
History: {
id: EQW_Groups.HISTORY, //242
HIST_MASK: 1950, //图片:半透黑遮罩(兼关闭热区),资源 EQW_Images.MASK_DIM
HIST_BOX_LEFT: 1951, //容器:左上家牌容器
HIST_BOX_RIGHT: 1952, //容器:右上家牌容器
HIST_BOX_SELF: 1953, //容器:自己牌容器
HIST_CARD_TPL: 1954, //模板:牌模板,资源 EQW_Images.CARD_FACE_L
HIST_LABEL_LEFT: 1955, //文字:左上家座位标签(昵称/张数)
HIST_LABEL_RIGHT: 1956, //文字:右上家座位标签
HIST_LABEL_SELF: 1957 //文字:自己座位标签
}
};
// ============================================================================
// 明牌面板 - Layer 305 (POPUP_MINGPAI), Group 243 (MINGPAI)
// ============================================================================
/**
* 明牌面板 - MingPaiView
*
* 用途: 半透黑遮罩 + 【另两家】各一排牌,展示他们手中全部未出主牌的具体牌面。
* 与 HistoryView 版式相同,差别只在数据源与家数(明牌只看他家,没有自己那排)。
*
* 布局说明(版式照 docs_dev/uiref/冲关牌型显示.png,去掉中央偏下的自己那一排):
*
* ┌──────────────────────────────────────────────────────────────┐ y=0
* │ ┌──┬──┬──┬──┬────┐ ┌──┬──┬──┬──┬────┐ │
* │ │K │K │K │K │ K │ │K │K │K │K │ K │ │
* │ └──┴──┴──┴──┴────┘ └──┴──┴──┴──┴────┘ │
* │ ↑ MING_BOX_A(2001) ↑ MING_BOX_B(2002) │
* │ MING_LABEL_A(2004) MING_LABEL_B(2005) │
* │ │
* │ (半透黑遮罩 MING_MASK(2000) 铺满全屏,兼关闭热区) │
* │ │
* │ (自己那排不存在——自己的牌自己看得见) │
* │ │
* └──────────────────────────────────────────────────────────────┘ y=720
*
* A / B 两个容器分别落在两个他家的方位(左上 / 右上),与 HistoryView 的
* HIST_BOX_LEFT / HIST_BOX_RIGHT 同位;牌用 CARD_FACE_L 重叠排列(fan)。
*
* 元素说明:
* - 【按钮显示条件 D-6 已定,按 design 手册】可查牌模式 + 出牌阶段 +
* 【场上已有任一玩家报无主】(baozhu == 1) → 三家都显示「明牌」按钮,可随时查看、不限次数。
* 判定的是「场上有人报无主」,不是「自己报无主」——报无主的那位自己也能看。
* - 交互: 点按钮 → 发 mingpai { seat } → 收 mingpai { seat, others:[{seat, zhucards}] }
* → 弹出本面板。【再点一次取消是纯前端开关】,不再请求服务端。
* - 关闭方式: 点遮罩关闭;另可再点底栏按钮切换(与亮牌的「仅自动时长关闭」不同)。
* - 【牌用精灵复制】张数不定;编辑器里只建 1 遮罩 + 2 容器 + 1 牌模板 + 2 标签文字。
* 关闭 / onDestroy 时必须 removeRange 清理。
* - 【为什么与 HistoryView 拆成两个 View】版式相同、渲染逻辑可共用,但两者数据独立、
* 图层不同(304 vs 305);本项目约定「一个 View 恰好一个图层」,故各自成 View。
* - 【无布局节点·待补】Layout_*.js 里没有 MING_* 布局节点,同 HistoryView 的说明。
*
* 资源说明:
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(与冲关/出牌历史共用同一资源)
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
*
* 精灵ID分配: 2000–2005(群组 243)
*
* @see docs_dev/二七王-UI资源与精灵清单.md §1.7 明牌(D-6)/ §2.6 底栏 / §5.7b
* @see docs_dev/uiref/冲关牌型显示.png
*/
//明牌(清单 §5.7b,Layer 305,群组 243,牌用精灵复制)——
//只显示另两家,数据 = mingpai.others[].zhucards(§1.7 D-6);
//版式与上方 HistoryView(Layer 304)相同(遮罩 + 每家一排牌),差别只在数据源与家数,两个 View 共用同一套渲染逻辑,
//但各自数据独立、图层不同,故拆成两个 View(一个 View 恰好一个图层)。
EQW_Sprites.MingPaiView = {
Layer: EQW_Layers.POPUP_MINGPAI, //305
MingPai: {
id: EQW_Groups.MINGPAI, //243
MING_MASK: 2000, //图片:明牌遮罩,资源 EQW_Images.MASK_DIM
MING_BOX_A: 2001, //容器:另一家A牌容器
MING_BOX_B: 2002, //容器:另一家B牌容器
MING_CARD_TPL: 2003, //模板:牌模板,资源 EQW_Images.CARD_FACE_L
MING_LABEL_A: 2004, //文字:A座位标签
MING_LABEL_B: 2005 //文字:B座位标签
}
};