/////////////////////////////////////////////////////////////// ////////// EQW_Layout: 牌区配置(清单 §6.7)//////////////////// /////////////////////////////////////////////////////////////// // 【纯数据文件】无函数、无副作用;依赖 LayoutConstants.js 先加载 // (引用其 EQW_Layout.CARD_SIZE,属 EQW_Layout 内部自引用)。 var EQW_Layout = EQW_Layout || {}; //===== 自己手牌区(清单 §6.7)===== //自己手牌 · 单排:36 张时 spacing ≈ -78(露 32px),与参考图实测 33px 吻合 EQW_Layout.HAND_FAN_SINGLE = { kind: 'fan', direction: 'horizontal', anchorX: 640, anchorY: 455, maxWidth: 1215, itemWidth: EQW_Layout.CARD_SIZE.L.w, itemHeight: EQW_Layout.CARD_SIZE.L.h, spacingMax: 0, spacingMin: -78, anchor: 'center', overlapFrom: 'left' }; //自己手牌 · 双排(埋牌)。分行策略是数据标记 splitStrategy,由调用方据此分行,本文件不写函数: //floorTop = 上排 floor(n/2)、下排 ceil(n/2)(36 张 = 18/18;参考图 17/19 属填充画法,不作依据,见清单 §0.5)。 //spacingMax / anchor / overlapFrom 清单双排行未重复给出,沿用单排同参数(同一批牌、同一压缩规则) EQW_Layout.HAND_TWO_ROW = { splitStrategy: 'floorTop', ROW_TOP: { kind: 'fan', direction: 'horizontal', anchorX: 644, anchorY: 285, maxWidth: 928, itemWidth: EQW_Layout.CARD_SIZE.L.w, itemHeight: EQW_Layout.CARD_SIZE.L.h, spacingMax: 0, spacingMin: -65, anchor: 'center', overlapFrom: 'left' }, ROW_BOTTOM: { kind: 'fan', direction: 'horizontal', anchorX: 644, anchorY: 455, maxWidth: 928, itemWidth: EQW_Layout.CARD_SIZE.L.w, itemHeight: EQW_Layout.CARD_SIZE.L.h, spacingMax: 0, spacingMin: -65, anchor: 'center', overlapFrom: 'left' } }; //手牌 · 选中上浮偏移量定义在 EQW_Anim.HAND_SELECT_OFFSET_Y(AnimConstants.js),此处不重复(SSOT) //底牌区(8 张,未揭示为牌背、揭示后翻正面,同一批精灵) EQW_Layout.BOTTOM_CARDS = { kind: 'line', direction: 'horizontal', anchorX: 655, anchorY: 110, itemWidth: EQW_Layout.CARD_SIZE.L.w, itemHeight: EQW_Layout.CARD_SIZE.L.h, spacing: -36, anchor: 'center' }; //埋牌底牌区(结算,8 张,尺寸档 S) EQW_Layout.BURY_CARDS = { kind: 'line', direction: 'horizontal', anchorX: 640, anchorY: 163, itemWidth: EQW_Layout.CARD_SIZE.S.w, itemHeight: EQW_Layout.CARD_SIZE.S.h, spacing: 2, anchor: 'center' }; //===== 已出牌区(清单 §6.2 示例 / §6.7)===== //三家已出牌区:三家共用 base,LEFT 与 RIGHT 左右镜像(overlapFrom 相反) EQW_Layout.PLAY_AREA = { kind: 'fan', direction: 'horizontal', itemWidth: EQW_Layout.CARD_SIZE.M.w, itemHeight: EQW_Layout.CARD_SIZE.M.h, maxWidth: 170, spacingMax: -35, spacingMin: -62, bySeat: { SELF: { anchorX: 650, anchorY: 265, anchor: 'center', overlapFrom: 'left' }, RIGHT: { anchorX: 1022, anchorY: 120, anchor: 'center', overlapFrom: 'left' }, LEFT: { anchorX: 258, anchorY: 120, anchor: 'center', overlapFrom: 'right' } } }; //已出牌 · 牌型标签:贴该区第一张牌。首槽是固定精灵(PLAY_SELF_1 / PLAY_LEFT_1 / PLAY_RIGHT_1),非动态目标。 //资源 LABEL_CARDTYPE 76×24(清单 §3) EQW_Layout.PLAY_TYPE_LABEL = { kind: 'attach', targetKind: 'sprite', corner: 'bottomLeft', offsetX: 0, offsetY: -24, w: 76, h: 24, bySeat: { SELF: { target: 'PLAY_SELF_1' }, LEFT: { target: 'PLAY_LEFT_1' }, RIGHT: { target: 'PLAY_RIGHT_1' } } }; //已出牌 · 牌角『庄』/『大』标:贴的是本轮打出的哪张具体牌,运行时才能确定,不是固定精灵键。 //本节点只是模板(corner/offset),调用方在确定具体是哪张牌之后,以此为基础补上 target 再喂给 //EQW_LayoutSolver.solve——这是有意的动态目标模式,不在配置里预置 target(清单未给尺寸; //两种资源分别是 MARK_BANKER_CORNER 28×28 / MARK_JOKER_BIG 34×34,按实际显示的是哪个徽标取值) EQW_Layout.PLAY_CARD_CORNER_MARK = { kind: 'attach', targetKind: 'sprite', corner: 'topRight', offsetX: -28, offsetY: 0, runtime: ['target', 'w', 'h'] }; //冲关牌(叠加层):精灵复制场景(§5.6a),spacingMin 放宽到 -88 以容纳 20+ 张的极端情况。 //anchor / direction 清单未重复给出,沿用其余 fan 配置的通用约定(center / horizontal) EQW_Layout.CHONGGUAN_FAN = { kind: 'fan', direction: 'horizontal', anchor: 'center', itemWidth: EQW_Layout.CARD_SIZE.L.w, itemHeight: EQW_Layout.CARD_SIZE.L.h, maxWidth: 420, spacingMax: -40, spacingMin: -88, bySeat: { LEFT: { anchorX: 260, anchorY: 120 }, RIGHT: { anchorX: 1035, anchorY: 120 }, SELF: { anchorX: 640, anchorY: 400 } } };