Files
HexTrails/docs/airport-design.md
T
toshiocn 0e67c4c188 feat(airport): draw the entry channel to the tray edge
Board-edge runways reach the tray outline with a threshold gate, fixed apron slabs mark each side, and a connected side lights the whole plane-to-stand channel in the neutral hint colour.
2026-09-21 14:38:54 +08:00

304 lines
18 KiB
Markdown
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.
# 六角机场:起降调度游戏设计文档
**版本:** v0.1 · 规则基线与原型验收版
**日期:** 2026-09-17
**项目名:** 六角机场(暂定)
**状态:** 本轮讨论确认的规则基线。实现与测试结果见 [机场实验室](../labs/airport/README.md),不以自动测试代替真人体验验证。
## 1. 游戏定位与设计目标
### 1.1 游戏概述
一款基于 HexTrails 六角轨道玩法的竖屏机场调度解谜游戏。
玩家点击地面飞机使其起飞,清理必要的通路;旋转六角底盘,改变轨道连接;点击棋盘外等待的飞机,使其从所在侧进入,停到预设的同色停机位。
**在有限操作次数内,让本关全部来机同时完成停靠,即可过关。棋盘上可以保留原有飞机,不要求清空棋盘。**
### 1.2 核心体验
玩家判断哪些原有飞机必须先起飞、哪些可以保留,怎样旋转连接来机所在侧,哪架来机应先停,以及是否值得让已停靠来机再次起飞、换侧进入。
操作保持直接:点击飞机尝试起降,点击左右旋转按钮改变连接。不手动选路线、不拖动飞机、不增加降落确认步骤。
### 1.3 设计依据与优先级
- [原作说明](../README.md)。
- [原作设计规范](../Design.md)。
- [关卡 38—39 录像分析](../../_handoff/gameplay-recording-analysis.md)。
- 2026-09-16 至 2026-09-17 本轮机场玩法讨论的最新结论。
新玩法明确修改的规则优先于原作;其余视觉、轨道、碰撞及交互规范尽量继承。录像用于理解原作体验,不作为新玩法成立的证据,也不据此推导新玩法的平均通关时长。
### 1.4 与原作的区别
| 项目 | 原作 | 新玩法 |
|---|---|---|
| 胜利目标 | 清空棋盘 | 全部来机同时停靠 |
| 棋盘棋子 | 带箭头的六角棋子 | 保留六角占位的飞机 |
| 颜色 | 外观区分 | 来机与专用机位匹配 |
| 轨道颜色 | 统一表现 | 仍然统一,不参与匹配 |
| 占位 | 随离场减少 | 起飞减少,降落增加 |
| 场外元素 | 无待接入棋子 | 六侧等待的来机 |
| 旋转、失败尝试 | 免费 | 消耗操作次数 |
| 来机再次起飞 | 无 | 在实际出口侧等待 |
| 广告点 | 不继承旧规则 | 激励广告增加操作额度 |
## 2. 游戏对象与空间规则
### 2.1 棋盘与轨道
保留六角棋盘、格内轨道配对、弯道转向和交叉不换轨。旋转以 60° 为单位,只有底盘与轨道旋转,飞机位置和机头方向、停机位位置和颜色、外围六个贴边停机坪均保持固定。
轨道没有颜色匹配规则。是否能经过取决于连接关系和碰撞判定。
### 2.2 原有飞机
原有飞机指开局已经位于棋盘上的飞机。从机头方向进入轨道,成功起飞后永久离场,不计入接机完成数量,颜色不限制起飞路径。离场只释放占位,不把普通格变成停机位。
不强制所有原有飞机朝外;机头方向是关卡配置的一部分。
### 2.3 来机
来机具有固定身份、颜色和当前等待侧。等待时不自行绕盘换侧;点击只检查当前所在侧的入口。成功停靠后占位并可能阻挡其他飞机。
来机再次起飞后,转到实际离场出口所属侧等待,仍属于未完成目标,必须重新停好。**来机身份不会因为起降变成原有飞机。**
### 2.4 专用停机位
停机位在关卡设计时预设,具有明确位置、颜色和专用视觉标识。一位一机;来机只能在同色位完成停靠,同色来机不与机位逐一编号绑定。
普通空格不能作为目标。空停机位可以经过,不构成障碍;上面有飞机时按正常六角占位阻挡。原有飞机即使位于专用机位上,也不计入接机完成数量。
每种颜色的机位数量等于该色来机总数,首轮不增加备用位。
### 2.5 场外停机坪
来机停靠在棋盘六条边外侧,不悬停在正北等罗盘方位。现工程是平顶六边形:六条边是上方、右上方、右下方、下方、左下方、左上方。竖直的左侧、右侧是尖顶六边形才有的边,对应本棋盘的左右两个顶角,不是入口。
同侧可有多架、多色来机,同色来机也可分处不同侧。停机坪上的排列不绑定精确入口。每个边界入口和出口必须唯一归属某一条边;角部不同端口各有唯一归属。画面分区和规则归属必须一致。
## 3. 起飞、降落与碰撞
### 3.1 原有飞机起飞
1. 从格心沿机头方向起步。
2. 按当前轨道配对追踪唯一行进路线。
3. 检查能否离场及完整运动过程是否碰撞。
4. 成功时立即释放逻辑占位,播放离场动画,永久离开本关。
实际离场侧由轨道出口决定,不一定等于初始机头方向。失败起飞不改变位置,碰撞回退表现继承原作。
### 3.2 场外来机降落
点击后检查当前所在侧的全部边界入口。合法降落需同时满足:入口属于当前侧、轨道通往预设同色机位、机位未占用或预占、路径有效、完整运动过程不碰撞任何在场飞机的六角占位。
| 结果 | 行为 |
|---|---|
| 恰好一个合法结果 | 立即占位并播放降落动画 |
| 没有合法结果 | 留在场外,震动并反馈原因 |
| 多个合法结果 | 关卡设计错误,不设置自动选择优先级 |
不采用最近、最远、编号优先或玩家手选。完整停靠结果包括入口路径、目标机位和停稳朝向;同一机位的不同进场朝向也不能任意选择。
### 3.3 最后一段停靠
采用原作“格心出发”的反向连接:从目标格入边进入格心,最后一段也检查碰撞。保持驶入朝向,不自动掉头;后续转盘不改变机头。
经过空停机位与在此结束运动是两种路径判定;空位不强制截停经过的飞机。
### 3.4 已停靠来机再次起飞
起步、轨道跟随和碰撞检查与原有飞机相同。成功后立即释放机位、取消完成状态,沿路离场,随后在实际出口所属侧恢复等待。
`上方停机坪 → 停靠 → 从下方离场 → 下方停机坪`
下一次只检查下方入口。重新起飞和再次降落分别消耗次数。
### 3.5 六边形碰撞
继承原作六边形碰撞体,不以飞机贴图的透明轮廓代替。检查经过被占用格、弯道接触、邻格擦碰、最后入位段和离场必要延伸段。
绘制、动画和碰撞使用同一套路径数学。禁止画面绕过却判撞、或飞机动画穿过六角占位。
### 3.6 降落失败反馈
| 原因 | 文案与表现 |
|---|---|
| 所在侧不连接适用目标 | 原地震动,“没有可供行进的路线” |
| 有连接但路径受阻 | “路线受阻”,高亮路线及第一个阻挡物 |
| 目标已占用或预占 | “没有可用的跑道” |
多个前后阻挡只高亮行进方向上的第一个;移走后再尝试,才显示后续阻挡。这是点击后的失败反馈,不增加选路、确认步骤,也不自动给完整解答。
## 4. 操作次数、胜负与状态同步
### 4.1 计步
原有飞机起飞尝试、来机降落尝试、已停靠来机起飞尝试、单次 60° 旋转,每个接受执行的动作扣 1 次。成功和失败均计步,重复落地也计步。
点击空白、设置、阅读已有反馈不属于调度动作;同一运动中的飞机重复点击不形成新指令。若实现拖动旋转,跨越多个 60° 档位时按实际执行档位数计步。
### 4.2 胜利条件
全部来机同时占据合法同色机位,不在等待区或再次起飞过程中。原有飞机是否清空不影响判胜,不按累计落地次数计数。
最后一次操作刚好用尽额度但完成目标时成功优先;通关界面等待必要动画结束。
### 4.3 步数不足与死局
次数不足时暂停新的调度操作,可选择激励广告补充或重来。空间无解时,增加次数不能解决,需要重来或后续另行设计的恢复功能。
只保证开局存在预算内免费解,允许玩家误操作造成死局。当前无飞机可动不等于无解,还需考虑旋转和后续起降。搜索未完成不得误报已证明无解;确认无解时不能把广告加步数推荐为解法。
### 4.4 点击与动画
逻辑先于动画:起飞成功即释放原位,降落成功即占用目标并扣步,后续点击按更新后的逻辑棋盘判断。移动贴图不作为额外实时障碍,降落目标预占参与碰撞。
两架来机争抢同一空位时,第一架判定成功立即占位,第二架在动画未结束时也必须重新判定;无其他合法结果就提示“没有可用的跑道”。
飞机运动时不执行底盘旋转;旋转期间的点击可暂存,到位后按顺序执行。重来、换关、打开弹窗清理未执行暂存指令。
来机离场后必须明显飞入实际出口侧等待区,不能消失后无提示换位。
## 5. 界面、视觉与声音
### 5.1 视觉方向
机场实验室使用原工程第 07 套「马卡龙」:奶油色世界、白色软托盘、带白缝的糖砖格、藕紫轨道、糖果色棋子与白色飞机剪影。参考 [马卡龙设计规范](../design/directions/macaron/design.md)。主题只改外观,不改匹配规则。
彩色飞机和机位是主要阅读对象,装饰不得遮挡轨道、机头、机位和碰撞边界。正顶视飞机保留可感知的六角占位边界。通路不着匹配色。
盘边跑道与停机坪航线(2026-09-21):
- 每条板边轨道不再在糖砖内收口,而是沿端口法线延伸到托盘外缘,并在开口处画一道垂直门槛,让"开到盘边的出口"和"中途断掉的线"一眼可分。
- 托盘外、六个侧的法线方向画固定浅色停机坪航线,等待机停在其上;航线不随底盘旋转,跑道与门槛随底盘旋转。
- 当某架来机的当前侧在当前朝向下接得上同色机位时,用中性强调色(马卡龙 `hint`,不是飞机或机位颜色)把"飞机 → 盘边开口 → 机位"整条通道点亮,并在开口处加一圈标记、保留进场箭头;被挡时阻挡物仍用 `blocked` 标红。常显跑道负责说明"这里有没有开口",高亮负责说明"这架能不能进"。
- 停机坪机位仍按其原有平边法线摆放(与入口法线差半步),不做位移;错位由高亮通道跨越,不靠移动机位。
### 5.2 颜色与身份
机位具有彩色边框和专用停靠标识;已停靠来机还需独立完成标记,不只凭朝内朝外区分。本稿默认使用小型 P 标记,正式素材沿用统一图标语言。
飞机与对应机位附加一致的小型颜色类别符号,辅助辨色。主题改变不能重映射匹配关系。
### 5.3 布局
顶部显示关卡、剩余次数和接机进度。棋盘六条边外侧预留停机坪,不遮挡边界入口;同侧多机可辨、可点。左右旋转使用独立区域,重来和设置不覆盖棋盘或停机坪。
沿用原规范的最小触摸尺寸、文字对比度和模态要求。若保留缩放,棋盘、机位和等待区的相对关系一致,不能改变侧归属。
### 5.4 动效与声音
起降沿真实轨道,弯道朝向跟随运动。转盘参考原作 240ms 节奏。降落失败原地震动,原有飞机起飞碰撞回退。来机再次起飞不用永久消除式碎裂表现。
点击、旋转、起飞、停靠、受阻、通关使用可区分的声音;音效可关。减少动态效果时保留状态文字与必要路线反馈。精确素材与时长属于视觉调校,不改变逻辑。
## 6. 关卡设计与商业化
### 6.1 关卡配置
每关包含棋盘和轨道、原有飞机的位置方向颜色、机位的位置颜色、来机身份颜色初始侧、初始额度、广告补充配置、完整免费回放解和主要调度意图。
### 6.2 制作原则
- 局部清障可完成目标。参考解记录最终保留的原有飞机数量,不把落地的来机冒充保留的原有飞机。
- 外圈容易停靠可以用于教学;通过全部来机同时停好,避免反复使用一个位置累计完成目标。
- 顺序关系来自空间阻挡,不依赖隐藏编号或后台优先级。
- 换侧调度有可理解的收益,不能普遍靠反复起降碰运气。
- 不要求唯一最优解;只禁止同次降落出现多个合法执行结果。
### 6.3 预算原则
初始额度覆盖至少一条完整免费解,普通关留出合理调整余量。不能给最少 10 步的关卡只配 5 步,迫使广告通关。
记录可行解步数、经证明的最优步数、合理非最优解步数、重排成本、先清全盘再接机是否可行及成本。未证明最优,不冒称最优。
对用预算抑制全清的关卡,期望:
> 合理解法及容错次数 ≤ 初始额度 < 先清全盘再接机的最少次数。
无法同时满足则调整布局,不把预算压成必须精确最优。广告补充后允许更费操作的解法,不要求仍禁止全清。
### 6.4 教学顺序与棋盘规模
前三关是教学,使用 19 格(半径 2)小棋盘,依次介绍起飞、清除首个阻挡、旋转且飞机不动、同侧接入同色机位、落地占位、再次起飞换侧、次数内完成。第一关不同时引入多色、多侧、长路和换侧调度。
教学结束后棋盘逐步放大,对齐原作主线而不是继续堆 19 格:
| 阶段 | 原作依据 | 机场用法 |
|---|---|---|
| 入门 1–7 关 | v0.5 前 7 关半径 2(19 格),棋子 3–6 枚;另有 3 关教学序章也用 19 格 | 现有三关:19 格,来机 1–2 架 |
| 熟悉 | v0.5 第 8 关起半径 3(37 格);第 1–2 章默认 37 格,棋子约 3–11 | 教学后正式关:37 格,原有飞机与来机增多 |
| 舒缓加长 | v0.3/v0.5 后期穿插半径 4(61 格);章末可到半径 5(91 格) | 后期长局:61 格,再视容量到 91 格 |
| 容量上限 | v0.5:半径 2/3/4/5 的目标棋子约 6 / 11 / 14 / 17 | 机场额外有来机和机位,地面原有飞机不超过同档容量 |
原作不把棋盘变大当成变难:大盘可以轻松巡游,小盘也可以做局部判断。机场同样:放大是为了容纳更多初始飞机和更长的进场,不是自动加难。
当前练习关已按这条曲线落地:教学三关之后是两个 37 格练习关(各 8 架地面原有飞机),再加一个 61 格练习关(13 架地面原有飞机)。放大档位只增加初始棋子与进场距离,不引入新规则。
v0.1 首章已混用 19/37 格;v0.5 录像中的 38–39 关属于第 1 章,棋子 11 和 15 枚,已超过 19 格教学盘能舒服放下的数量。
### 6.5 IAA
以主动选择的激励广告补充次数:展示奖励量,成功后只增加次数、保留棋盘,取消或失败不改变棋盘和次数,避免重复领取。保留重来,不把广告设成初始解法必需。
奖励数量和次数为可调配置,不宣称商业验证完成;其他广告位不纳入本版。独立原型未接 SDK 时,必须把测试奖励标明为测试,不伪装成真实广告观看。
## 7. 验证与实现边界
### 7.1 开局可解
每关保存并回放不使用广告、不超预算、通过真实路径碰撞判定、全部来机同时停好的完整解;记录原有飞机保留量。允许玩家进入死局,不要求所有操作顺序通关。
### 7.2 停靠无歧义
覆盖清障、旋转、占位改变和换侧,不仅检查开局或参考解。首轮使用充分但保守的筛选:移走所有飞机、保留机位,在六个朝向下对每侧每色枚举完整结果,至多一个。占位只会减少通路,不会新增结果。
这属于制作筛选,不是新增玩家规则;限制过强时可用完整可达状态验证替代。
### 7.3 重点测试
| 场景 | 预期 |
|---|---|
| 清走普通格上的红机 | 不生成红色机位 |
| 同侧多个入口,仅一个合法结果 | 自动执行该结果 |
| 只有其他侧可接入 | 当前来机不能跨侧找入口 |
| 无色轨道连接同色位 | 正常判定降落 |
| 弯道擦邻机 | 受阻 |
| 多个前后阻挡 | 只高亮第一个 |
| 连点抢位 | 第一架预占,第二架重新判断 |
| 来机异侧离场 | 换到实际出口侧并恢复未完成 |
| 反复使用一个位 | 不累计完成全部目标 |
| 最后一次完成目标 | 通关优先 |
| 当前不动但旋转可解 | 不误报死局 |
| 错误操作导致真死局 | 不承诺加步数可解决 |
### 7.4 状态与接口
规则层保存飞机类型、身份、颜色、位置、朝向、状态、等待侧、机位与占用、底盘朝向、额度及动画相关锁。分别返回起飞、降落、旋转结果,提供真实路径、目标、停稳方向或首个阻挡,供表现层使用。
新求解器必须考虑降落增加占位、换侧、朝向和动作成本,不直接沿用原作“能清就清”的求解策略。
首先独立实验实现,关卡、进度与原作主线隔离。
## 8. 首轮范围与未验证结论
### 8.1 三个教学关
1. 单机接入:19 格,局部清障后停靠,明显保留原有飞机。
2. 同色不同侧:19 格,证明自动匹配与停靠无歧义。
3. 双色调度:19 格,包含停靠阻挡、再次起飞换侧与预算。
这三关只承担教学。正式关从 37 格起放大,见 6.4。不增加计时、燃油、随机来机、尺寸差异、备用位或特殊障碍。
### 8.2 辅助功能
撤销不作为核心恢复方式,也不直接继承免费撤销经济。首轮玩家原型仅提供重来和失败反馈;主动提示与撤销的次数、计步和商业化后续独立设计。测试回放不作为玩家通关机制。
### 8.3 仍需试玩验证
玩家能否理解同侧自动匹配;多机位情况下无歧义布局是否丰富;额度是否兼容容错与局部清障;换侧是否有目的;死局是否导致过长返工;六边停机坪是否清晰易点。
**核心验收:玩家能看懂从哪里进入、为何受阻、停下后影响什么,并在无需清空棋盘的情况下完成全部接机。**