Files
2026-10-01 23:26:47 +08:00

237 lines
12 KiB
Markdown
Raw Permalink 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.
# 16 · 《回声地窟》(dungeon / Echo Cavern)
> **给开发者的实现要点摘要**
> 1. 交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。空间范式对齐 [26-apply-escape.md](26-apply-escape.md) 与 00 §5.3:**四向滑动是玩法 → 帮助一律长按**。
> 2. 核心动词:单击=声波脉冲(听回声看地形)。四向滑动=按面朝相对移动(前/左/右/后)。**废除**长按=前进、双击=重发脉冲。
> 3. 听声辨位 Roguelike:网格 + 面朝。回声=静态地形,脚步=动态怪物,播报=绝对方位——三套信息单源 `grid`。
> 4. 一命一局,7 层满通约 24 分钟;金币进元进度(5 项遗产)。L1 ATK=0、L2 ATK=1,学期不可能死。
> 5. 台词 [16-dungeon-voice-ids.md](16-dungeon-voice-ids.md)(127 句 ×2 性别,无 NPC)。随机性 mulberry32,`opts.seed` 可注入。
> 6. 规模:bgm 4 + sfx ~36 + voice 127×2。回声用预生成资产 + setTimeout + volume,不用引擎外实时节点。
---
## 附录 C · 设计单
### 1. 一句话核心动作
**朝四个方向滑动在洞窟里走,单击发出声波脉冲听地形,按住屏幕问路。**
### 2. 玩家能感知的状态(3 个)
| 状态 | 听感 | Floor |
|---|---|---|
| 探索 | 洞穴环境 loop(amb_cave)常响;脚步/回声是内容 | ACTION |
| 听讲 | 教学/房间/战斗报名语音,BGM 整链压低 | SPEAKING |
| 危险 | battle BGM 或 danger earcon + 心跳震(血量≤25% / 敌前摇) | ACTION + danger 签名 |
探索期撞墙=闷响 + invalid,不算第四态(一次性教)。
### 3. 新手手势与解锁(四向滑动是玩法)
| 手势 | 含义 | 说明 |
|---|---|---|
| 四向滑动 | **面朝相对移动**:上=前进一格;左=向左侧走一格并转向该向;右=向右侧走一格并转向;下=后退一格(面朝不变) | 阶段 0 即核心,不按阶梯锁 |
| 单击 | **脉冲**(探索);战斗玩家回合=挥击;敌方前摇窗内=格挡 | 核心动词 |
| 长按 | **我在哪**(层/血/面朝/一个动作,≤20 字) | 帮助入口,全空间游戏同一条 |
| 双击 | 新手期按单击处理。阶段 3=重听最近回声编码(冷却外再脉冲,不扣资源) | 禁止「双击=立刻免冷却重播」绑死连点 |
| 下滑 | 对局中=后退(玩法占用)。菜单仅阶段 2 且 **SETTLE/TITLE** 开放 | 00 §5.3 |
对局期关闭长按旁白加速(帮助占用长按)。
### 4. 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 四向滑动 | 长按 | 双击(未解锁) | 连点/乱滑 |
|---|---|---|---|---|---|
| 教学作答 | 按步骤(脉冲/确认) | 按步骤走/转向 | 帮助 | 按单击 | 计入迷茫 |
| 探索 ACTION | 脉冲 + 回声组(冷却中 invalid) | 移动=脚步 silent-ok;撞墙=闷响+invalid+归因一次 | 帮助 | 按单击(冷却后再脉冲=合法「再听」) | 乱滑计入迷茫;冷却连点只 busy/invalid |
| 描述在播 | 跳过这句 + ok | 打断并移动 | 打断,帮助 | 按单击 | 第一下有效 |
| 战斗·我的回合 | 挥击(面前才中) | 左/右转面对敌人;下=尝试逃跑(普通怪必成挨一下;Boss 拒绝) | 帮助(血量+敌方位) | 按单击 | 计入迷茫 |
| 战斗·敌前摇 | **格挡**(面对来源减伤 80%) | 转身(窗口内来得及则下一击面对) | 帮助 | 按单击=格挡 | 只处理第一下 |
| 结算 | 再来一局 + ok | invalid + 解释一次 | 重听结算一句 | 按单击 | 只处理第一下 |
| 菜单 | 确认当前项 | 右=下一项 / 左=上一项 | 重听菜单说明 | 按单击 | busy |
脉冲已有明显内容音时可 silent-ok。invalid/busy 永远出声。
### 5. 等待点配置
**教学(6s/15s)**
| 步 | 期待 | 指令 |
|---|---|---|
| D0 | 单击 | 「黑暗。点一下,听回声。」 |
| D1 | 再单击 | 回声演示(前方保证有墙) |
| D2 | 上滑(前进) | 「朝前,滑一下。」 |
| D3 | 左滑或右滑 | 「向左滑,转身走。」 |
| D4 | 单击 | 拾到本房金币(首胜) |
| D5 | 长按 | 「迷路了,按住屏幕。」 |
| D6 | 走向教学怪:单击挥击 | ATK=0,乱打不死 |
探索期无固定等待点。迷茫:静默 40s 起 / 乱滑 / 连续无效。L1 短目标句(「向右滑。」)→ L2 只放行导航方向 → L3 游戏朝楼梯走一步。卡关带路并入迷茫,不再 60/120/180 独立轰炸。
战斗回合:turn + 等待声;8s short「点一下,打。」15s earcon。
### 6. 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | amb_cave →「黑暗。点一下,听回声。」(critical) | 单击脉冲 | 「点一下。」 | 滑动:invalid +「先点一下。」 |
| 3~8s | pulse + echo + 材质 →「对。回声越快,墙越近。」 | 再点(巩固) | 短句 | 冷却内连点:busy |
| 8~10s | 奖励音(听懂回声=第一次成功) | — | | |
| 10~25s | 「朝前,滑一下。」 | 上滑前进 | 「滑一下。」 | 撞墙:闷响 +「那边是墙。」 |
| 25~40s | 「向左滑。」→ 脚步 | 左移 | 短句 | 纠错一次 |
| 40~60s | 「按住屏幕,听自己在哪。」 | 长按 | 「按住。」 | 其他:invalid |
| 60~90s | 自由探索;保证房内金币 | 走+脉冲 | 迷茫接管 | 撞墙无伤 |
| 90~180s | 教学蝠 ATK=0:脚步 → 前摇窗单击格挡 → 单击挥击至击杀 | 战斗 | L3 演示格挡 | 学期不掉血 |
节奏:3s 内脉冲 ✓;10s 内第一次听懂回声 ✓;每 30s 新房间/金币/击杀 ✓。
### 7. 失败表
| 失败类型 | 判定 | 归因 | 回到 | 新手期 |
|---|---|---|---|---|
| 撞墙 | 越界 | 「那边是墙。」每方向整局一次,之后只闷响+invalid | 原地 | 无伤 |
| 挥空 | 怪不在面前 | 「它不在正面。左右滑。」 | 本回合 | 无 |
| 格挡失败 | 前摇内未点或未面对 | 「慢了。听到就点。」/「在身后。」 | 下回合 | L1–2 怪打不死你 |
| 死亡 | HP≤0 | die_cause_* 按 lastHit;die_adv_* 按真实格挡数 | TITLE,金币入 meta | 学期不可能 |
| 迷路 | 迷茫信号 | L1→L3 带路 | 原地 | 无 |
### 8. 台词类别
- `critical`:开场「点一下,听回声」;结算承诺句
- `content`:intro、层/血/金/面朝/威胁档、btl_start_*、tut_*(改词后)、unlock_*
- `hint`:lp_* 长按帮助、nav_*、stair_hint_*、sys_continue_ask、gd_pulse 短句
- `feedback`:wall、btl_swish、btl_behind、btl_no_turn、die_cause_*、tut_parry_miss
- 停用旧句(须重录或下架):`tut_walk`「按住屏幕不放,你就往前走。」`tut_replay`「双击,再发一次脉冲」`tut_parry`「双击格挡」`tut_status`「上滑听状态」`tut_menu`「下滑打开菜单」`tut_flee_hold`「想逃跑,按住别松手」
资产账:127 句 ×2 性别(含 gold_some)。新教学句替换上列,总数可持平或 +3(tut_move / tut_help_hold / tut_parry_tap),上限 130。
### 9. 断点复述
- 保存:拾取/战斗/下潜/菜单保存/死亡。data 含 meta + run(seed/floor/pos/face/hp…)。
- 回来:sys_continue_ask;单击恢复 + 长按帮助句作复述(位置。目标。滑一下。);右滑新周目(meta 保留)。
- summary:`第{floor}层 · {血量档} · 金币{meta.gold} · 遗产{n}/5`。
### 10. 测试记录
- `web/dungeon/test/playtest.mjs`。改口径:D0 3s 内脉冲;移动断言改四向滑;长按=帮助不位移;战斗前摇单击=格挡;下滑动=后退不打开菜单;双击不重发免冷却。无声操作 0。真人冷启动待测。
---
## 1. 概述
盲眼探窟者用脉冲「看」每次不同的地窟,听脚步辨怪,逐层下潜。死了金币留在遗产里,越死越强。黑暗是设定不是妥协。方位降维 ≤4。与 escape 同为空间探索,战斗回合承接 rpg,元进度为本作增量。
## 2. 状态机
`TITLE / DRILL / EXPLORE / BATTLE / MENU / DESCEND / SETTLE`。MENU 仅 TITLE/SETTLE(及阶段 2)。
```
TITLE ──单击(无档)──> DRILL(仅首次)──完成──> EXPLORE(L1)
──单击(有档)──> EXPLORE 恢复+复述
EXPLORE ⇄ BATTLE(走进怪格)
EXPLORE ──楼梯格+单击──> DESCEND ──> 下层
HP≤0 或 L7 通关 ──> SETTLE ──单击──> TITLE
```
DESCEND:stairs_down + evt_descend + st_floor_N,约 5s。
## 3. 声波脉冲
| 维度 | 编码 |
|---|---|
| 正前距离 | 4 档,延迟 0.25/0.50/0.80/1.10s,volume 0.9/0.7/0.5/0.35,echo_1..4 |
| 正前材质 | +120ms mat_stone/door/stair/water |
| 左右侧 | +0.35s 预 pan:side_wall_l/r 或 side_open_l/r(第一格地板=开口) |
| 身后 | 不报;转身即查 |
冷却 1.2s。冷却内单击=invalid(无第二次回声)。需要再听:冷却后**再单击**,或长按问路。站楼梯格踏入即自动贴身铁器回声(到达即报,不占单击——单击仍是下潜确认)。
三套信息单源 grid:回声不报怪,脚步不报地形。威胁播报只报左右。
频带:脚步 100–300Hz,脉冲中频,BGM 垫底。并发前景 ≤2。
## 4. 地窟生成
`rng(floor) = mulberry32((seed ^ (floor * 0x9E3779B9)) >>> 0)`。房间矩形 + L 走廊 MST;楼梯=BFS 最远房;怪距起点 ≥3(教学局非门怪 ≥4);主路径每 ≤12 格必有内容。
| 层 | 尺寸 | 怪物 | 宝物 | 目标分 |
|---|---|---|---|---|
| 1 | 7×7 | 盲眼蝠×2 ATK0 | 金币×1 | 3.0 |
| 2 | 7×7 | 窟鼠×3 | 金+药 | 3.0 |
| 3 | 9×9 | 菇×3 + 石甲蟹 | 金+短刃 | 3.5 |
| 4 | 9×9 | 绕行者×2+洞蛛×2 | 金+皮甲 | 3.5 |
| 5 | 11×11 | 洞蛛×3+绕行者×2 | 金+药 | 3.5 |
| 6 | 11×11 | 洞蛛×2+绕行者×2+腐沼蟒 | 金+阔刃 | 3.5 |
| 7 | 11×11 | 石像卫×3+窟中之王 | 金 | 4.0 |
窟主守楼梯;未击败踏格播 evt_stairs_lock。
## 5. 战斗
明雷:脚步持续可闻。遭遇自动面对。
```
玩家回合 → 单击挥击 / 下滑逃跑 / 左右转
怪行动(绕位先报脚步)→ 前摇 1.2s tel_*
前摇内单击=格挡(面对 ×0.2 / 未面对 ×1.0)
HP≤25% 且有药 → 自动喝
HP≤0 → 死亡链
```
缠斗怪左右滑:btl_no_turn 每场解释一次后只 invalid。绕位怪每 2 回合换左/右/后。Boss 半血 ATK+1,拒绝逃跑。逃跑必成、挨一下、怪留原格。每 4 杀 atkLv+1。
**格挡改绑单击(敌前摇窗)**:新手无双击;窗外单击若在玩家回合才是挥击,前摇期单击只判格挡。
## 6. 数值与遗产
maxHp=20(+vigor 6);atk=2+atkLv+武器。L1–2 学期零惩罚。
| 敌 | HP | ATK | 行为 | 金 |
|---|---|---|---|---|
| 蝠 | 4 | 0 | 缠斗 | 3 |
| 鼠 | 6 | 1 | 缠斗 | 5 |
| 菇 | 8 | 2 | 缠斗 | 8 |
| 石甲蟹 | 20 | 3 | Boss 绕位 | 50 |
| 绕行者 | 10 | 2 | 绕位 | 10 |
| 洞蛛 | 12 | 3 | 缠斗 | 12 |
| 腐沼蟒 | 26 | 4 | Boss | 80 |
| 石像卫 | 16 | 4 | 绕位 | 15 |
| 窟中之王 | 36 | 5→6 | Boss | 通关 |
遗产(meta.gold,死亡不清):药 90 / 体魄 150 / 护符 220 / 回声强化 300 / 武器 450。金币档 0=空手句;0<金<50 播 gold_some「带回来一点,不多。」
## 7. 音频
BGM:menu / explore / battle / boss。SFX:pulse、echo_1..4、mat_*、side_*、step_own/turn、bump、coin/potion/gear、stairs_down、mob_step_{small,bug,heavy}_{l,c,r}、tel_*、atk_swing/hit、parry、hurt、enemy_die、levelup、amb_cave、turn_tick。侧向能量只在单声道。
Voice 127×2,数字全分档整句。
## 8. Floor 与迷茫
| 状态 | earcon |
|---|---|
| TITLE/MENU | menu |
| DRILL/EXPLORE/DESCEND | explore |
| BATTLE | battle |
| SETTLE | settle |
| 血≤25% / Boss 半血 | danger |
choice 不用。对局中下滑=后退,不播 menu。等待声:探索环境 loop 已承担;战斗 turn 后 400ms 合成等待声。纠错每个状态×手势一次,之后只回执;连续 3 次无效进迷茫。
## 9. 存档
```json
{
"schema": 1, "game": "dungeon",
"summary": "第3层 · 伤势不轻 · 金币268 · 遗产2/5",
"meta": { "gold": 268, "unlocks": ["potion", "vigor"], "bestFloor": 5, "runs": 7, "kills": 23 },
"run": { "seed": 42, "floor": 3, "pos": [5, 2], "face": "E", "hp": 11 }
}
```
SETTLE 进态 800ms 手势死窗(吞死亡瞬间在途单击,防结算链被截进 TITLE)。
## 10. playtest 指针
seed 复现、回声===grid、学习期 ATK、死亡归因真话、到达即报铁器、gold_some 档位:保留。删除:长按位移、双击免冷却重发、下滑开战斗菜单、双击格挡。新增:3s 内脉冲、长按播帮助且 pos 不变、前摇单击减伤 ×0.2、下滑动 pos 后退。