Files
erqiwang_youle/client/js/01_SubGame/codes/config/Layout_Cards.js
T
joywayerandClaude Opus 5 6c92920df8 二七王:前端布局与动画常量
照清单 §6 各表逐条录入,字段名与 LayoutSolver 的 node 一一对应、可原样喂入。
布局文件保持纯数据:无函数、无副作用;分行策略等写成数据标记而非函数。
建房选项配置自带 bit 与 value,roomtype 拼串遍历配置即可,不按下标硬拼。
动画参数含 D-8 判定动画的待补说明。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 21:26:16 +08:00

100 lines
4.8 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_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', 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', corner: 'topRight', offsetX: -28, offsetY: 0
};
//冲关牌(叠加层):精灵复制场景(§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 }
}
};