/////////////////////////////////////////////////////////////// ////////// EQW_Sprites: 精灵结构(清单 §5.2/§5.3 手牌与桌面牌)// /////////////////////////////////////////////////////////////// // 子游戏精灵段 1001–2999。结构与 Sprites_Table.js 一致: // View 下 Layer 为图层声明(一个 View 恰好一个图层),其余键是 group 容器; // 容器内 id 为群组 ID、其余键才是精灵 id。 // 连号精灵逐条写全,不用循环生成——便于人逐张对照编辑器核对。 var EQW_Sprites = EQW_Sprites || {}; // ============================================================================ // 自己手牌区 - Layer 102 (HAND), Group 210 (HAND) // ============================================================================ /** * 自己手牌区 - HandView * * 用途: 屏幕下部铺开自己的手牌(重叠排列),并在每张牌上叠加牌型标记。 * 两种形态:常态【单排】、庄家埋牌时【双排】。张数上限 36(庄家摸底后 28+8)。 * * 布局说明(参考图 docs_dev/uiref/等待叫分.png = 单排; * docs_dev/uiref/庄家埋牌.png = 双排): * * 形态一 · 单排(叫分 / 选主 / 出牌阶段,EQW_Layout.HAND_FAN_SINGLE) * fan/horizontal, anchor center, anchorX=640 anchorY=455, maxWidth=1215, * 牌尺寸 CARD_SIZE.L = 110×190, spacingMax=0 spacingMin=-78, overlapFrom='left' * * x≈35 x≈1250 * ┌──┬──┬──┬──┬──┬──┬──┬──┬── … ──┬──┬──┬──────────┐ y=455 * │K │K │K │K │K │K │K │K │ │K │K │ K │ * │♦ │♦ │♦ │♦ │♦ │♦ │♦ │♦ │ …… │♦ │♦ │ ♦ │ * └──┴──┴──┴──┴──┴──┴──┴──┴── … ──┴──┴──┴──────────┘ y=645 * ↑ HAND_CARD_1(1200) 起自左,逐张右叠;末张整张露出(110px) * 36 张时每张只露约 32px(spacing -78),与参考图实测 33px 吻合 * * 形态二 · 双排(仅庄家埋牌阶段,EQW_Layout.HAND_TWO_ROW) * splitStrategy='floorTop':上排 floor(n/2)、下排 ceil(n/2)(36 张 = 18/18) * ROW_TOP anchorX=644 anchorY=285 maxWidth=928 spacingMin=-65 * ROW_BOTTOM anchorX=644 anchorY=455 maxWidth=928 spacingMin=-65 * * ┌──┬──┬──┬── … ──┬──┬──────┐ y=285 ← ROW_TOP * │K │K │K │ …… │K │ K │ * └──┴──┴──┴── … ──┴──┴──────┘ y=455 * ┌──┬──┬──┬── … ──┬──┬──────┐ y=455 ← ROW_BOTTOM * │K │K │K │ …… │K │ K │ * └──┴──┴──┴── … ──┴──┴──────┘ y=645 * ⚠ 参考图画的是 17/19 分行,属填充画法(清单 §0.5),不作依据;分行以 floorTop 为准。 * * 选中态: 整张牌上浮,偏移量 EQW_Anim.HAND_SELECT_OFFSET_Y = -40(SSOT,布局里不重复定义)。 * * 元素说明: * - HAND_CARD_1..36 与 HAND_MARK_1..36 【一一对应】(HAND_MARK_i 属于 HAND_CARD_i), * 同属群组 210;张数少于 36 时隐藏多余精灵并重算间距。 * - 牌面帧 = cardIdToFrame(id)(清单 §0.4 唯一权威转换,前端只此一处实现)。 * - 手牌标记三种互斥、每张牌至多一个,由前端据 flower(主牌花色)本地标注,服务端不下发: * 帧1 =「拖」红色圆标 —— 该牌属于一组拖拉机 * 帧2 = 橙色五角星 —— 正 2 / 正 7(主花色的 2 和 7) * 帧3 = 蓝色五角星 —— 除正2正7外的其他主牌(双王、副2、副7、主花色普通牌) * 在参考图 庄家埋牌.png 下排牌的左下角可看到这三种标记。 * - 【时序】发牌动画从右往左铺开(EQW_Anim.DEAL: 800ms / 每张 20ms 延迟);须先 * setHandCards() 把牌写进 this.data、再播动画,动画回调里只刷界面不写核心数据。 * - 【时序】选主后主牌集合会变(正2/正7 升格),手牌必须按新主牌序重排(清单 §7.2 T-5)。 * * 资源说明: * - 牌面: EQW_Images.CARD_FACE_L (501), 60 帧 (10列×6行行优先), 单帧 110×190, 整图 1100×1140 * 帧1–13 黑桃A–K / 帧14–26 红桃 / 帧27–39 梅花 / 帧40–52 方块 / * 帧53 小王 / 帧54 大王 / 帧55–60 牌背(二七王用帧55) * - 牌上标记: EQW_Images.MARK_CARD_GROUP (577), 3 帧, 26×26 * - 选中标记: EQW_Images.MARK_SELECTED (578) 尺寸待定,也可只用上浮表现、不出图 * * 精灵ID分配: 1200–1235(手牌)+ 2100–2135(手牌标记) * —— 标记另起 2100 段的原因见下方原注释(1236 起接不下 36 个连号)。 * * @see docs_dev/二七王-UI资源与精灵清单.md §2.7 手牌区 / §5.2 Layer 102 / §6.7 牌区配置 * @see docs_dev/uiref/等待叫分.png * @see docs_dev/uiref/庄家埋牌.png */ //自己手牌区:36 张手牌 + 36 个手牌标记(每张牌一个,见下方裁决说明),同属群组 210(清单 §5.2,Layer 102) EQW_Sprites.HandView = { Layer: EQW_Layers.HAND, //102 HandCards: { id: EQW_Groups.HAND, //210 //—— 36 张手牌,资源 EQW_Images.CARD_FACE_L,帧 = cardIdToFrame(id)(§0.4 唯一权威转换)—— HAND_CARD_1: 1200, HAND_CARD_2: 1201, HAND_CARD_3: 1202, HAND_CARD_4: 1203, HAND_CARD_5: 1204, HAND_CARD_6: 1205, HAND_CARD_7: 1206, HAND_CARD_8: 1207, HAND_CARD_9: 1208, HAND_CARD_10: 1209, HAND_CARD_11: 1210, HAND_CARD_12: 1211, HAND_CARD_13: 1212, HAND_CARD_14: 1213, HAND_CARD_15: 1214, HAND_CARD_16: 1215, HAND_CARD_17: 1216, HAND_CARD_18: 1217, HAND_CARD_19: 1218, HAND_CARD_20: 1219, HAND_CARD_21: 1220, HAND_CARD_22: 1221, HAND_CARD_23: 1222, HAND_CARD_24: 1223, HAND_CARD_25: 1224, HAND_CARD_26: 1225, HAND_CARD_27: 1226, HAND_CARD_28: 1227, HAND_CARD_29: 1228, HAND_CARD_30: 1229, HAND_CARD_31: 1230, HAND_CARD_32: 1231, HAND_CARD_33: 1232, HAND_CARD_34: 1233, HAND_CARD_35: 1234, HAND_CARD_36: 1235, //—— 36 个手牌标记【T-8】,与 HAND_CARD_1..36 一一对应(HAND_MARK_i 属于 HAND_CARD_i)—— //资源 EQW_Images.MARK_CARD_GROUP,帧1=拖(拖拉机) 帧2=橙五角星(正2/正7) 帧3=蓝五角星(其他主牌)。 //【裁决:按「每张牌」而非「每组」】清单 §5.2 的表格写的是「牌型分组标记 ×8」,但 §1.6 明确 //规定三种标记互斥、【每张牌】至多一个,core/CardMark.js 也是按每张牌返回标记的。 //一手 28 张牌通常带 13 个以上标记、36 张埋牌手更多,8 个远远不够——§1.6 是行为规格, //比 §5.2 表格的措辞更权威,故按 §1.6 扩到与手牌一一对应。 //ID 另起 2100 段:1236 往后接不下 36 个连号(1250 起已是底牌/埋牌区), //换整段空号 2100–2135 比给别的 View 重新编号更安全。 HAND_MARK_1: 2100, HAND_MARK_2: 2101, HAND_MARK_3: 2102, HAND_MARK_4: 2103, HAND_MARK_5: 2104, HAND_MARK_6: 2105, HAND_MARK_7: 2106, HAND_MARK_8: 2107, HAND_MARK_9: 2108, HAND_MARK_10: 2109, HAND_MARK_11: 2110, HAND_MARK_12: 2111, HAND_MARK_13: 2112, HAND_MARK_14: 2113, HAND_MARK_15: 2114, HAND_MARK_16: 2115, HAND_MARK_17: 2116, HAND_MARK_18: 2117, HAND_MARK_19: 2118, HAND_MARK_20: 2119, HAND_MARK_21: 2120, HAND_MARK_22: 2121, HAND_MARK_23: 2122, HAND_MARK_24: 2123, HAND_MARK_25: 2124, HAND_MARK_26: 2125, HAND_MARK_27: 2126, HAND_MARK_28: 2127, HAND_MARK_29: 2128, HAND_MARK_30: 2129, HAND_MARK_31: 2130, HAND_MARK_32: 2131, HAND_MARK_33: 2132, HAND_MARK_34: 2133, HAND_MARK_35: 2134, HAND_MARK_36: 2135 } }; // ============================================================================ // 底牌区(发牌留桌 8 张)- Layer 103 (TABLE_CARDS), Group 211 (BOTTOM_CARDS) // ============================================================================ /** * 底牌区 - BottomCardsView * * 用途: 桌面中央上部的 8 张【底牌】——发牌时没有发给玩家、留在桌面的那 8 张。 * 发牌起显示牌背;庄家摸底 / 70 分开底时【同一批精灵】翻成正面。 * * 布局说明(背面:docs_dev/uiref/等待叫分.png 中央;正面:docs_dev/uiref/叫分确定庄.png、 * docs_dev/uiref/等待庄家选主.png 中央; * 位置见 EQW_Layout.BOTTOM_CARDS = line/horizontal, anchor center, * anchorX=655 anchorY=110, 牌尺寸 CARD_SIZE.L 110×190, spacing=-36): * * x 居中于 655 * ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬────────────┐ y=110 * │ 背 │ 背 │ 背 │ 背 │ 背 │ 背 │ 背 │ 背 │ * │ │ │ │ │ │ │ │ │ * └──────┴──────┴──────┴──────┴──────┴──────┴──────┴────────────┘ y=300 * ↑ ↑ ↑ * BOTTOM_ BOTTOM_ BOTTOM_ * CARD_1 CARD_2 … (等距 spacing -36,每张露 74px)… CARD_8 * (1250) (1251) (1257) * * 翻开后同一批精灵改帧为正面(帧 = cardIdToFrame(id)): * ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬────────────┐ * │K │K │K │K │K │K │K │K │ * │♦ │♦ │♦ │♦ │♦ │♦ │♦ │♦ │ * └──────┴──────┴──────┴──────┴──────┴──────┴──────┴────────────┘ * * 元素说明: * - 未揭示时帧 = 55(牌背);揭示时帧 = cardIdToFrame(id)(清单 §0.4)。 * - 【时序·开底 D-2 已定】翻牌这套 UI 只有一套,两种情形只是【谁能看到】不同: * 非 70 分坐庄(只摸底)→ 只有庄家看得到这 3 秒,闲家侧保持背面 / 直接收起 * 70 分坐庄(开底) → 全场三人都看得到 3 秒(EQW_Anim.ANCARD_REVEAL_DURATION = 3000) * 开底【不做倒计时、不做单独的公示面板、不加提示文案】——画面本身已说清楚(§2.8)。 * 3 秒后庄家摸入手牌、闲家侧收起,底牌区隐藏。 * - 【重连不重放】70 分的 3 秒亮牌是上庄时的一次性事件,deskinfo 重连不得补播(§1.4)。 * - 底栏「底牌」按钮再看这 8 张时也复用本区(庄家全程可看,闲家仅开底过的局,S-3)。 * - ⚠ 参考图 等待庄家选主.png 把「开底摊牌」与「等待庄家选主」提示条画在了一起,属叠画 * 示意(§0.5);实际顺序是 开底 3 秒 → 庄家摸底入手 → 选主,摸底后本区即收起。 * * 资源说明: * - 牌面: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190(与手牌同一套资源) * * 精灵ID分配: 1250–1257 * * @see docs_dev/二七王-UI资源与精灵清单.md §1.2 发牌 / §1.4 看底牌·上庄 / §5.3 / §6.7 * @see docs_dev/uiref/等待叫分.png * @see docs_dev/uiref/叫分确定庄.png * @see docs_dev/uiref/等待庄家选主.png */ //底牌区:发牌留桌 8 张(清单 §5.3,Layer 103 群组 211) EQW_Sprites.BottomCardsView = { Layer: EQW_Layers.TABLE_CARDS, //103 BottomCards: { id: EQW_Groups.BOTTOM_CARDS, //211 //—— 资源 EQW_Images.CARD_FACE_L;未揭示时帧=55(牌背),70分公示/庄家查看时翻正面(帧=cardIdToFrame(id))—— BOTTOM_CARD_1: 1250, BOTTOM_CARD_2: 1251, BOTTOM_CARD_3: 1252, BOTTOM_CARD_4: 1253, BOTTOM_CARD_5: 1254, BOTTOM_CARD_6: 1255, BOTTOM_CARD_7: 1256, BOTTOM_CARD_8: 1257 } }; // ============================================================================ // 埋牌底牌展示区 - Layer 103 (TABLE_CARDS), Group 215 (BURY_CARDS) // ============================================================================ /** * 埋牌底牌展示区 - BuryCardsView * * 用途: 小局结算时亮出【埋牌底牌】——庄家埋牌阶段从手里扣下的那 8 张。 * 用最小的牌面尺寸档 S,摆在小局结算面板的上半部。 * * 术语区分(清单 §2.6 已统一,别混): * 「底牌」 = 发牌留桌的 8 张 → BottomCardsView(群组 211),协议字段 bottomcards * 「埋牌底牌」= 庄家埋下的 8 张 → 本 View(群组 215),协议字段 burycards / bottom.cards * * 布局说明(参考图 docs_dev/uiref/小局结算.png 中央面板内那排小牌; * 位置见 EQW_Layout.BURY_CARDS = line/horizontal, anchor center, * anchorX=640 anchorY=163, 牌尺寸 CARD_SIZE.S 50×70, spacing=2): * * ┌──────────────────────────────────────────┐ y=140 ← RESULT_BOTTOM_PANEL(1800) * │ ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐ │ y=163 (见 Sprites_Result.js) * │ │10││10││10││10││10││10││10││10│ │ * │ │♠ ││♥ ││♣ ││♦ ││♠ ││♥ ││♣ ││♦ │ │ y=233 * │ └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘ │ * │ 叫分2子 底牌 20x0 │ ← RESULT_BOTTOM_TEXT(1801) * └──────────────────────────────────────────┘ y=288 * ↑ ↑ ↑ * BURY_ BURY_ BURY_ * CARD_1 CARD_2 …(等距 spacing +2,不重叠)… CARD_8 * (1258) (1259) (1265) * * 本区居中于 x=640,与外层面板(EQW_Layout.RESULT_BOTTOM_PANEL = 430,140,420×148) * 的中心 x=640 对齐;8×50 + 7×2 = 414,正好落在面板 420 宽度之内。 * * 元素说明: * - 数据取结算包 bottom.cards,【恒有】(design §11:牌局结束需要亮出底牌)—— * 即便闲家未扣底也照常亮 8 张,只是面板文案里的倍数位显示 0。 * - 帧 = cardIdToFrame(id),恒为正面(本区只在结算时出现,不存在牌背态)。 * - 【容错】投降结算只有 aset、无 bottom 分组 → 结算面板必须容忍底牌区缺失, * 不能因读不到 bottom.cards 就崩或显示空框(§1.8)。 * - 底栏「扣底」按钮(清单 §2.6,尚无精灵)看的也是这 8 张。 * * 资源说明: * - 牌面: EQW_Images.CARD_FACE_S (503), 60 帧, 单帧 50×70, 整图 500×420 * 帧排布与 CARD_FACE_L 完全一致(§0.4) * * 精灵ID分配: 1258–1265 * * @see docs_dev/二七王-UI资源与精灵清单.md §1.8 末轮扣底 + 小局结算 / §5.3 / §6.7 * @see docs_dev/uiref/小局结算.png */ //埋牌底牌展示区:结算时亮出的埋牌底牌 8 张(清单 §5.3,Layer 103 群组 215) EQW_Sprites.BuryCardsView = { Layer: EQW_Layers.TABLE_CARDS, //103 BuryCards: { id: EQW_Groups.BURY_CARDS, //215 //—— 资源 EQW_Images.CARD_FACE_S,帧 = cardIdToFrame(id)—— BURY_CARD_1: 1258, BURY_CARD_2: 1259, BURY_CARD_3: 1260, BURY_CARD_4: 1261, BURY_CARD_5: 1262, BURY_CARD_6: 1263, BURY_CARD_7: 1264, BURY_CARD_8: 1265 } }; // ============================================================================ // 三家已出牌区 - Layer 103 (TABLE_CARDS), Group 212 / 213 / 214 // ============================================================================ /** * 三家已出牌区 - PlayAreaView * * 用途: 出牌阶段,三家各有一块区域展示【本轮】打出的牌(中号牌面 CARD_FACE_M)。 * 每家一个群组、各预置 28 张(= 单次出牌张数上限,甩牌最多可甩满手牌)。 * * 布局说明(参考图 docs_dev/uiref/出牌2.png; * 位置见 EQW_Layout.PLAY_AREA,三家共用 base + bySeat 三个变体: * fan/horizontal, 牌尺寸 CARD_SIZE.M 90×155, maxWidth=170, * spacingMax=-35 spacingMin=-62): * * ┌──────────────────────────────────────────────────────────────┐ y=0 * │ ┌ 顶部信息条 ┐ │ * │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ * │ │头像│ │K K │ │K K │ │头像│ │ y≈120 * │ └────┘ │ 大│ │ 大│ └────┘ │ * │ └────┘ └────┘ │ * │ LEFT 258,120 RIGHT 1022,120 │ * │ overlapFrom='right' overlapFrom='left' │ * │ (左右镜像:同参数,堆叠朝向相反) │ * │ │ * │ ┌────┐ │ * │ │K K │ ← SELF 650,265 │ y≈265 * │ │ 庄│ overlapFrom='left' │ * │ ┌──┴────┘ │ * │ │拖拉机│ ← 牌型标签,贴该区首张牌 bottomLeft │ * │ └──────┘ │ * │ │ * │ ┌──────────── 自己手牌区(Layer 102)────────────┐ │ y≈455 * └──────────────────────────────────────────────────────────────┘ y=720 * * 单个出牌区的内部结构(以自己为例): * * PLAY_SELF_1(1300) 起自左,逐张右叠(fan 压缩,最多 28 张) * ↓ * ┌────┬────┬──────┐ * │ K │ K │ K │ 每张牌【右上角】可再叠一个角标: * │ ♦ │ ♦ │ ♦ ⟨庄⟩│ MARK_BANKER_CORNER(572) 28×28「庄」橙色斜标 * └────┴────┴──────┘ MARK_JOKER_BIG(573) 34×34「大/小」王圆标 * ┌──────┐ —— 贴的是运行时才确定的某一张牌,故 * │ 拖拉机│ EQW_Layout.PLAY_CARD_CORNER_MARK 只给模板 * └──────┘ (corner/offset),target/w/h 由调用方注入 * ↑ PLAY_SELF_TYPE_BG(1328) + PLAY_SELF_TYPE_TEXT(1329) * EQW_Layout.PLAY_TYPE_LABEL: attach 首张牌 bottomLeft, offsetY=-24, 76×24 * 首槽是【固定】精灵(PLAY_SELF_1 / PLAY_LEFT_1 / PLAY_RIGHT_1),非动态目标 * * 元素说明: * - 牌面帧 = cardIdToFrame(id)(§0.4);数据取 chupai1/2/3 的 seat + cards。 * - 牌型标签当前【只出「毙」一种】——EQW_Images.LABEL_CARDTYPE 只做这一帧; * 数据层仍保留 毙/垫/混合出牌 三种标识以备扩展,但不出图、不显示。 * ⚠ 参考图 出牌2.png 左下角的橙色「拖拉机」标签是设计示意,与当前资源定案(只做「毙」) * 不一致,实现时以资源注释为准(清单 §7.2 T-11 标签种类以美术稿为准,尚未定案)。 * - 甩牌的真实结构只能读 chupai1.shuai({tractors, pairs, singles}), * 【不得据 cardtype 反推】(协议 §11 明确警告)。 * - 【时序·一轮结束】maxseat 高亮 → 三家出牌区收牌 → 若有 grade 播捡分飘字 * (OverlayView 的 GRADE_FLOAT)并累加顶部「抓分」列 → 下一轮由 maxseat 先出。 * - 【为什么预置而不复制】号段每家 100 个、容量充裕,且需要叠压 z 序与出牌动画、 * 逐张独立控制,故不使用 SpriteCopyUtils,避免显式清理负担(清单 §5.6a 判据表)。 * * 资源说明: * - 牌面: EQW_Images.CARD_FACE_M (502), 60 帧, 单帧 90×155, 整图 900×930 * - 牌型标签底: EQW_Images.LABEL_CARDTYPE (576), 1 帧, 76×24 * - 牌角标: EQW_Images.MARK_BANKER_CORNER (572) 1 帧 28×28 / * EQW_Images.MARK_JOKER_BIG (573) 2 帧 34×34(帧1=大王 帧2=小王) * * 精灵ID分配: 1300–1329(自己)/ 1400–1429(左上家)/ 1500–1529(右上家) * * @see docs_dev/二七王-UI资源与精灵清单.md §2.3 已出牌区 / §1.7 出牌对局 / §5.3 / §6.7 * @see docs_dev/uiref/出牌.png * @see docs_dev/uiref/出牌2.png */ //三家已出牌区:自己/左上家/右上家 各 28 张牌 + 牌型标签底 + 标签文字(清单 §5.3,Layer 103 群组 212/213/214) EQW_Sprites.PlayAreaView = { Layer: EQW_Layers.TABLE_CARDS, //103 PlaySelf: { id: EQW_Groups.PLAY_SELF, //212 自己 //—— 本轮打出的牌,资源 EQW_Images.CARD_FACE_M,帧 = cardIdToFrame(id)—— PLAY_SELF_1: 1300, PLAY_SELF_2: 1301, PLAY_SELF_3: 1302, PLAY_SELF_4: 1303, PLAY_SELF_5: 1304, PLAY_SELF_6: 1305, PLAY_SELF_7: 1306, PLAY_SELF_8: 1307, PLAY_SELF_9: 1308, PLAY_SELF_10: 1309, PLAY_SELF_11: 1310, PLAY_SELF_12: 1311, PLAY_SELF_13: 1312, PLAY_SELF_14: 1313, PLAY_SELF_15: 1314, PLAY_SELF_16: 1315, PLAY_SELF_17: 1316, PLAY_SELF_18: 1317, PLAY_SELF_19: 1318, PLAY_SELF_20: 1319, PLAY_SELF_21: 1320, PLAY_SELF_22: 1321, PLAY_SELF_23: 1322, PLAY_SELF_24: 1323, PLAY_SELF_25: 1324, PLAY_SELF_26: 1325, PLAY_SELF_27: 1326, PLAY_SELF_28: 1327, PLAY_SELF_TYPE_BG: 1328, //图片:牌型标签底,资源 EQW_Images.LABEL_CARDTYPE,attach 该区首张牌 bottomLeft PLAY_SELF_TYPE_TEXT: 1329 //文字:标签文案(当前只出「毙」一种,见 EQW_Images.LABEL_CARDTYPE 用途说明) }, PlayLeft: { id: EQW_Groups.PLAY_LEFT, //213 左上家,结构同 212 //—— 本轮打出的牌,资源 EQW_Images.CARD_FACE_M,帧 = cardIdToFrame(id)—— PLAY_LEFT_1: 1400, PLAY_LEFT_2: 1401, PLAY_LEFT_3: 1402, PLAY_LEFT_4: 1403, PLAY_LEFT_5: 1404, PLAY_LEFT_6: 1405, PLAY_LEFT_7: 1406, PLAY_LEFT_8: 1407, PLAY_LEFT_9: 1408, PLAY_LEFT_10: 1409, PLAY_LEFT_11: 1410, PLAY_LEFT_12: 1411, PLAY_LEFT_13: 1412, PLAY_LEFT_14: 1413, PLAY_LEFT_15: 1414, PLAY_LEFT_16: 1415, PLAY_LEFT_17: 1416, PLAY_LEFT_18: 1417, PLAY_LEFT_19: 1418, PLAY_LEFT_20: 1419, PLAY_LEFT_21: 1420, PLAY_LEFT_22: 1421, PLAY_LEFT_23: 1422, PLAY_LEFT_24: 1423, PLAY_LEFT_25: 1424, PLAY_LEFT_26: 1425, PLAY_LEFT_27: 1426, PLAY_LEFT_28: 1427, PLAY_LEFT_TYPE_BG: 1428, PLAY_LEFT_TYPE_TEXT: 1429 }, PlayRight: { id: EQW_Groups.PLAY_RIGHT, //214 右上家,结构同 212 //—— 本轮打出的牌,资源 EQW_Images.CARD_FACE_M,帧 = cardIdToFrame(id)—— PLAY_RIGHT_1: 1500, PLAY_RIGHT_2: 1501, PLAY_RIGHT_3: 1502, PLAY_RIGHT_4: 1503, PLAY_RIGHT_5: 1504, PLAY_RIGHT_6: 1505, PLAY_RIGHT_7: 1506, PLAY_RIGHT_8: 1507, PLAY_RIGHT_9: 1508, PLAY_RIGHT_10: 1509, PLAY_RIGHT_11: 1510, PLAY_RIGHT_12: 1511, PLAY_RIGHT_13: 1512, PLAY_RIGHT_14: 1513, PLAY_RIGHT_15: 1514, PLAY_RIGHT_16: 1515, PLAY_RIGHT_17: 1516, PLAY_RIGHT_18: 1517, PLAY_RIGHT_19: 1518, PLAY_RIGHT_20: 1519, PLAY_RIGHT_21: 1520, PLAY_RIGHT_22: 1521, PLAY_RIGHT_23: 1522, PLAY_RIGHT_24: 1523, PLAY_RIGHT_25: 1524, PLAY_RIGHT_26: 1525, PLAY_RIGHT_27: 1526, PLAY_RIGHT_28: 1527, PLAY_RIGHT_TYPE_BG: 1528, PLAY_RIGHT_TYPE_TEXT: 1529 } };