- 07 macaron, referenced from Meowdoku: cream worlds, a white tray with gutters, candy tokens with white arrows, two-column 关卡/待解 HUD, white elevated tool discs (macaron-only exception to the flat rule), full-screen dark result overlay, a brick ripple on board clear, an eased glide-out and dot-lattice dissolve on exit; Resource Han Rounded subset fonts (SIL OFL) in assets/fonts with the charset and regeneration note - 06 signpost: the design.md, tokens and preview directory that earlier commits left untracked - design docs, catalog, manifest, showcase and base spec updated to seven directions; the analysis and proposal live in docs/art-proposal-macaron.html - the renderer, app, geometry and CSS sources for both directions were already carried by the level commits made from this working tree Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
9.9 KiB
五套设计的接入与维护约定
适用于主游戏的 01–05 五套设计。先读 方案目录,确定设计 ID,再读对应的 design.md。本文和各套 design.md 是人工维护的设计规则;数值以实现源及其生成的 tokens.json 为准。发现文档与实现不一致时核对用户已确认要求并同步修正,不能用旧说明撤回新要求。
选择一个设计与主题
三个参数分别控制不同的事:
| 参数 | 合法值 | 作用 |
|---|---|---|
design |
calm / vivid / toy / animals / paper / signpost / macaron |
棋子造型、轨道画法、配色库和控件风格 |
theme |
lagoon / apricot / lavender / rose / midnight |
轻松、进阶、烧脑、挑战、每周挑战的视觉主题 |
colors |
4 / 7 / 9 / 12 | 主游戏单关使用的棋子配色数量,默认 7 |
在根目录执行 npm run dev。打开 paper 的轻松主题,或 paper 的夜间审核。审核页用控件切换色数;colors URL 参数由主游戏读取。设计总览的主题切换只用于视觉对照。
不传 design 时使用 calm。主游戏不传 theme 时按关卡评分选前四种主题;midnight 需显式指定。主题名与配色不改变难度或玩法。编辑模式和工坊试玩使用基础自由配色,不能拿它们判断设计参数是否生效。审核记录保存在 hex-trails-art-review-v1,与游戏存档分开。
Agent 如何读取数据
- 读取 manifest.json,确认
schemaVersion === 1。 - 按
designs[].id找方案,读取designDoc与tokens。manifest 的所有路径字段均从仓库根目录解析,不从当前 JSON 目录拼接。 - tokens 中的
themes给出环境、文字和已展开的棋盘材质。palettes["7"]是 7 色时的有序色库索引;索引指向本文件的pigments,不能借用另一套设计的色库。 - tokens 是当前实现的只读数值导出,不能单独描述完整造型或所有 CSS 控件。几何和组件规则仍需读取 design.md、共享渲染器及 CSS。
design/tokens.json是旧有基础语义 token 导出,不包含五套方案全集。
manifest 不存用户审核意见,也不表示最新方案已被选为默认。文档中的“最新”只表示新增顺序。
复用现有渲染器
浏览器页面已有 <canvas id="board" width="600" height="600"></canvas> 时,可在仓库根目录页面的 ES module 中运行以下代码;通过 HTTP 加载,不直接双击文件:
import { artDirection, directionTheme } from './src/art-directions.js';
import { CanvasPainter, drawScene } from './src/renderer.js';
import { layout } from './src/geometry.js';
import { createStudyLevel } from './src/study-levels.js';
import { TILE_ATLAS } from './src/sprites.js';
const direction = artDirection('paper');
const theme = directionTheme(direction, 'lagoon', 7);
const level = createStudyLevel(3);
const canvas = document.querySelector('#board');
const painter = new CanvasPainter(canvas.getContext('2d'));
const atlas = new Image();
atlas.src = TILE_ATLAS;
await atlas.decode();
painter.atlas = atlas;
canvas.style.background = theme.background;
canvas.style.color = theme.ink;
painter.ctx.clearRect(0, 0, canvas.width, canvas.height);
drawScene(painter, level, level.tiles,
layout(level.cells, canvas.width, canvas.height), { theme });
drawScene 只画棋盘、轨道与棋子,不画画布背景,也不自动清屏。响应式画布使用实际显示尺寸和 DPR,复用 board-viewport.js / app.js 的适配逻辑。不要根据每枚棋子的位置另设显示比例。
整盘绘制时传入完整的 level.tiles 与当前剩余 tiles。drawScene 以棋子在初始 level.tiles 中的索引映射主题 palette,因此移除、撤销与运动不换色;不要按“剩余棋子第几个”重新编号。独立棋子样本才使用 appearanceTile({color: pigmentIndex, dir}, theme) 再调用 drawTile,这里的 color 已是该设计的色库索引。
所有方向以弧度 -Math.PI / 2 + dir * Math.PI / 3 绘制,dir 为 0–5。移动中的棋子经共享 drawExit / drawTile 保持同一造型。不要复制静态棋子绘制代码实现另一套移动画法。
接入完整游戏界面
| 接入点 | 实际来源 | 注意事项 |
|---|---|---|
| 设计与主题定义 | src/art-directions.js | ID、12 色库、五主题、artStyle;calm 复用基础色库 |
| 基础语义色、字体、动效 | src/design-tokens.js | 被各设计继承;不能用基础色覆盖新方案的独立色库 |
| 场景几何与运动绘制 | src/renderer.js、src/token-art.js | 使用同一套命令和曲线路径 |
| 主游戏选择逻辑 | src/app.js | 设置 body.dataset.design / theme,应用场景背景与文字色 |
| 控件风格 | art-directions.css | 用 body[data-design] 限定,避免影响其他方案 |
| 底部道具及布局 | game-tools.css | 最后加载,保证扁平道具覆盖既有立体风格 |
| 通知与通用组件 | notifications.css、components.css | 通知位于剩余步数下方,奖励为金色发光星星 |
| 图集与裁切 | src/sprites.js、src/ui-skin.js | 棋子图集只在 calm 分支使用;UI 图标各套共享 |
主游戏 CSS 加载顺序参考 index.html:style.css → tokens.css → components.css → notifications.css → campaign.css → art-directions.css → game-tools.css。只有设置 CSS 主题而没给 drawScene 传 theme,棋盘仍会使用基础画法。只有给画布传 theme 而没设置 body.dataset.design,控件不会切换。
所有方案共用的产品要求
- 棋盘在通知区与旋转区之间垂直居中。旋转与道具占真实布局行,不绝对定位压住棋盘。适配手机、Pad、折叠屏和桌面。
- 撤销、重来、提示是游戏道具,与顶部紧凑导航分开。常规底座 64px,宽度至少 600px 时为 68px,短屏高度不超过 600px 时为 56px;图标 32px、标签 13px。底座无阴影、立体底边或渐变高光,方案的棋子材质不覆盖这条要求。唯一例外:07
macaron的道具是参考作品的白色圆钮带柔和投影,2026-09-14 用户确认只允许该方案使用,其他方案(含新增方案)继续保持扁平,不得引用这条例外。 - 次数和“▶ AD”角标只用于设计示例,当前不接入真实库存、广告或付费获取逻辑。
- 奖励星星为黄色/金色并带光感。通知固定在剩余步数下方,不能挪回棋盘下方。
- 路线以弯曲路径为主要观看内容。动画复用 exit-animation.js 和 collision-animation.js。离场时长按实际路径长度计算,不把旧文档中的固定时长或上下限当作当前速度公式。
- 设计切换不改规则、关卡布局、编号、关卡版本或存档。设计编号 01–05 与关卡 v0.1–v0.5 是两套不同的标识。
修改与验证
只改配色:编辑 art-directions.js 中指定设计;calm 的色库及基础主题在 design-tokens.js。改造型:编辑 token-art.js 的指定分支,必要时改 renderer.js 的相关绘制,并同步该套 design.md。改控件:编辑对应 CSS 的作用域规则;共用道具约束仍需保留。
文档整理不需要重新生成关卡。根目录执行:
npm run design
node --test tests/design-packages.test.js tests/art-directions.test.js tests/themes.test.js
node design/examples/render-design.mjs paper lagoon 7
node scripts/build.mjs
npm run design 会刷新 manifest、每套 tokens、HTML 和旧入口;不覆盖人工维护的 design.md、shared.md、README.md。文档测试检查目录与链接、数值导出与运行时一致性,并执行接入示例。视觉修改另检查五主题、长弯路离场、碰撞、旋转与撤销;至少查看 390×844 手机、短屏、平板和桌面。纯文档修改检查链接和预览能加载即可。原生验证单独报告。
跨引擎范围与已知限制
绘制抽象只要求 polygon、line、circle,calm 可额外使用 sprite 图集。路径单位是格半径;不能把示例画布尺寸当作固定像素规范。实际应用背景和 UI 布局由宿主引擎实现。
cocos/HexTrailsBoard.ts 是适配示例,当前没有传入这五套设计的 theme,且动画时序仍有旧值;cocos/CandyUiSkin.ts 也不是五套设计的完整原生控件实现。移植时需显式接入主题、核对圆头线条与图层,并按浏览器参考画面验收;本目录不代表原生移植已完成。
paper 的浅色轨道是用户认可的特例,轨道与棋盘对比度低于基础 3:1 目标;不要为通过基础轨道指标自行加深。文字和方向需保持可读。各套 design.md 标明具体差异。
实现依据与旧文档
| 依据 | 确认的事实 | 修改/复现入口 |
|---|---|---|
| art-directions.js 导出的五个 ID | 五套方案共存且都有五种主题 | manifest.json、每套 tokens.json |
| renderer.js 的 visualTile 与 paper 分支 | 固定初始索引配色,paper 使用更细轨道 | render-design.mjs、art-directions.test.js |
| game-tools.css 的最后加载覆盖 | 道具保持扁平且分行布局 | 各套 index.html、主游戏 |
根目录 Design.md / Design.html 保留基础组件规范与历史说明,docs/art-direction.md 保留较早的制作简报。它们的“唯一色源”、轨道对比度和动画旧值不能无差别套用到五套设计。新增方案的接入从本目录开始。