照清单 §6 各表逐条录入,字段名与 LayoutSolver 的 node 一一对应、可原样喂入。 布局文件保持纯数据:无函数、无副作用;分行策略等写成数据标记而非函数。 建房选项配置自带 bit 与 value,roomtype 拼串遍历配置即可,不按下标硬拼。 动画参数含 D-8 判定动画的待补说明。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
81 lines
4.8 KiB
JavaScript
81 lines
4.8 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// EQW_Layout / EQW_RoomOptions: 建房规则选项(清单 §6.9b / §1.1)
|
||
///////////////////////////////////////////////////////////////
|
||
// 【纯数据文件】无函数、无副作用;依赖 LayoutConstants.js 先加载
|
||
// (引用其 EQW_Layout.TEXT_STYLE.*,属 EQW_Layout 内部自引用)。
|
||
var EQW_Layout = EQW_Layout || {};
|
||
|
||
//===== 建房规则选项区布局(清单 §6.9b)=====
|
||
//两层嵌套:类别竖排(ROOM_CATEGORY_COLUMN)+ 类别内选项槽横排(ROOM_OPTION_ROW)。
|
||
//本节数值按参考图比例估,实际以平台建房界面尺寸为准(清单 §6.9b 原文,不是本文件误差)。
|
||
|
||
//类别竖排。itemWidth 清单未给——类别行宽度等于平台内容区实际宽度,由调用方按实际面板尺寸处理
|
||
EQW_Layout.ROOM_CATEGORY_COLUMN = {
|
||
kind: 'line', direction: 'vertical', anchorX: 0, anchorY: 0,
|
||
itemHeight: 32, spacing: 8, anchor: 'left'
|
||
};
|
||
|
||
//类别标题:贴所在类别行。该行是 ROOM_CATEGORY_COLUMN 求解结果的第 N 项,不是固定精灵,
|
||
//target 由调用方按类别序号注入。资源 ROOM_CAT_TITLE 60×24(清单 §3)
|
||
EQW_Layout.ROOM_CATEGORY_TITLE = { kind: 'attach', hAlign: 'left', vAlign: 'middle', offsetX: 0, w: 60, h: 24 };
|
||
|
||
//类别内选项槽横排。anchorY 清单未给(随所在类别行的 y 浮动,由调用方按该行位置注入);
|
||
//itemHeight 清单未给,沿用 ROOM_CATEGORY_COLUMN.itemHeight(同一行内选择框与文字纵向居中)
|
||
EQW_Layout.ROOM_OPTION_ROW = {
|
||
kind: 'line', direction: 'horizontal', anchorX: 70,
|
||
itemWidth: 150, spacing: 0, anchor: 'left'
|
||
};
|
||
|
||
//选项组之间的额外间隔(同类别下两个选项组之间比组内选项多留的间距)
|
||
EQW_Layout.ROOM_OPTION_GROUP_GAP = 40;
|
||
|
||
//选择框:贴所在选项槽左侧(资源 ROOM_OPT_BOX 22×22)。target 由调用方按选项槽注入
|
||
EQW_Layout.ROOM_OPTION_BOX = { kind: 'attach', hAlign: 'left', vAlign: 'middle', w: 22, h: 22 };
|
||
|
||
//选项文字:贴同槽选择框右侧,纯文字,清单未给宽高。
|
||
//选中态变橙见 EQW_Layout.TEXT_STYLE.ROOM_OPT(normal / selected 两态,由调用方按选中状态二选一)
|
||
EQW_Layout.ROOM_OPTION_TEXT = { kind: 'attach', hAlign: 'right', vAlign: 'middle', offsetX: 8 };
|
||
|
||
//房卡附注:贴扣卡组最后一个选项(固定精灵 ROOM_BOX_CARD_2)右侧
|
||
EQW_Layout.ROOM_CARD_COST_NOTE = {
|
||
kind: 'attach', target: 'ROOM_BOX_CARD_2', hAlign: 'right', vAlign: 'middle', offsetX: 20,
|
||
textStyle: EQW_Layout.TEXT_STYLE.ROOM_CARD_COST_NOTE
|
||
};
|
||
|
||
//折行:选项数超过 maxPerRow 时改用 grid。二七王每组最多 2 项,不会触发(清单 §6.9b 原文);
|
||
//itemWidth / itemHeight / anchorX / anchorY 清单未给(该分支未被实际使用),仅记录已定的三个字段
|
||
EQW_Layout.ROOM_OPTION_MAX_PER_ROW = 4;
|
||
EQW_Layout.ROOM_OPTION_OVERFLOW_GRID = { kind: 'grid', spacingX: 0, spacingY: 8, fillOrder: 'row' };
|
||
|
||
///////////////////////////////////////////////////////////////
|
||
////////// EQW_RoomOptions: 建房规则选项配置(清单 §1.1)///////
|
||
///////////////////////////////////////////////////////////////
|
||
//整个界面由本配置驱动渲染,加一个选项 = 配置里加一条,不改渲染逻辑(工程总则 §5 OCP / §6 配置优先)。
|
||
//type: 'radio' 单选 / 'checkbox' 多选 / 'radioOptional' 单选可不选
|
||
//选择框帧号 = (useCheckbox ? 3 : 1) + (selected ? 1 : 0),useCheckbox = (checkbox 或 radioOptional)
|
||
//【roomtype 拼串只在一处实现】每个选项自带 bit 与 value,拼串就是遍历本配置,
|
||
//不得在别处按下标硬拼(与服务端 class.config.js parse() 对称的 SSOT 要求)
|
||
var EQW_RoomOptions = {
|
||
categories: [
|
||
{ titleFrame: 1, /* 牌局 */ groups: [
|
||
{ key: 'aset', type: 'radio', bit: 0,
|
||
items: [ { label: '6局', value: '0' }, { label: '12局', value: '1' } ] },
|
||
{ key: 'card', type: 'radio', bit: 1, note: 'cardCost',
|
||
items: [ { label: '房主扣卡', value: '0' }, { label: 'AA每人扣卡', value: '1' } ] }
|
||
] },
|
||
{ titleFrame: 2, /* 模式 */ groups: [
|
||
{ key: 'peek', type: 'radio', bit: 4,
|
||
items: [ { label: '可查牌', value: '0' }, { label: '不查牌', value: '1' } ] }
|
||
] },
|
||
{ titleFrame: 3, /* 规则 */ groups: [
|
||
{ key: 'rules', type: 'checkbox',
|
||
items: [ { label: '傍王', bit: 2 }, { label: '爬坡', bit: 3 } ] }
|
||
] }
|
||
],
|
||
//房卡消耗联动(协议 §0.5):不硬编码在 UI 代码里
|
||
cardCost: {
|
||
'0': { '0': '房主2张', '1': '房主4张' }, //房主扣卡:6局 / 12局
|
||
'1': { '0': '每人1张', '1': '每人2张' } //AA 每人扣卡:6局 / 12局
|
||
}
|
||
};
|