research(new8/batch2): abyss + detective 迭代闭环收口——双双 R1-R2 连续达标裁定可交付

abyss《深海回音》:
- R1 补 synthesis(5/5 愿意玩 P0=0)+ 补录 R1 缺失裁决材料
- R2 十修全部现场坐实:F1 ping迟到/尾句保护首播制/链末看门狗不拆/回波静默一拍/dv4_dual扣账口播/crit水面变体/看门狗13s/震循环1.1s/震去重/状态链人数句
- 补录语音18段(flock串行,QC无离群);playtest 242→278
- 终裁:4/4 人设满分档,连续 2 轮达标 → 可交付 ✅

detective《雨夜专案》:
- R1 取证轮:补跑 live 两会话(认真新手33分钟全弧线/乱按200s三级保底抢救),5/5 愿意玩 P0=0
- R2 十一修全部坐实:intro完整落声/tut不被掐/按轴取句/人名指认/结案确认闸/指路句/选句记忆位/hint轻震/st_wrong当场记账/tut_skip补动词/L2疑点齐分支
- 补录+改词33条(29新增+4重录);playtest 265→279
- 终裁:6/6 愿意玩,连续 2 轮达标 → 可交付 ✅

公共:00-program 批次2进度账收账、13号文档 R2 断言关键词、gen_voice_dual 两游戏段、voice_text.json
验证:abyss 278/278 + detective 279/279 + guide 122/122 + check_all_assets 全项目全绿
This commit is contained in:
xsl
2026-09-14 00:05:42 +08:00
parent 005851d01a
commit c8843233b0
670 changed files with 6726 additions and 218 deletions
+6 -3
View File
@@ -763,8 +763,8 @@ R1 起每轮的增量断言(修复回归)在各自设计文档的轮次小
与 §20(radio/dungeon)同规:断言清单与实现核对**住各自设计文档**,随轮次原地维护;本文件只留指针。
- abyss《深海回音》:[17-abyss.md](17-abyss.md) §断言(剧本 A-F 六路径/氧气门三形态/sonarGate/死窗/双轨看门狗/中断复述)
- detective《雨夜专案》:[18-detective.md](18-detective.md) §断言(seed 矛盾复现+矩阵不变式/指证三路径/评级账本/板导航/双轨/死窗)
- abyss《深海回音》:[17-abyss.md](17-abyss.md) §断言(剧本 A-F 六路径/氧气门三形态/sonarGate/死窗/双轨看门狗/中断复述/尾句保护首播制/链末看门狗不拆)
- detective《雨夜专案》:[18-detective.md](18-detective.md) §断言(seed 矛盾复现+矩阵不变式/指证三路径/评级账本/板导航/双轨/死窗/结案确认闸/选句记忆位/VERDICT 链锁实弹)
- cipher《暗码》:[19-cipher.md](19-cipher.md) §断言(摩尔斯固定字符逐元素/四结局矩阵/三层兜底/暴露度档位/morseGate)
- teahouse《深夜茶馆》:[20-teahouse.md](20-teahouse.md) §断言(泡茶三步时机窗/经济逐晚对账/弧线三方向/时机窗内 voice=0 分层)
- keeper《守塔人》:[21-keeper.md](21-keeper.md) §断言(时空签名教学-兑现/插叙触发回返/trust×truth 档位/4 结局)
@@ -779,7 +779,10 @@ R1 起每轮的增量断言(修复回归)在各自设计文档的轮次小
floor 干涸链)、声呐双通道仲裁(echo/pipe_knock 与 voice 零重叠 + sonarGate 排队)、教学承诺兑现清单
(金属=钢板/单击=脉冲/四潜/氧气门/扣三格/敲管/补给)、看门狗双轨(乱按 96s 必被抢救 + 有进展零打扰)、
结算链 800ms 手势死窗(dungeon H1 内化)、键盘 _k 变体按 inputMode 选播、pendingChoice/p* 不可跳、
中断复述、存档 schema。
中断复述、存档 schema。**R2 增量(2026-09-13,round1 synthesis F1-F10)**:ping 即时性(gd 散句在播时单击先掐后响)、
尾句保护认实际链尾(dyn 档位句纳入)+ 签收链死窗、回波 wait=实长+静默一拍、dv4_dual/oxy_crit_deck/prog_saved1..5
新句断言、叙事尾句首播保护+复播可即掐(G5)、full 档链末看门狗 [13,30]、danger 震 1100ms、crit 震按档去重。
详见 [17-abyss.md](17-abyss.md) §12 修订记录。
## 22. 新游戏登记:《暗码》(cipher)(new8 批次 3)
+24 -6
View File
@@ -39,8 +39,8 @@
| **`sys_help_k`** | 空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。 | 同上(key) |
| `sys_menu` | 菜单。单击切换选项,双击确认。 | 下滑呼出模态菜单 |
| **`sys_menu_k`** | 菜单。空格切换选项,回车确认。 | 同上(key) |
| `sys_skip` | 想跳过这句,单击就行。 | 开场每局一次(skip_hint 先例) |
| **`sys_skip_k`** | 想跳过这句,按空格。 | 同上(key) |
| `sys_skip` | 听过的句子再播时,单击就能跳过。 | 开场每局一次(skip_hint 先例;R2-F6 改词,见文末修订记录) |
| **`sys_skip_k`** | 听过的句子再播时,按空格跳过。 | 同上(key) |
| `sys_continue_ask` | 检测到你的下潜记录。单击继续上次,右滑开始新救援。 | 有存档进游戏 |
| **`sys_continue_ask_k`** | 检测到你的下潜记录。空格继续上次,右箭头开始新救援。 | 同上(key) |
@@ -60,10 +60,16 @@
| `prog_d2` | 现在是第二次下潜。 | 同上 |
| `prog_d3` | 现在是第三次下潜。 | 同上 |
| `prog_d4` | 现在是最后一次下潜。 | 同上 |
| `prog_saved1` | 已经救上一个人。 | 上滑状态链·已救人数(R2-F10,saved=1) |
| `prog_saved2` | 已经救上两个人。 | 同上(saved=2) |
| `prog_saved3` | 已经救上三个人。 | 同上(saved=3) |
| `prog_saved4` | 已经救上四个人。 | 同上(saved=4) |
| `prog_saved5` | 五个人都在甲板上了。 | 同上(saved=5;saved=0 不播人数句) |
| `oxy_full` | 气瓶还足,救得动。 | 氧气 ≥9(跨档时挂上浮结算链;上滑状态链) |
| `oxy_ok` | 氧气还够两潜。 | 氧气 6-8(floor(oxy/3)=2,句义逐格为真) |
| `oxy_low` | 氧气告急,只够最后一潜。 | 氧气 3-5;此后垫 sfx/breath_loop |
| `oxy_crit` | 氧气见底,必须上浮。 | 氧气 0-2;各播报位附 warning 震 |
| `oxy_crit` | 氧气见底,必须上浮。 | 氧气 0-2·**水下**(DIVE/COMMS);各播报位附 warning 震 |
| `oxy_crit_deck` | 氧气见底,一潜都下不去了。 | 氧气 0-2·**水面**(SURFACE/ENDING;R2-F5,句义=floor(0..2/3)=0 潜,逐格为真) |
| `oxy_gain` | 应急瓶接上了,多三格。 | D2 上浮后补给(全局唯一一次) |
| `dry_a` | 气瓶用干了。立刻上浮。 | mid-dive 氧气 floor 至 0,干涸链首句 |
| `dry_b` | 气花在了人身上。人,都上来了。 | 干涸链归因句(真话:气耗在走心选择上) |
@@ -153,6 +159,7 @@
| `dv4_none` | 调度 | 气不够一潜了。第四潜,取消。 | **氧气门·取消形态**(oxy≤2;800ms 手势死窗) |
| `gao_final` | 高船长 | 别下来。带他们回家,就算救完了。海燕号,通话结束。 | 取消链·船长的最后通讯(随后直达 ◆p9) |
| `dv4_down` | 调度 | 最后一潜,指挥舱。海燕号,撑不住了。 | 下潜链(双载/单载共用) |
| `dv4_dual` | 调度 | 两个人下同一潜。这趟往返,扣四格气。 | 下潜链·**仅双载形态**追加(R2-F4:D4 双载 3+1 扣账口播,不再无声扣款) |
| `dv4_slide` | 调度 | 它滑了!抓稳索缆,指挥舱里还有人! | 搜索危机拍(**danger 签名+landslide 前置 2s 渐强+danger 震**) |
| `gao_a` | 高船长 | 救援员。我船上,还剩两个活人。 | 通话主干 |
| `gao_b` | 高船长 | 都带走,我最后上。这是船长的规矩。 | 通话主干 |
@@ -218,10 +225,10 @@
---
**合计:148 句**(GPU 预算 ≤170 ✓)
- 双性别 127 句(DIVER 潜航员 30 + DECK 调度/系统 97,含 `_k` 键盘变体 11)×2 性别 = 254 文件;
**合计:155 句**(GPU 预算 ≤170 ✓;R2 修订后)
- 双性别 134 句(DIVER 潜航员 30 + DECK 调度/系统 104,含 `_k` 键盘变体 11)×2 性别 = 268 文件;
- NPC 平铺 21 句(小舟 5 / 老白 4 / 陈医官 5 / 高船长 7)= 21 文件;
- 合计 275 条音频 ×2 格式(ogg+m4a)= **550 文件**。
- 合计 289 条音频 ×2 格式(ogg+m4a)= **578 文件**。
- 键盘变体 11 对:gd_brief / gd_continue / gd_again / gd_ping1 / gd_ping2 / sys_help / sys_menu / sys_skip / sys_continue_ask / dv1_teach / p1(成对生成,`check_all_assets` 校验 `_k` 配对与双性别集合一致)。
- 每结局专属台词齐备:e1/e2/e3/e4 各 2 句 + 尾声回响 14 句(好感/存活/flag 选播)。
- 每局实走抉择 7-9 个(p7 单载右路跳过 p8;D4 取消路径跳过 p7/p8),抉择提示 p1..p9 共 9 个。
@@ -249,3 +256,14 @@
- 归因真话律:负向收尾句(dry_b / gao_final / chen_last / d4_stay_lost / gao_last / ep_*_lost / e4_b)全部指向玩家实际选择或真实处境,无「运气不好」类假归因、无惩罚性措辞 ✓。
- 向导 gd_* 13 句(gd_brief/gd_continue/gd_again/gd_ping1/gd_ping2 各带 _k 变体,gd_invalid/gd_prog1/gd_prog2 无变体)符合 14 号 §6 台词规范(一句一义、无重复句式、单句 ≤18 字)✓。
- 氧气档位句与数值一一对应(oxy_full≥9 / ok=6-8 / low=3-5 / crit=0-2,均按 floor(oxy/3) 可下潜次数措辞),账目真实 ✓。
## R2 修订记录(2026-09-13,依据 research/new8/abyss/round1/synthesis.md)
| # | 改动 | 依据 |
|---|---|---|
| R2-F4 | 新增 `dv4_dual`(双性别,仅双载形态下潜链追加):D4 双载起播 3+1=4 格扣账口播化 | R1 P1 心算账对不上耳朵(无声扣款) |
| R2-F5 | 新增 `oxy_crit_deck` 水面变体;`oxy_crit` 限水下场景 | R1 crit「必须上浮」在甲板播出=错场景措辞(档位表原注「水面=一潜都下不去」义落地) |
| R2-F6 | `sys_skip`/`sys_skip_k` 改词:「听过的句子再播时,单击/按空格就能跳过」——与 G5 复播可即掐(首播保护)机制对齐 | R1 live P1-2:旧词「想跳过这句,单击就行」在 F5 首播保护下名存实亡 |
| R2-F10 | 新增 `prog_saved1..5`(双性别):上滑状态链 G6 顺序改为 潜次→已救人数→氧档→帮助;saved=0 不播 | R1 P3:被打断后要捡回「船上躺着谁」 |
以上四组为新增/改词;其余裁定(148 句中未改词的 146 句原文、触发条件、滤波参数)不变。
+29
View File
@@ -488,3 +488,32 @@ ENDING: e*_a → e*_b(按 savedCount × p9 四选一)→ ep_lead → ep_*(
| 档位措辞真实 | §4.3 档位=floor(oxy/3) 可下潜次数,句义逐格为真 | §9「氧气账目真实」块 |
| 失败结算链完整不被打断 | 800ms 手势死窗盖取消链/干涸链/结局链;seqToken 作废在途链 | §9「结算链死窗」块 |
| PC 键盘操作提示 | 11 对 _k 变体+inputMode() 选择+集中分组标注 | §9「键盘变体」块 |
## 12. R2 修订记录(2026-09-13,依据 research/new8/abyss/round1/synthesis.md)
> 追加记录,不改旧裁定;凡本节与上文冲突,以本节为准。全部改动已落地 web/abyss/game.js,断言增量见文末注记。
| # | 旧裁定 | 新裁定(R2 起生效) | 依据 |
|---|---|---|---|
| R2-F1 | 玩家脉冲走 sonarGate 空闲门(§6.2 R1 按构造不重叠) | 玩家脉冲**先于门**:搜索等待态 voice 层只可能是向导散句(gd_ping*/gd_prog*),单击发脉冲时先掐散句、ping 立即出音。信息类回波仍走空闲门不变 | live R1 P1-1:ping 迟到 12~17s「回波先于脉冲」(3/5 复现),教学潜核心承诺错序 |
| R2-F2 | F5 尾句保护按 \_nodeSteps 重算尾句;签收链无死窗 | 尾句保护改认**实际播放链尾**(dyn 注入的档位句纳入保护:档位句不可被单击掐断);签收链(g9_in)入口盖 800ms 死窗(与取消/干涸/结局链同款) | live R1 P1-3:oxy_low 播 0.71s 被掐、g9_in 被在途 tap 剁到 0.28s |
| R2-F3 | 回波 wait 常数 2200/2600/4000ms | W_Metal/W_Knock/W_Groan = 3300/3500/5000ms(资产实长 2.76/2.96/4.42s + 静默一拍),兑现 §6.2 R2「回波→静默一拍→解读」。玩家单击仍可快进回波余音(_sonarSkip 不变) | live R1 P2-1 + P1 评审:回波尾巴压解读句开头 0.35~0.55s,定位一拍被吃 |
| R2-F4 | D4 双载额外 +1 不口播 | 双载形态下潜链追加 `dv4_dual`「两个人下同一潜。这趟往返,扣四格气。」(3+1=4 扣账口播化) | R1 P1:心算账 12−3−3+3−3−3=3 与耳朵听到的 crit 档差一格 |
| R2-F5 | crit 档全场景播「氧气见底,必须上浮。」 | 水面场景(SURFACE/ENDING)播新句 `oxy_crit_deck`「氧气见底,一潜都下不去了。」;水下(DIVE/COMMS)保留原句。档界 floor(oxy/3)=0 不变,两句各自逐格为真 | R1 P1:人已出水后「必须上浮」是说错地点的正确话 |
| R2-F6 | G5「首播必完整、复播可即掐」(§2.3):实现只兑现前半句(尾句保护为永久态) | 非 auto 叙事节点尾句保护改**首播制**:链自然播完登记 `_tailHeard`,此后该节点重播(菜单/状态复述)尾句可单击跳过;auto 过场尾句、直入抉择尾句、p* 提示、F4 锁恒保护不变。sys_skip(_k) 同步改词(见 voice-ids R2-F6) | live R1 P1-2:跳句承诺名存实亡(B 局全程零句可跳);radio F5 吃尾根因由首播保护继续挡住 |
| R2-F7 | 叙事链末/ENDING 无操作轨 full [25,50] / standard [13,30](§7.2) | full 档对齐 standard:**[13,30]**(搜索 [10,25]、抉择点 [25,50]、无进展轨 60/120s 不变) | R1 P2+P3:接通小舟后 25s 静默掐在钩子落地上(走神/怀疑锁屏) |
| R2-F8 | D4 danger 震循环 500ms(§5.2,≥400ms) | **1100ms**(危机拍 4s 窗内约 4 遍;≥400ms 下限仍满足) | R1 P2+P4:4 秒约 10 连震,贴身躺玩/年长者过刺激 |
| R2-F9 | 状态链每逢 crit 档附 warning 震(G2) | 按「进入 crit 档」去重:档不变复听不重复震;s_tier 跨档播报位的 warning 震保留 | R1 P4:压力局摸状态十几回,回回挨三连震 |
| R2-F10 | 状态链 = 潜次 → 氧档 → 帮助(G6) | 状态链 = 潜次 → **已救人数(prog_saved1..5,saved=0 不播)** → 氧档 → 帮助 | R1 P3:被打断后捡局面缺「船上躺着谁」 |
### §9 断言增量(R2 登记,已随 playtest.mjs 落地)
- F1:gd 行在播(stub 引擎在播)时搜索单击 → sonar_ping 立即起播且 gd 行被掐(不再入队迟到)。
- F2:档位句(oxy_* dyn 注入)播放中单击不跳(beat 轻震);SURFACE(4)→g9_in 过场 800ms 内在途 tap 被吞、签收链完整。
- F3:回波起播→解读句起播间隔 ≥ 对应 wait 常数量级(含静默一拍)。
- F4:双载 D4 播 dv4_dual;单载/取消不播。
- F5:SURFACE 的 crit 播报 = oxy_crit_deck;水下状态链 crit = oxy_crit。
- F6:首播中叙事尾句单击不跳;链自然播完后经菜单复述重播,尾句单击即跳(复播可即掐)。
- F7:full 档 COMMS 链末 13s→gd_continue、30s→gd_again(原 25s/50s 断言同步改 13s/30s)。
- F8:D4 危机拍 danger 震间隔 ≥1000ms(实测 = 1100ms)。
- F9:同档 crit 期间连续两次上滑状态链,warning 震仅一次。
- F10:状态链含 prog_savedN 且 N=当前 savedCount;顺序 潜次→人数→氧档→帮助。
+39 -20
View File
@@ -1,11 +1,14 @@
# 18b · 《雨夜专案》语音台词表(voice ids,录音依据)
> **R2 修订(2026-09-13)**:总句数 158→**171**(旁白基表 96→104、V 组键盘变体 10→14、NPC 52→53),上限裁定 160→176;改词 2 句(fin_who_confirm/tut_skip);新增 13 个录制单位(基表 8:fin_pre、st_wrong、recap_cf、gd_board_cf、item_who_w1..w4;NPC 1:z_react_w;V 组 4 对)。逐条修订理由见主设计文末「R2 修订记录」(research/new8/detective/round1/synthesis.md F1-F11)。
> **实测句长登记**(F1 配套):male/intro_1 8.80s、male/sys_help 9.28s、male/key/sys_help 10.48s、female/key/sys_help 9.52s 四句超 8s——游戏侧兜底已升 15s(§4.3),证词链全部 ≤7.4s 不受影响;如重录这 4 句请保持内容不变。
> **给音频总监的录制说明**
> - **旁白双性别组**(106 句):旁白只做系统/指引/教学/状态/现场勘验(探长自勘)/裁决宣读,**不念证词**。落 `web/detective/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
> - **旁白双性别组**(基表 104 句 + V 组键盘变体 14 句):旁白只做系统/指引/教学/状态/现场勘验(探长自勘)/裁决宣读,**不念证词**。落 `web/detective/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
> - female = `Serena`,instruct 常量:`沉稳清晰的女声,专案组探长,冷静克制,像在雨夜读卷宗`
> - male = `Uncle_Fu`,instruct 常量:`低沉沉稳的男声,专案组探长,冷静克制,像在雨夜读卷宗`
> - 两常量全表统一(含教学/指证/结案/结算),禁止句级变体、禁语速词(引擎 SoundTouch 变速)。
> - **NPC 平铺组**(52 句):证词=证人 NPC 平铺单音色、**不做双性别**,落 `web/detective/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中)。NPC ≤5;同一角色 speaker+instruct 恒定;**不加电话滤波**(区别于 radio——本作区分度靠 speaker+instruct+游戏侧签名 earcon `sig_*` 前缀,见主设计 §8.2/§3.7)。区分度风险逐个标注:
> - **NPC 平铺组**(53 句):证词=证人 NPC 平铺单音色、**不做双性别**,落 `web/detective/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中)。NPC ≤5;同一角色 speaker+instruct 恒定;**不加电话滤波**(区别于 radio——本作区分度靠 speaker+instruct+游戏侧签名 earcon `sig_*` 前缀,见主设计 §8.2/§3.7)。区分度风险逐个标注:
> | 角色 | speaker | instruct 常量 | 区分度风险 |
> |---|---|---|---|
> | 老葛(62 岁门卫) | `Eric` | `苍老沙哑的男声,守夜人,慢悠悠,带倦意` | 低 |
@@ -51,7 +54,7 @@
| `tut_cf_try` | 练习一次。选一份证词,单击确认;再选一份,任意一句。 | D5(判定被教学截获) |
| `tut_cf_ok` | 指证就是这样。练习不算数,真矛盾要靠耳朵找。 | D5 完成(success 震) |
| `tut_done` | 教学完了。开始查案。 | D6(进 BOARD) |
| `tut_skip` | 已跳过教学。左右滑换卷宗,单击听取。 | 下滑跳过教学 |
| `tut_skip` | 已跳过教学。左右滑换卷宗,单击听取;按住屏幕,指证矛盾。 | 下滑跳过教学(**R2 F10 改词**:补「按住=指证」核心动词;旧词「已跳过教学。左右滑换卷宗,单击听取。」作废) |
## G2 组 · 状态/条目(旁白 ×20)
@@ -102,13 +105,19 @@
| `cf_diff` | 这两句,说的不是一件事。 | 判定:无共享轴(真话) |
| `cf_hit` | 对不上!矛盾成立,记入疑点。 | 判定:命中(contra_hit 音先响) |
## G5 组 · 结案三问(旁白 ×18)
## G5 组 · 结案三问(旁白 ×24,R2 起 +fin_pre/item_who×4/st_wrong)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `fin_start` | 结案陈词。先指认真凶:四位证人,选一个。 | 进 FINISH(choice earcon) |
| `fin_who_confirm` | 就指认他?单击,定下来。 | 真凶问两段确认(重播选项名后接播) |
| `fin_start` | 结案陈词。先指认真凶:四位证人,选一个。 | 进 FINISH(choice earcon;R2 F5 起经 fin_pre 闸) |
| `fin_pre` | 证据在手,就此结案?单击,定下来;滑走,继续查。 | **R2 F5 新增**:结案确认闸(证词板停「结案陈词」首击播,闸内再击进三问;键盘态播 fin_pre_k) |
| `item_who_w1` | 门卫老葛。 | **R2 F4 新增**:真凶问选项=纯人名(原念卷宗名「门卫老葛的证词。」语义错位) |
| `item_who_w2` | 学徒小顺。 | 同上 |
| `item_who_w3` | 账房周先生。 | 同上 |
| `item_who_w4` | 房东温太太。 | 同上 |
| `fin_who_confirm` | 就指认这位?单击,定下来。 | 真凶问两段确认(重播人名后接播;**R2 F4 改词中性化**:旧词「就指认他?」对温太太为假,作废;键盘态播 fin_who_confirm_k,R2 补登记) |
| `fin_clear` | 不在场证明成立。证据放人,回到证词板。 | 指认错(acc_NPC 句后接播;无限再机会) |
| `st_wrong` | 错指一回,记档。 | **R2 F9 新增**:错指链尾当场记账(fin_clear 后接;评级账目当场可闻) |
| `fin_right` | 证据链闭合。周先生,你还有什么话说? | pack A 指认对 → 认罪链起(rain_swell 同点) |
| `fin_right_b` | 证据链闭合。小顺,你还有什么话说? | pack B 指认对 |
| `fin_ask_weapon` | 第二问:凶器是什么? | 凶器问入口 |
@@ -139,11 +148,12 @@
| `st_miss_2` | 指证,错了不少。 | ≥3 次 |
| `settle_hook` | 同一场雨里,还有别的案子。单击,接新案。 | 结算尾(链锁解除后单击生效;键盘态播 settle_hook_k) |
## G7 组 · 看门狗/卡关/纠错(旁白 ×12)
## G7 组 · 看门狗/卡关/纠错(旁白 ×14,R2 起 +gd_board_cf/recap_cf)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `gd_board` | 还在证词板。左右滑,换卷宗。 | BOARD 无操作轨第 1 级(10s,full,idle-only) |
| `gd_board` | 还在证词板。左右滑,换卷宗。 | BOARD 无操作轨第 1 级(10s,full,idle-only;未听齐时用) |
| `gd_board_cf` | 都听过了。按住屏幕,去指证。 | **R2 F6 新增**:六份听齐且疑点未齐时的 BOARD 一级提示(此情「换卷宗」是错指令;键盘态播 gd_board_cf_k) |
| `gd_cf` | 还在选证词。左右滑,单击确认。 | CONFRONT 无操作轨第 1 级(15s) |
| `gd_fin` | 在想?左右滑选,单击定。 | FINISH 三问无操作轨第 1 级(20s) |
| `gd_invalid` | 这个操作,这里用不上。 | 无效手势纠错(onceKey 同局 1 次) |
@@ -153,10 +163,11 @@
| `hint_c2` | 试试指证:周先生说铜秤卖了,现场铜秤还在。 | L3(M4 保底) |
| `b_hint_c1` | 试试指证:小顺说熄了灯,温太太说灯还亮着。 | pack B L3(M1b 保底) |
| `b_hint_c2` | 试试指证:小顺说铜秤卖了,现场铜秤还在。 | pack B L3(M4b 保底) |
| `hint_fin` | 疑点齐了。去结案陈词。 | 4 疑点齐(一次)/ 无进展轨 L3(疑点齐时) |
| `recap_go` | 接着查。 | 中断复述链尾 |
| `hint_fin` | 疑点齐了。去结案陈词。 | 4 疑点齐(一次)/ 无进展轨 L3(疑点齐时)/ R2 F11 起 L2 疑点齐时同用 / R2 F6 起状态链尾(疑点齐时)同用 |
| `recap_go` | 接着查。 | 中断复述链尾(未听齐时) |
| `recap_cf` | 卷宗都在耳朵里了。挑一句你不信的,按住指证。 | **R2 F6 新增**:状态链/复述链尾(六份听齐且疑点未齐时替换 recap_go;键盘态播 recap_cf_k) |
## V 组 · 键盘变体(旁白 ×10;`gesture.inputMode()==='key'` 时替代同名基础句)
## V 组 · 键盘变体(旁白 ×14;`gesture.inputMode()==='key'` 时替代同名基础句)
| id | 替代基础句 | 台词全文 |
|---|---|---|
@@ -170,6 +181,10 @@
| `cf_pick_line_k` | cf_pick_line | 左右方向键,一句一句听。 |
| `cf_confirm_k` | cf_confirm | 就这句?空格,定下来。 |
| `settle_hook_k` | settle_hook | 同一场雨里,还有别的案子。按空格,接新案。 |
| `fin_pre_k` | fin_pre | 证据在手,就此结案?空格,定下来;方向键,继续查。 |
| `fin_who_confirm_k` | fin_who_confirm | 就指认这位?空格,定下来。 |
| `recap_cf_k` | recap_cf | 卷宗都在耳朵里了。挑一句你不信的,按住空格指证。 |
| `gd_board_cf_k` | gd_board_cf | 都听过了。按住空格,去指证。 |
## N1 组 · 老葛证词(NPC Eric 平铺 ×6,sig_ge 前缀,链播句间 0.8s)
@@ -225,14 +240,17 @@
| `fo_4` | 死者双手干净,没有搏斗痕迹。 | struggle=none |
| `fo_5` | 鞋底是干的。当夜,死者没出过后门。 | 无 |
## N6 组 · 反应/被指认/认罪(NPC 平铺 ×11)
## N6 组 · 反应/被指认/认罪(NPC 平铺 ×12)
> **R2 F3 修订**:hit 反应句**按所坐实矛盾的轴取句**(原「按累计次数递进」作废——换顺序坐实会答非所问)。pack A 映射:lamp→z_react_1 / key→z_react_2 / weapon→z_react_w(新增)/ scale→z_react_3;疑点 4/4 的一发在轴句后追加收官句 z_react_4。pack B:lamp→b_shun_react_1、其余轴→b_shun_react_2。
| id | 声部 | 台词全文 | 触发/语境 |
|---|---|---|---|
| `z_react_1` | 周先生 | 灯?……许是我记岔了。人上了岁数,记性不济。 | 真凶第 1 处矛盾坐实 |
| `z_react_2` | 周先生 | 钥匙的事……他、他有时候,也贴身带着的…… | 第 2 处 |
| `z_react_3` | 周先生 | 秤!秤的事,你们别再问了…… | 第 3 处 |
| `z_react_4` | 周先生 | ……随你们怎么问。我要回去了。 | 第 4 处 |
| `z_react_1` | 周先生 | 灯?……许是我记岔了。人上了岁数,记性不济。 | lamp 轴矛盾坐实(M1) |
| `z_react_2` | 周先生 | 钥匙的事……他、他有时候,也贴身带着的…… | key 轴(M2) |
| `z_react_w` | 周先生 | 铜器?……我那是顺口猜的。凶器的事,我怎么会知道。 | **R2 F3 新增**:weapon 轴(M3)——慌在刚戳中的凶器上(他本不该知道凶器什么样) |
| `z_react_3` | 周先生 | 秤!秤的事,你们别再问了…… | scale 轴(M4) |
| `z_react_4` | 周先生 | ……随你们怎么问。我要回去了。 | 疑点 4/4 收官句(轴句后追加) |
| `acc_ge` | 老葛 | 我守了一夜门!温太太来借热水,她能作证! | 错指老葛 |
| `acc_shun` | 小顺 | 我宿在城南刘掌柜家,他全家都能作证! | 错指小顺(pack A) |
| `acc_wen` | 温太太 | 我这把年纪翻墙?先问问那墙答不答应! | 错指温太太 |
@@ -260,9 +278,10 @@
---
**合计:158 句 ≤160 上限**(旁白 106 ×2 性别 = 212 条 + NPC 平铺 52 条 = **264 条音频** ×2 格式 = 528 文件)。
分组账:G0 11 + G1 12 + G2 20 + G3 6 + G4 8 + G5 18 + G6 9 + G7 12 + V 10 = 106(旁白);N1-N5 29 + N6 11 + N7 12 = 52(NPC)。
指证命中链 = `contra_hit(sfx)→ cf_hit → react_n`;miss 链 = `contra_miss(sfx)→ cf_same/cf_diff/cf_self`;
**合计:171 句 ≤176 上限(R2 修订,原 158 ≤160 作废)**(旁白基表 104 句 ×2 性别 = 208 条 + 键盘变体 V 组 14 句 ×2 性别 = 28 条 + NPC 平铺 53 条 = **289 条音频** ×2 格式 = 578 文件)。
分组账:旁白基表 104 = G0 11 + G1 12 + G2 20 + G3 6 + G4 8 + G5 24(18 + fin_pre + item_who×4 + st_wrong)+ G6 9 + G7 14(12 + gd_board_cf + recap_cf);V 组 14(10 + fin_pre_k + fin_who_confirm_k + recap_cf_k + gd_board_cf_k);NPC 53 = N1-N5 29 + N6 12(11 + z_react_w)+ N7 12。
指证命中链 = `contra_hit(sfx)→ cf_hit → react_按轴(4/4 追加 reactFinal,R2 F3)`;miss 链 = `contra_miss(sfx)→ cf_same/cf_diff/cf_self`;
认罪链(pack A)= `fin_right → z_break_1..3 → gavel → settle_open → rate_X → st_doubt_n → st_miss_档 → settle_hook`;
状态链 = `st_asked_n → st_doubt_m`;中断复述链 = `st_asked_n →(未听 ≤3 时)item_* 名链 → st_doubt_m → recap_go`。
状态链 = `st_asked_n → st_doubt_m →(尾句:recap_go / recap_cf(听齐未破,R2 F6)/ hint_fin(疑点齐,R2 F6))`;中断复述链 = `st_asked_n →(未听 ≤3 时)item_* 名链 → st_doubt_m → 同尾句`;
错指链 = `acc_NPC → fin_clear → st_wrong(R2 F9)`;结案入口 = `fin_pre 闸(R2 F5)→ fin_start`。
矩阵验算与触发逻辑对照 [18-detective.md](18-detective.md) §3-§7;资产规模核对见其 §8。
+48 -23
View File
@@ -5,7 +5,7 @@
> 2. 手势:证词板左右滑换条目、单击听取/停止、**双击=重听当前句**(证词按句切分,单句 ≤8s,链播句间 0.8s——≤40s 听觉负荷以「句粒度可停可重听」兑现)、上滑状态链(已问几份/疑点几处)、下滑菜单(无豁免)、**长按=进入指证**(仅限无声空闲时受理,与长按快进零冲突,豁免 E1/E2 登记 §2.6)。指证/结案菜单走「左右滑预览+单击两段确认」非模态范式,双击保持全局重听语义——**全游戏零手势偏离,仅 2 条已教学豁免**。
> 3. 单局 15-25 分钟;结案=三问(真凶/凶器/动机),指认错误有不在场证明复述+真话归因+无限再机会,**无惩罚性失败,案子保底必结**(无进展轨看门狗三级提示最终直接给出可指证的矛盾对)。评级 S-C 账目全部真实(疑点数/冗余指证分档播报,播报值=运行值)。
> 4. 随机性全走种子 PRNG(mulberry32,`opts.seed`/`opts.pack` 可注入):选案包(pack A 周先生真凶 / pack B 小顺真凶——同模板同证词骨架、fork 句替换)、洗牌只动 filler 句位与问题选项顺序、提示轮询顺序。**矩阵不变式:全案卷「同轴异值」语句对集合 ≡ 预设计矛盾表**(dev 断言 + playtest 断言双保险)。
> 5. 台词表 [18-detective-voice-ids.md](18-detective-voice-ids.md):旁白 106 句 ×2 性别 + NPC 平铺 52 句 = **158 句 ≤160 上限**;操作提示句带键盘变体(`_k` 后缀,`gesture.inputMode()` 选播,V 组集中登记)。
> 5. 台词表 [18-detective-voice-ids.md](18-detective-voice-ids.md):旁白基表 104 句 ×2 性别 + 键盘变体 V 组 14 句 ×2 性别 + NPC 平铺 53 句 = **171 句 ≤176 上限**(R2 修订:158→171,新增 13 个录制单位见文末 R2 修订记录;原裁定「158 ≤160」作废,新上限 176);操作提示句带键盘变体(`_k` 后缀,`gesture.inputMode()` 选播,V 组集中登记)。
> 6. 规模对标 radio:单文件 game.js 预计 900-1100 行;bgm 3 + sfx 12 + voice 264 条(×2 格式 = 528 文件)。裁决仪式链不可打断(VERDICT 态 800ms 手势死窗 + 链锁,dungeon H1 同款)。
---
@@ -28,14 +28,14 @@ BOARD 分**空闲**(无语音在播)与**播放**(条目链播中)两个
|---|---|---|
| 左滑 | 上一条目(循环):签名 earcon + 条目名 | 静默忽略(纯聆听保护,simon playback 先例) |
| 右滑 | 下一条目(循环):签名 earcon + 条目名 | 静默忽略 |
| 单击 | 播放当前条目(从首个未听句起,听过的整体重听) | **停止播报**,回空闲 |
| 双击 | 重听当前条目最后一句 | **重听当前句**(≤8s,免费零消耗) |
| 单击 | 播放当前条目(从首个未听句起,听过的整体重听);**停在「结案陈词」时=进确认闸(fin_pre),闸内再单击才进 FINISH,滑走撤闸留板(R2 F5)** | **停止播报**,回空闲 |
| 双击 | 重听当前条目最后一句(闸内=重听闸句 fin_pre) | **重听当前句**(≤8s,免费零消耗) |
| 上滑 | 状态链(§2.5) | 状态链(打断证词;双击可重听当前句) |
| 下滑 | 模态菜单(§2.4) | 模态菜单(打开即停播报) |
| 长按 | **进入指证**(CONFRONT;仅空闲受理) | 引擎快进(旁白 1.7×,保持默认,不豁免) |
| 长按松开 | — | 恢复常速 |
条目共 7 项:老葛证词 → 小顺证词 → 周先生证词 → 温太太证词 → 现场勘验 → 法医报告 → 结案陈词。每项播报=专属签名 earcon(0.3-0.5s,§8.2)+ 条目名整句;切到「结案陈词」+单击 → FINISH。
条目共 7 项:老葛证词 → 小顺证词 → 周先生证词 → 温太太证词 → 现场勘验 → 法医报告 → 结案陈词。每项播报=专属签名 earcon(0.3-0.5s,§8.2)+ 条目名整句;切到「结案陈词」+单击 → **确认闸(fin_pre「证据在手,就此结案?单击,定下来;滑走,继续查。」),闸内再单击 → FINISH**(R2 F5:循环列表必经站,单击直坠三问的误闯代价太大——R1 压力线实测误闯 6-7 次)。
### 2.2 指证(CONFRONT)与结案(FINISH)——同一导航范式
@@ -43,12 +43,12 @@ BOARD 分**空闲**(无语音在播)与**播放**(条目链播中)两个
| 手势 | CONFRONT(选证词对) | FINISH(三问) |
|---|---|---|
| 左/右滑 | 切换:选条目阶段=6 证词条目(同 2.1 循环);选句阶段=上一句/下一句(播该句全文) | 切换选项(播选项名) |
| 单击 | ①选条目阶段=确认条目 → 进选句;②选句阶段=进入确认(重播该句+`cf_confirm`);③确认态=**定下这句**(第一份选定后自动进第二份,流程同前;第二份定下 → 判定) | 凶器/动机问:确认选项即答题;真凶问:进入确认(`fin_who_confirm` 重播+确认,二次单击定下=正式指认) |
| 左/右滑 | 切换:选条目阶段=6 证词条目(同 2.1 循环);选句阶段=上一句/下一句(播该句全文;**R2 F7:每条目记忆上次预览/定下位置,进选句从记忆位起播,不再回回从第一句扫**) | 切换选项(播选项名;**R2 F4:真凶问播纯人名 item_who_w1..w4**,不再念「……的证词」卷宗名) |
| 单击 | ①选条目阶段=确认条目 → 进选句;②选句阶段=进入确认(重播该句+`cf_confirm`);③确认态=**定下这句**(第一份选定后自动进第二份,流程同前;第二份定下 → 判定) | 凶器/动机问:确认选项即答题;真凶问:进入确认(`fin_who_confirm` 重播+确认,二次单击定下=正式指认;**R2 F4:确认句中性化「就指认这位?」**——原「就指认他?」对温太太为假) |
| 双击 | 重听当前预览句(宪法语义保留) | 重听当前问句/选项 |
| 上滑 | 状态链(简版:疑点数) | 同左 |
| 下滑 | 菜单(可「返回证词板」退出指证) | 菜单 |
| 长按 | error 震(选择语境不作输入) | error 震 |
| 长按 | **选句相位(语音在播)=引擎快进(R2 F7,宪法内加速通道;空闲=error 震)**;条目/确认相位=error 震(选择语境不作输入) | error 震 |
指证判定结果(§3.5)播出后自动回 BOARD 空闲。全程无倒计时、无尝试次数上限。
@@ -195,7 +195,7 @@ judge(a, b):
每次判定(无论中未中)→ cfMiss 判定计数、自动回 BOARD;无资源惩罚、无次数上限
```
- hit 反应句按真凶**累计被坐实次数**取 z_react_1..4(递进:记岔了→支吾→拒绝→想走),声音演技核心段;pack B 用 b_shun_react_1..2(第 3/4 次复用 react_2)。
- hit 反应句**按所坐实矛盾的轴取句**(R2 F3 修订;原裁定「按真凶累计被坐实次数取 z_react_1..4 递进」作废——按次数取句在换顺序坐实时答非所问,属演绎层假话,R1 人设 P1 实锤):pack A 映射 {lamp: z_react_1(灯), key: z_react_2(钥匙), weapon: z_react_w(铜器,R2 新增), scale: z_react_3(秤)};疑点 4/4 坐实的一发在轴句后追加收官句 z_react_4(逐客);pack B 用 {lamp: b_shun_react_1, 其余: b_shun_react_2}(弱绑定非轴假话),收官句同 b_shun_react_2 不重复。递进弧线由同序轴句的内容梯度 + 收官句承担,声音演技核心地位不变。
- 疑点 4/4 齐时播一次 `hint_fin`(引导去结案);疑点数进状态链与存档,账目同源。
### 3.6 归因真话律(指证/指认双处)
@@ -242,13 +242,13 @@ start ──> TITLE ──单击(有档)──> BOARD(恢复存档+局面复述)
### 4.3 语音链推进契约
- 证词链=onComplete 串行(句间 0.8s 定时器);**兜底看门狗**:单句 8s 无 onComplete(资产缺失)→ 告警续链(「屏蔽任意 voice 资产流程不卡死」契约)。
- 证词链=onComplete 串行(句间 0.8s 定时器);**兜底看门狗**:单句 **15s** 无 onComplete(资产缺失)→ 告警续链(「屏蔽任意 voice 资产流程不卡死」契约)。**R2 F1 修订:原 8s 兜底作废**——8s 低于真实长句资产(male/intro_1 实测 8.8s、male/sys_help 9.28s,R1 live 开场白「沈万川死了」被掐尾 0.85s);兜底只防资产缺失/引擎异常,必须高于全部真实资产,不当节奏装置。
- 裁决链(VERDICT)与结算链(SETTLE)为**独占链**:链首停一切看门狗,链内不受理手势(§7.4)。
- 教学链 `_speakGuarded` 串行(radio/dungeon 同款,杜绝同 tick 双调度抢占——D0-1 教训已固化引擎保险丝)。
- 教学链 `_speakGuarded` 串行(radio/dungeon 同款,杜绝同 tick 双调度抢占——D0-1 教训已固化引擎保险丝)。**R2 F2 补充**:D0 通过路径的条目报名移交 D1 链首串行补播(原 `_navItem` 450ms 报名与 tut_listen 并行互掐——R1 live 实测指令句只播 0.4s;mock 转写曾被 8s 兜底掩盖)。
## 5. 教学编排(DRILL,首局内嵌)
每步=一句短旁白→等待实操→反馈;做错重教同一步(新短句 ≤2 次)后自动演示通过;下滑=跳过教学(`tut_skip`),`meta.drillDone` 持久化,二周目不再进。教学寄生于真实案卷(D2 就听老葛真实证词,无假内容——教学承诺必须兑现)。
每步=一句短旁白→等待实操→反馈;做错重教同一步(新短句 ≤2 次)后自动演示通过;下滑=跳过教学(`tut_skip`,**R2 F10 改词补核心动词**:「已跳过教学。左右滑换卷宗,单击听取;按住屏幕,指证矛盾。」——原词没提指证入口,跳过教学≠已会玩),`meta.drillDone` 持久化,二周目不再进。教学寄生于真实案卷(D2 就听老葛真实证词,无假内容——教学承诺必须兑现)。
| 步 | 旁白 | 等待动作 | 通过条件/反馈 |
|---|---|---|---|
@@ -398,7 +398,7 @@ pack = opts.pack ?? (opts.seed != null ? seed % 2 : null)
### 7.1 结案三问(FINISH)
1. **真凶**(4 选 1:老葛/小顺/周先生/温太太;两段确认)。错→该证人 acc_NPC 自述不在场证明 + fin_clear → 回 BOARD;**无限再机会**,wrongWho 计数。
1. **真凶**(4 选 1:老葛/小顺/周先生/温太太;两段确认)。错→该证人 acc_NPC 自述不在场证明 + fin_clear + **st_wrong「错指一回,记档。」(R2 F9:评级账目当场可闻,S/A 差距不再靠悟)** → 回 BOARD;**无限再机会**,wrongWho 计数。
2. **凶器**(4 选 1:松木劈柴/铜秤砣/铁门闩/青瓷花盆;选项序由 seed 洗牌)。对=fin_wp_right,错=fin_wp_wrong(真话归因,不重答,记账)。
3. **动机**(3 选 1:监守自盗/寻仇泄愤/劫财入户)。同上。
@@ -497,7 +497,7 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
| 等待点 | 机制 | at | say(full 档;第 2 级一律纯 nudge) |
|---|---|---|---|
| CONFROST/FINISH 各选择相位入口 | guide.turn | — | turn earcon + confirm 震 |
| BOARD 空闲 | watchdog 无操作轨 | [10s, 25s] | gd_board / null |
| BOARD 空闲 | watchdog 无操作轨 | [10s, 25s] | gd_board / null(**R2 F6:六份听齐且疑点未齐时一级改播 gd_board_cf「都听过了。按住屏幕,去指证。」**——「换卷宗」此情是错指令,R1 三人设同撞) |
| CONFROST 选句/确认 | watchdog 无操作轨 | [15s, 30s] | gd_cf / null |
| FINISH 三问 | watchdog 无操作轨 | [20s, 40s] | gd_fin / null |
| DRILL 每步 | watchdog 无进展轨(共享) | [30s/60s/90s] | earcon → 短句 → tut_skip 自动滚出(E0-2 先例) |
@@ -505,8 +505,8 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
### 9.3 无进展轨(调查态卡关三级,**证词板乱按也要被抢救**)
- 进展事件=听完新条目 / 指证判定 / 结案相位推进(`_progressTrack()` 挂点:条目链 onComplete、judge()、FINISH 相位切换)。**只由进展重置**——乱按(疯狂换条目不听完、播放中狂点停起)永远攒不满进展,三级必达:
- [45s] L1:turn_tick earcon(不占台词通道)→ [90s] L2:`hint_a`(还有未听条目时)/ `hint_b`(都听过但疑点未齐)→ [150s] L3:**保底给出可指证的矛盾对**(hint_c1/hint_c2 按未发现清单轮询,seed 定序);4 疑点齐 → `hint_fin`(去结案)。L3 后每 150s 重复(每句全局限 2 次,之后静默——不轰炸)。
- 无操作轨(手势重置)与无进展轨并行取先到;两轨短句内容同级交叉登记防重复。纠错/提示 idle-only、过期丢弃(引擎已实现)。
- [45s] L1:turn_tick earcon(不占台词通道)→ [90s] L2:`hint_a`(还有未听条目时)/ `hint_b`(都听过但疑点未齐)/ **`hint_fin`(疑点已齐——R2 F11:此情还播「逐句比对」是指引过时,直指去结案)** → [150s] L3:**保底给出可指证的矛盾对**(hint_c1/hint_c2 按未发现清单轮询,seed 定序);4 疑点齐 → `hint_fin`(去结案)。L3 后每 150s 重复(每句全局限 2 次,之后静默——不轰炸)。
- 无操作轨(手势重置)与无进展轨并行取先到;两轨短句内容同级交叉登记防重复。纠错/提示 idle-only、过期丢弃(引擎已实现)。**R2 F8:提示句震动由 warning 三连震改为 confirm 轻震**(递答案不是训人——R1 人设 P4:「头一下我当自己犯错了」)。
## 10. 存档设计
@@ -527,6 +527,7 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
- summary 生成规则:`{案名} · 已问{heard.length}/6 · 疑点{doubts 中 true 数}/4`(结案后 run=null,summary=`已结案{casesClosed}起 · 最佳{bestGrade}`)。
- 保存时机:条目链播完 / 指证判定后 / 菜单「保存并回大厅」/ 结案入 meta。localStorage + PUT 服务器。
- R2 补充:结案确认闸(_caseGate)与选句记忆(_cfLineMem)为瞬态 UI 态,**不持久化**(读档回板=闸撤、记忆空——重新调查从干净入口起)。
- 读取:有 run → TITLE 播 sys_continue_ask,单击继续 → 恢复(layout 复用存档值,不重洗)→ **局面复述链**:`st_asked_n →(未听条目 ≤3 个时逐个播 item_* 名;>3 个只报计数)→ st_doubt_m → recap_go`,≤10s 回到可操作;右滑=换新案(seed/pack 重掷,meta 保留)。
- 归因真话依据:评级各变量全部持久化(doubts/cfMiss/wrongWho/hintsGiven/answers),结算播报从同源读取。
@@ -536,13 +537,13 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
1. 启动→TITLE(无档)→单击→DRILL:D0..D6 逐步断言 voice 序与 drillStep 递进;D5 任意选择组合都播 tut_cf_ok 且 doubts/cfMiss 零变化(教学承诺兑现);下滑跳过路径 + meta.drillDone 二周目不再进。
2. **seed 复现**:(42,0) 两次构造 → `_case` 深相等(条目/句序/filler 洗牌/选项序/提示序);(42,1) 与 (43,1) 布局不同。
3. **矩阵不变式**:对 `_case` 全句对枚举轴交集——同轴异值对集合 ≡ contradictions(pack A 与 pack B 各验一遍)。
4. 听取:6 条目链完整(句序=layout)、双击=当前句重播零消耗、单击停止、播完 st_asked 升档;播放中左右滑静默忽略(无 error 震)。
5. **指证 4 矛盾逐条走通**:M1-M4 各自导航→两段确认→contra_hit+cf_hit+react_n(zHits 递进取句)→doubts 置位;M3/M4 共用 z_4(选 z_4 两次分别对 fo_3/sc_4);指证对无序(反向选也 hit)。
4. 听取:6 条目链完整(句序=layout)、双击=当前句重播零消耗、单击停止、播完 st_asked 升档;播放中左右滑静默忽略(无 error 震);**R2 F6:六份听齐且疑点未齐时状态链尾=recap_cf、疑点齐=hint_fin(原 recap_go 一刀切作废)**。
5. **指证 4 矛盾逐条走通**:M1-M4 各自导航→两段确认→contra_hit+cf_hit+**react_按轴**(R2 F3:lamp→z_react_1 / key→z_react_2 / weapon→z_react_w / scale→z_react_3;4/4 齐追加 reactFinal z_react_4 + hint_fin)→doubts 置位;M3/M4 共用 z_4(选 z_4 两次分别对 fo_3/sc_4);指证对无序(反向选也 hit);**R2 F7:同条目再进选句从记忆位起播(断言入口 lineIdx);选句相位长按在播=引擎快进不震、空闲=error 震**。
6. **指证 miss 三档真话**:同轴同值对(w1_2 vs wen_1)→cf_same;无共享轴对(z_5 vs sc_1)→cf_diff;同句→cf_self;cfMiss 计数、无任何资源/次数惩罚。
7. **指认全路径**:错指小顺/老葛/温 → acc_NPC+fin_clear+回 BOARD(无限次);对指周先生 → 凶器问(选项序=layout)→ 动机问 → VERDICT。
7. **指认全路径**:错指小顺/老葛/温 → acc_NPC+fin_clear+**st_wrong 当场记账**(R2 F9)+回 BOARD(无限次);对指周先生 → 凶器问(选项序=layout)→ 动机问 → VERDICT。**R2 F5:进 FINISH 先过确认闸——停「结案陈词」首击播 fin_pre 仍 BOARD,滑走撤闸,闸内再击进三问;R2 F4:真凶问选项播人名 item_who_*,确认句中性化「就指认这位?」**。
8. **裁决死窗**:指认对瞬间同拍与 +300ms 各补一记在途 tap → 均被吞(仍 VERDICT);认罪链 4 句+gavel+settle 链完整有序;链后单击=接新案(pack 翻转、seed 重掷、meta 入账)。
9. **评级账目**:注入 outcomes 矩阵(doubts∈{0..4}×weapon×motive×wrongWho×cfMiss×hints 代表组合 ≥10 组)→ 断言 grade 判定与 §7.2 表一致 + 结算链播报句(rate_X/st_doubt_n/st_miss_档)与运行值一致(假话即失败)。
10. **看门狗双轨**:BOARD 10s/25s(gd_board→nudge);无操作 96s 乱按零进展 → 无进展轨 45s earcon/90s 短句/150s hint_c(给出未发现矛盾对且该对可走通指证);有真实进展零提示;4 疑点齐后 150s → hint_fin。
10. **看门狗双轨**:BOARD 10s/25s(gd_board→nudge;**R2 F6:听齐未破时一级=gd_board_cf**);无操作 96s 乱按零进展 → 无进展轨 45s earcon/90s 短句/150s hint_c(给出未发现矛盾对且该对可走通指证);**R2 F11:疑点齐时 L2=hint_fin;R2 F8:提示句震动=confirm 轻震**;有真实进展零提示;4 疑点齐后 150s → hint_fin。
11. **中断复述**:存档重进→sys_continue_ask→单击→复述链序(st_asked→未听 ≤3 时 item 名链→st_doubt→recap_go);上滑同链可重放。
12. **二周目变体**:seed'/pack=1 → 矛盾表指向 b_shun_*/b_zhou_2、culprit=w2、错指周先生走 acc_zhou、认罪链 b_shun_break、hint 为 b_hint_c1/2;矩阵不变式复验。
13. **键盘变体**:`settings.input='key'` 后播 sys_help_k/tut_d0_k 等 V 组(inputMode 联动);'touch' 回基础句。
@@ -553,7 +554,7 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
- 长按豁免:BOARD 播放中长按=引擎快进(不进指证);空闲长按→CONFRONT;CONFRONT/FINISH 长按=error 震。
- 状态链随时可用(含播放中,打断后双击可重听当前句);播报值=heard/doubts 实值。
- 指证第二份选择时自动重播第一份选定句(P1 记忆契约)。
- 屏蔽任意 voice 资产:链 8s 兜底推进,流程到结案不死锁。
- 屏蔽任意 voice 资产:链 15s 兜底推进(R2 F1:原 8s 作废),流程到结案不死锁。
- guide=off:全静、零定时器;资产齐套:voice 双性别 id 集合一致 + NPC 平铺存在 + sfx/bgm 双格式。
- VERDICT/SETTLE 链内上滑/下滑/双击全部吞掉(链锁),链完成前无任何状态逃逸。
@@ -595,6 +596,30 @@ fin_right(证据链闭合)→ sfx/rain_s swell 起
| 15 | seed 可复现 | (seed,pack) 注入+布局洗牌全 PRNG+深相等断言;变体包数据驱动 ✓(§6.2) |
| 16 | 矛盾矩阵验算 | 全轴枚举表:同轴异值对 ≡ M1-M4;一致对 6/单断言/无轴句清单 ✓(§3.4/§6.4 不变式) |
| 17 | 指证全路径可走通 | hit(4 矛盾×双向)/miss 三档/同句/错指三人(A)/错指含周(B)/三问对错/保底 hint 对——全部有专属资产与断言 ✓(§11 路径 5-10、12) |
| 18 | 台词规范 | 全句 ≤40 字(实测 ≤31);数字全分档整句;句序号不播(重播代替报数);「重新听」写法;同角色 speaker+instruct 恒定;总句数 158 ≤160 ✓(台词表) |
| 19 | 键盘通道 | 操作提示句 V 组 10 变体集中登记,inputMode() 选播;空格/回车/方向键全手势可达(§5.5 平行通道,游戏层零改动)✓ |
| 20 | 引擎能力边界 | 无实时节点(链播 onComplete+setTimeout);长按快进与长按指证时间互斥;资产缺失静默跳过+8s 兜底;30MB 预算内 ✓ |
| 18 | 台词规范 | 全句 ≤40 字(实测 ≤31);数字全分档整句;句序号不播(重播代替报数);「重新听」写法;同角色 speaker+instruct 恒定;总句数 171 ≤176(R2 修订)✓(台词表) |
| 19 | 键盘通道 | 操作提示句 V 组 14 变体集中登记(R2 新增 fin_pre/fin_who_confirm/recap_cf/gd_board_cf 4 对),inputMode() 选播;空格/回车/方向键全手势可达(§5.5 平行通道,游戏层零改动)✓ |
| 20 | 引擎能力边界 | 无实时节点(链播 onComplete+setTimeout);长按快进与长按指证时间互斥(R2 F7 起选句相位也放行快进);资产缺失静默跳过+15s 兜底(R2 F1);30MB 预算内 ✓ |
---
## R2 修订记录(2026-09-13;裁定追加,旧裁定原文保留于上文并就地标注「作废/修订」)
证据源:research/new8/detective/round1/{synthesis.md, live-player.md, p1..p4, transcript-*}。每条对应 R1 synthesis 的 F 编号;全部修复落于 web/detective/game.js + 台词表 + playtest 断言。
| # | 修订 | 原裁定 → 新裁定 | 证据 |
|---|---|---|---|
| F1 | 单句兜底 8s→15s | 「8s 无 onComplete 告警续链」→「15s」(兜底高于全部真实资产:male/intro_1 8.8s、male/sys_help 9.28s、key/sys_help 10.48/9.52s 登记在台词表头注) | live A t=8.16 intro_1 掐尾丢「川死了」 |
| F2 | D0→D1 串行化 | 「D0 报名与 D1 指令并行」→「D0 报名移交 D1 链首串行补播」 | live A t=33.8 tut_listen 只播 0.4s |
| F3 | react 按轴取句 | 「按累计坐实次数 z_react_1..4 递进」→「按轴映射 + 4/4 追加 reactFinal;新增 z_react_w(weapon 轴)」 | 人设 P1 建议 1(换顺序即答非所问) |
| F4 | 指认措辞真话化 | 「就指认他?」→「就指认这位?」;真凶问选项卷宗名 → item_who_w1..w4 纯人名 | 人设 P1 建议 2(温太太分支为假) |
| F5 | 结案确认闸 | 「结案陈词单击进 FINISH」→「首击 fin_pre 闸、闸内再击进、滑走撤闸」;新增 fin_pre 句 | 人设 P2 建议 1 + 压力转写误闯 6-7 次 + live B 自救实测 |
| F6 | 听齐未破指路 | 「状态链尾恒 recap_go / gd_board 恒教换卷宗」→「听齐未破:尾句 recap_cf、一级提示 gd_board_cf」;新增两句 | 人设 P1/P3/P4 同撞 + live A t=610 |
| F7 | 选句加速 | 「CONFRONT 长按一律 error」→「选句相位在播=引擎快进、空闲=error」;新增按条目选句记忆(瞬态) | 人设 P1/P3/P4 同点 + live A 选句段 25-35s/次 |
| F8 | 提示轻震 | 「hint 附 warning 三连震」→「confirm 轻震」 | 人设 P4 建议 3 + 两局 hint 落点实测 |
| F9 | 错指当场记账 | 「错指=acc+fin_clear」→「+st_wrong『错指一回,记档。』」新增句 | 人设 P2 建议 2(S/A 差距不可感知) |
| F10 | 跳教学带核心动词 | tut_skip 改词补「按住屏幕,指证矛盾。」(重录) | 人设 P2 建议 3 |
| F11 | L2 疑点齐分支 | 「L2=hint_a/hint_b 二选」→「疑点齐时 L2=hint_fin」 | live A t=1595 hint_b 指引过时实播 |
V 类观察项(本轮不动作):NPC 平铺回退 404 噪音(引擎级,abyss R1 同源);intro_w3 与 male 旁白同嗓背靠背(待人耳试听清单);FINISH 入口 tap 双震(引擎基础震+turn cue 叠加,轻)。
句数账:旁白基表 96→104(+fin_pre/recap_cf/gd_board_cf/st_wrong/item_who×4)、NPC 52→53(+z_react_w)、V 组 10→14 对(+fin_pre/fin_who_confirm/recap_cf/gd_board_cf);总 158→**171 句 ≤176 新上限**(原 160 上限裁定作废);音频 289 条 ×2 格式 = 578 文件。