diff --git a/docs_dev/uiref/亮主.png b/docs_dev/uiref/亮主.png new file mode 100644 index 0000000..4a92467 Binary files /dev/null and b/docs_dev/uiref/亮主.png differ diff --git a/docs_dev/uiref/出牌.png b/docs_dev/uiref/出牌.png new file mode 100644 index 0000000..6699f1c Binary files /dev/null and b/docs_dev/uiref/出牌.png differ diff --git a/docs_dev/uiref/出牌2.png b/docs_dev/uiref/出牌2.png new file mode 100644 index 0000000..7579fdf Binary files /dev/null and b/docs_dev/uiref/出牌2.png differ diff --git a/docs_dev/uiref/叫分确定庄.png b/docs_dev/uiref/叫分确定庄.png new file mode 100644 index 0000000..c0e5bf4 Binary files /dev/null and b/docs_dev/uiref/叫分确定庄.png differ diff --git a/docs_dev/uiref/小局结算.png b/docs_dev/uiref/小局结算.png new file mode 100644 index 0000000..caadf8a Binary files /dev/null and b/docs_dev/uiref/小局结算.png differ diff --git a/docs_dev/uiref/庄家埋牌.png b/docs_dev/uiref/庄家埋牌.png new file mode 100644 index 0000000..654654d Binary files /dev/null and b/docs_dev/uiref/庄家埋牌.png differ diff --git a/docs_dev/uiref/等待叫分.png b/docs_dev/uiref/等待叫分.png new file mode 100644 index 0000000..65eb9e2 Binary files /dev/null and b/docs_dev/uiref/等待叫分.png differ diff --git a/docs_dev/uiref/自己叫分.png b/docs_dev/uiref/自己叫分.png new file mode 100644 index 0000000..649ffe3 Binary files /dev/null and b/docs_dev/uiref/自己叫分.png differ diff --git a/docs_dev/uiref/自己已经叫分轮到下家叫分.png b/docs_dev/uiref/自己已经叫分轮到下家叫分.png new file mode 100644 index 0000000..f11f5fb Binary files /dev/null and b/docs_dev/uiref/自己已经叫分轮到下家叫分.png differ diff --git a/docs_dev/二七王-UI资源与精灵清单.md b/docs_dev/二七王-UI资源与精灵清单.md new file mode 100644 index 0000000..d7d05ea --- /dev/null +++ b/docs_dev/二七王-UI资源与精灵清单.md @@ -0,0 +1,1047 @@ +# 二七王 · 前端 UI 资源与精灵清单 + +> **本文用途**:把二七王的完整游戏流程翻译成「前端需要哪些图片资源、声音、精灵、图层、群组、坐标」的**可执行规格书**,供美术出图与 gameabc 编辑器建资源使用。 +> +> **本文不是代码**。文中给出的 ID 是**规划建议值**(相应号段已核实为空闲,见 §0.3),用途是指导在编辑器里按此建立;**代码里引用的 ID 必须与编辑器中实际建成的完全一致**,若编辑器实际取值与本文不同,**以编辑器为准并回头修订本文**。前端红线明令「绝不编造 ID」,指的就是代码侧。 +> +> **权威源**:玩法规则以 `server/games/erqiwang/docs/design/design.md` 为准;下发字段以 `server/games/erqiwang/docs/protocol/packet_protocol.md` 为准;前端规范以 `docs/client/development-guide/` 为准。本文只做「规则/协议 → 界面资源」的映射,**不重新定义规则**。 +> +> **参考图**:`./uiref/*.png`,共 9 张,设计分辨率 1280×720。 + +--- + +## 目录 + +- [0. 总则](#0-总则) + - [0.1 设计基准与座位映射](#01-设计基准与座位映射) + - [0.2 平台已提供、子游戏不重建的部分](#02-平台已提供子游戏不重建的部分) + - [0.3 ID 号段规划](#03-id-号段规划) + - [0.4 牌面资源与 cardId → 帧号映射(唯一权威转换)](#04-牌面资源与-cardid--帧号映射唯一权威转换) + - [0.5 标注约定](#05-标注约定) +- [1. 按阶段的界面清单](#1-按阶段的界面清单) +- [2. 常驻 UI](#2-常驻-ui) +- [3. 图片资源总表](#3-图片资源总表) +- [4. 声音资源总表](#4-声音资源总表) +- [5. 精灵结构表](#5-精灵结构表) +- [6. 布局坐标表](#6-布局坐标表) +- [7. 待补充清单](#7-待补充清单) + +--- + +## 0. 总则 + +### 0.1 设计基准与座位映射 + +| 项 | 值 | 来源 | +| --- | --- | --- | +| 设计分辨率 | **1280 × 720** | `client/output/gameabc_Project.json` `ScreenWidth/ScreenHeight`;9 张参考图均为此尺寸 | +| 适配模式 | `ScreenFitMode: 1` | 同上 | +| 帧率 | 30 fps | 同上 | +| 玩家数 | **3 人** | design §2(三家各摸 28 张) | + +**座位映射**:服务端座位是绝对序号 `0/1/2`;前端一律把**自己**放在底部,另两家按 design §4 的**逆时针**顺序分居左上、右上。 + +``` + 右上 = (mySeat + 1) % 3 左上 = (mySeat + 2) % 3 + ┌───────────┐ + [左上玩家] │ 桌面中央 │ [右上玩家] + └───────────┘ + [ 自己 · 底部 ] +``` + +**方向已定论**(`server/games/erqiwang/class.paiju.js:264`): + +```js +get_nextseat: function(seat){ return (seat + 1) % 3; } +``` + +即**下家 = `(seat + 1) % 3`**。逆时针出牌在屏幕视觉上「下家在右手边」(时钟 6 点逆时针走向 3 点),与中式牌桌「下家 = 右手边」的惯例一致。因此: + +| 显示位 | 座位 | +| --- | --- | +| 底部(自己) | `mySeat` | +| **右上(下家)** | `(mySeat + 1) % 3` | +| **左上(上家)** | `(mySeat + 2) % 3` | + +本文各表均按此书写。轮庄「顺延到其下家」(design §4.6)走的也是同一个 `get_nextseat`。 + +### 0.2 平台已提供、子游戏不重建的部分 + +参考图里有若干元素来自平台框架,**美术不必重复出图、编辑器不必重复建精灵**: + +| 元素 | 平台提供方式 | 精灵/资源 | 子游戏要做的 | +| --- | --- | --- | --- | +| 头像框 / 头像 / 昵称 / 分数 | `02_SubGame_Input.js` 转发壳 `updatePlayerInfoUI` 的 D 类默认渲染 | 底框 `346+ind`、头像框 `376+ind`、昵称 `406+ind`、分数 `436+ind`、头像图 `116+ind`、群组 `43+ind` | 只在 `01_SubGame_modify.js` 配置区调 `Game_Modify.PLAYER_INFO_LAYOUT` 的坐标(三人局用 ind0 南 / ind1 东 / ind3 西) | +| 桌面聊天气泡 / 语音气泡 | 同上,`ShowChat` / `gameui_play_voice` / `gameui_stop_voice` | 聊天 背景 `552+ind` 文字 `582+ind`;语音 背景 `612+ind` 内容 `642+ind` | 只调 `Game_Modify.BUBBLE_LAYOUT` 坐标 | +| 右侧语音圆钮 / 聊天圆钮 | 平台外壳 | 参考图右侧 (1210,310)/(1210,385) 两枚圆钮 | 无(仅坐标核对) | +| Loading / Message / Confirm 全局弹窗 | 框架 `UIManager` 全局 UI | 由子游戏在 `UIManager.init` 注入精灵常量 | 若要用,需**另建**这三套弹窗精灵并注入;不用则跳过 | +| 战绩列表 | 框架 `RecordView` 组件 + 平台入口精灵 `13` | `gameabc-framework/ui/RecordView.js` | 提供 `RecordView` 配置;战绩数据结构见协议「gameinfo1 / gameinfo2」 | +| 帮助界面 | 平台 `GameUI.OpenHelp()`,入口精灵 `150` | —— | 提供二七王玩法说明文案 | +| 创建房间界面**骨架** | 平台界面 + 约定精灵 `25`(确认/提交按钮) | 见 `01_SubGame_modify.js` 顶部注释 | **规则选项区要子游戏自建**(§1.1):渲染 5 个开关行、拼 `roomtype` 串、注册 25 号点击后 `Net.Send_create_room` | + +> ⚠️ 参考图底栏左侧的「头像 + 玩家昵称 + 10 + 庄」一行里,**头像/昵称/分数是平台的**,只有 **`庄` 印章**是二七王专属、需子游戏新建。左上/右上玩家位同理:头像框是平台的,**`庄` 印章、`主N`、`对N` 角标、状态文字**是子游戏的。 + +### 0.3 ID 号段规划 + +**占用现状核实**(读 `client/output/gameabc_*.json`,日期 2026-08-24): + +| 类别 | 已占用 | 子游戏合法段 | 段内空闲情况 | +| --- | --- | --- | --- | +| 精灵 ObjectID | 1–3292 中 991 个 | **1001–3000** | 段内**仅 `3000` 被占**(`Spirit3000`,Layer 602 `inputPannel`,群组 87)→ 实际可用 **1001–2999** | +| 图层 LayerID | 1–29, 50, 202, 402–420, 601–620 | 101–200 / 301–400 / 501–600 / 701+ | **全部空闲** | +| 群组 GroupID | 0–79 | ≥ 201 | **全部空闲** | +| 图片资源 ID | 1–439 | ≥ 501 | **全部空闲** | +| 声音资源 ID | 1–5 | ≥ 101 | **全部空闲** | + +**二七王的分段规划**: + +#### 图层(Layer) + +| 图层 | 名称 | 用途 | +| --- | --- | --- | +| **101** | `EQW_Table_Static` | 牌桌常驻:顶部信息条、玩家位附加标记、亮牌信息条、底栏(局数 + 功能钮) | +| **102** | `EQW_Hand` | 自己手牌区(单排 / 埋牌双排) | +| **103** | `EQW_TableCards` | 桌面牌:暗牌区、三家已出牌区、底牌展示区 | +| **104** | `EQW_Action` | 阶段操作区:叫分面板、选主/投降面板、埋牌/出牌操作条、倒计时 | +| **105** | `EQW_Overlay` | 桌面浮层:提示气泡、报无主、甩错、捡分飘字、70 分暗牌亮 3 秒 | +| **302** | `EQW_Popup_AsetResult` | 小局结算 | +| **303** | `EQW_Popup_Account` | 大局总结算 / 解散结算 | +| **304** | `EQW_Popup_History` | 出牌历史面板 | +| **305** | `EQW_Popup_MingPai` | 明牌面板 | +| **306** | `EQW_Popup_Disband` | 解散投票面板 —— **T-2:是否由平台提供待确认** | + +> 建房规则选项区(§1.1)的精灵挂在**平台创建房间界面所在的图层**上,不新开图层;具体图层号需在编辑器里查证后回填(T-3)。 + +#### 群组(Group) + +| 群组 | 用途 | +| --- | --- | +| 201 | 顶部信息条(主 / 叫分 / 抓分) | +| 202 / 203 / 204 | 左上家 / 右上家 / 自己 的附加标记(庄印章、主N对N、状态文字) | +| 205 | 底栏功能按钮组(明牌 / 已出牌 / 上一轮 / 底牌) | +| 206 | 亮牌信息条 | +| 210 | 自己手牌 | +| 211 | 暗牌区(8 张) | +| 212 / 213 / 214 | 自己 / 左上家 / 右上家 的已出牌区 | +| 215 | 底牌展示区(结算时 8 张) | +| 220 | 叫分面板 | +| 221 | 选主 / 投降面板 | +| 222 | 埋牌操作条 | +| 223 | 出牌操作条 | +| 224 | 倒计时(三位置) | +| 230 | 桌面浮层(气泡 / 飘字 / 报无主 / 甩错) | +| 240 | 小局结算 | +| 241 | 大局总结算 | +| 242 | 出牌历史 | +| 243 | 明牌面板 | +| 250 | 建房规则选项 | + +#### 精灵(Sprite,1001–2999) + +| 号段 | 用途 | 预估用量 | +| --- | --- | --- | +| 1001–1099 | 顶部信息条 + 亮牌条 + 底栏(局数、功能钮) | ~30 | +| 1100–1199 | 三家玩家位附加标记 + 三处倒计时 | ~24 | +| 1200–1249 | 自己手牌 36 张 + 牌上标记 | ~45 | +| 1250–1299 | 暗牌 8 张 + 底牌 8 张 | 16 | +| 1300–1399 | 自己已出牌区(28 张 + 牌型标签) | ~30 | +| 1400–1499 | 左上家已出牌区(28 张 + 牌型标签) | ~30 | +| 1500–1599 | 右上家已出牌区(28 张 + 牌型标签) | ~30 | +| 1600–1649 | 叫分面板 | ~46 | +| 1650–1699 | 选主 / 投降面板 | ~21 | +| 1700–1749 | 埋牌 / 出牌操作条 | ~8 | +| 1750–1799 | 桌面浮层(气泡 / 飘字 / 报无主 / 甩错) | ~15 | +| 1800–1899 | 小局结算 | ~30 | +| 1900–1949 | 大局总结算 / 解散结算 | 待设计 | +| 1950–1999 | 出牌历史面板 | 待设计 | +| 2000–2049 | 明牌面板 | 待设计 | +| 2050–2099 | 建房规则选项 | ~20 | +| 2100–2999 | **预留** | —— | + +#### 图片资源(Image,≥501) + +| 号段 | 用途 | +| --- | --- | +| 501–510 | 牌面(3 套尺寸,见 §0.4) | +| 511–530 | 花色图标(小 / 大两种尺寸) | +| 531–570 | 按钮类 | +| 571–600 | 标记类(庄印章、角标底、牌型标签、选中标记等) | +| 601–630 | 面板底图 / 光晕 | +| 631–650 | 数字与符号图 | +| 651–680 | 提示气泡 / 报无主 / 甩错 | +| 681–700 | 建房选项控件 | +| 701+ | 预留 | + +#### 声音(Voice,≥101) + +见 §4,整节标【待确认】。 + +### 0.4 牌面资源与 cardId → 帧号映射(唯一权威转换) + +#### 帧排列(通用规范,跨游戏统一) + +牌面资源统一按 **10 列 × 6 行 = 60 帧**排版,行优先编号: + +| 帧 | 内容 | +| --- | --- | +| 1–13 | **黑桃** A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K | +| 14–26 | **红桃** A – K | +| 27–39 | **梅花** A – K | +| 40–52 | **方块** A – K | +| 53 | 小王 | +| 54 | 大王 | +| 55–60 | **牌背 1 – 6**(预留多套牌背,二七王使用帧 **55**) | + +二七王规则去掉了 3 和 4(design §2),因此**不引用**帧 `3, 4, 16, 17, 29, 30, 42, 43`;但资源仍按 60 帧通用排版**照常出图**,不留空、不重排——这套排版是所有牌类游戏共用的。 + +#### cardId → 帧号(前端只此一处实现) + +服务端牌 id 的编码(`server/games/erqiwang/class.paiju.js:57`): + +``` +id = (deck - 1) * 54 + (flower - 1) * 13 + (number - 1) // deck 1..2, flower 1..4, number 1..13(1=A) +小王 id = (deck - 1) * 54 + 52 +大王 id = (deck - 1) * 54 + 53 +``` + +服务端 `flower` 编号是 **1 = 方块、2 = 梅花、3 = 红心、4 = 黑桃**(`class.pai.js:16`、协议 §6),因此 id 的花色段序为 **方块 → 梅花 → 红心 → 黑桃**,与美术帧的花色顺序(黑桃 → 红桃 → 梅花 → 方块)**正好相反**。点数在段内是一致的(都 A → K)。转换必须把花色段反过来数: + +```js +// 唯一权威转换:cardId → 牌面资源帧号。全前端只此一处实现,其余模块调用它。 +function cardIdToFrame(cardId) { + var n = cardId % 54; // 去掉副数,deck1 / deck2 共用同一帧 + if (n === 52) { return 53; } // 小王 + if (n === 53) { return 54; } // 大王 + return (3 - Math.floor(n / 13)) * 13 + (n % 13) + 1; +} +var CARD_BACK_FRAME = 55; // 牌背(二七王固定用牌背 1) +``` + +**校验样例**(建资源后必须逐条对上): + +| cardId (deck1) | 牌 | `n = id % 54` | 期望帧 | +| --- | --- | --- | --- | +| 0 | 方块 A | 0 | **40** | +| 4 | 方块 5 | 4 | **44** | +| 12 | 方块 K | 12 | **52** | +| 13 | 梅花 A | 13 | **27** | +| 26 | 红桃 A | 26 | **14** | +| 39 | 黑桃 A | 39 | **1** | +| 51 | 黑桃 K | 51 | **13** | +| 52 | 小王 | 52 | **53** | +| 53 | 大王 | 53 | **54** | +| 106 | 小王(deck2) | 52 | **53** | + +> deck1 与 deck2 的同一张牌**共用同一帧**(牌面完全相同)。区分两副牌靠 `cardId` 本身,不靠帧。 + +#### 三套尺寸 + +按 client 02 §2「不同显示区域尺寸不同,各自用一个独立资源 ID」的要求,开 3 套: + +| 资源 ID | 键名 | 用途 | 单帧尺寸 | 整图尺寸 (10×6) | +| --- | --- | --- | --- | --- | +| 501 | `CARD_FACE_L` | 自己手牌、暗牌区 | **110 × 190** | 1100 × 1140 | +| 502 | `CARD_FACE_M` | 三家已出牌区 | **90 × 155** | 900 × 930 | +| 503 | `CARD_FACE_S` | 结算底牌区 | **50 × 70** | 500 × 420 | + +> 单帧尺寸为参考图实测估值(§6),出图前请与最终设计稿核对。三套的**帧排列完全一致**,只有尺寸不同,`cardIdToFrame` 对三套通用。 + +### 0.5 标注约定 + +| 标记 | 含义 | +| --- | --- | +| 【图】 | 该界面/元素在 `./uiref/` 有参考图,规格按图写 | +| 【待设计】 | 流程/协议要求存在,但**尚无设计稿**,本文只列出「必须有什么」,具体视觉待美术出稿后补 | +| 【待确认】 | 规格本身尚未定论,需与规则设计者/美术确认,编号见 §7 | + +--- + +## 1. 按阶段的界面清单 + +本节按 design §12.3 的阶段顺序走,每节说明**该阶段收哪些包、渲染什么、哪些 UI 显隐**。资源与精灵的完整表在 §3 / §5,本节只引用不重复。 + +``` +建房(§1.1) → 发牌(§1.2) → 叫分坐庄(§1.3) → 看暗牌·上庄(§1.4) → 选主/投降(§1.5) → 埋牌(§1.6) + → 出牌对局(§1.7) → 末轮扣底 + 小局结算(§1.8) → 大局结算(§1.9) → 解散(§1.10) → 重连(§1.11) +``` + +### 1.1 建房 / 房间设置 【待设计】 + +**平台提供界面骨架 + 确认按钮(精灵 25);子游戏提供规则选项区。** + +要渲染 5 个开关行,对应 `roomtype` 定长位串(协议 §0.5): + +| 位 | 选项 | `'0'` | `'1'` | 附带展示 | +| --- | --- | --- | --- | --- | +| 0 | 局数 | 6 局 | 12 局 | 需联动显示房卡消耗 | +| 1 | 扣卡方式 | 房主扣卡 | AA 每人扣卡 | 同上 | +| 2 | 傍王 | 关 | 开 | design §8.3 | +| 3 | 爬坡 | 常规算子 | 爬坡 | design §7.3 | +| 4 | 查牌模式 | 可查牌 | 不查牌 | design §9 | + +房卡消耗联动(协议 §0.5):房主扣卡 6 局 = 2 张 / 12 局 = 4 张;AA 制 6 局 = 每人 1 张 / 12 局 = 每人 2 张。 + +- 交互:点击 25 号精灵 → 拼 `roomtype` 串 → `Net.Send_create_room({agentid, playerid, gameid, roomtype})`。 +- 精灵:群组 250,号段 2050–2099。 +- 资源:选项勾选框(2 帧:未选 / 已选)、选项行底、说明文字。 +- **注意**:`roomtype` 的拼串必须只在**一处**实现(对应服务端 `class.config.js` `parse()` 的 SSOT 要求),不得在多处按下标硬拼。 + +### 1.2 发牌 `fapai` 【图:等待叫分.png】 + +**收包字段**:`asetidx`(当前局数)、`asetcount`(总局数)、`cards`(自己 28 张)、`seat`(当前等待叫分者)、`countdown`。 + +**渲染**: + +| 要做的事 | 涉及 UI | +| --- | --- | +| 底栏局数显示 `1/4 局` | §2.6 底栏 · 局数文字 | +| 自己手牌 28 张,按主牌顺序排序后铺开 | §2.7 手牌区(群组 210) | +| 桌面中央 8 张暗牌**背面** | 暗牌区(群组 211,帧 = 牌背 55) | +| 顶部信息条清零:主 = 无、叫分 = 0、抓分 = 0 | §2.1 顶部信息条 | +| 三家玩家位状态文字清空,`主N/对N` 角标隐藏 | §2.2 玩家位附加标记 | +| 倒计时显示在 `seat` 对应的位置 | §2.4 倒计时 | + +- **发牌动画**【待确认 T-4】:是否需要逐张飞入动画。若做,须遵守 client 02 §3「数据优先、表现延后」——先 `setHandCards()` 写数据,再播动画;动画回调里只刷界面、不写数据。 +- **排序**:手牌排序规则(主牌在左还是在右、副牌花色顺序)由前端自行决定,**但选主前后主牌集合会变**,选主后必须重排。见 §7 T-5。 + +### 1.3 叫分坐庄 `jiaofen` 【图:等待叫分.png / 自己叫分.png / 自己已经叫分轮到下家叫分.png】 + +**收包字段**:`seat`(叫分者)、`call`(0 = 不叫)、`currcall`(当前叫到的分)、`multiple`(该叫分对应基础子数)、`nextseat`、`countdown`。 + +**三种界面状态**: + +| 状态 | 参考图 | 表现 | +| --- | --- | --- | +| 等待他家叫分 | `等待叫分.png` | 中央保持 8 张暗牌背面;倒计时数字显示在**当前叫分者**的位置旁;已叫分的玩家位显示金色 `60分` 大字,未叫的为空 | +| 轮到自己叫分 | `自己叫分.png` | 中央弹出**叫分面板**(14 档按钮,两行 × 7)+ `不叫` 按钮;顶部一条提示 `70分坐庄才可投降`;倒计时移到自己操作区 | +| 自己已叫、轮到下家 | `自己已经叫分轮到下家叫分.png` | 叫分面板收起,中央显示自己刚叫的 `50分` 金色大字;已表态的玩家位显示 `不叫` 白色大字 | + +**叫分面板规格**(群组 220,号段 1600–1649): + +- 14 档:`70 65 60 55 50 45 40 35 30 25 20 15 10 5`,两行 × 7(行1 = 70…40,行2 = 35…5)。 +- 每档 3 个精灵:按钮底(多帧,见下)+ 分数文字 + **子数角标文字**。 +- 角标显示该档的 `multiple`,**随房间「爬坡」开关取值**(协议 §3): + - 常规算子:65→2、60→3、55→4、**50 及以下统一 →6**、70→2 + - 爬坡:65→2、60→3、55→4、50→6、45→7、40→8、35→9、30→10、25→11、20→12、15→13、10→14、5→15、70→2 +- 按钮底帧:**帧1 = 可选(亮黄)、帧2 = 不可选(灰)、帧3 = 高亮/当前**【待确认 T-6:参考图第二行为橙色,含义待定】。 +- 可选性规则(design §4.2,**由服务端权威 `currcall` 决定,前端只据其置灰、不自行推导规则**): + - 暂定庄家首叫:5–70 全部可选,**无 `不叫`**; + - 其后:只有**严格低于 `currcall`** 的档位可选,`不叫` 可选。 +- 交互:点击某档 → 发 `jiaofen { seat, call }`;点 `不叫` → 发 `jiaofen { seat, call: 0 }`。 +- **悲观 UI**:点击后**只发包**,面板的收起与状态文字的出现一律等 `jiaofen` 推送包到达再做(前端 05 §6)。唯一允许的乐观处理是按钮本身的防连点禁用。 + +**上方提示条** `70分坐庄才可投降`:静态文字条,仅在叫分面板展开时显示。 + +### 1.4 看暗牌 / 上庄 `shangzhuang` 【部分待设计】 + +**收包字段**:`seat`、`call`、`banker`、`grade`(庄家叫分)、`multiple`、`bottomcards`、`ancard3s`、`cards`、`countdown`、`touxiang`。 + +| 分支 | 条件 | 表现 | +| --- | --- | --- | +| 常规坐庄 | 无 `ancard3s` | 庄家收到 `bottomcards`(8 张)与 `cards`(36 张)→ 暗牌翻正面短暂展示后并入手牌;闲家**收不到** `bottomcards`,暗牌区直接收起 | +| **70 分坐庄** | `ancard3s === 1` | **全场三家都收到 `bottomcards`** → 8 张暗牌翻正面**向所有玩家亮 3 秒**(design §4/§7.1),3 秒后庄家摸入手牌、闲家侧收起 | + +- **70 分亮 3 秒** 【待设计】:需要一个覆盖提示(如「70 分坐庄 · 暗牌公示」标题 + 3 秒倒计时),图层 105 群组 230。 +- 上庄后统一更新:顶部信息条 `叫分` 列 = `grade`、角标 = `multiple`;`banker` 对应玩家位显示 **`庄` 印章**(含底栏自己位)。 +- 三处 `庄` 印章是三个独立精灵(左上 / 右上 / 底栏),按 `banker` 显隐其一。 +- **重连不重放**:协议明确 70 分的 3 秒亮牌是上庄时的一次性事件,`deskinfo` 重连**不重放**——前端不得在重连时补播。 + +### 1.5 选主 / 投降 `xuanzhu` · `touxiang` 【图:亮主.png】 + +**同一决策点、二选一、互斥**(design §4.4)。 + +**选主面板规格**(群组 221,号段 1650–1699): + +- 标题斜角条:`亮主` 金色字 + 倒计时数字。 +- **4 个花色按钮**,每个含 4 个精灵:按钮底 + 花色大图标 + **中央大数字** + **右上角蓝色角标**。 + - 中央大数字 = 该花色在庄家 36 张手牌中的**总张数**【待确认 T-7:参考图为 6/8/6/7,与角标 `2对` 并存,推定为张数】 + - 右上角标 = 该花色的**对子数**(design §4/§11 明确要求) + - **两个数字都由前端据 `MyCards`/`cards` 自行统计**,协议 §「ChooseMain」明确「服务端不额外下发」。 +- **投降按钮**:仅 `touxiang === 1`(即叫分 70)时显示,与 4 个花色按钮并列。 +- 交互:点花色 → `xuanzhu { seat, flower }`(flower:1方块 2梅花 3红心 4黑桃);点投降 → `touxiang { seat }`。 +- **投降的后果**:直接跳到结算(§1.8),**不选主、不埋牌、不出牌**。 + +**收到 `xuanzhu` 推送后**(字段 `banker`、`flower`、`countdown`、`cards`): +- 顶部信息条 `主` 列显示 `flower` 对应的花色图标; +- **手牌必须按新的主牌集合重排**(正2/正7 升格为主牌,见 design §3); +- 选主面板收起,进入埋牌。 + +### 1.6 埋牌 `maipai` 【图:庄家埋牌.png】 + +**仅庄家**,闲家此阶段等待。 + +**界面变化**: +- 手牌从**单排 36 张**改为**双排**(上排 17 + 下排 19,实测估值)。 +- 操作条(群组 222):`提示` 按钮 + 倒计时 + **`埋牌 (N/8)`** 按钮,N 为已选张数,`N < 8` 时按钮置灰不可提交。 +- 选中的牌**上浮**表示待埋。 +- 参考图中牌面上有 `拖` 红色圆标、⭐橙星、🔵蓝星等标记 —— 推定为「提示」功能标出的牌型分组【待确认 T-8:标记种类与含义未定义于 design/协议】。 + +**收到 `maipai` 推送后**(字段 `cards`、`bottomcards`、`seat`、`countdown`、`liangpai`): +- 庄家手牌回到单排 28 张; +- **闲家**若收到 `liangpai`(仅可查牌模式 + 庄家达标),渲染 §2.5 亮牌信息条; +- 进入出牌,`seat` = 首出者(必为庄家)。 + +**亮牌信息条内容**(design §8.2,协议 `liangpai`): + +| 字段 | 触发条件 | 展示 | +| --- | --- | --- | +| `zhu` / `zhupair` / `zhutuo` | 固定主牌(王+2+7)总数 ≥ 10 | 如 `12 张主,3 对主带 1 拖` | +| `wang` | 王 ≥ 3 | 如 `3 张王` | +| `qi` | 7 ≥ 6 | 如 `6 张 7` | +| `er` | 2 ≥ 6 | 如 `6 张 2` | + +多条同时满足时组合展示。参考图显示为 `主牌对子: 1对` —— 文案与上表不完全对应【待确认 T-9】。 + +### 1.7 出牌对局 `chupai1` / `chupai2` / `chupai3` 【图:出牌.png / 出牌2.png】 + +这是最复杂的阶段。 + +**出牌操作条**(群组 223):倒计时 + `出牌` 按钮(选中牌数为 0 时置灰)。参考图另有 `提示` 按钮(埋牌图里出现,出牌阶段是否保留待确认 T-10)。 + +**自己出牌**:点手牌选中(上浮)→ 点 `出牌` → 发 `chupai { seat, cards }`。 +- `cards` 必须是**非空、元素为 0–107 整数、互不重复**的数组(协议 §0.2),否则服务端按 `PARAM` 拒绝。 +- **只发意图,不发结论**:不回传牌型、不回传「我最大」之类判定。 +- 前端可用 `shared/` 做本地预校验与提示,**结果不回传**。 + +**收 `chupai1`(首家出牌)**,字段最丰富: + +| 字段 | 渲染用途 | +| --- | --- | +| `seat` / `cards` | 在该家已出牌区摆牌(资源 `CARD_FACE_M`) | +| `cardtype` | 牌型标签(`>100` 单张 / `>200` 对子 / `>300` 拖拉机) | +| `shuai` | **甩牌**分量构成 `{tractors:[], pairs, singles}`——**甩牌的真实结构只能读它,不得据 `cardtype` 反推**(协议 §11 明确警告) | +| `shuaicuo` | **甩错**标志(= 1):整套甩牌收回,本轮只强制打出最小一张(design §5.4.5);需要一个「甩错」提示表现【待设计】 | +| `flower` / `count` | 本轮首出花色与张数,供本地跟牌提示 | +| `nextseat` / `countdown` | 倒计时移到下一家 | +| `seatlist` | **仅可查牌模式**:三家牌况,用于 §2.2 的 `主N` / `对N` 角标 | +| `baozhu` | 是否已有玩家**报无主**:= 1 时显示各家主牌数/对数,并让底栏 `明牌` 按钮可用 | +| `cardsinhand` | **仅出牌者本人有**:出牌后剩余手牌,据此重画手牌区 | + +**收 `chupai2` / `chupai3`**:字段类似,`chupai3` 额外带 `maxseat`(本轮谁最大)与 `grade`(本轮闲家得分,仅闲家有得分时才有)。 + +**一轮结束的表现**: +- `maxseat` 高亮,随后三家出牌区收牌; +- 若有 `grade`,播捡分飘字(`+20分` 金色,参考图 `出牌2.png` 中央 `20分`)→ 同时更新顶部信息条 `抓分` 列累计值; +- 下一轮由 `maxseat` 先出。 + +**牌型标签**(参考图 `出牌2.png` 左下角橙色 `拖拉机`):需要一套标签资源,至少含 `单张` / `对子` / `拖拉机` / `甩牌` / `毙` / `垫`【待确认 T-11:标签种类以美术稿为准;「毙/垫/混合出牌」是否也要标】。 + +**闲家提示 `tishi`**(design §11): +- 闲家在出牌阶段可向**对家**(另一闲家)发三种提示:`1 = 踩`(我能大过庄家)、`2 = 没分`、`3 = 有分`。 +- 发送方**收不到成功回执**(协议 §13.7),只有失败才回包 → **前端不得在点击时乐观显示自己发过提示**。 +- 接收方(对家)收到 `tishi { seat, tip }` → 在发送者的玩家位弹出气泡。 +- 庄家无对家,不提供此功能。 +- 需要 3 种气泡资源 + 一个发起入口【待设计:入口在哪、长什么样,参考图未出现】。 + +**报无主**(design §5.4.2 / §9): +- 任一玩家主牌出空 → 服务端 `baozhu = 1` 并整表刷新 `seatlist`; +- **仅可查牌模式**下,为**全体三人**显示另外两家的主牌数量与对子数(§2.2 的 `主N` / `对N` 角标); +- 需要一个「报无主」提示表现【待设计】。 + +**明牌**(design §9.3): +- 仅可查牌模式 + 出牌阶段 + 已报无主时,底栏 `明牌` 按钮可用; +- 点击 → 发 `mingpai { seat }` → 收 `mingpai { seat, others: [{seat, zhucards}] }` → 弹出面板展示另两家全部未出主牌的**具体牌面**; +- **再点一次取消是纯前端开关**,不再请求服务端(协议 §13.6)。 +- 面板:图层 305,群组 243【待设计】。 + +**出牌历史**(design §9.1): +- 仅可查牌模式;底栏 `已出牌` / `上一轮` 按钮; +- 数据来自重连包 `pushlist`(按轮次 × 3 家),**出牌过程中前端需自行累积**(`chupai1/2/3` 逐包记录); +- 面板:图层 304,群组 242【待设计】。 +- **不可查牌模式下这两个按钮必须整体不出现**(design §9)。 + +**失败回包**(协议 §0.2):任何请求被拒都会回同名 rpc 的 `{ success: false, errcode }`。前端一律 `if (!data.success)` 判断,据 `errcode` 提示: + +| errcode | 含义 | 建议提示 | +| --- | --- | --- | +| 1 PLAYER | 玩家/房间/座位校验不过 | 「身份校验失败」 | +| 2 NODESK | 牌桌或牌局不存在 | 「牌局不存在」 | +| 3 STEP | 当前阶段不允许 | 「当前阶段不能这样操作」 | +| 4 SEAT | 位置不符 / 还没轮到 | 「还没轮到你」 | +| 5 PARAM | 参数非法 | 「出牌数据有误」 | +| 6 RULE | 规则不允许 | 「这样出不符合规则」 | + +复用框架 `UIManager.showMessage`,无需专门资源。 + +### 1.8 末轮扣底 + 小局结算 `jiesuan` 【图:小局结算.png】 + +**结算包三种来源**(协议 §14):正常出牌结算(`chupai` + `bottom` + `aset`)、投降结算(只 `aset`)、解散结算(见 §1.10,投递方式完全不同)。 + +**扣底表现**(`bottom` 分组,design §6.3): +- `cards`(8 张底牌)**恒有** → 底牌区(群组 215,资源 `CARD_FACE_S`)翻开展示,design §11 明确「牌局结束需要亮出底牌」; +- `multiple` / `grade1` / `grade2` **仅闲家扣底时才有** → 展示 `底牌 20 × 4` 之类的翻倍算式。 +- 参考图底牌面板下方文字为 `叫分2子 底牌 20x0`,即 `叫分{multiple}子 底牌 {grade1}x{multiple}`【待确认 T-12:`x0` 说明该局闲家未扣底,此时的文案规则待定】。 + +**三家结算数字**(`aset.seatlist`,每家): +- 大字总分 = `grade`(本局总分,`+20` 橙色 / `-10` 蓝色) +- 下方两个小字 = `grade_jf`(捡分子数得分)与 `grade_aw`(算奖得分) +- 参考图两个标签都写作 `牌局分`,属 mock 重复【待确认 T-13:两个标签的正式文案】 + +**`aset` 其余字段的用途**: + +| 字段 | 用途 | +| --- | --- | +| `banker` / `call` / `flower` | 顶部信息条最终态 | +| `multiple` | 基础子数 | +| `grade` | 闲家最终捡分(含扣底)→ 顶部 `抓分` 列 | +| `upgrade` | **判定倍率(带符号)**:`3` 大光 / `2` 小光 / `1` 过庄 / `-N` 升 N 级(倒庄)/ `-99` 投降 / `0` 解散 → 需要一组判定文字或图标:`大光` `小光` `过庄` `升N级` `投降`【待设计】 | +| `bangwang` / `climb` | 本局规则开关,用于结算面板上标注 | +| `cards` / `chongguan` / `wang` / `naward` | 算奖明细展示【待确认 T-14:结算面板是否展示算奖明细,参考图未体现】 | + +**投降结算**:只有 `aset`,无 `chupai`、无 `bottom` → 结算面板必须容忍**底牌区缺失**,不能因为读不到 `bottom.cards` 就崩或显示空框。 + +### 1.9 大局总结算 `account` 【待设计】 + +- 仅当打到最后一局(`idx >= asetcount`)时,`jiesuan` 包才带 `account` 分组。 +- 结构:`[[累积得分, [每局得分...]], ...]` 三家。 +- 界面:图层 303,群组 241 —— 需要一张三家 × N 局的成绩表【待设计】。 + +### 1.10 解散结算 `free_room` 【待设计】 + +**投递方式与 §1.8 完全不同**(协议 §14.1),前端必须单独处理: + +``` +{ app:"youle", route:"room", rpc:"free_room", + data:{ seats:[], deskfree:{ rpc:"jiesuan", data:{ success, aset, account } } } } +``` + +- **rpc 是平台的 `free_room`、route 是 `room`**,不是 `erqiwang/jiesuan`; +- 真实取值路径是 **`data.deskfree.data.aset`** 与 `data.deskfree.data.account`(多一层 `data` 包装); +- 外层 `data.success` 由平台填,子游戏的 `success` 在 `data.deskfree.data.success`; +- 解散局 `aset.multiple = 0`、`upgrade = 0`、各家 `grade = 0`,`account` 恒有; +- **`data.deskfree` 可能缺失**(开战后、首局发牌前解散时 `get_disbandRoom` 返回 `null`)→ 前端必须容忍。 + +界面复用 §1.9 的大局总结算面板。解散**投票**界面是否由平台提供,见 T-2。 + +### 1.11 断线重连 `deskinfo` + +**不新增任何界面**。重连的本质是「恢复数据 → 调各 UI 组件 set-refresh 恢复界面」,**复用与正常流程完全相同的一条重画路径**(前端 04 §3.3 / 05 §6)。 + +平台把 `deskinfo` 挂在 `pack.data.deskinfo` 下,按当前 `step` 只带对应分组: + +| `step` | 分组 | 恢复到 §1.x | +| --- | --- | --- | +| 1 | `CallRun`(`seat` / `countdown` / `nowcall` / `multiple` / `call[3]`) | §1.3 叫分 | +| 2 | `ChooseMain`(`banker` / `call` / `multiple` / `countdown` / `bottomcards` 仅庄家 / `touxiang`) | §1.5 选主 | +| 3 | `BuryCards`(+ `flower`) | §1.6 埋牌 | +| 5 | `PushCards`(`playproc` / `seatlist` / `liangpai` / `pushlist` / `grade` / `gradecards` / `bottomcards` 仅庄家) | §1.7 出牌 | +| 6 | `Balance`(`readystate` / `aset`) | §1.8 结算 | + +另有 `count` / `idx` / `PlayerInfo[3]` / `MyCards` 全阶段通用。 + +**关键点**: +- `playproc.cards`(当前轮桌面上的牌)**两种查牌模式下都有** —— 否则后出的人无从跟牌; +- `pushlist`(往轮历史)与 `seatlist` **仅可查牌模式有** —— 不查牌模式下前端不得渲染出牌历史; +- 70 分的 3 秒亮暗牌**不重放**; +- **验收判据**(前端 05 §6.2):任意时刻丢弃 `this.data`、仅凭最近一次服务端快照重画,界面必须完全一致。做不到即「前端私存了状态」或「服务端漏发了字段」,两者都要修。 + +### 1.12 准备 `zhunbei` + +小局结算后各家点准备进入下一局。收 `zhunbei { seat }` → 该家玩家位显示「已准备」标记【待设计:参考图未出现,可能复用平台准备标识,见 T-15】。 + +--- + +## 2. 常驻 UI + +跨阶段常驻的部件,图层 101。 + +### 2.1 顶部信息条 【图:全部】 + +位置 x≈486–762, y≈4–72。三列表格式。 + +| 列 | 表头 | 数据 | 数据来源 | +| --- | --- | --- | --- | +| 1 | `主` | 花色图标 | `xuanzhu.flower` / `aset.flower`(1方块 2梅花 3红心 4黑桃);选主前显示占位 | +| 2 | `叫分`(绿字) | 分数 + 蓝色角标 | `shangzhuang.grade` + `multiple` | +| 3 | `抓分`(橙字) | 分数 + 橙色角标 | 闲家累计捡分(逐轮 `chupai3.grade` 累加,结算时以 `aset.grade` 为准) | + +【待确认 T-16】:`抓分` 列的角标在 `等待叫分.png` 里是 `1子`、在 `小局结算.png` 里是 `1倍`,两图不一致。推定为 `aset.upgrade` 判定倍率(仅结算后有意义),需确认。 + +- 精灵:群组 201,号段 1001–1029。 +- 资源:表格底图、花色小图标(4 帧)、角标底(2 种配色)。 + +### 2.2 玩家位附加标记 【图:全部】 + +**平台负责头像/昵称/分数**(§0.2),子游戏在其旁叠加: + +| 元素 | 数据来源 | 显隐规则 | +| --- | --- | --- | +| **`庄` 印章** | `shangzhuang.banker` / `aset.banker` | 三家各一个精灵,按 `banker` 显隐其一(含底栏自己位) | +| **`主N` 角标**(黄底黑字) | `seatlist[seat][4][0]` 剩余主牌数 | **仅可查牌模式 + 已报无主**;初始 `[-1,-1]` 时隐藏 | +| **`对N` 角标**(白底黑字) | `seatlist[seat][4][1]` 剩余主对数 | 同上 | +| **状态文字区** | 叫分阶段:`60分` 金色 / `不叫` 白色 | 叫分阶段显示,进入选主后清空 | + +- 精灵:群组 202(左上)/ 203(右上)/ 204(自己),号段 1100–1149。 + +### 2.3 已出牌区 【图:出牌2.png】 + +三家各一个区域,展示本轮打出的牌(资源 `CARD_FACE_M`)。 + +- 自己:中央偏下,x≈565–735, y≈265–420 +- 右上家:x≈945–1100, y≈120–280 +- 左上家:对称位置(参考图未出现,按对称推) +- 每张牌可叠加角标:`庄`(橙色斜标)、`大`(大王圆标)等 +- 区域左下角:**牌型标签**(`拖拉机` 等,§1.7) +- **每家预置 28 个牌精灵**(= 单次出牌张数上限,甩牌最多可甩满手牌)。号段每家 100 个,容量充裕,因此**不使用动态复制精灵**,避免 `SpriteCopyUtils` 的清理负担。 +- 精灵:群组 212 / 213 / 214,号段 1300–1599。 + +### 2.4 倒计时 【图:多张】 + +参考图里倒计时数字(`12` / `15` / `20`)出现在**当前操作者的位置旁**: +- 轮到左上家 → 左上家头像右侧(x≈195–270, y≈165–235) +- 轮到自己 → 自己操作区左侧(x≈445–520, y≈345–400) +- 轮到右上家 → 对称位置 + +因此建 **3 个倒计时精灵**,按当前操作者显隐其一。 + +- 数据来源:各包的 `countdown`。 +- **只做展示,不触发任何操作**(design §11 / 协议 §0.3):倒计时归零后**不自动叫分/选主/埋牌/出牌**,也不判负、不跳过。前端**不得**在归零时做任何乐观界面推进(不跳阶段、不清控制权),一切仍等服务端推送。 +- 归零后的表现【待确认 T-17】:显示 `0` 还是隐藏。 +- 精灵:群组 224,号段 1150–1159。 + +### 2.5 亮牌信息条 【图:多张】 + +位置 x≈35–245, y≈400–435,深色半透圆角条,内容见 §1.6 的 `liangpai` 表。 + +- **仅闲家 + 可查牌模式 + 庄家达标**时显示;不查牌模式下**一律不出现**。 +- 精灵:群组 206,号段 1030–1039。 + +### 2.6 底栏 【图:全部】 + +y≈648–720 深色条。左侧头像/昵称/分数由平台渲染(§0.2),子游戏负责: + +| 元素 | 位置(实测估值) | 显隐规则 | +| --- | --- | --- | +| `庄` 印章 | x≈338–370 | 自己是庄时显示 | +| 局数 `1/4 局` | 居中 x≈635–700 | 常驻,`asetidx / asetcount` | +| `明牌` 按钮 | x≈876–950, y≈672–702 | **仅可查牌模式 + 出牌阶段 + 已报无主** | +| `已出牌` 按钮 | x≈965–1052 | **仅可查牌模式 + 出牌阶段** | +| `上一轮` 按钮 | x≈1067–1160 | 同上 | +| `底牌` 按钮 | x≈1172–1250 | 常驻【待确认 T-18:庄家看自己埋的底牌?闲家点了看什么?】 | + +- 精灵:群组 205,号段 1040–1069。 + +### 2.7 手牌区 【图:全部】 + +| 形态 | 张数 | 位置(实测估值) | +| --- | --- | --- | +| **单排**(叫分 / 出牌) | 最多 36 | y≈455–645,x≈35–1250,重叠排列 | +| **双排**(庄家埋牌) | 36(17 + 19) | 上排 y≈285–455,下排 y≈455–645 | + +- 建 **36 个手牌精灵**(庄家摸暗牌后的上限),资源 `CARD_FACE_L`。 +- 张数少于 36 时隐藏多余精灵并重算间距。 +- 选中态:牌**上浮**(Y 偏移),另可叠加选中标记。 +- 牌上标记(`拖` 圆标、⭐、🔵)见 T-8。 +- 精灵:群组 210,号段 1200–1249。 + +--- + +## 3. 图片资源总表 + +> 给美术清点用。**按钮一律只出 1 帧普通态**——点击的缩放/透明反馈由框架统一处理(client 02 §2)。 +> 尺寸列为参考图实测估值,出图前请与最终设计稿核对。 + +### 3.1 牌面(3 套,见 §0.4) + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 单帧尺寸 | 整图 | +| --- | --- | --- | --- | --- | --- | --- | +| 501 | `CARD_FACE_L` | 手牌、暗牌 | **60** | 见 §0.4 帧表(10×6 通用排版) | 110 × 190 | 1100 × 1140 | +| 502 | `CARD_FACE_M` | 已出牌区 | **60** | 同上 | 90 × 155 | 900 × 930 | +| 503 | `CARD_FACE_S` | 结算底牌区 | **60** | 同上 | 50 × 70 | 500 × 420 | + +### 3.2 花色图标 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 511 | `SUIT_ICON_S` | 顶部信息条 `主` 列 | 4 | 帧1=方块♦ 帧2=梅花♣ 帧3=红心♥ 帧4=黑桃♠(**按服务端 flower 编号 1–4 排序**) | 30 × 30 | +| 512 | `SUIT_ICON_L` | 选主面板花色按钮 | 4 | 同上排序 | 46 × 46 | + +> ⚠️ 花色图标的帧序按**服务端 flower 编号**(1方块 2梅花 3红心 4黑桃),与牌面资源的花色顺序**不同**。两者互不换算,各自独立。 + +### 3.3 按钮 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 531 | `BTN_CALL_SCORE` | 叫分档位按钮底 | 3 | 帧1=可选(亮黄) 帧2=不可选(灰) 帧3=高亮(橙)【T-6】 | 74 × 56 | +| 532 | `BTN_NO_CALL` | `不叫` | 1 | 蓝色渐变 | 184 × 57 | +| 533 | `BTN_SUIT_CHOOSE` | 选主花色按钮底 | 1 | 金黄底 | 128 × 55 | +| 534 | `BTN_SURRENDER` | `投降` | 1 | 金黄底 | 128 × 55 | +| 535 | `BTN_TIP` | `提示` | 1 | 蓝色渐变 | 180 × 63 | +| 536 | `BTN_BURY` | `埋牌 (N/8)` | 2 | 帧1=可提交(金黄) 帧2=置灰(未满 8 张) | 180 × 63 | +| 537 | `BTN_PLAY` | `出牌` | 2 | 帧1=可出 帧2=置灰 | 157 × 55 | +| 538 | `BTN_BOTTOM_FUNC` | 底栏功能钮底(明牌/已出牌/上一轮/底牌共用) | 1 | 深色圆角 | 88 × 30 | +| 539 | `BTN_READY` | 准备【T-15】 | 1 | 待设计 | 待定 | +| 540 | `BTN_TISHI_ENTRY` | 踩/没分/有分 发起入口【待设计】 | 待定 | 待定 | 待定 | + +### 3.4 标记类 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 571 | `MARK_BANKER` | `庄` 红色印章 | 1 | —— | 40 × 40 | +| 572 | `MARK_BANKER_CORNER` | 牌角 `庄` 橙色斜标 | 1 | —— | 28 × 28 | +| 573 | `MARK_JOKER_BIG` | 大王 `大` 圆标 | 2 | 帧1=大王 帧2=小王 | 34 × 34 | +| 574 | `BADGE_ZHU_PAIR` | `主N` / `对N` 角标底 | 2 | 帧1=黄底(主) 帧2=白底(对) | 44 × 20 | +| 575 | `BADGE_MULTIPLE` | 子数/倍数角标底 | 2 | 帧1=蓝底 帧2=橙底 | 34 × 18 | +| 576 | `LABEL_CARDTYPE` | 牌型标签 | ≥6 | 帧1=单张 帧2=对子 帧3=拖拉机 帧4=甩牌 帧5=毙 帧6=垫【T-11】 | 76 × 24 | +| 577 | `MARK_CARD_GROUP` | 手牌牌型分组标记(`拖`圆标 / ⭐ / 🔵)【T-8】 | ≥3 | 待定 | 26 × 26 | +| 578 | `MARK_SELECTED` | 手牌选中标记 | 1 | 待定(也可只用上浮,不出图) | 待定 | + +### 3.5 面板底图 + +| ID | 键名 | 用途 | 帧数 | 尺寸 | +| --- | --- | --- | --- | --- | +| 601 | `PANEL_TOP_INFO` | 顶部三列信息条底 | 1 | 276 × 68 | +| 602 | `PANEL_CALL_SCORE` | 叫分面板底 | 1 | 575 × 170 | +| 603 | `BAR_HINT_TOP` | `70分坐庄才可投降` 提示条底 | 1 | 345 × 33 | +| 604 | `BAR_CHOOSE_MAIN` | `亮主` 斜角标题条 | 1 | 425 × 50 | +| 605 | `BAR_LIANGPAI` | 亮牌信息条底(半透圆角) | 1 | 210 × 35 | +| 606 | `PANEL_BOTTOM_CARDS` | 结算底牌区面板底 | 1 | 420 × 148 | +| 607 | `GLOW_RESULT` | 结算分数光晕背景 | 2 | 帧1=赢(橙) 帧2=输(蓝) | 225 × 100 | +| 608 | `BAR_FOOTER` | 底栏深色条 | 1 | 1280 × 72 | + +### 3.6 数字与符号 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 631 | `NUM_COUNTDOWN` | 倒计时数字 | 10 | 帧1–10 = 0–9 | 44 × 60 | +| 632 | `NUM_RESULT_WIN` | 结算得分数字(赢,橙) | 12 | 帧1–10 = 0–9,帧11 = `+`,帧12 = `-` | 46 × 62 | +| 633 | `NUM_RESULT_LOSE` | 结算得分数字(输,蓝) | 12 | 同上 | 46 × 62 | +| 634 | `TXT_JUDGE` | 判定结果文字 | ≥5 | 帧1=大光 帧2=小光 帧3=过庄 帧4=升级 帧5=投降【待设计】 | 待定 | + +> 若改用文字精灵(`SpriteManager.setText`)而非图片数字,631–634 可省。见 T-19。 + +### 3.7 浮层与气泡 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 651 | `BUBBLE_TISHI` | 踩 / 没分 / 有分 提示气泡 | 3 | 帧1=踩 帧2=没分 帧3=有分(对应 `tip` 1/2/3) | 待定 | +| 652 | `TXT_BAOZHU` | 「报无主」提示【待设计】 | 1 | 待定 | 待定 | +| 653 | `TXT_SHUAICUO` | 「甩错」提示【待设计】 | 1 | 待定 | 待定 | +| 654 | `TXT_GRADE_FLOAT` | 捡分飘字底(`20分` 金色) | 1 | 待定 | 待定 | +| 655 | `PANEL_ANCARD_3S` | 70 分暗牌公示 3 秒的标题/边框【待设计】 | 1 | 待定 | 待定 | + +### 3.8 建房选项 + +| ID | 键名 | 用途 | 帧数 | 帧说明 | 尺寸 | +| --- | --- | --- | --- | --- | --- | +| 681 | `CHECKBOX_ROOM_OPT` | 规则选项勾选框 | 2 | 帧1=未选 帧2=已选 | 40 × 40 | +| 682 | `ROW_ROOM_OPT` | 选项行底 | 1 | 待定 | 待定 | + +--- + +## 4. 声音资源总表 【整节待确认 T-20】 + +design 与协议均**未定义任何音效**。以下是按牌类游戏常规推导的候选清单,**未经确认,不得直接作为出音依据**: + +| ID | 键名 | 触发时机 | +| --- | --- | --- | +| 101 | `SND_DEAL` | 发牌 | +| 102 | `SND_CALL_SCORE` | 叫分 | +| 103 | `SND_NO_CALL` | 不叫 | +| 104 | `SND_BE_BANKER` | 上庄 | +| 105 | `SND_CHOOSE_MAIN` | 选主 | +| 106 | `SND_SURRENDER` | 投降 | +| 107 | `SND_BURY` | 埋牌 | +| 108 | `SND_PLAY_CARD` | 出牌 | +| 109 | `SND_SHUAI` | 甩牌 | +| 110 | `SND_SHUAICUO` | 甩错 | +| 111 | `SND_BI` | 毙牌 | +| 112 | `SND_WIN_ROUND` | 赢下一轮 / 捡分 | +| 113 | `SND_BAOZHU` | 报无主 | +| 114 | `SND_TISHI_1/2/3` | 踩 / 没分 / 有分 | +| 115 | `SND_KOUDI` | 扣底 | +| 116 | `SND_RESULT_WIN` | 小局结算 · 赢 | +| 117 | `SND_RESULT_LOSE` | 小局结算 · 输 | +| 118 | `SND_COUNTDOWN_TICK` | 倒计时最后 N 秒 | +| 119 | `SND_BTN_CLICK` | 通用按钮点击 | + +**要确认的**:是否需要男/女声区分、是否需要方言语音包、`SND_TISHI` 是否用真人语音、倒计时提示音从第几秒开始。 + +--- + +## 5. 精灵结构表 + +> 格式遵循 `gameabc-framework/templates/GameView_Sprites.template.js`。 +> **ID 为规划建议值**,编辑器建成后须逐个回填校准(§0 前言)。 +> 每条注明:类型(图片/文字/容器/热区)· 用途 · 资源键 · 帧说明。 + +### 5.1 Layer 101 · 牌桌常驻 + +| 群组 | 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | --- | +| **201** 顶部信息条 | 1001 | `TOP_INFO_BG` | 图片 | 三列表格底 | `PANEL_TOP_INFO` | +| | 1002 | `TOP_SUIT_ICON` | 图片 | `主` 列花色 | `SUIT_ICON_S` 帧 = flower | +| | 1003 | `TOP_CALL_TEXT` | 文字 | 叫分数值 | —— | +| | 1004 | `TOP_CALL_BADGE_BG` | 图片 | 叫分角标底 | `BADGE_MULTIPLE` 帧1 | +| | 1005 | `TOP_CALL_BADGE_TEXT` | 文字 | `N子` | —— | +| | 1006 | `TOP_GRADE_TEXT` | 文字 | 抓分数值 | —— | +| | 1007 | `TOP_GRADE_BADGE_BG` | 图片 | 抓分角标底 | `BADGE_MULTIPLE` 帧2 | +| | 1008 | `TOP_GRADE_BADGE_TEXT` | 文字 | `N倍`【T-16】 | —— | +| **206** 亮牌条 | 1030 | `LIANGPAI_BG` | 图片 | 半透圆角条 | `BAR_LIANGPAI` | +| | 1031 | `LIANGPAI_TEXT` | 文字 | 亮牌统计文案 | —— | +| **205** 底栏 | 1040 | `FOOTER_BG` | 图片 | 底栏深色条 | `BAR_FOOTER` | +| | 1041 | `FOOTER_ASET_TEXT` | 文字 | `1/4 局` | —— | +| | 1042 | `BTN_MINGPAI` | 图片 | `明牌` | `BTN_BOTTOM_FUNC` | +| | 1043 | `BTN_MINGPAI_TEXT` | 文字 | 按钮文案 | —— | +| | 1044 | `BTN_HISTORY` | 图片 | `已出牌` | `BTN_BOTTOM_FUNC` | +| | 1045 | `BTN_HISTORY_TEXT` | 文字 | —— | —— | +| | 1046 | `BTN_LAST_ROUND` | 图片 | `上一轮` | `BTN_BOTTOM_FUNC` | +| | 1047 | `BTN_LAST_ROUND_TEXT` | 文字 | —— | —— | +| | 1048 | `BTN_BOTTOM_CARDS` | 图片 | `底牌` | `BTN_BOTTOM_FUNC` | +| | 1049 | `BTN_BOTTOM_CARDS_TEXT` | 文字 | —— | —— | +| **202** 左上家标记 | 1100 | `P_LEFT_BANKER` | 图片 | `庄` 印章 | `MARK_BANKER` | +| | 1101 | `P_LEFT_ZHU_BG` | 图片 | `主N` 角标底 | `BADGE_ZHU_PAIR` 帧1 | +| | 1102 | `P_LEFT_ZHU_TEXT` | 文字 | 剩余主牌数 | —— | +| | 1103 | `P_LEFT_PAIR_BG` | 图片 | `对N` 角标底 | `BADGE_ZHU_PAIR` 帧2 | +| | 1104 | `P_LEFT_PAIR_TEXT` | 文字 | 剩余主对数 | —— | +| | 1105 | `P_LEFT_STATUS_TEXT` | 文字 | `60分` / `不叫` | —— | +| **203** 右上家标记 | 1110–1115 | `P_RIGHT_*` | | 结构同 202 | | +| **204** 自己标记 | 1120 | `P_SELF_BANKER` | 图片 | 底栏 `庄` 印章 | `MARK_BANKER` | +| | 1121 | `P_SELF_STATUS_TEXT` | 文字 | `50分` / `不叫` | —— | + +### 5.2 Layer 102 · 手牌区(群组 210) + +| 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | +| 1200–1235 | `HAND_CARD_1` … `HAND_CARD_36` | 图片 ×36 | 自己手牌 | `CARD_FACE_L`,帧 = `cardIdToFrame(id)` | +| 1236–1243 | `HAND_MARK_1` … `HAND_MARK_8` | 图片 ×8 | 手牌牌型分组标记【T-8】 | `MARK_CARD_GROUP` | + +### 5.3 Layer 103 · 桌面牌 + +| 群组 | 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | --- | +| **211** 暗牌 | 1250–1257 | `DARK_CARD_1..8` | 图片 ×8 | 8 张暗牌;未揭示时帧 = 55 牌背,70 分公示 / 庄家查看时翻正面 | `CARD_FACE_L` | +| **215** 底牌 | 1258–1265 | `BOTTOM_CARD_1..8` | 图片 ×8 | 结算时亮出的底牌 | `CARD_FACE_S` | +| **212** 自己出牌 | 1300–1327 | `PLAY_SELF_1..28` | 图片 ×28 | 本轮打出的牌 | `CARD_FACE_M` | +| | 1328 | `PLAY_SELF_TYPE_BG` | 图片 | 牌型标签 | `LABEL_CARDTYPE` | +| | 1329 | `PLAY_SELF_TYPE_TEXT` | 文字 | 标签文案 | —— | +| **213** 左上家出牌 | 1400–1429 | `PLAY_LEFT_*` | | 结构同 212 | | +| **214** 右上家出牌 | 1500–1529 | `PLAY_RIGHT_*` | | 结构同 212 | | + +### 5.4 Layer 104 · 阶段操作区 + +| 群组 | 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | --- | +| **220** 叫分面板 | 1600 | `CALL_PANEL_BG` | 图片 | 面板底 | `PANEL_CALL_SCORE` | +| | 1601 | `CALL_HINT_BG` | 图片 | 提示条底 | `BAR_HINT_TOP` | +| | 1602 | `CALL_HINT_TEXT` | 文字 | `70分坐庄才可投降` | —— | +| | 1603–1616 | `CALL_BTN_1..14` | 图片 ×14 | 档位按钮底(70…5) | `BTN_CALL_SCORE` 帧1可选/帧2灰/帧3高亮 | +| | 1617–1630 | `CALL_BTN_TEXT_1..14` | 文字 ×14 | 档位分数 | —— | +| | 1631–1644 | `CALL_BTN_BADGE_1..14` | 文字 ×14 | 该档 `multiple` 子数角标 | —— | +| | 1645 | `CALL_BTN_NONE` | 图片 | `不叫` | `BTN_NO_CALL` | +| | 1646 | `CALL_BTN_NONE_TEXT` | 文字 | —— | —— | +| **221** 选主面板 | 1650 | `MAIN_TITLE_BG` | 图片 | `亮主` 斜角条 | `BAR_CHOOSE_MAIN` | +| | 1651 | `MAIN_TITLE_TEXT` | 文字 | `亮主` | —— | +| | 1652–1655 | `MAIN_SUIT_BTN_1..4` | 图片 ×4 | 花色按钮底 | `BTN_SUIT_CHOOSE` | +| | 1656–1659 | `MAIN_SUIT_ICON_1..4` | 图片 ×4 | 花色图标 | `SUIT_ICON_L` 帧1–4 | +| | 1660–1663 | `MAIN_SUIT_COUNT_1..4` | 文字 ×4 | 该花色**张数**【T-7】 | —— | +| | 1664–1667 | `MAIN_SUIT_PAIR_BG_1..4` | 图片 ×4 | 对数角标底 | `BADGE_MULTIPLE` 帧1 | +| | 1668–1671 | `MAIN_SUIT_PAIR_TEXT_1..4` | 文字 ×4 | `N对` | —— | +| | 1672 | `MAIN_BTN_SURRENDER` | 图片 | `投降` | `BTN_SURRENDER` | +| | 1673 | `MAIN_BTN_SURRENDER_TEXT` | 文字 | —— | —— | +| **222** 埋牌操作条 | 1700 | `BURY_BTN_TIP` | 图片 | `提示` | `BTN_TIP` | +| | 1701 | `BURY_BTN_TIP_TEXT` | 文字 | —— | —— | +| | 1702 | `BURY_BTN_SUBMIT` | 图片 | `埋牌` | `BTN_BURY` 帧1可提交/帧2灰 | +| | 1703 | `BURY_BTN_SUBMIT_TEXT` | 文字 | `埋牌 (N/8)` | —— | +| **223** 出牌操作条 | 1710 | `PLAY_BTN_SUBMIT` | 图片 | `出牌` | `BTN_PLAY` 帧1可出/帧2灰 | +| | 1711 | `PLAY_BTN_SUBMIT_TEXT` | 文字 | —— | —— | +| | 1712 | `PLAY_BTN_TIP`【T-10】 | 图片 | `提示` | `BTN_TIP` | +| **224** 倒计时 | 1150 | `CD_LEFT` | 文字 | 左上家位倒计时 | —— | +| | 1151 | `CD_RIGHT` | 文字 | 右上家位倒计时 | —— | +| | 1152 | `CD_SELF` | 文字 | 自己操作区倒计时 | —— | + +### 5.5 Layer 105 · 桌面浮层(群组 230) + +| 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | +| 1750–1752 | `BUBBLE_TISHI_LEFT/RIGHT/SELF` | 图片 ×3 | 踩/没分/有分 气泡(按发送者位置) | `BUBBLE_TISHI` 帧 = tip | +| 1753 | `TXT_BAOZHU` | 图片 | 报无主提示【待设计】 | `TXT_BAOZHU` | +| 1754 | `TXT_SHUAICUO` | 图片 | 甩错提示【待设计】 | `TXT_SHUAICUO` | +| 1755 | `GRADE_FLOAT_BG` | 图片 | 捡分飘字底 | `TXT_GRADE_FLOAT` | +| 1756 | `GRADE_FLOAT_TEXT` | 文字 | `20分` | —— | +| 1757 | `ANCARD_3S_PANEL` | 图片 | 70 分暗牌公示框【待设计】 | `PANEL_ANCARD_3S` | +| 1758 | `ANCARD_3S_TEXT` | 文字 | 公示标题 + 3 秒倒计时 | —— | + +### 5.6 Layer 302 · 小局结算(群组 240) + +| 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | +| --- | --- | --- | --- | --- | +| 1800 | `RESULT_BOTTOM_PANEL` | 图片 | 底牌区面板底 | `PANEL_BOTTOM_CARDS` | +| 1801 | `RESULT_BOTTOM_TEXT` | 文字 | `叫分N子 底牌 GxM`【T-12】 | —— | +| 1802–1804 | `RESULT_GLOW_LEFT/RIGHT/SELF` | 图片 ×3 | 三家分数光晕 | `GLOW_RESULT` 帧1赢/帧2输 | +| 1805–1807 | `RESULT_SCORE_LEFT/RIGHT/SELF` | 文字 ×3 | 三家总分(`aset.seatlist[i].grade`) | —— | +| 1808–1810 | `RESULT_JF_LEFT/RIGHT/SELF` | 文字 ×3 | 捡分子数得分 `grade_jf`【T-13】 | —— | +| 1811–1813 | `RESULT_AW_LEFT/RIGHT/SELF` | 文字 ×3 | 算奖得分 `grade_aw`【T-13】 | —— | +| 1814 | `RESULT_JUDGE_TEXT` | 文字 | 判定结果(大光/小光/过庄/升N级/投降,据 `aset.upgrade`) | —— | + +> 底牌 8 张精灵复用 §5.3 群组 215(1258–1265),不在此重复。 + +### 5.7 Layer 303–306 · 其余弹窗 【待设计】 + +| 图层 | 群组 | 号段 | 内容 | +| --- | --- | --- | --- | +| 303 | 241 | 1900–1949 | 大局总结算 / 解散结算:三家 × N 局成绩表 | +| 304 | 242 | 1950–1999 | 出牌历史:按轮次 × 3 家的牌列表(建议用 `DynamicSpriteList`) | +| 305 | 243 | 2000–2049 | 明牌面板:另两家未出主牌的具体牌面 | +| 306 | —— | —— | 解散投票【T-2:是否平台提供】 | + +### 5.8 建房规则选项(群组 250,2050–2099)【待设计】 + +5 行开关(局数 / 扣卡 / 傍王 / 爬坡 / 查牌),每行:行底 + 标题文字 + 2 个勾选框 + 2 个选项文字 = 6 精灵 × 5 行 = 30。挂在平台创建房间界面的图层上(T-3)。 + +--- + +## 6. 布局坐标表 + +> ⚠️ **以下坐标全部为参考图(1280×720)的目视实测估值,误差约 ±5px**,用途是给美术和编辑器一个起点,**不是最终值**。最终坐标以设计稿为准;本表在设计稿到位后必须整体复核。 + +### 6.1 常驻 + +| 元素 | x | y | w | h | 参考图 | +| --- | --- | --- | --- | --- | --- | +| 顶部信息条 | 486 | 4 | 276 | 68 | 全部 | +| 亮牌信息条 | 35 | 400 | 210 | 35 | 全部 | +| 底栏 | 0 | 648 | 1280 | 72 | 全部 | +| 底栏 · 局数文字 | 635 | 672 | 65 | 26 | 全部 | +| 底栏 · `庄` 印章 | 338 | 668 | 32 | 34 | 自己叫分 | +| 底栏 · `明牌` | 876 | 672 | 74 | 30 | 庄家埋牌 | +| 底栏 · `已出牌` | 965 | 672 | 87 | 30 | 庄家埋牌 | +| 底栏 · `上一轮` | 1067 | 672 | 93 | 30 | 庄家埋牌 | +| 底栏 · `底牌` | 1172 | 672 | 78 | 30 | 全部 | +| 右侧语音钮(平台) | 1210 | 310 | 56 | 56 | 全部 | +| 右侧聊天钮(平台) | 1210 | 385 | 56 | 56 | 全部 | + +### 6.2 玩家位 + +| 元素 | x | y | w | h | +| --- | --- | --- | --- | --- | +| 左上 · 头像框(平台) | 22 | 122 | 91 | 118 | +| 左上 · `庄` 印章 | 120 | 130 | 35 | 38 | +| 左上 · `主N` 角标 | 22 | 246 | 40 | 19 | +| 左上 · `对N` 角标 | 66 | 246 | 40 | 19 | +| 左上 · 状态文字 | 170 | 165 | 130 | 70 | +| 左上 · 倒计时 | 195 | 165 | 75 | 70 | +| 右上 · 头像框(平台) | 1160 | 122 | 91 | 118 | +| 右上 · `庄` 印章 | 1120 | 130 | 35 | 38 | +| 右上 · `主N` 角标 | 1160 | 246 | 40 | 19 | +| 右上 · `对N` 角标 | 1204 | 246 | 40 | 19 | +| 右上 · 状态文字 | 980 | 165 | 130 | 70 | +| 自己 · 头像(平台,底栏内) | 22 | 645 | 84 | 53 | + +> 平台默认 `PLAYER_INFO_LAYOUT.POSITIONS` 为 ind0 南 (6,592)、ind1 东 (1186,85)、ind3 西 (7,59),与上表不完全一致 → 需在 `01_SubGame_modify.js` 配置区**调整为上表值**(该文件配置区允许改值)。 + +### 6.3 中央区(按阶段) + +| 阶段 | 元素 | x | y | w | h | +| --- | --- | --- | --- | --- | --- | +| 发牌/叫分 | 暗牌区(8 张背面) | 360 | 110 | 590 | 190 | +| 叫分 | 提示条 `70分坐庄才可投降` | 470 | 100 | 345 | 33 | +| 叫分 | 面板底 | 355 | 140 | 575 | 170 | +| 叫分 | 档位按钮(首个) | 363 | 160 | 74 | 56 | +| 叫分 | 档位横向间距 / 行距 | 81 | 80 | —— | —— | +| 叫分 | `不叫` 按钮 | 553 | 345 | 184 | 57 | +| 叫分 | 自己倒计时 | 445 | 345 | 75 | 57 | +| 叫分 | 自己叫分大字(已叫态) | 570 | 320 | 140 | 70 | +| 选主 | `亮主` 标题条 | 330 | 315 | 425 | 50 | +| 选主 | 花色按钮(首个) | 330 | 373 | 128 | 55 | +| 选主 | 按钮横向间距 | 137 | —— | —— | —— | +| 选主 | `投降` 按钮 | 878 | 373 | 128 | 55 | +| 埋牌 | `提示` 按钮 | 385 | 165 | 180 | 63 | +| 埋牌 | 倒计时 | 610 | 165 | 60 | 63 | +| 埋牌 | `埋牌 (N/8)` 按钮 | 715 | 165 | 180 | 63 | +| 出牌 | 倒计时 | 445 | 345 | 75 | 55 | +| 出牌 | `出牌` 按钮 | 555 | 345 | 157 | 55 | +| 出牌 | 自己已出牌区 | 565 | 265 | 170 | 155 | +| 出牌 | 右上家已出牌区 | 945 | 120 | 155 | 160 | +| 出牌 | 捡分飘字 | 570 | 180 | 170 | 55 | +| 结算 | 底牌面板 | 430 | 140 | 420 | 148 | +| 结算 | 左家分数 | 175 | 150 | 225 | 100 | +| 结算 | 右家分数 | 865 | 150 | 225 | 100 | +| 结算 | 自己分数 | 490 | 340 | 240 | 100 | + +### 6.4 手牌区 + +| 形态 | 元素 | x | y | w | h | +| --- | --- | --- | --- | --- | --- | +| 单排 | 整体范围 | 35 | 455 | 1215 | 190 | +| 单排 | 单张完整尺寸 | —— | —— | 110 | 190 | +| 单排 | 相邻牌 x 间距(36 张时) | 33 | —— | —— | —— | +| 双排(埋牌) | 上排(17 张) | 180 | 285 | 928 | 170 | +| 双排(埋牌) | 下排(19 张) | 180 | 455 | 928 | 190 | +| 通用 | 选中上浮 y 偏移 | —— | **-40** | —— | —— | + +> 间距需按实际张数动态计算:`间距 = min(牌宽, (可用宽 - 牌宽) / (张数 - 1))`,具体公式与最小间距下限待定(T-21)。 + +--- + +## 7. 待补充清单 + +### 7.1 待出设计稿的界面 + +| 编号 | 界面 | 所属 | 说明 | +| --- | --- | --- | --- | +| D-1 | 建房规则选项区 | §1.1 | 5 行开关 + 房卡消耗联动 | +| D-2 | 70 分暗牌公示(3 秒) | §1.4 | 全场可见的暗牌展示 + 倒计时 | +| D-3 | 甩错提示 | §1.7 | 整套收回、只出最小一张的表现 | +| D-4 | 报无主提示 | §1.7 | 玩家主牌出空时的全场提示 | +| D-5 | 踩 / 没分 / 有分 气泡与发起入口 | §1.7 | 入口位置与气泡样式 | +| D-6 | 明牌面板 | §1.7 | 另两家未出主牌的具体牌面 | +| D-7 | 出牌历史面板 | §1.7 | 按轮次 × 3 家 | +| D-8 | 判定结果文字(大光/小光/过庄/升N级/投降) | §1.8 | 结算时的判定展示 | +| D-9 | 大局总结算 | §1.9 | 三家 × N 局成绩表 | +| D-10 | 解散结算 / 解散投票 | §1.10 | 可能复用 D-9 + 平台投票界面 | +| D-11 | 准备标识 | §1.12 | 或复用平台准备标识 | +| D-12 | 左上家已出牌区 | §2.3 | 参考图未出现,按右上家对称推 | + +### 7.2 待确认的规格问题 + +| 编号 | 问题 | 影响 | +| --- | --- | --- | +| ~~T-1~~ | ~~逆时针方向:下家是 `(seat+1)%3` 还是 `(seat+2)%3`~~ | **已定论**,见 §0.1:`class.paiju.js:264` `get_nextseat = (seat+1)%3`,下家显示在右上 | +| **T-2** | 解散投票界面是平台提供还是子游戏自建? | 是否需要 D-10 的一半工作 | +| **T-3** | 平台创建房间界面在哪个图层?子游戏选项精灵挂在哪? | §5.8 的图层归属 | +| **T-4** | 是否需要发牌动画? | 动画配置与工期 | +| **T-5** | 手牌排序规则(主牌左/右、副牌花色顺序);选主后重排的动画表现 | 布局算法 | +| **T-6** | 叫分档位按钮第 3 帧(参考图第二行橙色)的含义 | `BTN_CALL_SCORE` 帧数 | +| **T-7** | 选主按钮中央大数字是该花色**张数**还是别的?(design 只要求显示对子数) | `MAIN_SUIT_COUNT_*` 的取值 | +| **T-8** | 埋牌图中牌面上的 `拖` 圆标 / ⭐ / 🔵 是什么?「提示」功能的分组标记? | `MARK_CARD_GROUP` 帧数与含义 | +| **T-9** | 亮牌条文案 `主牌对子: 1对` 与 design §8.2 的四类信息(主/王/7/2)对应关系 | 文案模板 | +| **T-10** | 出牌阶段是否保留 `提示` 按钮?提示什么? | 精灵 1712 是否需要 | +| **T-11** | 牌型标签种类:除单张/对子/拖拉机/甩牌外,是否还要标「毙」「垫」「混合出牌」? | `LABEL_CARDTYPE` 帧数 | +| **T-12** | 结算底牌文案 `叫分2子 底牌 20x0` 的完整规则(未扣底时怎么显示) | 文案模板 | +| **T-13** | 结算面板两个小字标签的正式文案(参考图均为 `牌局分`,重复) | 文案 | +| **T-14** | 结算面板是否展示算奖明细(`chongguan` / `wang` / `naward`)? | 是否需要额外精灵 | +| **T-15** | 准备状态用平台标识还是自建? | D-11 | +| **T-16** | 顶部 `抓分` 列角标:两张参考图分别为 `1子` / `1倍`,正式取值是什么? | 精灵 1008 的数据源 | +| **T-17** | 倒计时归零后显示 `0` 还是隐藏? | 渲染规则 | +| **T-18** | 底栏 `底牌` 按钮:庄家点了看自己埋的 8 张?闲家点了看什么?未埋牌时呢? | 交互定义 | +| **T-19** | 数字用图片精灵(多帧)还是文字精灵(`setText`)? | 是否需要资源 631–634 | +| **T-20** | **整套音效**:清单、是否需要语音包、是否分男女声 | §4 全节 | +| **T-21** | 手牌间距的动态计算公式与最小间距下限 | 布局算法 | + +### 7.3 开发前置条件 + +在本清单的资源补齐前,前端**不具备开发条件**的部分: + +1. **美术出图** → §3 全部资源(尤其 3 套牌面 × 60 帧) +2. **编辑器建资源与精灵** → §5 全部 ID 回填本文 +3. **D-1 建房界面** → 影响 `roomtype` 拼串与进入牌局的第一步 + +不受阻、可先行的部分: + +- `client/js/01_SubGame/codes/` 目录结构与 `SubGameHooks.js` 骨架 +- `cardIdToFrame` 转换与其单元测试(§0.4 的 10 条校验样例可直接作为用例) +- 收包分发骨架(一 rpc 一处理器)与 `data.success` 判定 +- `shared/` 同步机制 + +--- + +## 附:本文与其他文档的关系 + +| 文档 | 关系 | +| --- | --- | +| `server/games/erqiwang/docs/design/design.md` | **玩法规则权威源**。本文引用其条款,不重新定义规则 | +| `server/games/erqiwang/docs/protocol/packet_protocol.md` | **协议字段权威源**。本文的「渲染什么」全部溯源到具体字段 | +| `docs/client/development-guide/` | **前端规范权威源**。ID 范围、组件范式、红线均以其为准 | +| `docs_dev/uiref/*.png` | 参考图,9 张 | +| `client/js/gameabc-framework/templates/*.template.js` | 常量文件写法蓝本。本清单落地为常量文件时按其格式 |