diff --git a/.gitignore b/.gitignore
index fd1ce0cb..0cfab4cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,3 +60,5 @@ web/detective/gen/staging/
tools/bgm_post_wav/
__pycache__/
web/teahouse/gen/staging/
+tools/gen_rhythm_syn_wav/
+tools/gen_space_syn_wav/
diff --git a/docs/design/04-space-rebuild.md b/docs/design/04-space-rebuild.md
index 8a4916d0..df647c34 100644
--- a/docs/design/04-space-rebuild.md
+++ b/docs/design/04-space-rebuild.md
@@ -110,3 +110,48 @@
6. 语音全部整句重录:演练 8 句、保护期 3 句、单击/双击引入 4 句、归因 5 句、结算 10 句(时间段 4 + 躲避段 4 + 新纪录 + 重开)、里程碑 5 句 ≈ 35 句 × 2 音色。删除全部 num 拼接件。
7. 教学语音与 whoosh 的时序:语音 onComplete 后再 spawn 演练陨石,保证不叠放。
8. 更新 `web/space/README.md` 手势表(同向闪避是玩家可见的最大变化,README 必须同步)。
+
+---
+
+## 修订记录 R5(space polish:刺耳 + 状态/动作反馈盲区,research/space-polish/)
+
+取证(round1):live 两会话(research/space-polish/round1/live-{A,B}-transcript.md)+
+4 人设评审(同目录 p1-blind/p2-student/p3-office/p4-worker)+ 全 sfx 客观频谱
+(同目录 sfx-spectrum-analysis.txt)。核心事实:
+
+1. **刺耳(客观)**:alarm 每颗陨石响两遍且 ≥3kHz 能量 82.3%/≥5kHz 63.9%/峰值 16kHz;
+ dodge 真峰值 -2.30dBFS + 63.6%≥3kHz;shield_block -2.60+52.2%;boost -2.70+53.0%;
+ shield -2.90 超标。四件最高暴露音效全部违反 one-shot 标准(≤-3dBFS)。
+2. **保护期结束死亡窗(P0,live A t+151-163 与 t+300-310 两轮复现)**:裸飞期逼近 4.0s
+ = 刷怪 4.0s,每颗撞击与下一颗 spawn 同窗——呼喊维持生存优先(顶断归因)的代价是
+ hit_left/hit_down **零毫秒被杀**,玩家 8 秒三连撞至死不知方位;protect_end 亦被顶得
+ 只剩 0.5-3.5s。
+3. **保护期 protect_* 七连截断**:6.96s 教学句对 4.0s 刷怪间隔,每句播 4.0s 就被
+ 下一句顶断(live A 7 连 TRUNCATED),信息重复又残缺。
+4. **动作反馈盲区**:加速冷却中单击全静默(护盾拒绝有回音、加速没有——归因真话不均);
+ 挥空/滑错方向与成功闪避同静默(dodge 音只在判定时才响);boost/shield 激活无
+ CONFIRM 震(§5 承诺未兑现)。
+
+R5 裁定与实现(逐条对应 playtest.mjs 新断言):
+
+- **R5-1 刺耳重合成**:alarm/dodge/shield_block/boost/shield 五件程序合成重制
+ (`tools/gen_space_syn.py`,低谐波设计:alarm 双音 700/560Hz、dodge 中频气声扫频,
+ 真峰值 ≤-3.4dBFS、编码后 ≥3kHz 能量 0%,解码回读校验)。SA3 非必需,程序合成达标。
+ 新增 `sfx/whiff`(挥空轻叹,0.55 音量)。
+- **R5-2 归因真话·防顶断 replay**:呼喊生存优先裁定**不变**(呼喊照常同窗直出、照常
+ 顶断归因);但 hit_
/protect_end 起播经 `_defendVoice` 登记,被顶断时登记残留,
+ 呼喊播完的 onComplete 走 `_replayDefended` queue 接 replay(不顶新威胁信息),
+ 保证每句归因/保护结束宣告完整送达至少一次;归因 replay 播完仍接 hit_last(先因后果)。
+- **R5-3 protect_* 去重**:上一句 protect_ 在播时新吸收只发 shield_block 音 +
+ WARNING 震、跳过语音,每句教学完整播完(不再 7 连截断同一句开头)。
+- **R5-4 加速冷却拒绝**:`_deny(now, voiceId)` 共用 4s 去抖(护盾拒绝同路径、原句
+ feat_shield_done 不变);加速冷却单击 → HEARTBEAT 震 + 新句 `boost_not_ready`
+ 「引擎还在冷却,稍等一下。」。
+- **R5-5 protect_soon**:开局第 50s 播报「训练护盾还剩十秒。」(queue 不顶句;
+ 菜单/分批引入打断由 _rearmRunTimers 补播),给反应慢的玩家 10s 提前量。
+- **R5-6 激活确认**:boost/shield 激活(对局期与 feature 期)补 CONFIRM 震(兑现 §5)。
+- **R5-7 挥空反馈**:playing 期滑向无悬置陨石的方向 → `sfx/whiff` 轻叹(引擎 swipe
+ 震动已有"收到",whiff 补"无用"),与 dodge 成功音形成对偶。
+- **状态查询手势**:维持 00 §5 豁免表裁定(四向滑=闪避,space 无对局期 status key;
+ 坠毁结算后上滑=重听教学要点)。状态透明全部由事件反馈句承担(本 R5 已补齐
+ 保护期倒计时/冷却拒绝/归因可达性),不新增手势。
diff --git a/docs/design/04-space-voice-ids.md b/docs/design/04-space-voice-ids.md
index 38f2ee68..f5963808 100644
--- a/docs/design/04-space-voice-ids.md
+++ b/docs/design/04-space-voice-ids.md
@@ -145,3 +145,16 @@ web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
| `help_recap` | 左边来按左方向键,右边来按右方向键,上面来按上方向键,下面来按下方向键。按空格加速,按回车护盾。 |
| `skip_hint` | 按空格可跳过旁白。 |
| `gd_hit_hint` | 被撞了。听方位,按对应方向键就能拨开。 |
+
+---
+
+## R5 追加 · space polish 轮新增(2 句 × 2 性别 = 4 条;取证依据 research/space-polish/round1/)
+
+> 本轮(R5)只追加,不改上方任何旧表。instruct 沿用全表 `_SPC` 常量(两性别同游戏同 instruct,00 文档 §3.2)。
+> 台词已同步 `tools/gen_voice_dual.py` 的 SPACE_LINES(两表一致铁律)与 `web/harness/voice_text.json` 的 space 键。
+> 无键盘变体:两句均不含操作词(space 键盘变体表 24 句不增)。
+
+| id | 台词全文 | 触发 |
+|---|---|---|
+| `protect_soon` | 训练护盾还剩十秒。 | 开局第 50s(保护期剩 10s 预告;queue 不顶句,被菜单/分批引入打断由 _rearmRunTimers 补播) |
+| `boost_not_ready` | 引擎还在冷却,稍等一下。 | 加速冷却中单击(R5 归因真话:拒绝必须有回音,此前冷却单击全静默);与护盾拒绝共用 4s 去抖 |
diff --git a/research/04-playtests/transcripts/space.md b/research/04-playtests/transcripts/space.md
index 324529d8..b7097bac 100644
--- a/research/04-playtests/transcripts/space.md
+++ b/research/04-playtests/transcripts/space.md
@@ -9,7 +9,8 @@ t+ 2.1s ▶ 语音:「单击可跳过旁白。」
t+ 4.2s ▶ 语音:「陨石来了,会有声音告诉你方位。」
t+ 6.4s ▶ 语音:「听,左边有陨石。向左滑,把它拨开!」
t+ 8.5s ♪ 音效 sfx/whoosh_left
-t+ 8.5s 【状态】演练 1/4:左侧有陨石 演练:左边有陨石在逼近,左边滑把它拨开(无 BGM,语速1)
+t+ 8.5s ▶ 语音:「左!」
+t+ 8.5s 【状态】演练 1/4:左侧有陨石 演练:左边有陨石在逼近,左边滑把它拨开(语音播放中,语速1)
#### 【玩家动作】逼近音一响,同向滑开
@@ -17,20 +18,23 @@ t+ 8.5s ♪ 音效 sfx/dodge
t+ 8.5s ▶ 语音:「漂亮。」
t+ 10.6s ▶ 语音:「这次在右边。向右滑!」
t+ 12.7s ♪ 音效 sfx/whoosh_right
-t+ 12.7s 【状态】演练 2/4:右侧有陨石 演练:右边有陨石在逼近,右边滑把它拨开(无 BGM,语速1)
+t+ 12.7s ▶ 语音:「右!」
+t+ 12.7s 【状态】演练 2/4:右侧有陨石 演练:右边有陨石在逼近,右边滑把它拨开(语音播放中,语速1)
#### 【玩家动作】这颗犹豫了,没拨开——听当场重教
t+ 17.2s ▶ 语音:「那是右边来的,向右滑。」
t+ 17.2s 〰 震动:error(做错了:两连短震)
t+ 19.3s ♪ 音效 sfx/whoosh_right
+t+ 19.3s ▶ 语音:「右!」
#### 【玩家动作】重教听完,这回马上同向滑
t+ 19.3s ♪ 音效 sfx/dodge
t+ 19.3s ▶ 语音:「上面有东西,声音又尖又高。向上滑!」
t+ 21.5s ♪ 音效 sfx/whoosh_up
-t+ 21.5s 【状态】演练 3/4:上侧有陨石 演练:上面有陨石在逼近,上面滑把它拨开(无 BGM,语速1)
+t+ 21.5s ▶ 语音:「上!」
+t+ 21.5s 【状态】演练 3/4:上侧有陨石 演练:上面有陨石在逼近,上面滑把它拨开(语音播放中,语速1)
#### 【玩家动作】逼近音一响,同向滑开
@@ -38,7 +42,8 @@ t+ 21.5s ♪ 音效 sfx/dodge
t+ 21.5s ▶ 语音:「漂亮。」
t+ 23.6s ▶ 语音:「下面是低沉的轰隆。向下滑!」
t+ 25.7s ♪ 音效 sfx/whoosh_down
-t+ 25.7s 【状态】演练 4/4:下侧有陨石 演练:下面有陨石在逼近,下面滑把它拨开(无 BGM,语速1)
+t+ 25.7s ▶ 语音:「下!」
+t+ 25.7s 【状态】演练 4/4:下侧有陨石 演练:下面有陨石在逼近,下面滑把它拨开(语音播放中,语速1)
#### 【玩家动作】逼近音一响,同向滑开
@@ -48,20 +53,18 @@ t+ 25.7s 【状态】演练做完了,要出发了 演练旁白在播,先
t+ 27.8s ♫ BGM 切换 → bgm/engine
t+ 27.8s ♪ 向导音:battle(战斗/对抗)
t+ 27.8s 【状态】出发。引擎声起来了,保护期里先练手 对局中:引擎声平稳,等下一颗(保护期)(BGM=bgm/engine,语速1)
-t+ 29.3s ♪ 音效 sfx/whoosh_up
+t+ 29.3s ♪ 音效 sfx/whoosh_right
t+ 32.3s ♪ 音效 sfx/alarm
t+ 32.8s ♪ 音效 sfx/alarm
-t+ 32.8s ▶ 语音:「上!」
t+ 32.3s 〰 震动:danger(危险逼近)
t+ 32.8s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 33.3s ♪ 音效 sfx/dodge
-t+ 33.3s ♪ 音效 sfx/whoosh_left
+t+ 33.3s ♪ 音效 sfx/whoosh_up
t+ 36.3s ♪ 音效 sfx/alarm
t+ 36.8s ♪ 音效 sfx/alarm
-t+ 36.8s ▶ 语音:「左!」
t+ 36.3s 〰 震动:danger(危险逼近)
t+ 36.8s 〰 震动:danger(危险逼近)
@@ -71,24 +74,22 @@ t+ 37.3s ♪ 音效 sfx/dodge
t+ 37.3s ♪ 音效 sfx/whoosh_up
t+ 40.3s ♪ 音效 sfx/alarm
t+ 40.8s ♪ 音效 sfx/alarm
-t+ 40.8s ▶ 语音:「上!」
t+ 40.3s 〰 震动:danger(危险逼近)
t+ 40.8s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 41.3s ♪ 音效 sfx/dodge
-t+ 41.3s ♪ 音效 sfx/whoosh_left
+t+ 41.3s ♪ 音效 sfx/whoosh_down
t+ 44.3s ♪ 音效 sfx/alarm
t+ 44.8s ♪ 音效 sfx/alarm
-t+ 44.8s ▶ 语音:「左!」
t+ 44.3s 〰 震动:danger(危险逼近)
t+ 44.8s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 45.3s ♪ 音效 sfx/dodge
-t+ 45.3s ♪ 音效 sfx/whoosh_down
+t+ 45.3s ♪ 音效 sfx/whoosh_right
t+ 47.8s ▶ 语音:「试试单击,引擎会短促加速,直接冲过空隙。」
t+ 47.8s 【状态】游戏停下来教新功能 暂停了刷怪教新功能:单击试试加速(语音播放中,语速1)
@@ -96,57 +97,52 @@ t+ 47.8s 【状态】游戏停下来教新功能 暂停了刷怪教新功能
t+ 49.9s ♪ 音效 sfx/boost
t+ 49.9s ▶ 语音:「感觉到了吗?加速的时候,陨石撞不上你。」
-t+ 52.4s ♪ 音效 sfx/whoosh_right
+t+ 52.4s ♪ 音效 sfx/whoosh_down
t+ 55.4s ♪ 音效 sfx/alarm
t+ 55.9s ♪ 音效 sfx/alarm
-t+ 55.9s ▶ 语音:「右!」
t+ 55.4s 〰 震动:danger(危险逼近)
t+ 55.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 56.4s ♪ 音效 sfx/dodge
-t+ 56.4s ♪ 音效 sfx/whoosh_up
+t+ 56.4s ♪ 音效 sfx/whoosh_left
t+ 59.4s ♪ 音效 sfx/alarm
t+ 59.9s ♪ 音效 sfx/alarm
-t+ 59.9s ▶ 语音:「上!」
t+ 59.4s 〰 震动:danger(危险逼近)
t+ 59.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 60.4s ♪ 音效 sfx/dodge
-t+ 60.4s ♪ 音效 sfx/whoosh_right
+t+ 60.4s ♪ 音效 sfx/whoosh_up
t+ 63.4s ♪ 音效 sfx/alarm
t+ 63.9s ♪ 音效 sfx/alarm
-t+ 63.9s ▶ 语音:「右!」
t+ 63.4s 〰 震动:danger(危险逼近)
t+ 63.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 64.4s ♪ 音效 sfx/dodge
-t+ 64.4s ♪ 音效 sfx/whoosh_down
+t+ 64.4s ♪ 音效 sfx/whoosh_right
t+ 67.4s ♪ 音效 sfx/alarm
t+ 67.9s ♪ 音效 sfx/alarm
-t+ 67.9s ▶ 语音:「下!」
t+ 67.4s 〰 震动:danger(危险逼近)
t+ 67.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 68.4s ♪ 音效 sfx/dodge
-t+ 68.4s ♪ 音效 sfx/whoosh_left
+t+ 68.4s ♪ 音效 sfx/whoosh_right
t+ 71.4s ♪ 音效 sfx/alarm
t+ 71.9s ♪ 音效 sfx/alarm
-t+ 71.9s ▶ 语音:「左!」
t+ 71.4s 〰 震动:danger(危险逼近)
t+ 71.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 72.4s ♪ 音效 sfx/dodge
-t+ 72.4s ♪ 音效 sfx/whoosh_left
+t+ 72.4s ♪ 音效 sfx/whoosh_right
t+ 72.8s ▶ 语音:「双击展开护盾,能挡下一次撞击。」
t+ 72.8s 【状态】游戏停下来教新功能 暂停了刷怪教新功能:双击展开护盾(语音播放中,语速1)
@@ -154,10 +150,9 @@ t+ 72.8s 【状态】游戏停下来教新功能 暂停了刷怪教新功能
t+ 74.9s ♪ 音效 sfx/shield
t+ 74.9s ▶ 语音:「护盾展开后会自动充能,好了我会告诉你。」
-t+ 77.4s ♪ 音效 sfx/whoosh_down
+t+ 77.4s ♪ 音效 sfx/whoosh_up
t+ 80.4s ♪ 音效 sfx/alarm
t+ 80.9s ♪ 音效 sfx/alarm
-t+ 80.9s ▶ 语音:「下!」
t+ 80.4s 〰 震动:danger(危险逼近)
t+ 80.9s 〰 震动:danger(危险逼近)
@@ -165,103 +160,101 @@ t+ 80.9s 〰 震动:danger(危险逼近)
t+ 81.4s ♪ 音效 sfx/dodge
t+ 81.4s ▶ 语音:「十颗了,稳。」
-t+ 81.4s ♪ 音效 sfx/whoosh_down
+t+ 81.4s ♪ 音效 sfx/whoosh_up
t+ 81.4s 〰 震动:confirm(轻点确认)
t+ 84.4s ♪ 音效 sfx/alarm
t+ 84.9s ♪ 音效 sfx/alarm
-t+ 84.9s ▶ 语音:「下!」
t+ 84.4s 〰 震动:danger(危险逼近)
t+ 84.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
t+ 85.4s ♪ 音效 sfx/dodge
-t+ 85.4s ♪ 音效 sfx/whoosh_down
+t+ 85.4s ♪ 音效 sfx/whoosh_right
+t+ 85.4s ▶ 语音:「右!」
t+ 87.8s ▶ 语音:「训练护盾关闭。接下来,靠你自己了。」
t+ 87.8s 〰 震动:warning(警告三连震)
t+ 88.4s ♪ 音效 sfx/alarm
t+ 88.9s ♪ 音效 sfx/alarm
-t+ 88.9s ▶ 语音:「下!」
t+ 88.4s 〰 震动:danger(危险逼近)
t+ 88.9s 〰 震动:danger(危险逼近)
t+ 88.9s 【状态】保护期结束了,这颗我故意没动 对局中:1 颗陨石在逼近,听方位同向滑开(语音播放中,语速1)
t+ 89.4s ♪ 音效 sfx/hit
-t+ 89.4s ▶ 语音:「下面撞上的。听到低沉的轰隆,向下滑。」
+t+ 89.4s ▶ 语音:「右边撞上的。听到右边的呼啸,向右滑。」
t+ 89.4s 〰 震动:hit(受击重震)
#### 【玩家动作】被撞了。先听到方位归因,又听到「同向滑动就能拨开」
-t+ 89.4s ♪ 音效 sfx/whoosh_left
-t+ 91.2s ♪ 音效 sfx/alarm
-t+ 91.6s ▶ 向导语音:「被撞了。听方位,同向滑动就能拨开。」
-t+ 91.7s ♪ 音效 sfx/alarm
-t+ 91.7s ▶ 语音:「左!」
-t+ 91.2s 〰 震动:danger(危险逼近)
-t+ 91.7s 〰 震动:danger(危险逼近)
-t+ 91.7s 【状态】又有一颗,也故意不躲——想听听第二次被撞会说什么 对局中:1 颗陨石在逼近,听方位同向滑开(语音播放中,语速1)
-t+ 92.2s ♪ 音效 sfx/hit
-t+ 92.2s ▶ 语音:「左边撞上的。听到左边的呼啸,向左滑。」
-t+ 92.2s 〰 震动:hit(受击重震)
+t+ 89.4s ♪ 音效 sfx/whoosh_up
+t+ 89.4s ▶ 语音:「上!」
+t+ 89.9s ▶ 语音:「护盾充能完毕。」
+t+ 89.9s 〰 震动:pickup(获得)
+t+ 92.4s ♪ 音效 sfx/alarm
+t+ 92.9s ♪ 音效 sfx/alarm
+t+ 92.4s 〰 震动:danger(危险逼近)
+t+ 92.9s 〰 震动:danger(危险逼近)
+t+ 92.9s 【状态】又有一颗,也故意不躲——想听听第二次被撞会说什么 对局中:1 颗陨石在逼近,听方位同向滑开(语音播放中,语速1)
+t+ 93.4s ♪ 音效 sfx/hit
+t+ 93.4s ▶ 语音:「上面撞上的。听到高高的呼啸,向上滑。」
+t+ 93.4s 〰 震动:hit(受击重震)
#### 【玩家动作】第二次被撞:先听方位归因,又听到「这是最后一次机会,撑住」——这就是全部家底了
-t+ 92.6s ♪ 音效 sfx/whoosh_right
-t+ 94.3s ▶ 语音:「船体只剩最后一次了,小心!」
-t+ 94.4s ♪ 音效 sfx/alarm
-t+ 94.9s ♪ 音效 sfx/alarm
-t+ 94.9s ▶ 语音:「右!」
-t+ 94.4s 〰 震动:danger(危险逼近)
-t+ 94.9s 〰 震动:danger(危险逼近)
+t+ 93.4s ♪ 音效 sfx/whoosh_down
+t+ 93.4s ▶ 语音:「下!」
+t+ 95.6s ▶ 语音:「船体只剩最后一次了,小心!」
+t+ 96.4s ♪ 音效 sfx/alarm
+t+ 96.9s ♪ 音效 sfx/alarm
+t+ 96.4s 〰 震动:danger(危险逼近)
+t+ 96.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
-t+ 95.4s ♪ 音效 sfx/dodge
-t+ 95.7s ♪ 音效 sfx/whoosh_down
-t+ 97.5s ♪ 音效 sfx/alarm
-t+ 97.5s 〰 震动:danger(危险逼近)
-t+ 98.0s ♪ 音效 sfx/alarm
-t+ 98.0s ▶ 语音:「下!」
-t+ 98.0s 〰 震动:danger(危险逼近)
+t+ 97.4s ♪ 音效 sfx/dodge
+t+ 97.4s ♪ 音效 sfx/whoosh_up
+t+ 97.7s ▶ 向导语音:「这是最后一次机会,撑住。」
+t+ 100.4s ♪ 音效 sfx/alarm
+t+ 100.5s ♪ 音效 sfx/whoosh_up
+t+ 100.5s ▶ 语音:「上!」
+t+ 100.9s ♪ 音效 sfx/alarm
+t+ 100.4s 〰 震动:danger(危险逼近)
+t+ 100.9s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
-t+ 98.5s ♪ 音效 sfx/dodge
-t+ 98.8s ♪ 音效 sfx/whoosh_down
-t+ 100.5s ♪ 音效 sfx/alarm
-t+ 100.5s 〰 震动:danger(危险逼近)
-t+ 101.0s ♪ 音效 sfx/alarm
-t+ 101.0s ▶ 语音:「下!」
-t+ 101.0s 〰 震动:danger(危险逼近)
+t+ 101.4s ♪ 音效 sfx/dodge
+t+ 102.2s ♪ 音效 sfx/alarm
+t+ 102.7s ♪ 音效 sfx/alarm
+t+ 102.2s 〰 震动:danger(危险逼近)
+t+ 102.7s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
-t+ 101.5s ♪ 音效 sfx/dodge
-t+ 101.8s ♪ 音效 sfx/whoosh_left
-t+ 103.5s ♪ 音效 sfx/alarm
-t+ 103.5s 〰 震动:danger(危险逼近)
-t+ 104.0s ♪ 音效 sfx/alarm
-t+ 104.0s ▶ 语音:「左!」
-t+ 104.0s 〰 震动:danger(危险逼近)
+t+ 103.2s ♪ 音效 sfx/dodge
+t+ 103.5s ♪ 音效 sfx/whoosh_down
+t+ 103.5s ▶ 语音:「下!」
+t+ 105.1s ♪ 音效 sfx/alarm
+t+ 105.6s ♪ 音效 sfx/alarm
+t+ 105.1s 〰 震动:danger(危险逼近)
+t+ 105.6s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
-t+ 104.5s ♪ 音效 sfx/dodge
-t+ 104.8s ♪ 音效 sfx/whoosh_up
-t+ 104.9s ▶ 语音:「护盾充能完毕。」
-t+ 104.9s 〰 震动:pickup(获得)
-t+ 106.4s ♪ 音效 sfx/alarm
-t+ 106.9s ♪ 音效 sfx/alarm
-t+ 106.9s ▶ 语音:「上!」
-t+ 106.4s 〰 震动:danger(危险逼近)
-t+ 106.9s 〰 震动:danger(危险逼近)
+t+ 106.1s ♪ 音效 sfx/dodge
+t+ 106.4s ♪ 音效 sfx/whoosh_left
+t+ 106.4s ▶ 语音:「左!」
+t+ 108.1s ♪ 音效 sfx/alarm
+t+ 108.6s ♪ 音效 sfx/alarm
+t+ 108.1s 〰 震动:danger(危险逼近)
+t+ 108.6s 〰 震动:danger(危险逼近)
#### 【玩家动作】听到第二段警报和方向呼喊,同向滑开
-t+ 107.4s ♪ 音效 sfx/dodge
-t+ 107.7s ♪ 音效 sfx/whoosh_left
-t+ 109.3s ♪ 音效 sfx/alarm
-t+ 109.8s ♪ 音效 sfx/alarm
-t+ 109.8s ▶ 语音:「左!」
-t+ 109.3s 〰 震动:danger(危险逼近)
-t+ 109.8s 〰 震动:danger(危险逼近)
-t+ 109.8s 【状态】保护期结束后撑了 22 秒、挨了两下还活着;每回撞击前半秒都能听到方向呼喊,先到这 对局中:1 颗陨石在逼近,听方位同向滑开(语音播放中,语速1)
+t+ 109.1s ♪ 音效 sfx/dodge
+t+ 109.3s ♪ 音效 sfx/whoosh_right
+t+ 109.3s ▶ 语音:「右!」
+t+ 110.9s ♪ 音效 sfx/alarm
+t+ 110.9s 〰 震动:danger(危险逼近)
+t+ 111.4s ♪ 音效 sfx/alarm
+t+ 111.4s 〰 震动:danger(危险逼近)
+t+ 111.4s 【状态】保护期结束后撑了 24 秒、挨了两下还活着;每回撞击前半秒都能听到方向呼喊,先到这 对局中:1 颗陨石在逼近,听方位同向滑开(BGM=bgm/engine,语速1)
diff --git a/research/space-polish/round1/live-A-transcript.md b/research/space-polish/round1/live-A-transcript.md
new file mode 100644
index 00000000..5b713ba9
--- /dev/null
+++ b/research/space-polish/round1/live-A-transcript.md
@@ -0,0 +1,747 @@
+# space 实时会话 transcript
+
+- `[ -0.14s]` **GESTURE** tap @(195,422)
+- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
+- `[ 0.11s]` VOICE ▶ drill_welcome (dur 3.68s)
+- `[ 4.03s]` VOICE ■ drill_welcome (kill)
+- `[ 4.03s]` VERDICT drill_welcome: **OK** sim=1
+ - 期望: 欢迎登上盲航。你只有一双耳朵。
+ - 听到: 欢迎登上盲航,你只有一双耳朵。。
+- `[ 4.03s]` VOICE ▶ skip_hint (dur 1.92s)
+- `[ 5.91s]` VOICE ■ skip_hint (kill)
+- `[ 5.91s]` VERDICT skip_hint: **OK** sim=0.7143
+ - 期望: 单击可跳过旁白。
+ - 听到: 单击可跳过磅榜。
+- `[ 5.91s]` VOICE ▶ drill_rule (dur 3.6s)
+- `[ 9.74s]` VOICE ■ drill_rule (kill)
+- `[ 9.74s]` VERDICT drill_rule: **OK** sim=0.963
+ - 期望: 陨石来了,会有声音告诉你方位。
+ - 听到: 陨石来了,会有声音告诉你方位停。
+- `[ 9.75s]` VOICE ▶ drill_left (dur 4.96s)
+- `[ 14.96s]` VOICE ■ drill_left (kill)
+- `[ 14.96s]` SFX ♪ whoosh_left
+- `[ 14.96s]` VOICE ▶ dir_left (dur 0.5570975056689342s)
+- `[ 14.96s]` VERDICT drill_left: **OK** sim=0.8889
+ - 期望: 听,左边有陨石。向左滑,把它拨开!
+ - 听到: 停左边有陨石向左滑,把它拨开走。
+- `[ 15.73s]` VOICE ■ dir_left (kill)
+- `[ 15.73s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 走。
+- `[ 19.46s]` VIBRATE [60,40,60]
+- `[ 19.47s]` VOICE ▶ drill_retry_left (dur 3.36s)
+- `[ 19.47s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 22.93s]` VOICE ■ drill_retry_left (kill)
+- `[ 22.93s]` SFX ♪ whoosh_left
+- `[ 22.93s]` VOICE ▶ dir_left (dur 0.5570975056689342s)
+- `[ 22.93s]` VERDICT drill_retry_left: **OK** sim=0.9474
+ - 期望: 那是左边来的,向左滑。
+ - 听到: 那是左边来的,向左滑左。
+- `[ 23.69s]` VOICE ■ dir_left (kill)
+- `[ 23.69s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 走。
+- `[ 27.43s]` VIBRATE [60,40,60]
+- `[ 27.43s]` VOICE ▶ drill_moveon (dur 3.84s)
+- `[ 27.43s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 28.33s]` **GESTURE** swipeleft @(195,422)
+- `[ 28.68s]` VIBRATE [10]
+- `[ 31.54s]` VOICE ■ drill_moveon (kill)
+- `[ 31.54s]` VERDICT drill_moveon: **OK** sim=1
+ - 期望: 没关系,跟着我,我们继续。
+ - 听到: 没关系,跟着我,我们继续。
+- `[ 31.55s]` VOICE ▶ drill_right (dur 2.64s)
+- `[ 34.26s]` VOICE ■ drill_right (kill)
+- `[ 34.26s]` SFX ♪ whoosh_right
+- `[ 34.26s]` VOICE ▶ dir_right (dur 0.39909297052154197s)
+- `[ 34.26s]` VERDICT drill_right: **OK** sim=0.9412
+ - 期望: 这次在右边。向右滑!
+ - 听到: 这次在右边向右滑右。
+- `[ 34.74s]` VOICE ■ dir_right (kill)
+- `[ 34.74s]` VERDICT dir_right: **MISMATCH** sim=0
+ - 期望: 右!
+ - 听到: 救。
+- `[ 38.76s]` VIBRATE [60,40,60]
+- `[ 38.76s]` VOICE ▶ drill_retry_right (dur 3.2s)
+- `[ 38.76s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 42.22s]` VOICE ■ drill_retry_right (kill)
+- `[ 42.22s]` VERDICT drill_retry_right: **OK** sim=0.9474
+ - 期望: 那是右边来的,向右滑。
+ - 听到: 那是右边来的,向右滑右。
+- `[ 42.22s]` SFX ♪ whoosh_right
+- `[ 42.22s]` VOICE ▶ dir_right (dur 0.39909297052154197s)
+- `[ 42.71s]` VOICE ■ dir_right (kill)
+- `[ 42.71s]` VERDICT dir_right: **MISMATCH** sim=0
+ - 期望: 右!
+ - 听到: 救。
+- `[ 46.72s]` VIBRATE [60,40,60]
+- `[ 46.72s]` VOICE ▶ drill_moveon (dur 3.84s)
+- `[ 46.72s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 50.83s]` VOICE ■ drill_moveon (kill)
+- `[ 50.83s]` VERDICT drill_moveon: **OK** sim=1
+ - 期望: 没关系,跟着我,我们继续。
+ - 听到: 没关系,跟着我,我们继续。
+- `[ 50.84s]` VOICE ▶ drill_up (dur 4.24s)
+- `[ 55.41s]` VOICE ■ drill_up (kill)
+- `[ 55.41s]` SFX ♪ whoosh_up
+- `[ 55.41s]` VOICE ▶ dir_up (dur 0.39909297052154197s)
+- `[ 55.41s]` VERDICT drill_up: **OK** sim=1
+ - 期望: 上面有东西,声音又尖又高。向上滑!
+ - 听到: 上面有东西,声音又尖又高,向上滑。
+- `[ 55.90s]` VOICE ■ dir_up (kill)
+- `[ 55.90s]` VERDICT dir_up: **OK** sim=1
+ - 期望: 上!
+ - 听到: 上。
+- `[ 59.91s]` VIBRATE [60,40,60]
+- `[ 59.92s]` VOICE ▶ drill_retry_up (dur 4.08s)
+- `[ 59.92s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 64.02s]` VOICE ■ drill_retry_up (kill)
+- `[ 64.02s]` SFX ♪ whoosh_up
+- `[ 64.02s]` VOICE ▶ dir_up (dur 0.39909297052154197s)
+- `[ 64.02s]` VERDICT drill_retry_up: **OK** sim=0.96
+ - 期望: 声音又高又尖,是上面,向上滑。
+ - 听到: 声音又高又尖,是上面向上滑上。
+- `[ 64.51s]` VOICE ■ dir_up (kill)
+- `[ 64.51s]` VERDICT dir_up: **OK** sim=1
+ - 期望: 上!
+ - 听到: 上。
+- `[ 66.26s]` **GESTURE** swipeup @(195,422)
+- `[ 66.61s]` VIBRATE [10]
+- `[ 66.61s]` SFX ♪ dodge
+- `[ 66.62s]` VOICE ▶ drill_good (dur 0.7970975056689342s)
+- `[ 66.62s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 67.39s]` VOICE ■ drill_good (kill)
+- `[ 67.39s]` VERDICT drill_good: **MISMATCH** sim=0
+ - 期望: 漂亮。
+ - 听到: 你好。
+- `[ 67.39s]` VOICE ▶ drill_down (dur 3.28s)
+- `[ 70.85s]` VOICE ■ drill_down (kill)
+- `[ 70.85s]` SFX ♪ whoosh_down
+- `[ 70.85s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 70.85s]` VERDICT drill_down: **OK** sim=0.9091
+ - 期望: 下面是低沉的轰隆。向下滑!
+ - 听到: 下面是低沉的轰龙向下滑。
+- `[ 71.61s]` VOICE ■ dir_down (kill)
+- `[ 71.61s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 上。
+- `[ 75.35s]` VIBRATE [60,40,60]
+- `[ 75.36s]` VOICE ▶ drill_retry_down (dur 2.72s)
+- `[ 75.36s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 78.07s]` VOICE ■ drill_retry_down (kill)
+- `[ 78.07s]` SFX ♪ whoosh_down
+- `[ 78.07s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 78.07s]` VERDICT drill_retry_down: **OK** sim=0.7778
+ - 期望: 轰隆声在下面,向下滑。
+ - 听到: 轰龙声在下面向下火。
+- `[ 78.83s]` VOICE ■ dir_down (kill)
+- `[ 78.83s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 上。
+- `[ 82.57s]` VIBRATE [60,40,60]
+- `[ 82.57s]` VOICE ▶ drill_moveon (dur 3.84s)
+- `[ 82.57s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 86.68s]` VOICE ■ drill_moveon (kill)
+- `[ 86.68s]` VERDICT drill_moveon: **OK** sim=1
+ - 期望: 没关系,跟着我,我们继续。
+ - 听到: 没关系,跟着我,我们继续。
+- `[ 86.69s]` VOICE ▶ drill_done (dur 4.72s)
+- `[ 91.63s]` VOICE ■ drill_done (kill)
+- `[ 91.63s]` VERDICT drill_done: **OK** sim=0.9231
+ - 期望: 四个方向你都会了。引擎点火,出发!
+ - 听到: 四个方向你都会了,引擎点火。
+- `[ 91.81s]` BGM ♪ engine (loop)
+- `[ 93.13s]` SFX ♪ whoosh_left
+- `[ 96.13s]` VIBRATE [25,40,25,40,25]
+- `[ 96.13s]` SFX ♪ alarm
+- `[ 96.63s]` VIBRATE [25,40,25,40,25]
+- `[ 96.63s]` SFX ♪ alarm
+- `[ 97.13s]` VIBRATE [30,50,30,50,30]
+- `[ 97.13s]` SFX ♪ shield_block
+- `[ 97.13s]` VOICE ▶ protect_left (dur 7.76s)
+- `[ 97.13s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 97.13s]` SFX ♪ whoosh_right
+- `[ 100.13s]` VIBRATE [25,40,25,40,25]
+- `[ 100.13s]` SFX ♪ alarm
+- `[ 100.63s]` VIBRATE [25,40,25,40,25]
+- `[ 100.63s]` SFX ♪ alarm
+- `[ 101.13s]` VIBRATE [30,50,30,50,30]
+- `[ 101.13s]` SFX ♪ shield_block
+- `[ 101.13s]` VOICE ■ protect_left (kill)
+- `[ 101.13s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 101.13s]` VERDICT protect_left: **TRUNCATED** sim=0.5625
+ - 期望: 训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。
+ - 听到: 训练护盾接住了那颗训。
+- `[ 101.13s]` SFX ♪ whoosh_down
+- `[ 104.13s]` VIBRATE [25,40,25,40,25]
+- `[ 104.13s]` SFX ♪ alarm
+- `[ 104.63s]` VIBRATE [25,40,25,40,25]
+- `[ 104.63s]` SFX ♪ alarm
+- `[ 105.13s]` VIBRATE [30,50,30,50,30]
+- `[ 105.13s]` SFX ♪ shield_block
+- `[ 105.13s]` VOICE ■ protect_right (kill)
+- `[ 105.13s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 105.13s]` SFX ♪ whoosh_up
+- `[ 105.13s]` VERDICT protect_right: **TRUNCATED** sim=0.7059
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了,那颗在右边。
+- `[ 108.14s]` VIBRATE [25,40,25,40,25]
+- `[ 108.14s]` SFX ♪ alarm
+- `[ 108.64s]` VIBRATE [25,40,25,40,25]
+- `[ 108.64s]` SFX ♪ alarm
+- `[ 109.14s]` VIBRATE [30,50,30,50,30]
+- `[ 109.14s]` SFX ♪ shield_block
+- `[ 109.14s]` VOICE ■ protect_down (kill)
+- `[ 109.14s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 109.14s]` VERDICT protect_down: **TRUNCATED** sim=0.3429
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接着,每刻在下面请训。
+- `[ 109.14s]` SFX ♪ whoosh_right
+- `[ 111.63s]` VOICE ■ protect_up (kill)
+- `[ 111.63s]` VOICE ▶ feat_boost (dur 6.48s)
+- `[ 111.63s]` VERDICT protect_up: **TRUNCATED** sim=0.3333
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练互动接住了是。
+- `[ 118.42s]` VOICE ■ feat_boost (kill)
+- `[ 118.42s]` VERDICT feat_boost: **OK** sim=1
+ - 期望: 试试单击,引擎会短促加速,直接冲过空隙。
+ - 听到: 试试单击,引擎会短促加速,直接冲过空隙。
+- `[ 122.13s]` SFX ♪ whoosh_up
+- `[ 125.13s]` VIBRATE [25,40,25,40,25]
+- `[ 125.13s]` SFX ♪ alarm
+- `[ 125.63s]` VIBRATE [25,40,25,40,25]
+- `[ 125.63s]` SFX ♪ alarm
+- `[ 126.13s]` VIBRATE [30,50,30,50,30]
+- `[ 126.13s]` SFX ♪ shield_block
+- `[ 126.13s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 126.13s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 126.13s]` SFX ♪ whoosh_up
+- `[ 129.13s]` VIBRATE [25,40,25,40,25]
+- `[ 129.13s]` SFX ♪ alarm
+- `[ 129.63s]` VIBRATE [25,40,25,40,25]
+- `[ 129.63s]` SFX ♪ alarm
+- `[ 130.13s]` VIBRATE [30,50,30,50,30]
+- `[ 130.13s]` SFX ♪ shield_block
+- `[ 130.13s]` VOICE ■ protect_up (kill)
+- `[ 130.13s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 130.13s]` VERDICT protect_up: **TRUNCATED** sim=0.6286
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练护刃接住了,那颗在上面训。
+- `[ 130.13s]` SFX ♪ whoosh_right
+- `[ 133.13s]` VIBRATE [25,40,25,40,25]
+- `[ 133.13s]` SFX ♪ alarm
+- `[ 133.63s]` VIBRATE [25,40,25,40,25]
+- `[ 133.63s]` SFX ♪ alarm
+- `[ 134.13s]` VIBRATE [30,50,30,50,30]
+- `[ 134.13s]` SFX ♪ shield_block
+- `[ 134.13s]` VOICE ■ protect_up (kill)
+- `[ 134.13s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 134.13s]` VERDICT protect_up: **TRUNCATED** sim=0.5882
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练互动接住了,那颗在上面。
+- `[ 134.13s]` SFX ♪ whoosh_down
+- `[ 136.63s]` VOICE ■ protect_right (kill)
+- `[ 136.63s]` VOICE ▶ feat_shield (dur 4.4s)
+- `[ 136.63s]` VERDICT protect_right: **TRUNCATED** sim=0.4667
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了说。
+- `[ 139.46s]` **GESTURE** tap @(195,422)
+- `[ 139.82s]` VIBRATE [20]
+- `[ 139.82s]` VOICE ■ feat_shield (kill)
+- `[ 139.82s]` VERDICT feat_shield: **TRUNCATED** sim=0.6667
+ - 期望: 双击展开护盾,能挡下一次撞击。
+ - 听到: 双击展开护盾能等。
+- `[ 147.13s]` SFX ♪ whoosh_up
+- `[ 150.13s]` VIBRATE [25,40,25,40,25]
+- `[ 150.13s]` SFX ♪ alarm
+- `[ 150.63s]` VIBRATE [25,40,25,40,25]
+- `[ 150.63s]` SFX ♪ alarm
+- `[ 151.13s]` VIBRATE [30,50,30,50,30]
+- `[ 151.13s]` SFX ♪ shield_block
+- `[ 151.13s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 151.13s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 151.13s]` SFX ♪ whoosh_left
+- `[ 151.13s]` VOICE ■ protect_up (kill)
+- `[ 151.13s]` VOICE ▶ dir_left (dur 0.5570975056689342s)
+- `[ 151.13s]` VERDICT protect_up: **TRUNCATED** sim=0
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 哦。
+- `[ 151.63s]` VIBRATE [30,50,30,50,30]
+- `[ 151.63s]` VOICE ■ dir_left (kill)
+- `[ 151.63s]` VOICE ▶ protect_end (dur 5.36s)
+- `[ 151.63s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 哦。
+- `[ 154.13s]` VIBRATE [25,40,25,40,25]
+- `[ 154.13s]` SFX ♪ alarm
+- `[ 154.63s]` VIBRATE [25,40,25,40,25]
+- `[ 154.63s]` SFX ♪ alarm
+- `[ 155.13s]` VIBRATE [80]
+- `[ 155.13s]` SFX ♪ hit
+- `[ 155.13s]` VOICE ■ protect_end (kill)
+- `[ 155.13s]` VOICE ▶ hit_left (dur 4.64s)
+- `[ 155.13s]` VERDICT protect_end: **TRUNCATED** sim=0.5217
+ - 期望: 训练护盾关闭。接下来,靠你自己了。
+ - 听到: 哼训练护盾关闭有效。
+- `[ 155.13s]` SFX ♪ whoosh_down
+- `[ 155.13s]` VOICE ■ hit_left (kill)
+- `[ 155.13s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 155.13s]` VERDICT hit_left: **TRUNCATED** sim=0
+ - 期望: 左边撞上的。听到左边的呼啸,向左滑。
+ - 听到: 让。
+- `[ 155.90s]` VOICE ■ dir_down (kill)
+- `[ 155.90s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 跳。
+- `[ 158.13s]` VIBRATE [25,40,25,40,25]
+- `[ 158.13s]` SFX ♪ alarm
+- `[ 158.63s]` VIBRATE [25,40,25,40,25]
+- `[ 158.63s]` SFX ♪ alarm
+- `[ 159.13s]` VIBRATE [80]
+- `[ 159.13s]` SFX ♪ hit
+- `[ 159.13s]` VOICE ▶ hit_down (dur 4.32s)
+- `[ 159.13s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 159.13s]` SFX ♪ whoosh_left
+- `[ 159.13s]` VOICE ■ hit_down (kill)
+- `[ 159.13s]` VOICE ▶ dir_left (dur 0.5570975056689342s)
+- `[ 159.13s]` VERDICT hit_down: **TRUNCATED** sim=0
+ - 期望: 下面撞上的。听到低沉的轰隆,向下滑。
+ - 听到: 哦。
+- `[ 159.89s]` VOICE ■ dir_left (kill)
+- `[ 159.89s]` VOICE ▶ hit_last (dur 2.72s)
+- `[ 159.89s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 哦,你传。
+- `[ 162.13s]` VIBRATE [25,40,25,40,25]
+- `[ 162.13s]` SFX ♪ alarm
+- `[ 162.60s]` VOICE ■ hit_last (kill)
+- `[ 162.60s]` VOICE ▶ gd_last_life (dur 2.8s)
+- `[ 162.60s]` VERDICT hit_last: **OK** sim=0.8696
+ - 期望: 船体只剩最后一次了,小心!
+ - 听到: 团体只剩最后一次了,小心这。
+- `[ 162.63s]` VIBRATE [25,40,25,40,25]
+- `[ 162.63s]` SFX ♪ alarm
+- `[ 163.13s]` VIBRATE [80]
+- `[ 163.13s]` VOICE ■ gd_last_life (kill)
+- `[ 163.13s]` VIBRATE [60,40,60]
+- `[ 163.13s]` VERDICT gd_last_life: **TRUNCATED** sim=0.3333
+ - 期望: 这是最后一次机会,撑住。
+ - 听到: 这是。
+- `[ 163.13s]` SFX ♪ hit
+- `[ 163.13s]` SFX ♪ crash
+- `[ 163.43s]` VIBRATE [80]
+- `[ 164.33s]` VIBRATE [100]
+- `[ 164.34s]` VOICE ▶ time_3 (dur 3.2s)
+- `[ 167.81s]` VOICE ■ time_3 (kill)
+- `[ 167.81s]` VERDICT time_3: **OK** sim=0.9091
+ - 期望: 超过一分钟,合格的飞行员。
+ - 听到: 超过1分钟,合格的飞行员。
+- `[ 167.81s]` VOICE ▶ new_record (dur 1.28s)
+- `[ 169.41s]` VOICE ■ new_record (kill)
+- `[ 169.41s]` VERDICT new_record: **MISMATCH** sim=0.5714
+ - 期望: 新纪录!
+ - 听到: 新记录只。
+- `[ 169.41s]` VOICE ▶ dodge_1 (dur 1.36s)
+- `[ 171.01s]` VOICE ■ dodge_1 (kill)
+- `[ 171.01s]` VERDICT dodge_1: **MISMATCH** sim=0.4
+ - 期望: 只拨开几颗。
+ - 听到: 只剥开即可。。
+- `[ 171.02s]` VOICE ▶ restart_hint (dur 3.68s)
+- `[ 174.48s]` BGM ♪ menu (loop)
+- `[ 174.84s]` VOICE ■ restart_hint (kill)
+- `[ 174.84s]` VERDICT restart_hint: **OK** sim=0.9091
+ - 期望: 单击再飞一次,下滑回大厅。
+ - 听到: 单机再飞一次,下滑回大厅。
+- `[ 176.01s]` **GESTURE** doubletap @(195,422)
+- `[ 176.26s]` VIBRATE [20]
+- `[ 240.43s]` **GESTURE** tap @(195,422)
+- `[ 240.80s]` VIBRATE [20]
+- `[ 240.80s]` BGM ♪ engine (loop)
+- `[ 242.30s]` SFX ♪ whoosh_up
+- `[ 245.30s]` VIBRATE [25,40,25,40,25]
+- `[ 245.30s]` SFX ♪ alarm
+- `[ 245.80s]` VIBRATE [25,40,25,40,25]
+- `[ 245.80s]` SFX ♪ alarm
+- `[ 246.30s]` VIBRATE [30,50,30,50,30]
+- `[ 246.30s]` SFX ♪ shield_block
+- `[ 246.30s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 246.30s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 246.30s]` SFX ♪ whoosh_down
+- `[ 249.30s]` VIBRATE [25,40,25,40,25]
+- `[ 249.30s]` SFX ♪ alarm
+- `[ 249.80s]` VIBRATE [25,40,25,40,25]
+- `[ 249.80s]` SFX ♪ alarm
+- `[ 250.30s]` VIBRATE [30,50,30,50,30]
+- `[ 250.30s]` SFX ♪ shield_block
+- `[ 250.30s]` VOICE ■ protect_up (kill)
+- `[ 250.30s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 250.30s]` VERDICT protect_up: **TRUNCATED** sim=0.5882
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练互动接住了,那颗在上面。
+- `[ 250.30s]` SFX ♪ whoosh_right
+- `[ 253.30s]` VIBRATE [25,40,25,40,25]
+- `[ 253.30s]` SFX ♪ alarm
+- `[ 253.80s]` VIBRATE [25,40,25,40,25]
+- `[ 253.80s]` SFX ♪ alarm
+- `[ 254.30s]` VIBRATE [30,50,30,50,30]
+- `[ 254.30s]` SFX ♪ shield_block
+- `[ 254.30s]` VOICE ■ protect_down (kill)
+- `[ 254.30s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 254.30s]` VERDICT protect_down: **TRUNCATED** sim=0.5405
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那颗在下面心奋训。
+- `[ 254.30s]` SFX ♪ whoosh_down
+- `[ 257.30s]` VIBRATE [25,40,25,40,25]
+- `[ 257.30s]` SFX ♪ alarm
+- `[ 257.80s]` VIBRATE [25,40,25,40,25]
+- `[ 257.80s]` SFX ♪ alarm
+- `[ 258.30s]` VIBRATE [30,50,30,50,30]
+- `[ 258.30s]` SFX ♪ shield_block
+- `[ 258.30s]` VOICE ■ protect_right (kill)
+- `[ 258.30s]` VERDICT protect_right: **TRUNCATED** sim=0.7059
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了,那颗在右边。
+- `[ 258.30s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 258.30s]` SFX ♪ whoosh_right
+- `[ 261.30s]` VIBRATE [25,40,25,40,25]
+- `[ 261.30s]` SFX ♪ alarm
+- `[ 261.80s]` VIBRATE [25,40,25,40,25]
+- `[ 261.80s]` SFX ♪ alarm
+- `[ 262.30s]` VIBRATE [30,50,30,50,30]
+- `[ 262.30s]` SFX ♪ shield_block
+- `[ 262.30s]` VOICE ■ protect_down (kill)
+- `[ 262.30s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 262.30s]` VERDICT protect_down: **TRUNCATED** sim=0.5405
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那颗在下面经动训。
+- `[ 262.30s]` SFX ♪ whoosh_down
+- `[ 265.30s]` VIBRATE [25,40,25,40,25]
+- `[ 265.30s]` SFX ♪ alarm
+- `[ 265.80s]` VIBRATE [25,40,25,40,25]
+- `[ 265.80s]` SFX ♪ alarm
+- `[ 266.30s]` VIBRATE [30,50,30,50,30]
+- `[ 266.30s]` SFX ♪ shield_block
+- `[ 266.30s]` VOICE ■ protect_right (kill)
+- `[ 266.30s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 266.30s]` VERDICT protect_right: **TRUNCATED** sim=0.7059
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了,那颗在右边。
+- `[ 266.30s]` SFX ♪ whoosh_down
+- `[ 269.30s]` VIBRATE [25,40,25,40,25]
+- `[ 269.30s]` SFX ♪ alarm
+- `[ 269.80s]` VIBRATE [25,40,25,40,25]
+- `[ 269.80s]` SFX ♪ alarm
+- `[ 270.30s]` VIBRATE [30,50,30,50,30]
+- `[ 270.30s]` SFX ♪ shield_block
+- `[ 270.30s]` VOICE ■ protect_down (kill)
+- `[ 270.30s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 270.30s]` VERDICT protect_down: **TRUNCATED** sim=0.5
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那刻在下面拼成。
+- `[ 270.31s]` SFX ♪ whoosh_down
+- `[ 273.31s]` VIBRATE [25,40,25,40,25]
+- `[ 273.31s]` SFX ♪ alarm
+- `[ 273.81s]` VIBRATE [25,40,25,40,25]
+- `[ 273.81s]` SFX ♪ alarm
+- `[ 274.31s]` VIBRATE [30,50,30,50,30]
+- `[ 274.31s]` SFX ♪ shield_block
+- `[ 274.31s]` VOICE ■ protect_down (kill)
+- `[ 274.31s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 274.31s]` VERDICT protect_down: **TRUNCATED** sim=0.4865
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那刻在下面形成训。
+- `[ 274.31s]` SFX ♪ whoosh_right
+- `[ 277.31s]` VIBRATE [25,40,25,40,25]
+- `[ 277.31s]` SFX ♪ alarm
+- `[ 277.81s]` VIBRATE [25,40,25,40,25]
+- `[ 277.81s]` SFX ♪ alarm
+- `[ 278.31s]` VIBRATE [30,50,30,50,30]
+- `[ 278.31s]` SFX ♪ shield_block
+- `[ 278.31s]` VOICE ■ protect_down (kill)
+- `[ 278.31s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 278.31s]` VERDICT protect_down: **TRUNCATED** sim=0.5946
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那刻在下面听到训。
+- `[ 278.31s]` SFX ♪ whoosh_up
+- `[ 281.31s]` VIBRATE [25,40,25,40,25]
+- `[ 281.31s]` SFX ♪ alarm
+- `[ 281.81s]` VIBRATE [25,40,25,40,25]
+- `[ 281.81s]` SFX ♪ alarm
+- `[ 282.31s]` VIBRATE [30,50,30,50,30]
+- `[ 282.31s]` SFX ♪ shield_block
+- `[ 282.31s]` VOICE ■ protect_right (kill)
+- `[ 282.31s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 282.31s]` VERDICT protect_right: **TRUNCATED** sim=0.6471
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护关接住了,那颗在右边。
+- `[ 282.31s]` SFX ♪ whoosh_right
+- `[ 282.56s]` **GESTURE** doubletap @(195,422)
+- `[ 282.81s]` VIBRATE [20]
+- `[ 282.81s]` SFX ♪ shield
+- `[ 285.22s]` **GESTURE** doubletap @(195,422)
+- `[ 285.31s]` VIBRATE [25,40,25,40,25]
+- `[ 285.31s]` SFX ♪ alarm
+- `[ 285.47s]` VIBRATE [20]
+- `[ 285.47s]` VIBRATE [40,100,40]
+- `[ 285.47s]` VOICE ■ protect_up (kill)
+- `[ 285.47s]` VOICE ▶ feat_shield_done (dur 4.88s)
+- `[ 285.47s]` VERDICT protect_up: **TRUNCATED** sim=0.4848
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练死定接住了那刻在上。
+- `[ 285.81s]` VIBRATE [25,40,25,40,25]
+- `[ 285.81s]` SFX ♪ alarm
+- `[ 286.31s]` VIBRATE [100]
+- `[ 286.31s]` SFX ♪ shield_block
+- `[ 286.31s]` SFX ♪ whoosh_down
+- `[ 289.31s]` VIBRATE [25,40,25,40,25]
+- `[ 289.31s]` SFX ♪ alarm
+- `[ 289.81s]` VIBRATE [25,40,25,40,25]
+- `[ 289.81s]` SFX ♪ alarm
+- `[ 290.31s]` VIBRATE [30,50,30,50,30]
+- `[ 290.31s]` SFX ♪ shield_block
+- `[ 290.31s]` VOICE ■ feat_shield_done (kill)
+- `[ 290.31s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 290.31s]` VERDICT feat_shield_done: **OK** sim=0.9697
+ - 期望: 护盾展开后会自动充能,好了我会告诉你。
+ - 听到: 护盾展开后,会自充能。好了,我会告诉你。
+- `[ 290.31s]` SFX ♪ whoosh_down
+- `[ 293.31s]` VIBRATE [25,40,25,40,25]
+- `[ 293.31s]` SFX ♪ alarm
+- `[ 293.81s]` VIBRATE [25,40,25,40,25]
+- `[ 293.81s]` SFX ♪ alarm
+- `[ 294.31s]` VIBRATE [30,50,30,50,30]
+- `[ 294.31s]` SFX ♪ shield_block
+- `[ 294.31s]` VOICE ■ protect_down (kill)
+- `[ 294.31s]` VOICE ▶ protect_down (dur 6.08s)
+- `[ 294.31s]` VERDICT protect_down: **TRUNCATED** sim=0.5
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练互动接住了,那刻在下面请训。
+- `[ 294.31s]` SFX ♪ whoosh_left
+- `[ 297.31s]` VIBRATE [25,40,25,40,25]
+- `[ 297.31s]` SFX ♪ alarm
+- `[ 297.81s]` VIBRATE [25,40,25,40,25]
+- `[ 297.81s]` SFX ♪ alarm
+- `[ 297.81s]` VIBRATE [15]
+- `[ 298.31s]` VIBRATE [30,50,30,50,30]
+- `[ 298.31s]` SFX ♪ shield_block
+- `[ 298.31s]` VOICE ■ protect_down (kill)
+- `[ 298.31s]` VOICE ▶ protect_left (dur 7.76s)
+- `[ 298.31s]` VERDICT protect_down: **TRUNCATED** sim=0.5
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训念互动接住了,那刻在下面请下。
+- `[ 298.31s]` SFX ♪ whoosh_down
+- `[ 298.31s]` VOICE ■ protect_left (kill)
+- `[ 298.31s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 298.31s]` VERDICT protect_left: **TRUNCATED** sim=0
+ - 期望: 训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。
+ - 听到: 这。
+- `[ 299.08s]` VOICE ■ dir_down (kill)
+- `[ 299.08s]` VOICE ▶ shield_block (dur 1.6s)
+- `[ 299.08s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 跳。
+- `[ 299.82s]` **GESTURE** tap @(195,422)
+- `[ 300.19s]` VIBRATE [20]
+- `[ 300.19s]` VOICE ■ shield_block (kill)
+- `[ 300.19s]` VOICE ▶ shield_ready (dur 1.6s)
+- `[ 300.19s]` VERDICT shield_block: **TRUNCATED** sim=0.7273
+ - 期望: 护盾挡下了撞击。
+ - 听到: 护盾挡下。
+- `[ 300.80s]` VIBRATE [30,50,30,50,30]
+- `[ 300.80s]` VOICE ■ shield_ready (kill)
+- `[ 300.80s]` VOICE ▶ protect_end (dur 5.36s)
+- `[ 300.80s]` VERDICT shield_ready: **TRUNCATED** sim=0
+ - 期望: 护盾充能完毕。
+ - 听到: 虎。
+- `[ 301.31s]` VIBRATE [25,40,25,40,25]
+- `[ 301.31s]` SFX ♪ alarm
+- `[ 301.50s]` **GESTURE** tap @(195,422)
+- `[ 301.81s]` VIBRATE [25,40,25,40,25]
+- `[ 301.81s]` SFX ♪ alarm
+- `[ 301.86s]` VIBRATE [20]
+- `[ 301.86s]` VOICE ■ protect_end (kill)
+- `[ 301.86s]` VERDICT protect_end: **TRUNCATED** sim=0
+ - 期望: 训练护盾关闭。接下来,靠你自己了。
+ - 听到: 哼。
+- `[ 302.31s]` VIBRATE [80]
+- `[ 302.31s]` SFX ♪ hit
+- `[ 302.31s]` VOICE ▶ hit_down (dur 4.32s)
+- `[ 302.31s]` SFX ♪ whoosh_down
+- `[ 302.31s]` VOICE ■ hit_down (kill)
+- `[ 302.31s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 302.31s]` VERDICT hit_down: **TRUNCATED** sim=0
+ - 期望: 下面撞上的。听到低沉的轰隆,向下滑。
+ - 听到: 让。
+- `[ 303.07s]` VOICE ■ dir_down (kill)
+- `[ 303.07s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 上。
+- `[ 305.31s]` VIBRATE [25,40,25,40,25]
+- `[ 305.31s]` SFX ♪ alarm
+- `[ 305.81s]` VIBRATE [25,40,25,40,25]
+- `[ 305.81s]` SFX ♪ alarm
+- `[ 306.31s]` VIBRATE [80]
+- `[ 306.31s]` SFX ♪ hit
+- `[ 306.31s]` VOICE ▶ hit_down (dur 4.32s)
+- `[ 306.31s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 306.31s]` SFX ♪ whoosh_up
+- `[ 306.31s]` VOICE ■ hit_down (kill)
+- `[ 306.31s]` VOICE ▶ dir_up (dur 0.39909297052154197s)
+- `[ 306.31s]` VERDICT hit_down: **TRUNCATED** sim=0.125
+ - 期望: 下面撞上的。听到低沉的轰隆,向下滑。
+ - 听到: 上。
+- `[ 306.79s]` VOICE ■ dir_up (kill)
+- `[ 306.79s]` VOICE ▶ hit_last (dur 2.72s)
+- `[ 306.79s]` VERDICT dir_up: **MISMATCH** sim=0
+ - 期望: 上!
+ - 听到: 张。
+- `[ 309.31s]` VIBRATE [25,40,25,40,25]
+- `[ 309.31s]` SFX ♪ alarm
+- `[ 309.50s]` VOICE ■ hit_last (kill)
+- `[ 309.50s]` VOICE ▶ gd_last_life (dur 2.8s)
+- `[ 309.50s]` VERDICT hit_last: **OK** sim=0.8696
+ - 期望: 船体只剩最后一次了,小心!
+ - 听到: 团体只剩最后一次了,小心这。
+- `[ 309.81s]` VIBRATE [25,40,25,40,25]
+- `[ 309.81s]` SFX ♪ alarm
+- `[ 310.31s]` VIBRATE [80]
+- `[ 310.31s]` VOICE ■ gd_last_life (kill)
+- `[ 310.31s]` VIBRATE [60,40,60]
+- `[ 310.31s]` SFX ♪ hit
+- `[ 310.31s]` SFX ♪ crash
+- `[ 310.31s]` VERDICT gd_last_life: **TRUNCATED** sim=0.4286
+ - 期望: 这是最后一次机会,撑住。
+ - 听到: 这是最美。
+- `[ 310.62s]` VIBRATE [80]
+- `[ 311.52s]` VOICE ▶ time_3 (dur 3.2s)
+- `[ 314.96s]` VOICE ■ time_3 (kill)
+- `[ 314.96s]` VOICE ▶ dodge_1 (dur 1.36s)
+- `[ 314.96s]` VERDICT time_3: **OK** sim=0.8696
+ - 期望: 超过一分钟,合格的飞行员。
+ - 听到: 超过一分钟,苛格的飞行员只。
+- `[ 316.56s]` VOICE ■ dodge_1 (kill)
+- `[ 316.56s]` VOICE ▶ restart_hint (dur 3.68s)
+- `[ 316.56s]` VERDICT dodge_1: **MISMATCH** sim=0.4
+ - 期望: 只拨开几颗。
+ - 听到: 只剥开即可。。
+- `[ 320.39s]` VOICE ■ restart_hint (kill)
+- `[ 320.39s]` BGM ♪ menu (loop)
+- `[ 320.39s]` VERDICT restart_hint: **OK** sim=0.9091
+ - 期望: 单击再飞一次,下滑回大厅。
+ - 听到: 单机再飞一次,下滑回大厅。
+- `[ 339.82s]` **GESTURE** tap @(195,422)
+- `[ 340.19s]` VIBRATE [20]
+- `[ 340.19s]` BGM ♪ engine (loop)
+- `[ 341.69s]` SFX ♪ whoosh_down
+- `[ 344.30s]` **GESTURE** swipedown @(195,422)
+- `[ 344.65s]` VIBRATE [10]
+- `[ 344.69s]` VIBRATE [25,40,25,40,25]
+- `[ 344.69s]` SFX ♪ alarm
+- `[ 345.19s]` VIBRATE [25,40,25,40,25]
+- `[ 345.19s]` SFX ♪ alarm
+- `[ 345.69s]` SFX ♪ dodge
+- `[ 345.69s]` SFX ♪ whoosh_up
+- `[ 348.69s]` VIBRATE [25,40,25,40,25]
+- `[ 348.69s]` SFX ♪ alarm
+- `[ 349.19s]` VIBRATE [25,40,25,40,25]
+- `[ 349.19s]` SFX ♪ alarm
+- `[ 349.69s]` VIBRATE [30,50,30,50,30]
+- `[ 349.69s]` SFX ♪ shield_block
+- `[ 349.69s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 349.69s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 349.69s]` SFX ♪ whoosh_up
+- `[ 352.69s]` VIBRATE [25,40,25,40,25]
+- `[ 352.69s]` SFX ♪ alarm
+- `[ 353.19s]` VIBRATE [25,40,25,40,25]
+- `[ 353.19s]` SFX ♪ alarm
+- `[ 353.69s]` VIBRATE [30,50,30,50,30]
+- `[ 353.69s]` SFX ♪ shield_block
+- `[ 353.69s]` VOICE ■ protect_up (kill)
+- `[ 353.69s]` VERDICT protect_up: **TRUNCATED** sim=0.6471
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练护令接住了,那颗在上面。
+- `[ 353.69s]` VOICE ▶ protect_up (dur 6.96s)
+- `[ 353.69s]` SFX ♪ whoosh_right
+- `[ 356.69s]` VIBRATE [25,40,25,40,25]
+- `[ 356.69s]` SFX ♪ alarm
+- `[ 357.19s]` VIBRATE [25,40,25,40,25]
+- `[ 357.19s]` SFX ♪ alarm
+- `[ 357.69s]` VIBRATE [30,50,30,50,30]
+- `[ 357.69s]` SFX ♪ shield_block
+- `[ 357.69s]` VOICE ■ protect_up (kill)
+- `[ 357.69s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 357.69s]` VERDICT protect_up: **TRUNCATED** sim=0.5882
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练互动接住了,那颗在上面。
+- `[ 357.69s]` SFX ♪ whoosh_left
+- `[ 360.69s]` VIBRATE [25,40,25,40,25]
+- `[ 360.69s]` SFX ♪ alarm
+- `[ 361.19s]` VIBRATE [25,40,25,40,25]
+- `[ 361.19s]` SFX ♪ alarm
+- `[ 361.69s]` VIBRATE [30,50,30,50,30]
+- `[ 361.69s]` SFX ♪ shield_block
+- `[ 361.69s]` VOICE ■ protect_right (kill)
+- `[ 361.69s]` VOICE ▶ protect_left (dur 7.76s)
+- `[ 361.69s]` VERDICT protect_right: **TRUNCATED** sim=0.7059
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了,那颗在右边。
+- `[ 361.69s]` SFX ♪ whoosh_left
+- `[ 364.69s]` VIBRATE [25,40,25,40,25]
+- `[ 364.69s]` SFX ♪ alarm
+- `[ 365.19s]` VIBRATE [25,40,25,40,25]
+- `[ 365.19s]` SFX ♪ alarm
+- `[ 365.69s]` VIBRATE [30,50,30,50,30]
+- `[ 365.69s]` SFX ♪ shield_block
+- `[ 365.69s]` VOICE ■ protect_left (kill)
+- `[ 365.69s]` VOICE ▶ protect_left (dur 7.76s)
+- `[ 365.69s]` VERDICT protect_left: **TRUNCATED** sim=0.4516
+ - 期望: 训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。
+ - 听到: 训练不遁接住了那颗。
+- `[ 365.69s]` SFX ♪ whoosh_right
+- `[ 368.70s]` VIBRATE [25,40,25,40,25]
+- `[ 368.70s]` SFX ♪ alarm
+- `[ 369.20s]` VIBRATE [25,40,25,40,25]
+- `[ 369.20s]` SFX ♪ alarm
+- `[ 369.70s]` VIBRATE [30,50,30,50,30]
+- `[ 369.70s]` SFX ♪ shield_block
+- `[ 369.70s]` VOICE ■ protect_left (kill)
+- `[ 369.70s]` VOICE ▶ protect_right (dur 7.2s)
+- `[ 369.70s]` VERDICT protect_left: **TRUNCATED** sim=0.5625
+ - 期望: 训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。
+ - 听到: 训练护盾接住了那颗训。
+- `[ 369.70s]` SFX ♪ whoosh_right
+- `[ 371.43s]` **GESTURE** swipedown @(195,422)
+- `[ 371.79s]` VIBRATE [10]
+- `[ 371.79s]` BGM ♪ menu (loop)
+- `[ 371.79s]` VOICE ■ protect_right (kill)
+- `[ 371.79s]` VOICE ▶ paused (dur 1.12s)
+- `[ 371.79s]` VERDICT protect_right: **TRUNCATED** sim=0.4828
+ - 期望: 训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。
+ - 听到: 训练护盾接住了。
+- `[ 372.91s]` VOICE ■ paused (kill)
+- `[ 372.91s]` VOICE ▶ menu_main (dur 4.16s)
+- `[ 372.91s]` VERDICT paused: **OK** sim=0.6667
+ - 期望: 已暂停。
+ - 听到: 你暂停。
+- `[ 377.02s]` VOICE ■ menu_main (kill)
+- `[ 377.02s]` VOICE ▶ menu_resume (dur 1.12s)
+- `[ 377.02s]` VERDICT menu_main: **OK** sim=0.9565
+ - 期望: 菜单。单击切换选项,双击确认。
+ - 听到: 菜单单击切换选项,双击确。
+- `[ 378.16s]` VOICE ■ menu_resume (kill)
+- `[ 378.16s]` VERDICT menu_resume: **OK** sim=1
+ - 期望: 继续飞行。
+ - 听到: 继续飞行。
+- `[ 404.95s]` **GESTURE** doubletap @(195,422)
+- `[ 405.20s]` VIBRATE [20]
+- `[ 405.20s]` VIBRATE [30,50,30,50,30]
+- `[ 405.20s]` BGM ♪ engine (loop)
+- `[ 405.20s]` VOICE ▶ protect_end (dur 5.36s)
+- `[ 406.00s]` SFX ♪ whoosh_down
+- `[ 406.00s]` VOICE ■ protect_end (kill)
+- `[ 406.00s]` VOICE ▶ dir_down (dur 0.5570975056689342s)
+- `[ 406.76s]` VOICE ■ dir_down (kill)
+- `[ 409.00s]` VIBRATE [25,40,25,40,25]
+- `[ 409.00s]` SFX ♪ alarm
+- `[ 409.50s]` VIBRATE [25,40,25,40,25]
+- `[ 409.50s]` SFX ♪ alarm
diff --git a/research/space-polish/round1/live-A-verdicts.json b/research/space-polish/round1/live-A-verdicts.json
new file mode 100644
index 00000000..723d2f47
--- /dev/null
+++ b/research/space-polish/round1/live-A-verdicts.json
@@ -0,0 +1,1979 @@
+{
+ "game": "space",
+ "settings": {
+ "voice": "male",
+ "guide": "full",
+ "speed": 1,
+ "bgm": 1
+ },
+ "outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/space-20260914054721",
+ "segs": [
+ {
+ "idx": 0,
+ "voiceId": "drill_welcome",
+ "t0": 0.111,
+ "t1": 4.026,
+ "dur": 3.68,
+ "expEnd": 3.791,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "欢迎登上盲航,你只有一双耳朵。。",
+ "similarity": 1
+ },
+ {
+ "idx": 1,
+ "voiceId": "skip_hint",
+ "t0": 4.027,
+ "t1": 5.906,
+ "dur": 1.92,
+ "expEnd": 5.947,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "单击可跳过磅榜。",
+ "similarity": 0.7143
+ },
+ {
+ "idx": 2,
+ "voiceId": "drill_rule",
+ "t0": 5.907,
+ "t1": 9.738,
+ "dur": 3.6,
+ "expEnd": 9.507,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "陨石来了,会有声音告诉你方位停。",
+ "similarity": 0.963
+ },
+ {
+ "idx": 3,
+ "voiceId": "drill_left",
+ "t0": 9.746,
+ "t1": 14.962,
+ "dur": 4.96,
+ "expEnd": 14.706,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "停左边有陨石向左滑,把它拨开走。",
+ "similarity": 0.8889
+ },
+ {
+ "idx": 4,
+ "voiceId": "dir_left",
+ "t0": 14.962,
+ "t1": 15.728,
+ "dur": 0.5570975056689342,
+ "expEnd": 15.519,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "走。",
+ "similarity": 0
+ },
+ {
+ "idx": 5,
+ "voiceId": "drill_retry_left",
+ "t0": 19.471,
+ "t1": 22.925,
+ "dur": 3.36,
+ "expEnd": 22.831,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "那是左边来的,向左滑左。",
+ "similarity": 0.9474
+ },
+ {
+ "idx": 6,
+ "voiceId": "dir_left",
+ "t0": 22.925,
+ "t1": 23.691,
+ "dur": 0.5570975056689342,
+ "expEnd": 23.482,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "走。",
+ "similarity": 0
+ },
+ {
+ "idx": 7,
+ "voiceId": "drill_moveon",
+ "t0": 27.434,
+ "t1": 31.539,
+ "dur": 3.84,
+ "expEnd": 31.274,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1
+ },
+ {
+ "idx": 8,
+ "voiceId": "drill_right",
+ "t0": 31.546,
+ "t1": 34.256,
+ "dur": 2.64,
+ "expEnd": 34.186,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "这次在右边向右滑右。",
+ "similarity": 0.9412
+ },
+ {
+ "idx": 9,
+ "voiceId": "dir_right",
+ "t0": 34.256,
+ "t1": 34.743,
+ "dur": 0.39909297052154197,
+ "expEnd": 34.655,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "救。",
+ "similarity": 0
+ },
+ {
+ "idx": 10,
+ "voiceId": "drill_retry_right",
+ "t0": 38.763,
+ "t1": 42.219,
+ "dur": 3.2,
+ "expEnd": 41.963,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "那是右边来的,向右滑右。",
+ "similarity": 0.9474
+ },
+ {
+ "idx": 11,
+ "voiceId": "dir_right",
+ "t0": 42.22,
+ "t1": 42.707,
+ "dur": 0.39909297052154197,
+ "expEnd": 42.619,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "救。",
+ "similarity": 0
+ },
+ {
+ "idx": 12,
+ "voiceId": "drill_moveon",
+ "t0": 46.72,
+ "t1": 50.833,
+ "dur": 3.84,
+ "expEnd": 50.56,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1
+ },
+ {
+ "idx": 13,
+ "voiceId": "drill_up",
+ "t0": 50.841,
+ "t1": 55.407,
+ "dur": 4.24,
+ "expEnd": 55.081,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "上面有东西,声音又尖又高,向上滑。",
+ "similarity": 1
+ },
+ {
+ "idx": 14,
+ "voiceId": "dir_up",
+ "t0": 55.407,
+ "t1": 55.895,
+ "dur": 0.39909297052154197,
+ "expEnd": 55.806,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "上。",
+ "similarity": 1
+ },
+ {
+ "idx": 15,
+ "voiceId": "drill_retry_up",
+ "t0": 59.917,
+ "t1": 64.021,
+ "dur": 4.08,
+ "expEnd": 63.997,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "声音又高又尖,是上面向上滑上。",
+ "similarity": 0.96
+ },
+ {
+ "idx": 16,
+ "voiceId": "dir_up",
+ "t0": 64.021,
+ "t1": 64.508,
+ "dur": 0.39909297052154197,
+ "expEnd": 64.42,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "上。",
+ "similarity": 1
+ },
+ {
+ "idx": 17,
+ "voiceId": "drill_good",
+ "t0": 66.621,
+ "t1": 67.388,
+ "dur": 0.7970975056689342,
+ "expEnd": 67.418,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "你好。",
+ "similarity": 0
+ },
+ {
+ "idx": 18,
+ "voiceId": "drill_down",
+ "t0": 67.395,
+ "t1": 70.847,
+ "dur": 3.28,
+ "expEnd": 70.675,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "下面是低沉的轰龙向下滑。",
+ "similarity": 0.9091
+ },
+ {
+ "idx": 19,
+ "voiceId": "dir_down",
+ "t0": 70.847,
+ "t1": 71.613,
+ "dur": 0.5570975056689342,
+ "expEnd": 71.404,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "上。",
+ "similarity": 0
+ },
+ {
+ "idx": 20,
+ "voiceId": "drill_retry_down",
+ "t0": 75.355,
+ "t1": 78.068,
+ "dur": 2.72,
+ "expEnd": 78.075,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "轰龙声在下面向下火。",
+ "similarity": 0.7778
+ },
+ {
+ "idx": 21,
+ "voiceId": "dir_down",
+ "t0": 78.068,
+ "t1": 78.834,
+ "dur": 0.5570975056689342,
+ "expEnd": 78.625,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "上。",
+ "similarity": 0
+ },
+ {
+ "idx": 22,
+ "voiceId": "drill_moveon",
+ "t0": 82.568,
+ "t1": 86.682,
+ "dur": 3.84,
+ "expEnd": 86.408,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1
+ },
+ {
+ "idx": 23,
+ "voiceId": "drill_done",
+ "t0": 86.69,
+ "t1": 91.627,
+ "dur": 4.72,
+ "expEnd": 91.41,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "四个方向你都会了,引擎点火。",
+ "similarity": 0.9231
+ },
+ {
+ "idx": 24,
+ "voiceId": "protect_left",
+ "t0": 97.131,
+ "t1": 101.132,
+ "dur": 7.76,
+ "expEnd": 104.891,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了那颗训。",
+ "similarity": 0.5625
+ },
+ {
+ "idx": 25,
+ "voiceId": "protect_right",
+ "t0": 101.132,
+ "t1": 105.134,
+ "dur": 7.2,
+ "expEnd": 108.332,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059
+ },
+ {
+ "idx": 26,
+ "voiceId": "protect_down",
+ "t0": 105.134,
+ "t1": 109.135,
+ "dur": 6.08,
+ "expEnd": 111.214,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接着,每刻在下面请训。",
+ "similarity": 0.3429
+ },
+ {
+ "idx": 27,
+ "voiceId": "protect_up",
+ "t0": 109.135,
+ "t1": 111.63,
+ "dur": 6.96,
+ "expEnd": 116.095,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了是。",
+ "similarity": 0.3333
+ },
+ {
+ "idx": 28,
+ "voiceId": "feat_boost",
+ "t0": 111.63,
+ "t1": 118.421,
+ "dur": 6.48,
+ "expEnd": 118.11,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "试试单击,引擎会短促加速,直接冲过空隙。",
+ "similarity": 1
+ },
+ {
+ "idx": 29,
+ "voiceId": "protect_up",
+ "t0": 126.131,
+ "t1": 130.132,
+ "dur": 6.96,
+ "expEnd": 133.091,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护刃接住了,那颗在上面训。",
+ "similarity": 0.6286
+ },
+ {
+ "idx": 30,
+ "voiceId": "protect_up",
+ "t0": 130.132,
+ "t1": 134.133,
+ "dur": 6.96,
+ "expEnd": 137.092,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882
+ },
+ {
+ "idx": 31,
+ "voiceId": "protect_right",
+ "t0": 134.133,
+ "t1": 136.628,
+ "dur": 7.2,
+ "expEnd": 141.333,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了说。",
+ "similarity": 0.4667
+ },
+ {
+ "idx": 32,
+ "voiceId": "feat_shield",
+ "t0": 136.628,
+ "t1": 139.821,
+ "dur": 4.4,
+ "expEnd": 141.028,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "双击展开护盾能等。",
+ "similarity": 0.6667
+ },
+ {
+ "idx": 33,
+ "voiceId": "protect_up",
+ "t0": 151.129,
+ "t1": 151.13,
+ "dur": 6.96,
+ "expEnd": 158.089,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "哦。",
+ "similarity": 0
+ },
+ {
+ "idx": 34,
+ "voiceId": "dir_left",
+ "t0": 151.13,
+ "t1": 151.627,
+ "dur": 0.5570975056689342,
+ "expEnd": 151.687,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "哦。",
+ "similarity": 0
+ },
+ {
+ "idx": 35,
+ "voiceId": "protect_end",
+ "t0": 151.627,
+ "t1": 155.13,
+ "dur": 5.36,
+ "expEnd": 156.987,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "哼训练护盾关闭有效。",
+ "similarity": 0.5217
+ },
+ {
+ "idx": 36,
+ "voiceId": "hit_left",
+ "t0": 155.13,
+ "t1": 155.131,
+ "dur": 4.64,
+ "expEnd": 159.77,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "让。",
+ "similarity": 0
+ },
+ {
+ "idx": 37,
+ "voiceId": "dir_down",
+ "t0": 155.131,
+ "t1": 155.895,
+ "dur": 0.5570975056689342,
+ "expEnd": 155.688,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "跳。",
+ "similarity": 0
+ },
+ {
+ "idx": 38,
+ "voiceId": "hit_down",
+ "t0": 159.131,
+ "t1": 159.132,
+ "dur": 4.32,
+ "expEnd": 163.451,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "哦。",
+ "similarity": 0
+ },
+ {
+ "idx": 39,
+ "voiceId": "dir_left",
+ "t0": 159.132,
+ "t1": 159.888,
+ "dur": 0.5570975056689342,
+ "expEnd": 159.689,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "哦,你传。",
+ "similarity": 0
+ },
+ {
+ "idx": 40,
+ "voiceId": "hit_last",
+ "t0": 159.888,
+ "t1": 162.605,
+ "dur": 2.72,
+ "expEnd": 162.608,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "团体只剩最后一次了,小心这。",
+ "similarity": 0.8696
+ },
+ {
+ "idx": 41,
+ "voiceId": "gd_last_life",
+ "t0": 162.605,
+ "t1": 163.132,
+ "dur": 2.8,
+ "expEnd": 165.405,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "这是。",
+ "similarity": 0.3333
+ },
+ {
+ "idx": 42,
+ "voiceId": "time_3",
+ "t0": 164.341,
+ "t1": 167.806,
+ "dur": 3.2,
+ "expEnd": 167.541,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "超过1分钟,合格的飞行员。",
+ "similarity": 0.9091
+ },
+ {
+ "idx": 43,
+ "voiceId": "new_record",
+ "t0": 167.812,
+ "t1": 169.407,
+ "dur": 1.28,
+ "expEnd": 169.092,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "新记录只。",
+ "similarity": 0.5714
+ },
+ {
+ "idx": 44,
+ "voiceId": "dodge_1",
+ "t0": 169.413,
+ "t1": 171.01,
+ "dur": 1.36,
+ "expEnd": 170.773,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "只剥开即可。。",
+ "similarity": 0.4
+ },
+ {
+ "idx": 45,
+ "voiceId": "restart_hint",
+ "t0": 171.017,
+ "t1": 174.841,
+ "dur": 3.68,
+ "expEnd": 174.697,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "单机再飞一次,下滑回大厅。",
+ "similarity": 0.9091
+ },
+ {
+ "idx": 46,
+ "voiceId": "protect_up",
+ "t0": 246.297,
+ "t1": 250.298,
+ "dur": 6.96,
+ "expEnd": 253.257,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882
+ },
+ {
+ "idx": 47,
+ "voiceId": "protect_down",
+ "t0": 250.298,
+ "t1": 254.299,
+ "dur": 6.08,
+ "expEnd": 256.378,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那颗在下面心奋训。",
+ "similarity": 0.5405
+ },
+ {
+ "idx": 48,
+ "voiceId": "protect_right",
+ "t0": 254.299,
+ "t1": 258.3,
+ "dur": 7.2,
+ "expEnd": 261.499,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059
+ },
+ {
+ "idx": 49,
+ "voiceId": "protect_down",
+ "t0": 258.301,
+ "t1": 262.302,
+ "dur": 6.08,
+ "expEnd": 264.381,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那颗在下面经动训。",
+ "similarity": 0.5405
+ },
+ {
+ "idx": 50,
+ "voiceId": "protect_right",
+ "t0": 262.302,
+ "t1": 266.303,
+ "dur": 7.2,
+ "expEnd": 269.502,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059
+ },
+ {
+ "idx": 51,
+ "voiceId": "protect_down",
+ "t0": 266.303,
+ "t1": 270.304,
+ "dur": 6.08,
+ "expEnd": 272.383,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那刻在下面拼成。",
+ "similarity": 0.5
+ },
+ {
+ "idx": 52,
+ "voiceId": "protect_down",
+ "t0": 270.304,
+ "t1": 274.305,
+ "dur": 6.08,
+ "expEnd": 276.384,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那刻在下面形成训。",
+ "similarity": 0.4865
+ },
+ {
+ "idx": 53,
+ "voiceId": "protect_down",
+ "t0": 274.305,
+ "t1": 278.306,
+ "dur": 6.08,
+ "expEnd": 280.385,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那刻在下面听到训。",
+ "similarity": 0.5946
+ },
+ {
+ "idx": 54,
+ "voiceId": "protect_right",
+ "t0": 278.306,
+ "t1": 282.308,
+ "dur": 7.2,
+ "expEnd": 285.506,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护关接住了,那颗在右边。",
+ "similarity": 0.6471
+ },
+ {
+ "idx": 55,
+ "voiceId": "protect_up",
+ "t0": 282.308,
+ "t1": 285.471,
+ "dur": 6.96,
+ "expEnd": 289.268,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练死定接住了那刻在上。",
+ "similarity": 0.4848
+ },
+ {
+ "idx": 56,
+ "voiceId": "feat_shield_done",
+ "t0": 285.471,
+ "t1": 290.309,
+ "dur": 4.88,
+ "expEnd": 290.351,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "护盾展开后,会自充能。好了,我会告诉你。",
+ "similarity": 0.9697
+ },
+ {
+ "idx": 57,
+ "voiceId": "protect_down",
+ "t0": 290.309,
+ "t1": 294.31,
+ "dur": 6.08,
+ "expEnd": 296.389,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那刻在下面请训。",
+ "similarity": 0.5
+ },
+ {
+ "idx": 58,
+ "voiceId": "protect_down",
+ "t0": 294.31,
+ "t1": 298.312,
+ "dur": 6.08,
+ "expEnd": 300.39,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训念互动接住了,那刻在下面请下。",
+ "similarity": 0.5
+ },
+ {
+ "idx": 59,
+ "voiceId": "protect_left",
+ "t0": 298.312,
+ "t1": 298.313,
+ "dur": 7.76,
+ "expEnd": 306.072,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "这。",
+ "similarity": 0
+ },
+ {
+ "idx": 60,
+ "voiceId": "dir_down",
+ "t0": 298.313,
+ "t1": 299.08,
+ "dur": 0.5570975056689342,
+ "expEnd": 298.87,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "跳。",
+ "similarity": 0
+ },
+ {
+ "idx": 61,
+ "voiceId": "shield_block",
+ "t0": 299.08,
+ "t1": 300.189,
+ "dur": 1.6,
+ "expEnd": 300.68,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "护盾挡下。",
+ "similarity": 0.7273
+ },
+ {
+ "idx": 62,
+ "voiceId": "shield_ready",
+ "t0": 300.189,
+ "t1": 300.796,
+ "dur": 1.6,
+ "expEnd": 301.789,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "虎。",
+ "similarity": 0
+ },
+ {
+ "idx": 63,
+ "voiceId": "protect_end",
+ "t0": 300.796,
+ "t1": 301.861,
+ "dur": 5.36,
+ "expEnd": 306.156,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "哼。",
+ "similarity": 0
+ },
+ {
+ "idx": 64,
+ "voiceId": "hit_down",
+ "t0": 302.313,
+ "t1": 302.314,
+ "dur": 4.32,
+ "expEnd": 306.633,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "让。",
+ "similarity": 0
+ },
+ {
+ "idx": 65,
+ "voiceId": "dir_down",
+ "t0": 302.314,
+ "t1": 303.074,
+ "dur": 0.5570975056689342,
+ "expEnd": 302.871,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "上。",
+ "similarity": 0
+ },
+ {
+ "idx": 66,
+ "voiceId": "hit_down",
+ "t0": 306.314,
+ "t1": 306.315,
+ "dur": 4.32,
+ "expEnd": 310.634,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "上。",
+ "similarity": 0.125
+ },
+ {
+ "idx": 67,
+ "voiceId": "dir_up",
+ "t0": 306.315,
+ "t1": 306.789,
+ "dur": 0.39909297052154197,
+ "expEnd": 306.714,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "张。",
+ "similarity": 0
+ },
+ {
+ "idx": 68,
+ "voiceId": "hit_last",
+ "t0": 306.789,
+ "t1": 309.505,
+ "dur": 2.72,
+ "expEnd": 309.509,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "团体只剩最后一次了,小心这。",
+ "similarity": 0.8696
+ },
+ {
+ "idx": 69,
+ "voiceId": "gd_last_life",
+ "t0": 309.505,
+ "t1": 310.315,
+ "dur": 2.8,
+ "expEnd": 312.305,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "这是最美。",
+ "similarity": 0.4286
+ },
+ {
+ "idx": 70,
+ "voiceId": "time_3",
+ "t0": 311.516,
+ "t1": 314.961,
+ "dur": 3.2,
+ "expEnd": 314.716,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "超过一分钟,苛格的飞行员只。",
+ "similarity": 0.8696
+ },
+ {
+ "idx": 71,
+ "voiceId": "dodge_1",
+ "t0": 314.961,
+ "t1": 316.563,
+ "dur": 1.36,
+ "expEnd": 316.321,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "只剥开即可。。",
+ "similarity": 0.4
+ },
+ {
+ "idx": 72,
+ "voiceId": "restart_hint",
+ "t0": 316.563,
+ "t1": 320.394,
+ "dur": 3.68,
+ "expEnd": 320.243,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "单机再飞一次,下滑回大厅。",
+ "similarity": 0.9091
+ },
+ {
+ "idx": 73,
+ "voiceId": "protect_up",
+ "t0": 349.689,
+ "t1": 353.69,
+ "dur": 6.96,
+ "expEnd": 356.649,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护令接住了,那颗在上面。",
+ "similarity": 0.6471
+ },
+ {
+ "idx": 74,
+ "voiceId": "protect_up",
+ "t0": 353.691,
+ "t1": 357.692,
+ "dur": 6.96,
+ "expEnd": 360.651,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882
+ },
+ {
+ "idx": 75,
+ "voiceId": "protect_right",
+ "t0": 357.692,
+ "t1": 361.693,
+ "dur": 7.2,
+ "expEnd": 364.892,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059
+ },
+ {
+ "idx": 76,
+ "voiceId": "protect_left",
+ "t0": 361.693,
+ "t1": 365.694,
+ "dur": 7.76,
+ "expEnd": 369.453,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练不遁接住了那颗。",
+ "similarity": 0.4516
+ },
+ {
+ "idx": 77,
+ "voiceId": "protect_left",
+ "t0": 365.694,
+ "t1": 369.696,
+ "dur": 7.76,
+ "expEnd": 373.454,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了那颗训。",
+ "similarity": 0.5625
+ },
+ {
+ "idx": 78,
+ "voiceId": "protect_right",
+ "t0": 369.696,
+ "t1": 371.786,
+ "dur": 7.2,
+ "expEnd": 376.896,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护盾接住了。",
+ "similarity": 0.4828
+ },
+ {
+ "idx": 79,
+ "voiceId": "paused",
+ "t0": 371.786,
+ "t1": 372.913,
+ "dur": 1.12,
+ "expEnd": 372.906,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "你暂停。",
+ "similarity": 0.6667
+ },
+ {
+ "idx": 80,
+ "voiceId": "menu_main",
+ "t0": 372.913,
+ "t1": 377.023,
+ "dur": 4.16,
+ "expEnd": 377.073,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "菜单单击切换选项,双击确。",
+ "similarity": 0.9565
+ },
+ {
+ "idx": 81,
+ "voiceId": "menu_resume",
+ "t0": 377.023,
+ "t1": 378.16,
+ "dur": 1.12,
+ "expEnd": 378.143,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "继续飞行。",
+ "similarity": 1
+ },
+ {
+ "idx": 82,
+ "voiceId": "protect_end",
+ "t0": 405.197,
+ "t1": 405.997,
+ "dur": 5.36,
+ "expEnd": 410.557,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 83,
+ "voiceId": "dir_down",
+ "t0": 405.997,
+ "t1": 406.765,
+ "dur": 0.5570975056689342,
+ "expEnd": 406.554,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ }
+ ],
+ "rows": [
+ {
+ "t0": 0.111,
+ "t1": 4.026,
+ "voiceId": "drill_welcome",
+ "expected": "欢迎登上盲航。你只有一双耳朵。",
+ "heard": "欢迎登上盲航,你只有一双耳朵。。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 4.027,
+ "t1": 5.906,
+ "voiceId": "skip_hint",
+ "expected": "单击可跳过旁白。",
+ "heard": "单击可跳过磅榜。",
+ "similarity": 0.7143,
+ "verdict": "OK"
+ },
+ {
+ "t0": 5.907,
+ "t1": 9.738,
+ "voiceId": "drill_rule",
+ "expected": "陨石来了,会有声音告诉你方位。",
+ "heard": "陨石来了,会有声音告诉你方位停。",
+ "similarity": 0.963,
+ "verdict": "OK"
+ },
+ {
+ "t0": 9.746,
+ "t1": 14.962,
+ "voiceId": "drill_left",
+ "expected": "听,左边有陨石。向左滑,把它拨开!",
+ "heard": "停左边有陨石向左滑,把它拨开走。",
+ "similarity": 0.8889,
+ "verdict": "OK"
+ },
+ {
+ "t0": 14.962,
+ "t1": 15.728,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "走。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 19.471,
+ "t1": 22.925,
+ "voiceId": "drill_retry_left",
+ "expected": "那是左边来的,向左滑。",
+ "heard": "那是左边来的,向左滑左。",
+ "similarity": 0.9474,
+ "verdict": "OK"
+ },
+ {
+ "t0": 22.925,
+ "t1": 23.691,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "走。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 27.434,
+ "t1": 31.539,
+ "voiceId": "drill_moveon",
+ "expected": "没关系,跟着我,我们继续。",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 15.728,
+ "t1": 19.471,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 23.691,
+ "t1": 27.434,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 31.546,
+ "t1": 34.256,
+ "voiceId": "drill_right",
+ "expected": "这次在右边。向右滑!",
+ "heard": "这次在右边向右滑右。",
+ "similarity": 0.9412,
+ "verdict": "OK"
+ },
+ {
+ "t0": 34.256,
+ "t1": 34.743,
+ "voiceId": "dir_right",
+ "expected": "右!",
+ "heard": "救。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 38.763,
+ "t1": 42.219,
+ "voiceId": "drill_retry_right",
+ "expected": "那是右边来的,向右滑。",
+ "heard": "那是右边来的,向右滑右。",
+ "similarity": 0.9474,
+ "verdict": "OK"
+ },
+ {
+ "t0": 42.22,
+ "t1": 42.707,
+ "voiceId": "dir_right",
+ "expected": "右!",
+ "heard": "救。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 46.72,
+ "t1": 50.833,
+ "voiceId": "drill_moveon",
+ "expected": "没关系,跟着我,我们继续。",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 50.841,
+ "t1": 55.407,
+ "voiceId": "drill_up",
+ "expected": "上面有东西,声音又尖又高。向上滑!",
+ "heard": "上面有东西,声音又尖又高,向上滑。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 34.743,
+ "t1": 38.763,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 42.707,
+ "t1": 46.72,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 55.407,
+ "t1": 55.895,
+ "voiceId": "dir_up",
+ "expected": "上!",
+ "heard": "上。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 59.917,
+ "t1": 64.021,
+ "voiceId": "drill_retry_up",
+ "expected": "声音又高又尖,是上面,向上滑。",
+ "heard": "声音又高又尖,是上面向上滑上。",
+ "similarity": 0.96,
+ "verdict": "OK"
+ },
+ {
+ "t0": 64.021,
+ "t1": 64.508,
+ "voiceId": "dir_up",
+ "expected": "上!",
+ "heard": "上。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 66.621,
+ "t1": 67.388,
+ "voiceId": "drill_good",
+ "expected": "漂亮。",
+ "heard": "你好。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 55.895,
+ "t1": 59.917,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 64.508,
+ "t1": 66.621,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 67.395,
+ "t1": 70.847,
+ "voiceId": "drill_down",
+ "expected": "下面是低沉的轰隆。向下滑!",
+ "heard": "下面是低沉的轰龙向下滑。",
+ "similarity": 0.9091,
+ "verdict": "OK"
+ },
+ {
+ "t0": 70.847,
+ "t1": 71.613,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "上。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 75.355,
+ "t1": 78.068,
+ "voiceId": "drill_retry_down",
+ "expected": "轰隆声在下面,向下滑。",
+ "heard": "轰龙声在下面向下火。",
+ "similarity": 0.7778,
+ "verdict": "OK"
+ },
+ {
+ "t0": 78.068,
+ "t1": 78.834,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "上。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 82.568,
+ "t1": 86.682,
+ "voiceId": "drill_moveon",
+ "expected": "没关系,跟着我,我们继续。",
+ "heard": "没关系,跟着我,我们继续。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 86.69,
+ "t1": 91.627,
+ "voiceId": "drill_done",
+ "expected": "四个方向你都会了。引擎点火,出发!",
+ "heard": "四个方向你都会了,引擎点火。",
+ "similarity": 0.9231,
+ "verdict": "OK"
+ },
+ {
+ "t0": 71.613,
+ "t1": 75.355,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 78.834,
+ "t1": 82.568,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 97.131,
+ "t1": 101.132,
+ "voiceId": "protect_left",
+ "expected": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "heard": "训练护盾接住了那颗训。",
+ "similarity": 0.5625,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 101.132,
+ "t1": 105.134,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 105.134,
+ "t1": 109.135,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接着,每刻在下面请训。",
+ "similarity": 0.3429,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 109.135,
+ "t1": 111.63,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练互动接住了是。",
+ "similarity": 0.3333,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 111.63,
+ "t1": 118.421,
+ "voiceId": "feat_boost",
+ "expected": "试试单击,引擎会短促加速,直接冲过空隙。",
+ "heard": "试试单击,引擎会短促加速,直接冲过空隙。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 91.627,
+ "t1": 97.131,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 126.131,
+ "t1": 130.132,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练护刃接住了,那颗在上面训。",
+ "similarity": 0.6286,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 130.132,
+ "t1": 134.133,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 134.133,
+ "t1": 136.628,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了说。",
+ "similarity": 0.4667,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 136.628,
+ "t1": 139.821,
+ "voiceId": "feat_shield",
+ "expected": "双击展开护盾,能挡下一次撞击。",
+ "heard": "双击展开护盾能等。",
+ "similarity": 0.6667,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 118.421,
+ "t1": 126.131,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 151.129,
+ "t1": 151.13,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "哦。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 151.13,
+ "t1": 151.627,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "哦。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 151.627,
+ "t1": 155.13,
+ "voiceId": "protect_end",
+ "expected": "训练护盾关闭。接下来,靠你自己了。",
+ "heard": "哼训练护盾关闭有效。",
+ "similarity": 0.5217,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 155.13,
+ "t1": 155.131,
+ "voiceId": "hit_left",
+ "expected": "左边撞上的。听到左边的呼啸,向左滑。",
+ "heard": "让。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 155.131,
+ "t1": 155.895,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "跳。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 159.131,
+ "t1": 159.132,
+ "voiceId": "hit_down",
+ "expected": "下面撞上的。听到低沉的轰隆,向下滑。",
+ "heard": "哦。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 159.132,
+ "t1": 159.888,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "哦,你传。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 159.888,
+ "t1": 162.605,
+ "voiceId": "hit_last",
+ "expected": "船体只剩最后一次了,小心!",
+ "heard": "团体只剩最后一次了,小心这。",
+ "similarity": 0.8696,
+ "verdict": "OK"
+ },
+ {
+ "t0": 162.605,
+ "t1": 163.132,
+ "voiceId": "gd_last_life",
+ "expected": "这是最后一次机会,撑住。",
+ "heard": "这是。",
+ "similarity": 0.3333,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 164.341,
+ "t1": 167.806,
+ "voiceId": "time_3",
+ "expected": "超过一分钟,合格的飞行员。",
+ "heard": "超过1分钟,合格的飞行员。",
+ "similarity": 0.9091,
+ "verdict": "OK"
+ },
+ {
+ "t0": 167.812,
+ "t1": 169.407,
+ "voiceId": "new_record",
+ "expected": "新纪录!",
+ "heard": "新记录只。",
+ "similarity": 0.5714,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 169.413,
+ "t1": 171.01,
+ "voiceId": "dodge_1",
+ "expected": "只拨开几颗。",
+ "heard": "只剥开即可。。",
+ "similarity": 0.4,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 171.017,
+ "t1": 174.841,
+ "voiceId": "restart_hint",
+ "expected": "单击再飞一次,下滑回大厅。",
+ "heard": "单机再飞一次,下滑回大厅。",
+ "similarity": 0.9091,
+ "verdict": "OK"
+ },
+ {
+ "t0": 139.821,
+ "t1": 151.129,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 155.895,
+ "t1": 159.131,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 246.297,
+ "t1": 250.298,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 250.298,
+ "t1": 254.299,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那颗在下面心奋训。",
+ "similarity": 0.5405,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 254.299,
+ "t1": 258.3,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 258.301,
+ "t1": 262.302,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那颗在下面经动训。",
+ "similarity": 0.5405,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 174.841,
+ "t1": 246.297,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 262.302,
+ "t1": 266.303,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 266.303,
+ "t1": 270.304,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那刻在下面拼成。",
+ "similarity": 0.5,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 270.304,
+ "t1": 274.305,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那刻在下面形成训。",
+ "similarity": 0.4865,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 274.305,
+ "t1": 278.306,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那刻在下面听到训。",
+ "similarity": 0.5946,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 278.306,
+ "t1": 282.308,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护关接住了,那颗在右边。",
+ "similarity": 0.6471,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 282.308,
+ "t1": 285.471,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练死定接住了那刻在上。",
+ "similarity": 0.4848,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 285.471,
+ "t1": 290.309,
+ "voiceId": "feat_shield_done",
+ "expected": "护盾展开后会自动充能,好了我会告诉你。",
+ "heard": "护盾展开后,会自充能。好了,我会告诉你。",
+ "similarity": 0.9697,
+ "verdict": "OK"
+ },
+ {
+ "t0": 290.309,
+ "t1": 294.31,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练互动接住了,那刻在下面请训。",
+ "similarity": 0.5,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 294.31,
+ "t1": 298.312,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训念互动接住了,那刻在下面请下。",
+ "similarity": 0.5,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 298.312,
+ "t1": 298.313,
+ "voiceId": "protect_left",
+ "expected": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "heard": "这。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 298.313,
+ "t1": 299.08,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "跳。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 299.08,
+ "t1": 300.189,
+ "voiceId": "shield_block",
+ "expected": "护盾挡下了撞击。",
+ "heard": "护盾挡下。",
+ "similarity": 0.7273,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 300.189,
+ "t1": 300.796,
+ "voiceId": "shield_ready",
+ "expected": "护盾充能完毕。",
+ "heard": "虎。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 300.796,
+ "t1": 301.861,
+ "voiceId": "protect_end",
+ "expected": "训练护盾关闭。接下来,靠你自己了。",
+ "heard": "哼。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 302.313,
+ "t1": 302.314,
+ "voiceId": "hit_down",
+ "expected": "下面撞上的。听到低沉的轰隆,向下滑。",
+ "heard": "让。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 302.314,
+ "t1": 303.074,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "上。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 306.314,
+ "t1": 306.315,
+ "voiceId": "hit_down",
+ "expected": "下面撞上的。听到低沉的轰隆,向下滑。",
+ "heard": "上。",
+ "similarity": 0.125,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 306.315,
+ "t1": 306.789,
+ "voiceId": "dir_up",
+ "expected": "上!",
+ "heard": "张。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 306.789,
+ "t1": 309.505,
+ "voiceId": "hit_last",
+ "expected": "船体只剩最后一次了,小心!",
+ "heard": "团体只剩最后一次了,小心这。",
+ "similarity": 0.8696,
+ "verdict": "OK"
+ },
+ {
+ "t0": 309.505,
+ "t1": 310.315,
+ "voiceId": "gd_last_life",
+ "expected": "这是最后一次机会,撑住。",
+ "heard": "这是最美。",
+ "similarity": 0.4286,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 311.516,
+ "t1": 314.961,
+ "voiceId": "time_3",
+ "expected": "超过一分钟,合格的飞行员。",
+ "heard": "超过一分钟,苛格的飞行员只。",
+ "similarity": 0.8696,
+ "verdict": "OK"
+ },
+ {
+ "t0": 314.961,
+ "t1": 316.563,
+ "voiceId": "dodge_1",
+ "expected": "只拨开几颗。",
+ "heard": "只剥开即可。。",
+ "similarity": 0.4,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 316.563,
+ "t1": 320.394,
+ "voiceId": "restart_hint",
+ "expected": "单击再飞一次,下滑回大厅。",
+ "heard": "单机再飞一次,下滑回大厅。",
+ "similarity": 0.9091,
+ "verdict": "OK"
+ },
+ {
+ "t0": 303.074,
+ "t1": 306.314,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 349.689,
+ "t1": 353.69,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练护令接住了,那颗在上面。",
+ "similarity": 0.6471,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 353.691,
+ "t1": 357.692,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练互动接住了,那颗在上面。",
+ "similarity": 0.5882,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 357.692,
+ "t1": 361.693,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了,那颗在右边。",
+ "similarity": 0.7059,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 361.693,
+ "t1": 365.694,
+ "voiceId": "protect_left",
+ "expected": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "heard": "训练不遁接住了那颗。",
+ "similarity": 0.4516,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 365.694,
+ "t1": 369.696,
+ "voiceId": "protect_left",
+ "expected": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "heard": "训练护盾接住了那颗训。",
+ "similarity": 0.5625,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 369.696,
+ "t1": 371.786,
+ "voiceId": "protect_right",
+ "expected": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "heard": "训练护盾接住了。",
+ "similarity": 0.4828,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 371.786,
+ "t1": 372.913,
+ "voiceId": "paused",
+ "expected": "已暂停。",
+ "heard": "你暂停。",
+ "similarity": 0.6667,
+ "verdict": "OK"
+ },
+ {
+ "t0": 372.913,
+ "t1": 377.023,
+ "voiceId": "menu_main",
+ "expected": "菜单。单击切换选项,双击确认。",
+ "heard": "菜单单击切换选项,双击确。",
+ "similarity": 0.9565,
+ "verdict": "OK"
+ },
+ {
+ "t0": 377.023,
+ "t1": 378.16,
+ "voiceId": "menu_resume",
+ "expected": "继续飞行。",
+ "heard": "继续飞行。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 320.394,
+ "t1": 349.689,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/research/space-polish/round1/live-B-transcript.md b/research/space-polish/round1/live-B-transcript.md
new file mode 100644
index 00000000..3fae8c1b
--- /dev/null
+++ b/research/space-polish/round1/live-B-transcript.md
@@ -0,0 +1,617 @@
+# space 实时会话 transcript
+
+- `[ -0.08s]` **GESTURE** tap @(195,422)
+- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
+- `[ 0.10s]` VOICE ▶ second_run_ask (dur 3.04s)
+- `[ 2.35s]` VOICE ■ second_run_ask (kill)
+- `[ 2.35s]` VERDICT second_run_ask: **OK** sim=0.96
+ - 期望: 上滑重新听演练,单击直接出发。
+ - 听到: 上滑重新听演练,单击直接出。
+- `[ 2.41s]` **GESTURE** tap @(195,422)
+- `[ 2.78s]` VIBRATE [20]
+- `[ 2.97s]` BGM ♪ engine (loop)
+- `[ 3.59s]` **GESTURE** tap @(195,422)
+- `[ 3.95s]` VIBRATE [20]
+- `[ 4.28s]` SFX ♪ whoosh_up
+- `[ 4.76s]` **GESTURE** tap @(195,422)
+- `[ 5.12s]` VIBRATE [20]
+- `[ 5.93s]` **GESTURE** swipeleft @(195,422)
+- `[ 6.30s]` VIBRATE [10]
+- `[ 7.28s]` VIBRATE [25,40,25,40,25]
+- `[ 7.28s]` SFX ♪ alarm
+- `[ 7.71s]` **GESTURE** swiperight @(195,422)
+- `[ 7.78s]` VIBRATE [25,40,25,40,25]
+- `[ 7.78s]` SFX ♪ alarm
+- `[ 8.06s]` VIBRATE [10]
+- `[ 8.28s]` VIBRATE [30,50,30,50,30]
+- `[ 8.28s]` SFX ♪ shield_block
+- `[ 8.28s]` VOICE ▶ protect_up (dur 4.8s)
+- `[ 8.28s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 8.28s]` SFX ♪ whoosh_down
+- `[ 11.28s]` VIBRATE [25,40,25,40,25]
+- `[ 11.28s]` SFX ♪ alarm
+- `[ 11.78s]` VIBRATE [25,40,25,40,25]
+- `[ 11.78s]` SFX ♪ alarm
+- `[ 11.94s]` VOICE ■ protect_up (kill)
+- `[ 11.94s]` VERDICT protect_up: **OK** sim=0.6977
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练护动接住,那裤子上面听到高高的呼啸,肖哨话。
+- `[ 12.28s]` VIBRATE [30,50,30,50,30]
+- `[ 12.28s]` SFX ♪ shield_block
+- `[ 12.28s]` VOICE ▶ protect_down (dur 5.04s)
+- `[ 12.29s]` SFX ♪ whoosh_down
+- `[ 15.29s]` VIBRATE [25,40,25,40,25]
+- `[ 15.29s]` SFX ♪ alarm
+- `[ 15.79s]` VIBRATE [25,40,25,40,25]
+- `[ 15.79s]` SFX ♪ alarm
+- `[ 16.21s]` VOICE ■ protect_down (kill)
+- `[ 16.21s]` VERDICT protect_down: **OK** sim=0.8837
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训练护盾切住,那刻在下面听到低沉的轰隆向下滑。
+- `[ 16.29s]` VIBRATE [30,50,30,50,30]
+- `[ 16.29s]` SFX ♪ shield_block
+- `[ 16.29s]` VOICE ▶ protect_down (dur 5.04s)
+- `[ 16.29s]` SFX ♪ whoosh_up
+- `[ 19.29s]` VIBRATE [25,40,25,40,25]
+- `[ 19.29s]` SFX ♪ alarm
+- `[ 19.79s]` VIBRATE [25,40,25,40,25]
+- `[ 19.79s]` SFX ♪ alarm
+- `[ 20.20s]` VOICE ■ protect_down (kill)
+- `[ 20.20s]` VERDICT protect_down: **OK** sim=0.7442
+ - 期望: 训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。
+ - 听到: 训疗后段接轨,那刻在下面听到低沉的轰隆向下滑。
+- `[ 20.29s]` VIBRATE [30,50,30,50,30]
+- `[ 20.29s]` SFX ♪ shield_block
+- `[ 20.29s]` VOICE ▶ protect_up (dur 4.8s)
+- `[ 20.29s]` SFX ♪ whoosh_left
+- `[ 22.78s]` VOICE ■ protect_up (kill)
+- `[ 22.78s]` VOICE ▶ feat_boost (dur 3.84s)
+- `[ 22.78s]` VERDICT protect_up: **TRUNCATED** sim=0.5143
+ - 期望: 训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。
+ - 听到: 训练互动接住,那刻子上面听到。
+- `[ 25.87s]` VOICE ■ feat_boost (kill)
+- `[ 25.87s]` VERDICT feat_boost: **OK** sim=0.8235
+ - 期望: 试试单击,引擎会短促加速,直接冲过空隙。
+ - 听到: 试试单机,引擎或短途加速,直接冲过空隙。
+- `[ 27.43s]` **GESTURE** doubletap @(195,422)
+- `[ 27.68s]` VIBRATE [20]
+- `[ 29.35s]` **GESTURE** tap @(195,422)
+- `[ 29.71s]` VIBRATE [20]
+- `[ 29.71s]` SFX ♪ boost
+- `[ 29.71s]` VOICE ▶ feat_boost_done (dur 3.44s)
+- `[ 29.71s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 31.14s]` **GESTURE** swiperight @(195,422)
+- `[ 31.49s]` VIBRATE [10]
+- `[ 32.21s]` SFX ♪ whoosh_left
+- `[ 32.23s]` VOICE ■ feat_boost_done (kill)
+- `[ 32.23s]` VERDICT feat_boost_done: **OK** sim=0.8387
+ - 期望: 感觉到了吗?加速的时候,陨石撞不上你。
+ - 听到: 感觉到了吗?下死的时候陨石撞不上。
+- `[ 32.95s]` **GESTURE** tap @(195,422)
+- `[ 33.31s]` VIBRATE [20]
+- `[ 33.31s]` SFX ♪ boost
+- `[ 34.09s]` **GESTURE** tap @(195,422)
+- `[ 34.45s]` VIBRATE [20]
+- `[ 35.21s]` VIBRATE [25,40,25,40,25]
+- `[ 35.21s]` SFX ♪ alarm
+- `[ 35.60s]` **GESTURE** doubletap @(195,422)
+- `[ 35.71s]` VIBRATE [25,40,25,40,25]
+- `[ 35.71s]` SFX ♪ alarm
+- `[ 35.85s]` VIBRATE [20]
+- `[ 35.85s]` VIBRATE [40,100,40]
+- `[ 35.85s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 35.85s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 36.21s]` VIBRATE [30,50,30,50,30]
+- `[ 36.21s]` SFX ♪ shield_block
+- `[ 36.21s]` VOICE ■ feat_shield_done (kill)
+- `[ 36.21s]` VOICE ▶ protect_left (dur 6.32s)
+- `[ 36.21s]` VERDICT feat_shield_done: **TRUNCATED** sim=0
+ - 期望: 护盾展开后会自动充能,好了我会告诉你。
+ - 听到: 。
+- `[ 36.21s]` SFX ♪ whoosh_right
+- `[ 37.12s]` **GESTURE** swipeleft @(195,422)
+- `[ 37.48s]` VIBRATE [10]
+- `[ 38.47s]` **GESTURE** swipedown @(195,422)
+- `[ 38.83s]` VIBRATE [10]
+- `[ 38.83s]` VOICE ■ protect_left (kill)
+- `[ 38.83s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 38.83s]` VERDICT protect_left: **TRUNCATED** sim=0.5455
+ - 期望: 训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。
+ - 听到: 训练护臀接住,内颗在左边。
+- `[ 38.97s]` BGM ♪ menu (loop)
+- `[ 39.77s]` VOICE ■ paused (kill)
+- `[ 39.77s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 39.77s]` VERDICT paused: **OK** sim=1
+ - 期望: 已暂停。
+ - 听到: 已暂停。
+- `[ 40.64s]` **GESTURE** swipedown @(195,422)
+- `[ 40.99s]` VIBRATE [10]
+- `[ 40.99s]` BGM ♪ engine (loop)
+- `[ 41.79s]` SFX ♪ whoosh_up
+- `[ 42.44s]` **GESTURE** swipedown @(195,422)
+- `[ 42.79s]` VIBRATE [10]
+- `[ 42.79s]` BGM ♪ menu (loop)
+- `[ 42.79s]` VOICE ■ menu_main (kill)
+- `[ 42.79s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 42.79s]` VERDICT menu_main: **OK** sim=1
+ - 期望: 菜单。单击切换选项,双击确认。
+ - 听到: 菜单单击切换选项,双击确认。
+- `[ 43.74s]` VOICE ■ paused (kill)
+- `[ 43.74s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 43.74s]` VERDICT paused: **OK** sim=1
+ - 期望: 已暂停。
+ - 听到: 已暂停。
+- `[ 44.55s]` **GESTURE** swipeup @(195,422)
+- `[ 44.91s]` VIBRATE [10]
+- `[ 44.91s]` VOICE ■ menu_main (kill)
+- `[ 44.91s]` VOICE ▶ help_recap (dur 8.4s)
+- `[ 44.91s]` VERDICT menu_main: **TRUNCATED** sim=0.2857
+ - 期望: 菜单。单击切换选项,双击确认。
+ - 听到: 菜单。
+- `[ 45.89s]` **GESTURE** tap @(195,422)
+- `[ 46.26s]` VIBRATE [20]
+- `[ 46.26s]` VOICE ■ help_recap (kill)
+- `[ 46.26s]` VOICE ▶ menu_lobby (dur 1.04s)
+- `[ 46.26s]` VERDICT help_recap: **TRUNCATED** sim=0.359
+ - 期望: 左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。
+ - 听到: 左边来向左滑右。
+- `[ 47.20s]` VOICE ■ menu_lobby (kill)
+- `[ 47.20s]` VERDICT menu_lobby: **OK** sim=1
+ - 期望: 回大厅。
+ - 听到: 回大厅。
+- `[ 47.39s]` **GESTURE** swipeup @(195,422)
+- `[ 47.74s]` VIBRATE [10]
+- `[ 47.74s]` VOICE ▶ help_recap (dur 8.4s)
+- `[ 48.88s]` **GESTURE** tap @(195,422)
+- `[ 49.25s]` VIBRATE [20]
+- `[ 49.25s]` VOICE ■ help_recap (kill)
+- `[ 49.25s]` VERDICT help_recap: **TRUNCATED** sim=0.4
+ - 期望: 左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。
+ - 听到: 左边来向左滑,右边。
+- `[ 49.25s]` VOICE ▶ menu_help (dur 1.6s)
+- `[ 50.46s]` **GESTURE** doubletap @(195,422)
+- `[ 50.48s]` VOICE ■ menu_help (kill)
+- `[ 50.48s]` VERDICT menu_help: **OK** sim=0.875
+ - 期望: 重新听教学要点。
+ - 听到: 右边重新听教学要点。
+- `[ 50.71s]` VIBRATE [20]
+- `[ 50.71s]` VOICE ▶ help_recap (dur 8.4s)
+- `[ 51.70s]` **GESTURE** swipeleft @(195,422)
+- `[ 52.06s]` VIBRATE [10]
+- `[ 53.26s]` **GESTURE** tap @(195,422)
+- `[ 53.62s]` VIBRATE [20]
+- `[ 53.62s]` VOICE ■ help_recap (kill)
+- `[ 53.62s]` VOICE ▶ menu_resume (dur 1.12s)
+- `[ 53.62s]` VERDICT help_recap: **TRUNCATED** sim=0.6383
+ - 期望: 左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。
+ - 听到: 左边来向左滑,右边来向右滑,上面来。
+- `[ 54.56s]` VOICE ■ menu_resume (kill)
+- `[ 54.56s]` VERDICT menu_resume: **OK** sim=0.8889
+ - 期望: 继续飞行。
+ - 听到: 来继续飞行。
+- `[ 55.26s]` **GESTURE** swipeup @(195,422)
+- `[ 55.63s]` VIBRATE [10]
+- `[ 55.63s]` VOICE ▶ help_recap (dur 8.4s)
+- `[ 56.97s]` **GESTURE** tap @(195,422)
+- `[ 57.33s]` VIBRATE [20]
+- `[ 57.33s]` VOICE ■ help_recap (kill)
+- `[ 57.33s]` VOICE ▶ menu_lobby (dur 1.04s)
+- `[ 57.33s]` VERDICT help_recap: **TRUNCATED** sim=0.439
+ - 期望: 左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。
+ - 听到: 左边来向左滑,右边来。
+- `[ 58.28s]` VOICE ■ menu_lobby (kill)
+- `[ 58.28s]` VERDICT menu_lobby: **OK** sim=0.8571
+ - 期望: 回大厅。
+ - 听到: 来回大厅。
+- `[ 58.63s]` **GESTURE** swipedown @(195,422)
+- `[ 58.99s]` VIBRATE [10]
+- `[ 58.99s]` BGM ♪ engine (loop)
+- `[ 58.99s]` VOICE ▶ feat_shield (dur 2.8s)
+- `[ 61.00s]` **GESTURE** swipeup @(195,422)
+- `[ 61.25s]` VOICE ■ feat_shield (kill)
+- `[ 61.25s]` VERDICT feat_shield: **OK** sim=1
+ - 期望: 双击展开护盾,能挡下一次撞击。
+ - 听到: 双击展开护盾,能挡下一次撞击。
+- `[ 61.36s]` VIBRATE [10]
+- `[ 63.06s]` **GESTURE** swipedown @(195,422)
+- `[ 63.43s]` VIBRATE [10]
+- `[ 64.37s]` **GESTURE** swipeup @(195,422)
+- `[ 64.73s]` VIBRATE [10]
+- `[ 66.60s]` **GESTURE** doubletap @(195,422)
+- `[ 66.84s]` VIBRATE [20]
+- `[ 66.84s]` VIBRATE [30,50,30,50,30]
+- `[ 66.84s]` SFX ♪ shield
+- `[ 66.84s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 66.84s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 66.84s]` VOICE ■ feat_shield_done (kill)
+- `[ 66.84s]` VOICE ▶ protect_end (dur 3.6s)
+- `[ 66.84s]` VERDICT feat_shield_done: **TRUNCATED** sim=0
+ - 期望: 护盾展开后会自动充能,好了我会告诉你。
+ - 听到: 不是。
+- `[ 68.72s]` **GESTURE** swipedown @(195,422)
+- `[ 69.08s]` VIBRATE [10]
+- `[ 69.08s]` BGM ♪ menu (loop)
+- `[ 69.08s]` VOICE ■ protect_end (kill)
+- `[ 69.08s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 69.08s]` VERDICT protect_end: **TRUNCATED** sim=0.6087
+ - 期望: 训练护盾关闭。接下来,靠你自己了。
+ - 听到: 训练部动关闭,接下来。
+- `[ 70.03s]` VOICE ■ paused (kill)
+- `[ 70.03s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 70.03s]` VERDICT paused: **OK** sim=1
+ - 期望: 已暂停。
+ - 听到: 已暂停。
+- `[ 71.05s]` **GESTURE** doubletap @(195,422)
+- `[ 71.30s]` VIBRATE [20]
+- `[ 71.30s]` BGM ♪ engine (loop)
+- `[ 72.10s]` SFX ♪ whoosh_left
+- `[ 72.10s]` VOICE ■ menu_main (kill)
+- `[ 72.10s]` VOICE ▶ dir_left (dur 0.39909297052154197s)
+- `[ 72.10s]` VERDICT menu_main: **TRUNCATED** sim=0.8
+ - 期望: 菜单。单击切换选项,双击确认。
+ - 听到: 菜单单击切换选项。
+- `[ 72.49s]` VOICE ■ dir_left (kill)
+- `[ 72.49s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 走。
+- `[ 72.75s]` **GESTURE** swiperight @(195,422)
+- `[ 73.11s]` VIBRATE [10]
+- `[ 74.97s]` **GESTURE** swipeup @(195,422)
+- `[ 75.10s]` VIBRATE [25,40,25,40,25]
+- `[ 75.10s]` SFX ♪ alarm
+- `[ 75.33s]` VIBRATE [10]
+- `[ 75.60s]` VIBRATE [25,40,25,40,25]
+- `[ 75.60s]` SFX ♪ alarm
+- `[ 76.10s]` VIBRATE [80]
+- `[ 76.10s]` SFX ♪ hit
+- `[ 76.10s]` VOICE ▶ hit_left (dur 3.52s)
+- `[ 76.10s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 76.10s]` SFX ♪ whoosh_down
+- `[ 76.10s]` VOICE ■ hit_left (kill)
+- `[ 76.10s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 76.10s]` VERDICT hit_left: **TRUNCATED** sim=0
+ - 期望: 左边撞上的。听到左边的呼啸,向左滑。
+ - 听到: 嗯。
+- `[ 76.50s]` VOICE ■ dir_down (kill)
+- `[ 76.50s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 回这。
+- `[ 77.18s]` **GESTURE** tap @(195,422)
+- `[ 77.54s]` VIBRATE [20]
+- `[ 77.54s]` SFX ♪ boost
+- `[ 79.10s]` **GESTURE** swipedown @(195,422)
+- `[ 79.10s]` VIBRATE [25,40,25,40,25]
+- `[ 79.10s]` SFX ♪ alarm
+- `[ 79.46s]` VIBRATE [10]
+- `[ 79.60s]` VIBRATE [25,40,25,40,25]
+- `[ 79.60s]` SFX ♪ alarm
+- `[ 80.10s]` SFX ♪ dodge
+- `[ 80.10s]` SFX ♪ whoosh_down
+- `[ 80.10s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 80.10s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 80.50s]` VOICE ■ dir_down (kill)
+- `[ 80.50s]` VERDICT dir_down: **OK** sim=0.6667
+ - 期望: 下!
+ - 听到: 下你。
+- `[ 80.74s]` **GESTURE** swipeleft @(195,422)
+- `[ 81.09s]` VIBRATE [10]
+- `[ 81.84s]` VIBRATE [15]
+- `[ 81.84s]` VOICE ▶ shield_ready (dur 1.28s)
+- `[ 82.27s]` **GESTURE** tap @(195,422)
+- `[ 82.64s]` VIBRATE [20]
+- `[ 82.64s]` VOICE ■ shield_ready (kill)
+- `[ 82.64s]` VERDICT shield_ready: **TRUNCATED** sim=0
+ - 期望: 护盾充能完毕。
+ - 听到: 不段冲动。
+- `[ 83.01s]` SFX ♪ whoosh_down
+- `[ 83.01s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 83.10s]` VIBRATE [25,40,25,40,25]
+- `[ 83.10s]` SFX ♪ alarm
+- `[ 83.40s]` VOICE ■ dir_down (kill)
+- `[ 83.40s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 这。
+- `[ 83.60s]` VIBRATE [25,40,25,40,25]
+- `[ 83.60s]` SFX ♪ alarm
+- `[ 84.10s]` VIBRATE [80]
+- `[ 84.10s]` SFX ♪ hit
+- `[ 84.10s]` VOICE ▶ hit_down (dur 5.28s)
+- `[ 84.25s]` **GESTURE** swipedown @(195,422)
+- `[ 84.61s]` VIBRATE [10]
+- `[ 84.64s]` VIBRATE [25,40,25,40,25]
+- `[ 84.64s]` SFX ♪ alarm
+- `[ 85.14s]` VIBRATE [25,40,25,40,25]
+- `[ 85.14s]` SFX ♪ alarm
+- `[ 85.64s]` SFX ♪ dodge
+- `[ 85.88s]` SFX ♪ whoosh_right
+- `[ 85.88s]` VOICE ■ hit_down (kill)
+- `[ 85.88s]` VOICE ▶ dir_right (dur 0.7170975056689343s)
+- `[ 85.88s]` VERDICT hit_down: **TRUNCATED** sim=0.2105
+ - 期望: 下面撞上的。听到低沉的轰隆,向下滑。
+ - 听到: 向你撞上。
+- `[ 86.30s]` **GESTURE** tap @(195,422)
+- `[ 86.53s]` VOICE ■ dir_right (kill)
+- `[ 86.53s]` VOICE ▶ hit_last (dur 2.88s)
+- `[ 86.53s]` VERDICT dir_right: **MISMATCH** sim=0
+ - 期望: 右!
+ - 听到: 娘。
+- `[ 86.66s]` VIBRATE [20]
+- `[ 86.66s]` VOICE ■ hit_last (kill)
+- `[ 86.66s]` VERDICT hit_last: **TRUNCATED** sim=0
+ - 期望: 船体只剩最后一次了,小心!
+ - 听到: 啊。
+- `[ 87.48s]` VIBRATE [25,40,25,40,25]
+- `[ 87.48s]` SFX ♪ alarm
+- `[ 87.94s]` **GESTURE** tap @(195,422)
+- `[ 87.98s]` VIBRATE [25,40,25,40,25]
+- `[ 87.98s]` SFX ♪ alarm
+- `[ 88.30s]` VIBRATE [20]
+- `[ 88.30s]` SFX ♪ boost
+- `[ 88.48s]` SFX ♪ dodge
+- `[ 88.69s]` SFX ♪ whoosh_left
+- `[ 88.69s]` VOICE ▶ dir_left (dur 0.39909297052154197s)
+- `[ 88.69s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 89.09s]` VOICE ■ dir_left (kill)
+- `[ 89.09s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 我。
+- `[ 89.46s]` **GESTURE** doubletap @(195,422)
+- `[ 89.70s]` VIBRATE [20]
+- `[ 89.70s]` SFX ♪ shield
+- `[ 90.28s]` VIBRATE [25,40,25,40,25]
+- `[ 90.28s]` SFX ♪ alarm
+- `[ 90.78s]` VIBRATE [25,40,25,40,25]
+- `[ 90.78s]` SFX ♪ alarm
+- `[ 90.96s]` **GESTURE** swipeup @(195,422)
+- `[ 91.28s]` VIBRATE [100]
+- `[ 91.28s]` SFX ♪ shield_block
+- `[ 91.28s]` VOICE ▶ shield_block (dur 1.44s)
+- `[ 91.28s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 91.31s]` VIBRATE [10]
+- `[ 91.46s]` SFX ♪ whoosh_down
+- `[ 91.46s]` VOICE ■ shield_block (kill)
+- `[ 91.46s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 91.46s]` VERDICT shield_block: **TRUNCATED** sim=0
+ - 期望: 护盾挡下了撞击。
+ - 听到: 。
+- `[ 91.85s]` VOICE ■ dir_down (kill)
+- `[ 91.85s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 这。
+- `[ 92.44s]` **GESTURE** tap @(195,422)
+- `[ 92.81s]` VIBRATE [20]
+- `[ 92.81s]` SFX ♪ boost
+- `[ 93.02s]` VIBRATE [25,40,25,40,25]
+- `[ 93.02s]` SFX ♪ alarm
+- `[ 93.52s]` VIBRATE [25,40,25,40,25]
+- `[ 93.52s]` SFX ♪ alarm
+- `[ 94.02s]` SFX ♪ dodge
+- `[ 94.18s]` SFX ♪ whoosh_left
+- `[ 94.18s]` VOICE ▶ dir_left (dur 0.39909297052154197s)
+- `[ 94.18s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 94.25s]` **GESTURE** swipeleft @(195,422)
+- `[ 94.57s]` VOICE ■ dir_left (kill)
+- `[ 94.57s]` VERDICT dir_left: **MISMATCH** sim=0
+ - 期望: 左!
+ - 听到: 说。
+- `[ 94.61s]` VIBRATE [10]
+- `[ 95.72s]` VIBRATE [25,40,25,40,25]
+- `[ 95.72s]` SFX ♪ alarm
+- `[ 95.95s]` **GESTURE** tap @(195,422)
+- `[ 96.22s]` VIBRATE [25,40,25,40,25]
+- `[ 96.22s]` SFX ♪ alarm
+- `[ 96.31s]` VIBRATE [20]
+- `[ 96.31s]` SFX ♪ boost
+- `[ 96.72s]` SFX ♪ dodge
+- `[ 96.86s]` SFX ♪ whoosh_down
+- `[ 96.86s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 96.86s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
+- `[ 97.24s]` VOICE ■ dir_down (kill)
+- `[ 97.24s]` VERDICT dir_down: **MISMATCH** sim=0
+ - 期望: 下!
+ - 听到: 在。
+- `[ 98.37s]` VIBRATE [25,40,25,40,25]
+- `[ 98.37s]` SFX ♪ alarm
+- `[ 98.87s]` VIBRATE [25,40,25,40,25]
+- `[ 98.87s]` SFX ♪ alarm
+- `[ 99.37s]` VIBRATE [80]
+- `[ 99.38s]` VIBRATE [60,40,60]
+- `[ 99.38s]` SFX ♪ hit
+- `[ 99.38s]` SFX ♪ crash
+- `[ 99.67s]` VIBRATE [80]
+- `[ 100.58s]` VIBRATE [100]
+- `[ 100.58s]` VOICE ▶ time_3 (dur 2.56s)
+- `[ 102.65s]` VOICE ■ time_3 (kill)
+- `[ 102.65s]` VOICE ▶ new_record (dur 0.9570975056689343s)
+- `[ 103.60s]` VOICE ■ new_record (kill)
+- `[ 103.61s]` VOICE ▶ dodge_2 (dur 1.28s)
+- `[ 104.83s]` VOICE ■ dodge_2 (kill)
+- `[ 104.84s]` VOICE ▶ restart_hint (dur 3.12s)
+- `[ 107.36s]` VOICE ■ restart_hint (kill)
+- `[ 107.36s]` BGM ♪ menu (loop)
+- `[ 112.22s]` **GESTURE** doubletap @(195,422)
+- `[ 112.47s]` VIBRATE [20]
+- `[ 113.32s]` **GESTURE** tap @(195,422)
+- `[ 113.69s]` VIBRATE [20]
+- `[ 113.69s]` BGM ♪ engine (loop)
+- `[ 114.72s]` **GESTURE** swiperight @(195,422)
+- `[ 115.07s]` VIBRATE [10]
+- `[ 115.19s]` SFX ♪ whoosh_up
+- `[ 116.46s]` **GESTURE** swipeleft @(195,422)
+- `[ 116.82s]` VIBRATE [10]
+- `[ 118.19s]` VIBRATE [25,40,25,40,25]
+- `[ 118.19s]` SFX ♪ alarm
+- `[ 118.27s]` **GESTURE** swipedown @(195,422)
+- `[ 118.62s]` VIBRATE [10]
+- `[ 118.63s]` BGM ♪ menu (loop)
+- `[ 118.63s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 119.57s]` VOICE ■ paused (kill)
+- `[ 119.57s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 119.82s]` **GESTURE** doubletap @(195,422)
+- `[ 120.06s]` VIBRATE [20]
+- `[ 120.06s]` BGM ♪ engine (loop)
+- `[ 120.86s]` SFX ♪ whoosh_down
+- `[ 121.64s]` **GESTURE** doubletap @(195,422)
+- `[ 121.89s]` VIBRATE [20]
+- `[ 121.89s]` SFX ♪ shield
+- `[ 122.66s]` VOICE ■ menu_main (kill)
+- `[ 122.66s]` VOICE ▶ menu_resume (dur 1.12s)
+- `[ 123.52s]` **GESTURE** doubletap @(195,422)
+- `[ 123.61s]` VOICE ■ menu_resume (kill)
+- `[ 123.76s]` VIBRATE [20]
+- `[ 123.76s]` VIBRATE [40,100,40]
+- `[ 123.76s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 123.86s]` VIBRATE [25,40,25,40,25]
+- `[ 123.86s]` SFX ♪ alarm
+- `[ 124.36s]` VIBRATE [25,40,25,40,25]
+- `[ 124.36s]` SFX ♪ alarm
+- `[ 124.58s]` **GESTURE** doubletap @(195,422)
+- `[ 124.83s]` VIBRATE [20]
+- `[ 124.86s]` VIBRATE [100]
+- `[ 124.86s]` SFX ♪ shield_block
+- `[ 124.86s]` SFX ♪ whoosh_down
+- `[ 125.80s]` **GESTURE** swipeleft @(195,422)
+- `[ 126.16s]` VIBRATE [10]
+- `[ 126.99s]` **GESTURE** doubletap @(195,422)
+- `[ 127.24s]` VIBRATE [20]
+- `[ 127.40s]` VOICE ■ feat_shield_done (kill)
+- `[ 127.40s]` VOICE ▶ shield_block (dur 1.44s)
+- `[ 127.86s]` VIBRATE [25,40,25,40,25]
+- `[ 127.86s]` SFX ♪ alarm
+- `[ 128.37s]` VIBRATE [25,40,25,40,25]
+- `[ 128.37s]` SFX ♪ alarm
+- `[ 128.63s]` VOICE ■ shield_block (kill)
+- `[ 128.70s]` **GESTURE** swipedown @(195,422)
+- `[ 128.87s]` VIBRATE [30,50,30,50,30]
+- `[ 128.87s]` SFX ♪ shield_block
+- `[ 128.87s]` VOICE ▶ protect_down (dur 5.04s)
+- `[ 128.87s]` SFX ♪ whoosh_up
+- `[ 129.06s]` VIBRATE [10]
+- `[ 130.52s]` **GESTURE** swipedown @(195,422)
+- `[ 130.87s]` VIBRATE [10]
+- `[ 130.87s]` BGM ♪ menu (loop)
+- `[ 130.87s]` VOICE ■ protect_down (kill)
+- `[ 130.87s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 131.83s]` VOICE ■ paused (kill)
+- `[ 131.83s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 131.85s]` **GESTURE** swipedown @(195,422)
+- `[ 132.21s]` VIBRATE [10]
+- `[ 132.21s]` BGM ♪ engine (loop)
+- `[ 132.95s]` **GESTURE** swiperight @(195,422)
+- `[ 133.01s]` SFX ♪ whoosh_down
+- `[ 133.31s]` VIBRATE [10]
+- `[ 134.70s]` **GESTURE** swipedown @(195,422)
+- `[ 134.92s]` VOICE ■ menu_main (kill)
+- `[ 134.92s]` VOICE ▶ menu_resume (dur 1.12s)
+- `[ 135.06s]` VIBRATE [10]
+- `[ 135.87s]` VOICE ■ menu_resume (kill)
+- `[ 136.01s]` VIBRATE [25,40,25,40,25]
+- `[ 136.01s]` SFX ♪ alarm
+- `[ 136.51s]` VIBRATE [25,40,25,40,25]
+- `[ 136.51s]` SFX ♪ alarm
+- `[ 136.61s]` **GESTURE** doubletap @(195,422)
+- `[ 136.86s]` VIBRATE [20]
+- `[ 136.86s]` VIBRATE [40,100,40]
+- `[ 136.86s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 136.89s]` VIBRATE [15]
+- `[ 137.01s]` SFX ♪ dodge
+- `[ 137.01s]` SFX ♪ whoosh_left
+- `[ 137.70s]` **GESTURE** doubletap @(195,422)
+- `[ 137.94s]` VIBRATE [20]
+- `[ 137.94s]` SFX ♪ shield
+- `[ 139.43s]` **GESTURE** swipedown @(195,422)
+- `[ 139.79s]` VIBRATE [10]
+- `[ 139.79s]` BGM ♪ menu (loop)
+- `[ 139.79s]` VOICE ■ feat_shield_done (kill)
+- `[ 139.79s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 140.53s]` **GESTURE** tap @(195,422)
+- `[ 140.75s]` VOICE ■ paused (kill)
+- `[ 140.75s]` VOICE ▶ shield_ready (dur 1.28s)
+- `[ 140.75s]` VOICE ■ shield_ready (kill)
+- `[ 140.75s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 140.89s]` VIBRATE [20]
+- `[ 140.89s]` VOICE ■ menu_main (kill)
+- `[ 140.89s]` VOICE ▶ menu_lobby (dur 1.04s)
+- `[ 141.79s]` **GESTURE** swiperight @(195,422)
+- `[ 141.84s]` VOICE ■ menu_lobby (kill)
+- `[ 142.16s]` VIBRATE [10]
+- `[ 143.15s]` **GESTURE** tap @(195,422)
+- `[ 143.51s]` VIBRATE [20]
+- `[ 143.51s]` VOICE ▶ menu_help (dur 1.6s)
+- `[ 144.19s]` **GESTURE** swiperight @(195,422)
+- `[ 144.56s]` VIBRATE [10]
+- `[ 144.74s]` VOICE ■ menu_help (kill)
+- `[ 145.48s]` **GESTURE** swipedown @(195,422)
+- `[ 145.84s]` VIBRATE [10]
+- `[ 145.84s]` BGM ♪ engine (loop)
+- `[ 146.64s]` SFX ♪ whoosh_down
+- `[ 147.09s]` **GESTURE** doubletap @(195,422)
+- `[ 147.34s]` VIBRATE [20]
+- `[ 147.34s]` VIBRATE [40,100,40]
+- `[ 147.34s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 148.45s]` **GESTURE** swipedown @(195,422)
+- `[ 148.81s]` VIBRATE [10]
+- `[ 149.64s]` VIBRATE [25,40,25,40,25]
+- `[ 149.64s]` SFX ♪ alarm
+- `[ 149.99s]` **GESTURE** swipedown @(195,422)
+- `[ 150.14s]` VIBRATE [25,40,25,40,25]
+- `[ 150.14s]` SFX ♪ alarm
+- `[ 150.34s]` VIBRATE [10]
+- `[ 150.64s]` SFX ♪ dodge
+- `[ 150.64s]` SFX ♪ whoosh_right
+- `[ 150.99s]` VOICE ■ feat_shield_done (kill)
+- `[ 151.23s]` **GESTURE** swipeleft @(195,422)
+- `[ 151.59s]` VIBRATE [10]
+- `[ 152.94s]` VIBRATE [15]
+- `[ 152.94s]` VOICE ▶ shield_ready (dur 1.28s)
+- `[ 153.12s]` **GESTURE** swipeup @(195,422)
+- `[ 153.47s]` VIBRATE [10]
+- `[ 153.64s]` VIBRATE [25,40,25,40,25]
+- `[ 153.64s]` SFX ♪ alarm
+- `[ 154.14s]` VIBRATE [25,40,25,40,25]
+- `[ 154.14s]` SFX ♪ alarm
+- `[ 154.17s]` VOICE ■ shield_ready (kill)
+- `[ 154.64s]` VIBRATE [30,50,30,50,30]
+- `[ 154.64s]` SFX ♪ shield_block
+- `[ 154.64s]` VOICE ▶ protect_right (dur 5.2s)
+- `[ 154.64s]` SFX ♪ whoosh_right
+- `[ 155.09s]` **GESTURE** tap @(195,422)
+- `[ 155.46s]` VIBRATE [20]
+- `[ 155.46s]` VOICE ■ protect_right (kill)
+- `[ 156.29s]` **GESTURE** swipeup @(195,422)
+- `[ 156.64s]` VIBRATE [10]
+- `[ 157.64s]` VIBRATE [25,40,25,40,25]
+- `[ 157.64s]` SFX ♪ alarm
+- `[ 157.87s]` **GESTURE** doubletap @(195,422)
+- `[ 158.12s]` VIBRATE [20]
+- `[ 158.12s]` SFX ♪ shield
+- `[ 158.14s]` VIBRATE [25,40,25,40,25]
+- `[ 158.14s]` SFX ♪ alarm
+- `[ 158.64s]` VIBRATE [100]
+- `[ 158.64s]` SFX ♪ shield_block
+- `[ 158.64s]` VOICE ▶ shield_block (dur 1.44s)
+- `[ 158.64s]` SFX ♪ whoosh_down
+- `[ 159.50s]` **GESTURE** doubletap @(195,422)
+- `[ 159.75s]` VIBRATE [20]
+- `[ 159.75s]` VIBRATE [40,100,40]
+- `[ 159.75s]` VOICE ■ shield_block (kill)
+- `[ 159.75s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 160.88s]` **GESTURE** tap @(195,422)
+- `[ 161.24s]` VIBRATE [20]
+- `[ 161.24s]` VOICE ■ feat_shield_done (kill)
+- `[ 161.64s]` VIBRATE [25,40,25,40,25]
+- `[ 161.64s]` SFX ♪ alarm
+- `[ 162.14s]` VIBRATE [25,40,25,40,25]
+- `[ 162.14s]` SFX ♪ alarm
+- `[ 162.22s]` **GESTURE** swipedown @(195,422)
+- `[ 162.59s]` VIBRATE [10]
+- `[ 162.64s]` SFX ♪ dodge
+- `[ 162.64s]` SFX ♪ whoosh_left
+- `[ 165.64s]` VIBRATE [25,40,25,40,25]
+- `[ 165.64s]` SFX ♪ alarm
+- `[ 166.14s]` VIBRATE [25,40,25,40,25]
+- `[ 166.14s]` SFX ♪ alarm
+- `[ 166.64s]` VIBRATE [30,50,30,50,30]
+- `[ 166.64s]` SFX ♪ shield_block
+- `[ 166.64s]` VOICE ▶ protect_left (dur 6.32s)
+- `[ 166.64s]` SFX ♪ whoosh_left
diff --git a/research/space-polish/round1/live-B-verdicts.json b/research/space-polish/round1/live-B-verdicts.json
new file mode 100644
index 00000000..11ab7960
--- /dev/null
+++ b/research/space-polish/round1/live-B-verdicts.json
@@ -0,0 +1,1309 @@
+{
+ "game": "space",
+ "settings": {
+ "voice": "female",
+ "guide": "standard",
+ "speed": 1.35,
+ "bgm": 1
+ },
+ "outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/space-20260914055430",
+ "segs": [
+ {
+ "idx": 0,
+ "voiceId": "second_run_ask",
+ "t0": 0.099,
+ "t1": 2.346,
+ "dur": 3.04,
+ "expEnd": 2.351,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "上滑重新听演练,单击直接出。",
+ "similarity": 0.96
+ },
+ {
+ "idx": 1,
+ "voiceId": "protect_up",
+ "t0": 8.283,
+ "t1": 11.935,
+ "dur": 4.8,
+ "expEnd": 11.839,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "训练护动接住,那裤子上面听到高高的呼啸,肖哨话。",
+ "similarity": 0.6977
+ },
+ {
+ "idx": 2,
+ "voiceId": "protect_down",
+ "t0": 12.284,
+ "t1": 16.207,
+ "dur": 5.04,
+ "expEnd": 16.017,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "训练护盾切住,那刻在下面听到低沉的轰隆向下滑。",
+ "similarity": 0.8837
+ },
+ {
+ "idx": 3,
+ "voiceId": "protect_down",
+ "t0": 16.285,
+ "t1": 20.201,
+ "dur": 5.04,
+ "expEnd": 20.018,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "训疗后段接轨,那刻在下面听到低沉的轰隆向下滑。",
+ "similarity": 0.7442
+ },
+ {
+ "idx": 4,
+ "voiceId": "protect_up",
+ "t0": 20.286,
+ "t1": 22.782,
+ "dur": 4.8,
+ "expEnd": 23.842,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练互动接住,那刻子上面听到。",
+ "similarity": 0.5143
+ },
+ {
+ "idx": 5,
+ "voiceId": "feat_boost",
+ "t0": 22.782,
+ "t1": 25.866,
+ "dur": 3.84,
+ "expEnd": 25.626,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "试试单机,引擎或短途加速,直接冲过空隙。",
+ "similarity": 0.8235
+ },
+ {
+ "idx": 6,
+ "voiceId": "feat_boost_done",
+ "t0": 29.71,
+ "t1": 32.227,
+ "dur": 3.44,
+ "expEnd": 32.258,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "感觉到了吗?下死的时候陨石撞不上。",
+ "similarity": 0.8387
+ },
+ {
+ "idx": 7,
+ "voiceId": "feat_shield_done",
+ "t0": 35.849,
+ "t1": 36.21,
+ "dur": 4.64,
+ "expEnd": 39.286,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "。",
+ "similarity": 0
+ },
+ {
+ "idx": 8,
+ "voiceId": "protect_left",
+ "t0": 36.21,
+ "t1": 38.828,
+ "dur": 6.32,
+ "expEnd": 40.891,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练护臀接住,内颗在左边。",
+ "similarity": 0.5455
+ },
+ {
+ "idx": 9,
+ "voiceId": "paused",
+ "t0": 38.828,
+ "t1": 39.773,
+ "dur": 0.9570975056689343,
+ "expEnd": 39.537,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "已暂停。",
+ "similarity": 1
+ },
+ {
+ "idx": 10,
+ "voiceId": "menu_main",
+ "t0": 39.773,
+ "t1": 42.794,
+ "dur": 3.92,
+ "expEnd": 42.677,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "菜单单击切换选项,双击确认。",
+ "similarity": 1
+ },
+ {
+ "idx": 11,
+ "voiceId": "paused",
+ "t0": 42.794,
+ "t1": 43.744,
+ "dur": 0.9570975056689343,
+ "expEnd": 43.503,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "已暂停。",
+ "similarity": 1
+ },
+ {
+ "idx": 12,
+ "voiceId": "menu_main",
+ "t0": 43.744,
+ "t1": 44.911,
+ "dur": 3.92,
+ "expEnd": 46.648,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "菜单。",
+ "similarity": 0.2857
+ },
+ {
+ "idx": 13,
+ "voiceId": "help_recap",
+ "t0": 44.911,
+ "t1": 46.258,
+ "dur": 8.4,
+ "expEnd": 51.133,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "左边来向左滑右。",
+ "similarity": 0.359
+ },
+ {
+ "idx": 14,
+ "voiceId": "menu_lobby",
+ "t0": 46.258,
+ "t1": 47.203,
+ "dur": 1.04,
+ "expEnd": 47.028,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "回大厅。",
+ "similarity": 1
+ },
+ {
+ "idx": 15,
+ "voiceId": "help_recap",
+ "t0": 47.744,
+ "t1": 49.248,
+ "dur": 8.4,
+ "expEnd": 53.966,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "左边来向左滑,右边。",
+ "similarity": 0.4
+ },
+ {
+ "idx": 16,
+ "voiceId": "menu_help",
+ "t0": 49.249,
+ "t1": 50.477,
+ "dur": 1.6,
+ "expEnd": 50.434,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "右边重新听教学要点。",
+ "similarity": 0.875
+ },
+ {
+ "idx": 17,
+ "voiceId": "help_recap",
+ "t0": 50.712,
+ "t1": 53.622,
+ "dur": 8.4,
+ "expEnd": 56.934,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "左边来向左滑,右边来向右滑,上面来。",
+ "similarity": 0.6383
+ },
+ {
+ "idx": 18,
+ "voiceId": "menu_resume",
+ "t0": 53.622,
+ "t1": 54.563,
+ "dur": 1.12,
+ "expEnd": 54.452,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "来继续飞行。",
+ "similarity": 0.8889
+ },
+ {
+ "idx": 19,
+ "voiceId": "help_recap",
+ "t0": 55.627,
+ "t1": 57.329,
+ "dur": 8.4,
+ "expEnd": 61.849,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "左边来向左滑,右边来。",
+ "similarity": 0.439
+ },
+ {
+ "idx": 20,
+ "voiceId": "menu_lobby",
+ "t0": 57.329,
+ "t1": 58.278,
+ "dur": 1.04,
+ "expEnd": 58.099,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "来回大厅。",
+ "similarity": 0.8571
+ },
+ {
+ "idx": 21,
+ "voiceId": "feat_shield",
+ "t0": 58.994,
+ "t1": 61.25,
+ "dur": 2.8,
+ "expEnd": 61.068,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "双击展开护盾,能挡下一次撞击。",
+ "similarity": 1
+ },
+ {
+ "idx": 22,
+ "voiceId": "feat_shield_done",
+ "t0": 66.844,
+ "t1": 66.845,
+ "dur": 4.64,
+ "expEnd": 70.281,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "不是。",
+ "similarity": 0
+ },
+ {
+ "idx": 23,
+ "voiceId": "protect_end",
+ "t0": 66.845,
+ "t1": 69.077,
+ "dur": 3.6,
+ "expEnd": 69.512,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "训练部动关闭,接下来。",
+ "similarity": 0.6087
+ },
+ {
+ "idx": 24,
+ "voiceId": "paused",
+ "t0": 69.077,
+ "t1": 70.026,
+ "dur": 0.9570975056689343,
+ "expEnd": 69.786,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "已暂停。",
+ "similarity": 1
+ },
+ {
+ "idx": 25,
+ "voiceId": "menu_main",
+ "t0": 70.026,
+ "t1": 72.101,
+ "dur": 3.92,
+ "expEnd": 72.93,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "菜单单击切换选项。",
+ "similarity": 0.8
+ },
+ {
+ "idx": 26,
+ "voiceId": "dir_left",
+ "t0": 72.101,
+ "t1": 72.488,
+ "dur": 0.39909297052154197,
+ "expEnd": 72.397,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "走。",
+ "similarity": 0
+ },
+ {
+ "idx": 27,
+ "voiceId": "hit_left",
+ "t0": 76.102,
+ "t1": 76.103,
+ "dur": 3.52,
+ "expEnd": 78.709,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "嗯。",
+ "similarity": 0
+ },
+ {
+ "idx": 28,
+ "voiceId": "dir_down",
+ "t0": 76.103,
+ "t1": 76.504,
+ "dur": 0.39909297052154197,
+ "expEnd": 76.399,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "回这。",
+ "similarity": 0
+ },
+ {
+ "idx": 29,
+ "voiceId": "dir_down",
+ "t0": 80.103,
+ "t1": 80.498,
+ "dur": 0.39909297052154197,
+ "expEnd": 80.399,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "OK",
+ "heard": "下你。",
+ "similarity": 0.6667
+ },
+ {
+ "idx": 30,
+ "voiceId": "shield_ready",
+ "t0": 81.843,
+ "t1": 82.636,
+ "dur": 1.28,
+ "expEnd": 82.791,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "不段冲动。",
+ "similarity": 0
+ },
+ {
+ "idx": 31,
+ "voiceId": "dir_down",
+ "t0": 83.014,
+ "t1": 83.4,
+ "dur": 0.39909297052154197,
+ "expEnd": 83.31,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "这。",
+ "similarity": 0
+ },
+ {
+ "idx": 32,
+ "voiceId": "hit_down",
+ "t0": 84.103,
+ "t1": 85.876,
+ "dur": 5.28,
+ "expEnd": 88.014,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "向你撞上。",
+ "similarity": 0.2105
+ },
+ {
+ "idx": 33,
+ "voiceId": "dir_right",
+ "t0": 85.876,
+ "t1": 86.534,
+ "dur": 0.7170975056689343,
+ "expEnd": 86.407,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "娘。",
+ "similarity": 0
+ },
+ {
+ "idx": 34,
+ "voiceId": "hit_last",
+ "t0": 86.534,
+ "t1": 86.66,
+ "dur": 2.88,
+ "expEnd": 88.667,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "啊。",
+ "similarity": 0
+ },
+ {
+ "idx": 35,
+ "voiceId": "dir_left",
+ "t0": 88.692,
+ "t1": 89.088,
+ "dur": 0.39909297052154197,
+ "expEnd": 88.988,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "我。",
+ "similarity": 0
+ },
+ {
+ "idx": 36,
+ "voiceId": "shield_block",
+ "t0": 91.276,
+ "t1": 91.46,
+ "dur": 1.44,
+ "expEnd": 92.343,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": "TRUNCATED",
+ "heard": "。",
+ "similarity": 0
+ },
+ {
+ "idx": 37,
+ "voiceId": "dir_down",
+ "t0": 91.46,
+ "t1": 91.851,
+ "dur": 0.39909297052154197,
+ "expEnd": 91.756,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "这。",
+ "similarity": 0
+ },
+ {
+ "idx": 38,
+ "voiceId": "dir_left",
+ "t0": 94.182,
+ "t1": 94.568,
+ "dur": 0.39909297052154197,
+ "expEnd": 94.478,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "说。",
+ "similarity": 0
+ },
+ {
+ "idx": 39,
+ "voiceId": "dir_down",
+ "t0": 96.858,
+ "t1": 97.238,
+ "dur": 0.39909297052154197,
+ "expEnd": 97.154,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": "MISMATCH",
+ "heard": "在。",
+ "similarity": 0
+ },
+ {
+ "idx": 40,
+ "voiceId": "time_3",
+ "t0": 100.585,
+ "t1": 102.648,
+ "dur": 2.56,
+ "expEnd": 102.481,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 41,
+ "voiceId": "new_record",
+ "t0": 102.654,
+ "t1": 103.6,
+ "dur": 0.9570975056689343,
+ "expEnd": 103.363,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 42,
+ "voiceId": "dodge_2",
+ "t0": 103.608,
+ "t1": 104.83,
+ "dur": 1.28,
+ "expEnd": 104.556,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 43,
+ "voiceId": "restart_hint",
+ "t0": 104.838,
+ "t1": 107.361,
+ "dur": 3.12,
+ "expEnd": 107.149,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 44,
+ "voiceId": "paused",
+ "t0": 118.625,
+ "t1": 119.574,
+ "dur": 0.9570975056689343,
+ "expEnd": 119.334,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 45,
+ "voiceId": "menu_main",
+ "t0": 119.574,
+ "t1": 122.662,
+ "dur": 3.92,
+ "expEnd": 122.478,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 46,
+ "voiceId": "menu_resume",
+ "t0": 122.662,
+ "t1": 123.613,
+ "dur": 1.12,
+ "expEnd": 123.492,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 47,
+ "voiceId": "feat_shield_done",
+ "t0": 123.764,
+ "t1": 127.398,
+ "dur": 4.64,
+ "expEnd": 127.201,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 48,
+ "voiceId": "shield_block",
+ "t0": 127.398,
+ "t1": 128.628,
+ "dur": 1.44,
+ "expEnd": 128.465,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 49,
+ "voiceId": "protect_down",
+ "t0": 128.865,
+ "t1": 130.874,
+ "dur": 5.04,
+ "expEnd": 132.598,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 50,
+ "voiceId": "paused",
+ "t0": 130.874,
+ "t1": 131.833,
+ "dur": 0.9570975056689343,
+ "expEnd": 131.583,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 51,
+ "voiceId": "menu_main",
+ "t0": 131.833,
+ "t1": 134.921,
+ "dur": 3.92,
+ "expEnd": 134.737,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 52,
+ "voiceId": "menu_resume",
+ "t0": 134.921,
+ "t1": 135.872,
+ "dur": 1.12,
+ "expEnd": 135.751,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 53,
+ "voiceId": "feat_shield_done",
+ "t0": 136.86,
+ "t1": 139.79,
+ "dur": 4.64,
+ "expEnd": 140.297,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 54,
+ "voiceId": "paused",
+ "t0": 139.79,
+ "t1": 140.748,
+ "dur": 0.9570975056689343,
+ "expEnd": 140.499,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 55,
+ "voiceId": "shield_ready",
+ "t0": 140.748,
+ "t1": 140.749,
+ "dur": 1.28,
+ "expEnd": 141.696,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 56,
+ "voiceId": "menu_main",
+ "t0": 140.749,
+ "t1": 140.889,
+ "dur": 3.92,
+ "expEnd": 143.653,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 57,
+ "voiceId": "menu_lobby",
+ "t0": 140.889,
+ "t1": 141.839,
+ "dur": 1.04,
+ "expEnd": 141.659,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 58,
+ "voiceId": "menu_help",
+ "t0": 143.513,
+ "t1": 144.742,
+ "dur": 1.6,
+ "expEnd": 144.698,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 59,
+ "voiceId": "feat_shield_done",
+ "t0": 147.339,
+ "t1": 150.988,
+ "dur": 4.64,
+ "expEnd": 150.776,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 60,
+ "voiceId": "shield_ready",
+ "t0": 152.943,
+ "t1": 154.168,
+ "dur": 1.28,
+ "expEnd": 153.891,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 61,
+ "voiceId": "protect_right",
+ "t0": 154.641,
+ "t1": 155.458,
+ "dur": 5.2,
+ "expEnd": 158.493,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 62,
+ "voiceId": "shield_block",
+ "t0": 158.642,
+ "t1": 159.749,
+ "dur": 1.44,
+ "expEnd": 159.709,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 63,
+ "voiceId": "feat_shield_done",
+ "t0": 159.75,
+ "t1": 161.242,
+ "dur": 4.64,
+ "expEnd": 163.187,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 64,
+ "voiceId": "protect_left",
+ "t0": 166.643,
+ "t1": 97.501,
+ "dur": 6.32,
+ "expEnd": 171.324,
+ "truncated": true,
+ "reason": "session-end",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ }
+ ],
+ "rows": [
+ {
+ "t0": 0.099,
+ "t1": 2.346,
+ "voiceId": "second_run_ask",
+ "expected": "上滑重新听演练,单击直接出发。",
+ "heard": "上滑重新听演练,单击直接出。",
+ "similarity": 0.96,
+ "verdict": "OK"
+ },
+ {
+ "t0": 8.283,
+ "t1": 11.935,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练护动接住,那裤子上面听到高高的呼啸,肖哨话。",
+ "similarity": 0.6977,
+ "verdict": "OK"
+ },
+ {
+ "t0": 12.284,
+ "t1": 16.207,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训练护盾切住,那刻在下面听到低沉的轰隆向下滑。",
+ "similarity": 0.8837,
+ "verdict": "OK"
+ },
+ {
+ "t0": 16.285,
+ "t1": 20.201,
+ "voiceId": "protect_down",
+ "expected": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "heard": "训疗后段接轨,那刻在下面听到低沉的轰隆向下滑。",
+ "similarity": 0.7442,
+ "verdict": "OK"
+ },
+ {
+ "t0": 20.286,
+ "t1": 22.782,
+ "voiceId": "protect_up",
+ "expected": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "heard": "训练互动接住,那刻子上面听到。",
+ "similarity": 0.5143,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 22.782,
+ "t1": 25.866,
+ "voiceId": "feat_boost",
+ "expected": "试试单击,引擎会短促加速,直接冲过空隙。",
+ "heard": "试试单机,引擎或短途加速,直接冲过空隙。",
+ "similarity": 0.8235,
+ "verdict": "OK"
+ },
+ {
+ "t0": 29.71,
+ "t1": 32.227,
+ "voiceId": "feat_boost_done",
+ "expected": "感觉到了吗?加速的时候,陨石撞不上你。",
+ "heard": "感觉到了吗?下死的时候陨石撞不上。",
+ "similarity": 0.8387,
+ "verdict": "OK"
+ },
+ {
+ "t0": 35.849,
+ "t1": 36.21,
+ "voiceId": "feat_shield_done",
+ "expected": "护盾展开后会自动充能,好了我会告诉你。",
+ "heard": "。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 36.21,
+ "t1": 38.828,
+ "voiceId": "protect_left",
+ "expected": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "heard": "训练护臀接住,内颗在左边。",
+ "similarity": 0.5455,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 38.828,
+ "t1": 39.773,
+ "voiceId": "paused",
+ "expected": "已暂停。",
+ "heard": "已暂停。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 39.773,
+ "t1": 42.794,
+ "voiceId": "menu_main",
+ "expected": "菜单。单击切换选项,双击确认。",
+ "heard": "菜单单击切换选项,双击确认。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 42.794,
+ "t1": 43.744,
+ "voiceId": "paused",
+ "expected": "已暂停。",
+ "heard": "已暂停。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 43.744,
+ "t1": 44.911,
+ "voiceId": "menu_main",
+ "expected": "菜单。单击切换选项,双击确认。",
+ "heard": "菜单。",
+ "similarity": 0.2857,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 44.911,
+ "t1": 46.258,
+ "voiceId": "help_recap",
+ "expected": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
+ "heard": "左边来向左滑右。",
+ "similarity": 0.359,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 46.258,
+ "t1": 47.203,
+ "voiceId": "menu_lobby",
+ "expected": "回大厅。",
+ "heard": "回大厅。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 47.744,
+ "t1": 49.248,
+ "voiceId": "help_recap",
+ "expected": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
+ "heard": "左边来向左滑,右边。",
+ "similarity": 0.4,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 49.249,
+ "t1": 50.477,
+ "voiceId": "menu_help",
+ "expected": "重新听教学要点。",
+ "heard": "右边重新听教学要点。",
+ "similarity": 0.875,
+ "verdict": "OK"
+ },
+ {
+ "t0": 50.712,
+ "t1": 53.622,
+ "voiceId": "help_recap",
+ "expected": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
+ "heard": "左边来向左滑,右边来向右滑,上面来。",
+ "similarity": 0.6383,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 53.622,
+ "t1": 54.563,
+ "voiceId": "menu_resume",
+ "expected": "继续飞行。",
+ "heard": "来继续飞行。",
+ "similarity": 0.8889,
+ "verdict": "OK"
+ },
+ {
+ "t0": 55.627,
+ "t1": 57.329,
+ "voiceId": "help_recap",
+ "expected": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
+ "heard": "左边来向左滑,右边来。",
+ "similarity": 0.439,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 57.329,
+ "t1": 58.278,
+ "voiceId": "menu_lobby",
+ "expected": "回大厅。",
+ "heard": "来回大厅。",
+ "similarity": 0.8571,
+ "verdict": "OK"
+ },
+ {
+ "t0": 58.994,
+ "t1": 61.25,
+ "voiceId": "feat_shield",
+ "expected": "双击展开护盾,能挡下一次撞击。",
+ "heard": "双击展开护盾,能挡下一次撞击。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 66.844,
+ "t1": 66.845,
+ "voiceId": "feat_shield_done",
+ "expected": "护盾展开后会自动充能,好了我会告诉你。",
+ "heard": "不是。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 66.845,
+ "t1": 69.077,
+ "voiceId": "protect_end",
+ "expected": "训练护盾关闭。接下来,靠你自己了。",
+ "heard": "训练部动关闭,接下来。",
+ "similarity": 0.6087,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 69.077,
+ "t1": 70.026,
+ "voiceId": "paused",
+ "expected": "已暂停。",
+ "heard": "已暂停。",
+ "similarity": 1,
+ "verdict": "OK"
+ },
+ {
+ "t0": 70.026,
+ "t1": 72.101,
+ "voiceId": "menu_main",
+ "expected": "菜单。单击切换选项,双击确认。",
+ "heard": "菜单单击切换选项。",
+ "similarity": 0.8,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 72.101,
+ "t1": 72.488,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "走。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 76.102,
+ "t1": 76.103,
+ "voiceId": "hit_left",
+ "expected": "左边撞上的。听到左边的呼啸,向左滑。",
+ "heard": "嗯。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 76.103,
+ "t1": 76.504,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "回这。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 80.103,
+ "t1": 80.498,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "下你。",
+ "similarity": 0.6667,
+ "verdict": "OK"
+ },
+ {
+ "t0": 81.843,
+ "t1": 82.636,
+ "voiceId": "shield_ready",
+ "expected": "护盾充能完毕。",
+ "heard": "不段冲动。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 83.014,
+ "t1": 83.4,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "这。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 84.103,
+ "t1": 85.876,
+ "voiceId": "hit_down",
+ "expected": "下面撞上的。听到低沉的轰隆,向下滑。",
+ "heard": "向你撞上。",
+ "similarity": 0.2105,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 85.876,
+ "t1": 86.534,
+ "voiceId": "dir_right",
+ "expected": "右!",
+ "heard": "娘。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 86.534,
+ "t1": 86.66,
+ "voiceId": "hit_last",
+ "expected": "船体只剩最后一次了,小心!",
+ "heard": "啊。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 88.692,
+ "t1": 89.088,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "我。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 91.276,
+ "t1": 91.46,
+ "voiceId": "shield_block",
+ "expected": "护盾挡下了撞击。",
+ "heard": "。",
+ "similarity": 0,
+ "verdict": "TRUNCATED"
+ },
+ {
+ "t0": 91.46,
+ "t1": 91.851,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "这。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 94.182,
+ "t1": 94.568,
+ "voiceId": "dir_left",
+ "expected": "左!",
+ "heard": "说。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 96.858,
+ "t1": 97.238,
+ "voiceId": "dir_down",
+ "expected": "下!",
+ "heard": "在。",
+ "similarity": 0,
+ "verdict": "MISMATCH"
+ },
+ {
+ "t0": 2.346,
+ "t1": 8.283,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 25.866,
+ "t1": 29.71,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 32.227,
+ "t1": 35.849,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 61.25,
+ "t1": 66.844,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 72.488,
+ "t1": 76.102,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 76.504,
+ "t1": 80.103,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 86.66,
+ "t1": 88.692,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 89.088,
+ "t1": 91.276,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 91.851,
+ "t1": 94.182,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ },
+ {
+ "t0": 94.568,
+ "t1": 96.858,
+ "voiceId": null,
+ "expected": null,
+ "heard": "",
+ "similarity": null,
+ "verdict": "SFX_BGM_ONLY"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/research/space-polish/round1/p1-blind.md b/research/space-polish/round1/p1-blind.md
new file mode 100644
index 00000000..0d88493c
--- /dev/null
+++ b/research/space-polish/round1/p1-blind.md
@@ -0,0 +1,32 @@
+# P1 视障资深玩家评审:《盲航》(space polish 取证轮 R1)
+
+> 评审依据:research/space-polish/round1/live-A-transcript.md(认真新手局,ta 0-380s)+ live-B-transcript.md(乱按压力局)+ sfx-spectrum-analysis.txt(客观频谱)。
+> 刺耳判定说明:我听不到混音文件,刺耳结论来自客观数据(能量分布/真峰值)+ 出现频率推算,并按"如果这声音在我 75 档耳朵里"代入;与三位玩家评审交叉对账后四席一致。
+
+### 盲航
+- 状态感知:2/5 —— 保护期里我每秒都知道自己在哪(训练护盾接住必报方位,A 局 t+97-109),但两段时间我完全失聪:**①保护期结束前后**(A 局 t+151.13-163.13):protect_end 被前一颗的 protect_up 顶得只剩 3.5s/5.4s(sim 0.52,transcript 行 271-283),紧接着 hit_left、hit_down 两条归因**零毫秒被杀**(行 287-307,vstart 与 kill 同时间戳)——8 秒内挨满三撞坠毁,我至死不知道陨石从哪来,也不知道保护期什么时候没的(我自己 t+301.5 一个习惯单击还把 protect_end 掐在 1 秒处,行 552-563)。**②保护期内 protect_* 长句互杀**:6.96s 的句子对 4.0s 的刷怪间隔,每句都被下一颗截到 4.0s(行 367-378 等 7 连 TRUNCATED),听到的是同一句话的七个开头。护盾经济也是糊涂账:充能完毕(shield_ready)被我自己的单击跳过(t+300.2 行 548 附近)、护盾格挡句 shield_block 从未完整听过。
+- 下一步明确性:4/5 —— 演练一句一练、做错当场重教(A 局 t+19.5 drill_retry_left 及时),方向呼喊与呼啸同窗(round4 改口是对的);菜单口令规整(t+371.8 paused→menu_main→menu_resume 全 OK)。扣 1 分在:保护期结束后刷怪不给人喘息, attributions 听不全,"下一颗从哪来"全靠猜。
+- 愿意继续玩:是 —— 同向闪避的手感是我要的反射直达,但前提是把"刚出狱三秒连死还不知缘由"修了。
+- P0 问题:保护期结束窗口(**状态盲区**):protect_end 永远听不全 + 前 8 秒归因链被 spawn 呼喊零毫秒顶断(A 局 t+151-163、300-310 两轮复现),"我在哪/还剩几条命/为什么死"三连问无答案。这是纯听觉玩家的死线。
+- 刺耳清单(按暴露量排序,数据见 sfx-spectrum-analysis.txt):
+ 1. `sfx/alarm`:≥3kHz 能量 82.3%、≥5kHz 63.9%、质心 7580Hz、峰值 16kHz——每颗陨石响两遍、全程 4s 间隔连刷,是第一刺耳源;
+ 2. `sfx/dodge`:真峰值 -2.30dBFS(超 -3 标准)、≥3kHz 63.6%——每次闪避都响,高频嘶声贴耳;
+ 3. `sfx/shield_block`:真峰值 -2.60dBFS、≥3kHz 52.2%——保护期每 4s 一响(比 alarm 还密);
+ 4. `sfx/boost`:真峰值 -2.70dBFS、≥3kHz 53.0%。
+ `whoosh_*`/`crash`/`shield`/`hit`/`whoosh_down` 频谱干净(质心 170-530Hz),不刺耳。
+- 建议(按对"我愿意玩下去"的影响排序):
+ 1. P0 修复归因链:保护期结束后前 N 秒,spawn 的 dir_* 呼喊不得零毫秒顶断 hit_*/protect_end(排队或让呼喊降级);至少保证"最后一命"前后的信息链完整。
+ 2. alarm/dodge/shield_block/boost 四件重合成或低通+降档:真峰值全部回到 ≤-3dBFS,≥5kHz 能量压到 15% 以下;alarm 是全程最高暴露,优先。
+ 3. 护盾/加速冷却与层数上状态键可查(space 目前没有任何 status key 手势,radio 的上滑锚这里缺席);拒绝已有回音(护盾冷却双击有 feat_shield_done,合格),加速冷却的拒绝是**全静默**(代码无 deny 路径),补上。
+
+#### 听觉惯例符合度(逐条核对我的特别检查项)
+- 语音可打断:过但反噬。单击跳句机制本身干净,但对局期我单击的动机常是"加速",结果把 protect_end/shield_ready 这种状态句掐了(A 局 t+300-301)——可打断的语义需要区分"旁白可跳"与"状态句不可误杀"。
+- 语音可重听:半过。菜单 help_recap 可重听(B 局 t+44.9 起),但被顶断的 hit_* 归因没有任何途径重听。
+- 等待有无声:过。BGM engine 不断,无死寂。
+- 失败可归因:**不过**。三次撞击中只有一次 hit_last 完整听到(A 局 t+159.9 sim 0.87),两条方位归因零毫秒(行 287/305)——本项是本作死穴。
+- 菜单列表导航规整:过。口令一致(menu_main 勘误版)、循环三项都实测到(A 局 t+371-378),关菜单恢复有 800ms 冷静期兜底。
+- 提示永不逐字重复:不过。protect_* 在保护期每 4s 逐字重播同一句开头 7+ 次(行 367-473),既重复又截断,双重噪音。
+- 账目真实:半过。结算分档句(time_3/dodge_1)与我真实存活/躲避对得上,但"护盾挡了几次/还剩几条命"中途无法查证。
+- 语速上限/长按快进:未验证(会话内无长按)。
+- status key:**缺席**。上滑在对局期无任何查询语义,只有我这个人设最需要的那件锚没有。
+- 双击确认(菜单约定):过。菜单内双击确认 resume 实测 OK。
diff --git a/research/space-polish/round1/p2-student.md b/research/space-polish/round1/p2-student.md
new file mode 100644
index 00000000..ee7d9254
--- /dev/null
+++ b/research/space-polish/round1/p2-student.md
@@ -0,0 +1,18 @@
+# P2 时间充裕的大学生评审:《盲航》(space polish 取证轮 R1)
+
+> 评审依据:同 round1 三份材料(live-A / live-B / 频谱表)。我按"躺床戴耳机 23:30"代入,刺耳=物理刺激+精神刺激一起算。
+
+### 盲航
+- 状态感知:2.5/5 —— 头 60 秒很踏实(演练四步全练过、保护期撞了也不掉血还有讲解),但**60 秒整那一刻我直接懵掉**:protect_end 刚起个头就被撞车语音冲掉(A 局 t+151.6 行 271-283),接下来 8 秒我连吃三下,"左边撞上的""下面撞上的"两条归因全是零毫秒残影(行 287-307),然后直接结算"超过一分钟,合格的飞行员"——我是合格了,可我连怎么死的都不知道,这夸奖听着像嘲讽。还有:我在保护期每次撞上来的讲解句(protect_*)都被下一颗陨石掐在同一个字上(6.9s 的句子永远只听 4s,行 367-378),像有人反复按掉我的弹幕。
+- 下一步明确性:4/5 —— 教学节奏好,一句一练、做错了当场重教不骂街(A 局 t+19.5);方向呼喊"左!/右!"跟呼啸同窗,反应窗口够。扣 1 分:加速/护盾教完之后没有任何"现在能用/还不能用"的即时信号,我双击没反应的时候(冷却中)要等 4 秒才有一句"护盾展开后会自动充能"——急性子的我早连按五次了,后四次全是无效手势零反馈(B 局 70+ 次乱按里大量此类静默)。
+- 愿意继续玩:勉强 —— 手感成立、结算有钩子("新纪录!"我破纪录那下确实爽,A 局 t+167.8),但每次死都死于"信息没送到"而不是"我菜",挫败感不对味。
+- P0 问题:死亡归因不可达(同 P1,A 局 t+151-163 与 t+300-310 两轮复现);加速冷却单击**全静默**(代码里没有 deny 路径,我的单击习惯=跳句或空气);挥空/滑错方向**全静默**(A 局 t+19.4 我滑慢半拍,什么声音都没有,还是靠下一句重教才知道刚才算失败)。
+- 刺耳清单(耳机党,按折磨度排序):
+ 1. `sfx/alarm`——16kHz 峰、63.9% 能量在 5kHz 以上,一颗陨石两遍、全程无休,10 分钟局等于几百次指甲刮板;
+ 2. `sfx/dodge`——每次成功闪避的"奖励音"却是 -2.30dBFS 真峰值+63.6% 高频的嘶啦声,奖励变惩罚;
+ 3. `sfx/shield_block`(保护期每 4s 一响,最密)与 `sfx/boost`(真峰值都超标)。
+ whoosh 四件是舒服的,尤其 whoosh_up 跟教学说的"又尖又高"完全对得上号(频谱其实不刺,质心 528Hz,是"高"不是"刺")。
+- 建议:
+ 1. 保护期结束给 3 秒"交接仪式":刷怪暂停+protect_end 独占播完,这是整局的情绪转折点,现在被陨石轰隆隆直接碾过。
+ 2. alarm 换柔和一点的双音(保方位保警示但去 16kHz 毛刺),dodge 改成中频"咻-叮"而不是高频嘶声—— reward 声音要让人想再听一次。
+ 3. 所有无效手势(冷却中/滑错/挥空)给最小耳标或震动,别让我怀疑耳机坏了。
diff --git a/research/space-polish/round1/p3-office.md b/research/space-polish/round1/p3-office.md
new file mode 100644
index 00000000..38e15c85
--- /dev/null
+++ b/research/space-polish/round1/p3-office.md
@@ -0,0 +1,17 @@
+# P3 时间紧张的白领评审:《盲航》(space polish 取证轮 R1)
+
+> 评审依据:同 round1 三份材料。我按"地铁 25 分钟、单手持机、随时被打断"代入;嘈杂环境是我的主场也是它的考场。
+
+### 盲航
+- 状态感知:2/5 —— 单局 60-90 秒的长度对我刚刚好,但**打断恢复是零分**:这游戏没有任何"查状态"手势(上滑在菜单里是帮助、对局里什么都不是),我接个电话回来,护盾在不在、冷却几秒、还剩几条命、保护期过没过——全靠回忆。最坏的是保护期结束那 8 秒死亡窗(A 局 t+151-163):protect_end 听不全、两条归因零毫秒、直接结算,我如果正好在进站刷卡,回来就是一句"单击再飞一次",完全接不上。菜单倒是能暂停(A 局 t+371.8 口令规整),可我得**知道**要先暂停才行——没人告诉过我对局能暂停。
+- 下一步明确性:3.5/5 —— 单手四向滑+点按,盲操满分;方向呼喊与呼啸同窗,嘈杂车厢里 alarm 的高频反而帮我定位(刺耳但有功能)。但"现在能不能双击护盾"无从得知:冷却 15s 里没有计时线索,充能完毕的 shield_ready 会被我自己的单击跳过(A 局 t+300.2),或者被陨石讲解顶掉。
+- 愿意继续玩:是(当通勤小品)—— 但只敢在保护期里玩,保护期后"死得不明不白"让我不想在站立拥挤时开第二把。
+- P0 问题:无 status key(全局唯一没有查询锚的游戏,同 P1);保护期结束信息链断裂(同 P1,A 局 t+151-163);被打断回来零落位信息。
+- 刺耳清单(地铁=高噪环境,我的阈值比宿舍党宽容,但有两个顶不住):
+ 1. `sfx/alarm`——5kHz 以上 63.9% 的能量是它能在地铁里穿出来的原因,我不主张删,但 16kHz 毛刺在耳道里像针,建议低通到 8kHz 内;
+ 2. `sfx/dodge`——高频嘶声(-2.30dBFS)在广播报站声里会跟金属啸叫撞车,听着像耳机破音;
+ 3. `sfx/shield_block`/`sfx/boost` 真峰值超标,连着 BGM 容易糊成一团。
+- 建议(按"下周还玩不玩"排序):
+ 1. 给一个 status key(比如对局期上滑):播报"护盾就绪/充能中、保护期剩几秒、船体几条"三件套,打断恢复一句话接上。
+ 2. 保护期结束独占播完,别跟陨石抢麦——我 25 分钟里只有这一秒最需要听清。
+ 3. alarm 保穿透但削毛刺;无效手势(冷却拒绝/滑空)给短震动即可,语音免了(车厢里听不清反而乱)。
diff --git a/research/space-polish/round1/p4-worker.md b/research/space-polish/round1/p4-worker.md
new file mode 100644
index 00000000..cf8c5431
--- /dev/null
+++ b/research/space-polish/round1/p4-worker.md
@@ -0,0 +1,17 @@
+# P4 疲惫的工人评审:《盲航》(space polish 取证轮 R1)
+
+> 评审依据:同 round1 三份材料。我按"收工 21 点、宿舍外放小音量、反应不快"代入。规则最好一遍懂,声音别太炸,做错了别骂我。
+
+### 盲航
+- 状态感知:2.5/5 —— 演练够耐心,四个方向一个一个教、教完还让我亲手试(这点我谢它),保护期里撞了也有人马上告诉我"那颗在左边,向左滑"(A 局 t+97-109)——虽然这句话老被下一颗掐断(行 367-378,每 4 秒重新开头一遍,我跟不上这速度)。但 60 秒以后我就掉线了:那句"训练护盾关闭"永远听不完整(t+151.6 被顶得只剩半句),紧跟着挨两下、两句"从哪撞的"都是零毫秒(行 287-307),然后就听见"船体只剩最后一次了"——**我都不知道前两次是怎么没的**,它就告诉我最后一次了。这就像我们工地:出了事不先说哪块板子掉的,直接宣布罚款。
+- 下一步明确性:4/5 —— 每颗陨石来了有喊"左!右!上!下!",跟着滑就行,简单;做错重教也不骂人("没关系,跟着我,我们继续"A 局 t+27.4 我听了两遍,暖心)。扣 1 分:我双击开护盾如果没充好,要等一会儿才有回音(4 秒去抖),头几秒我以为手机卡了;单击加速没反应的时候(冷却中/话没说完)更是连回音都没有。
+- 愿意继续玩:是 —— 比刷视频强,头一分钟有人手把手教,输了也不会被骂。但夜里玩那个警报音太炸(见下),舍友会嫌。
+- P0 问题:死亡归因听不到(同 P1/P2,A 局两轮复现 t+151-163、t+300-310);保护期结束这个"要变天了"的信号传达失败——我这种反应慢的,最需要提前量,现在反而是信息最乱的时刻。
+- 刺耳清单(小音量外放+疲惫耳朵,最怕突然的尖声):
+ 1. `sfx/alarm`——16kHz 的尖峰,小音量外放下是"吱——"的电流感,每颗陨石两遍,整局没停过;
+ 2. `sfx/crash` 不刺(低频,行得通),但 `sfx/hit`(30.7% ≥3kHz)撞上那一下跟 alarm 连着来,惊得我心跳;
+ 3. `sfx/dodge`/`sfx/shield_block` 高频嘶声,音量开小了发"丝丝"的破音感(真峰值 -2.3/-2.6dBFS 超标的后果)。
+- 建议:
+ 1. 保护期结束前后,说话的时候别让陨石抢话——我耳朵慢,给我三秒清静听"接下来靠你自己了"。
+ 2. 警报音换闷一点的"嘟嘟",别用尖的,夜里吓人;撞上的动静也沉一点。
+ 3. 我手势做错了(滑错方向、滑晚了、按快了)的时候,给个轻轻的震动告诉我"收到了但没用",别一点动静没有,我会一直重复同一个错。
diff --git a/research/space-polish/round1/sfx-spectrum-analysis.txt b/research/space-polish/round1/sfx-spectrum-analysis.txt
new file mode 100644
index 00000000..35d26ba5
--- /dev/null
+++ b/research/space-polish/round1/sfx-spectrum-analysis.txt
@@ -0,0 +1,12 @@
+id dur TP dBFS DC %>3kHz %>5kHz centroid maxkHz flags
+alarm 1.00 -4.00 -0.00005 82.3 63.9 7580 16.02 5k+高 3k+高
+boost 1.80 -2.70 -0.00018 53.0 43.9 5637 0.17 TP>-3! 5k+高 3k+高
+crash 3.00 -3.00 0.00069 1.5 1.1 170 0.03
+dodge 1.20 -2.30 0.00040 63.6 50.2 6330 0.52 TP>-3! 5k+高 3k+高
+hit 1.50 -3.80 -0.00001 30.7 16.7 2351 0.50 5k+高
+shield 1.50 -2.90 0.00011 1.2 0.5 499 0.50 TP>-3!
+shield_block 1.50 -2.60 0.00014 52.2 40.2 4692 0.01 TP>-3! 5k+高 3k+高
+whoosh_down 2.50 -3.00 0.00016 0.2 0.1 211 0.25
+whoosh_left 2.50 -3.20 0.00004 0.1 0.0 188 0.16
+whoosh_right 2.50 -3.20 0.00004 0.1 0.0 188 0.16
+whoosh_up 2.50 -3.20 -0.00017 0.5 0.1 528 0.40
diff --git a/research/space-polish/round1/space_sfx_analysis.json b/research/space-polish/round1/space_sfx_analysis.json
new file mode 100644
index 00000000..34a0932b
--- /dev/null
+++ b/research/space-polish/round1/space_sfx_analysis.json
@@ -0,0 +1,101 @@
+{
+ "alarm": {
+ "dur": 1.0,
+ "tp": -4.0,
+ "dc": -5e-05,
+ "e3": 82.3,
+ "e5": 63.9,
+ "centroid": 7580,
+ "maxkHz": 16.02
+ },
+ "boost": {
+ "dur": 1.8,
+ "tp": -2.7,
+ "dc": -0.00018,
+ "e3": 53.0,
+ "e5": 43.9,
+ "centroid": 5637,
+ "maxkHz": 0.17
+ },
+ "crash": {
+ "dur": 3.0,
+ "tp": -3.0,
+ "dc": 0.00069,
+ "e3": 1.5,
+ "e5": 1.1,
+ "centroid": 170,
+ "maxkHz": 0.03
+ },
+ "dodge": {
+ "dur": 1.2,
+ "tp": -2.3,
+ "dc": 0.0004,
+ "e3": 63.6,
+ "e5": 50.2,
+ "centroid": 6330,
+ "maxkHz": 0.52
+ },
+ "hit": {
+ "dur": 1.5,
+ "tp": -3.8,
+ "dc": -1e-05,
+ "e3": 30.7,
+ "e5": 16.7,
+ "centroid": 2351,
+ "maxkHz": 0.5
+ },
+ "shield": {
+ "dur": 1.5,
+ "tp": -2.9,
+ "dc": 0.00011,
+ "e3": 1.2,
+ "e5": 0.5,
+ "centroid": 499,
+ "maxkHz": 0.5
+ },
+ "shield_block": {
+ "dur": 1.5,
+ "tp": -2.6,
+ "dc": 0.00014,
+ "e3": 52.2,
+ "e5": 40.2,
+ "centroid": 4692,
+ "maxkHz": 0.01
+ },
+ "whoosh_down": {
+ "dur": 2.5,
+ "tp": -3.0,
+ "dc": 0.00016,
+ "e3": 0.2,
+ "e5": 0.1,
+ "centroid": 211,
+ "maxkHz": 0.25
+ },
+ "whoosh_left": {
+ "dur": 2.5,
+ "tp": -3.2,
+ "dc": 4e-05,
+ "e3": 0.1,
+ "e5": 0.0,
+ "centroid": 188,
+ "maxkHz": 0.16
+ },
+ "whoosh_right": {
+ "dur": 2.5,
+ "tp": -3.2,
+ "dc": 4e-05,
+ "e3": 0.1,
+ "e5": 0.0,
+ "centroid": 188,
+ "maxkHz": 0.16
+ },
+ "whoosh_up": {
+ "dur": 2.5,
+ "tp": -3.2,
+ "dc": -0.00017,
+ "e3": 0.5,
+ "e5": 0.1,
+ "centroid": 528,
+ "maxkHz": 0.4
+ }
+}
\ No newline at end of file
diff --git a/research/space-polish/round2/fix-evidence.md b/research/space-polish/round2/fix-evidence.md
new file mode 100644
index 00000000..bd26b72f
--- /dev/null
+++ b/research/space-polish/round2/fix-evidence.md
@@ -0,0 +1,106 @@
+# 修复清单与逐条证据(space polish R5,round2)
+
+取证轮结论 → 编号修复 → 验证证据。设计依据全文见 docs/design/04-space-rebuild.md「修订记录 R5」节。
+
+## F1 刺耳音效重合成(P0)
+
+**嫌疑清单(round1 客观数据,research/space-polish/round1/sfx-spectrum-analysis.txt)**
+
+| id | 前真峰值 | 前≥3kHz | 前≥5kHz | 前质心 | 暴露频率 |
+|---|---|---|---|---|---|
+| alarm | -4.00 | 82.3% | 63.9% | 7580Hz(峰 16kHz) | 每颗陨石 2 遍、全程 4s 间隔 |
+| dodge | **-2.30** | 63.6% | 50.2% | 6330Hz | 每次闪避 |
+| shield_block | **-2.60** | 52.2% | 40.2% | 4692Hz | 保护期每 4s(比 alarm 还密) |
+| boost | **-2.70** | 53.0% | 43.9% | 5637Hz | 每次加速 |
+| shield | **-2.90** | 1.2% | 0.5% | 499Hz | 峰值超标 |
+
+**修复**:`tools/gen_space_syn.py`(新建,参照 gen_cipher_syn.py 先例)程序合成重制 5 件 + 新增 whiff。
+低谐波设计:alarm=700/560Hz 电子双音、dodge=500→2100Hz 气声扫频、shield_block=250-2300Hz 电涟、
+boost=55-93Hz 低哼+暗频推进、shield=320→980Hz shimmer。one-shot QC 全过(去直流+8ms cos²+
+编码后 ebur128 真峰值 ≤-3dBFS + 解码回读 ≥3kHz 能量)。
+
+**修后数据(round2/sfx-spectrum-after.txt,与修前同口径)**
+
+| id | 后真峰值 | 后≥3kHz | 后≥5kHz | 后质心 |
+|---|---|---|---|---|
+| alarm | -3.50 | 0.0% | 0.0% | 593Hz(前 7580) |
+| dodge | -3.90 | 0.0% | 0.0% | 1090Hz(前 6330) |
+| shield_block | -3.90 | 0.0% | 0.0% | 1271Hz(前 4692) |
+| boost | -3.60 | 0.0% | 0.0% | 114Hz |
+| shield | -3.40 | 0.0% | 0.0% | 784Hz |
+| whiff(新) | -4.80 | 0.0% | 0.0% | 461Hz |
+
+四席人设评审刺耳清单(alarm/dodge/shield_block/boost)全部消除;whoosh_*/crash/hit 修前即干净,未动。
+
+## F2 保护期结束死亡窗:归因防顶断 replay(P0)
+
+**修前证据(round1 live-A transcript 行 261-331,ta 151.13-163.13)**:裸飞期逼近 4.0s=刷怪 4.0s,
+撞击与下一颗 spawn 同窗 → `hit_left`/`hit_down` vstart 与 kill 同时间戳(**零毫秒归因**),
+protect_end 被顶到 0.5-3.5s,8 秒三连撞至死不知方位。TRUNCATED 占比 39%(38/97)。
+
+**修复**(web/space/game.js):呼喊生存优先裁定不变;`hit_`/`protect_end` 起播经 `_defendVoice`
+登记,被顶断时登记残留,呼喊播完 onComplete → `_replayDefended` queue 补 replay(hit_last 排其后,先因后果)。
+
+**修后证据(round2 live-A events,live-A-voice-timeline.txt)**:同窗口复现两轮——
+- 轮 1(ta 160.3-168.3):hit_left 零毫秒被杀 → 160.79 **replay 完整播 3.5s**;
+ hit_right 零毫秒被杀 → 164.78 **replay 完整播 3.5s**(两轮各自闭环)。
+- 轮 2(ta 253.9):hit_right 被杀 → 254.38 replay 播完 257.9。
+- protect_end 被顶断 → replay 补播(B 局 ta 64.69 第二轮 vstart)。
+- playtest.mjs 新增断言:登记残留→补 replay→replay 播完接 hit_last→4 条全绿(S1 172/172)。
+
+## F3 保护期 protect_* 七连截断 → 去重
+
+**修前**:6.96s 教学句对 4.0s 刷怪间隔,live-A 保护期 7 连 TRUNCATED(transcript 行 367-473),
+每句都截在同一位置、同一句话重复 7 遍。
+**修复**:上一句 protect_ 在播时新吸收只发 shield_block 音 + WARNING 震(`_protectSaying` 去重)。
+**修后**:live-A' ta 102.3 protect_up **sim=1.0 完整播出**(修前同句 sim 0.33-0.63);
+110.3 第二次吸收在播句刚结束时正常起新句。playtest 去重断言 2 条绿。
+
+## F4 状态盲区:protect_soon 50s 预告
+
+**修前**:保护期结束无任何提前量,P4(反应慢)/P3(打断恢复)最受伤的时刻恰是信息最乱的时刻。
+**修复**:开局 50s 播报新句「训练护盾还剩十秒。」(`protect_soon`,queue 不顶句,打断由
+_rearmRunTimers 补播)。
+**修后**:live-A' ta 149.8 sim=1.0 OK(ASR 完整识别);live-B' ta 53.8 OK。
+playtest 断言绿。对局期 status key 维持 00 §5 豁免表裁定(不新增手势,见 04-space-rebuild R5 末条)。
+
+## F5 动作反馈盲区:加速冷却拒绝
+
+**修前**:冷却中单击全静默(护盾拒绝有回音、加速没有);P1/P2/P4 三席点名。
+**修复**:`_deny(now, voiceId)` 共用 4s 去抖(护盾拒绝同路径、原句不变);
+新句 `boost_not_ready`「引擎还在冷却,稍等一下。」+ HEARTBEAT 震。
+**修后**:playtest 4 条断言绿(拒绝播报/不重置加速/HEARTBEAT/去抖);live-B' 资产实测加载、
+护盾侧拒绝 echo 在乱按下反复兑现(feat_shield_done ×6 vstart)。
+
+## F6 激活确认震动(兑现 04 §5 旧承诺)
+
+**修前**:boost/shield 激活(对局期+feature 期)均无 CONFIRM 震,文档 §5 承诺未兑现。
+**修复**:4 处激活点补 `vibrate('confirm')`。playtest 断言 2 条绿(delta 计数)。
+
+## F7 挥空/滑错方向反馈
+
+**修前**:无效手势与成功闪避同静默(dodge 音只在判定时响),玩家怀疑输入失灵。
+**修复**:playing 期滑向无悬置陨石方向 → `sfx/whiff` 轻叹(0.55 音量;引擎 swipe 震动已有"收到")。
+**修后**:live-B' 乱按中 whiff 实测触发 3+ 次(events 28.9/33.5 等);playtest 断言绿。
+
+## 验证数字汇总
+
+- web/space/test/playtest.mjs:**172 通过 / 0 失败**(新增 R5 断言 15 条)
+- web/harness/guide.test.mjs:**122 通过 / 0 失败**
+- tools/check_all_assets.py:**全项目绿**(space 184 文件/各 61 id,新增 2 句 ×2 性别 ×2 格式)
+- 回归:其余 14 款游戏 playtest 全绿(abyss/bridge/cipher/detective/dungeon/escape/hunt/keeper/radio/rhythm/rpg/simon/storyline/teahouse)
+- 刺耳复测:F1 表(全部 ≤-3.4dBFS、≥3kHz 0%)
+- live 复跑(8141):A' 两轮保护期结束窗归因 replay 全闭环 + protect_soon OK ×2 局;
+ B' 零 console.error,whiff/护盾拒绝/protect 链全部实测触发
+
+## 遗留清单
+
+1. `voice/shield_block`(格挡确认句)不在防顶断登记内,保护期吸收高峰时仍可能被呼喊顶断——
+ 有 shield_block 音效+WARNING 震落位,残损可接受;如后续投诉再纳入登记。
+2. live 复跑因 harness 手势派发延迟(峰值 46s,listen ASR 竞争)未能实机验证 boost_not_ready
+ 语音出声(资产加载、去抖路径、whiff 均实测;boost 拒绝语义由 playtest 覆盖)。建议真机人耳复测。
+3. gd_last_life(向导层"撑住"句)仍可能被后续呼喊顶断(guide.error 无 onComplete 钩子,
+ 引擎不可改);优先级低于归因句,未纳入本轮。
+4. `hit`(受击音)≥3kHz 30.7% 未重合成——四席评审均未点名(低频主导的撞击感成立),保留。
+5. gen_voice_dual.py --check 对本机缺旧 space staging wav 报「缺 male/female」59 条——
+ 环境存量问题(旧 wav 未随仓库保留),与本轮无关;新句两性时长健康(2.48/1.52s、3.28/3.04s)。
diff --git a/research/space-polish/round2/live-A-events.jsonl b/research/space-polish/round2/live-A-events.jsonl
new file mode 100644
index 00000000..9dfba0e0
--- /dev/null
+++ b/research/space-polish/round2/live-A-events.jsonl
@@ -0,0 +1,425 @@
+{"ev":"probe_ready","t":46.400000005960464,"ta":null}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":6049.199999988079,"ta":-0.147}
+{"ev":"recstart","mime":"audio/webm;codecs=opus","t":6195.9000000059605,"ta":0}
+{"ev":"fetch","url":"audio/sfx/whoosh_left.ogg","status":200,"ok":true,"ms":13,"t":6209,"ta":0.013}
+{"ev":"fetch","url":"audio/sfx/whoosh_right.ogg","status":200,"ok":true,"ms":12,"t":6209.199999988079,"ta":0.013}
+{"ev":"fetch","url":"audio/sfx/whoosh_up.ogg","status":200,"ok":true,"ms":14,"t":6210.9000000059605,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/alarm.ogg","status":200,"ok":true,"ms":16,"t":6213.199999988079,"ta":0.017}
+{"ev":"fetch","url":"audio/sfx/whoosh_down.ogg","status":200,"ok":true,"ms":19,"t":6215.699999988079,"ta":0.02}
+{"ev":"fetch","url":"audio/sfx/boost.ogg","status":200,"ok":true,"ms":21,"t":6217.9000000059605,"ta":0.022}
+{"ev":"fetch","url":"audio/sfx/shield.ogg","status":200,"ok":true,"ms":26,"t":6223.199999988079,"ta":0.027}
+{"ev":"fetch","url":"audio/sfx/shield_block.ogg","status":200,"ok":true,"ms":27,"t":6223.9000000059605,"ta":0.028}
+{"ev":"fetch","url":"audio/sfx/dodge.ogg","status":200,"ok":true,"ms":28,"t":6225.5,"ta":0.03}
+{"ev":"fetch","url":"audio/sfx/hit.ogg","status":200,"ok":true,"ms":29,"t":6226.199999988079,"ta":0.03}
+{"ev":"fetch","url":"audio/sfx/crash.ogg","status":200,"ok":true,"ms":30,"t":6227.199999988079,"ta":0.031}
+{"ev":"fetch","url":"audio/sfx/whiff.ogg","status":200,"ok":true,"ms":32,"t":6229.199999988079,"ta":0.033}
+{"ev":"fetch","url":"audio/voice/male/dir_left.ogg","status":200,"ok":true,"ms":34,"t":6231.9000000059605,"ta":0.036}
+{"ev":"fetch","url":"audio/voice/male/dir_right.ogg","status":200,"ok":true,"ms":37,"t":6234.5999999940395,"ta":0.039}
+{"ev":"fetch","url":"audio/voice/male/dir_up.ogg","status":200,"ok":true,"ms":37,"t":6235.199999988079,"ta":0.039}
+{"ev":"fetch","url":"audio/voice/male/dir_down.ogg","status":200,"ok":true,"ms":41,"t":6239.5999999940395,"ta":0.044}
+{"ev":"fetch","url":"audio/voice/male/hit_right.ogg","status":200,"ok":true,"ms":42,"t":6240.800000011921,"ta":0.045}
+{"ev":"fetch","url":"audio/voice/male/hit_left.ogg","status":200,"ok":true,"ms":46,"t":6244.300000011921,"ta":0.048}
+{"ev":"fetch","url":"audio/voice/male/hit_up.ogg","status":200,"ok":true,"ms":51,"t":6249.4000000059605,"ta":0.054}
+{"ev":"fetch","url":"audio/voice/male/hit_down.ogg","status":200,"ok":true,"ms":55,"t":6253.199999988079,"ta":0.057}
+{"ev":"fetch","url":"audio/voice/male/hit_last.ogg","status":200,"ok":true,"ms":56,"t":6254.4000000059605,"ta":0.059}
+{"ev":"fetch","url":"audio/voice/male/protect_left.ogg","status":200,"ok":true,"ms":57,"t":6255.5999999940395,"ta":0.06}
+{"ev":"fetch","url":"audio/voice/male/protect_right.ogg","status":200,"ok":true,"ms":57,"t":6256.0999999940395,"ta":0.06}
+{"ev":"fetch","url":"audio/voice/male/protect_up.ogg","status":200,"ok":true,"ms":59,"t":6257.9000000059605,"ta":0.062}
+{"ev":"fetch","url":"audio/voice/male/protect_down.ogg","status":200,"ok":true,"ms":62,"t":6260.699999988079,"ta":0.065}
+{"ev":"fetch","url":"audio/voice/male/protect_soon.ogg","status":200,"ok":true,"ms":64,"t":6262.800000011921,"ta":0.067}
+{"ev":"fetch","url":"audio/voice/male/protect_end.ogg","status":200,"ok":true,"ms":65,"t":6263.4000000059605,"ta":0.068}
+{"ev":"fetch","url":"audio/voice/male/shield_ready.ogg","status":200,"ok":true,"ms":70,"t":6268.9000000059605,"ta":0.073}
+{"ev":"fetch","url":"audio/voice/male/shield_block.ogg","status":200,"ok":true,"ms":74,"t":6273.199999988079,"ta":0.077}
+{"ev":"fetch","url":"audio/voice/male/feat_boost.ogg","status":200,"ok":true,"ms":79,"t":6278.4000000059605,"ta":0.083}
+{"ev":"fetch","url":"audio/voice/male/feat_boost_done.ogg","status":200,"ok":true,"ms":86,"t":6285,"ta":0.089}
+{"ev":"fetch","url":"audio/voice/male/feat_shield.ogg","status":200,"ok":true,"ms":87,"t":6286,"ta":0.09}
+{"ev":"fetch","url":"audio/voice/male/boost_not_ready.ogg","status":200,"ok":true,"ms":87,"t":6286.800000011921,"ta":0.091}
+{"ev":"fetch","url":"audio/voice/male/feat_shield_done.ogg","status":200,"ok":true,"ms":90,"t":6289.4000000059605,"ta":0.094}
+{"ev":"fetch","url":"audio/voice/male/ms_10.ogg","status":200,"ok":true,"ms":94,"t":6293.699999988079,"ta":0.098}
+{"ev":"fetch","url":"audio/voice/male/ms_25.ogg","status":200,"ok":true,"ms":104,"t":6303.5999999940395,"ta":0.108}
+{"ev":"fetch","url":"audio/voice/male/ms_50.ogg","status":200,"ok":true,"ms":107,"t":6306.5999999940395,"ta":0.111}
+{"ev":"fetch","url":"audio/voice/male/ms_100.ogg","status":200,"ok":true,"ms":107,"t":6306.5999999940395,"ta":0.111}
+{"ev":"fetch","url":"audio/voice/male/gd_hit_hint.ogg","status":200,"ok":true,"ms":107,"t":6306.699999988079,"ta":0.111}
+{"ev":"fetch","url":"audio/voice/male/gd_last_life.ogg","status":200,"ok":true,"ms":107,"t":6307.0999999940395,"ta":0.111}
+{"ev":"fetch","url":"audio/voice/male/paused.ogg","status":200,"ok":true,"ms":108,"t":6308.300000011921,"ta":0.112}
+{"ev":"fetch","url":"audio/voice/male/menu_main.ogg","status":200,"ok":true,"ms":109,"t":6309.0999999940395,"ta":0.113}
+{"ev":"fetch","url":"audio/voice/male/menu_resume.ogg","status":200,"ok":true,"ms":114,"t":6314.199999988079,"ta":0.118}
+{"ev":"fetch","url":"audio/voice/male/menu_lobby.ogg","status":200,"ok":true,"ms":115,"t":6314.9000000059605,"ta":0.119}
+{"ev":"fetch","url":"audio/voice/male/menu_help.ogg","status":200,"ok":true,"ms":116,"t":6315.699999988079,"ta":0.12}
+{"ev":"fetch","url":"audio/voice/male/help_recap.ogg","status":200,"ok":true,"ms":118,"t":6318.0999999940395,"ta":0.122}
+{"ev":"fetch","url":"audio/voice/male/settings_hint.ogg","status":200,"ok":true,"ms":119,"t":6319,"ta":0.123}
+{"ev":"fetch","url":"audio/voice/male/drill_welcome.ogg","status":200,"ok":true,"ms":119,"t":6319.300000011921,"ta":0.123}
+{"ev":"fetch","url":"audio/voice/male/second_run_ask.ogg","status":200,"ok":true,"ms":122,"t":6322.699999988079,"ta":0.127}
+{"ev":"fetch","url":"audio/voice/male/drill_rule.ogg","status":200,"ok":true,"ms":123,"t":6323.699999988079,"ta":0.128}
+{"ev":"fetch","url":"audio/voice/male/skip_hint.ogg","status":200,"ok":true,"ms":124,"t":6324.5999999940395,"ta":0.129}
+{"ev":"vstart","url":"audio/voice/male/drill_welcome.ogg","t":6327.199999988079,"dur":3.68,"ta":0.131}
+{"ev":"vend","url":"audio/voice/male/drill_welcome.ogg","t":10150.09999999404,"reason":"kill","ta":3.954}
+{"ev":"vstart","url":"audio/voice/male/skip_hint.ogg","t":10150.199999988079,"dur":1.92,"ta":3.954}
+{"ev":"vend","url":"audio/voice/male/skip_hint.ogg","t":12030.300000011921,"reason":"kill","ta":5.834}
+{"ev":"vstart","url":"audio/voice/male/drill_rule.ogg","t":12030.40000000596,"dur":3.6,"ta":5.835}
+{"ev":"vend","url":"audio/voice/male/drill_rule.ogg","t":15861.40000000596,"reason":"kill","ta":9.666}
+{"ev":"fetch","url":"audio/voice/male/drill_left.ogg","status":200,"ok":true,"ms":4,"t":15865.300000011921,"ta":9.669}
+{"ev":"vstart","url":"audio/voice/male/drill_left.ogg","t":15869.90000000596,"dur":4.96,"ta":9.674}
+{"ev":"vend","url":"audio/voice/male/drill_left.ogg","t":21085.30000001192,"reason":"kill","ta":14.889}
+{"ev":"start","t":21085.59999999404,"sid":1,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":14.89}
+{"ev":"vstart","url":"audio/voice/male/dir_left.ogg","t":21085.80000001192,"dur":0.5570975056689342,"ta":14.89}
+{"ev":"vend","url":"audio/voice/male/dir_left.ogg","t":21851.59999999404,"reason":"kill","ta":15.656}
+{"ev":"vibrate","pattern":"[60,40,60]","t":25586.09999999404,"ta":19.39}
+{"ev":"fetch","url":"audio/voice/male/drill_retry_left.ogg","status":200,"ok":true,"ms":3,"t":25589.19999998808,"ta":19.393}
+{"ev":"vstart","url":"audio/voice/male/drill_retry_left.ogg","t":25593,"dur":3.36,"ta":19.397}
+{"ev":"vend","url":"audio/voice/male/drill_retry_left.ogg","t":29049.09999999404,"reason":"kill","ta":22.853}
+{"ev":"start","t":29049.30000001192,"sid":2,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":22.853}
+{"ev":"vstart","url":"audio/voice/male/dir_left.ogg","t":29049.40000000596,"dur":0.5570975056689342,"ta":22.854}
+{"ev":"vend","url":"audio/voice/male/dir_left.ogg","t":29815.40000000596,"reason":"kill","ta":23.62}
+{"ev":"vibrate","pattern":"[60,40,60]","t":33549.40000000596,"ta":27.354}
+{"ev":"fetch","url":"audio/voice/male/drill_moveon.ogg","status":200,"ok":true,"ms":3,"t":33552.19999998808,"ta":27.356}
+{"ev":"vstart","url":"audio/voice/male/drill_moveon.ogg","t":33556.69999998808,"dur":3.84,"ta":27.361}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":37190.69999998808,"ta":30.995}
+{"ev":"vibrate","pattern":"[10]","t":37555.19999998808,"ta":31.359}
+{"ev":"vend","url":"audio/voice/male/drill_moveon.ogg","t":37663,"reason":"kill","ta":31.467}
+{"ev":"fetch","url":"audio/voice/male/drill_right.ogg","status":200,"ok":true,"ms":2,"t":37665.5,"ta":31.47}
+{"ev":"vstart","url":"audio/voice/male/drill_right.ogg","t":37668.40000000596,"dur":2.64,"ta":31.473}
+{"ev":"vend","url":"audio/voice/male/drill_right.ogg","t":40379.40000000596,"reason":"kill","ta":34.184}
+{"ev":"start","t":40379.5,"sid":3,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":34.184}
+{"ev":"vstart","url":"audio/voice/male/dir_right.ogg","t":40379.69999998808,"dur":0.39909297052154197,"ta":34.184}
+{"ev":"vend","url":"audio/voice/male/dir_right.ogg","t":40867.19999998808,"reason":"kill","ta":34.671}
+{"ev":"vibrate","pattern":"[60,40,60]","t":44879.69999998808,"ta":38.684}
+{"ev":"fetch","url":"audio/voice/male/drill_retry_right.ogg","status":200,"ok":true,"ms":3,"t":44882.69999998808,"ta":38.687}
+{"ev":"vstart","url":"audio/voice/male/drill_retry_right.ogg","t":44886.19999998808,"dur":3.2,"ta":38.69}
+{"ev":"vend","url":"audio/voice/male/drill_retry_right.ogg","t":48343.09999999404,"reason":"kill","ta":42.147}
+{"ev":"start","t":48343.19999998808,"sid":4,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":42.147}
+{"ev":"vstart","url":"audio/voice/male/dir_right.ogg","t":48343.30000001192,"dur":0.39909297052154197,"ta":42.147}
+{"ev":"vend","url":"audio/voice/male/dir_right.ogg","t":48830.69999998808,"reason":"kill","ta":42.635}
+{"ev":"vibrate","pattern":"[60,40,60]","t":52843.30000001192,"ta":46.647}
+{"ev":"vstart","url":"audio/voice/male/drill_moveon.ogg","t":52843.5,"dur":3.84,"ta":46.648}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":53960.80000001192,"ta":47.765}
+{"ev":"vibrate","pattern":"[10]","t":54320.59999999404,"ta":48.125}
+{"ev":"vend","url":"audio/voice/male/drill_moveon.ogg","t":56957.30000001192,"reason":"kill","ta":50.761}
+{"ev":"fetch","url":"audio/voice/male/drill_up.ogg","status":200,"ok":true,"ms":3,"t":56960.19999998808,"ta":50.764}
+{"ev":"vstart","url":"audio/voice/male/drill_up.ogg","t":56964.59999999404,"dur":4.24,"ta":50.769}
+{"ev":"vend","url":"audio/voice/male/drill_up.ogg","t":61531.09999999404,"reason":"kill","ta":55.335}
+{"ev":"start","t":61531.19999998808,"sid":5,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":55.335}
+{"ev":"vstart","url":"audio/voice/male/dir_up.ogg","t":61531.40000000596,"dur":0.39909297052154197,"ta":55.336}
+{"ev":"vend","url":"audio/voice/male/dir_up.ogg","t":62018.69999998808,"reason":"kill","ta":55.823}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":65727.19999998808,"ta":59.531}
+{"ev":"vibrate","pattern":"[60,40,60]","t":66031.30000001192,"ta":59.835}
+{"ev":"fetch","url":"audio/voice/male/drill_retry_up.ogg","status":200,"ok":true,"ms":3,"t":66034.90000000596,"ta":59.839}
+{"ev":"vstart","url":"audio/voice/male/drill_retry_up.ogg","t":66039.40000000596,"dur":4.08,"ta":59.844}
+{"ev":"vibrate","pattern":"[10]","t":66087.09999999404,"ta":59.891}
+{"ev":"vend","url":"audio/voice/male/drill_retry_up.ogg","t":70144.90000000596,"reason":"kill","ta":63.949}
+{"ev":"start","t":70145.09999999404,"sid":6,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":63.949}
+{"ev":"vstart","url":"audio/voice/male/dir_up.ogg","t":70145.19999998808,"dur":0.39909297052154197,"ta":63.949}
+{"ev":"vend","url":"audio/voice/male/dir_up.ogg","t":70632.40000000596,"reason":"kill","ta":64.436}
+{"ev":"vibrate","pattern":"[60,40,60]","t":74645.09999999404,"ta":68.449}
+{"ev":"vstart","url":"audio/voice/male/drill_moveon.ogg","t":74645.19999998808,"dur":3.84,"ta":68.449}
+{"ev":"vend","url":"audio/voice/male/drill_moveon.ogg","t":78758.90000000596,"reason":"kill","ta":72.563}
+{"ev":"fetch","url":"audio/voice/male/drill_down.ogg","status":200,"ok":true,"ms":3,"t":78761.80000001192,"ta":72.566}
+{"ev":"vstart","url":"audio/voice/male/drill_down.ogg","t":78766.30000001192,"dur":3.28,"ta":72.57}
+{"ev":"vend","url":"audio/voice/male/drill_down.ogg","t":82218.09999999404,"reason":"kill","ta":76.022}
+{"ev":"start","t":82218.30000001192,"sid":7,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":76.022}
+{"ev":"vstart","url":"audio/voice/male/dir_down.ogg","t":82218.30000001192,"dur":0.5570975056689342,"ta":76.022}
+{"ev":"vend","url":"audio/voice/male/dir_down.ogg","t":82984.30000001192,"reason":"kill","ta":76.788}
+{"ev":"vibrate","pattern":"[60,40,60]","t":86718.30000001192,"ta":80.522}
+{"ev":"fetch","url":"audio/voice/male/drill_retry_down.ogg","status":200,"ok":true,"ms":3,"t":86721.19999998808,"ta":80.525}
+{"ev":"vstart","url":"audio/voice/male/drill_retry_down.ogg","t":86725.40000000596,"dur":2.72,"ta":80.53}
+{"ev":"vend","url":"audio/voice/male/drill_retry_down.ogg","t":89439,"reason":"kill","ta":83.243}
+{"ev":"start","t":89439.09999999404,"sid":8,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":83.243}
+{"ev":"vstart","url":"audio/voice/male/dir_down.ogg","t":89439.19999998808,"dur":0.5570975056689342,"ta":83.243}
+{"ev":"vend","url":"audio/voice/male/dir_down.ogg","t":90205.40000000596,"reason":"kill","ta":84.01}
+{"ev":"vibrate","pattern":"[60,40,60]","t":93939.19999998808,"ta":87.743}
+{"ev":"vstart","url":"audio/voice/male/drill_moveon.ogg","t":93939.40000000596,"dur":3.84,"ta":87.744}
+{"ev":"vend","url":"audio/voice/male/drill_moveon.ogg","t":98052.90000000596,"reason":"kill","ta":91.857}
+{"ev":"fetch","url":"audio/voice/male/drill_done.ogg","status":200,"ok":true,"ms":3,"t":98055.80000001192,"ta":91.86}
+{"ev":"vstart","url":"audio/voice/male/drill_done.ogg","t":98061.09999999404,"dur":4.72,"ta":91.865}
+{"ev":"vend","url":"audio/voice/male/drill_done.ogg","t":102998.30000001192,"reason":"kill","ta":96.802}
+{"ev":"fetch","url":"audio/bgm/engine.ogg","status":200,"ok":true,"ms":3,"t":103001.59999999404,"ta":96.806}
+{"ev":"start","t":103186.30000001192,"sid":9,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":96.99}
+{"ev":"start","t":104501.19999998808,"sid":10,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":98.305}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":107501.40000000596,"ta":101.306}
+{"ev":"start","t":107501.5,"sid":11,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":101.306}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":108001.30000001192,"ta":101.805}
+{"ev":"start","t":108001.40000000596,"sid":12,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":101.806}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":108501.40000000596,"ta":102.306}
+{"ev":"start","t":108501.5,"sid":13,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":102.306}
+{"ev":"vstart","url":"audio/voice/male/protect_up.ogg","t":108501.59999999404,"dur":6.96,"ta":102.306}
+{"ev":"start","t":108502.5,"sid":14,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":102.307}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":111502.69999998808,"ta":105.307}
+{"ev":"start","t":111502.69999998808,"sid":15,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":105.307}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":112002.59999999404,"ta":105.807}
+{"ev":"start","t":112002.69999998808,"sid":16,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":105.807}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":112502.59999999404,"ta":106.307}
+{"ev":"start","t":112502.69999998808,"sid":17,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":106.307}
+{"ev":"start","t":112502.80000001192,"sid":18,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":106.307}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":115502.90000000596,"ta":109.307}
+{"ev":"start","t":115503,"sid":19,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":109.307}
+{"ev":"vend","url":"audio/voice/male/protect_up.ogg","t":115582.5,"reason":"kill","ta":109.387}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":116002.80000001192,"ta":109.807}
+{"ev":"start","t":116003,"sid":20,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":109.807}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":116502.90000000596,"ta":110.307}
+{"ev":"start","t":116503,"sid":21,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":110.307}
+{"ev":"vstart","url":"audio/voice/male/protect_up.ogg","t":116503,"dur":6.96,"ta":110.307}
+{"ev":"start","t":116503.90000000596,"sid":22,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":110.308}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":117236.40000000596,"ta":111.041}
+{"ev":"vibrate","pattern":"[10]","t":117601.40000000596,"ta":111.406}
+{"ev":"vend","url":"audio/voice/male/protect_up.ogg","t":117602,"reason":"kill","ta":111.406}
+{"ev":"vstart","url":"audio/voice/male/paused.ogg","t":117602.09999999404,"dur":1.12,"ta":111.406}
+{"ev":"fetch","url":"audio/bgm/menu.ogg","status":200,"ok":true,"ms":3,"t":117604.30000001192,"ta":111.408}
+{"ev":"start","t":117748.09999999404,"sid":23,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":111.552}
+{"ev":"stop","t":118108.30000001192,"sid":9,"when":0,"ta":111.912}
+{"ev":"vend","url":"audio/voice/male/paused.ogg","t":118740.09999999404,"reason":"kill","ta":112.544}
+{"ev":"vstart","url":"audio/voice/male/menu_main.ogg","t":118740.30000001192,"dur":4.16,"ta":112.544}
+{"ev":"vend","url":"audio/voice/male/menu_main.ogg","t":122849.69999998808,"reason":"kill","ta":116.654}
+{"ev":"vstart","url":"audio/voice/male/menu_resume.ogg","t":122849.80000001192,"dur":1.12,"ta":116.654}
+{"ev":"vend","url":"audio/voice/male/menu_resume.ogg","t":123987.5,"reason":"kill","ta":117.792}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":135595.59999999404,"ta":129.4}
+{"ev":"vibrate","pattern":"[20]","t":135844.80000001192,"ta":129.649}
+{"ev":"start","t":135845.19999998808,"sid":24,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":129.649}
+{"ev":"vstart","url":"audio/voice/male/feat_boost.ogg","t":135845.40000000596,"dur":6.48,"ta":129.649}
+{"ev":"stop","t":136405.30000001192,"sid":23,"when":0,"ta":130.209}
+{"ev":"vend","url":"audio/voice/male/feat_boost.ogg","t":142654.80000001192,"reason":"kill","ta":136.459}
+{"ev":"start","t":146345.80000001192,"sid":25,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":140.15}
+{"ev":"vstart","url":"audio/voice/male/feat_shield.ogg","t":147998.90000000596,"dur":4.4,"ta":141.803}
+{"ev":"vend","url":"audio/voice/male/feat_shield.ogg","t":152568.69999998808,"reason":"kill","ta":146.373}
+{"ev":"vstart","url":"audio/voice/male/protect_soon.ogg","t":155999,"dur":2.48,"ta":149.803}
+{"ev":"start","t":158499.19999998808,"sid":26,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":152.303}
+{"ev":"vend","url":"audio/voice/male/protect_soon.ogg","t":158721.69999998808,"reason":"kill","ta":152.526}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":159089.09999999404,"ta":152.893}
+{"ev":"vibrate","pattern":"[20]","t":159337.5,"ta":153.142}
+{"ev":"vibrate","pattern":"[20]","t":159337.5,"ta":153.142}
+{"ev":"start","t":159337.59999999404,"sid":27,"url":"audio/sfx/shield.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":153.142}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":161499.30000001192,"ta":155.303}
+{"ev":"start","t":161499.40000000596,"sid":28,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":155.304}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":161999.19999998808,"ta":155.803}
+{"ev":"start","t":161999.40000000596,"sid":29,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":155.804}
+{"ev":"vibrate","pattern":"[100]","t":162499.30000001192,"ta":156.303}
+{"ev":"start","t":162499.30000001192,"sid":30,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":156.303}
+{"ev":"vstart","url":"audio/voice/male/shield_block.ogg","t":162499.5,"dur":1.6,"ta":156.304}
+{"ev":"start","t":162499.80000001192,"sid":31,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":156.304}
+{"ev":"vend","url":"audio/voice/male/shield_block.ogg","t":162499.80000001192,"reason":"kill","ta":156.304}
+{"ev":"vstart","url":"audio/voice/male/dir_left.ogg","t":162499.80000001192,"dur":0.5570975056689342,"ta":156.304}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":162998.19999998808,"ta":156.802}
+{"ev":"vend","url":"audio/voice/male/dir_left.ogg","t":162998.19999998808,"reason":"kill","ta":156.802}
+{"ev":"vstart","url":"audio/voice/male/protect_end.ogg","t":162998.30000001192,"dur":5.36,"ta":156.802}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":165499.90000000596,"ta":159.304}
+{"ev":"start","t":165500,"sid":32,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":159.304}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":165999.90000000596,"ta":159.804}
+{"ev":"start","t":166000,"sid":33,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":159.804}
+{"ev":"vibrate","pattern":"[80]","t":166499.90000000596,"ta":160.304}
+{"ev":"start","t":166500,"sid":34,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":160.304}
+{"ev":"vend","url":"audio/voice/male/protect_end.ogg","t":166500.09999999404,"reason":"kill","ta":160.304}
+{"ev":"vstart","url":"audio/voice/male/hit_left.ogg","t":166500.09999999404,"dur":4.64,"ta":160.304}
+{"ev":"start","t":166500.90000000596,"sid":35,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":160.305}
+{"ev":"vend","url":"audio/voice/male/hit_left.ogg","t":166500.90000000596,"reason":"kill","ta":160.305}
+{"ev":"vstart","url":"audio/voice/male/dir_right.ogg","t":166500.90000000596,"dur":0.39909297052154197,"ta":160.305}
+{"ev":"vend","url":"audio/voice/male/dir_right.ogg","t":166987.09999999404,"reason":"kill","ta":160.791}
+{"ev":"vstart","url":"audio/voice/male/hit_left.ogg","t":166987.5,"dur":4.64,"ta":160.792}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":169501,"ta":163.305}
+{"ev":"start","t":169501.09999999404,"sid":36,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":163.305}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":170001,"ta":163.805}
+{"ev":"start","t":170001,"sid":37,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":163.805}
+{"ev":"vibrate","pattern":"[80]","t":170501,"ta":164.305}
+{"ev":"start","t":170501.19999998808,"sid":38,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":164.305}
+{"ev":"vend","url":"audio/voice/male/hit_left.ogg","t":170501.19999998808,"reason":"kill","ta":164.305}
+{"ev":"vstart","url":"audio/voice/male/hit_right.ogg","t":170501.30000001192,"dur":5.12,"ta":164.305}
+{"ev":"start","t":170502.09999999404,"sid":39,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":164.306}
+{"ev":"vend","url":"audio/voice/male/hit_right.ogg","t":170502.09999999404,"reason":"kill","ta":164.306}
+{"ev":"vstart","url":"audio/voice/male/dir_right.ogg","t":170502.09999999404,"dur":0.39909297052154197,"ta":164.306}
+{"ev":"vend","url":"audio/voice/male/dir_right.ogg","t":170980.59999999404,"reason":"kill","ta":164.785}
+{"ev":"vstart","url":"audio/voice/male/hit_right.ogg","t":170980.80000001192,"dur":5.12,"ta":164.785}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":173502.09999999404,"ta":167.306}
+{"ev":"start","t":173502.19999998808,"sid":40,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":167.306}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":174002.19999998808,"ta":167.806}
+{"ev":"start","t":174002.30000001192,"sid":41,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":167.806}
+{"ev":"vibrate","pattern":"[15]","t":174337.80000001192,"ta":168.142}
+{"ev":"vibrate","pattern":"[80]","t":174502.09999999404,"ta":168.306}
+{"ev":"vend","url":"audio/voice/male/hit_right.ogg","t":174502.5,"reason":"kill","ta":168.307}
+{"ev":"vibrate","pattern":"[60,40,60]","t":174502.5,"ta":168.307}
+{"ev":"start","t":174502.80000001192,"sid":42,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":168.307}
+{"ev":"start","t":174502.90000000596,"sid":43,"url":"audio/sfx/crash.ogg","layer":"sfx","dur":3,"rate":1,"loop":false,"when":0,"ta":168.307}
+{"ev":"vibrate","pattern":"[80]","t":174802.69999998808,"ta":168.607}
+{"ev":"stop","t":175162.69999998808,"sid":24,"when":0,"ta":168.967}
+{"ev":"vibrate","pattern":"[100]","t":175703,"ta":169.507}
+{"ev":"fetch","url":"audio/voice/male/time_3.ogg","status":200,"ok":true,"ms":3,"t":175705.90000000596,"ta":169.51}
+{"ev":"vstart","url":"audio/voice/male/time_3.ogg","t":175711.69999998808,"dur":3.2,"ta":169.516}
+{"ev":"vend","url":"audio/voice/male/time_3.ogg","t":179176.59999999404,"reason":"kill","ta":172.981}
+{"ev":"fetch","url":"audio/voice/male/new_record.ogg","status":200,"ok":true,"ms":3,"t":179179.19999998808,"ta":172.983}
+{"ev":"vstart","url":"audio/voice/male/new_record.ogg","t":179182.19999998808,"dur":1.28,"ta":172.986}
+{"ev":"vend","url":"audio/voice/male/new_record.ogg","t":180778.59999999404,"reason":"kill","ta":174.583}
+{"ev":"fetch","url":"audio/voice/male/dodge_1.ogg","status":200,"ok":true,"ms":3,"t":180781.30000001192,"ta":174.585}
+{"ev":"vstart","url":"audio/voice/male/dodge_1.ogg","t":180784.30000001192,"dur":1.36,"ta":174.588}
+{"ev":"vend","url":"audio/voice/male/dodge_1.ogg","t":182380.69999998808,"reason":"kill","ta":176.185}
+{"ev":"fetch","url":"audio/voice/male/restart_hint.ogg","status":200,"ok":true,"ms":3,"t":182383.69999998808,"ta":176.188}
+{"ev":"vstart","url":"audio/voice/male/restart_hint.ogg","t":182388.30000001192,"dur":3.68,"ta":176.192}
+{"ev":"start","t":185703.5,"sid":44,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":179.508}
+{"ev":"vend","url":"audio/voice/male/restart_hint.ogg","t":186211.69999998808,"reason":"kill","ta":180.016}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":194218.19999998808,"ta":188.022}
+{"ev":"vibrate","pattern":"[20]","t":194583.5,"ta":188.388}
+{"ev":"start","t":194583.80000001192,"sid":45,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":188.388}
+{"ev":"stop","t":195444,"sid":44,"when":0,"ta":189.248}
+{"ev":"start","t":196084.09999999404,"sid":46,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":189.888}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":196693.40000000596,"ta":190.498}
+{"ev":"vibrate","pattern":"[20]","t":197055.80000001192,"ta":190.86}
+{"ev":"vibrate","pattern":"[20]","t":197055.90000000596,"ta":190.86}
+{"ev":"start","t":197056.09999999404,"sid":47,"url":"audio/sfx/boost.ogg","layer":"sfx","dur":1.8,"rate":1,"loop":false,"when":0,"ta":190.86}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":199084.19999998808,"ta":192.888}
+{"ev":"start","t":199084.19999998808,"sid":48,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":192.888}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":199584.09999999404,"ta":193.388}
+{"ev":"start","t":199584.19999998808,"sid":49,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":193.388}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":200084.09999999404,"ta":193.888}
+{"ev":"start","t":200084.19999998808,"sid":50,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":193.888}
+{"ev":"vstart","url":"audio/voice/male/protect_down.ogg","t":200084.30000001192,"dur":6.08,"ta":193.888}
+{"ev":"start","t":200085.30000001192,"sid":51,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":193.889}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":203085.40000000596,"ta":196.89}
+{"ev":"start","t":203085.5,"sid":52,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":196.89}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":203585.40000000596,"ta":197.39}
+{"ev":"start","t":203585.5,"sid":53,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":197.39}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":204085.40000000596,"ta":197.89}
+{"ev":"start","t":204085.5,"sid":54,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":197.89}
+{"ev":"start","t":204085.59999999404,"sid":55,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":197.89}
+{"ev":"vend","url":"audio/voice/male/protect_down.ogg","t":206504.30000001192,"reason":"kill","ta":200.308}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":207085.69999998808,"ta":200.89}
+{"ev":"start","t":207085.80000001192,"sid":56,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":200.89}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":207585.69999998808,"ta":201.39}
+{"ev":"start","t":207585.80000001192,"sid":57,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":201.39}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":208085.69999998808,"ta":201.89}
+{"ev":"start","t":208085.90000000596,"sid":58,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":201.89}
+{"ev":"vstart","url":"audio/voice/male/protect_down.ogg","t":208085.90000000596,"dur":6.08,"ta":201.89}
+{"ev":"start","t":208086.80000001192,"sid":59,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":201.891}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":211087,"ta":204.891}
+{"ev":"start","t":211087.09999999404,"sid":60,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":204.891}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":211586.90000000596,"ta":205.391}
+{"ev":"start","t":211587,"sid":61,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":205.391}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":212087,"ta":205.891}
+{"ev":"start","t":212087,"sid":62,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":205.891}
+{"ev":"start","t":212087.09999999404,"sid":63,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":205.891}
+{"ev":"vend","url":"audio/voice/male/protect_down.ogg","t":214514.40000000596,"reason":"kill","ta":208.319}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":215087.19999998808,"ta":208.891}
+{"ev":"start","t":215087.30000001192,"sid":64,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":208.891}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":215587.19999998808,"ta":209.391}
+{"ev":"start","t":215587.30000001192,"sid":65,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":209.391}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":216087.19999998808,"ta":209.891}
+{"ev":"start","t":216087.30000001192,"sid":66,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":209.891}
+{"ev":"vstart","url":"audio/voice/male/protect_left.ogg","t":216087.40000000596,"dur":7.76,"ta":209.892}
+{"ev":"start","t":216088.40000000596,"sid":67,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":209.893}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":219088.5,"ta":212.893}
+{"ev":"start","t":219088.69999998808,"sid":68,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":212.893}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":219588.59999999404,"ta":213.393}
+{"ev":"start","t":219588.69999998808,"sid":69,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":213.393}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":220088.59999999404,"ta":213.893}
+{"ev":"start","t":220088.59999999404,"sid":70,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":213.893}
+{"ev":"start","t":220088.69999998808,"sid":71,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":213.893}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":223088.80000001192,"ta":216.893}
+{"ev":"start","t":223088.90000000596,"sid":72,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":216.893}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":223588.80000001192,"ta":217.393}
+{"ev":"start","t":223588.90000000596,"sid":73,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":217.393}
+{"ev":"vend","url":"audio/voice/male/protect_left.ogg","t":224010.59999999404,"reason":"kill","ta":217.815}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":224088.80000001192,"ta":217.893}
+{"ev":"start","t":224089,"sid":74,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":217.893}
+{"ev":"vstart","url":"audio/voice/male/protect_left.ogg","t":224089,"dur":7.76,"ta":217.893}
+{"ev":"start","t":224090.19999998808,"sid":75,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":217.894}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":227090.19999998808,"ta":220.894}
+{"ev":"start","t":227090.30000001192,"sid":76,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":220.894}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":227590.30000001192,"ta":221.394}
+{"ev":"start","t":227590.40000000596,"sid":77,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":221.395}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":228090.19999998808,"ta":221.894}
+{"ev":"start","t":228090.30000001192,"sid":78,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":221.894}
+{"ev":"start","t":228090.40000000596,"sid":79,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":221.895}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":231090.5,"ta":224.895}
+{"ev":"start","t":231090.59999999404,"sid":80,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":224.895}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":231590.5,"ta":225.395}
+{"ev":"start","t":231590.59999999404,"sid":81,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":225.395}
+{"ev":"vend","url":"audio/voice/male/protect_left.ogg","t":231997.59999999404,"reason":"kill","ta":225.802}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":232090.5,"ta":225.895}
+{"ev":"start","t":232090.59999999404,"sid":82,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":225.895}
+{"ev":"vstart","url":"audio/voice/male/protect_down.ogg","t":232090.69999998808,"dur":6.08,"ta":225.895}
+{"ev":"start","t":232091.5,"sid":83,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":225.896}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":235091.59999999404,"ta":228.896}
+{"ev":"start","t":235091.80000001192,"sid":84,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":228.896}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":235591.59999999404,"ta":229.396}
+{"ev":"start","t":235591.69999998808,"sid":85,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":229.396}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":236091.69999998808,"ta":229.896}
+{"ev":"start","t":236091.69999998808,"sid":86,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":229.896}
+{"ev":"start","t":236091.90000000596,"sid":87,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":229.896}
+{"ev":"vend","url":"audio/voice/male/protect_down.ogg","t":238521.69999998808,"reason":"kill","ta":232.326}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":239091.90000000596,"ta":232.896}
+{"ev":"start","t":239092,"sid":88,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":232.896}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":239591.90000000596,"ta":233.396}
+{"ev":"start","t":239592,"sid":89,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":233.396}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":240092,"ta":233.896}
+{"ev":"start","t":240092.09999999404,"sid":90,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":233.896}
+{"ev":"vstart","url":"audio/voice/male/protect_right.ogg","t":240092.19999998808,"dur":7.2,"ta":233.896}
+{"ev":"start","t":240093.30000001192,"sid":91,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":233.897}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":243093.40000000596,"ta":236.898}
+{"ev":"start","t":243093.40000000596,"sid":92,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":236.898}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":243593.40000000596,"ta":237.398}
+{"ev":"start","t":243593.5,"sid":93,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":237.398}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":244093.40000000596,"ta":237.898}
+{"ev":"start","t":244093.5,"sid":94,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":237.898}
+{"ev":"start","t":244093.59999999404,"sid":95,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":237.898}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":247093.69999998808,"ta":240.898}
+{"ev":"start","t":247093.80000001192,"sid":96,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":240.898}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":247593.59999999404,"ta":241.398}
+{"ev":"start","t":247593.69999998808,"sid":97,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":241.398}
+{"ev":"vend","url":"audio/voice/male/protect_right.ogg","t":247623.30000001192,"reason":"kill","ta":241.427}
+{"ev":"vstart","url":"audio/voice/male/protect_soon.ogg","t":247623.30000001192,"dur":2.48,"ta":241.427}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":248093.69999998808,"ta":241.898}
+{"ev":"start","t":248093.80000001192,"sid":98,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":241.898}
+{"ev":"vend","url":"audio/voice/male/protect_soon.ogg","t":248093.80000001192,"reason":"kill","ta":241.898}
+{"ev":"vstart","url":"audio/voice/male/protect_up.ogg","t":248093.80000001192,"dur":6.96,"ta":241.898}
+{"ev":"start","t":248094.80000001192,"sid":99,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":241.899}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":251094.90000000596,"ta":244.899}
+{"ev":"start","t":251094.90000000596,"sid":100,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":244.899}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":251594.80000001192,"ta":245.399}
+{"ev":"start","t":251594.90000000596,"sid":101,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":245.399}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":252094.90000000596,"ta":245.899}
+{"ev":"start","t":252095,"sid":102,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":245.899}
+{"ev":"start","t":252095.09999999404,"sid":103,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":245.899}
+{"ev":"vend","url":"audio/voice/male/protect_up.ogg","t":252095.09999999404,"reason":"kill","ta":245.899}
+{"ev":"vstart","url":"audio/voice/male/dir_up.ogg","t":252095.19999998808,"dur":0.39909297052154197,"ta":245.899}
+{"ev":"vend","url":"audio/voice/male/dir_up.ogg","t":252568.69999998808,"reason":"kill","ta":246.373}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":254584,"ta":248.388}
+{"ev":"vstart","url":"audio/voice/male/protect_end.ogg","t":254584.09999999404,"dur":5.36,"ta":248.388}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":255095.19999998808,"ta":248.899}
+{"ev":"start","t":255095.30000001192,"sid":104,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":248.899}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":255595.19999998808,"ta":249.399}
+{"ev":"start","t":255595.30000001192,"sid":105,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":249.399}
+{"ev":"vibrate","pattern":"[80]","t":256095.19999998808,"ta":249.899}
+{"ev":"start","t":256095.30000001192,"sid":106,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":249.899}
+{"ev":"vend","url":"audio/voice/male/protect_end.ogg","t":256095.30000001192,"reason":"kill","ta":249.899}
+{"ev":"vstart","url":"audio/voice/male/hit_up.ogg","t":256095.40000000596,"dur":5.44,"ta":249.9}
+{"ev":"start","t":256096.09999999404,"sid":107,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":249.9}
+{"ev":"vend","url":"audio/voice/male/hit_up.ogg","t":256096.09999999404,"reason":"kill","ta":249.9}
+{"ev":"vstart","url":"audio/voice/male/dir_right.ogg","t":256096.19999998808,"dur":0.39909297052154197,"ta":249.9}
+{"ev":"vend","url":"audio/voice/male/dir_right.ogg","t":256585.59999999404,"reason":"kill","ta":250.39}
+{"ev":"vstart","url":"audio/voice/male/hit_up.ogg","t":256585.69999998808,"dur":5.44,"ta":250.39}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":259096.19999998808,"ta":252.9}
+{"ev":"start","t":259096.40000000596,"sid":108,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":252.901}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":259596.30000001192,"ta":253.4}
+{"ev":"start","t":259596.40000000596,"sid":109,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":253.401}
+{"ev":"vibrate","pattern":"[80]","t":260096.30000001192,"ta":253.9}
+{"ev":"start","t":260096.40000000596,"sid":110,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":253.901}
+{"ev":"vend","url":"audio/voice/male/hit_up.ogg","t":260096.40000000596,"reason":"kill","ta":253.901}
+{"ev":"vstart","url":"audio/voice/male/hit_right.ogg","t":260096.40000000596,"dur":5.12,"ta":253.901}
+{"ev":"start","t":260097.19999998808,"sid":111,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":253.901}
+{"ev":"vend","url":"audio/voice/male/hit_right.ogg","t":260097.19999998808,"reason":"kill","ta":253.901}
+{"ev":"vstart","url":"audio/voice/male/dir_up.ogg","t":260097.30000001192,"dur":0.39909297052154197,"ta":253.901}
+{"ev":"vend","url":"audio/voice/male/dir_up.ogg","t":260578.80000001192,"reason":"kill","ta":254.383}
+{"ev":"vstart","url":"audio/voice/male/hit_right.ogg","t":260579,"dur":5.12,"ta":254.383}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":263097.3000000119,"ta":256.901}
+{"ev":"start","t":263097.5,"sid":112,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":256.902}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":263597.40000000596,"ta":257.402}
+{"ev":"start","t":263597.40000000596,"sid":113,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":257.402}
+{"ev":"vibrate","pattern":"[80]","t":264097.3000000119,"ta":257.901}
+{"ev":"vend","url":"audio/voice/male/hit_right.ogg","t":264097.59999999404,"reason":"kill","ta":257.902}
+{"ev":"vibrate","pattern":"[60,40,60]","t":264097.59999999404,"ta":257.902}
+{"ev":"start","t":264097.6999999881,"sid":114,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":257.902}
+{"ev":"start","t":264097.6999999881,"sid":115,"url":"audio/sfx/crash.ogg","layer":"sfx","dur":3,"rate":1,"loop":false,"when":0,"ta":257.902}
+{"ev":"vibrate","pattern":"[80]","t":264397.6999999881,"ta":258.202}
+{"ev":"stop","t":264757.6999999881,"sid":45,"when":0,"ta":258.562}
+{"ev":"vstart","url":"audio/voice/male/time_3.ogg","t":265298,"dur":3.2,"ta":259.102}
+{"ev":"vend","url":"audio/voice/male/time_3.ogg","t":268751.59999999404,"reason":"kill","ta":262.556}
+{"ev":"vstart","url":"audio/voice/male/dodge_1.ogg","t":268751.8000000119,"dur":1.36,"ta":262.556}
+{"ev":"vend","url":"audio/voice/male/dodge_1.ogg","t":270353.6999999881,"reason":"kill","ta":264.158}
+{"ev":"vstart","url":"audio/voice/male/restart_hint.ogg","t":270354,"dur":3.68,"ta":264.158}
+{"ev":"vend","url":"audio/voice/male/restart_hint.ogg","t":274184.59999999404,"reason":"kill","ta":267.989}
+{"ev":"start","t":274184.8000000119,"sid":116,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":267.989}
diff --git a/research/space-polish/round2/live-A-voice-timeline.txt b/research/space-polish/round2/live-A-voice-timeline.txt
new file mode 100644
index 00000000..9ea32f46
--- /dev/null
+++ b/research/space-polish/round2/live-A-voice-timeline.txt
@@ -0,0 +1,137 @@
+ -0.15 gesture tap
+ 0.13 vstart drill_welcome.ogg
+ 3.95 vend drill_welcome.ogg
+ 3.95 vstart skip_hint.ogg
+ 5.83 vend skip_hint.ogg
+ 5.83 vstart drill_rule.ogg
+ 9.67 vend drill_rule.ogg
+ 9.67 vstart drill_left.ogg
+ 14.89 vend drill_left.ogg
+ 14.89 vstart dir_left.ogg
+ 15.66 vend dir_left.ogg
+ 19.40 vstart drill_retry_left.ogg
+ 22.85 vend drill_retry_left.ogg
+ 22.85 vstart dir_left.ogg
+ 23.62 vend dir_left.ogg
+ 27.36 vstart drill_moveon.ogg
+ 31.00 gesture swipeleft
+ 31.47 vend drill_moveon.ogg
+ 31.47 vstart drill_right.ogg
+ 34.18 vend drill_right.ogg
+ 34.18 vstart dir_right.ogg
+ 34.67 vend dir_right.ogg
+ 38.69 vstart drill_retry_right.ogg
+ 42.15 vend drill_retry_right.ogg
+ 42.15 vstart dir_right.ogg
+ 42.63 vend dir_right.ogg
+ 46.65 vstart drill_moveon.ogg
+ 47.77 gesture swiperight
+ 50.76 vend drill_moveon.ogg
+ 50.77 vstart drill_up.ogg
+ 55.34 vend drill_up.ogg
+ 55.34 vstart dir_up.ogg
+ 55.82 vend dir_up.ogg
+ 59.53 gesture swipeup
+ 59.84 vstart drill_retry_up.ogg
+ 63.95 vend drill_retry_up.ogg
+ 63.95 vstart dir_up.ogg
+ 64.44 vend dir_up.ogg
+ 68.45 vstart drill_moveon.ogg
+ 72.56 vend drill_moveon.ogg
+ 72.57 vstart drill_down.ogg
+ 76.02 vend drill_down.ogg
+ 76.02 vstart dir_down.ogg
+ 76.79 vend dir_down.ogg
+ 80.53 vstart drill_retry_down.ogg
+ 83.24 vend drill_retry_down.ogg
+ 83.24 vstart dir_down.ogg
+ 84.01 vend dir_down.ogg
+ 87.74 vstart drill_moveon.ogg
+ 91.86 vend drill_moveon.ogg
+ 91.86 vstart drill_done.ogg
+ 96.80 vend drill_done.ogg
+ 102.31 vstart protect_up.ogg
+ 109.39 vend protect_up.ogg
+ 110.31 vstart protect_up.ogg
+ 111.04 gesture swipedown
+ 111.41 vend protect_up.ogg
+ 111.41 vstart paused.ogg
+ 112.54 vend paused.ogg
+ 112.54 vstart menu_main.ogg
+ 116.65 vend menu_main.ogg
+ 116.65 vstart menu_resume.ogg
+ 117.79 vend menu_resume.ogg
+ 129.40 gesture doubletap
+ 129.65 vstart feat_boost.ogg
+ 136.46 vend feat_boost.ogg
+ 141.80 vstart feat_shield.ogg
+ 146.37 vend feat_shield.ogg
+ 149.80 vstart protect_soon.ogg
+ 152.53 vend protect_soon.ogg
+ 152.89 gesture doubletap
+ 156.30 vstart shield_block.ogg
+ 156.30 vend shield_block.ogg
+ 156.30 vstart dir_left.ogg
+ 156.80 vend dir_left.ogg
+ 156.80 vstart protect_end.ogg
+ 160.30 vend protect_end.ogg
+ 160.30 vstart hit_left.ogg
+ 160.31 vend hit_left.ogg
+ 160.31 vstart dir_right.ogg
+ 160.79 vend dir_right.ogg
+ 160.79 vstart hit_left.ogg
+ 164.31 vend hit_left.ogg
+ 164.31 vstart hit_right.ogg
+ 164.31 vend hit_right.ogg
+ 164.31 vstart dir_right.ogg
+ 164.78 vend dir_right.ogg
+ 164.78 vstart hit_right.ogg
+ 168.31 vend hit_right.ogg
+ 169.52 vstart time_3.ogg
+ 172.98 vend time_3.ogg
+ 172.99 vstart new_record.ogg
+ 174.58 vend new_record.ogg
+ 174.59 vstart dodge_1.ogg
+ 176.19 vend dodge_1.ogg
+ 176.19 vstart restart_hint.ogg
+ 180.02 vend restart_hint.ogg
+ 188.02 gesture tap
+ 190.50 gesture tap
+ 193.89 vstart protect_down.ogg
+ 200.31 vend protect_down.ogg
+ 201.89 vstart protect_down.ogg
+ 208.32 vend protect_down.ogg
+ 209.89 vstart protect_left.ogg
+ 217.81 vend protect_left.ogg
+ 217.89 vstart protect_left.ogg
+ 225.80 vend protect_left.ogg
+ 225.90 vstart protect_down.ogg
+ 232.33 vend protect_down.ogg
+ 233.90 vstart protect_right.ogg
+ 241.43 vend protect_right.ogg
+ 241.43 vstart protect_soon.ogg
+ 241.90 vend protect_soon.ogg
+ 241.90 vstart protect_up.ogg
+ 245.90 vend protect_up.ogg
+ 245.90 vstart dir_up.ogg
+ 246.37 vend dir_up.ogg
+ 248.39 vstart protect_end.ogg
+ 249.90 vend protect_end.ogg
+ 249.90 vstart hit_up.ogg
+ 249.90 vend hit_up.ogg
+ 249.90 vstart dir_right.ogg
+ 250.39 vend dir_right.ogg
+ 250.39 vstart hit_up.ogg
+ 253.90 vend hit_up.ogg
+ 253.90 vstart hit_right.ogg
+ 253.90 vend hit_right.ogg
+ 253.90 vstart dir_up.ogg
+ 254.38 vend dir_up.ogg
+ 254.38 vstart hit_right.ogg
+ 257.90 vend hit_right.ogg
+ 259.10 vstart time_3.ogg
+ 262.56 vend time_3.ogg
+ 262.56 vstart dodge_1.ogg
+ 264.16 vend dodge_1.ogg
+ 264.16 vstart restart_hint.ogg
+ 267.99 vend restart_hint.ogg
diff --git a/research/space-polish/round2/live-B-events.jsonl b/research/space-polish/round2/live-B-events.jsonl
new file mode 100644
index 00000000..b5dbf63b
--- /dev/null
+++ b/research/space-polish/round2/live-B-events.jsonl
@@ -0,0 +1,420 @@
+{"ev":"probe_ready","t":8.400000005960464,"ta":null}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":6011.4000000059605,"ta":-0.07}
+{"ev":"recstart","mime":"audio/webm;codecs=opus","t":6081.699999988079,"ta":0}
+{"ev":"fetch","url":"audio/sfx/whoosh_left.ogg","status":200,"ok":true,"ms":15,"t":6096.4000000059605,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/whoosh_right.ogg","status":200,"ok":true,"ms":14,"t":6096.5,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/whoosh_up.ogg","status":200,"ok":true,"ms":14,"t":6096.5999999940395,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/whoosh_down.ogg","status":200,"ok":true,"ms":14,"t":6096.699999988079,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/alarm.ogg","status":200,"ok":true,"ms":14,"t":6096.699999988079,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/boost.ogg","status":200,"ok":true,"ms":14,"t":6096.699999988079,"ta":0.015}
+{"ev":"fetch","url":"audio/sfx/shield.ogg","status":200,"ok":true,"ms":16,"t":6098.799999982119,"ta":0.017}
+{"ev":"fetch","url":"audio/sfx/shield_block.ogg","status":200,"ok":true,"ms":17,"t":6099,"ta":0.017}
+{"ev":"fetch","url":"audio/sfx/dodge.ogg","status":200,"ok":true,"ms":17,"t":6099.5,"ta":0.018}
+{"ev":"fetch","url":"audio/sfx/whiff.ogg","status":200,"ok":true,"ms":18,"t":6100.199999988079,"ta":0.019}
+{"ev":"fetch","url":"audio/sfx/hit.ogg","status":200,"ok":true,"ms":18,"t":6100.5,"ta":0.019}
+{"ev":"fetch","url":"audio/sfx/crash.ogg","status":200,"ok":true,"ms":19,"t":6101.199999988079,"ta":0.02}
+{"ev":"fetch","url":"audio/voice/female/dir_left.ogg","status":200,"ok":true,"ms":24,"t":6106.299999982119,"ta":0.025}
+{"ev":"fetch","url":"audio/voice/female/dir_right.ogg","status":200,"ok":true,"ms":24,"t":6106.4000000059605,"ta":0.025}
+{"ev":"fetch","url":"audio/voice/female/dir_up.ogg","status":200,"ok":true,"ms":24,"t":6106.4000000059605,"ta":0.025}
+{"ev":"fetch","url":"audio/voice/female/dir_down.ogg","status":200,"ok":true,"ms":24,"t":6107.4000000059605,"ta":0.026}
+{"ev":"fetch","url":"audio/voice/female/hit_left.ogg","status":200,"ok":true,"ms":25,"t":6108.0999999940395,"ta":0.026}
+{"ev":"fetch","url":"audio/voice/female/hit_right.ogg","status":200,"ok":true,"ms":26,"t":6109.4000000059605,"ta":0.028}
+{"ev":"fetch","url":"audio/voice/female/hit_up.ogg","status":200,"ok":true,"ms":29,"t":6112.5,"ta":0.031}
+{"ev":"fetch","url":"audio/voice/female/hit_down.ogg","status":200,"ok":true,"ms":31,"t":6114,"ta":0.032}
+{"ev":"fetch","url":"audio/voice/female/hit_last.ogg","status":200,"ok":true,"ms":35,"t":6118.4000000059605,"ta":0.037}
+{"ev":"fetch","url":"audio/voice/female/protect_left.ogg","status":200,"ok":true,"ms":37,"t":6120.799999982119,"ta":0.039}
+{"ev":"fetch","url":"audio/voice/female/protect_right.ogg","status":200,"ok":true,"ms":37,"t":6120.799999982119,"ta":0.039}
+{"ev":"fetch","url":"audio/voice/female/protect_up.ogg","status":200,"ok":true,"ms":37,"t":6120.9000000059605,"ta":0.039}
+{"ev":"fetch","url":"audio/voice/female/protect_down.ogg","status":200,"ok":true,"ms":39,"t":6122.5999999940395,"ta":0.041}
+{"ev":"fetch","url":"audio/voice/female/protect_end.ogg","status":200,"ok":true,"ms":39,"t":6122.799999982119,"ta":0.041}
+{"ev":"fetch","url":"audio/voice/female/protect_soon.ogg","status":200,"ok":true,"ms":39,"t":6123,"ta":0.041}
+{"ev":"fetch","url":"audio/voice/female/shield_ready.ogg","status":200,"ok":true,"ms":45,"t":6128.699999988079,"ta":0.047}
+{"ev":"fetch","url":"audio/voice/female/shield_block.ogg","status":200,"ok":true,"ms":45,"t":6128.699999988079,"ta":0.047}
+{"ev":"fetch","url":"audio/voice/female/feat_boost.ogg","status":200,"ok":true,"ms":45,"t":6128.799999982119,"ta":0.047}
+{"ev":"fetch","url":"audio/voice/female/feat_boost_done.ogg","status":200,"ok":true,"ms":46,"t":6130.5,"ta":0.049}
+{"ev":"fetch","url":"audio/voice/female/feat_shield.ogg","status":200,"ok":true,"ms":55,"t":6139.699999988079,"ta":0.058}
+{"ev":"fetch","url":"audio/voice/female/feat_shield_done.ogg","status":200,"ok":true,"ms":57,"t":6141.0999999940395,"ta":0.059}
+{"ev":"fetch","url":"audio/voice/female/boost_not_ready.ogg","status":200,"ok":true,"ms":57,"t":6141.0999999940395,"ta":0.059}
+{"ev":"fetch","url":"audio/voice/female/ms_10.ogg","status":200,"ok":true,"ms":57,"t":6141.199999988079,"ta":0.06}
+{"ev":"fetch","url":"audio/voice/female/ms_25.ogg","status":200,"ok":true,"ms":57,"t":6141.299999982119,"ta":0.06}
+{"ev":"fetch","url":"audio/voice/female/ms_50.ogg","status":200,"ok":true,"ms":58,"t":6142.0999999940395,"ta":0.06}
+{"ev":"fetch","url":"audio/voice/female/ms_100.ogg","status":200,"ok":true,"ms":58,"t":6142.299999982119,"ta":0.061}
+{"ev":"fetch","url":"audio/voice/female/gd_hit_hint.ogg","status":200,"ok":true,"ms":59,"t":6144.0999999940395,"ta":0.062}
+{"ev":"fetch","url":"audio/voice/female/gd_last_life.ogg","status":200,"ok":true,"ms":60,"t":6144.5,"ta":0.063}
+{"ev":"fetch","url":"audio/voice/female/paused.ogg","status":200,"ok":true,"ms":62,"t":6147,"ta":0.065}
+{"ev":"fetch","url":"audio/voice/female/menu_main.ogg","status":200,"ok":true,"ms":63,"t":6147.9000000059605,"ta":0.066}
+{"ev":"fetch","url":"audio/voice/female/menu_resume.ogg","status":200,"ok":true,"ms":71,"t":6155.5,"ta":0.074}
+{"ev":"fetch","url":"audio/voice/female/menu_lobby.ogg","status":200,"ok":true,"ms":77,"t":6162,"ta":0.08}
+{"ev":"fetch","url":"audio/voice/female/menu_help.ogg","status":200,"ok":true,"ms":77,"t":6162.0999999940395,"ta":0.08}
+{"ev":"fetch","url":"audio/voice/female/settings_hint.ogg","status":200,"ok":true,"ms":77,"t":6162.4000000059605,"ta":0.081}
+{"ev":"fetch","url":"audio/voice/female/help_recap.ogg","status":200,"ok":true,"ms":78,"t":6162.5,"ta":0.081}
+{"ev":"fetch","url":"audio/voice/female/drill_welcome.ogg","status":200,"ok":true,"ms":79,"t":6163.5999999940395,"ta":0.082}
+{"ev":"fetch","url":"audio/voice/female/drill_rule.ogg","status":200,"ok":true,"ms":79,"t":6163.799999982119,"ta":0.082}
+{"ev":"fetch","url":"audio/voice/female/second_run_ask.ogg","status":200,"ok":true,"ms":79,"t":6163.9000000059605,"ta":0.082}
+{"ev":"fetch","url":"audio/voice/female/skip_hint.ogg","status":200,"ok":true,"ms":80,"t":6165,"ta":0.083}
+{"ev":"vstart","url":"audio/voice/female/second_run_ask.ogg","t":6182,"dur":3.04,"ta":0.1}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":6510,"ta":0.428}
+{"ev":"vibrate","pattern":"[20]","t":6874.0999999940395,"ta":0.792}
+{"ev":"vend","url":"audio/voice/female/second_run_ask.ogg","t":6874.199999988079,"reason":"kill","ta":0.793}
+{"ev":"fetch","url":"audio/bgm/engine.ogg","status":200,"ok":true,"ms":3,"t":6877.0999999940395,"ta":0.795}
+{"ev":"start","t":7044,"sid":1,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":0.962}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":7843.4000000059605,"ta":1.762}
+{"ev":"vibrate","pattern":"[10]","t":8194,"ta":2.112}
+{"ev":"start","t":8194.5,"sid":2,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":2.113}
+{"ev":"start","t":8376.799999982119,"sid":3,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":2.295}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":9423.699999988079,"ta":3.342}
+{"ev":"vibrate","pattern":"[20]","t":9786.90000000596,"ta":3.705}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":10254.299999982119,"ta":4.173}
+{"ev":"vibrate","pattern":"[10]","t":10609.799999982119,"ta":4.528}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":11376.90000000596,"ta":5.295}
+{"ev":"start","t":11377.09999999404,"sid":4,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":5.295}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":11794.5,"ta":5.713}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":11877,"ta":5.795}
+{"ev":"start","t":11877.09999999404,"sid":5,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":5.795}
+{"ev":"vibrate","pattern":"[20]","t":12042.299999982119,"ta":5.961}
+{"ev":"vibrate","pattern":"[40,100,40]","t":12042.5,"ta":5.961}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":12043,"dur":4.64,"ta":5.961}
+{"ev":"start","t":12377.199999988079,"sid":6,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":6.296}
+{"ev":"start","t":12377.40000000596,"sid":7,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":6.296}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":13313.799999982119,"ta":7.232}
+{"ev":"vibrate","pattern":"[10]","t":13677,"ta":7.595}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":13677.59999999404,"reason":"kill","ta":7.596}
+{"ev":"vstart","url":"audio/voice/female/paused.ogg","t":13677.699999988079,"dur":0.9570975056689343,"ta":7.596}
+{"ev":"fetch","url":"audio/bgm/menu.ogg","status":200,"ok":true,"ms":3,"t":13680,"ta":7.598}
+{"ev":"start","t":13807.40000000596,"sid":8,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":7.726}
+{"ev":"stop","t":14167.799999982119,"sid":1,"when":0,"ta":8.086}
+{"ev":"vend","url":"audio/voice/female/paused.ogg","t":14630.40000000596,"reason":"kill","ta":8.549}
+{"ev":"vstart","url":"audio/voice/female/menu_main.ogg","t":14630.59999999404,"dur":3.92,"ta":8.549}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":14681.5,"ta":8.6}
+{"ev":"vibrate","pattern":"[10]","t":15043.5,"ta":8.962}
+{"ev":"start","t":15043.90000000596,"sid":9,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":8.962}
+{"ev":"stop","t":15604.09999999404,"sid":8,"when":0,"ta":9.522}
+{"ev":"start","t":15844.09999999404,"sid":10,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":9.762}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":15942.09999999404,"ta":9.86}
+{"ev":"vibrate","pattern":"[20]","t":16190.299999982119,"ta":10.109}
+{"ev":"vibrate","pattern":"[40,100,40]","t":16190.299999982119,"ta":10.109}
+{"ev":"vend","url":"audio/voice/female/menu_main.ogg","t":16190.299999982119,"reason":"kill","ta":10.109}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":16190.59999999404,"dur":4.64,"ta":10.109}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":17363,"ta":11.281}
+{"ev":"vibrate","pattern":"[10]","t":17726.79999998212,"ta":11.645}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":18844.29999998212,"ta":12.763}
+{"ev":"start","t":18844.40000000596,"sid":11,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":12.763}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":19151.79999998212,"ta":13.07}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":19344.09999999404,"ta":13.262}
+{"ev":"start","t":19344.19999998808,"sid":12,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":13.263}
+{"ev":"vibrate","pattern":"[10]","t":19509.5,"ta":13.428}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":19831.09999999404,"reason":"kill","ta":13.749}
+{"ev":"start","t":19844.29999998212,"sid":13,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":13.763}
+{"ev":"start","t":19844.29999998212,"sid":14,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":13.763}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":20250.09999999404,"ta":14.168}
+{"ev":"vibrate","pattern":"[10]","t":20609.79999998212,"ta":14.528}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":21617.69999998808,"ta":15.536}
+{"ev":"vibrate","pattern":"[10]","t":21977,"ta":15.895}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":22844.40000000596,"ta":16.763}
+{"ev":"start","t":22844.5,"sid":15,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":16.763}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":23074.5,"ta":16.993}
+{"ev":"vibrate","pattern":"[20]","t":23321.90000000596,"ta":17.24}
+{"ev":"vibrate","pattern":"[40,100,40]","t":23321.90000000596,"ta":17.24}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":23322,"dur":4.64,"ta":17.24}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":23344.40000000596,"ta":17.263}
+{"ev":"start","t":23344.5,"sid":16,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":17.263}
+{"ev":"start","t":23844.5,"sid":17,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":17.763}
+{"ev":"start","t":23844.59999999404,"sid":18,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":17.763}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":24670.09999999404,"ta":18.588}
+{"ev":"vibrate","pattern":"[10]","t":25025.79999998212,"ta":18.944}
+{"ev":"start","t":25026.19999998808,"sid":19,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":18.945}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":25026.19999998808,"reason":"kill","ta":18.945}
+{"ev":"vstart","url":"audio/voice/female/paused.ogg","t":25026.19999998808,"dur":0.9570975056689343,"ta":18.945}
+{"ev":"stop","t":25386.29999998212,"sid":9,"when":0,"ta":19.305}
+{"ev":"vend","url":"audio/voice/female/paused.ogg","t":25983.90000000596,"reason":"kill","ta":19.902}
+{"ev":"vstart","url":"audio/voice/female/menu_main.ogg","t":25984,"dur":3.92,"ta":19.902}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":26249.40000000596,"ta":20.168}
+{"ev":"vibrate","pattern":"[20]","t":26496.79999998212,"ta":20.415}
+{"ev":"start","t":26497,"sid":20,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":20.415}
+{"ev":"vend","url":"audio/voice/female/menu_main.ogg","t":26874.40000000596,"reason":"kill","ta":20.793}
+{"ev":"vstart","url":"audio/voice/female/feat_boost.ogg","t":26874.40000000596,"dur":3.84,"ta":20.793}
+{"ev":"stop","t":27057.19999998808,"sid":19,"when":0,"ta":20.976}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":27521.09999999404,"ta":21.439}
+{"ev":"vibrate","pattern":"[10]","t":27876.29999998212,"ta":21.795}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":29189,"ta":23.107}
+{"ev":"vibrate","pattern":"[10]","t":29542.69999998808,"ta":23.461}
+{"ev":"vend","url":"audio/voice/female/feat_boost.ogg","t":29954.09999999404,"reason":"kill","ta":23.872}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":30371.09999999404,"ta":24.289}
+{"ev":"vibrate","pattern":"[20]","t":30734.69999998808,"ta":24.653}
+{"ev":"vibrate","pattern":"[20]","t":30734.90000000596,"ta":24.653}
+{"ev":"start","t":30735.09999999404,"sid":21,"url":"audio/sfx/boost.ogg","layer":"sfx","dur":1.8,"rate":1,"loop":false,"when":0,"ta":24.653}
+{"ev":"vstart","url":"audio/voice/female/feat_boost_done.ogg","t":30735.19999998808,"dur":3.44,"ta":24.654}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":31664.69999998808,"ta":25.583}
+{"ev":"vibrate","pattern":"[20]","t":32028.69999998808,"ta":25.947}
+{"ev":"vend","url":"audio/voice/female/feat_boost_done.ogg","t":32028.79999998212,"reason":"kill","ta":25.947}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":33126.79999998212,"ta":27.045}
+{"ev":"start","t":33235.29999998212,"sid":22,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":27.154}
+{"ev":"vibrate","pattern":"[20]","t":33374.90000000596,"ta":27.293}
+{"ev":"vibrate","pattern":"[40,100,40]","t":33374.90000000596,"ta":27.293}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":33375.09999999404,"dur":4.64,"ta":27.293}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":34653.09999999404,"ta":28.571}
+{"ev":"vibrate","pattern":"[10]","t":35009.5,"ta":28.928}
+{"ev":"start","t":35009.59999999404,"sid":23,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":28.928}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":36003.69999998808,"ta":29.922}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":36235.19999998808,"ta":30.154}
+{"ev":"start","t":36235.40000000596,"sid":24,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":30.154}
+{"ev":"vibrate","pattern":"[10]","t":36359.40000000596,"ta":30.278}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":36735.19999998808,"ta":30.654}
+{"ev":"start","t":36735.29999998212,"sid":25,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":30.654}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":37012.29999998212,"reason":"kill","ta":30.931}
+{"ev":"start","t":37235.40000000596,"sid":26,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":31.154}
+{"ev":"start","t":37235.5,"sid":27,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":31.154}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":37739.5,"ta":31.658}
+{"ev":"vibrate","pattern":"[20]","t":37986.5,"ta":31.905}
+{"ev":"vibrate","pattern":"[40,100,40]","t":37986.5,"ta":31.905}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":37986.59999999404,"dur":4.64,"ta":31.905}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":39226.69999998808,"ta":33.145}
+{"ev":"vibrate","pattern":"[10]","t":39592.40000000596,"ta":33.511}
+{"ev":"start","t":39592.5,"sid":28,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":33.511}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":40235.5,"ta":34.154}
+{"ev":"start","t":40235.79999998212,"sid":29,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":34.154}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":40616.09999999404,"ta":34.534}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":40735.59999999404,"ta":34.654}
+{"ev":"start","t":40735.79999998212,"sid":30,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":34.654}
+{"ev":"vibrate","pattern":"[10]","t":40976.19999998808,"ta":34.895}
+{"ev":"start","t":40976.29999998212,"sid":31,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":34.895}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":41235.5,"ta":35.154}
+{"ev":"start","t":41235.59999999404,"sid":32,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":35.154}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":41235.69999998808,"reason":"kill","ta":35.154}
+{"ev":"vstart","url":"audio/voice/female/protect_right.ogg","t":41235.79999998212,"dur":5.2,"ta":35.154}
+{"ev":"start","t":41236.59999999404,"sid":33,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":35.155}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":42125.19999998808,"ta":36.044}
+{"ev":"vibrate","pattern":"[20]","t":42488.79999998212,"ta":36.407}
+{"ev":"vend","url":"audio/voice/female/protect_right.ogg","t":42488.90000000596,"reason":"kill","ta":36.407}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":43472.40000000596,"ta":37.391}
+{"ev":"vibrate","pattern":"[20]","t":43834.69999998808,"ta":37.753}
+{"ev":"vibrate","pattern":"[20]","t":43834.79999998212,"ta":37.753}
+{"ev":"start","t":43834.90000000596,"sid":34,"url":"audio/sfx/boost.ogg","layer":"sfx","dur":1.8,"rate":1,"loop":false,"when":0,"ta":37.753}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":44236.69999998808,"ta":38.155}
+{"ev":"start","t":44236.90000000596,"sid":35,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":38.155}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":44669.5,"ta":38.588}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":44736.69999998808,"ta":38.655}
+{"ev":"start","t":44736.90000000596,"sid":36,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":38.655}
+{"ev":"vibrate","pattern":"[10]","t":45025.79999998212,"ta":38.944}
+{"ev":"start","t":45236.90000000596,"sid":37,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":39.155}
+{"ev":"start","t":45237,"sid":38,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":39.155}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":46161.40000000596,"ta":40.08}
+{"ev":"vibrate","pattern":"[10]","t":46525.69999998808,"ta":40.444}
+{"ev":"start","t":46525.79999998212,"sid":39,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":40.444}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":47891.19999998808,"ta":41.81}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":48237.09999999404,"ta":42.155}
+{"ev":"start","t":48237.19999998808,"sid":40,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":42.156}
+{"ev":"vibrate","pattern":"[10]","t":48242.09999999404,"ta":42.16}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":48737,"ta":42.655}
+{"ev":"start","t":48737.09999999404,"sid":41,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":42.655}
+{"ev":"start","t":49237.19999998808,"sid":42,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":43.156}
+{"ev":"start","t":49237.29999998212,"sid":43,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":43.156}
+{"ev":"vstart","url":"audio/voice/female/feat_shield.ogg","t":51874.40000000596,"dur":2.8,"ta":45.793}
+{"ev":"vend","url":"audio/voice/female/feat_shield.ogg","t":54124.09999999404,"reason":"kill","ta":48.042}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":58678.29999998212,"ta":52.597}
+{"ev":"vibrate","pattern":"[20]","t":59046.5,"ta":52.965}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":59719.5,"ta":53.638}
+{"ev":"vstart","url":"audio/voice/female/protect_soon.ogg","t":59874.5,"dur":1.52,"ta":53.793}
+{"ev":"vibrate","pattern":"[10]","t":60075,"ta":53.993}
+{"ev":"start","t":60075.09999999404,"sid":44,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":53.993}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":61060.79999998212,"ta":54.979}
+{"ev":"vend","url":"audio/voice/female/protect_soon.ogg","t":61112.5,"reason":"kill","ta":55.031}
+{"ev":"vibrate","pattern":"[20]","t":61424,"ta":55.342}
+{"ev":"vibrate","pattern":"[20]","t":61424,"ta":55.342}
+{"ev":"start","t":61424.19999998808,"sid":45,"url":"audio/sfx/boost.ogg","layer":"sfx","dur":1.8,"rate":1,"loop":false,"when":0,"ta":55.343}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":62278.69999998808,"ta":56.197}
+{"ev":"start","t":62374.69999998808,"sid":46,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":56.293}
+{"ev":"vibrate","pattern":"[10]","t":62641.5,"ta":56.56}
+{"ev":"start","t":62641.69999998808,"sid":47,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":56.56}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":63901,"ta":57.819}
+{"ev":"vibrate","pattern":"[20]","t":64264.19999998808,"ta":58.183}
+{"ev":"vibrate","pattern":"[40,100,40]","t":64264.29999998212,"ta":58.183}
+{"ev":"vstart","url":"audio/voice/female/boost_not_ready.ogg","t":64264.40000000596,"dur":3.04,"ta":58.183}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":64947.40000000596,"ta":58.866}
+{"ev":"vibrate","pattern":"[20]","t":65194.19999998808,"ta":59.113}
+{"ev":"vibrate","pattern":"[20]","t":65194.19999998808,"ta":59.113}
+{"ev":"start","t":65194.40000000596,"sid":48,"url":"audio/sfx/shield.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":59.113}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":65374.69999998808,"ta":59.293}
+{"ev":"start","t":65374.90000000596,"sid":49,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":59.293}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":65874.69999998808,"ta":59.793}
+{"ev":"start","t":65874.79999998212,"sid":50,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":59.793}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":66068.69999998808,"ta":59.987}
+{"ev":"vibrate","pattern":"[100]","t":66374.69999998808,"ta":60.293}
+{"ev":"start","t":66374.90000000596,"sid":51,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":60.293}
+{"ev":"start","t":66374.90000000596,"sid":52,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":60.293}
+{"ev":"vend","url":"audio/voice/female/boost_not_ready.ogg","t":66374.90000000596,"reason":"kill","ta":60.293}
+{"ev":"vstart","url":"audio/voice/female/dir_right.ogg","t":66375,"dur":0.7170975056689343,"ta":60.293}
+{"ev":"vibrate","pattern":"[10]","t":66424.90000000596,"ta":60.343}
+{"ev":"vibrate","pattern":"[30,50,30,50,30]","t":66874.69999998808,"ta":60.793}
+{"ev":"vend","url":"audio/voice/female/dir_right.ogg","t":66874.79999998212,"reason":"kill","ta":60.793}
+{"ev":"vstart","url":"audio/voice/female/protect_end.ogg","t":66874.79999998212,"dur":3.6,"ta":60.793}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":67344.59999999404,"ta":61.263}
+{"ev":"vibrate","pattern":"[10]","t":67707.79999998212,"ta":61.626}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":68872.90000000596,"ta":62.791}
+{"ev":"vibrate","pattern":"[20]","t":69118.69999998808,"ta":63.037}
+{"ev":"vibrate","pattern":"[40,100,40]","t":69118.69999998808,"ta":63.037}
+{"ev":"vend","url":"audio/voice/female/protect_end.ogg","t":69118.79999998212,"reason":"kill","ta":63.037}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":69118.79999998212,"dur":4.64,"ta":63.037}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":69375.09999999404,"ta":63.293}
+{"ev":"start","t":69375.19999998808,"sid":53,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":63.294}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":69875,"ta":63.793}
+{"ev":"start","t":69875.19999998808,"sid":54,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":63.794}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":69936.5,"ta":63.855}
+{"ev":"vibrate","pattern":"[10]","t":70291,"ta":64.209}
+{"ev":"start","t":70291.09999999404,"sid":55,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":64.209}
+{"ev":"start","t":70375.09999999404,"sid":56,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":64.293}
+{"ev":"start","t":70375.19999998808,"sid":57,"url":"audio/sfx/whoosh_left.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":64.293}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":70375.29999998212,"reason":"kill","ta":64.294}
+{"ev":"vstart","url":"audio/voice/female/dir_left.ogg","t":70375.40000000596,"dur":0.39909297052154197,"ta":64.294}
+{"ev":"vend","url":"audio/voice/female/dir_left.ogg","t":70771.19999998808,"reason":"kill","ta":64.689}
+{"ev":"vstart","url":"audio/voice/female/shield_block.ogg","t":70771.40000000596,"dur":1.44,"ta":64.69}
+{"ev":"vend","url":"audio/voice/female/shield_block.ogg","t":70771.69999998808,"reason":"kill","ta":64.69}
+{"ev":"vstart","url":"audio/voice/female/protect_end.ogg","t":70771.69999998808,"dur":3.6,"ta":64.69}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":71050.90000000596,"ta":64.969}
+{"ev":"vibrate","pattern":"[20]","t":71299.19999998808,"ta":65.218}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":72566.09999999404,"ta":66.484}
+{"ev":"vibrate","pattern":"[20]","t":72929.40000000596,"ta":66.848}
+{"ev":"vend","url":"audio/voice/female/protect_end.ogg","t":72929.40000000596,"reason":"kill","ta":66.848}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":73375.29999998212,"ta":67.294}
+{"ev":"start","t":73375.5,"sid":58,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":67.294}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":73875.29999998212,"ta":67.794}
+{"ev":"start","t":73875.5,"sid":59,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":67.794}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":73918.79999998212,"ta":67.837}
+{"ev":"vibrate","pattern":"[10]","t":74274,"ta":68.192}
+{"ev":"start","t":74274.09999999404,"sid":60,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":68.192}
+{"ev":"start","t":74375.40000000596,"sid":61,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":68.294}
+{"ev":"start","t":74375.59999999404,"sid":62,"url":"audio/sfx/whoosh_up.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":68.294}
+{"ev":"vstart","url":"audio/voice/female/dir_up.ogg","t":74375.59999999404,"dur":0.5570975056689342,"ta":68.294}
+{"ev":"vend","url":"audio/voice/female/dir_up.ogg","t":75043.40000000596,"reason":"kill","ta":68.962}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":75561,"ta":69.479}
+{"ev":"vibrate","pattern":"[10]","t":75924.40000000596,"ta":69.843}
+{"ev":"start","t":75924.40000000596,"sid":63,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":69.843}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":76938.5,"ta":70.857}
+{"ev":"vibrate","pattern":"[20]","t":77301.90000000596,"ta":71.22}
+{"ev":"vibrate","pattern":"[20]","t":77301.90000000596,"ta":71.22}
+{"ev":"start","t":77302,"sid":64,"url":"audio/sfx/boost.ogg","layer":"sfx","dur":1.8,"rate":1,"loop":false,"when":0,"ta":71.22}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":77375.69999998808,"ta":71.294}
+{"ev":"start","t":77375.79999998212,"sid":65,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":71.294}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":77875.69999998808,"ta":71.794}
+{"ev":"start","t":77875.79999998212,"sid":66,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":71.794}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":77891.59999999404,"ta":71.81}
+{"ev":"vibrate","pattern":"[10]","t":78257.79999998212,"ta":72.176}
+{"ev":"start","t":78257.90000000596,"sid":67,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":72.176}
+{"ev":"start","t":78375.69999998808,"sid":68,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":72.294}
+{"ev":"start","t":78376,"sid":69,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":72.294}
+{"ev":"vstart","url":"audio/voice/female/dir_down.ogg","t":78376,"dur":0.39909297052154197,"ta":72.294}
+{"ev":"vend","url":"audio/voice/female/dir_down.ogg","t":78758.40000000596,"reason":"kill","ta":72.677}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":79566.59999999404,"ta":73.485}
+{"ev":"vibrate","pattern":"[10]","t":79924.40000000596,"ta":73.843}
+{"ev":"start","t":79924.59999999404,"sid":70,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":73.843}
+{"ev":"vibrate","pattern":"[15]","t":80194.59999999404,"ta":74.113}
+{"ev":"vstart","url":"audio/voice/female/shield_ready.ogg","t":80194.59999999404,"dur":1.28,"ta":74.113}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":81067.79999998212,"ta":74.986}
+{"ev":"vibrate","pattern":"[20]","t":81314.5,"ta":75.233}
+{"ev":"vibrate","pattern":"[20]","t":81314.5,"ta":75.233}
+{"ev":"start","t":81314.5,"sid":71,"url":"audio/sfx/shield.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":75.233}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":81376,"ta":75.294}
+{"ev":"start","t":81376,"sid":72,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":75.294}
+{"ev":"start","t":81384.19999998808,"sid":73,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":75.303}
+{"ev":"vend","url":"audio/voice/female/shield_ready.ogg","t":81384.19999998808,"reason":"kill","ta":75.303}
+{"ev":"vstart","url":"audio/voice/female/dir_down.ogg","t":81384.19999998808,"dur":0.39909297052154197,"ta":75.303}
+{"ev":"vend","url":"audio/voice/female/dir_down.ogg","t":81776.5,"reason":"kill","ta":75.695}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":81875.90000000596,"ta":75.794}
+{"ev":"start","t":81876.09999999404,"sid":74,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":75.794}
+{"ev":"vibrate","pattern":"[100]","t":82376,"ta":76.294}
+{"ev":"start","t":82376,"sid":75,"url":"audio/sfx/shield_block.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":76.294}
+{"ev":"vstart","url":"audio/voice/female/shield_block.ogg","t":82376.09999999404,"dur":1.44,"ta":76.294}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":82525.29999998212,"ta":76.444}
+{"ev":"vibrate","pattern":"[10]","t":82890.40000000596,"ta":76.809}
+{"ev":"start","t":82890.40000000596,"sid":76,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":76.809}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":83063.19999998808,"ta":76.982}
+{"ev":"start","t":83063.29999998212,"sid":77,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":76.982}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":83563.19999998808,"ta":77.482}
+{"ev":"start","t":83563.29999998212,"sid":78,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":77.482}
+{"ev":"vend","url":"audio/voice/female/shield_block.ogg","t":83610.79999998212,"reason":"kill","ta":77.529}
+{"ev":"gesture","type":"tap","x":195,"y":422,"t":84001.40000000596,"ta":77.92}
+{"ev":"vibrate","pattern":"[80]","t":84063.19999998808,"ta":77.982}
+{"ev":"start","t":84063.29999998212,"sid":79,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":77.982}
+{"ev":"vstart","url":"audio/voice/female/hit_down.ogg","t":84063.40000000596,"dur":5.28,"ta":77.982}
+{"ev":"start","t":84342.40000000596,"sid":80,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":78.261}
+{"ev":"vend","url":"audio/voice/female/hit_down.ogg","t":84342.40000000596,"reason":"kill","ta":78.261}
+{"ev":"vstart","url":"audio/voice/female/dir_right.ogg","t":84342.40000000596,"dur":0.7170975056689343,"ta":78.261}
+{"ev":"vibrate","pattern":"[20]","t":84365.5,"ta":78.284}
+{"ev":"vend","url":"audio/voice/female/dir_right.ogg","t":84365.5,"reason":"kill","ta":78.284}
+{"ev":"vstart","url":"audio/voice/female/hit_down.ogg","t":84365.69999998808,"dur":5.28,"ta":78.284}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":85090.40000000596,"ta":79.009}
+{"ev":"vibrate","pattern":"[10]","t":85440.59999999404,"ta":79.359}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":85996.40000000596,"ta":79.915}
+{"ev":"start","t":85996.5,"sid":81,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":79.915}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":86496.40000000596,"ta":80.415}
+{"ev":"start","t":86496.5,"sid":82,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":80.415}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":86834.29999998212,"ta":80.753}
+{"ev":"vibrate","pattern":"[20]","t":86996.5,"ta":80.915}
+{"ev":"start","t":86996.59999999404,"sid":83,"url":"audio/sfx/dodge.ogg","layer":"sfx","dur":1.2,"rate":1,"loop":false,"when":0,"ta":80.915}
+{"ev":"vend","url":"audio/voice/female/hit_down.ogg","t":86996.59999999404,"reason":"kill","ta":80.915}
+{"ev":"vstart","url":"audio/voice/female/ms_10.ogg","t":86996.69999998808,"dur":1.12,"ta":80.915}
+{"ev":"vibrate","pattern":"[20]","t":87080.59999999404,"ta":80.999}
+{"ev":"vibrate","pattern":"[40,100,40]","t":87080.59999999404,"ta":80.999}
+{"ev":"vend","url":"audio/voice/female/ms_10.ogg","t":87080.59999999404,"reason":"kill","ta":80.999}
+{"ev":"vstart","url":"audio/voice/female/feat_shield_done.ogg","t":87080.69999998808,"dur":4.64,"ta":80.999}
+{"ev":"start","t":87250.5,"sid":84,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":81.169}
+{"ev":"vend","url":"audio/voice/female/feat_shield_done.ogg","t":87250.5,"reason":"kill","ta":81.169}
+{"ev":"vstart","url":"audio/voice/female/dir_right.ogg","t":87250.59999999404,"dur":0.7170975056689343,"ta":81.169}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":87824,"ta":81.742}
+{"ev":"vend","url":"audio/voice/female/dir_right.ogg","t":87929.5,"reason":"kill","ta":81.848}
+{"ev":"vibrate","pattern":"[10]","t":88173.40000000596,"ta":82.092}
+{"ev":"start","t":88173.69999998808,"sid":85,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":82.092}
+{"ev":"vstart","url":"audio/voice/female/paused.ogg","t":88173.79999998212,"dur":0.9570975056689343,"ta":82.092}
+{"ev":"stop","t":88533.79999998212,"sid":20,"when":0,"ta":82.452}
+{"ev":"vend","url":"audio/voice/female/paused.ogg","t":89113.5,"reason":"kill","ta":83.032}
+{"ev":"vstart","url":"audio/voice/female/menu_main.ogg","t":89113.79999998212,"dur":3.92,"ta":83.032}
+{"ev":"gesture","type":"doubletap","x":195,"y":422,"t":89310.79999998212,"ta":83.229}
+{"ev":"vibrate","pattern":"[20]","t":89558.09999999404,"ta":83.476}
+{"ev":"start","t":89558.29999998212,"sid":86,"url":"audio/bgm/engine.ogg","layer":"bgm","dur":117,"rate":1,"loop":true,"when":0,"ta":83.477}
+{"ev":"stop","t":90118.40000000596,"sid":85,"when":0,"ta":84.037}
+{"ev":"start","t":90358.59999999404,"sid":87,"url":"audio/sfx/whoosh_right.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":84.277}
+{"ev":"vend","url":"audio/voice/female/menu_main.ogg","t":90358.59999999404,"reason":"kill","ta":84.277}
+{"ev":"vstart","url":"audio/voice/female/dir_right.ogg","t":90358.59999999404,"dur":0.7170975056689343,"ta":84.277}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":90740.69999998808,"ta":84.659}
+{"ev":"vend","url":"audio/voice/female/dir_right.ogg","t":91017.19999998808,"reason":"kill","ta":84.936}
+{"ev":"vibrate","pattern":"[10]","t":91107,"ta":85.025}
+{"ev":"start","t":91107.09999999404,"sid":88,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":85.025}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":92102.29999998212,"ta":86.021}
+{"ev":"vibrate","pattern":"[10]","t":92457,"ta":86.375}
+{"ev":"start","t":92457.09999999404,"sid":89,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":86.375}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":93358.59999999404,"ta":87.277}
+{"ev":"start","t":93358.69999998808,"sid":90,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":87.277}
+{"ev":"gesture","type":"swipeleft","x":195,"y":422,"t":93647.29999998212,"ta":87.566}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":93858.59999999404,"ta":87.777}
+{"ev":"start","t":93858.69999998808,"sid":91,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":87.777}
+{"ev":"vibrate","pattern":"[10]","t":94006.79999998212,"ta":87.925}
+{"ev":"start","t":94006.90000000596,"sid":92,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":87.925}
+{"ev":"vibrate","pattern":"[80]","t":94358.59999999404,"ta":88.277}
+{"ev":"start","t":94358.69999998808,"sid":93,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":88.277}
+{"ev":"vstart","url":"audio/voice/female/hit_right.ogg","t":94358.79999998212,"dur":4.8,"ta":88.277}
+{"ev":"start","t":94359.40000000596,"sid":94,"url":"audio/sfx/whoosh_down.ogg","layer":"sfx","dur":2.5,"rate":1,"loop":false,"when":0,"ta":88.278}
+{"ev":"vend","url":"audio/voice/female/hit_right.ogg","t":94359.5,"reason":"kill","ta":88.278}
+{"ev":"vstart","url":"audio/voice/female/dir_down.ogg","t":94359.5,"dur":0.39909297052154197,"ta":88.278}
+{"ev":"vend","url":"audio/voice/female/dir_down.ogg","t":94755.40000000596,"reason":"kill","ta":88.674}
+{"ev":"vstart","url":"audio/voice/female/hit_right.ogg","t":94755.69999998808,"dur":4.8,"ta":88.674}
+{"ev":"gesture","type":"swiperight","x":195,"y":422,"t":95390.29999998212,"ta":89.309}
+{"ev":"vibrate","pattern":"[10]","t":95740.29999998212,"ta":89.659}
+{"ev":"start","t":95740.29999998212,"sid":95,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":89.659}
+{"ev":"vibrate","pattern":"[15]","t":96314.40000000596,"ta":90.233}
+{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":96973.79999998212,"ta":90.892}
+{"ev":"vibrate","pattern":"[10]","t":97323.59999999404,"ta":91.242}
+{"ev":"start","t":97323.69999998808,"sid":96,"url":"audio/sfx/whiff.ogg","layer":"sfx","dur":0.39709750566893426,"rate":1,"loop":false,"when":0,"ta":91.242}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":97359.5,"ta":91.278}
+{"ev":"start","t":97359.59999999404,"sid":97,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":91.278}
+{"ev":"vibrate","pattern":"[25,40,25,40,25]","t":97859.5,"ta":91.778}
+{"ev":"start","t":97859.59999999404,"sid":98,"url":"audio/sfx/alarm.ogg","layer":"sfx","dur":0.9970975056689343,"rate":1,"loop":false,"when":0,"ta":91.778}
+{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":98229,"ta":92.147}
+{"ev":"vibrate","pattern":"[80]","t":98359.5,"ta":92.278}
+{"ev":"vend","url":"audio/voice/female/hit_right.ogg","t":98359.90000000596,"reason":"kill","ta":92.278}
+{"ev":"vibrate","pattern":"[60,40,60]","t":98359.90000000596,"ta":92.278}
+{"ev":"start","t":98360.29999998212,"sid":99,"url":"audio/sfx/hit.ogg","layer":"sfx","dur":1.5,"rate":1,"loop":false,"when":0,"ta":92.279}
+{"ev":"start","t":98360.29999998212,"sid":100,"url":"audio/sfx/crash.ogg","layer":"sfx","dur":3,"rate":1,"loop":false,"when":0,"ta":92.279}
+{"ev":"vibrate","pattern":"[10]","t":98590.09999999404,"ta":92.508}
+{"ev":"vstart","url":"audio/voice/female/menu_lobby.ogg","t":98590.40000000596,"dur":1.04,"ta":92.509}
+{"ev":"stop","t":99020.09999999404,"sid":86,"when":0,"ta":92.938}
+{"ev":"probe_ready","t":9.700000017881393,"ta":-6.072}
diff --git a/research/space-polish/round2/live-B-transcript.md b/research/space-polish/round2/live-B-transcript.md
new file mode 100644
index 00000000..8d94776a
--- /dev/null
+++ b/research/space-polish/round2/live-B-transcript.md
@@ -0,0 +1,360 @@
+# space 实时会话 transcript
+
+- `[ -0.07s]` **GESTURE** tap @(195,422)
+- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
+- `[ 0.10s]` VOICE ▶ second_run_ask (dur 3.04s)
+- `[ 0.43s]` **GESTURE** tap @(195,422)
+- `[ 0.79s]` VIBRATE [20]
+- `[ 0.79s]` VOICE ■ second_run_ask (kill)
+- `[ 0.96s]` BGM ♪ engine (loop)
+- `[ 1.76s]` **GESTURE** swipeleft @(195,422)
+- `[ 2.11s]` VIBRATE [10]
+- `[ 2.11s]` SFX ♪ whiff
+- `[ 2.29s]` SFX ♪ whoosh_left
+- `[ 3.34s]` **GESTURE** tap @(195,422)
+- `[ 3.71s]` VIBRATE [20]
+- `[ 4.17s]` **GESTURE** swipeleft @(195,422)
+- `[ 4.53s]` VIBRATE [10]
+- `[ 5.29s]` VIBRATE [25,40,25,40,25]
+- `[ 5.29s]` SFX ♪ alarm
+- `[ 5.71s]` **GESTURE** doubletap @(195,422)
+- `[ 5.79s]` VIBRATE [25,40,25,40,25]
+- `[ 5.79s]` SFX ♪ alarm
+- `[ 5.96s]` VIBRATE [20]
+- `[ 5.96s]` VIBRATE [40,100,40]
+- `[ 5.96s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 6.30s]` SFX ♪ dodge
+- `[ 6.30s]` SFX ♪ whoosh_left
+- `[ 7.23s]` **GESTURE** swipedown @(195,422)
+- `[ 7.59s]` VIBRATE [10]
+- `[ 7.60s]` VOICE ■ feat_shield_done (kill)
+- `[ 7.60s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 7.73s]` BGM ♪ menu (loop)
+- `[ 8.55s]` VOICE ■ paused (kill)
+- `[ 8.55s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 8.60s]` **GESTURE** swipedown @(195,422)
+- `[ 8.96s]` VIBRATE [10]
+- `[ 8.96s]` BGM ♪ engine (loop)
+- `[ 9.76s]` SFX ♪ whoosh_left
+- `[ 9.86s]` **GESTURE** doubletap @(195,422)
+- `[ 10.11s]` VIBRATE [20]
+- `[ 10.11s]` VIBRATE [40,100,40]
+- `[ 10.11s]` VOICE ■ menu_main (kill)
+- `[ 10.11s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 11.28s]` **GESTURE** swipeleft @(195,422)
+- `[ 11.64s]` VIBRATE [10]
+- `[ 12.76s]` VIBRATE [25,40,25,40,25]
+- `[ 12.76s]` SFX ♪ alarm
+- `[ 13.07s]` **GESTURE** swipeleft @(195,422)
+- `[ 13.26s]` VIBRATE [25,40,25,40,25]
+- `[ 13.26s]` SFX ♪ alarm
+- `[ 13.43s]` VIBRATE [10]
+- `[ 13.75s]` VOICE ■ feat_shield_done (kill)
+- `[ 13.76s]` SFX ♪ dodge
+- `[ 13.76s]` SFX ♪ whoosh_down
+- `[ 14.17s]` **GESTURE** swipedown @(195,422)
+- `[ 14.53s]` VIBRATE [10]
+- `[ 15.54s]` **GESTURE** swipedown @(195,422)
+- `[ 15.89s]` VIBRATE [10]
+- `[ 16.76s]` VIBRATE [25,40,25,40,25]
+- `[ 16.76s]` SFX ♪ alarm
+- `[ 16.99s]` **GESTURE** doubletap @(195,422)
+- `[ 17.24s]` VIBRATE [20]
+- `[ 17.24s]` VIBRATE [40,100,40]
+- `[ 17.24s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 17.26s]` VIBRATE [25,40,25,40,25]
+- `[ 17.26s]` SFX ♪ alarm
+- `[ 17.76s]` SFX ♪ dodge
+- `[ 17.76s]` SFX ♪ whoosh_up
+- `[ 18.59s]` **GESTURE** swipedown @(195,422)
+- `[ 18.94s]` VIBRATE [10]
+- `[ 18.95s]` BGM ♪ menu (loop)
+- `[ 18.95s]` VOICE ■ feat_shield_done (kill)
+- `[ 18.95s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 19.90s]` VOICE ■ paused (kill)
+- `[ 19.90s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 20.17s]` **GESTURE** doubletap @(195,422)
+- `[ 20.41s]` VIBRATE [20]
+- `[ 20.41s]` BGM ♪ engine (loop)
+- `[ 20.79s]` VOICE ■ menu_main (kill)
+- `[ 20.79s]` VOICE ▶ feat_boost (dur 3.84s)
+- `[ 21.44s]` **GESTURE** swipeup @(195,422)
+- `[ 21.80s]` VIBRATE [10]
+- `[ 23.11s]` **GESTURE** swipedown @(195,422)
+- `[ 23.46s]` VIBRATE [10]
+- `[ 23.87s]` VOICE ■ feat_boost (kill)
+- `[ 24.29s]` **GESTURE** tap @(195,422)
+- `[ 24.65s]` VIBRATE [20]
+- `[ 24.65s]` VIBRATE [20]
+- `[ 24.65s]` SFX ♪ boost
+- `[ 24.65s]` VOICE ▶ feat_boost_done (dur 3.44s)
+- `[ 25.58s]` **GESTURE** tap @(195,422)
+- `[ 25.95s]` VIBRATE [20]
+- `[ 25.95s]` VOICE ■ feat_boost_done (kill)
+- `[ 27.05s]` **GESTURE** doubletap @(195,422)
+- `[ 27.15s]` SFX ♪ whoosh_right
+- `[ 27.29s]` VIBRATE [20]
+- `[ 27.29s]` VIBRATE [40,100,40]
+- `[ 27.29s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 28.57s]` **GESTURE** swipeup @(195,422)
+- `[ 28.93s]` VIBRATE [10]
+- `[ 28.93s]` SFX ♪ whiff
+- `[ 29.92s]` **GESTURE** swiperight @(195,422)
+- `[ 30.15s]` VIBRATE [25,40,25,40,25]
+- `[ 30.15s]` SFX ♪ alarm
+- `[ 30.28s]` VIBRATE [10]
+- `[ 30.65s]` VIBRATE [25,40,25,40,25]
+- `[ 30.65s]` SFX ♪ alarm
+- `[ 30.93s]` VOICE ■ feat_shield_done (kill)
+- `[ 31.15s]` SFX ♪ dodge
+- `[ 31.15s]` SFX ♪ whoosh_right
+- `[ 31.66s]` **GESTURE** doubletap @(195,422)
+- `[ 31.91s]` VIBRATE [20]
+- `[ 31.91s]` VIBRATE [40,100,40]
+- `[ 31.91s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 33.15s]` **GESTURE** swipeleft @(195,422)
+- `[ 33.51s]` VIBRATE [10]
+- `[ 33.51s]` SFX ♪ whiff
+- `[ 34.15s]` VIBRATE [25,40,25,40,25]
+- `[ 34.15s]` SFX ♪ alarm
+- `[ 34.53s]` **GESTURE** swipeleft @(195,422)
+- `[ 34.65s]` VIBRATE [25,40,25,40,25]
+- `[ 34.65s]` SFX ♪ alarm
+- `[ 34.90s]` VIBRATE [10]
+- `[ 34.90s]` SFX ♪ whiff
+- `[ 35.15s]` VIBRATE [30,50,30,50,30]
+- `[ 35.15s]` SFX ♪ shield_block
+- `[ 35.15s]` VOICE ■ feat_shield_done (kill)
+- `[ 35.15s]` VOICE ▶ protect_right (dur 5.2s)
+- `[ 35.16s]` SFX ♪ whoosh_right
+- `[ 36.04s]` **GESTURE** tap @(195,422)
+- `[ 36.41s]` VIBRATE [20]
+- `[ 36.41s]` VOICE ■ protect_right (kill)
+- `[ 37.39s]` **GESTURE** tap @(195,422)
+- `[ 37.75s]` VIBRATE [20]
+- `[ 37.75s]` VIBRATE [20]
+- `[ 37.75s]` SFX ♪ boost
+- `[ 38.16s]` VIBRATE [25,40,25,40,25]
+- `[ 38.16s]` SFX ♪ alarm
+- `[ 38.59s]` **GESTURE** swiperight @(195,422)
+- `[ 38.66s]` VIBRATE [25,40,25,40,25]
+- `[ 38.66s]` SFX ♪ alarm
+- `[ 38.94s]` VIBRATE [10]
+- `[ 39.16s]` SFX ♪ dodge
+- `[ 39.16s]` SFX ♪ whoosh_left
+- `[ 40.08s]` **GESTURE** swipeup @(195,422)
+- `[ 40.44s]` VIBRATE [10]
+- `[ 40.44s]` SFX ♪ whiff
+- `[ 41.81s]` **GESTURE** swipeleft @(195,422)
+- `[ 42.16s]` VIBRATE [25,40,25,40,25]
+- `[ 42.16s]` SFX ♪ alarm
+- `[ 42.16s]` VIBRATE [10]
+- `[ 42.66s]` VIBRATE [25,40,25,40,25]
+- `[ 42.66s]` SFX ♪ alarm
+- `[ 43.16s]` SFX ♪ dodge
+- `[ 43.16s]` SFX ♪ whoosh_left
+- `[ 45.79s]` VOICE ▶ feat_shield (dur 2.8s)
+- `[ 48.04s]` VOICE ■ feat_shield (kill)
+- `[ 52.60s]` **GESTURE** tap @(195,422)
+- `[ 52.97s]` VIBRATE [20]
+- `[ 53.64s]` **GESTURE** swipeup @(195,422)
+- `[ 53.79s]` VOICE ▶ protect_soon (dur 1.52s)
+- `[ 53.99s]` VIBRATE [10]
+- `[ 53.99s]` SFX ♪ whiff
+- `[ 54.98s]` **GESTURE** tap @(195,422)
+- `[ 55.03s]` VOICE ■ protect_soon (kill)
+- `[ 55.34s]` VIBRATE [20]
+- `[ 55.34s]` VIBRATE [20]
+- `[ 55.34s]` SFX ♪ boost
+- `[ 56.20s]` **GESTURE** swiperight @(195,422)
+- `[ 56.29s]` SFX ♪ whoosh_up
+- `[ 56.56s]` VIBRATE [10]
+- `[ 56.56s]` SFX ♪ whiff
+- `[ 57.82s]` **GESTURE** tap @(195,422)
+- `[ 58.18s]` VIBRATE [20]
+- `[ 58.18s]` VIBRATE [40,100,40]
+- `[ 58.18s]` VOICE ▶ boost_not_ready (dur 3.04s)
+- `[ 58.87s]` **GESTURE** doubletap @(195,422)
+- `[ 59.11s]` VIBRATE [20]
+- `[ 59.11s]` VIBRATE [20]
+- `[ 59.11s]` SFX ♪ shield
+- `[ 59.29s]` VIBRATE [25,40,25,40,25]
+- `[ 59.29s]` SFX ♪ alarm
+- `[ 59.79s]` VIBRATE [25,40,25,40,25]
+- `[ 59.79s]` SFX ♪ alarm
+- `[ 59.99s]` **GESTURE** swipedown @(195,422)
+- `[ 60.29s]` VIBRATE [100]
+- `[ 60.29s]` SFX ♪ shield_block
+- `[ 60.29s]` SFX ♪ whoosh_right
+- `[ 60.29s]` VOICE ■ boost_not_ready (kill)
+- `[ 60.29s]` VOICE ▶ dir_right (dur 0.7170975056689343s)
+- `[ 60.34s]` VIBRATE [10]
+- `[ 60.79s]` VIBRATE [30,50,30,50,30]
+- `[ 60.79s]` VOICE ■ dir_right (kill)
+- `[ 60.79s]` VOICE ▶ protect_end (dur 3.6s)
+- `[ 61.26s]` **GESTURE** swiperight @(195,422)
+- `[ 61.63s]` VIBRATE [10]
+- `[ 62.79s]` **GESTURE** doubletap @(195,422)
+- `[ 63.04s]` VIBRATE [20]
+- `[ 63.04s]` VIBRATE [40,100,40]
+- `[ 63.04s]` VOICE ■ protect_end (kill)
+- `[ 63.04s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 63.29s]` VIBRATE [25,40,25,40,25]
+- `[ 63.29s]` SFX ♪ alarm
+- `[ 63.79s]` VIBRATE [25,40,25,40,25]
+- `[ 63.79s]` SFX ♪ alarm
+- `[ 63.85s]` **GESTURE** swipeleft @(195,422)
+- `[ 64.21s]` VIBRATE [10]
+- `[ 64.21s]` SFX ♪ whiff
+- `[ 64.29s]` SFX ♪ dodge
+- `[ 64.29s]` SFX ♪ whoosh_left
+- `[ 64.29s]` VOICE ■ feat_shield_done (kill)
+- `[ 64.29s]` VOICE ▶ dir_left (dur 0.39909297052154197s)
+- `[ 64.69s]` VOICE ■ dir_left (kill)
+- `[ 64.69s]` VOICE ▶ shield_block (dur 1.44s)
+- `[ 64.69s]` VOICE ■ shield_block (kill)
+- `[ 64.69s]` VOICE ▶ protect_end (dur 3.6s)
+- `[ 64.97s]` **GESTURE** doubletap @(195,422)
+- `[ 65.22s]` VIBRATE [20]
+- `[ 66.48s]` **GESTURE** tap @(195,422)
+- `[ 66.85s]` VIBRATE [20]
+- `[ 66.85s]` VOICE ■ protect_end (kill)
+- `[ 67.29s]` VIBRATE [25,40,25,40,25]
+- `[ 67.29s]` SFX ♪ alarm
+- `[ 67.79s]` VIBRATE [25,40,25,40,25]
+- `[ 67.79s]` SFX ♪ alarm
+- `[ 67.84s]` **GESTURE** swipeup @(195,422)
+- `[ 68.19s]` VIBRATE [10]
+- `[ 68.19s]` SFX ♪ whiff
+- `[ 68.29s]` SFX ♪ dodge
+- `[ 68.29s]` SFX ♪ whoosh_up
+- `[ 68.29s]` VOICE ▶ dir_up (dur 0.5570975056689342s)
+- `[ 68.96s]` VOICE ■ dir_up (kill)
+- `[ 69.48s]` **GESTURE** swiperight @(195,422)
+- `[ 69.84s]` VIBRATE [10]
+- `[ 69.84s]` SFX ♪ whiff
+- `[ 70.86s]` **GESTURE** tap @(195,422)
+- `[ 71.22s]` VIBRATE [20]
+- `[ 71.22s]` VIBRATE [20]
+- `[ 71.22s]` SFX ♪ boost
+- `[ 71.29s]` VIBRATE [25,40,25,40,25]
+- `[ 71.29s]` SFX ♪ alarm
+- `[ 71.79s]` VIBRATE [25,40,25,40,25]
+- `[ 71.79s]` SFX ♪ alarm
+- `[ 71.81s]` **GESTURE** swipeleft @(195,422)
+- `[ 72.18s]` VIBRATE [10]
+- `[ 72.18s]` SFX ♪ whiff
+- `[ 72.29s]` SFX ♪ dodge
+- `[ 72.29s]` SFX ♪ whoosh_down
+- `[ 72.29s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 72.68s]` VOICE ■ dir_down (kill)
+- `[ 73.48s]` **GESTURE** swipeleft @(195,422)
+- `[ 73.84s]` VIBRATE [10]
+- `[ 73.84s]` SFX ♪ whiff
+- `[ 74.11s]` VIBRATE [15]
+- `[ 74.11s]` VOICE ▶ shield_ready (dur 1.28s)
+- `[ 74.99s]` **GESTURE** doubletap @(195,422)
+- `[ 75.23s]` VIBRATE [20]
+- `[ 75.23s]` VIBRATE [20]
+- `[ 75.23s]` SFX ♪ shield
+- `[ 75.29s]` VIBRATE [25,40,25,40,25]
+- `[ 75.29s]` SFX ♪ alarm
+- `[ 75.30s]` SFX ♪ whoosh_down
+- `[ 75.30s]` VOICE ■ shield_ready (kill)
+- `[ 75.30s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 75.69s]` VOICE ■ dir_down (kill)
+- `[ 75.79s]` VIBRATE [25,40,25,40,25]
+- `[ 75.79s]` SFX ♪ alarm
+- `[ 76.29s]` VIBRATE [100]
+- `[ 76.29s]` SFX ♪ shield_block
+- `[ 76.29s]` VOICE ▶ shield_block (dur 1.44s)
+- `[ 76.44s]` **GESTURE** swiperight @(195,422)
+- `[ 76.81s]` VIBRATE [10]
+- `[ 76.81s]` SFX ♪ whiff
+- `[ 76.98s]` VIBRATE [25,40,25,40,25]
+- `[ 76.98s]` SFX ♪ alarm
+- `[ 77.48s]` VIBRATE [25,40,25,40,25]
+- `[ 77.48s]` SFX ♪ alarm
+- `[ 77.53s]` VOICE ■ shield_block (kill)
+- `[ 77.92s]` **GESTURE** tap @(195,422)
+- `[ 77.98s]` VIBRATE [80]
+- `[ 77.98s]` SFX ♪ hit
+- `[ 77.98s]` VOICE ▶ hit_down (dur 5.28s)
+- `[ 78.26s]` SFX ♪ whoosh_right
+- `[ 78.26s]` VOICE ■ hit_down (kill)
+- `[ 78.26s]` VOICE ▶ dir_right (dur 0.7170975056689343s)
+- `[ 78.28s]` VIBRATE [20]
+- `[ 78.28s]` VOICE ■ dir_right (kill)
+- `[ 78.28s]` VOICE ▶ hit_down (dur 5.28s)
+- `[ 79.01s]` **GESTURE** swiperight @(195,422)
+- `[ 79.36s]` VIBRATE [10]
+- `[ 79.92s]` VIBRATE [25,40,25,40,25]
+- `[ 79.92s]` SFX ♪ alarm
+- `[ 80.42s]` VIBRATE [25,40,25,40,25]
+- `[ 80.42s]` SFX ♪ alarm
+- `[ 80.75s]` **GESTURE** doubletap @(195,422)
+- `[ 80.92s]` VIBRATE [20]
+- `[ 80.92s]` SFX ♪ dodge
+- `[ 80.92s]` VOICE ■ hit_down (kill)
+- `[ 80.92s]` VOICE ▶ ms_10 (dur 1.12s)
+- `[ 81.00s]` VIBRATE [20]
+- `[ 81.00s]` VIBRATE [40,100,40]
+- `[ 81.00s]` VOICE ■ ms_10 (kill)
+- `[ 81.00s]` VOICE ▶ feat_shield_done (dur 4.64s)
+- `[ 81.17s]` SFX ♪ whoosh_right
+- `[ 81.17s]` VOICE ■ feat_shield_done (kill)
+- `[ 81.17s]` VOICE ▶ dir_right (dur 0.7170975056689343s)
+- `[ 81.74s]` **GESTURE** swipedown @(195,422)
+- `[ 81.85s]` VOICE ■ dir_right (kill)
+- `[ 82.09s]` VIBRATE [10]
+- `[ 82.09s]` BGM ♪ menu (loop)
+- `[ 82.09s]` VOICE ▶ paused (dur 0.9570975056689343s)
+- `[ 83.03s]` VOICE ■ paused (kill)
+- `[ 83.03s]` VOICE ▶ menu_main (dur 3.92s)
+- `[ 83.23s]` **GESTURE** doubletap @(195,422)
+- `[ 83.48s]` VIBRATE [20]
+- `[ 83.48s]` BGM ♪ engine (loop)
+- `[ 84.28s]` SFX ♪ whoosh_right
+- `[ 84.28s]` VOICE ■ menu_main (kill)
+- `[ 84.28s]` VOICE ▶ dir_right (dur 0.7170975056689343s)
+- `[ 84.66s]` **GESTURE** swipeleft @(195,422)
+- `[ 84.94s]` VOICE ■ dir_right (kill)
+- `[ 85.03s]` VIBRATE [10]
+- `[ 85.03s]` SFX ♪ whiff
+- `[ 86.02s]` **GESTURE** swipeup @(195,422)
+- `[ 86.38s]` VIBRATE [10]
+- `[ 86.38s]` SFX ♪ whiff
+- `[ 87.28s]` VIBRATE [25,40,25,40,25]
+- `[ 87.28s]` SFX ♪ alarm
+- `[ 87.57s]` **GESTURE** swipeleft @(195,422)
+- `[ 87.78s]` VIBRATE [25,40,25,40,25]
+- `[ 87.78s]` SFX ♪ alarm
+- `[ 87.92s]` VIBRATE [10]
+- `[ 87.92s]` SFX ♪ whiff
+- `[ 88.28s]` VIBRATE [80]
+- `[ 88.28s]` SFX ♪ hit
+- `[ 88.28s]` VOICE ▶ hit_right (dur 4.8s)
+- `[ 88.28s]` SFX ♪ whoosh_down
+- `[ 88.28s]` VOICE ■ hit_right (kill)
+- `[ 88.28s]` VOICE ▶ dir_down (dur 0.39909297052154197s)
+- `[ 88.67s]` VOICE ■ dir_down (kill)
+- `[ 88.67s]` VOICE ▶ hit_right (dur 4.8s)
+- `[ 89.31s]` **GESTURE** swiperight @(195,422)
+- `[ 89.66s]` VIBRATE [10]
+- `[ 89.66s]` SFX ♪ whiff
+- `[ 90.23s]` VIBRATE [15]
+- `[ 90.89s]` **GESTURE** swipeup @(195,422)
+- `[ 91.24s]` VIBRATE [10]
+- `[ 91.24s]` SFX ♪ whiff
+- `[ 91.28s]` VIBRATE [25,40,25,40,25]
+- `[ 91.28s]` SFX ♪ alarm
+- `[ 91.78s]` VIBRATE [25,40,25,40,25]
+- `[ 91.78s]` SFX ♪ alarm
+- `[ 92.15s]` **GESTURE** swipedown @(195,422)
+- `[ 92.28s]` VIBRATE [80]
+- `[ 92.28s]` VOICE ■ hit_right (kill)
+- `[ 92.28s]` VIBRATE [60,40,60]
+- `[ 92.28s]` SFX ♪ hit
+- `[ 92.28s]` SFX ♪ crash
+- `[ 92.51s]` VIBRATE [10]
+- `[ 92.51s]` VOICE ▶ menu_lobby (dur 1.04s)
diff --git a/research/space-polish/round2/live-B-verdicts.json b/research/space-polish/round2/live-B-verdicts.json
new file mode 100644
index 00000000..22ee684c
--- /dev/null
+++ b/research/space-polish/round2/live-B-verdicts.json
@@ -0,0 +1,533 @@
+{
+ "game": "space",
+ "settings": {
+ "voice": "female",
+ "guide": "standard",
+ "speed": 1.35,
+ "bgm": 1
+ },
+ "outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/space-20260914063503",
+ "segs": [
+ {
+ "idx": 0,
+ "voiceId": "second_run_ask",
+ "t0": 0.1,
+ "t1": 0.793,
+ "dur": 3.04,
+ "expEnd": 2.352,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 1,
+ "voiceId": "feat_shield_done",
+ "t0": 5.961,
+ "t1": 7.596,
+ "dur": 4.64,
+ "expEnd": 9.398,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 2,
+ "voiceId": "paused",
+ "t0": 7.596,
+ "t1": 8.549,
+ "dur": 0.9570975056689343,
+ "expEnd": 8.305,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 3,
+ "voiceId": "menu_main",
+ "t0": 8.549,
+ "t1": 10.109,
+ "dur": 3.92,
+ "expEnd": 11.453,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 4,
+ "voiceId": "feat_shield_done",
+ "t0": 10.109,
+ "t1": 13.749,
+ "dur": 4.64,
+ "expEnd": 13.546,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 5,
+ "voiceId": "feat_shield_done",
+ "t0": 17.24,
+ "t1": 18.945,
+ "dur": 4.64,
+ "expEnd": 20.677,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 6,
+ "voiceId": "paused",
+ "t0": 18.945,
+ "t1": 19.902,
+ "dur": 0.9570975056689343,
+ "expEnd": 19.654,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 7,
+ "voiceId": "menu_main",
+ "t0": 19.902,
+ "t1": 20.793,
+ "dur": 3.92,
+ "expEnd": 22.806,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 8,
+ "voiceId": "feat_boost",
+ "t0": 20.793,
+ "t1": 23.872,
+ "dur": 3.84,
+ "expEnd": 23.637,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 9,
+ "voiceId": "feat_boost_done",
+ "t0": 24.654,
+ "t1": 25.947,
+ "dur": 3.44,
+ "expEnd": 27.202,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 10,
+ "voiceId": "feat_shield_done",
+ "t0": 27.293,
+ "t1": 30.931,
+ "dur": 4.64,
+ "expEnd": 30.73,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 11,
+ "voiceId": "feat_shield_done",
+ "t0": 31.905,
+ "t1": 35.154,
+ "dur": 4.64,
+ "expEnd": 35.342,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 12,
+ "voiceId": "protect_right",
+ "t0": 35.154,
+ "t1": 36.407,
+ "dur": 5.2,
+ "expEnd": 39.006,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 13,
+ "voiceId": "feat_shield",
+ "t0": 45.793,
+ "t1": 48.042,
+ "dur": 2.8,
+ "expEnd": 47.867,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 14,
+ "voiceId": "protect_soon",
+ "t0": 53.793,
+ "t1": 55.031,
+ "dur": 1.52,
+ "expEnd": 54.919,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 15,
+ "voiceId": "boost_not_ready",
+ "t0": 58.183,
+ "t1": 60.293,
+ "dur": 3.04,
+ "expEnd": 60.435,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 16,
+ "voiceId": "dir_right",
+ "t0": 60.293,
+ "t1": 60.793,
+ "dur": 0.7170975056689343,
+ "expEnd": 60.824,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 17,
+ "voiceId": "protect_end",
+ "t0": 60.793,
+ "t1": 63.037,
+ "dur": 3.6,
+ "expEnd": 63.46,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 18,
+ "voiceId": "feat_shield_done",
+ "t0": 63.037,
+ "t1": 64.294,
+ "dur": 4.64,
+ "expEnd": 66.474,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 19,
+ "voiceId": "dir_left",
+ "t0": 64.294,
+ "t1": 64.689,
+ "dur": 0.39909297052154197,
+ "expEnd": 64.59,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 20,
+ "voiceId": "shield_block",
+ "t0": 64.69,
+ "t1": 64.69,
+ "dur": 1.44,
+ "expEnd": 65.757,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 21,
+ "voiceId": "protect_end",
+ "t0": 64.69,
+ "t1": 66.848,
+ "dur": 3.6,
+ "expEnd": 67.357,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 22,
+ "voiceId": "dir_up",
+ "t0": 68.294,
+ "t1": 68.962,
+ "dur": 0.5570975056689342,
+ "expEnd": 68.707,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 23,
+ "voiceId": "dir_down",
+ "t0": 72.294,
+ "t1": 72.677,
+ "dur": 0.39909297052154197,
+ "expEnd": 72.59,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 24,
+ "voiceId": "shield_ready",
+ "t0": 74.113,
+ "t1": 75.303,
+ "dur": 1.28,
+ "expEnd": 75.061,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 25,
+ "voiceId": "dir_down",
+ "t0": 75.303,
+ "t1": 75.695,
+ "dur": 0.39909297052154197,
+ "expEnd": 75.599,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 26,
+ "voiceId": "shield_block",
+ "t0": 76.294,
+ "t1": 77.529,
+ "dur": 1.44,
+ "expEnd": 77.361,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 27,
+ "voiceId": "hit_down",
+ "t0": 77.982,
+ "t1": 78.261,
+ "dur": 5.28,
+ "expEnd": 81.893,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 28,
+ "voiceId": "dir_right",
+ "t0": 78.261,
+ "t1": 78.284,
+ "dur": 0.7170975056689343,
+ "expEnd": 78.792,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 29,
+ "voiceId": "hit_down",
+ "t0": 78.284,
+ "t1": 80.915,
+ "dur": 5.28,
+ "expEnd": 82.195,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 30,
+ "voiceId": "ms_10",
+ "t0": 80.915,
+ "t1": 80.999,
+ "dur": 1.12,
+ "expEnd": 81.745,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 31,
+ "voiceId": "feat_shield_done",
+ "t0": 80.999,
+ "t1": 81.169,
+ "dur": 4.64,
+ "expEnd": 84.436,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 32,
+ "voiceId": "dir_right",
+ "t0": 81.169,
+ "t1": 81.848,
+ "dur": 0.7170975056689343,
+ "expEnd": 81.7,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 33,
+ "voiceId": "paused",
+ "t0": 82.092,
+ "t1": 83.032,
+ "dur": 0.9570975056689343,
+ "expEnd": 82.801,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 34,
+ "voiceId": "menu_main",
+ "t0": 83.032,
+ "t1": 84.277,
+ "dur": 3.92,
+ "expEnd": 85.936,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 35,
+ "voiceId": "dir_right",
+ "t0": 84.277,
+ "t1": 84.936,
+ "dur": 0.7170975056689343,
+ "expEnd": 84.808,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 36,
+ "voiceId": "hit_right",
+ "t0": 88.277,
+ "t1": 88.278,
+ "dur": 4.8,
+ "expEnd": 91.833,
+ "truncated": true,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 37,
+ "voiceId": "dir_down",
+ "t0": 88.278,
+ "t1": 88.674,
+ "dur": 0.39909297052154197,
+ "expEnd": 88.574,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 38,
+ "voiceId": "hit_right",
+ "t0": 88.674,
+ "t1": 92.278,
+ "dur": 4.8,
+ "expEnd": 92.23,
+ "truncated": false,
+ "reason": "kill",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ },
+ {
+ "idx": 39,
+ "voiceId": "menu_lobby",
+ "t0": 92.509,
+ "t1": 92.509,
+ "dur": 1.04,
+ "expEnd": 93.279,
+ "truncated": true,
+ "reason": "session-end",
+ "verdict": null,
+ "heard": null,
+ "similarity": null
+ }
+ ],
+ "rows": []
+}
\ No newline at end of file
diff --git a/research/space-polish/round2/p1-blind.md b/research/space-polish/round2/p1-blind.md
new file mode 100644
index 00000000..b79fc9e4
--- /dev/null
+++ b/research/space-polish/round2/p1-blind.md
@@ -0,0 +1,22 @@
+# P1 视障资深玩家复审:《盲航》(space polish round2)
+
+> 复审依据:round2/live-A-voice-timeline.txt(修后 live 事件时间轴,复跑两轮保护期结束窗)+
+> round2/sfx-spectrum-after.txt + round2/fix-evidence.md。对照 round1/p1-blind.md 的三问逐条结账。
+
+### 盲航(R5 复审)
+- 状态感知:3.5/5(+1.5)——保护期结束窗仍是信息密度最高的时刻,但现在**每句都送到了**:
+ 50 秒预告「训练护盾还剩十秒」(ta 149.8,ASR sim=1.0,完整识别)给了提前量;
+ protect_end 被顶断后补播完整(B 局 ta 64.69);两条被撞归因 hit_left/hit_right 被呼喊顶断后
+ 各自 replay 完整播 3.5s(ta 160.79/164.78)——round1 我判的死穴「至死不知方位」闭环。
+ protect_* 教学句不再七连截断(ta 102.3 sim=1.0)。扣 1.5 分在:护盾格挡确认句
+ (voice/shield_block)仍会被顶断无 replay(有音效+震动兜底);gd_last_life 同样;
+ 对局期依然没有 status key(宪法豁免,事件反馈句已补齐主要账目)。
+- 下一步明确性:4/5(不变)——演练/菜单/呼喊链未动,归因链完整后"下一颗从哪来"不再靠猜。
+- 愿意继续玩:是 —— 归因真话兑现后,这是少数把我当成年人、又把死因讲清楚的游戏。
+- 刺耳对账:round1 我列的 alarm/dodge/shield_block/boost 四件,修后真峰值 -3.4~-3.9dBFS、
+ ≥3kHz 能量全部 0%(alarm 质心 7580→593Hz)——客观清单全消;whoosh 方位提示音未动,对。
+- 动作反馈对账:加速冷却单击现在有「引擎还在冷却,稍等一下。」+ HEARTBEAT(playtest 验证,
+ live 资产实测加载);滑错方向有 whiff 轻叹(B 局乱按实测 3 次);激活 CONFIRM 震补齐。
+ 我要求的"拒绝必须有回音"现在对加速/护盾一视同仁。
+- 遗留关注:真机人耳最后一课——alarm 换低谐波双音后,嘈杂环境的穿透力是否还够(P3 的主场),
+ 以及 replay 链在 1.7× 语速下的节奏是否拖脚。这两项转写给不了答案。
diff --git a/research/space-polish/round2/p2-student.md b/research/space-polish/round2/p2-student.md
new file mode 100644
index 00000000..117a79e4
--- /dev/null
+++ b/research/space-polish/round2/p2-student.md
@@ -0,0 +1,17 @@
+# P2 时间充裕的大学生复审:《盲航》(space polish round2)
+
+> 复审依据同 round2 三件套。对照 round1/p2-student.md 逐条结账。
+
+### 盲航(R5 复审)
+- 状态感知:4/5(+1.5)——60 秒整不再是"断崖":50 秒有人提前打招呼(protect_soon),
+ 保护结束的宣告被顶断会补播(B 局 64.69),两条死因归因各自完整 replay(A' 局 160.79/164.78)——
+ round1 那句"合格飞行员听着像嘲讽"的账清了:现在我知道自己是怎么合格下来的。
+ 保护期里那句教学也终于一句是一句(102.3 完整 sim=1.0),不再是 7 遍半截复读。
+ 扣 1 分:护盾挡下时的确认句偶尔还是被顶断(有音效兜底,接受但可更好)。
+- 下一步明确性:4.5/5(+0.5)——冷却中单击有「引擎还在冷却,稍等一下。」回音,
+ 双击护盾冷却也有同款待遇;滑错方向有 whiff 轻叹,我不再怀疑耳机坏了。
+- 愿意继续玩:是 —— 死亡从"信息没送到"变回"我菜",挫败感对味了;结算钩子本来就成立。
+- 刺耳对账:alarm 不再是指甲刮板(16kHz 峰没了,质心 593Hz),dodge 的奖励音从嘶啦变成
+ 气声扫频——奖励终于像奖励。宿舍夜玩不会被舍友嫌了(P4 的诉求也顺带满足)。
+- 建议(留给下轮):护盾格挡句纳入 replay;加速生效时如果能有半句语音提示(现在只有音效+震动),
+ 二周目机制开局即用时的新手会更踏实。
diff --git a/research/space-polish/round2/p3-office.md b/research/space-polish/round2/p3-office.md
new file mode 100644
index 00000000..26548516
--- /dev/null
+++ b/research/space-polish/round2/p3-office.md
@@ -0,0 +1,16 @@
+# P3 时间紧张的白领复审:《盲航》(space polish round2)
+
+> 复审依据同 round2 三件套。对照 round1/p3-office.md 逐条结账。
+
+### 盲航(R5 复审)
+- 状态感知:3.5/5(+1.5)——被打断恢复的账还了一半:50 秒预告 + 保护结束宣告补播 +
+ 归因 replay,让我接个电话回来还能从语音流里拼出"保护期刚结束、我刚才被撞了两下、都撞在哪边"。
+ 但宪法豁免决定了对局期仍无 status key(上滑=闪避),打断后"护盾在不在/冷却几秒"还是要等
+ 系统开口。这是豁免表的裁定,我不越级要求,只记账。
+- 下一步明确性:4/5(+0.5)——冷却拒绝回音补齐后,"现在能不能按"不再有静默区。
+- 愿意继续玩:是 —— 单局 60-90 秒的通勤小品定位成立,保护期后敢开第二把了。
+- 刺耳对账:alarm 穿透力是我的命门——修后 0% ≥5kHz,我在地铁里直说:**这一点需要真机验证**。
+ 设计上的兜底是两档音量渐强(0.5/1.0)和 DANGER 震动同步保留,但 700/560Hz 双音在车厢底噪里
+ 够不够扎出来,转写回答不了。如果不够,建议给 alarm 保留 2-4kHz 一段过渡带(现在一刀切到 3k 以下)。
+ dodge/whiff 的低频化在嘈杂环境反而更稳(不跟报站声撞车)。
+- 建议:真机第一课 = 地铁环境 alarm 可辨识度;其余闭环。
diff --git a/research/space-polish/round2/p4-worker.md b/research/space-polish/round2/p4-worker.md
new file mode 100644
index 00000000..f9b86ad9
--- /dev/null
+++ b/research/space-polish/round2/p4-worker.md
@@ -0,0 +1,16 @@
+# P4 疲惫的工人复审:《盲航》(space polish round2)
+
+> 复审依据同 round2 三件套。对照 round1/p4-worker.md 逐条结账。
+
+### 盲航(R5 复审)
+- 状态感知:4/5(+1.5)——我现在能听明白"要变天了":50 秒先说「训练护盾还剩十秒」,
+ 到点了那句「训练护盾关闭,接下来靠你自己了」被别的声音打断了还会重新说一遍(B 局 64.69)。
+ 前两回被撞,「左边撞上的」「右边撞上的」都完整补给我了(A' 局 160.79/164.78)——
+ 不再是"直接宣布罚款",是先告诉我哪块板子掉的。教学句也一句是一句,不催我。
+- 下一步明确性:4.5/5(+0.5)——我按快了、滑错了,现在有轻轻一声叹告诉我"收到了但没用",
+ 还有冷却的时候单击会说「引擎还在冷却,稍等一下」,我不怕手机卡了。
+- 愿意继续玩:是 —— 头一分钟有人手把手教、输了讲清楚、夜里不炸耳,够我收工后玩两把。
+- 刺耳对账:警报换成了闷闷的"嘟嘟"(700/560Hz,以前 16kHz 的尖),小音量外放不刺耳了;
+ 撞上那下(hit)没动,还是低频的"咣",接受。舍友那边过关了。
+- 建议:就一条——护盾挡下来的那句话("护盾挡下了撞击")有时候还是会被新陨石的声音盖掉,
+ 虽然"咚"一声和震动还在,但那句话能补齐就更踏实(P1 也记了这条,留给下轮)。
diff --git a/research/space-polish/round2/sfx-spectrum-after.txt b/research/space-polish/round2/sfx-spectrum-after.txt
new file mode 100644
index 00000000..ab49c7c7
--- /dev/null
+++ b/research/space-polish/round2/sfx-spectrum-after.txt
@@ -0,0 +1,13 @@
+id dur TP dBFS DC %>3kHz %>5kHz centroid maxkHz flags
+alarm 1.00 -3.50 -0.00001 0.0 0.0 593 0.56
+boost 1.80 -3.60 0.00058 0.0 0.0 114 0.06
+crash 3.00 -3.00 0.00069 1.5 1.1 170 0.03
+dodge 1.20 -3.90 0.00002 0.0 0.0 1090 0.66
+hit 1.50 -3.80 -0.00001 30.7 16.7 2351 0.50 5k+高
+shield 1.50 -3.40 0.00000 0.0 0.0 784 0.98
+shield_block 1.50 -3.90 -0.00010 0.0 0.0 1271 0.52
+whiff 0.40 -4.80 0.00001 0.0 0.0 461 0.20
+whoosh_down 2.50 -3.00 0.00016 0.2 0.1 211 0.25
+whoosh_left 2.50 -3.20 0.00004 0.1 0.0 188 0.16
+whoosh_right 2.50 -3.20 0.00004 0.1 0.0 188 0.16
+whoosh_up 2.50 -3.20 -0.00017 0.5 0.1 528 0.40
diff --git a/tools/gen_space_syn.py b/tools/gen_space_syn.py
new file mode 100644
index 00000000..4e59f816
--- /dev/null
+++ b/tools/gen_space_syn.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""《盲航》程序合成音效重制(space polish R5,research/space-polish/round1 取证结论)。
+
+重制 5 件 + 新增 1 件(落 web/space/audio/sfx/):
+ alarm 全程最高暴露(每颗陨石两遍)→ 低谐波电子双音,5kHz 以上近零能量
+ dodge 高频嘶声(-2.30dBFS / 63.6%≥3kHz)→ 中频气声扫频
+ shield_block 保护期每 4s 一响 + 真峰值超标 → 柔和电涟波
+ boost 真峰值 -2.70dBFS / 53%≥3kHz → 低频引擎冲刺
+ shield 真峰值 -2.90dBFS 超标 → 上升 shimmer 重制
+ whiff 新增:挥空/滑错方向的轻反馈(归因真话:无效手势有回音)
+
+one-shot QC(同 gen_cipher_syn.py 标准):去直流 + 首尾 8ms cos² + 真峰值 ≤-3dBFS
+(编码后 ebur128 实测,MDCT 过冲超限自动降档重编)。
+
+用法:.venv-tts/bin/python tools/gen_space_syn.py
+"""
+import os
+import subprocess
+import sys
+
+import numpy as np
+import soundfile as sf
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+FFMPEG = os.path.join(ROOT, "tools", "bin", "ffmpeg")
+OUT = os.path.join(ROOT, "tools", "gen_space_syn_wav")
+DST = os.path.join(ROOT, "web", "space", "audio", "sfx")
+os.makedirs(OUT, exist_ok=True)
+os.makedirs(DST, exist_ok=True)
+
+sr = 44100
+ONE_SHOT_TP_CEIL = -3.0
+SAMPLE_PEAK = 0.66
+FADE_N = int(sr * 0.008)
+
+_rng = np.random.default_rng(20260914)
+
+
+def dc(y):
+ return y - np.mean(y)
+
+
+def fade(y):
+ w = np.sin(np.linspace(0, np.pi / 2, FADE_N)) ** 2
+ y = y.copy()
+ y[:FADE_N] *= w
+ y[-FADE_N:] *= w[::-1]
+ return y
+
+
+def norm(y, peak=SAMPLE_PEAK):
+ m = np.max(np.abs(y))
+ return (y / m * peak) if m > 0 else y
+
+
+def stereo(y):
+ return np.stack([y, y], axis=1).astype(np.float32)
+
+
+def bp_noise(n, lo, hi):
+ x = _rng.standard_normal(n)
+ X = np.fft.rfft(x)
+ freqs = np.fft.rfftfreq(n, 1 / sr)
+ mask = ((freqs >= lo) & (freqs <= hi)).astype(float)
+ y = np.fft.irfft(X * mask, n)
+ return y / (np.max(np.abs(y)) + 1e-9)
+
+
+def sweep_noise(n, f_lo, f_hi, bw=900):
+ """质心随时间线性扫动的带通噪声(气声/扫频体感,无离散高频谐波)。"""
+ x = _rng.standard_normal(n)
+ X = np.fft.rfft(x)
+ freqs = np.fft.rfftfreq(n, 1 / sr)
+ t = np.arange(n) / sr
+ center = f_lo + (f_hi - f_lo) * np.minimum(t / (n / sr), 1.0)
+ # 时变带通:按块扫中心频率
+ y = np.zeros(n)
+ blk = int(sr * 0.02)
+ for s in range(0, n, blk):
+ e = min(n, s + blk)
+ c = center[s:e].mean()
+ m = ((freqs >= max(20, c - bw)) & (freqs <= c + bw)).astype(float)
+ seg = np.fft.irfft(X * m, n)
+ y[s:e] = seg[s:e]
+ m = np.max(np.abs(y))
+ return y / m if m > 0 else y
+
+
+def tone(n, f, decay=0.0, harm=()):
+ t = np.arange(n) / sr
+ y = np.sin(2 * np.pi * f * t)
+ for h, g in harm:
+ y += g * np.sin(2 * np.pi * f * h * t)
+ if decay:
+ y *= np.exp(-t * decay)
+ return y
+
+
+# ---------------------------------------------------------------- one-shot 渲染
+def r_alarm(): # 1.0s 电子双音警报:700/560Hz 圆角短促 beep×2,谐波收敛 <2.5kHz
+ n = int(sr * 1.0)
+ y = np.zeros(n)
+ for st, f in [(0.05, 700), (0.42, 560)]:
+ L = int(sr * 0.20)
+ tt = np.arange(L) / sr
+ beep = np.sin(2 * np.pi * f * tt) + 0.22 * np.sin(2 * np.pi * f * 2 * tt) \
+ + 0.06 * np.sin(2 * np.pi * f * 3 * tt)
+ beep *= (1 - np.exp(-tt * 250)) * np.exp(-np.maximum(tt - 0.12, 0) * 60)
+ beep += bp_noise(L, 300, 2200) * np.exp(-tt * 90) * 0.10 # 电子毛边,低带
+ y[int(st * sr):int(st * sr) + L] += beep
+ return dc(y)
+
+
+def r_dodge(): # 1.2s 闪避成功:500→2100Hz 气声扫 + 一记软木鱼中频确认
+ n = int(sr * 1.2)
+ t = np.arange(n) / sr
+ y = sweep_noise(n, 500, 2100, bw=1000)
+ env = (1 - np.exp(-t * 120)) * np.exp(-np.maximum(t - 0.55, 0) * 7)
+ y = y * env * 0.8
+ L = int(sr * 0.16)
+ tt = np.arange(L) / sr
+ knock = np.sin(2 * np.pi * 740 * tt) * np.exp(-tt * 45)
+ knock += bp_noise(L, 400, 1800) * np.exp(-tt * 70) * 0.5
+ y[int(0.06 * sr):int(0.06 * sr) + L] += knock * 0.5
+ return dc(y)
+
+
+def r_shield_block(): # 1.5s 护盾吸收:250-2300 电涟噪声衰减 + 150Hz 低频顿 + 弱 520Hz 余振
+ n = int(sr * 1.5)
+ t = np.arange(n) / sr
+ rip = bp_noise(n, 250, 2300) * np.exp(-t * 4.5)
+ rip *= 1 + 0.5 * np.sin(2 * np.pi * 11 * t) * np.exp(-t * 3) # 涟波调制
+ th = np.sin(2 * np.pi * 150 * t) * np.exp(-t * 18) * 0.6
+ ring = np.sin(2 * np.pi * 520 * t) * np.exp(-t * 10) * 0.18
+ y = (rip * 0.7 + th + ring) * (1 - np.exp(-t * 300))
+ return dc(y)
+
+
+def r_boost(): # 1.8s 引擎冲刺:55-90Hz 低哼 + 150-850Hz 推进噪声渐强,暗频谱
+ n = int(sr * 1.8)
+ t = np.arange(n) / sr
+ rum = np.sin(2 * np.pi * 62 * t) + 0.5 * np.sin(2 * np.pi * 93 * t)
+ rum *= (1 - np.exp(-t * 30)) * np.exp(-np.maximum(t - 1.2, 0) * 4)
+ thrust = sweep_noise(n, 180, 850, bw=500)
+ env = np.minimum(1, t / 0.5) * np.exp(-np.maximum(t - 1.1, 0) * 5)
+ growl = bp_noise(n, 100, 500) * 0.5 * env
+ y = rum * 0.55 + (thrust * 0.55 + growl) * env
+ return dc(y)
+
+
+def r_shield(): # 1.5s 护盾展开:320→980Hz 正弦爬升 + 轻 shimmer 噪声,谐波 <4kHz
+ n = int(sr * 1.5)
+ t = np.arange(n) / sr
+ f0 = 320 + (980 - 320) * np.minimum(t / 1.0, 1.0) ** 1.4
+ ph = 2 * np.pi * np.cumsum(f0) / sr
+ y = np.sin(ph) * 0.7 + 0.15 * np.sin(2 * ph)
+ shim = bp_noise(n, 900, 3600) * 0.10 * np.minimum(1, t / 0.3)
+ env = (1 - np.exp(-t * 60)) * np.exp(-np.maximum(t - 1.05, 0) * 8)
+ return dc((y + shim) * env)
+
+
+def r_whiff(): # 0.4s 挥空轻反馈:150-900Hz 低带噪声叹 + 200Hz 软顿(设计音量低,game 层 0.55)
+ n = int(sr * 0.4)
+ t = np.arange(n) / sr
+ y = bp_noise(n, 150, 900) * np.exp(-t * 14) * 0.7
+ y += np.sin(2 * np.pi * 200 * t) * np.exp(-t * 30) * 0.5
+ return dc(y * (1 - np.exp(-t * 400)))
+
+
+ONE_SHOTS = {
+ "alarm": r_alarm,
+ "dodge": r_dodge,
+ "shield_block": r_shield_block,
+ "boost": r_boost,
+ "shield": r_shield,
+ "whiff": r_whiff,
+}
+
+
+# ---------------------------------------------------------------- 编码 + 真峰值校验
+def encode(wav_path, base):
+ for args, ext in [(["-c:a", "libvorbis", "-q:a", "3"], ".ogg"),
+ (["-c:a", "aac", "-b:a", "128k"], ".m4a")]:
+ subprocess.run([FFMPEG, "-y", "-v", "error", "-i", wav_path,
+ "-ar", "44100", *args, base + ext], check=True)
+
+
+def true_peak_db(path):
+ r = subprocess.run([FFMPEG, "-i", path, "-af", "ebur128=peak=true", "-f", "null", "-"],
+ capture_output=True, text=True)
+ peaks = [float(line.split("Peak:")[1].strip().split()[0])
+ for line in r.stderr.splitlines() if "Peak:" in line and "dBFS" in line]
+ return max(peaks) if peaks else float("nan")
+
+
+def check_tp(base):
+ return max(true_peak_db(base + ".ogg"), true_peak_db(base + ".m4a"))
+
+
+def spectral_report(base):
+ """编码后解码回读:≥3kHz/≥5kHz 能量占比(刺耳复测口径,与取证轮一致)。"""
+ r = subprocess.run([FFMPEG, "-v", "error", "-i", base + ".ogg", "-f", "f32le", "-ac", "1", "-ar", "44100", "-"],
+ capture_output=True)
+ y = np.frombuffer(r.stdout, dtype=np.float32)
+ Y = np.abs(np.fft.rfft(y * np.hanning(len(y))))
+ fr = np.fft.rfftfreq(len(y), 1 / sr)
+ e = Y ** 2
+ tot = e.sum() + 1e-12
+ return e[fr >= 3000].sum() / tot * 100, e[fr >= 5000].sum() / tot * 100, fr[np.argmax(Y)] / 1000
+
+
+def main():
+ report = []
+ problems = []
+ for fid, fn in ONE_SHOTS.items():
+ wav_path = os.path.join(OUT, fid + ".wav")
+ base = os.path.join(DST, fid)
+ y = fade(norm(dc(fn())))
+ sf.write(wav_path, stereo(y), sr)
+ encode(wav_path, base)
+ tp = check_tp(base)
+ if tp > ONE_SHOT_TP_CEIL:
+ gain = 10 ** ((ONE_SHOT_TP_CEIL - tp) / 20) * 0.98
+ sf.write(wav_path, stereo(y * gain), sr)
+ encode(wav_path, base)
+ tp2 = check_tp(base)
+ report.append((fid, len(y) / sr, tp, f"降 {20 * np.log10(gain):.1f}dB 重编 -> {tp2:.2f}"))
+ tp = tp2
+ else:
+ report.append((fid, len(y) / sr, tp, ""))
+ if tp > ONE_SHOT_TP_CEIL:
+ problems.append(f"{fid}: 真峰值 {tp:.2f} dBFS 仍超 {ONE_SHOT_TP_CEIL}")
+ print(f"{'id':14s} {'dur(s)':>7s} {'TP(dBFS)':>9s} {'%>3k':>7s} {'%>5k':>7s} {'peakkHz':>8s} note")
+ for fid, dur, tp, note in report:
+ e3, e5, pk = spectral_report(os.path.join(DST, fid))
+ print(f"{fid:14s} {dur:7.2f} {tp:9.2f} {e3:7.1f} {e5:7.1f} {pk:8.2f} {note}")
+ if e5 > 15.0:
+ problems.append(f"{fid}: 5kHz+ 能量 {e5:.1f}% 仍偏高")
+ if problems:
+ print("PROBLEMS:")
+ for p in problems:
+ print(" ", p)
+ return 1
+ print(f"ALL OK: {len(ONE_SHOTS)} one-shot -> {DST}")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/tools/gen_voice_dual.py b/tools/gen_voice_dual.py
index a7fb6c78..b7769608 100644
--- a/tools/gen_voice_dual.py
+++ b/tools/gen_voice_dual.py
@@ -319,28 +319,55 @@ SIMON_LINES = [
# H3:使用时如实报余量(替换主动重听路径的旧「用完了」绝对句)。
("gd_chances_left1", _SIMON, "免费重听还剩一次。"),
("gd_chances_left0", _SIMON, "免费重听用完了。之后重听会花一次机会,别怕,慢慢来。"),
+ # ---- 状态查询(research/simon-polish round1,S1/S3/S4;input 阶段长按=问状态,
+ # 13 句全部整句预生成、数字分档,禁运行时拼接;不加 guide 前缀——三档 guide 全可用,
+ # 属玩家主动查询而非向导插播)----
+ ("status_len_short", _SIMON, "这一轮很短。"),
+ ("status_len_mid", _SIMON, "这一轮不长不短。"),
+ ("status_len_long", _SIMON, "这一轮挺长。"),
+ ("status_len_xlong", _SIMON, "这一轮很长,稳住。"),
+ ("status_prog_start", _SIMON, "刚开头,一个还没对。"),
+ ("status_prog_early", _SIMON, "刚答了个开头。"),
+ ("status_prog_half", _SIMON, "答了一半左右。"),
+ ("status_prog_late", _SIMON, "就剩最后几个了。"),
+ ("status_free2", _SIMON, "免费重听还有两次。"),
+ ("status_free1", _SIMON, "免费重听还有一次。"),
+ ("status_chance2", _SIMON, "免费用完,机会还剩两次。"),
+ ("status_chance1", _SIMON, "免费用完,机会还剩一次。"),
+ ("status_out", _SIMON, "免费和机会都用完了,答错就结束。"),
]
# ---------------------------------------------------------------- rhythm
-# R3 重构(docs/design/03-rhythm-voice-ids.md):31 句,全表同一 instruct 常量。
+# 鼓手模式重构(docs/design/24-rhythm-voice-ids.md):41 句,全表同一 instruct
+# 常量;向导层 9 句 gd_* 已在库沿用不重录(不在本表)。
_RHY = _pair("低沉醇厚的男声,像节奏游戏主持人,平稳有力",
"活力清晰的年轻女声,像节奏游戏主持人,情绪饱满但不夸张")
RHYTHM_LINES = [
# ---- W 组 · 开场与流程 ----
- ("welcome", _RHY, "欢迎来到节拍行者。跟着音乐,我奏一句,你跟一句。"),
- ("welcome_back", _RHY, "欢迎回来。我奏一句,你跟一句。"),
- ("tut_1", _RHY, "听,底鼓。在下一小节的同一个位置,单击。"),
- ("tut_2", _RHY, "这次是左和右。跟着打,左滑,右滑。"),
- ("tut_3", _RHY, "最后一句,三个音,中间是双击。"),
+ ("welcome", _RHY, "欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。"),
+ ("welcome_back", _RHY, "欢迎回来,鼓手。准备好了就开始。"),
("tut_done", _RHY, "很好,演出开始。"),
("tut_skip", _RHY, "跳过教学,直接开始。"),
("mid_song", _RHY, "过半了,保持。"),
+ # ---- Z 组 · 分区教学与区名 ----
+ ("tut_map", _RHY, "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。"),
+ ("tut_probe", _RHY, "摸到三个不同的地方,我们就开始。"),
+ ("tut_z_kick", _RHY, "下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。"),
+ ("tut_z_sides", _RHY, "左下是军鼓,右下是低嗵。一左一右,跟着打。"),
+ ("tut_z_patt", _RHY, "上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。"),
+ ("tut_fill", _RHY, "最后有一段加花,跟着我连打。"),
+ ("zone_tl", _RHY, "左上,踩镲。"),
+ ("zone_tc", _RHY, "上中,高嗵。"),
+ ("zone_tr", _RHY, "右上,吊镲。"),
+ ("zone_bl", _RHY, "左下,军鼓。"),
+ ("zone_bc", _RHY, "下中,底鼓。"),
+ ("zone_br", _RHY, "右下,低嗵。"),
# ---- C 组 · 教学纠正 ----
("retry_early", _RHY, "早了,等鼓点再出手。"),
("retry_late", _RHY, "晚了,跟着鼓点走。"),
- ("retry_gesture", _RHY, "不是这个手势,再听一遍。"),
+ ("retry_wrong", _RHY, "敲错鼓了,再听一遍。"),
("retry_listen", _RHY, "再听一遍,跟着来。"),
("retry_skip", _RHY, "没关系,我们先走下一句。"),
# ---- S 组 · 选曲与解锁 ----
@@ -359,26 +386,12 @@ RHYTHM_LINES = [
("new_best_combo", _RHY, "新连击纪录!"),
("restart", _RHY, "单击再来一遍,右滑下一首,下滑回大厅。"),
# ---- M 组 · 菜单与规则 ----
- ("rules", _RHY, "规则:我奏一句,你在下一小节原样跟打。音要对,拍点也要对。"),
+ ("rules", _RHY, "规则:我敲一小节鼓,你在下一小节照着敲回来。鼓要选对,拍点也要对。"),
("settings_hint", _RHY, "音色、语速、背景音乐,请回大厅修改。"),
("menu_main", _RHY, "菜单。单击切换选项,双击确认。"),
("menu_resume", _RHY, "继续演奏。"),
("menu_lobby", _RHY, "回大厅。"),
("skip_hint", _RHY, "单击可跳过旁白。"),
- # ---- 向导层(docs/design/14-guide-layer.md,schemes §1.5 定稿全文)----
- ("gd_answer", _RHY, "现在跟着我打。"),
- ("gd_miss", _RHY, "慢了半拍,下一小节跟上我就行。"),
- # ---- 向导层 round2(docs/design/14-guide-layer.md「round2 v1.1」,synthesis §3 定稿全文)----
- ("gd_miss_early", _RHY, "抢拍了。等声音落下再滑。"),
- ("gd_miss_late", _RHY, "慢了半拍。跟着节拍走。"),
- ("gd_miss_wrong", _RHY, "方向不对。跟着音色滑。"),
- # ---- 向导层 round3(docs/design/14-guide-layer.md「round3 v1.2」,synthesis §3 定稿全文)----
- ("gd_slow", _RHY, "我放慢一些,跟着试试。"),
- ("gd_count", _RHY, "四拍之后,继续。"),
- # ---- 向导层 round4(docs/design/14-guide-layer.md「round4 v1.3」,synthesis §3 定稿全文)----
- # H5:归因真话律——应答窗口无任何尝试播此句(早/晚/错分档只留给真出手的情况)。
- ("gd_miss_none", _RHY, "这拍没接。我停下的时候,就轮到你了。"),
-
]
# ---------------------------------------------------------------- space
@@ -446,6 +459,9 @@ SPACE_LINES = [
("settings_hint", _SPC, "音色、语速、背景音乐,请回大厅修改。"),
("paused", _SPC, "已暂停。"),
("skip_hint", _SPC, "单击可跳过旁白。"),
+ # ---- R5 新增(space polish round1/round2,research/space-polish/,04-space-voice-ids.md 追加节)----
+ ("protect_soon", _SPC, "训练护盾还剩十秒。"),
+ ("boost_not_ready", _SPC, "引擎还在冷却,稍等一下。"),
# ---- 向导层(docs/design/14-guide-layer.md,schemes §1.5 定稿全文)----
("gd_hit_hint", _SPC, "被撞了。听方位,同向滑动就能拨开。"),
# ---- 向导层 round2(docs/design/14-guide-layer.md「round2 v1.1」,synthesis §3 定稿全文)----
@@ -2219,16 +2235,16 @@ KEY_LINES = {
("gd_occ_dt", "这一轮,按回车是作答。"),
("gd_occ_both", "这一轮,按上方向键和回车都是作答。"),
],
+ # rhythm:8 对(24-rhythm-voice-ids.md 键盘变体表,措辞含数字键/方向键/空格/回车)。
"rhythm": [
- ("tut_1", "听,底鼓。在下一小节的同一个位置,按空格。"),
- ("tut_2", "这次是左和右。跟着打,按左方向键,按右方向键。"),
- ("tut_3", "最后一句,三个音,中间是按回车。"),
+ ("tut_map", "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。按数字一键到六键,听六面鼓。"),
+ ("tut_probe", "按出三个不同的键,我们就开始。"),
+ ("tut_z_kick", "数字五,是底鼓,你的家。先听四下数拍,然后跟着我敲。"),
+ ("tut_z_sides", "数字四,军鼓。数字六,低嗵。一左一右,跟着打。"),
+ ("tut_z_patt", "上面一排更清亮。数字一踩镲,数字二高嗵,数字三吊镲。听这一句,三个音。"),
("select_hint", "左右方向键选曲目,按空格开始,按下方向键回大厅。"),
("restart", "按空格再来一遍,按右方向键下一首,按下方向键回大厅。"),
("menu_main", "菜单。按空格切换选项,按回车确认。"),
- ("skip_hint", "按空格可跳过旁白。"),
- ("gd_miss_early", "抢拍了。等声音落下再按。"),
- ("gd_miss_wrong", "方向不对。跟着音色按方向键。"),
],
"space": [
("drill_left", "听,左边有陨石。按左方向键,把它拨开!"),
diff --git a/web/harness/voice_text.json b/web/harness/voice_text.json
index 55b93c22..07b8a739 100644
--- a/web/harness/voice_text.json
+++ b/web/harness/voice_text.json
@@ -1,1938 +1,1961 @@
{
- "__key__": {
+ "__key__": {
+ "abyss": {
+ "dv1_teach": "到深度了。声呐静了。按空格,发一枚脉冲。",
+ "gd_again": "还在吗?按空格继续。",
+ "gd_brief": "按空格继续简报。要选择时,用左右方向键。",
+ "gd_continue": "按空格,继续。",
+ "gd_ping1": "声呐待命。按空格,发脉冲。",
+ "gd_ping2": "回波不会自己来。按空格。",
+ "p1": "管路在响。左箭头,停下来听敲管的暗号。右箭头,先带小舟上浮。",
+ "sys_continue_ask": "检测到你的下潜记录。空格继续上次,右箭头开始新救援。",
+ "sys_help": "空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。",
+ "sys_menu": "菜单。空格切换选项,回车确认。",
+ "sys_skip": "听过的句子再播时,按空格跳过。"
+ },
+ "detective": {
+ "cf_confirm": "就这句?空格,定下来。",
+ "cf_pick_line": "左右方向键,一句一句听。",
+ "fin_pre": "证据在手,就此结案?空格,定下来;方向键,继续查。",
+ "fin_who_confirm": "就指认这位?空格,定下来。",
+ "gd_board": "还在证词板。左右方向键,换卷宗。",
+ "gd_board_cf": "都听过了。按住空格,去指证。",
+ "gd_cf": "还在选证词。左右方向键,空格确认。",
+ "recap_cf": "卷宗都在耳朵里了。挑一句你不信的,按住空格指证。",
+ "settle_hook": "同一场雨里,还有别的案子。按空格,接新案。",
+ "sys_help": "方向键换卷宗,空格听取,回车重新听。按住空格指证,上键状态,下键菜单。",
+ "tut_confront": "按住空格,进入指证。",
+ "tut_d0": "先熟悉证词板。左右方向键,换卷宗。",
+ "tut_listen": "空格,听取当前卷宗。",
+ "tut_replay": "回车,重新听这一句。"
+ },
+ "dungeon": {
+ "die_adv_1": "下次,前摇声响时就按回车。",
+ "die_adv_2": "打不过,就按住空格逃跑。",
+ "gd_pulse": "按空格发脉冲,听听四周。",
+ "gd_turn": "轮到你了。按空格挥击。",
+ "help_battle": "敌人前摇声响时按回车格挡,按空格挥击。打不过就按住空格逃跑。",
+ "help_explore": "按空格发脉冲,按住空格前进,左右方向键转身。按回车再听,上方向键查状态,下方向键开菜单。",
+ "settle_again": "按空格,再探一次。",
+ "sys_continue_ask": "检测到探窟记录。按空格继续,按右方向键重新开始。",
+ "sys_menu": "菜单。按空格切换,按回车确认。",
+ "tut_attack": "现在按空格,挥拳打它。",
+ "tut_d0": "先学会用耳朵看。按空格,发出声波脉冲。",
+ "tut_flee_hold": "想逃跑,按住空格别松手。",
+ "tut_menu": "按下方向键,打开菜单。",
+ "tut_parry": "听到它的动静,按回车格挡。",
+ "tut_replay": "按回车,再发一次脉冲,不要钱。",
+ "tut_skip": "已跳过教学。按空格发脉冲,先听听四周。",
+ "tut_stairs_on": "楼梯就在脚下。按空格,下潜。",
+ "tut_status": "按上方向键,随时听自己的状态。",
+ "tut_turn": "按左右方向键,可以转身。",
+ "tut_walk": "按住空格不放,你就往前走。"
+ },
+ "escape": {
+ "again": "按空格,再来一次。按下方向键,打开菜单。",
+ "g1_move": "先活动一下。按任意方向键,走一小步。",
+ "g2_wall": "这个房间不大,四面都是墙。再按两下方向键,试试碰碰墙。",
+ "g3_left": "跟着我指的路走。按左方向键。",
+ "g4_down": "对。再按下方向键。",
+ "g5_inspect": "听到水声了吗?按一下空格,仔细检查这个房间。",
+ "g6_doubletap": "钥匙能开锁。按回车,是把物品用出去的用法。现在,按回车试试。",
+ "g7_goal": "找到能用这把钥匙打开的东西。需要帮助时,在原地按回车。",
+ "guide_blunt_down": "按一下下方向键。",
+ "guide_blunt_left": "按一下左方向键。",
+ "guide_blunt_right": "按一下右方向键。",
+ "guide_blunt_up": "按一下上方向键。",
+ "guide_wrong_down": "不是这个方向。按下方向键。",
+ "guide_wrong_left": "不是这个方向。按左方向键。",
+ "guide_wrong_right": "不是这个方向。按右方向键。",
+ "guide_wrong_up": "不是这个方向。按上方向键。",
+ "help_ops": "方向键,在房间之间移动。按空格,检查房间,或者重听房间的声音。按回车,使用物品,或者查看背包。",
+ "inspect_gate_ready": "电子锁的指示灯亮了,发出微弱的绿光。大门已经通电。按回车,打开它,离开这里。",
+ "nav_down": "按下方向键。",
+ "nav_left": "按左方向键。",
+ "nav_right": "按右方向键。",
+ "nav_up": "按上方向键。",
+ "reopen_prompt": "按上方向键,重新听一遍引导。按空格,直接开始。",
+ "skip_hint": "按空格可跳过旁白。",
+ "start_room": "你站在设施中央的房间里。方向键移动,按空格检查,按回车使用物品。",
+ "stuck_box_2": "去西北角的电箱房,按回车,把保险丝装进电箱。",
+ "stuck_cabinet_2": "去东边的铁柜房,按回车,用钥匙打开铁柜。",
+ "stuck_gate_2": "去东南角的大门,按回车,打开它,离开这里。",
+ "stuck_key_2": "去西南角的储物间,按空格检查,找到钥匙。",
+ "use_fail": "这里没有用得上东西的地方。换个房间试试,或者先按空格检查一下周围。"
+ },
+ "hunt": {
+ "end_again": "按空格,再猎一局。",
+ "gd_idle": "听声音的方向,按方向键。",
+ "help_main": "朝声音的方向按方向键,就是出击。按空格呼喊支援,按回车旋风斩。上方向键状态,下方向键菜单。",
+ "room_wait": "房间已开好,等同伴到齐。按空格,立即开局。",
+ "sys_menu": "菜单。按空格切换,按回车确认。",
+ "tut_attack": "听,有狼在靠近。朝声音的方向,按方向键。",
+ "tut_callout": "按空格,呼喊支援,队友会来帮你。",
+ "tut_rule": "野兽会从八个方向围上来。声音在哪边,就按哪边方向键。",
+ "tut_skill": "按回车,旋风斩,清掉身边一圈。",
+ "tut_skill_cd": "旋风斩有八秒冷却。冷却中按回车,重新听威胁。",
+ "tut_status": "按上方向键,听营地状态。按下方向键,打开菜单。"
+ },
+ "keeper": {
+ "gd_again": "还在吗?按空格继续。",
+ "gd_brief": "按空格,继续值守。要选择时,用左右方向键。",
+ "gd_continue": "按空格,继续。",
+ "p1": "他的声音在抖。左箭头,先接住这个人。右箭头,先要他的船位。",
+ "sys_continue_ask": "检测到你的值守记录。空格继续上次,右箭头开始新的风暴夜。",
+ "sys_help": "空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。",
+ "sys_menu": "菜单。空格切换选项,回车确认。",
+ "sys_skip": "想跳过这句,按空格。"
+ },
+ "radio": {
+ "gd_again": "还在吗?按空格继续。",
+ "gd_brief": "按空格继续节目。请选择的时候,按左或右方向键。",
+ "gd_continue": "按空格,继续。",
+ "gd_ring1": "热线在闪。按空格,接听。",
+ "gd_ring2": "灯还亮着,听众在等。按空格,接听。",
+ "p1": "老人在发抖。按左方向键,陪他哼那首老歌。按右方向键,冷静问他路口的路牌。",
+ "p2": "雨声更密了。按左方向键,留在原地陪他等巡逻队。按右方向键,转接派出所。",
+ "p3": "按左方向键,告诉她这趟车值得上。按右方向键,把选择还给她。",
+ "p4": "按左方向键,唱一段摇篮曲哄她睡。按右方向键,轻轻问她怎么了。",
+ "p5": "孩子的声音在抖。按左方向键,告诉她这不是她的错。按右方向键,答应她明天都会好。",
+ "p6": "摔门声你听见了。按左方向键,替孩子给她带句话。按右方向键,劝她回家把话说开。",
+ "p7": "她的呼吸平了。按左方向键,留在直播里,让全城等这个门铃。按右方向键,换垫乐,私下陪她说完。",
+ "p8": "方向盘比话筒危险。按左方向键,陪他聊聊闺女。按右方向键,让他立刻进服务区。",
+ "p9": "留言机红灯在闪,是老主播三年前没播完的那句晚安。按左方向键,替他播出去。按右方向键,照常收播。",
+ "sys_continue_ask": "检测到你的夜班记录。按空格继续上次,按右方向键开始新的夜晚。",
+ "sys_help": "按空格继续,按回车重新听。按上方向键听状态,按下方向键开菜单。请选择时,左右方向键。",
+ "sys_menu": "菜单。按空格切换选项,按回车确认。",
+ "sys_skip": "想跳过这句,按空格就行。"
+ },
+ "rhythm": {
+ "tut_map": "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。按数字一键到六键,听六面鼓。",
+ "tut_probe": "按出三个不同的键,我们就开始。",
+ "tut_z_kick": "数字五,是底鼓,你的家。先听四下数拍,然后跟着我敲。",
+ "tut_z_sides": "数字四,军鼓。数字六,低嗵。一左一右,跟着打。",
+ "tut_z_patt": "上面一排更清亮。数字一踩镲,数字二高嗵,数字三吊镲。听这一句,三个音。",
+ "select_hint": "左右方向键选曲目,按空格开始,按下方向键回大厅。",
+ "restart": "按空格再来一遍,按右方向键下一首,按下方向键回大厅。",
+ "menu_main": "菜单。按空格切换选项,按回车确认。"
+ },
+ "rpg": {
+ "btl_lose_hint": "记住,听清前摇,按回车格挡。",
+ "gd_parry_miss": "前摇声起的时候按回车,才能格挡。",
+ "gd_stall": "想好了吗?左右方向键选择,按空格出手。",
+ "help_battle": "战斗中,左右方向键选招式,按空格出手。听到敌人的前摇,按回车格挡。",
+ "help_explore": "左右方向键切换选项,按空格确认。按回车重新听场景,按上方向键查看状态,按下方向键打开菜单。",
+ "shop_open": "商店。左右方向键看看货,按空格购买。",
+ "skip_hint": "按空格可跳过旁白。",
+ "sys_continue_ask": "检测到你的旅程记录。按空格继续,按右方向键开始新的旅程。",
+ "sys_menu": "菜单。左右方向键选择,按空格确认。",
+ "tut_b0": "战斗里,左右方向键选招式,按空格出手。听到这个声音,就是你的回合。先按一按方向键,试试。",
+ "tut_b2": "就是现在,按回车格挡!",
+ "tut_b3": "挡住了!轮到你了。左右方向键选攻击,按空格出剑。",
+ "tut_b6": "来不及格挡,就选防御。左右方向键,选防御,按空格。",
+ "tut_battle_2": "左右方向键切换招式,攻击、破空斩、防御、金疮药。按空格,出手。",
+ "tut_battle_3": "敌人出手前有一声前摇。听到前摇,马上按回车,就能格挡。",
+ "tut_battle_5": "记住:听清前摇,按回车格挡。开始吧!"
+ },
+ "simon": {
+ "gd_economy": "记不住就按上方向键,重新听一遍。免费机会有两次,用完要扣一次机会。",
+ "gd_occ_both": "这一轮,按上方向键和回车都是作答。",
+ "gd_occ_dt": "这一轮,按回车是作答。",
+ "gd_occ_up": "这一轮,按上方向键是作答。",
+ "gd_relisten": "需要的话,按上方向键可以重新听一遍序列。",
+ "replay": "按空格,再来一局。",
+ "rules": "上行音,按上方向键。下行音,按下方向键。左边的音,按左方向键。右边的音,按右方向键。一声轻响,按空格。两声轻响,按回车。",
+ "rules_prompt": "按上方向键,重听规则。按下方向键,打开菜单。",
+ "skip_hint": "按空格可跳过旁白。",
+ "t1_up": "按上方向键,是这个声音。",
+ "t2_down": "按下方向键,是这个声音。",
+ "t3_left": "按左方向键,是这个声音。",
+ "t4_right": "按右方向键,是这个声音。",
+ "t5_tap": "按空格,是这个声音。",
+ "t6_double": "按回车,是这个声音。",
+ "t7_retry": "答错可以消耗机会重听。按上方向键,可以随时重听。",
+ "t_blunt_double": "按一下回车。",
+ "t_blunt_down": "按一下下方向键。",
+ "t_blunt_left": "按一下左方向键。",
+ "t_blunt_right": "按一下右方向键。",
+ "t_blunt_tap": "轻轻按一下空格。",
+ "t_blunt_up": "按一下上方向键。",
+ "t_wrong_double": "不是这个,按回车试试。",
+ "t_wrong_down": "不是这个,按下方向键试试。",
+ "t_wrong_left": "不是这个,按左方向键试试。",
+ "t_wrong_right": "不是这个,按右方向键试试。",
+ "t_wrong_tap": "不是这个,按空格试试。",
+ "t_wrong_up": "不是这个,按上方向键试试。"
+ },
+ "space": {
+ "drill_down": "下面是低沉的轰隆。按下方向键!",
+ "drill_left": "听,左边有陨石。按左方向键,把它拨开!",
+ "drill_retry_down": "轰隆声在下面,按下方向键。",
+ "drill_retry_left": "那是左边来的,按左方向键。",
+ "drill_retry_right": "那是右边来的,按右方向键。",
+ "drill_retry_up": "声音又高又尖,是上面,按上方向键。",
+ "drill_right": "这次在右边。按右方向键!",
+ "drill_up": "上面有东西,声音又尖又高。按上方向键!",
+ "feat_boost": "试试按空格,引擎会短促加速,直接冲过空隙。",
+ "feat_shield": "按回车展开护盾,能挡下一次撞击。",
+ "gd_hit_hint": "被撞了。听方位,按对应方向键就能拨开。",
+ "help_recap": "左边来按左方向键,右边来按右方向键,上面来按上方向键,下面来按下方向键。按空格加速,按回车护盾。",
+ "hit_down": "下面撞上的。听到低沉的轰隆,按下方向键。",
+ "hit_left": "左边撞上的。听到左边的呼啸,按左方向键。",
+ "hit_right": "右边撞上的。听到右边的呼啸,按右方向键。",
+ "hit_up": "上面撞上的。听到高高的呼啸,按上方向键。",
+ "menu_main": "菜单。按空格切换选项,按回车确认。",
+ "protect_down": "训练护盾接住了。那颗在下面,听到低沉的轰隆,按下方向键。",
+ "protect_left": "训练护盾接住了。那颗在左边,听到左边的呼啸,按左方向键。",
+ "protect_right": "训练护盾接住了。那颗在右边,听到右边的呼啸,按右方向键。",
+ "protect_up": "训练护盾接住了。那颗在上面,听到高高的呼啸,按上方向键。",
+ "restart_hint": "按空格再飞一次,按下方向键回大厅。",
+ "second_run_ask": "按上方向键重新听演练,按空格直接出发。",
+ "skip_hint": "按空格可跳过旁白。"
+ },
+ "storyline": {
+ "e1_dawn": "加密频道那头沉默了三秒。然后,一个你等了三十天的声音响了起来:“姐?姐!是你吗?”天亮之前,避难所的救援队打开了大门。猎狗的人,在北区的高墙下溃散了。你抱着晨晨,听见广播塔里,重新响起了音乐。后来人们说,这座城市,是从一个女人的声音开始,重新活过来的。——好结局:黎明。感谢你,陪林晚走完了这条路。按空格,可以回到故事开始的地方。",
+ "e2_price": "你赶在车队前面,撞进了避难所的大门。“关掉广播!关灯!猎狗来了——!”那一夜,北区守住了。探照灯熄灭的时候,晨晨从人群里扑出来抱住你,才发现你胳膊上的血,已经把半边袖子浸透了。坐标是你交出去的,命,是你抢回来的。你赢了,用一条胳膊的代价。——结局:代价。按空格,重新开始。",
+ "e3_alone": "你逃了。一路向南,没有回头。三天后,收音机里关于北区的广播,停了。又过了七天,你在一个废弃的加油站里,听见最后一个频段,也变成了沙沙声。你活下来了。只是从此以后的每一个夜里,你都会想起那声口哨,和你报出坐标时,自己发抖的声音。——坏结局:孤声。按空格,重新开始。",
+ "e4_static": "公开频道,把所有人都引来了——幸存者,还有猎狗。塔顶的风很大,你看见山下火把连成的长龙,也看见避难所方向亮起的防御火光。猎狗的刀抵上来的时候,你对着麦克风笑了:“听见了吗,晨晨?姐姐的声音,全城都听见了。”信号中断了。但那晚之后,北区,再没有人投降。——结局:静默。按空格,重新开始。",
+ "gd_again": "还在吗?按空格继续。",
+ "gd_brief": "按空格继续剧情。请选择的时候,按左右方向键。",
+ "gd_continue": "按空格,继续。",
+ "help": "操作说明。按空格:继续剧情。按回车:重听刚才的台词。按上方向键:听这段说明和当前进度。按下方向键:呼出菜单,菜单里可以重新开始。当旁白说“请选择”的时候,按左方向键或者按右方向键,做出你的决定。选择无法撤销。",
+ "menu": "菜单。按左方向键:重新开始整个故事。按右方向键,或者按空格:回到故事。按上方向键:听操作说明。",
+ "n00_intro": "大停电后的第三十天,城市陷入彻底的黑暗。没有电,没有网络,只有收音机里偶尔闪过的沙沙声,像垂死者的呼吸。你是林晚,一名前急救员。在这个故事里,你用声音活下去。请记住:按空格,继续剧情;按回车,重听上一句;按上方向键,听你的状态和帮助;按下方向键,呼出菜单。当我说“请选择”的时候,按左方向键,或者按右方向键,做出你的决定。选择一旦做出,就无法回头。现在,按空格,睁开眼睛。",
+ "p1": "请选择。按左方向键:先检查背包里的收音机。按右方向键:先摸黑寻找出口。",
+ "p2": "请选择。按左方向键:钻进旁边的通风管道。按右方向键:躺进路边的尸体堆里装死。",
+ "p3": "请选择。按左方向键:循着哭声过去看看。按右方向键:不去管它,直接去北区。",
+ "p4": "请选择。按左方向键:带上小满一起走。按右方向键:留下食物,独自上路。",
+ "p5": "请选择。按左方向键:走桥下的污水涵洞。按右方向键:爬桥上悬着的钢索。",
+ "p6": "请选择。按左方向键:交出坐标,保命要紧。按右方向键:拒绝他,想办法周旋。",
+ "p7": "请选择。按左方向键:追上去,警告避难所。按右方向键:自己逃命,越远越好。",
+ "p8": "请选择。按左方向键:用公开频道广播,让全城都听见。按右方向键:用加密频段,只发给避难所。",
+ "skip_hint": "按空格可跳过旁白。"
+ },
+ "teahouse": {
+ "gd_brew": "还在灶上,听声动手,回车。",
+ "gd_serve": "客人还在堂前。上键,再听一遍他要的茶。",
+ "settle_night": "熄了灯,这一晚就过去了。按空格,睡下。",
+ "sys_help": "方向键选茶,空格定下。听水声,回车提壶;滴答密,回车出汤。上键状态,下键菜单。",
+ "tut_d0": "先看茶柜。左右方向键,一罐一罐听。",
+ "tut_serve": "茶好了。空格,端出去。",
+ "tut_steep": "注水,闷泡。滴答由稀到密,密起来就是将好——回车,出汤。",
+ "tut_tea": "空格,选定这罐茶。",
+ "tut_water": "灶上坐水。泡泡细密是将沸,咕嘟连片是滚透——听到细密,回车提壶。",
+ "upg_open": "要添置点什么?左右方向键看,空格买定。"
+ }
+ },
"abyss": {
- "dv1_teach": "到深度了。声呐静了。按空格,发一枚脉冲。",
- "gd_again": "还在吗?按空格继续。",
- "gd_brief": "按空格继续简报。要选择时,用左右方向键。",
- "gd_continue": "按空格,继续。",
- "gd_ping1": "声呐待命。按空格,发脉冲。",
- "gd_ping2": "回波不会自己来。按空格。",
- "p1": "管路在响。左箭头,停下来听敲管的暗号。右箭头,先带小舟上浮。",
- "sys_continue_ask": "检测到你的下潜记录。空格继续上次,右箭头开始新救援。",
- "sys_help": "空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。",
- "sys_menu": "菜单。空格切换选项,回车确认。",
- "sys_skip": "听过的句子再播时,按空格跳过。"
+ "b_go": "第一潜,找船。耳朵交给声呐。",
+ "b_goal": "海燕号,五个人。你的双瓶,够下四潜。",
+ "b_open": "风停了。我站在问海号甲板上,下面三千米,是海燕号。",
+ "b_rule": "规矩就一条:气不够一潜,人就必须上浮。",
+ "bai_a": "哈哈,救援的?我这腿,跟冷却管缠上了。",
+ "bai_b": "艇上的药板烧了。病舱那两个,比我悬。",
+ "bai_out": "腿还在!我的腿还在!走,我给你带路。",
+ "bai_thanks": "这片海养着一村人。这份情,我记一辈子。",
+ "chen_a": "你来了。小郑股骨断了,我给他固定好了。",
+ "chen_b": "救援钟一次带一个。我是医生,我最后走。",
+ "chen_last": "去吧。灯我留着,人齐了就熄。",
+ "chen_stay": "去吧。我守着灯,灯不灭,人就不散。",
+ "chen_up": "……好。小郑,等我,上面给你热粥。",
+ "d1_code": "是老白的暗号:腿被压住,先泄压,再撬。记住这个敲法。",
+ "d1_listen": "都别出声。管子那头,敲得很稳。",
+ "d1_log": "日志里有失事前,最后一段录音。给你,替我们收好。",
+ "d1_nolog": "日志可以补,人不能等。走了。",
+ "d1_surf": "小舟出水,第一潜收工。往返,扣三格气。",
+ "d1_up": "小舟,抓住我的肩锁。我们上。",
+ "d2_cut": "切割枪。老白,闭眼,憋气。",
+ "d2_flash": "火花炸了一下,虚惊。老白咳着,腿抽出来了。",
+ "d2_leave": "阀门交给母船。你先上,腿要紧。",
+ "d2_pry": "老白,忍住。先泄压,再撬。",
+ "d2_pry_ok": "暗号没白听。管子一松,钢梁抬起来了。",
+ "d2_pry_slow": "摸着找泄压阀,多费了一格气。腿,出来了。",
+ "d2_supply": "潜友阿凯捎来应急瓶。甲板上,粥给你温着。",
+ "d2_surf": "老白出水。他一直扒着舱门,往水里看。",
+ "d2_valve": "电池舱我陪你去。这片海不能脏。",
+ "d2_valve_e": "阀门关死了。两格气,换一片干净海。",
+ "d3_chen": "陈医官,你的手在抖。这次,听我的。",
+ "d3_chen_e": "陈医官出水。小郑固定在吊床上,呼吸平稳。",
+ "d3_promise": "四小时内,我下来。等我。",
+ "d3_spare": "备用瓶留下。灯,给我亮着。",
+ "d3_spare_e": "备用瓶挂上了,能多撑十二小时。",
+ "d3_surf": "病舱的人出水。海燕号的呻吟,隔着水都听得见。",
+ "d3_zheng": "小郑先走。陈医官,下一潜,就是你的。",
+ "d3_zheng_e": "小郑吊上去了。他一路,都没敢出声。",
+ "d4_fast": "来不及了。直浮!",
+ "d4_fast_e": "违规快浮。医疗舱的灯,先给你们开好。",
+ "d4_pick_chen": "陈医官,轮到你了。抓住,上浮。",
+ "d4_pick_gao": "船长,抓住我。海燕号的事,上面再说。",
+ "d4_pick_zheng": "小郑,吊床连人一起。走了。",
+ "d4_silent": "纪律就是纪律。抓住,上浮。",
+ "d4_slow": "逐站停,慢慢浮。规矩不能破。",
+ "d4_slow_e": "减压站一个个过。气瓶在跳,人稳着。",
+ "d4_stay_lost": "另一位,留在了倾斜的船舱。航标灯,替所有人亮着。",
+ "d4_surf": "最后一潜收工。问海号的甲板,从没这么亮过。",
+ "d4_talk": "日志我听完了。海燕号为什么沉,我会带上去。走吧。",
+ "d9_bell": "最后一潜。不为救人,为个交代。",
+ "d9_bello": "船钟出水。海燕号的声音,回家了。",
+ "d9_rest": "交代,留给明天的人。我去医疗舱。",
+ "dry_a": "气瓶用干了。立刻上浮。",
+ "dry_b": "气花在了人身上。人,都上来了。",
+ "dv1_down": "下潜开始。水会越来越黑,声音会越来越多。",
+ "dv1_link": "回波后面有杂音,是电台!接通了。",
+ "dv1_metal": "金属回波,钢板。听见这个,就是海燕号的船身。",
+ "dv1_teach": "到深度了。声呐静了。单击,发一枚脉冲。",
+ "dv2_down": "第二潜,机舱。顺着敲管的声音走。",
+ "dv2_found": "碎石回波后面,敲管声密了。机舱到了。",
+ "dv3_down": "第三潜,病舱。海燕号在倾斜,别恋战。",
+ "dv3_groan": "回波发闷。船体在呻吟,它撑不久了。",
+ "dv4_down": "最后一潜,指挥舱。海燕号,撑不住了。",
+ "dv4_dual": "两个人下同一潜。这趟往返,扣四格气。",
+ "dv4_none": "气不够一潜了。第四潜,取消。",
+ "dv4_slide": "它滑了!抓稳索缆,指挥舱里还有人!",
+ "e1_a": "五个人都在甲板上。船钟的第一声,是替这条沟敲的。",
+ "e1_b": "三年了,我终于敢往下看。明天,想再潜一次。",
+ "e2_a": "五个人都救上来了。船钟,留在了沟底。",
+ "e2_b": "没人怪我。可半夜醒来,总听见钟在响。",
+ "e3_a": "没能都带回来。可我到底下去了,敲响了那口钟。",
+ "e3_b": "钟声替他们,在沟底响了一声。这样,也好。",
+ "e4_a": "我按规矩上浮了。规矩里,没写怎么难过。",
+ "e4_b": "沟底很安静。安静得,像三年前那天。",
+ "ep_bai_no": "老白:腿打了钢钉。他说,瘸着也值。",
+ "ep_bai_ok": "老白:腿保住了。阀门那夜之后,见人就夸你。",
+ "ep_chen_lost": "陈医官:她守着灯,到最后一小时。灯,还亮着。",
+ "ep_chen_ok": "陈医官:回了医院。诊室里,挂着一盏海底的灯。",
+ "ep_gao_lost": "高船长:随海燕号留在沟底。航标灯,还亮着。",
+ "ep_gao_peace": "高船长:退役申请自己写的。第一行写着:数据不如人。",
+ "ep_gao_up": "高船长:上了岸,一直没说话。听说,他在学敲管语。",
+ "ep_lead": "收队了。调度台给你记一笔——他们,后来怎样了。",
+ "ep_trench_bell": "沟底:船钟挂在问海号桅杆上。风一过,就响一声。",
+ "ep_trench_deep": "沟底:很深,很静。海燕号睡在里面,像睡着了。",
+ "ep_zheng_lost": "小郑:吊床随船,滑进了沟底。他没来得及看日出。",
+ "ep_zheng_ok": "小郑:拆了石膏,第一件事,去看海。",
+ "ep_zhou_no": "小舟:声呐日志没了。她凭记忆,重新描了一遍海图。",
+ "ep_zhou_ok": "小舟:归队报告打了三页。她说,声音都记得。",
+ "g9_dry": "一格气都不剩了。能带的,你都带回来了。",
+ "g9_in": "医疗舱躺满了。你的气瓶剩多少,你比我清楚。",
+ "g9_knot": "三年前,也是这条沟。我按时上浮了,搭档没有。",
+ "gao_a": "救援员。我船上,还剩两个活人。",
+ "gao_b": "都带走,我最后上。这是船长的规矩。",
+ "gao_c": "三年前……没什么。走吧,别耽误。",
+ "gao_confess": "日志你拿了?里面写着。是我下令,多采了一小时。",
+ "gao_final": "别下来。带他们回家,就算救完了。海燕号,通话结束。",
+ "gao_last": "航标灯替我留着。就说,船长睡了。",
+ "gao_peace": "……好。这一次,听救援员的。",
+ "gd_again": "还在吗?单击继续。",
+ "gd_brief": "单击继续简报。要选择时,向左或向右滑。",
+ "gd_continue": "单击屏幕,继续。",
+ "gd_invalid": "这个手势,水里用不上。",
+ "gd_ping1": "声呐待命。单击,发脉冲。",
+ "gd_ping2": "回波不会自己来。单击。",
+ "gd_prog1": "滑动在这里用不上。想想调度刚说的话。",
+ "gd_prog2": "别乱。停一下,想想下一步。",
+ "oxy_crit": "氧气见底,必须上浮。",
+ "oxy_crit_deck": "氧气见底,一潜都下不去了。",
+ "oxy_full": "气瓶还足,救得动。",
+ "oxy_gain": "应急瓶接上了,多三格。",
+ "oxy_low": "氧气告急,只够最后一潜。",
+ "oxy_ok": "氧气还够两潜。",
+ "p1": "管路在响。向左滑,停下来听敲管的暗号。向右滑,先带小舟上浮。",
+ "p2": "小舟想回去拿声呐日志。向左滑,等她。向右滑,直接上浮。",
+ "p3": "钢梁压着腿。向左滑,泄压后慢慢撬。向右滑,切割枪,快切。",
+ "p4": "老白要去关电池舱阀门。向左滑,陪他去。向右滑,直接上浮。",
+ "p5": "病舱一次只能走一个。向左滑,先带陈医官。向右滑,先带小郑。",
+ "p6": "留守的人要空气。向左滑,留下你的备用瓶。向右滑,约定下一潜来接。",
+ "p7": "双人上浮。向左滑,逐站减压慢慢浮。向右滑,违规直浮,搏一把。",
+ "p7_chen": "气只够带一个。向左滑,带船长。向右滑,带陈医官。",
+ "p7_zheng": "气只够带一个。向左滑,带船长。向右滑,带小郑。",
+ "p8": "船长的话没说完。向左滑,把你听到的说出来。向右滑,什么都不问,拉他上浮。",
+ "p9": "海燕号的船钟,还挂在沉船上。向左滑,用最后的气,下去取。向右滑,进医疗舱。",
+ "prog_d1": "现在是第一次下潜。",
+ "prog_d2": "现在是第二次下潜。",
+ "prog_d3": "现在是第三次下潜。",
+ "prog_d4": "现在是最后一次下潜。",
+ "prog_saved1": "已经救上一个人。",
+ "prog_saved2": "已经救上两个人。",
+ "prog_saved3": "已经救上三个人。",
+ "prog_saved4": "已经救上四个人。",
+ "prog_saved5": "五个人都在甲板上了。",
+ "sys_continue_ask": "检测到你的下潜记录。单击继续上次,右滑开始新救援。",
+ "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。选择时,左右滑。",
+ "sys_menu": "菜单。单击切换选项,双击确认。",
+ "sys_menu_lobby": "保存并回大厅。",
+ "sys_menu_restart": "重新开始这次救援。",
+ "sys_menu_resume": "回到水下。",
+ "sys_new_dive": "新的一次下潜,开始了。",
+ "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
+ "sys_skip": "听过的句子再播时,单击就能跳过。",
+ "z1_a": "……有人吗?声呐兵,小舟。我们还活着,全艇五个人。",
+ "z1_b": "轮机长老白困在机舱,陈医官和小郑在病舱,船长在指挥舱。",
+ "z1_bye": "好。上面……是不是天亮了?",
+ "z1_knock": "等等,你听。管子里,有人在敲。"
+ },
+ "bridge": {
+ "cr_decide": "听选项,下令。",
+ "cr_timeout": "没来得及下令。",
+ "die_adv_sys": "系统离线时,别把宝押在它身上。",
+ "die_adv_to": "早下令,勤靠港,别硬扛。",
+ "die_intro": "舰体解体在即,全员撤离。",
+ "die_meteor": "陨石撕开了船身。",
+ "die_pirate": "海盗的炮火击穿了舰体。",
+ "die_rad": "辐射熔穿了舱壁。",
+ "dir_bow": "方位,舰首。",
+ "dir_port": "方位,左舷。",
+ "dir_star": "方位,右舷。",
+ "dir_stern": "方位,舰尾。",
+ "doc_aid": "幸好停了船,他们撑不了多久了。",
+ "doc_care": "有伤员的地方,就有我。",
+ "doc_ignore": "……我没有什么要说的。",
+ "doc_trap": "有人拿求救当诱饵,小心。",
+ "dock_empty": "全舰状态良好,无需整备。",
+ "dock_go": "启航,继续巡逻。",
+ "dock_open": "靠港整备。左右滑看项目,单击执行。",
+ "eng_fix": "修好了,再听它稳稳地转。",
+ "eng_gripe": "护盾不是这么用的,舰长……",
+ "eng_sup": "交给我,三分钟,给它救活。",
+ "eng_wear": "老伙计累出毛病了,让我来。",
+ "evt_distress": "断续三短,求救信号。",
+ "evt_dock": "本段结束,靠港整备。",
+ "evt_meteor": "碎石呼啸,陨石群。",
+ "evt_pirate": "敌船引擎,海盗。",
+ "evt_radiation": "计数急响,辐射云。",
+ "evt_resume": "启航,下一段巡航。",
+ "gd_cruise": "还在巡航。上滑,巡检全舰。",
+ "gd_decide": "还在等命令。左右滑,听选项。",
+ "gd_dock": "还在整备。左右滑,单击执行。",
+ "gd_invalid": "这个操作,这里用不上。",
+ "hint_dock3": "整备完毕,就启航。",
+ "intro_1": "你是巡逻舰星环号的舰长。在这条航线上,耳朵就是雷达。",
+ "intro_2": "全舰四个系统:引擎、护盾、扫描、武器,各守一方。",
+ "intro_3": "引擎在舰尾低鸣,护盾在舰首嗡响。",
+ "intro_4": "扫描在左舷扫掠,武器在右舷充能。",
+ "intro_5": "危机从哪边来,哪边先遭殃。",
+ "loy_aid": "医师与大副,记下了这次驰援。",
+ "loy_breach": "工程师心疼过载的护盾。",
+ "loy_evade_pirate": "大副觉得,这一躲有些窝囊。",
+ "loy_fight_win": "大副打得尽兴,士气高涨。",
+ "loy_ignore": "求救没了下文,医师很失望。",
+ "loy_rad": "医师在处理伤员。",
+ "merit_1": "功勋,寥寥。",
+ "merit_2": "功勋,可观。",
+ "merit_3": "功勋,丰厚。",
+ "opt_aid": "驰援,靠扫描。",
+ "opt_breach": "硬闯,靠护盾。",
+ "opt_evade": "规避机动,靠引擎。",
+ "opt_fight": "迎战,靠武器。",
+ "opt_ignore": "按兵不动,不理会。",
+ "opt_route_rich": "矿富航线,采得多,磨损也多。",
+ "opt_route_safe": "稳妥航线,采集平平,太平。",
+ "port_back": "返回。",
+ "port_open": "星港整备,功勋兑换。左右滑看,单击定。",
+ "port_poor": "功勋不够。",
+ "rate_a": "出色完成巡逻。",
+ "rate_b": "巡逻结束,有惊无险。",
+ "rate_c": "巡逻结束,遍体鳞伤。",
+ "rate_d": "巡逻失败,弃舰撤离。",
+ "rate_s": "教科书巡逻,功勋卓著。",
+ "recap_go": "继续航行。",
+ "rep_engine": "修理引擎,升一级,两资源。",
+ "rep_ok": "修理完成。",
+ "rep_open": "巡逻归来,全舰记功。剩余资源已折算功勋。",
+ "rep_poor": "资源不够。",
+ "rep_scan": "修理扫描,升一级,两资源。",
+ "rep_shield": "修理护盾,升一级,两资源。",
+ "rep_weapon": "修理武器,升一级,两资源。",
+ "res_ambush": "遭了伏击,舰体受创。",
+ "res_bad": "损失惨重。",
+ "res_clean": "干净利落,有惊无险。",
+ "res_hurt": "舰体受创。",
+ "res_mine": "轰开碎石,采到矿材,资源加一。",
+ "res_plunder": "海盗击退,缴获物资,资源加二。",
+ "res_rad": "全船受照。",
+ "res_reward": "救援成功,对方致谢,资源加二。",
+ "route_ask": "选择巡航航线。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "settle_hook": "星港期待你的下一次巡逻。单击,返航。",
+ "st_doc_1": "医师,离心。",
+ "st_doc_2": "医师,平常。",
+ "st_doc_3": "医师,信赖。",
+ "st_eng_1": "工程师,离心。",
+ "st_eng_2": "工程师,平常。",
+ "st_eng_3": "工程师,信赖。",
+ "st_hull_1": "舰体,稳固。",
+ "st_hull_2": "舰体,带伤。",
+ "st_hull_3": "舰体,危急。",
+ "st_rp_1": "资源紧张。",
+ "st_rp_2": "资源够用。",
+ "st_rp_3": "资源充足。",
+ "st_seg_1": "第一巡航段。",
+ "st_seg_2": "第二巡航段。",
+ "st_seg_3": "第三巡航段。",
+ "st_seg_4": "第四巡航段,末段。",
+ "st_xo_1": "大副,离心。",
+ "st_xo_2": "大副,平常。",
+ "st_xo_3": "大副,信赖。",
+ "sup_doc": "医师带人抢修,舰体补回一点。",
+ "sup_eng": "工程师出手,系统复航了。",
+ "sup_none": "这个岗位,眼下没人顶上。",
+ "sup_xo": "大副坐上炮位,火力压制!",
+ "sys_continue_ask": "检测到未完成的巡逻。单击继续,右滑进星港。",
+ "sys_engine_dmg": "引擎,受损。",
+ "sys_engine_off": "引擎,离线。",
+ "sys_help": "巡航中,上滑巡检全舰;危机中,左右滑听选项,单击下令。下滑菜单,双击重新听。",
+ "sys_menu": "菜单。单击切换,双击确认。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_restart": "放弃本次巡逻。",
+ "sys_menu_resume": "回到舰桥。",
+ "sys_menu_save": "保存并回大厅。",
+ "sys_new_patrol": "新巡逻,星环号启航。",
+ "sys_saved": "进度已保存。",
+ "sys_scan_dmg": "扫描,受损。",
+ "sys_scan_off": "扫描,离线。",
+ "sys_shield_dmg": "护盾,受损。",
+ "sys_shield_off": "护盾,离线。",
+ "sys_weapon_dmg": "武器,受损。",
+ "sys_weapon_off": "武器,离线。",
+ "trap_hint": "求救码后面,有引擎声,多留心。",
+ "tut_after": "就是这样:听声,辨型,下令。",
+ "tut_aid": "驰援靠扫描。我们的扫描,稳得很。",
+ "tut_all_ok": "四个音都稳,全舰正常。",
+ "tut_crisis": "有情况。听签名音,辨认类型。",
+ "tut_d0": "先试巡检。向上滑,听全舰状态。",
+ "tut_decide": "左右滑听选项,单击下令。",
+ "tut_done": "教学完了。舰长,航线交给你。",
+ "tut_loyal": "船员的心分三档:离心、平常、信赖。上滑巡检听得到。",
+ "tut_skip": "已跳过教学。上滑巡检,危机时左右滑听选项。",
+ "upg_aegis": "应急护盾,每段首次受创减一。功勋七十。",
+ "upg_armor1": "加装装甲,舰体上限加一。功勋四十。",
+ "upg_armor2": "重型装甲,舰体上限再加一。功勋六十。",
+ "upg_buy": "改装完成。",
+ "upg_done": "这项已改装到位。",
+ "upg_harvest": "采集协议,每段多一份资源。功勋三十。",
+ "upg_spare": "备用零件,出发自带一批物资。功勋二十。",
+ "upg_vet": "老兵船组,开局全员忠诚加一。功勋五十。",
+ "xo_aid": "驰援是应该的,星环号不是过路人。",
+ "xo_fight": "舰长,交给我,炮位就绪!",
+ "xo_uneasy": "又是一路躲。舰长,弟兄们想打。",
+ "xo_win": "打得漂亮,这条航线够他们传一阵子。"
+ },
+ "cipher": {
+ "b_chief": "四封电文,一封都不许漏。你的耳朵,是处里最值钱的东西。",
+ "b_goal": "今晚频道里有四封密电。每一个字,都要过你的耳朵。",
+ "b_open": "民国二十九年,江城。电讯处的夜班,从零点的电波声开始。",
+ "b_rule": "北风问候你。规矩就一条:听不清,就再听一遍。",
+ "book_0": "密码本,一页都不剩了。",
+ "book_1": "密码本,只剩最后一页。",
+ "book_2": "密码本,还剩两页。",
+ "book_3": "密码本,还剩三页。",
+ "cand_bay": "货船。",
+ "cand_day": "客车。",
+ "cand_hand": "今夜交接。",
+ "cand_land": "地点变更。",
+ "cand_ray": "巡逻艇。",
+ "cand_sand": "明晨交接。",
+ "cand_say": "约谈。",
+ "cand_sly": "内部排查。",
+ "cand_spy": "内线确认。",
+ "cand_tap": "窃听令。",
+ "cand_tip": "线人费。",
+ "cand_top": "黑名单。",
+ "cf_confirm": "就这个词?再单击,定下来。",
+ "d9_caught_e": "信号被咬住了。别回头,走水路。快。",
+ "d9_send": "北风,北风。处置令,今夜三时。撤。",
+ "d9_send_e": "收到了。你的手法,我听了一整晚。快走。",
+ "d9_sleep": "机关上了。雨声里,只剩挂钟。",
+ "d9_sleepe": "天亮之前,还有两个钟头。守住。",
+ "dv1_ask": "密码本第一页。三个词,哪个是它?",
+ "dv1_right": "货船,译对了。药品,装在货船的底舱。",
+ "dv1_teach": "电文进来了。先双击,把它重新听一遍。",
+ "dv1_teach2": "左右滑,听密码本上的候选词。单击,选定一个。",
+ "dv1_wrong": "不对。听清楚:B,一长,三短。",
+ "dv2_ask": "密码本第二页。三个词,选一个。",
+ "dv3_ask": "密码本第三页。三个词,选一个。",
+ "dv4_ask": "密码本第四页。三个词,选一个。",
+ "e1_a": "电波追不上我了。码头的灯,一盏一盏地灭。",
+ "e1_b": "新的密码本,在城外渡口等我。黎明,比想象中安静。",
+ "e2_a": "交了班,一切照旧。没人知道今晚频道里发生过什么。",
+ "e2_b": "只是北风的呼叫,到天亮也没人接。下一次,我会接吗。",
+ "e3_a": "我把警报拍了三遍。门开的时候,挂钟正好敲三点。",
+ "e3_b": "审讯室的灯,也很亮。可码头那边,一个人都没少。",
+ "e4_a": "两点五十九分,脚步停在门口。我把最后一页密码,塞进了炉子。",
+ "e4_b": "耳机还挂着。里面有一封电文,永远译不完了。",
+ "end_c1": "这是你在电波里挣下的第一个结局。",
+ "end_c2": "这是你在电波里挣下的第二个结局。",
+ "end_c3": "这是你在电波里挣下的第三个结局。",
+ "end_c4": "四个结局,都收进你的密码本了。",
+ "ep_hand_no": "交接:码头的灯,白亮了一夜。",
+ "ep_hand_ok": "交接:胶卷上了船,手很稳。",
+ "ep_lead": "天亮了。北风给你记了最后一笔账——今晚的事,都有了去向。",
+ "ep_list_no": "名单:天亮时,多了一个红圈。",
+ "ep_list_ok": "名单:码头连夜搬了家。卷宗里,少了一个人。",
+ "ep_med_no": "药品:没人接住那三箱药。船,白白过了江。",
+ "ep_med_ok": "药品:货船丑时靠岸,三箱药,一箱不少。",
+ "ep_spy_no": "处置令:差的那三个字母,差了一整条命。",
+ "ep_spy_ok": "处置令:你译对了它。北风,撤在你前头。",
+ "exp_calm": "这一晚,还没人看你第二眼。",
+ "exp_hot": "门外,好像有人换了岗。",
+ "exp_low": "处长端着茶,多看了你一眼。",
+ "exp_mid": "走廊里的脚步声,慢了下来。",
+ "g9_in": "频道要收了。最后一件事,是你自己。",
+ "g9_knot": "三年前,我译错了一封电。那之后,我再没见过我的上线。",
+ "gd_again": "还在吗?单击继续。",
+ "gd_brief": "单击继续值机。要选词时,向左或向右滑。",
+ "gd_continue": "单击屏幕,继续。",
+ "gd_invalid": "这个手势,值机室里用不上。",
+ "gd_prog1": "光切词没有用。双击,先听电文。",
+ "gd_prog2": "别急。停下来,把电文听完整。",
+ "gd_tune1": "电文在等。左右滑,听候选词。",
+ "gd_tune2": "双击,把电文再听一遍。再双击,会放慢。",
+ "hint_t1": "我教你一页:第一个字母,是 B。一长,三短。",
+ "hint_t2": "翻到这页:第二个字母,是 O。三长。",
+ "hint_t3": "翻到这页:第一个字母,是 H。四短。",
+ "hint_t4": "翻到这页:第二个字母,是 P。短,两长,短。",
+ "m2_chief": "嗯,译得很全。去吧。",
+ "m4_chief_a": "值机员,今晚的频道,很热闹啊。",
+ "m4_chief_b": "你的耳朵最好。听见什么,记得……要报。",
+ "m4_chief_c": "行。去睡吧,明天还有明天的事。",
+ "n1": "零点半。挂钟走了半圈,雨没有停。",
+ "n2": "一点整。处长的灯,还亮着。",
+ "n3": "一点三刻。雨小了,频道里很静。",
+ "p2": "药品船,丑时过江。向左滑,把船期报给北风。向右滑,压进值机日志。",
+ "p4_blind": "一封通报。向左滑,压进抽屉,谁的耳朵也别装。向右滑,按流程呈报处长。",
+ "p4_known": "名单上有码头。向左滑,暗号示警,让他连夜搬家。向右滑,按流程呈报处长。",
+ "p6": "交接在你手里。向左滑,亲自去码头跑一趟。向右滑,留书暗号,托给下一班。",
+ "p8_blind": "收台之前。向左滑,回一封例行电文,搅一搅水。向右滑,什么都不做。",
+ "p8_known": "三点之前。向左滑,拍一封假电,说北风昨夜已撤。向右滑,手离开放键器,装傻。",
+ "p9_blind": "北风在等答复。向左滑,开机,把今晚发出去。向右滑,例行收台。",
+ "p9_known": "收网之前。向左滑,开机,发最后一电。向右滑,关机,装睡到天亮。",
+ "prog_t1": "现在是今晚第一封电文。",
+ "prog_t2": "现在是第二封,内部通报。",
+ "prog_t3": "现在是第三封,交接电文。",
+ "prog_t4": "第四封,最后一封。",
+ "r1a_e": "收到。江上有人等你。第一封,做得稳。",
+ "r1a_send": "北风,北风。货船,丑时过江,接住。",
+ "r1b_e": "日志下面压着的,是三箱药。船,不会等你。",
+ "r1b_hold": "先压一压。这一船的事,得看清楚再说。",
+ "r2a_act": "有的字,不能落进卷宗。",
+ "r2a_e": "这一页,从今天起,不存在了。",
+ "r2b_act": "通报誊清,呈处长。",
+ "r2b_e": "名单进了卷宗。码头,自己多保重。",
+ "r3a_e": "值班室空了一刻钟。值机日志,停了一行。",
+ "r3a_go": "口令我背得出。今夜,我亲自去。",
+ "r3b_act": "暗号夹进交接簿,让雨替我跑这一趟。",
+ "r3b_e_no": "交接的袋子,在码头放到了天亮。",
+ "r3b_e_ok": "交接赶上了。袋子,连夜上了船。",
+ "r4a_e": "假电出了门。对家的耳朵,听得出换人了吗。",
+ "r4a_feed": "戴上手键。这一封,借快手七的手法。",
+ "r4b_act": "手,离开放键器。我只是个值机的。",
+ "r4b_e": "有时,什么都不做,就是做了。",
+ "rev_hand": "今夜交接。丑时,老码头。",
+ "rev_land": "地点变更。等下一封。",
+ "rev_sand": "明晨交接。天亮再说。",
+ "rev_say": "明早九时,约谈相关人员。",
+ "rev_sly": "即日起,排查站内三人。",
+ "rev_spy": "内线确认,今夜三时收网。代号,耳机。",
+ "rev_tap": "窃听令。今夜,有人要装耳朵。",
+ "rev_tip": "线人费。月底之前,有人要收钱。",
+ "rev_top": "黑名单。头一个代号,叫码头。",
+ "rx1_in": "第一封。江上船队的调度,拍得很稳。",
+ "rx2_in": "第二封。手法很急,是内部通报。",
+ "rx3_in": "第三封。很短,手法有点抖。",
+ "rx4_in": "第四封。最后一个手法,你听过——快手七。",
+ "sys_continue_ask": "检测到你的值机记录。单击继续上次,右滑开始新的夜班。",
+ "sys_help": "单击选定,双击重新听电文。上滑听状态,下滑开菜单。选择时,左右滑。",
+ "sys_menu": "菜单。单击切换选项,双击确认。",
+ "sys_menu_book": "翻密码本,换一个字母。",
+ "sys_menu_lobby": "保存并回大厅。",
+ "sys_menu_restart": "重新开始今晚。",
+ "sys_menu_resume": "回到电波里。",
+ "sys_new_night": "新的夜班,开始了。",
+ "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
+ "sys_skip": "想跳过这句,单击就行。"
},
"detective": {
- "cf_confirm": "就这句?空格,定下来。",
- "cf_pick_line": "左右方向键,一句一句听。",
- "fin_pre": "证据在手,就此结案?空格,定下来;方向键,继续查。",
- "fin_who_confirm": "就指认这位?空格,定下来。",
- "gd_board": "还在证词板。左右方向键,换卷宗。",
- "gd_board_cf": "都听过了。按住空格,去指证。",
- "gd_cf": "还在选证词。左右方向键,空格确认。",
- "recap_cf": "卷宗都在耳朵里了。挑一句你不信的,按住空格指证。",
- "settle_hook": "同一场雨里,还有别的案子。按空格,接新案。",
- "sys_help": "方向键换卷宗,空格听取,回车重新听。按住空格指证,上键状态,下键菜单。",
- "tut_confront": "按住空格,进入指证。",
- "tut_d0": "先熟悉证词板。左右方向键,换卷宗。",
- "tut_listen": "空格,听取当前卷宗。",
- "tut_replay": "回车,重新听这一句。"
+ "acc_ge": "我守了一夜门!温太太来借热水,她能作证!",
+ "acc_shun": "我宿在城南刘掌柜家,他全家都能作证!",
+ "acc_wen": "我这把年纪翻墙?先问问那墙答不答应!",
+ "acc_zhou": "我十点就到家了!我家婆娘能作证!",
+ "b_hint_c1": "试试指证:小顺说熄了灯,温太太说灯还亮着。",
+ "b_hint_c2": "试试指证:小顺说铜秤卖了,现场铜秤还在。",
+ "b_shun_1": "我走的时候,顺手熄了店堂的灯。",
+ "b_shun_2": "钥匙,师父贴身带着,从不离身。",
+ "b_shun_3": "那伤,八成是柴房劈柴砸的。铜秤早卖给收废品的了。",
+ "b_shun_4": "库房的货,我一件都没碰过。",
+ "b_shun_break_1": "匣子是我送的,可我半路折回来了……",
+ "b_shun_break_2": "我把棉袄反穿,弓着背,葛大爷没认出我。",
+ "b_shun_break_3": "库房的货,我拿过三件换了钱。他说要对账……秤砣下去的时候,他看着我。",
+ "b_shun_react_1": "灯?我、我走的时候明明熄了……",
+ "b_shun_react_2": "别问了……别问了……",
+ "b_zhou_1": "我对完账就回家了,夜里雨大,路上没停。",
+ "b_zhou_2": "钥匙?平时就挂在柴房铜钩上,十年了。",
+ "b_zhou_3": "柴房我常去,没什么不对劲的。",
+ "cf_confirm": "就这句?单击,定下来。",
+ "cf_diff": "这两句,说的不是一件事。",
+ "cf_hit": "对不上!矛盾成立,记入疑点。",
+ "cf_pick_line": "左右滑,一句一句听。",
+ "cf_same": "这两句说得一致,不矛盾。",
+ "cf_second": "再选与它矛盾的那份证词。",
+ "cf_self": "同一句证词,和自己比不出矛盾。",
+ "cf_start": "指证矛盾。先选第一份证词。左右滑换,单击确认。",
+ "fin_ask_motive": "第三问:动机是什么?",
+ "fin_ask_weapon": "第二问:凶器是什么?",
+ "fin_clear": "不在场证明成立。证据放人,回到证词板。",
+ "fin_mv_right": "对。库里短的东西,就是引线。",
+ "fin_mv_wrong": "不对。账上短的东西,才是引线。记下了。",
+ "fin_pre": "证据在手,就此结案?单击,定下来;滑走,继续查。",
+ "fin_right": "证据链闭合。周先生,你还有什么话说?",
+ "fin_right_b": "证据链闭合。小顺,你还有什么话说?",
+ "fin_start": "结案陈词。先指认真凶:四位证人,选一个。",
+ "fin_who_confirm": "就指认这位?单击,定下来。",
+ "fin_wp_right": "对。创口的铜屑,不见了的秤砣,都指向它。",
+ "fin_wp_wrong": "不对。铜屑不答应。记下了。",
+ "fo_1": "验尸报告,念给你听。",
+ "fo_2": "死亡时间,昨夜十点到十点半。",
+ "fo_3": "后脑单次钝器伤,一击毙命。创口嵌有铜屑,凶器是铜器。",
+ "fo_4": "死者双手干净,没有搏斗痕迹。",
+ "fo_5": "鞋底是干的。当夜,死者没出过后门。",
+ "gd_board": "还在证词板。左右滑,换卷宗。",
+ "gd_board_cf": "都听过了。按住屏幕,去指证。",
+ "gd_cf": "还在选证词。左右滑,单击确认。",
+ "gd_fin": "在想?左右滑选,单击定。",
+ "gd_invalid": "这个操作,这里用不上。",
+ "hint_a": "探长,还没听的卷宗,先过一遍耳朵。",
+ "hint_b": "探长,证词里有对不上的地方,逐句比对。",
+ "hint_c1": "试试指证:周先生说熄了灯,温太太说灯还亮着。",
+ "hint_c2": "试试指证:周先生说铜秤卖了,现场铜秤还在。",
+ "hint_fin": "疑点齐了。去结案陈词。",
+ "intro_1": "雨下了一整夜。清晨,聚宝斋后院,古董商沈万川死了。",
+ "intro_2": "你是专案组探长。这桩案子,归你。",
+ "intro_3": "卷宗六份:四位证人的证词,现场勘验,法医报告。",
+ "intro_w3": "周先生,管了十年的账,见人三分笑。",
+ "item_case": "结案陈词。",
+ "item_fore": "法医报告。",
+ "item_scene": "现场勘验。",
+ "item_w1": "门卫老葛的证词。",
+ "item_w2": "学徒小顺的证词。",
+ "item_w3": "账房周先生的证词。",
+ "item_w4": "房东温太太的证词。",
+ "item_who_w1": "门卫老葛。",
+ "item_who_w2": "学徒小顺。",
+ "item_who_w3": "账房周先生。",
+ "item_who_w4": "房东温太太。",
+ "mv_1": "监守自盗。",
+ "mv_2": "寻仇泄愤。",
+ "mv_3": "劫财入户。",
+ "rate_a": "干净利落的结案。",
+ "rate_b": "案子结了,卷宗上有疏漏。",
+ "rate_c": "案子是结了,卷宗上补丁不少。",
+ "rate_s": "教科书结案。四处疑点,一击即中。",
+ "recap_cf": "卷宗都在耳朵里了。挑一句你不信的,按住指证。",
+ "recap_go": "接着查。",
+ "sc_0": "你打伞进了后院。雨水顺着瓦檐,淌成一道帘子。",
+ "sc_1": "柴房门口,沈万川面朝下倒着。后脑一处伤,现场没有凶器。",
+ "sc_2": "后门门闩完好,是死者自己开的门。生人叫不开这扇门。",
+ "sc_3": "泥地上只有进来的脚印,没有出去的。墙根的花盆,翻了一个。",
+ "sc_4": "库房铜秤立在架上,秤砣不见了。",
+ "sc_5": "柴房墙上,挂钥匙的铜钩,空着。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "settle_hook": "同一场雨里,还有别的案子。单击,接新案。",
+ "settle_open": "案件归档。雨,停了。",
+ "st_asked_0": "六份卷宗,一份都没听。",
+ "st_asked_1": "已听一份,还有五份。",
+ "st_asked_2": "已听两份,还有四份。",
+ "st_asked_3": "已听三份,还有三份。",
+ "st_asked_4": "已听四份,还有两份。",
+ "st_asked_5": "已听五份,还有一份。",
+ "st_asked_6": "六份都听完了。",
+ "st_doubt_0": "疑点,还没有。",
+ "st_doubt_1": "疑点,一处。",
+ "st_doubt_2": "疑点,两处。",
+ "st_doubt_3": "疑点,三处。",
+ "st_doubt_4": "疑点,四处,齐了。",
+ "st_miss_0": "指证,一次没错。",
+ "st_miss_1": "指证,错过一两回。",
+ "st_miss_2": "指证,错了不少。",
+ "st_wrong": "错指一回,记档。",
+ "sys_continue_ask": "检测到未结的案子。单击继续,右滑换一桩新案。",
+ "sys_help": "左右滑换卷宗,单击听取,双击重新听。长按指证,上滑状态,下滑菜单。",
+ "sys_menu": "菜单。单击切换,双击确认。",
+ "sys_menu_cf": "去指证。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_restart": "重新查这桩案子。",
+ "sys_menu_resume": "回到证词板。",
+ "sys_menu_save": "保存并回大厅。",
+ "sys_new_case": "新案开卷。",
+ "sys_saved": "进度已保存。",
+ "tut_cf_ok": "指证就是这样。练习不算数,真矛盾要靠耳朵找。",
+ "tut_cf_try": "练习一次。选一份证词,单击确认;再选一份,任意一句。",
+ "tut_confront": "按住屏幕,进入指证。去找两句对不上的证词。",
+ "tut_d0": "先熟悉证词板。左右滑,换卷宗。",
+ "tut_done": "教学完了。开始查案。",
+ "tut_listen": "单击,听取当前卷宗。",
+ "tut_replay": "双击,重新听这一句。",
+ "tut_skip": "已跳过教学。左右滑换卷宗,单击听取;按住屏幕,指证矛盾。",
+ "tut_status": "上滑,随时听进度:问了几份,疑点几处。",
+ "w1_1": "昨儿夜里雨大,我守着街门,一步没敢挪窝。",
+ "w1_2": "九点四十,雨点子刚砸下来,小顺打着伞出的街门。",
+ "w1_3": "十点一刻,一位先生收着黑伞进了后巷。个儿高,微驼背。",
+ "w1_4": "九点五十,周账房出的街门,跟我说了声,回家。",
+ "w1_5": "后半夜,温太太还来门房借过一回热水。",
+ "w1_6": "听说店里账上短了银子,沈老板撂了话,月底清账。",
+ "w2_1": "夜里,师父打发我去城南,给刘掌柜送匣子。",
+ "w2_2": "雨太大,刘掌柜留我住的,今早才回店。",
+ "w2_3": "库房钥匙?师父嫌沉,平日就挂在柴房墙上的铜钩。",
+ "w2_4": "师父的账,向来只信周先生一个人。",
+ "w2_5": "后门那闩,生人叫不开。熟人来了,师父才亲自去开。",
+ "w2_6": "周先生常念叨,账房的活,越到夜里越清静。",
+ "wen_1": "雨是九点四十下的。我正收晾的衣裳,记得真真的。",
+ "wen_2": "十点二十,我出门倒垃圾。聚宝斋店堂的灯,亮着呢。",
+ "wen_3": "刚回屋,柴房后墙咯噔一响,有人爬墙!花盆翻了一个。",
+ "wen_4": "吓得我蒙头半宿没睡着,天亮才敢吱声。",
+ "wen_5": "店里短银子的事,街坊都有耳闻。上礼拜他还摔了账本。",
+ "wen_6": "周账房那人,见人三分笑,账算得比谁都精。",
+ "wp_1": "松木劈柴。",
+ "wp_2": "铜秤砣。",
+ "wp_3": "铁门闩。",
+ "wp_4": "青瓷花盆。",
+ "z_1": "我七点进店上夜账。九点五十对完,锁了前门回家。",
+ "z_2": "临走,我顺手熄了店堂的灯。那会儿,店里就剩老板。",
+ "z_3": "库房钥匙?沈老板贴身带着,从不离身。",
+ "z_4": "那伤,是松木劈柴砸的。铜秤?上个月卖给收废品的了。",
+ "z_5": "我到家倒头就睡,夜里的事,一概不知。",
+ "z_6": "你们要是不信,去问我家婆娘。",
+ "z_break_1": "别念了……我说。库房短的三件货,是我抵了赌债。",
+ "z_break_2": "他说月底清账,要报官。我求他,他不肯。",
+ "z_break_3": "我只想把钥匙放回去,把被盗做真。抡起秤砣的时候,他认出了我。",
+ "z_react_1": "灯?……许是我记岔了。人上了岁数,记性不济。",
+ "z_react_2": "钥匙的事……他、他有时候,也贴身带着的……",
+ "z_react_3": "秤!秤的事,你们别再问了……",
+ "z_react_4": "……随你们怎么问。我要回去了。",
+ "z_react_w": "铜器?……我那是顺口猜的。凶器的事,我怎么会知道。"
},
"dungeon": {
- "die_adv_1": "下次,前摇声响时就按回车。",
- "die_adv_2": "打不过,就按住空格逃跑。",
- "gd_pulse": "按空格发脉冲,听听四周。",
- "gd_turn": "轮到你了。按空格挥击。",
- "help_battle": "敌人前摇声响时按回车格挡,按空格挥击。打不过就按住空格逃跑。",
- "help_explore": "按空格发脉冲,按住空格前进,左右方向键转身。按回车再听,上方向键查状态,下方向键开菜单。",
- "settle_again": "按空格,再探一次。",
- "sys_continue_ask": "检测到探窟记录。按空格继续,按右方向键重新开始。",
- "sys_menu": "菜单。按空格切换,按回车确认。",
- "tut_attack": "现在按空格,挥拳打它。",
- "tut_d0": "先学会用耳朵看。按空格,发出声波脉冲。",
- "tut_flee_hold": "想逃跑,按住空格别松手。",
- "tut_menu": "按下方向键,打开菜单。",
- "tut_parry": "听到它的动静,按回车格挡。",
- "tut_replay": "按回车,再发一次脉冲,不要钱。",
- "tut_skip": "已跳过教学。按空格发脉冲,先听听四周。",
- "tut_stairs_on": "楼梯就在脚下。按空格,下潜。",
- "tut_status": "按上方向键,随时听自己的状态。",
- "tut_turn": "按左右方向键,可以转身。",
- "tut_walk": "按住空格不放,你就往前走。"
+ "btl_bat": "盲眼蝠扑了过来!",
+ "btl_behind": "它在你背后,转身再挡。",
+ "btl_crab": "窟主石甲蟹,就在你面前。",
+ "btl_crawler": "绕行者贴上来了,小心背后!",
+ "btl_flee": "你甩掉了它,被抓了一下。",
+ "btl_flee_boss": "退路塌了,跑不掉!",
+ "btl_guard": "石像卫醒了!",
+ "btl_half_crab": "石甲蟹的甲裂了!",
+ "btl_half_king": "王怒了,脚步更重了!",
+ "btl_half_leech": "腐沼蟒暴怒了!",
+ "btl_kill": "它倒下了。",
+ "btl_king": "窟中之王,就在深处。",
+ "btl_leech": "窟主腐沼蟒,挡住了楼梯。",
+ "btl_loot_1": "战利不多。",
+ "btl_loot_2": "小有收获。",
+ "btl_loot_3": "大有收获。",
+ "btl_lvup": "你的拳脚更利落了。",
+ "btl_mush": "蘑菇怪拦住了你!",
+ "btl_no_turn": "它贴着你不放,不用转身。",
+ "btl_parried": "挡下了大半!",
+ "btl_rat": "窟鼠窜了出来!",
+ "btl_spider": "洞蛛落地了!",
+ "btl_swish": "挥空了,它不在你面前。",
+ "die_adv_1": "下次,前摇声响时就双击。",
+ "die_adv_2": "打不过,就按住屏幕逃跑。",
+ "die_adv_3": "身后有动静,先转身。",
+ "die_cause_1": "你被小怪拖垮了。",
+ "die_cause_2": "你没挡住那记重击。",
+ "die_cause_3": "你背后的偷袭,要了命。",
+ "die_intro": "你倒下了。",
+ "evt_armor": "换上更硬的护甲,更抗打了。",
+ "evt_coin_1": "捡到几枚金币。",
+ "evt_coin_2": "捡到一小把金币。",
+ "evt_coin_3": "捡到一大袋金币。",
+ "evt_descend": "你顺着楼梯,往下潜。",
+ "evt_potion": "一瓶药水,收进腰带。",
+ "evt_potion_full": "腰带满了,药水留在原地。",
+ "evt_stairs_lock": "楼梯被大东西堵住了,先赢它。",
+ "evt_weapon": "捡到更快的短刃,出手更狠了。",
+ "gd_invalid": "这个操作在这里用不上。",
+ "gd_pulse": "单击脉冲,听听四周。",
+ "gd_turn": "轮到你了。单击挥击。",
+ "gold_some": "带回来一点,不多。",
+ "help_battle": "敌人前摇声响时双击格挡,单击挥击。打不过就按住屏幕逃跑。",
+ "help_explore": "单击脉冲,按住前进,左右滑转身。双击再听,上滑状态,下滑菜单。",
+ "intro_1": "你在黑暗中醒来。这里是回声地窟。",
+ "intro_2": "伸手不见五指,声音就是你的眼睛。",
+ "meta_gold_1": "这趟没带回什么。",
+ "meta_gold_2": "这趟带回一些金币。",
+ "meta_gold_3": "这趟满载而归。",
+ "nav_done": "到了,就是这里。",
+ "nav_e": "往东。",
+ "nav_n": "往北。",
+ "nav_s": "往南。",
+ "nav_w": "往西。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "settle_again": "单击,再探一次。",
+ "settle_stronger": "下个周目,你会更强。",
+ "settle_win_1": "你捧起了地窟之心,通关了!",
+ "settle_win_2": "黑暗的尽头,是光。",
+ "st_best_1": "你还没到过第三层。",
+ "st_best_2": "你最远到过中层。",
+ "st_best_3": "你到过最深层。",
+ "st_face_e": "你面朝东。",
+ "st_face_n": "你面朝北。",
+ "st_face_s": "你面朝南。",
+ "st_face_w": "你面朝西。",
+ "st_floor_1": "这是第一层。",
+ "st_floor_2": "这是第二层。",
+ "st_floor_3": "这是第三层。",
+ "st_floor_4": "这是第四层。",
+ "st_floor_5": "这是第五层。",
+ "st_floor_6": "这是第六层。",
+ "st_floor_7": "这是第七层。",
+ "st_gold_1": "口袋空空。",
+ "st_gold_2": "有些积蓄。",
+ "st_gold_3": "收获可观。",
+ "st_gold_4": "腰包鼓鼓。",
+ "st_hp_1": "你毫发无损。",
+ "st_hp_2": "你受了点伤。",
+ "st_hp_3": "你伤势不轻。",
+ "st_hp_4": "你命悬一线。",
+ "st_threat_both": "两边都有动静。",
+ "st_threat_left": "左边有脚步声。",
+ "st_threat_none": "附近很安静。",
+ "st_threat_right": "右边有脚步声。",
+ "stair_dir_e": "楼梯在东边。",
+ "stair_dir_n": "楼梯在北边。",
+ "stair_dir_s": "楼梯在南边。",
+ "stair_dir_w": "楼梯在西边。",
+ "stair_hint_a": "找找铁器的回声,那是楼梯。",
+ "stair_hint_b": "楼梯有大东西守着,先赢它。",
+ "sys_continue_ask": "检测到探窟记录。单击继续,右滑重新开始。",
+ "sys_menu": "菜单。单击切换,双击确认。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_restart": "重新开始本周目。",
+ "sys_menu_resume": "返回探索。",
+ "sys_menu_save": "保存并回大厅。",
+ "sys_new_run": "新的探窟,开始了。",
+ "sys_saved": "进度已保存。",
+ "tut_attack": "现在单击,挥拳打它。",
+ "tut_d0": "先学会用耳朵看。单击,发出声波脉冲。",
+ "tut_done": "教学完了。地窟很深,小心走。",
+ "tut_echo_come": "听,回声回来了。",
+ "tut_flee_hold": "想逃跑,按住别松手。",
+ "tut_front_rule": "回声回来越快,墙就越近。",
+ "tut_kill": "打中了,就是这样。",
+ "tut_menu": "下滑,打开菜单。",
+ "tut_mob": "前面有东西!放心,它伤不到你。",
+ "tut_parry": "听到它的动静,双击格挡。",
+ "tut_parry_miss": "没挡住也别怕,它伤不到你。",
+ "tut_parry_ok": "挡住了!",
+ "tut_replay": "双击,再发一次脉冲,不要钱。",
+ "tut_side_rule": "两侧的回声,发闷是墙,空旷是通路。",
+ "tut_skip": "已跳过教学。单击脉冲,先听听四周。",
+ "tut_stairs": "铁器的回声,就是下潜的楼梯。",
+ "tut_stairs_on": "楼梯就在脚下。单击,下潜。",
+ "tut_status": "上滑,随时听自己的状态。",
+ "tut_turn": "左滑右滑,可以转身。",
+ "tut_walk": "按住屏幕不放,你就往前走。",
+ "unlock_blade": "解锁武器,开局带着短刃。",
+ "unlock_echo": "解锁回声强化,侧向听得更远。",
+ "unlock_lead": "攒够了新的遗产。",
+ "unlock_none": "金币还不够,继续攒。",
+ "unlock_potion": "解锁行囊药,开局自带一瓶。",
+ "unlock_veil": "解锁护符,每层头一下减半。",
+ "unlock_vigor": "解锁体魄,起始更强壮。"
},
"escape": {
- "again": "按空格,再来一次。按下方向键,打开菜单。",
- "g1_move": "先活动一下。按任意方向键,走一小步。",
- "g2_wall": "这个房间不大,四面都是墙。再按两下方向键,试试碰碰墙。",
- "g3_left": "跟着我指的路走。按左方向键。",
- "g4_down": "对。再按下方向键。",
- "g5_inspect": "听到水声了吗?按一下空格,仔细检查这个房间。",
- "g6_doubletap": "钥匙能开锁。按回车,是把物品用出去的用法。现在,按回车试试。",
- "g7_goal": "找到能用这把钥匙打开的东西。需要帮助时,在原地按回车。",
- "guide_blunt_down": "按一下下方向键。",
- "guide_blunt_left": "按一下左方向键。",
- "guide_blunt_right": "按一下右方向键。",
- "guide_blunt_up": "按一下上方向键。",
- "guide_wrong_down": "不是这个方向。按下方向键。",
- "guide_wrong_left": "不是这个方向。按左方向键。",
- "guide_wrong_right": "不是这个方向。按右方向键。",
- "guide_wrong_up": "不是这个方向。按上方向键。",
- "help_ops": "方向键,在房间之间移动。按空格,检查房间,或者重听房间的声音。按回车,使用物品,或者查看背包。",
- "inspect_gate_ready": "电子锁的指示灯亮了,发出微弱的绿光。大门已经通电。按回车,打开它,离开这里。",
- "nav_down": "按下方向键。",
- "nav_left": "按左方向键。",
- "nav_right": "按右方向键。",
- "nav_up": "按上方向键。",
- "reopen_prompt": "按上方向键,重新听一遍引导。按空格,直接开始。",
- "skip_hint": "按空格可跳过旁白。",
- "start_room": "你站在设施中央的房间里。方向键移动,按空格检查,按回车使用物品。",
- "stuck_box_2": "去西北角的电箱房,按回车,把保险丝装进电箱。",
- "stuck_cabinet_2": "去东边的铁柜房,按回车,用钥匙打开铁柜。",
- "stuck_gate_2": "去东南角的大门,按回车,打开它,离开这里。",
- "stuck_key_2": "去西南角的储物间,按空格检查,找到钥匙。",
- "use_fail": "这里没有用得上东西的地方。换个房间试试,或者先按空格检查一下周围。"
+ "again": "单击屏幕,再来一次。下滑,打开菜单。",
+ "box_fixed": "电箱运转正常,电流的嗡鸣声平稳而持续。",
+ "empty_1": "房间里空空荡荡,只有你自己的回声。",
+ "empty_2": "你伸出手,摸到的只有冰冷粗糙的墙壁。",
+ "empty_3": "除了远处的水滴声,这里什么都没有。",
+ "escape": "你扳动开关。电机轰鸣,沉重的铁门缓缓升起,刺眼的光线涌了进来。你眯起眼睛,向前迈出了第一步。自由了。你逃出来了。",
+ "fix_box": "你把保险丝用力按进卡座。火花一闪,嗡鸣声响起——头顶的线路恢复供电了!",
+ "found_key": "你蹲下身在储物架的角落里摸索,指尖碰到一个冰凉的金属物件——是一把钥匙!钥匙到手了。",
+ "g0_intro": "黑暗。你在废弃的地下设施里醒来,什么都想不起来。你必须找到出路。",
+ "g1_done": "很好,你迈出了第一步。",
+ "g1_move": "先活动一下。朝任意方向滑一下,走一小步。",
+ "g2_wall": "这个房间不大,四面都是墙。再滑两下,试试碰碰墙。",
+ "g3_left": "跟着我指的路走。向左滑。",
+ "g4_down": "对。再向下滑。",
+ "g5_inspect": "听到水声了吗?单击一下,仔细检查这个房间。",
+ "g5_key": "你摸到了一把钥匙!",
+ "g6_done": "对,就是这样。接下来,靠你自己了。",
+ "g6_doubletap": "钥匙能开锁。双击,是把物品用出去的用法。现在,双击试试。",
+ "g7_goal": "找到能用这把钥匙打开的东西。需要帮助时,在原地双击。",
+ "gd_next_fuse": "保险丝到手。接下来,去找电箱。",
+ "gd_room_d": "下面的房间。",
+ "gd_room_l": "左面的房间。",
+ "gd_room_r": "右面的房间。",
+ "gd_room_u": "上面的房间。",
+ "guide_blunt_down": "手指贴着屏幕,向下推一下。",
+ "guide_blunt_left": "手指贴着屏幕,向左推一下。",
+ "guide_blunt_right": "手指贴着屏幕,向右推一下。",
+ "guide_blunt_up": "手指贴着屏幕,向上推一下。",
+ "guide_offpath": "先跟我走。",
+ "guide_skip": "跳过引导,直接开始自由探索。",
+ "guide_wrong_down": "不是这个方向。向下滑。",
+ "guide_wrong_gesture": "不是这个操作。照我说的做。",
+ "guide_wrong_left": "不是这个方向。向左滑。",
+ "guide_wrong_right": "不是这个方向。向右滑。",
+ "guide_wrong_up": "不是这个方向。向上滑。",
+ "help_ops": "滑动,在房间之间移动。单击,检查房间,或者重听房间的声音。双击,使用物品,或者查看背包。",
+ "inspect_box_dead": "墙上是一只电箱,箱盖敞开着,里面的保险丝座空空如也。没有电,这里的大门永远打不开。",
+ "inspect_cabinet_locked": "这个房间里立着一个铁柜,柜门上挂着一把锁。也许,有什么钥匙能打开它。",
+ "inspect_gate": "面前是一扇沉重的铁门。门边的电子锁一片漆黑,没有任何反应。它需要电力。",
+ "inspect_gate_ready": "电子锁的指示灯亮了,发出微弱的绿光。大门已经通电。双击,打开它,离开这里。",
+ "inv_both": "你身上带着一把钥匙和一枚保险丝。",
+ "inv_empty": "你摸了摸身上,什么也没有。",
+ "inv_fuse": "你身上带着一枚保险丝。",
+ "inv_key": "你身上带着一把钥匙。",
+ "menu_back": "返回游戏。",
+ "menu_home": "回大厅。",
+ "menu_open": "菜单。",
+ "menu_restart": "重新开始。",
+ "nav_down": "向下滑。",
+ "nav_left": "向左滑。",
+ "nav_right": "向右滑。",
+ "nav_up": "向上滑。",
+ "reopen_prompt": "上滑,重新听一遍引导。单击,直接开始。",
+ "replay": "黑暗再次合拢。你回到了中央的房间。这一次,你会更快。",
+ "room_cabinet": "这个房间里,立着一个铁柜。",
+ "room_gate": "面前,是一扇沉重的铁门。",
+ "room_power": "这个房间的墙上,有一只电箱。",
+ "room_storage": "一间储物间。货架上堆满杂物,角落里传来水滴声。",
+ "skip_hint": "单击可跳过旁白。",
+ "start_room": "你站在设施中央的房间里。滑动移动,单击检查,双击使用物品。",
+ "stuck_ask": "需要帮助吗?",
+ "stuck_box_1": "保险丝属于电箱。有电流声的地方,就有电箱。",
+ "stuck_box_2": "去西北角的电箱房,双击,把保险丝装进电箱。",
+ "stuck_box_3": "跟我说的方向走,去电箱所在的房间。",
+ "stuck_cabinet_1": "钥匙就在你身上。它能打开某一把锁。",
+ "stuck_cabinet_2": "去东边的铁柜房,双击,用钥匙打开铁柜。",
+ "stuck_cabinet_3": "跟我说的方向走,去铁柜所在的房间。",
+ "stuck_gate_1": "电已经通了。该去找那扇铁门了。",
+ "stuck_gate_2": "去东南角的大门,双击,打开它,离开这里。",
+ "stuck_gate_3": "跟我说的方向走,去大门所在的房间。",
+ "stuck_key_1": "铁锈味最重的地方,值得仔细看看。",
+ "stuck_key_2": "去西南角的储物间,单击检查,找到钥匙。",
+ "stuck_key_3": "跟我说的方向走,去西南角的储物间。",
+ "time_band1": "你逃出来了,用时不到两分钟。了不起!",
+ "time_band2": "你逃出来了,用时不到五分钟。",
+ "time_band3": "你逃出来了,用时不到十分钟。",
+ "time_band4": "你逃出来了,用时超过十分钟。",
+ "unlock_cabinet": "钥匙插进锁孔,缓缓转动。咔哒一声,柜门开了。柜子深处,躺着一枚保险丝。保险丝到手了。",
+ "use_fail": "这里没有用得上东西的地方。换个房间试试,或者先单击检查一下周围。",
+ "wall": "那边是墙,换个方向。"
},
"hunt": {
- "end_again": "按空格,再猎一局。",
- "gd_idle": "听声音的方向,按方向键。",
- "help_main": "朝声音的方向按方向键,就是出击。按空格呼喊支援,按回车旋风斩。上方向键状态,下方向键菜单。",
- "room_wait": "房间已开好,等同伴到齐。按空格,立即开局。",
- "sys_menu": "菜单。按空格切换,按回车确认。",
- "tut_attack": "听,有狼在靠近。朝声音的方向,按方向键。",
- "tut_callout": "按空格,呼喊支援,队友会来帮你。",
- "tut_rule": "野兽会从八个方向围上来。声音在哪边,就按哪边方向键。",
- "tut_skill": "按回车,旋风斩,清掉身边一圈。",
- "tut_skill_cd": "旋风斩有八秒冷却。冷却中按回车,重新听威胁。",
- "tut_status": "按上方向键,听营地状态。按下方向键,打开菜单。"
+ "breach": "有野兽冲进营地了!",
+ "breach_heavy": "巨兽撞进营地,损伤很重!",
+ "danger_low": "营地危险了,一只都不能再漏!",
+ "end_again": "单击,再猎一局。",
+ "end_lose": "营地守不住了,撤退!",
+ "end_rank": "成绩已记入猎手榜。",
+ "end_win": "天亮了,营地还在。",
+ "gd_idle": "听声音的方向,滑过去。",
+ "gd_invalid": "这个操作现在用不上。",
+ "grade_a": "评级,A。漂亮。",
+ "grade_b": "评级,B。守得还行。",
+ "grade_c": "评级,C。险胜。",
+ "grade_s": "评级,S!完美的围猎。",
+ "help_main": "朝声音的方向滑,就是出击。单击呼喊支援,双击旋风斩。上滑状态,下滑菜单。",
+ "hp_band1": "营地固若金汤。",
+ "hp_band2": "营地受了些损伤。",
+ "hp_band3": "营地损毁过半。",
+ "hp_band4": "营地快守不住了。",
+ "intro_1": "夜幕降临,野兽在山林里游荡。",
+ "intro_2": "你们是守夜的猎人,营地就在身后。",
+ "kill_band0": "你还没开张。",
+ "kill_band1": "你小有斩获。",
+ "kill_band2": "你战果累累。",
+ "net_back": "联系恢复了,接着打。",
+ "net_gone": "回不去那场围猎了,回大厅。",
+ "net_lost": "与营地断了联系,正在重连。",
+ "net_to_bot": "有猎人离队,老猎手顶上。",
+ "npc_yan_breach": "漏了一个,都小心。",
+ "npc_yan_cover": "这边交给我。",
+ "npc_yan_greet": "我来了,这边有我。",
+ "npc_yan_help_ack": "撑住,我来了。",
+ "npc_yan_help_call": "我这侧吃紧,来个人搭把手!",
+ "npc_yan_kill": "拿下!",
+ "npc_yan_skill": "都闪开,看我的!",
+ "npc_yan_wave": "新一波,稳住。",
+ "npc_zheng_breach": "哎呀,漏了一个!",
+ "npc_zheng_cover": "这边我罩着。",
+ "npc_zheng_greet": "小筝到位,开工啦。",
+ "npc_zheng_help_ack": "别慌,我来了!",
+ "npc_zheng_help_call": "这边太多了,谁来帮一下!",
+ "npc_zheng_kill": "搞定!",
+ "npc_zheng_skill": "看我清场!",
+ "npc_zheng_wave": "又来一波,打起精神。",
+ "npc_zhou_breach": "啧,溜进去一只。",
+ "npc_zhou_cover": "这边交给我吧。",
+ "npc_zhou_greet": "老周我守着,放心。",
+ "npc_zhou_help_ack": "听见了,这就到。",
+ "npc_zhou_help_call": "我这边压不住了,来人。",
+ "npc_zhou_kill": "嗯,解决了。",
+ "npc_zhou_skill": "让让,老骨头活动活动。",
+ "npc_zhou_wave": "听,又来了。",
+ "room_start": "狩猎开始,先听声音的方向。",
+ "room_wait": "房间已开好,等同伴到齐。单击,立即开局。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "skill_ready": "旋风斩准备好了。",
+ "st_wave_a": "还在头几波。",
+ "st_wave_b": "打到中段了。",
+ "st_wave_c": "最后一波了。",
+ "sys_menu": "菜单。单击切换,双击确认。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_home": "退出房间,回大厅。",
+ "sys_menu_resume": "回到猎场。",
+ "team_3": "三名猎人在守。",
+ "team_4": "四名猎人全在。",
+ "threat_few": "有野兽贴近了,听方向出手。",
+ "threat_many": "四周全是动静,快出手!",
+ "threat_none": "近处暂时没有野兽。",
+ "tut_attack": "听,有狼在靠近。朝声音的方向,滑一下。",
+ "tut_breach": "野兽冲进营地,营地就会受损。撑过五波就赢。",
+ "tut_callout": "单击一下,呼喊支援,队友会来帮你。",
+ "tut_callout_ok": "听到没,同伴回应你了。",
+ "tut_done": "教学完了。真正的围猎,现在开始。",
+ "tut_kill_ok": "好,杀掉了。就是这样。",
+ "tut_rule": "野兽会从八个方向围上来。声音在哪边,就往哪边滑。",
+ "tut_skill": "双击,旋风斩,清掉身边一圈。",
+ "tut_skill_cd": "旋风斩有八秒冷却。冷却中双击,重新听威胁。",
+ "tut_skip": "已跳过教学,开打。",
+ "tut_status": "上滑,听营地状态。下滑,打开菜单。",
+ "wave_band1": "第一波来了,别慌。",
+ "wave_band2": "第二波,比刚才多。",
+ "wave_band3": "第三波,有大家伙混在里面。",
+ "wave_band4": "第四波,更快,更多。",
+ "wave_band5": "最后一波,全来了!",
+ "wave_clear": "这一波,守住了。"
},
"keeper": {
- "gd_again": "还在吗?按空格继续。",
- "gd_brief": "按空格,继续值守。要选择时,用左右方向键。",
- "gd_continue": "按空格,继续。",
- "p1": "他的声音在抖。左箭头,先接住这个人。右箭头,先要他的船位。",
- "sys_continue_ask": "检测到你的值守记录。空格继续上次,右箭头开始新的风暴夜。",
- "sys_help": "空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。",
- "sys_menu": "菜单。空格切换选项,回车确认。",
- "sys_skip": "想跳过这句,按空格。"
+ "amo_a": "……有人吗……顺发号……船进水了……",
+ "amo_b": "白角塔!是你吗?求你,回个话!",
+ "amo_c": "我爷爷,四十年前也是在这片海没的。他说,白角的灯灭过一下。",
+ "amo_d": "塔……听得到吗?水,到膝盖了。",
+ "amo_e": "守塔人……塔里就你一个人?家里人不拦着你干这行?",
+ "amo_f": "裂了!水进得更快了。塔,告诉我怎么办!",
+ "amo_g": "……我爷爷,就在那七个人里。难怪他到死,都念着白角的灯。",
+ "amo_h": "风太大……嗯。那晚的风,一定很大。",
+ "b_goal": "今夜两艘货轮过境。守住灯,也守住频道。",
+ "b_open": "白角灯塔,风暴夜。我是今晚的守塔人。",
+ "b_rain": "浪拍到第七级台阶。雾角两长一短——塔在,我也在。",
+ "b_rule": "岸台的规矩就一条:风暴夜,灯不能灭。",
+ "c1_ask": "顺发号,报你的方位,报进水的速度。",
+ "c1_aske": "他更慌了。人没接住,数字也乱。",
+ "c1_asko": "方位……仪表进水了,我,我看不清……",
+ "c1_diary": "暗格里是祖父的日志。缺了最后一页。",
+ "c1_focus": "先守住这盏灯。旧账,天亮再算。",
+ "c1_focuse": "灯转得稳。可那句「灭过一下」,留在了你耳朵里。",
+ "c1_hold": "别慌。我在白角,哪儿也不去。慢慢说。",
+ "c1_holde": "他喘匀了。先接人,再办事。",
+ "c1_holdo": "……好,好。你在。我听见了。",
+ "c1_open": "父亲的钥匙,就在抽屉里。灯座第三级,开了。",
+ "c1_tune": "频道里有动静。很轻,像隔着整片海。",
+ "c2_back": "频道又响了。顺发号的引擎,时断时续。",
+ "c2_crack": "听!他那边,船板裂了!",
+ "c2_key": "父亲桌上那支手电,尾盖里卷着一页纸。",
+ "c2_shore": "岸台,记下他的船位。请渔政天亮前到。",
+ "c2_shoreo": "船位落在图上了。渔政的船,最快也要天亮。",
+ "c2_song": "跟我念:浪头过,船头抬。浪头退,船头落。",
+ "c2_songo": "浪头过,船头抬……真的稳了些!这口诀,谁教你的?",
+ "c3_dark": "你离塔的时候,发条走到了头。灯,灭过一刻钟。过境的货轮,平安。",
+ "c3_eye": "风眼过了。最后的浪墙,就跟在后面。",
+ "c3_page": "手电的尾盖旋开了。那页纸,在灯下摊平。",
+ "c3_wall": "浪墙起来了!就是现在!",
+ "c4_pass": "家里人?都在大陆。这行当,习惯了。",
+ "c4_passo": "哦……你也是一个人守夜。我们俩,隔着一道海。",
+ "c4_true": "我父亲也是守塔人。十二年前风暴夜,他出海救人,没有回来。",
+ "c4_trueo": "……对不起。难怪今晚,你一直都在。",
+ "c5_patch": "拿堵漏垫顶住裂缝。人守在电台边,我一直在。",
+ "c5_patcho": "顶住了!水慢下来了。我不走,守着电台。",
+ "c5_suit": "穿上救生衣,带上信号灯,站到甲板上去。",
+ "c5_suito": "穿好了。要是船散了,我就抱着它漂。",
+ "c6_reade": "四十年,两代人,一条规矩。今晚,轮到你选了。",
+ "c6_shut": "合上。守塔人的事,守塔人自己扛。",
+ "c7_go": "机械上满发条,灯能自己转到天亮。等着我。",
+ "c7_go2": "发条……我只上了半卷。快去,快回。",
+ "c7_hold": "顺发号,听我的。灯照着的那条道,跟我念,一步一步来。",
+ "c8_math": "坐标向东两百米。灯光扫过去,看见救生衣了!",
+ "c8_matho": "塔!你的灯扫到我啦!我在这边!",
+ "c8_new": "数三个浪头,借着风的角度,钻新缝!",
+ "c8_newo": "一个,两个,三——过去了!塔,我过来了!",
+ "c8_old": "走老航道。多绕半里,绕开所有的暗礁。",
+ "c8_oldo": "老航道……我爷爷念叨过这条道!稳了!",
+ "c8_song": "他爷爷传下的渔歌……在哪?再唱一遍!",
+ "c8_songo": "海风那个吹呀——塔!是你吗?我在这儿!",
+ "c9_found": "他在半路改了主意。天亮时,渔队找到了他。活着,湿透了。",
+ "c9_land": "顺发号过了礁缝,搁上背风湾的滩。人,站上了岸。",
+ "c9_return": "接驳艇回来了。两个人,一身水,一盏灯。",
+ "d9_keep": "那晚风太大,灯出了点故障。别再问了,孩子,回家吧。",
+ "d9_keepe": "这个话题,沉回了海里。天,亮了。",
+ "d9_tell_a": "四十年前守塔的,是我爷爷。他离灯去救自己的儿子。灯灭那刻,回澜号……对不住。",
+ "d9_tell_b": "我只知道,那晚守塔的是我爷爷,灯灭过一下。剩下的,我也不敢说全。",
+ "d9_telle": "他听完,沉默了很久。天,亮了。",
+ "e1_a": "天亮了。他在门厅睡熟,那页纸攥在手里。灯,亮到了最后一刻。",
+ "e1_b": "回澜号的账,翻开了第一页。这座塔,等了四十年。",
+ "e2_a": "他走的时候,天刚亮。我送到码头,什么也没说。",
+ "e2_b": "缺页放回灯底。有些东西,再压一代人。灯,还转着。",
+ "e3_a": "我把知道的,都说了。他望着海,半信半疑地点头。",
+ "e3_b": "碎片也是真话。剩下的,让海自己讲吧。",
+ "e4_a": "天亮,各自归位。他回他的港,我守我的灯。",
+ "e4_b": "隔着一道海,两座塔,谁也没再提那晚。",
+ "ep_amo_dawn": "阿澈:抱着冷藏柜漂到天亮。打那以后,出海带两台电台。",
+ "ep_amo_home": "阿澈:那晚之后改跑日班。他说,夜里的海,有守塔人听着。",
+ "ep_amo_solo": "阿澈:自己把船开上了背风湾。船主骂了船,没骂人。",
+ "ep_dad": "值班表上,你替十二年前那个班次签了字。老陈,收工了。",
+ "ep_lamp_dark": "灯塔记录簿:凌晨两点,灯灭一刻钟。那一行,你写得格外用力。",
+ "ep_lamp_full": "灯塔记录簿:你离塔三刻,灯自己转着。父亲的发条,说中了。",
+ "ep_lamp_hold": "灯塔记录簿:转灯整夜未停。你一步,也没离开过它。",
+ "ep_lead": "风停了。岸台给你记一笔——这一晚,后来怎样了。",
+ "ep_log_kept": "灯下的旧账,又压回了黑暗里。",
+ "ep_log_told": "灯下的旧账,今夜见了光。",
+ "ep_shore": "岸台晨报:风暴过境,航道平安。白角灯,正常。",
+ "g9_in": "风,一层一层退下去。天边,有点灰了。",
+ "g9_knot": "十二年了。这一晚,我总算替父亲,站完了他的班。",
+ "gd_again": "还在吗?单击继续。",
+ "gd_brief": "单击,继续值守。要选择时,向左或向右滑。",
+ "gd_continue": "单击屏幕,继续。",
+ "gd_invalid": "这个手势,塔里用不上。",
+ "gd_prog1": "滑动这里用不上。想想岸台刚说的话。",
+ "gd_prog2": "别乱。停一停,再听一遍。",
+ "lull_1": "岸台通报:风加到十级。第一程,过去了。",
+ "lull_2": "风眼凌晨过境。第二程,到顶了。",
+ "m6_seal": "那些旧东西,你今晚没碰过。缺页的事,你一无所知。",
+ "p1": "他的声音在抖。向左滑,先接住这个人。向右滑,先要他的船位。",
+ "p2": "他提到四十年前。向左滑,去翻灯座下的暗格。向右滑,先专心守灯。",
+ "p3": "他快撑不住了。向左滑,用守塔人的口诀带他稳船。向右滑,把船位报给岸台。",
+ "p4": "他问起你的人。向左滑,告诉他真话。向右滑,轻轻带过。",
+ "p5": "船在漏。向左滑,让他回舱堵漏,守住电台。向右滑,让他穿救生衣,上甲板。",
+ "p6": "祖父的最后一页。向左滑,今晚就读完它。向右滑,合上,塞回灯底。",
+ "p7": "浪墙压过来了。向左滑,给灯上满发条,驾接驳艇去接他。向右滑,守着灯,用声音引他过礁。",
+ "p8_boat": "海上没有灯。向左滑,循着他哼的渔歌找他。向右滑,按推算的坐标,直线搜。",
+ "p8_reef": "礁缝两道口。向左滑,走老航道,稳但绕远。向右滑,钻新缝,近但冒险。",
+ "p9a": "他问起四十年前的灯。向左滑,把缺页的事,连根说给他。向右滑,就说,那晚风太大。",
+ "p9b": "他问起四十年前的灯。你知道的,只有碎片。向左滑,把碎片给他。向右滑,说风太大。",
+ "prog_m1": "风暴起来了。今晚第一程。",
+ "prog_m2": "风暴到顶。第二程。",
+ "prog_m3": "风在退。最后一程。",
+ "prog_mem_f": "这是回忆:父亲的最后一晚,十二年前。",
+ "prog_mem_g": "这是回忆:祖父的年代,四十年前。",
+ "rev_c1": "唱针落下。缺的那一页,自己开了口。",
+ "rev_c2": "我写下这些,等一个敢看的人。那晚,我的儿子,偷了接驳艇。",
+ "rev_c3": "我去追他。灯,离了人。半个时辰,回澜号,七个人。",
+ "rev_c4": "儿子回来了。这页我撕下来,压进灯底。守塔人,不能离灯。",
+ "rev_c5": "风声回来了。原来那道家规,是这么来的。",
+ "rev_f1": "唱针又落下了。十二年前,也是这样的风。",
+ "rev_f2": "白角塔,我是老陈。接驳艇上两个人,都活着。",
+ "rev_f3": "守塔人听见了求救,就不能装没听见。等我回来。",
+ "rev_f4": "塔上的机械上满发条,能自己转一夜。给我留着门。",
+ "rev_f5": "风声回来了。那扇门,留到今天。",
+ "rev_g1": "唱针落下。四十年前,也是这盏灯下。",
+ "rev_g2": "手稳住。灯罩擦到第三遍,才算干净。",
+ "rev_g3": "记住,灯下压着的东西,比灯重。守塔人,替它守一辈子。",
+ "rev_g4": "风声回来了。爷爷,我听见了。",
+ "rev_teach": "听到唱针落下、风声退后,是回忆。风声回来,就是现在。",
+ "sys_continue_ask": "检测到你的值守记录。单击继续上次,右滑开始新的风暴夜。",
+ "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。选择时,左右滑。",
+ "sys_menu": "菜单。单击切换选项,双击确认。",
+ "sys_menu_lobby": "保存并回大厅。",
+ "sys_menu_restart": "重新开始今夜。",
+ "sys_menu_resume": "回到值守。",
+ "sys_new_night": "新的风暴夜,开始了。",
+ "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
+ "sys_skip": "想跳过这句,单击就行。",
+ "tr_deep": "他把命,交给了你的声音。",
+ "tr_half": "他信一半,疑一半。",
+ "tr_thin": "今晚,他只信自己的手。",
+ "tru_full": "三代人的账,今夜见底了。",
+ "tru_one": "灯下的旧账,你翻开了一角。",
+ "tru_two": "祖父和父亲的事,你都翻到了。",
+ "tru_zero": "旧账压在灯底,你一页没翻。"
},
"radio": {
- "gd_again": "还在吗?按空格继续。",
- "gd_brief": "按空格继续节目。请选择的时候,按左或右方向键。",
- "gd_continue": "按空格,继续。",
- "gd_ring1": "热线在闪。按空格,接听。",
- "gd_ring2": "灯还亮着,听众在等。按空格,接听。",
- "p1": "老人在发抖。按左方向键,陪他哼那首老歌。按右方向键,冷静问他路口的路牌。",
- "p2": "雨声更密了。按左方向键,留在原地陪他等巡逻队。按右方向键,转接派出所。",
- "p3": "按左方向键,告诉她这趟车值得上。按右方向键,把选择还给她。",
- "p4": "按左方向键,唱一段摇篮曲哄她睡。按右方向键,轻轻问她怎么了。",
- "p5": "孩子的声音在抖。按左方向键,告诉她这不是她的错。按右方向键,答应她明天都会好。",
- "p6": "摔门声你听见了。按左方向键,替孩子给她带句话。按右方向键,劝她回家把话说开。",
- "p7": "她的呼吸平了。按左方向键,留在直播里,让全城等这个门铃。按右方向键,换垫乐,私下陪她说完。",
- "p8": "方向盘比话筒危险。按左方向键,陪他聊聊闺女。按右方向键,让他立刻进服务区。",
- "p9": "留言机红灯在闪,是老主播三年前没播完的那句晚安。按左方向键,替他播出去。按右方向键,照常收播。",
- "sys_continue_ask": "检测到你的夜班记录。按空格继续上次,按右方向键开始新的夜晚。",
- "sys_help": "按空格继续,按回车重新听。按上方向键听状态,按下方向键开菜单。请选择时,左右方向键。",
- "sys_menu": "菜单。按空格切换选项,按回车确认。",
- "sys_skip": "想跳过这句,按空格就行。"
+ "b_goal": "今晚五通电话。说什么话,由你决定。",
+ "b_open": "午夜零点,红灯亮起。欢迎回到《今夜不眠》。",
+ "b_rain": "雨下了一整晚。热线灯,马上就要亮了。",
+ "b_rule": "台里的规矩就一条:先接住人,再接电话。",
+ "d9_avoid": "各位,今晚到这里。明晚零点,今夜不眠,不见不散。",
+ "d9_avoide": "留言机的红灯,又多亮了一夜。",
+ "d9_face": "师父,三年了。这句晚安,我替您播。各位,晚安。",
+ "d9_facee": "带子里其实只有电流声。但空着的那一秒,你说满了。",
+ "e1_a": "天亮了,热线灯还亮着。你们的晚安,是这座城市的心跳。",
+ "e1_b": "这把话筒,我总算接得住了。明晚零点,接着不眠。",
+ "e2_a": "今晚的热线烧得发烫。全城的失眠者,都被接住了。",
+ "e2_b": "只是路过留言机的时候,你还是没敢看它。红灯灭得很慢。",
+ "e3_a": "口碑掉了一夜。可那句迟到三年的晚安,今晚说出去了。",
+ "e3_b": "一个人的频道,也是频道。师父,收到了吗?",
+ "e4_a": "今夜不眠,静音收播。有的夜班,谁也接不住谁。",
+ "e4_b": "留言机还在闪。你没看它,它也没怪你。明晚再说吧。",
+ "ep_deer_no": "小鹿退了票。检票口的灯,记得那趟没上成的车。",
+ "ep_deer_ok": "小鹿上车了。她妈后来打电话说,那声妈,比奖杯值钱。",
+ "ep_han_no": "老韩在服务区睡了一觉。学费齐了,那首歌没放成。",
+ "ep_han_ok": "老韩到家了。后视镜上,多了朵小红花。",
+ "ep_kid_no": "糖糖后来又打来过一次。还是那句:楼下在吵。",
+ "ep_kid_ok": "糖糖家的门,这个月没再摔过。她说这是主播魔法。",
+ "ep_lead": "收播了。导播间替你记了一笔账——今晚的人都怎样了。",
+ "ep_wife_no": "陈姐在公车站坐到了末班车。那通电话,成了没寄出的信。",
+ "ep_wife_ok": "陈姐家切了蛋糕。那句「回来吧」,是我这晚听过最好的声音。",
+ "ep_zhou_no": "老周在便利店屋檐下坐到天亮。没出事,也没人听见他的歌。",
+ "ep_zhou_ok": "老周:孙子替他买了老花镜。回信说,谢谢那首歌。",
+ "g9_in": "五线收工。垫乐起——零点档,还剩最后一段。",
+ "gd_again": "还在吗?单击继续。",
+ "gd_brief": "单击继续节目。请选择的时候,向左或向右滑。",
+ "gd_continue": "单击屏幕,继续。",
+ "gd_invalid": "这个手势,直播间里用不上。",
+ "gd_ring1": "热线在闪。单击,接听。",
+ "gd_ring2": "灯还亮着,听众在等。单击,接听。",
+ "h1_a": "主播,别挂。陪我说话,我的眼皮,沉得很。",
+ "h1_b": "跑完这趟,闺女的学费就齐了。雨刷都快刮不动了。",
+ "h1_danger": "车道偏了——听!",
+ "h1_dango": "嘶——好险!前车急刹,我擦着护栏过去了。彻底醒了!",
+ "h1_echo": "对了。头通电话那位大爷,就是这片被巡逻队找到的。这城市的夜,是接着的。",
+ "h1_in": "五线来电。引擎声没停过——他在开车!",
+ "h1_stop": "听我的,前面三公里有服务区。学费急,命更急。",
+ "h1_stope": "他下了高速。单子黄了,人齐了。",
+ "h1_stopo": "行,听你的。进了服务区,我给你们放首歌听。",
+ "h1_talk": "说说她。开学第一天,她跟你说的头一句话,是什么?",
+ "h1_talke": "吓醒的,也算醒。这一趟,聊到家。",
+ "h1_talko": "她说,爸,我在学校给你赚了朵小红花。哈哈,哈哈……",
+ "k1_a": "喂……有人吗?我睡不着。",
+ "k1_ask": "睡不着的时候,心里是不是装着事?说给我听听。",
+ "k1_asko": "爸爸妈妈摔门了。是不是……我做错了什么呀。",
+ "k1_b": "家里灯关了。可是楼下,一直有声音。",
+ "k1_in": "三线来电。听呼吸,是个小孩。",
+ "k1_lie": "睡吧。明天一睁眼,什么都会好起来的。",
+ "k1_liee": "你许了个兑不了的现。孩子睡了,谎留下了。",
+ "k1_lieo": "真的吗?拉钩。晚安……",
+ "k1_lull": "闭上眼睛。风把云朵盖在被子上,月亮替你值夜班。",
+ "k1_lulle": "睡着了。可你没听见,她在怕什么。",
+ "k1_lullo": "月亮也睡了……那我也睡。",
+ "k1_truth": "糖糖,记住,大人的事,不是小孩的错。一个字都不是。",
+ "k1_truthe": "蛋糕。记下来——四线的来电,可能跟这个家有关。",
+ "k1_trutho": "嗯……那我睡了。他们明天,会一起给我切蛋糕吗?",
+ "l1_a": "主播,退票窗口十一点半就关了。我站这儿半小时了。",
+ "l1_b": "票是回去看我妈的。可我试镜又黄了,两手空空……",
+ "l1_free": "退不退,都是你的自由。夜还长,慢慢想。",
+ "l1_freee": "她走了。没上车,也没退票。年轻人的夜,长了点。",
+ "l1_freeo": "嗯……我再想想。窗口要关了,我先过去了。",
+ "l1_go": "你妈等的不是奖杯,是你进门喊的那声妈。",
+ "l1_goe": "二线收工。这句话,值一个头条。",
+ "l1_goo": "呜……嗯。不退了,我现在就去检票。谢谢您。",
+ "l1_in": "二线来电。姑娘,声音很轻,像怕吵到谁。",
+ "p1": "老人在发抖。向左滑,陪他哼那首老歌。向右滑,冷静问他路口的路牌。",
+ "p2": "雨声更密了。向左滑,留在原地陪他等巡逻队。向右滑,转接派出所。",
+ "p3": "向左滑,告诉她这趟车值得上。向右滑,把选择还给她。",
+ "p4": "向左滑,唱一段摇篮曲哄她睡。向右滑,轻轻问她怎么了。",
+ "p5": "孩子的声音在抖。向左滑,告诉她这不是她的错。向右滑,答应她明天都会好。",
+ "p6": "摔门声你听见了。向左滑,替孩子给她带句话。向右滑,劝她回家把话说开。",
+ "p7": "她的呼吸平了。向左滑,留在直播里,让全城等这个门铃。向右滑,换垫乐,私下陪她说完。",
+ "p8": "方向盘比话筒危险。向左滑,陪他聊聊闺女。向右滑,让他立刻进服务区。",
+ "p9": "留言机红灯在闪,是老主播三年前没播完的那句晚安。向左滑,替他播出去。向右滑,照常收播。",
+ "prog_c1": "现在是今晚第一通电话。",
+ "prog_c2": "现在是今晚第二通电话。",
+ "prog_c3": "现在是今晚第三通电话。",
+ "prog_c4": "现在是今晚第四通电话。",
+ "prog_c5": "现在是今晚第五通电话。",
+ "rep_high": "今晚的口碑,在听众里立住了。",
+ "rep_low": "今晚的口碑,还没立起来。",
+ "rep_mid": "今晚的口碑,不好不坏。",
+ "sys_continue_ask": "检测到你的夜班记录。单击继续上次,右滑开始新的夜晚。",
+ "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。请选择时,左右滑。",
+ "sys_menu": "菜单。单击切换选项,双击确认。",
+ "sys_menu_lobby": "保存并回大厅。",
+ "sys_menu_restart": "重新开始今晚。",
+ "sys_menu_resume": "回到直播。",
+ "sys_new_night": "新的夜晚,开始了。",
+ "sys_saved": "进度已保存。",
+ "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
+ "sys_skip": "想跳过这句,单击就行。",
+ "w1_a": "主播,我就想找个人说说。我家那口子,今晚要出远门的活儿。",
+ "w1_air": "陈姐,别挂。让他接电话——全城都在听。",
+ "w1_aire": "电话那头,传来跑步声。今晚的高光时刻。",
+ "w1_airo": "喂!回来吧!蛋糕要化了,孩子等着呢!",
+ "w1_b": "明天孩子生日!蛋糕都订好了,他人要今晚走!",
+ "w1_home": "吵架隔着电话吵不赢。回家吧,蛋糕别放到坏了。",
+ "w1_homee": "她往回走了。成不成,看他们自己的了。",
+ "w1_homeo": "嗯……我这就往回走。谢谢你,听我瞎嚷嚷。",
+ "w1_in": "四线来电。户外风声大,是位大姐。",
+ "w1_priv": "这里只有我们俩了。想说就说,想哭就哭。",
+ "w1_prive": "灯牌是你亲手关的,故事还是完整的。稳。",
+ "w1_privq": "呜……其实他订完蛋糕就跟我道歉了。是我,把门摔得太响。",
+ "w1_say": "四十分钟前,有个孩子问我们:爸妈摔门,是不是她的错。",
+ "w1_say2": "今天有位小朋友,还在等爸妈回家切蛋糕。",
+ "w1_say2e": "话递到了。就差最后一脚。",
+ "w1_say2o": "蛋糕……是他订的。他嘴上不说,心里都记着。",
+ "w1_saye": "她攥着电话,很久没出声。风都停了。",
+ "w1_sayo": "什么?她还没睡?这么晚了,她还醒着?",
+ "z1_a": "主播……我,我找不到回家的路了。",
+ "z1_adone": "他慌了。先接住情绪,再走流程。",
+ "z1_ask": "大爷,路口有什么招牌?念一个给我听听。",
+ "z1_asko": "招牌……雨糊住了,我眼花,看不清啊……",
+ "z1_b": "雨太大了。我本来,只想买副老花镜。",
+ "z1_bad": "说不清……我真是,说不清了……",
+ "z1_bade": "地址没报清就转接,雨又大。这通砸了。先稳人,再办事。",
+ "z1_ok1": "就这么接。记住这个手感。",
+ "z1_pol": "大爷,我把您转给派出所,他们马上就到。",
+ "z1_pole": "转接完成,地址报得清。干净利落。",
+ "z1_polo": "好,好。谢谢你啊,谢谢。",
+ "z1_ring_in": "一线来电。七十多岁,雨夜,走丢了。",
+ "z1_sdone": "他稳住了。老歌,比路牌管用。",
+ "z1_song": "大爷别急,这首歌我也会。咱们一句一句来。",
+ "z1_songo": "对,对!路口修车铺,天天放这首!",
+ "z1_stay": "哪儿也不去。我陪你,这首歌还长着呢。",
+ "z1_staye": "十五分钟后,巡逻灯停在路口。全城听见老人笑了。",
+ "z1_stayo": "好,好。有人说话,我就不怕了。"
},
"rhythm": {
- "gd_miss_early": "抢拍了。等声音落下再按。",
- "gd_miss_wrong": "方向不对。跟着音色按方向键。",
- "menu_main": "菜单。按空格切换选项,按回车确认。",
- "restart": "按空格再来一遍,按右方向键下一首,按下方向键回大厅。",
- "select_hint": "左右方向键选曲目,按空格开始,按下方向键回大厅。",
- "skip_hint": "按空格可跳过旁白。",
- "tut_1": "听,底鼓。在下一小节的同一个位置,按空格。",
- "tut_2": "这次是左和右。跟着打,按左方向键,按右方向键。",
- "tut_3": "最后一句,三个音,中间是按回车。"
+ "gd_answer": "现在跟着我打。",
+ "gd_count": "四拍之后,继续。",
+ "gd_miss": "慢了半拍,下一小节跟上我就行。",
+ "gd_miss_early": "抢拍了。等声音落下再滑。",
+ "gd_miss_late": "慢了半拍。跟着节拍走。",
+ "gd_miss_wrong": "方向不对。跟着音色滑。",
+ "gd_miss_none": "这拍没接。我停下的时候,就轮到你了。",
+ "gd_slow": "我放慢一些,跟着试试。",
+ "grade_a": "A 级!准确率超过八成五,非常出色。",
+ "grade_b": "B 级,准确率超过七成。不错,还能更好。",
+ "grade_c": "C 级,准确率不到七成。别灰心,再来一遍。",
+ "grade_s": "S 级!准确率超过九成五,完美演出。",
+ "menu_lobby": "回大厅。",
+ "menu_main": "菜单。单击切换选项,双击确认。",
+ "menu_resume": "继续演奏。",
+ "mid_song": "过半了,保持。",
+ "new_best_combo": "新连击纪录!",
+ "restart": "单击再来一遍,右滑下一首,下滑回大厅。",
+ "retry_early": "早了,等鼓点再出手。",
+ "retry_late": "晚了,跟着鼓点走。",
+ "retry_listen": "再听一遍,跟着来。",
+ "retry_skip": "没关系,我们先走下一句。",
+ "retry_wrong": "敲错鼓了,再听一遍。",
+ "rules": "规则:我敲一小节鼓,你在下一小节照着敲回来。鼓要选对,拍点也要对。",
+ "select_hint": "左右滑选曲目,单击开始,下滑回大厅。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "skip_hint": "单击可跳过旁白。",
+ "song1_name": "第一首,启程,九十拍。",
+ "song2_name": "第二首,追风,一百零五拍。",
+ "song3_name": "第三首,星爆,一百二十拍。",
+ "song_locked": "这首还没解锁。上一首拿到 B 级以上就能解锁。",
+ "tut_done": "很好,演出开始。",
+ "tut_fill": "最后有一段加花,跟着我连打。",
+ "tut_map": "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。",
+ "tut_probe": "摸到三个不同的地方,我们就开始。",
+ "tut_skip": "跳过教学,直接开始。",
+ "tut_z_kick": "下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。",
+ "tut_z_patt": "上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。",
+ "tut_z_sides": "左下是军鼓,右下是低嗵。一左一右,跟着打。",
+ "unlock_song2": "新曲目解锁,追风!",
+ "unlock_song3": "新曲目解锁,星爆!",
+ "welcome": "欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。",
+ "welcome_back": "欢迎回来,鼓手。准备好了就开始。",
+ "zone_bc": "下中,底鼓。",
+ "zone_bl": "左下,军鼓。",
+ "zone_br": "右下,低嗵。",
+ "zone_tc": "上中,高嗵。",
+ "zone_tl": "左上,踩镲。",
+ "zone_tr": "右上,吊镲。"
},
"rpg": {
- "btl_lose_hint": "记住,听清前摇,按回车格挡。",
- "gd_parry_miss": "前摇声起的时候按回车,才能格挡。",
- "gd_stall": "想好了吗?左右方向键选择,按空格出手。",
- "help_battle": "战斗中,左右方向键选招式,按空格出手。听到敌人的前摇,按回车格挡。",
- "help_explore": "左右方向键切换选项,按空格确认。按回车重新听场景,按上方向键查看状态,按下方向键打开菜单。",
- "shop_open": "商店。左右方向键看看货,按空格购买。",
- "skip_hint": "按空格可跳过旁白。",
- "sys_continue_ask": "检测到你的旅程记录。按空格继续,按右方向键开始新的旅程。",
- "sys_menu": "菜单。左右方向键选择,按空格确认。",
- "tut_b0": "战斗里,左右方向键选招式,按空格出手。听到这个声音,就是你的回合。先按一按方向键,试试。",
- "tut_b2": "就是现在,按回车格挡!",
- "tut_b3": "挡住了!轮到你了。左右方向键选攻击,按空格出剑。",
- "tut_b6": "来不及格挡,就选防御。左右方向键,选防御,按空格。",
- "tut_battle_2": "左右方向键切换招式,攻击、破空斩、防御、金疮药。按空格,出手。",
- "tut_battle_3": "敌人出手前有一声前摇。听到前摇,马上按回车,就能格挡。",
- "tut_battle_5": "记住:听清前摇,按回车格挡。开始吧!"
+ "boss1_warn": "里面就是黑风寨主。你现在回去练练再来,也来得及。",
+ "btl_enemy_die": "敌人倒下了。",
+ "btl_flee": "你抽身退出了战斗。",
+ "btl_flee_fail": "没甩掉!它追上来了。",
+ "btl_half_bandit": "山贼的攻势缓了下来。",
+ "btl_levelup": "你的修为精进了。",
+ "btl_loot_big": "大获全胜,收获颇丰。",
+ "btl_loot_mid": "收获不少。",
+ "btl_loot_small": "小有收获。",
+ "btl_lose": "你倒下了,黑暗吞没了一切。",
+ "btl_lose_hint": "记住,听清前摇,双击格挡。",
+ "btl_noflee": "避无可避!",
+ "btl_noitem": "没有金疮药了。",
+ "btl_nomp": "内劲不足。",
+ "btl_start_bandit": "山贼围上来了!",
+ "btl_start_boss1": "黑风寨主,就在你面前。",
+ "btl_start_elite": "寨丁头目挡住了去路!",
+ "btl_start_spider": "毒蛛从树上垂了下来!",
+ "btl_start_wolf": "野狼拦路!",
+ "btl_win": "战斗胜利。",
+ "cmd_attack": "攻击。",
+ "cmd_defend": "防御。",
+ "cmd_item": "金疮药。",
+ "cmd_skill": "破空斩。",
+ "desc_chest": "一个枯树洞。洞里似乎藏着什么。",
+ "desc_chest_re": "你回到枯树洞前。",
+ "desc_deepwood": "密林深处。虫鸣急促,远处有狼嚎,杀气很重。",
+ "desc_deepwood_re": "你回到密林深处。",
+ "desc_fork": "岔路口。风声在左右两边,听起来不太一样。",
+ "desc_fork_re": "你回到岔路口。",
+ "desc_gate": "黑风寨门前。火把熊熊,人声嘈杂。",
+ "desc_hall": "聚义厅。火盆熊熊,大厅空旷,回声冰冷。",
+ "desc_hunter": "猎人小屋。柴火正旺,还有磨刀的声音。",
+ "desc_hunter_re": "你回到猎人小屋。",
+ "desc_path": "林间小路。风穿过树叶,脚下的落叶沙沙作响。",
+ "desc_path_re": "你回到林间小路。",
+ "desc_stream": "溪流。水声潺潺,是个歇脚的好地方。",
+ "desc_stream_re": "你回到溪流边。",
+ "desc_village": "雾口村。篝火噼啪作响,村民低声议论着林子里的土匪。",
+ "desc_village_re": "你回到了雾口村。",
+ "evt_ch1_end": "寨主倒了,但徒弟不在这里。一张字条,指向南方的腐沼。",
+ "evt_chest": "树洞里有两瓶金疮药,你收好了。",
+ "evt_gate_open": "寨门缓缓打开。",
+ "evt_gold15": "你在落叶下摸到十五枚金币。",
+ "evt_hunter_gift": "老猎人塞给你一瓶金疮药,还说商店会给你算便宜些。",
+ "evt_nothing": "这里什么都没有了。",
+ "foe_hp_high": "敌人气焰正盛。",
+ "foe_hp_low": "敌人撑不住了。",
+ "foe_hp_mid": "敌人露出疲态。",
+ "gd_parry_miss": "前摇声起的时候双击,才能格挡。",
+ "gd_stall": "想好了吗?左右滑动选择,单击出手。",
+ "gd_wrap_first": "回到第一个。",
+ "gd_wrap_last": "最后一个了。",
+ "help_battle": "战斗中,左右滑选招式,单击出手。听到敌人的前摇,双击格挡。",
+ "help_explore": "左右滑切换选项,单击确认。双击重新听场景,上滑查看状态,下滑打开菜单。",
+ "intro_1": "你的眼睛看不见了。但你的耳朵,比谁都灵。",
+ "intro_2": "黑风寨掳走了你唯一的徒弟。追进迷雾林,把他们连根拔起。",
+ "intro_3": "先记住,怎么用耳朵走路。",
+ "npc_boss1_1": "盲剑客?正好,省得挖你的眼睛。",
+ "npc_boss1_2": "有两下子。可惜,你听不懂死期的声音。",
+ "npc_boss1_die": "白无瞳……会找到你……",
+ "npc_elite_1": "哪儿来的瞎子,敢闯黑风寨!",
+ "npc_elite_die": "寨主……会替我报仇……",
+ "npc_elite_half": "你……你到底是什么人!",
+ "npc_headman_1": "外乡人,林子里不太平。这五十金,拿着防身。",
+ "npc_headman_2": "商店就在村里,缺什么就去看看。",
+ "npc_headman_3": "听说你是用耳朵走路的剑客?保重啊。",
+ "npc_headman_4": "救救那些被掳走的孩子吧。",
+ "npc_hunter_1": "站住。……哦,是个用耳朵的。",
+ "npc_hunter_2": "寨子里有我旧识。带上这个,别死在路上。",
+ "npc_hunter_3": "黑风寨主的双刀很快,听清他出刀前的动静。",
+ "npc_hunter_4": "去吧。让我听听,你的传说。",
+ "opt_assault": "强攻寨门。",
+ "opt_back": "返回。",
+ "opt_drink": "饮水休息。",
+ "opt_go_chest": "往左,看看树洞。",
+ "opt_go_deepwood": "前进,进密林深处。",
+ "opt_go_fork": "前进,去岔路口。",
+ "opt_go_gate": "前进,去寨门。",
+ "opt_go_hunter": "前进,去猎人小屋。",
+ "opt_go_path": "前进,去林间小路。",
+ "opt_go_stream": "往右,去溪流。",
+ "opt_investigate": "调查四周。",
+ "opt_leave": "离开。",
+ "opt_open_chest": "打开树洞。",
+ "opt_rest": "休息一晚。",
+ "opt_shop": "去商店。",
+ "opt_sneak": "绕行潜入。",
+ "opt_status": "查看状态。",
+ "opt_talk_hunter": "和老猎人谈谈。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "shop_buy": "买下了。",
+ "shop_open": "商店。左右滑看看货,单击购买。",
+ "shop_owned": "这件你已经有了。",
+ "shop_poor": "钱不够。",
+ "shop_price_armor": "皮甲,八十金。",
+ "shop_price_potion": "金疮药,三十金。",
+ "shop_price_sword": "铁剑,一百金。",
+ "skip_hint": "单击可跳过旁白。",
+ "st_armor_iron": "你身着铁鳞甲。",
+ "st_armor_leather": "你身着皮甲。",
+ "st_armor_none": "你身无片甲。",
+ "st_gold_poor": "口袋空空。",
+ "st_gold_rich": "腰包鼓鼓。",
+ "st_gold_some": "有些积蓄。",
+ "st_hp_high": "你状态很好。",
+ "st_hp_low": "你伤势很重,命悬一线。",
+ "st_hp_mid": "你受了伤。",
+ "st_lv_high": "你已是高手。",
+ "st_lv_low": "你初出茅庐。",
+ "st_lv_mid": "你小有名气。",
+ "st_weapon_iron": "你手持铁剑。",
+ "st_weapon_none": "你赤手空拳。",
+ "st_weapon_steel": "你手持青钢剑。",
+ "st_weapon_wind": "你手持听风剑。",
+ "sys_continue_ask": "检测到你的旅程记录。单击继续,右滑开始新的旅程。",
+ "sys_drink": "溪水清冽,你喝了个饱,伤势尽消。",
+ "sys_menu": "菜单。左右滑选择,单击确认。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_resume": "继续旅程。",
+ "sys_menu_save": "保存并回大厅。",
+ "sys_new_game": "新的旅程,开始了。",
+ "sys_rest": "你在篝火边睡了一觉,状态全满。",
+ "sys_saved": "进度已保存。",
+ "tut_b0": "战斗里,左右滑选招式,单击出手。听到这个声音,就是你的回合。先滑一滑,试试。",
+ "tut_b1": "它要扑了,听前摇!",
+ "tut_b2": "就是现在,双击格挡!",
+ "tut_b2b": "挡得漂亮。",
+ "tut_b3": "挡住了!轮到你了。左右滑选攻击,单击出剑。",
+ "tut_b4": "没挡住也没关系,再来一次。",
+ "tut_b5": "好剑法!接下来,靠你自己了。",
+ "tut_b6": "来不及格挡,就选防御。左右滑,选防御,单击。",
+ "tut_battle_1": "第一场战斗来了。别慌,战斗是回合制:你先出手,敌人再反击。",
+ "tut_battle_2": "左右滑切换招式,攻击、破空斩、防御、金疮药。单击,出手。",
+ "tut_battle_3": "敌人出手前有一声前摇。听到前摇,马上双击,就能格挡。",
+ "tut_battle_4": "没把握就防御,伤害减半。金疮药可以回血。",
+ "tut_battle_5": "记住:听清前摇,双击格挡。开始吧!"
},
"simon": {
- "gd_economy": "记不住就按上方向键,重新听一遍。免费机会有两次,用完要扣一次机会。",
- "gd_occ_both": "这一轮,按上方向键和回车都是作答。",
- "gd_occ_dt": "这一轮,按回车是作答。",
- "gd_occ_up": "这一轮,按上方向键是作答。",
- "gd_relisten": "需要的话,按上方向键可以重新听一遍序列。",
- "replay": "按空格,再来一局。",
- "rules": "上行音,按上方向键。下行音,按下方向键。左边的音,按左方向键。右边的音,按右方向键。一声轻响,按空格。两声轻响,按回车。",
- "rules_prompt": "按上方向键,重听规则。按下方向键,打开菜单。",
- "skip_hint": "按空格可跳过旁白。",
- "t1_up": "按上方向键,是这个声音。",
- "t2_down": "按下方向键,是这个声音。",
- "t3_left": "按左方向键,是这个声音。",
- "t4_right": "按右方向键,是这个声音。",
- "t5_tap": "按空格,是这个声音。",
- "t6_double": "按回车,是这个声音。",
- "t7_retry": "答错可以消耗机会重听。按上方向键,可以随时重听。",
- "t_blunt_double": "按一下回车。",
- "t_blunt_down": "按一下下方向键。",
- "t_blunt_left": "按一下左方向键。",
- "t_blunt_right": "按一下右方向键。",
- "t_blunt_tap": "轻轻按一下空格。",
- "t_blunt_up": "按一下上方向键。",
- "t_wrong_double": "不是这个,按回车试试。",
- "t_wrong_down": "不是这个,按下方向键试试。",
- "t_wrong_left": "不是这个,按左方向键试试。",
- "t_wrong_right": "不是这个,按右方向键试试。",
- "t_wrong_tap": "不是这个,按空格试试。",
- "t_wrong_up": "不是这个,按上方向键试试。"
+ "chance_plus": "机会加一。",
+ "chances_out": "重听机会用完了,小心。",
+ "correct": "答对了!",
+ "gameover": "游戏结束。",
+ "gd_chances_left0": "免费重听用完了。之后重听会花一次机会,别怕,慢慢来。",
+ "gd_chances_left1": "免费重听还剩一次。",
+ "gd_clear": "漂亮,过了。",
+ "gd_economy": "记不住就向上滑,重新听一遍。免费机会有两次,用完要扣一次机会。",
+ "gd_occ_both": "这一轮,向上滑和双击都是作答。",
+ "gd_occ_dt": "这一轮,双击是作答。",
+ "gd_occ_up": "这一轮,向上滑是作答。",
+ "gd_record": "破纪录了。",
+ "gd_relisten": "需要的话,向上滑可以重新听一遍序列。",
+ "menu_back": "返回游戏。",
+ "menu_home": "回大厅。",
+ "menu_open": "菜单。",
+ "menu_restart": "重新开始。",
+ "new_record": "新纪录!",
+ "relisten": "再听一遍。",
+ "replay": "单击屏幕,再来一局。",
+ "retry_use": "错了。用一次机会,再听一遍。",
+ "round_01": "第一轮,听好了。",
+ "round_02": "第二轮,听好了。",
+ "round_03": "第三轮,听好了。",
+ "round_04": "第四轮,听好了。",
+ "round_05": "第五轮,听好了。",
+ "round_06": "第六轮,听好了。",
+ "round_07": "第七轮,听好了。",
+ "round_08": "第八轮,听好了。",
+ "round_09": "第九轮,听好了。",
+ "round_10": "第十轮,听好了。",
+ "round_11": "第十一轮,听好了。",
+ "round_12": "第十二轮,听好了。",
+ "round_13": "第十三轮,听好了。",
+ "round_14": "第十四轮,听好了。",
+ "round_15": "第十五轮,听好了。",
+ "round_16": "第十六轮,听好了。",
+ "round_17": "第十七轮,听好了。",
+ "round_18": "第十八轮,听好了。",
+ "round_19": "第十九轮,听好了。",
+ "round_20": "第二十轮,听好了。",
+ "round_more": "新的一轮,听好了。",
+ "rules": "上行音,向上滑。下行音,向下滑。左边的音,向左滑。右边的音,向右滑。一声轻响,单击。两声轻响,双击。",
+ "rules_prompt": "上滑,重听规则。下滑,打开菜单。",
+ "score_band1": "一轮都没坚持下来。别灰心。",
+ "score_band2": "你坚持了三轮以内。",
+ "score_band3": "你坚持了五轮左右。",
+ "score_band4": "你坚持了将近十轮。",
+ "score_band5": "你坚持了十轮以上,很厉害。",
+ "score_band6": "你坚持了十五轮以上,大师级!",
+ "skip_hint": "单击可跳过旁白。",
+ "status_chance1": "免费用完,机会还剩一次。",
+ "status_chance2": "免费用完,机会还剩两次。",
+ "status_free1": "免费重听还有一次。",
+ "status_free2": "免费重听还有两次。",
+ "status_len_long": "这一轮挺长。",
+ "status_len_mid": "这一轮不长不短。",
+ "status_len_short": "这一轮很短。",
+ "status_len_xlong": "这一轮很长,稳住。",
+ "status_out": "免费和机会都用完了,答错就结束。",
+ "status_prog_early": "刚答了个开头。",
+ "status_prog_half": "答了一半左右。",
+ "status_prog_late": "就剩最后几个了。",
+ "status_prog_start": "刚开头,一个还没对。",
+ "t0_goal": "我会演奏一串声音,请你记住顺序,原样复现。",
+ "t0_welcome": "欢迎来到音序回响。先认识六种声音。",
+ "t1_up": "向上滑,是这个声音。",
+ "t2_down": "向下滑,是这个声音。",
+ "t3_left": "向左滑,是这个声音。",
+ "t4_right": "向右滑,是这个声音。",
+ "t5_tap": "单击,是这个声音。",
+ "t6_double": "双击,是这个声音。",
+ "t7_ready": "六种声音都记住了。后面的序列,会越来越长。",
+ "t7_retry": "答错可以消耗机会重听。向上滑,可以随时重听。",
+ "t_blunt_double": "用指尖,快速点两下屏幕。",
+ "t_blunt_down": "手指贴着屏幕,向下推一下。",
+ "t_blunt_left": "手指贴着屏幕,向左推一下。",
+ "t_blunt_right": "手指贴着屏幕,向右推一下。",
+ "t_blunt_tap": "用指尖,轻轻点一下屏幕。",
+ "t_blunt_up": "手指贴着屏幕,向上推一下。",
+ "t_ok": "对了。",
+ "t_skip": "跳过教学,直接开始。",
+ "t_try": "你试试。",
+ "t_wrong_double": "不是这个,双击试试。",
+ "t_wrong_down": "不是这个,向下滑试试。",
+ "t_wrong_left": "不是这个,向左滑试试。",
+ "t_wrong_right": "不是这个,向右滑试试。",
+ "t_wrong_tap": "不是这个,单击试试。",
+ "t_wrong_up": "不是这个,向上滑试试。",
+ "wrong": "错了。",
+ "your_turn": "轮到你了。"
},
"space": {
- "drill_down": "下面是低沉的轰隆。按下方向键!",
- "drill_left": "听,左边有陨石。按左方向键,把它拨开!",
- "drill_retry_down": "轰隆声在下面,按下方向键。",
- "drill_retry_left": "那是左边来的,按左方向键。",
- "drill_retry_right": "那是右边来的,按右方向键。",
- "drill_retry_up": "声音又高又尖,是上面,按上方向键。",
- "drill_right": "这次在右边。按右方向键!",
- "drill_up": "上面有东西,声音又尖又高。按上方向键!",
- "feat_boost": "试试按空格,引擎会短促加速,直接冲过空隙。",
- "feat_shield": "按回车展开护盾,能挡下一次撞击。",
- "gd_hit_hint": "被撞了。听方位,按对应方向键就能拨开。",
- "help_recap": "左边来按左方向键,右边来按右方向键,上面来按上方向键,下面来按下方向键。按空格加速,按回车护盾。",
- "hit_down": "下面撞上的。听到低沉的轰隆,按下方向键。",
- "hit_left": "左边撞上的。听到左边的呼啸,按左方向键。",
- "hit_right": "右边撞上的。听到右边的呼啸,按右方向键。",
- "hit_up": "上面撞上的。听到高高的呼啸,按上方向键。",
- "menu_main": "菜单。按空格切换选项,按回车确认。",
- "protect_down": "训练护盾接住了。那颗在下面,听到低沉的轰隆,按下方向键。",
- "protect_left": "训练护盾接住了。那颗在左边,听到左边的呼啸,按左方向键。",
- "protect_right": "训练护盾接住了。那颗在右边,听到右边的呼啸,按右方向键。",
- "protect_up": "训练护盾接住了。那颗在上面,听到高高的呼啸,按上方向键。",
- "restart_hint": "按空格再飞一次,按下方向键回大厅。",
- "second_run_ask": "按上方向键重新听演练,按空格直接出发。",
- "skip_hint": "按空格可跳过旁白。"
+ "dir_down": "下!",
+ "dir_left": "左!",
+ "dir_right": "右!",
+ "dir_up": "上!",
+ "dodge_1": "只拨开几颗。",
+ "dodge_2": "拨开了十来颗。",
+ "dodge_3": "拨开了几十颗。",
+ "dodge_4": "拨开了一大群,漂亮。",
+ "drill_done": "四个方向你都会了。引擎点火,出发!",
+ "drill_down": "下面是低沉的轰隆。向下滑!",
+ "drill_good": "漂亮。",
+ "drill_left": "听,左边有陨石。向左滑,把它拨开!",
+ "drill_moveon": "没关系,跟着我,我们继续。",
+ "drill_retry_down": "轰隆声在下面,向下滑。",
+ "drill_retry_left": "那是左边来的,向左滑。",
+ "drill_retry_right": "那是右边来的,向右滑。",
+ "drill_retry_up": "声音又高又尖,是上面,向上滑。",
+ "drill_right": "这次在右边。向右滑!",
+ "drill_rule": "陨石来了,会有声音告诉你方位。",
+ "drill_skip": "跳过演练,直接出发。",
+ "drill_up": "上面有东西,声音又尖又高。向上滑!",
+ "drill_welcome": "欢迎登上盲航。你只有一双耳朵。",
+ "feat_boost": "试试单击,引擎会短促加速,直接冲过空隙。",
+ "feat_boost_done": "感觉到了吗?加速的时候,陨石撞不上你。",
+ "feat_shield": "双击展开护盾,能挡下一次撞击。",
+ "feat_shield_done": "护盾展开后会自动充能,好了我会告诉你。",
+ "gd_hit_hint": "被撞了。听方位,同向滑动就能拨开。",
+ "gd_last_life": "这是最后一次机会,撑住。",
+ "help_recap": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
+ "hit_down": "下面撞上的。听到低沉的轰隆,向下滑。",
+ "hit_last": "船体只剩最后一次了,小心!",
+ "hit_left": "左边撞上的。听到左边的呼啸,向左滑。",
+ "hit_right": "右边撞上的。听到右边的呼啸,向右滑。",
+ "hit_up": "上面撞上的。听到高高的呼啸,向上滑。",
+ "menu_help": "重新听教学要点。",
+ "menu_lobby": "回大厅。",
+ "menu_main": "菜单。单击切换选项,双击确认。",
+ "menu_resume": "继续飞行。",
+ "ms_10": "十颗了,稳。",
+ "ms_100": "一百颗!天空属于你。",
+ "ms_25": "二十五颗,老练的飞行员。",
+ "ms_50": "五十颗,传奇。",
+ "new_record": "新纪录!",
+ "paused": "已暂停。",
+ "protect_down": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
+ "protect_end": "训练护盾关闭。接下来,靠你自己了。",
+ "protect_left": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
+ "protect_right": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
+ "protect_up": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
+ "restart_hint": "单击再飞一次,下滑回大厅。",
+ "second_run_ask": "上滑重新听演练,单击直接出发。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "shield_block": "护盾挡下了撞击。",
+ "shield_ready": "护盾充能完毕。",
+ "skip_hint": "单击可跳过旁白。",
+ "time_1": "不到三十秒,再试一次。",
+ "time_2": "超过三十秒,有进步。",
+ "time_3": "超过一分钟,合格的飞行员。",
+ "time_4": "超过两分钟,王牌飞行员。",
+ "protect_soon": "训练护盾还剩十秒。",
+ "boost_not_ready": "引擎还在冷却,稍等一下。"
},
"storyline": {
- "e1_dawn": "加密频道那头沉默了三秒。然后,一个你等了三十天的声音响了起来:“姐?姐!是你吗?”天亮之前,避难所的救援队打开了大门。猎狗的人,在北区的高墙下溃散了。你抱着晨晨,听见广播塔里,重新响起了音乐。后来人们说,这座城市,是从一个女人的声音开始,重新活过来的。——好结局:黎明。感谢你,陪林晚走完了这条路。按空格,可以回到故事开始的地方。",
- "e2_price": "你赶在车队前面,撞进了避难所的大门。“关掉广播!关灯!猎狗来了——!”那一夜,北区守住了。探照灯熄灭的时候,晨晨从人群里扑出来抱住你,才发现你胳膊上的血,已经把半边袖子浸透了。坐标是你交出去的,命,是你抢回来的。你赢了,用一条胳膊的代价。——结局:代价。按空格,重新开始。",
- "e3_alone": "你逃了。一路向南,没有回头。三天后,收音机里关于北区的广播,停了。又过了七天,你在一个废弃的加油站里,听见最后一个频段,也变成了沙沙声。你活下来了。只是从此以后的每一个夜里,你都会想起那声口哨,和你报出坐标时,自己发抖的声音。——坏结局:孤声。按空格,重新开始。",
- "e4_static": "公开频道,把所有人都引来了——幸存者,还有猎狗。塔顶的风很大,你看见山下火把连成的长龙,也看见避难所方向亮起的防御火光。猎狗的刀抵上来的时候,你对着麦克风笑了:“听见了吗,晨晨?姐姐的声音,全城都听见了。”信号中断了。但那晚之后,北区,再没有人投降。——结局:静默。按空格,重新开始。",
- "gd_again": "还在吗?按空格继续。",
- "gd_brief": "按空格继续剧情。请选择的时候,按左右方向键。",
- "gd_continue": "按空格,继续。",
- "help": "操作说明。按空格:继续剧情。按回车:重听刚才的台词。按上方向键:听这段说明和当前进度。按下方向键:呼出菜单,菜单里可以重新开始。当旁白说“请选择”的时候,按左方向键或者按右方向键,做出你的决定。选择无法撤销。",
- "menu": "菜单。按左方向键:重新开始整个故事。按右方向键,或者按空格:回到故事。按上方向键:听操作说明。",
- "n00_intro": "大停电后的第三十天,城市陷入彻底的黑暗。没有电,没有网络,只有收音机里偶尔闪过的沙沙声,像垂死者的呼吸。你是林晚,一名前急救员。在这个故事里,你用声音活下去。请记住:按空格,继续剧情;按回车,重听上一句;按上方向键,听你的状态和帮助;按下方向键,呼出菜单。当我说“请选择”的时候,按左方向键,或者按右方向键,做出你的决定。选择一旦做出,就无法回头。现在,按空格,睁开眼睛。",
- "p1": "请选择。按左方向键:先检查背包里的收音机。按右方向键:先摸黑寻找出口。",
- "p2": "请选择。按左方向键:钻进旁边的通风管道。按右方向键:躺进路边的尸体堆里装死。",
- "p3": "请选择。按左方向键:循着哭声过去看看。按右方向键:不去管它,直接去北区。",
- "p4": "请选择。按左方向键:带上小满一起走。按右方向键:留下食物,独自上路。",
- "p5": "请选择。按左方向键:走桥下的污水涵洞。按右方向键:爬桥上悬着的钢索。",
- "p6": "请选择。按左方向键:交出坐标,保命要紧。按右方向键:拒绝他,想办法周旋。",
- "p7": "请选择。按左方向键:追上去,警告避难所。按右方向键:自己逃命,越远越好。",
- "p8": "请选择。按左方向键:用公开频道广播,让全城都听见。按右方向键:用加密频段,只发给避难所。",
- "skip_hint": "按空格可跳过旁白。"
+ "e1_child": "姐姐,姐姐!天亮了!妈妈说过的,天亮了,就可以不数啦!",
+ "e1_dawn": "加密频道那头沉默了三秒。然后,一个你等了三十天的声音响了起来:“姐?姐!是你吗?”天亮之前,避难所的救援队打开了大门。猎狗的人,在北区的高墙下溃散了。你抱着晨晨,听见广播塔里,重新响起了音乐。后来人们说,这座城市,是从一个女人的声音开始,重新活过来的。——好结局:黎明。感谢你,陪林晚走完了这条路。单击屏幕,可以回到故事开始的地方。",
+ "e2_price": "你赶在车队前面,撞进了避难所的大门。“关掉广播!关灯!猎狗来了——!”那一夜,北区守住了。探照灯熄灭的时候,晨晨从人群里扑出来抱住你,才发现你胳膊上的血,已经把半边袖子浸透了。坐标是你交出去的,命,是你抢回来的。你赢了,用一条胳膊的代价。——结局:代价。单击屏幕,重新开始。",
+ "e3_alone": "你逃了。一路向南,没有回头。三天后,收音机里关于北区的广播,停了。又过了七天,你在一个废弃的加油站里,听见最后一个频段,也变成了沙沙声。你活下来了。只是从此以后的每一个夜里,你都会想起那声口哨,和你报出坐标时,自己发抖的声音。——坏结局:孤声。单击屏幕,重新开始。",
+ "e4_static": "公开频道,把所有人都引来了——幸存者,还有猎狗。塔顶的风很大,你看见山下火把连成的长龙,也看见避难所方向亮起的防御火光。猎狗的刀抵上来的时候,你对着麦克风笑了:“听见了吗,晨晨?姐姐的声音,全城都听见了。”信号中断了。但那晚之后,北区,再没有人投降。——结局:静默。单击屏幕,重新开始。",
+ "gd_again": "还在吗?单击继续。",
+ "gd_brief": "单击继续剧情。请选择的时候,左右滑动。",
+ "gd_continue": "轻触屏幕,继续。",
+ "gd_invalid": "这个操作在这里用不上。",
+ "help": "操作说明。单击屏幕:继续剧情。双击:重听刚才的台词。向上滑:听这段说明和当前进度。向下滑:呼出菜单,菜单里可以重新开始。当旁白说“请选择”的时候,向左滑或者向右滑,做出你的决定。选择无法撤销。",
+ "menu": "菜单。向左滑:重新开始整个故事。向右滑,或者单击:回到故事。向上滑:听操作说明。",
+ "n00_intro": "大停电后的第三十天,城市陷入彻底的黑暗。没有电,没有网络,只有收音机里偶尔闪过的沙沙声,像垂死者的呼吸。你是林晚,一名前急救员。在这个故事里,你用声音活下去。请记住:单击屏幕,继续剧情;双击,重听上一句;向上滑,听你的状态和帮助;向下滑,呼出菜单。当我说“请选择”的时候,向左滑,或者向右滑,做出你的决定。选择一旦做出,就无法回头。现在,单击屏幕,睁开眼睛。",
+ "n01_wake": "后脑一阵钝痛,嘴里全是铁锈味。你在废弃的地铁站里醒来,四周黑得像沉在水底。背包还压在身下,手电筒却不知去向。远处滴水的声音,一下,一下,像某种倒计时。",
+ "n02_linwan": "咳……咳咳……我还活着。晨晨,你在哪儿……你说过,会在北区等我。姐一定,一定找到你。",
+ "n03_msg": "姐,如果你听到这个,说明你还活着,太好了。听着,跟着广播塔的红色信号灯走,别相信任何自称救援队的人。北区,北区有真正的避难所。我在这儿等你。姐,一定要来。",
+ "n03_radio": "收音机……还好,没摔坏。等等,这是什么……这段录音,是三天前的……",
+ "n04_exit": "你扶着潮湿的墙,一步一步往外摸。第五十步,脚尖踢到一个硬物——是一支手电,还剩半格电。光柱劈开黑暗的那一瞬,你看见墙上用红漆刷着一行大字:别去北区。",
+ "n05_bcast": "北区避难所,仍在接收幸存者。重复,北区避难所,仍在接收幸存者。坐标,三、七点、五。请沿广播塔红色信号灯方向前进。",
+ "n05_signal": "就在这时,背包侧袋里的收音机,沙沙声忽然变得清晰。一个平稳的女声,一遍又一遍地重复着:",
+ "n06_whistle": "你刚走上街面,黑暗里忽然响起一声口哨。接着是第二声,第三声,从不同的方向,把你围在中间。有人的手电光,扫过你的脸。",
+ "n07_dog": "哟,瞧瞧,有肥羊自己送上门了。别跑啊。这片儿的路,都是我猎狗修的。想过去?行啊,把包留下,把你值钱的玩意儿留下。人嘛……也留下。",
+ "n08_vent": "你一矮身,钻进了通风管道。铁皮贴着脊背,窄得几乎无法呼吸。身后传来咒骂和铁棍敲击管道口的声音,越来越近,又渐渐远去。十分钟后,你从两条街外的井口爬出来,肺里像塞满了沙子。",
+ "n09_dead": "你屏住呼吸,把自己埋进路边冰冷的尸体堆里。手电、罐头、半瓶水,被他们一样一样摸走。有人踢了你一脚,你纹丝不动。就在他们离开时,你听见一句不该听见的话——“北区那个陷阱,今晚就收网。”",
+ "n10_rain": "酸雨开始下了。街面上升起细密的嘶嘶声,像无数条小蛇在游。雨幕那头,隐约传来一阵哭声——细细的,是个孩子。",
+ "n11_child": "哭声来自一间塌了一半的便利店。一个小男孩抱着膝盖坐在货架底下,身边躺着一个再也不会醒来的女人。他抬起头,脸上全是灰,小声说:“我叫小满。妈妈说,数到一千,她就会醒。我已经数到……数到好多个一千了。”",
+ "n12_take": "小满,别怕。数到一千太慢了。跟姐姐走,姐姐带你去找一座会发光的塔。抓紧我的手,别松开。",
+ "n13_leave": "你把仅剩的一罐罐头放在他身边,转身走进雨里。身后,孩子重新开始数数:一……二……三……你告诉自己,别回头。千万别回头。",
+ "n14_ignore": "哭声被你甩在身后,越来越远,最后混进雨声里,再也听不见了。你走得很快,快得像在逃跑。快一点,再快一点。你对自己说,只要到了北区,这一切就都值了。",
+ "n15_bridge": "两个小时后,江水拦住了去路。跨江大桥断成两截,桥身斜插进黑沉沉的江面。要去广播塔,只剩两条路:桥下的污水涵洞,黑得看不见底;或者,桥上悬着的钢索,在风里荡来荡去。",
+ "n16_culvert": "涵洞里,污水没到胸口,又冷又黏,带着腐烂的甜味。走到一半,水面下有什么东西,擦着你的腿滑了过去。你没有叫出声,只是走,一步,一步,直到看见洞口那点灰白的天光。",
+ "n16b_culvert_c": "你让小满骑在肩上,自己蹚进没到胸口的污水里。又冷又黏,带着腐烂的甜味。走到一半,水面下有什么东西擦过你的腿,小满吓得一抖,你抬手按住他的膝盖:“数数。”他小声数起来,一,二,三……数到一百七,你们看见了洞口的天光。",
+ "n17_cable": "钢索比想象中更滑。酸雨把它泡得发黏,你每挪一步,整根钢索就晃一下。江风从断桥的缺口灌进来,像有无数只手在水底下拽你的脚。你不往下看。你只知道,前面就是北岸。",
+ "n17b_cable_c": "钢索比想象中更滑。小满趴在你背上,一声不吭,两条小胳膊勒得你生疼。走到一半,钢索猛地一沉,你听见身后钢丝崩断的脆响。“闭眼。”你说。然后你用尽全身力气,向前,向前,直到膝盖磕上北岸的石头。",
+ "n18_dog": "啧啧啧。涵洞也拦不住你,钢索也拦不住你,命真大啊。正式认识一下——猎狗。北区广播塔底下这片,归我管。把你妹妹的坐标,还有包里剩下的东西,交出来。交出来,我让你死得体面点。",
+ "n19_betray": "好,好,我说。北区,避难所,坐标是……三、七点、五。拿去,都拿去。求你……放我走。",
+ "n20_convoy": "猎狗的车队朝北区开走了,探照灯在雨幕里划出一道道口子。你蹲在原地,胃里一阵一阵地泛酸。晨晨在北区。而刚才,是你,亲手把狼,引到了她的门口。",
+ "n21_redeem": "再快一点……再快一点!晨晨,等我。这一次,姐说什么,也不会再把你弄丢了!",
+ "n22_fight": "你往后退了半步,忽然笑了:“坐标在我脑子里。杀了我,你什么都拿不到。”猎狗愣了半秒。就是这半秒,你抓起一把沙土扬在他脸上,转身就跑。子弹擦着肩膀打进墙里,火辣辣地疼。但你在跑,你在跑——活着的感觉,从来没有这么清楚过。",
+ "n23_tower": "广播塔就立在头顶,红色的信号灯在雨里一闪一闪,像一颗还在跳动的心脏。塔底的中控台居然还能用。只要爬上去,你就能接入城市广播网,把警报发给北区的每一个人。问题是——用哪个频道。",
+ "n24_open": "所有人注意!所有人注意!我是林晚!北区避难所正在遭到袭击,重复,正在遭到袭击!能听见的人,拿起你身边能当武器的东西,去北区!救他们——也救救我们!",
+ "n25_secure": "北区,北区,这里是林晚。频率七点五,老规矩。猎狗带人来了,至少二十个,有车。顶住,我马上到。重复,顶住,我马上到。",
+ "p1": "请选择。向左滑:先检查背包里的收音机。向右滑:先摸黑寻找出口。",
+ "p2": "请选择。向左滑:钻进旁边的通风管道。向右滑:躺进路边的尸体堆里装死。",
+ "p3": "请选择。向左滑:循着哭声过去看看。向右滑:不去管它,直接去北区。",
+ "p4": "请选择。向左滑:带上小满一起走。向右滑:留下食物,独自上路。",
+ "p5": "请选择。向左滑:走桥下的污水涵洞。向右滑:爬桥上悬着的钢索。",
+ "p6": "请选择。向左滑:交出坐标,保命要紧。向右滑:拒绝他,想办法周旋。",
+ "p7": "请选择。向左滑:追上去,警告避难所。向右滑:自己逃命,越远越好。",
+ "p8": "请选择。向左滑:用公开频道广播,让全城都听见。向右滑:用加密频段,只发给避难所。",
+ "skip_hint": "单击可跳过旁白。",
+ "status1": "当前进度:第一幕,城南地铁站附近。你的目标:活着离开这片废墟,前往北区的广播塔,寻找妹妹林晨的下落。",
+ "status2": "当前进度:第二幕,酸雨笼罩的街区与断桥。你的目标:渡过江水,抵达广播塔。小心,猎狗的人,就在附近。",
+ "status3": "当前进度:第三幕,广播塔下。你的目标:把警报发出去,找到林晨。这是最后一段路了。"
},
"teahouse": {
- "gd_brew": "还在灶上,听声动手,回车。",
- "gd_serve": "客人还在堂前。上键,再听一遍他要的茶。",
- "settle_night": "熄了灯,这一晚就过去了。按空格,睡下。",
- "sys_help": "方向键选茶,空格定下。听水声,回车提壶;滴答密,回车出汤。上键状态,下键菜单。",
- "tut_d0": "先看茶柜。左右方向键,一罐一罐听。",
- "tut_serve": "茶好了。空格,端出去。",
- "tut_steep": "注水,闷泡。滴答由稀到密,密起来就是将好——回车,出汤。",
- "tut_tea": "空格,选定这罐茶。",
- "tut_water": "灶上坐水。泡泡细密是将沸,咕嘟连片是滚透——听到细密,回车提壶。",
- "upg_open": "要添置点什么?左右方向键看,空格买定。"
+ "amb_1": "车铃一响,晚班的邮差探进头来。老规矩:茉莉花茶,要滚烫的。",
+ "amb_2": "门帘一挑,绣坊的阿姐收了工,想喝一盏清火的龙井。",
+ "amb_3": "巷口的醉汉扶着门框,含含糊糊,只嚷嚷要最浓的滇红。",
+ "amb_react_good": "他喝得很慢,末了多搁下两文。",
+ "amb_react_plain": "他喝完,点点头,搁下茶钱。",
+ "amb_react_wrong": "他抿了一口,搁下半盏,晃出去了。",
+ "bai_e_a": "明儿我把棋盘搬来,你这儿灯亮,我天天来摆谱——就当,她还在看着。",
+ "bai_e_b": "回去还是那间空屋子。不过睡前有盏茶垫着,梦能沉一点。",
+ "bai_e_c": "下个月,我搬去养老院了。这把紫砂壶,留给茶馆吧。",
+ "bai_enter": "小掌柜,给我的紫砂壶,留个座。",
+ "bai_o1": "晚饭积了食。要一盏刮油的、经得住泡的,我喝得慢。",
+ "bai_o2": "昨儿那盏不错。今晚想喝口陈的,越陈越好。",
+ "bai_o3": "就馋那口陈味。老伙计,看你的手艺了。",
+ "bai_r1_good": "好茶,有回甘。像我家老婆子腌的萝卜干,越嚼越有味。",
+ "bai_r1_plain": "嗯,茶汤尚可。人老了,舌头也钝了。",
+ "bai_r1_wrong": "这不是我要的那口。不怪你——是我话没说全。",
+ "bai_r2_good": "陈味出来了。四十年前,我跟老婆子初见,就是一盏普洱。",
+ "bai_r2_plain": "茶汤淡了些。故事嘛,等茶好了再说。",
+ "bai_r2_wrong": "……不是我惦记的那口。罢了,回家睡了。",
+ "brew_start": "回到灶前。",
+ "bridge_good": "客人把这盏茶喝得很慢,像是就着茶,把心事也喝顺了。",
+ "bridge_plain": "茶喝完了,客人点点头,起身。",
+ "bridge_wrong": "那盏茶凉在桌上,客人走的时候,没回头。",
+ "chapter_end": "第一章完。这条巷子的夜,你都听过了。茶馆的故事,还长。",
+ "close_coin_1": "今晚进账,不到十五文。",
+ "close_coin_2": "今晚进账,十五到二十四文。",
+ "close_coin_3": "今晚进账,二十五文往上。",
+ "close_open": "客人走尽了。收壶,打烊。",
+ "debt_clear": "旧账清了,秦婶把那一页翻了过去。",
+ "gd_brew": "还在灶上,听声动手,双击。",
+ "gd_close": "账报完了。单击,熄灯睡下。",
+ "gd_invalid": "这个操作,这里用不上。",
+ "gd_serve": "客人还在堂前。上滑,再听一遍他要的茶。",
+ "he_e_a": "学费攒齐了,明天去看闺女。老师说她考了年级前十——这盏,我慢慢喝。",
+ "he_e_b": "钱还差一点,再跑一个月。茶馆这盏灯,是我每晚的路标。",
+ "he_e_c": "我把夜班退了。闺女在电话里说:妈,钱够用。这盏茶,我喝得最慢。",
+ "he_enter": "师傅,门口能停车不?——哦,我是说,喝茶。",
+ "he_o1": "跑了一宿,眼睛发涩,脑子发木。要一盏清口的,不要浓的。",
+ "he_o2": "今晚不打算睡了,还要跑单。要最浓的,越浓越好。",
+ "he_o3": "最后一趟车收工。想要一盏柔的,收收心。",
+ "he_r1_good": "清亮,像拿凉水洗了把脸。今晚最后一单,稳了。",
+ "he_r1_plain": "一般吧,能开就行。",
+ "he_r1_wrong": "不是这口……算了,我还得赶路。",
+ "he_r2_good": "得劲儿!闺女的照片就贴在方向盘上——再跑俩月,学费就齐了。",
+ "he_r2_plain": "不够劲,今晚里程表怕是要难看。",
+ "he_r2_wrong": "淡了。算了,我赶时间。",
+ "hint_water": "水听两遍:泡泡细密是将沸,咕嘟连片是滚透。",
+ "intro_1": "巷子最深处,有一盏亮到后半夜的灯。",
+ "intro_2": "你接手了这家茶馆。今晚,是它易主后的头一晚。",
+ "intro_3": "泡茶三步:选茶、候汤、出汤。手上的事,耳朵说了算。",
+ "night_1": "头一晚。灯亮了,水坐上,茶馆开门。",
+ "night_2": "第二晚。老客们,已经认得这条巷子。",
+ "night_3": "第三晚。今天,是收房钱的日子。",
+ "night_4": "第四晚。熟客进门,都不用问位子了。",
+ "night_5": "第五晚。这一章的夜,快要听全了。",
+ "night_more": "又一夜。灯还亮着,茶还热着。",
+ "recap_go": "接着张罗。",
+ "rent_due": "今天是房钱的日子,这一回,二十文。",
+ "rent_ok": "房钱交清,秦婶没多话。",
+ "rent_short": "房钱不够,差的那几文先记在账上。秦婶撂下一句:下回一起算。",
+ "res_good": "这一盏,泡得地道。",
+ "res_plain": "这一盏,泡得中平。",
+ "res_wrong": "这一盏,泡岔了——不是客人今晚要的那口。",
+ "serve_link": "你把茶端了过去。",
+ "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
+ "settle_night": "熄了灯,这一晚就过去了。单击,睡下。",
+ "shi_e_a": "成绩出来了,比模拟考高了四十多分!这盏茶,算我请全茶馆的!",
+ "shi_e_b": "考完了,心里反倒空荡荡的。去哪读书,听爸妈安排吧。",
+ "shi_e_c": "考砸了,茶也不对味……但至少,这儿的灯一直亮着。",
+ "shi_enter": "老板……还有位子吗?我背单词,背得头疼。",
+ "shi_o1": "想喝点香的提提神,但别太浓——喝完回家还得睡,明天早读。",
+ "shi_o2": "模拟考砸了,心里烧得慌。想喝口最清火的。",
+ "shi_o3": "考完了!今晚想喝口金贵的,犒劳自己。",
+ "shi_r1_good": "好香!脑子清醒了。这是我攒的早饭钱……值了。",
+ "shi_r1_plain": "还行吧。单词它还是不进脑子。",
+ "shi_r1_wrong": "有点苦……没事,我泡的方便面更苦。",
+ "shi_r2_good": "凉丝丝的,火气下去一半。老板,你说我还能考上吗?……算了,当我没问。",
+ "shi_r2_plain": "茶一般,我也一般,挺配的。",
+ "shi_r2_wrong": "不是这个味儿……回家还得接着刷题。",
+ "st_debt_1": "账上,还欠着秦婶的钱。",
+ "st_guest_1": "今晚第一位客人。",
+ "st_guest_2": "今晚第二位客人。",
+ "st_guest_3": "今晚第三位客人。",
+ "st_guest_4": "今晚第四位客人。",
+ "st_guest_5": "今晚第五位客人。",
+ "st_purse_1": "钱箱见底,不到十文。",
+ "st_purse_2": "钱箱周转得开,不愁明日开销。",
+ "st_purse_3": "手头宽裕,二十五文往上。",
+ "st_rep_1": "口碑还没立起来,街坊不知道巷子里有这家茶馆。",
+ "st_rep_2": "有了回头客,口碑立住脚了。",
+ "st_rep_3": "巷子口都在传你的茶,小有名气。",
+ "st_rep_4": "一盏难求,茶客口耳相传。",
+ "steep_early": "出急了,茶还睡着。这一步,偏了。",
+ "steep_late": "闷过了,汤要发苦。这一步,偏了。",
+ "steep_ok": "出汤,正好。",
+ "su_e_a": "我调去白天班啦,还能常来。给你带我们科的喜糖。",
+ "su_e_b": "还在犹豫,夜班再值一季。好在这盏茶,够我撑到天亮。",
+ "su_e_c": "我递了辞呈,往后去哪还没想好。但今晚茶馆的灯,我记住了。",
+ "su_enter": "请问……还营业吗?我刚下夜班。",
+ "su_o1": "胃里发凉,人空荡荡的。想要一盏暖的,别太冲,喝完好睡。",
+ "su_o2": "今晚换个口味,想要香的。可我还得眯一会儿才接班。",
+ "su_o3": "最后一晚了,明天起不用值夜班。还是头一回那种,暖的。",
+ "su_r1_good": "好暖……像被窝里塞了个汤婆子。谢谢你。",
+ "su_r1_plain": "嗯,是热乎的。今晚,凑合能睡。",
+ "su_r1_wrong": "这盏……有点寒。没关系,是我没说清。",
+ "su_r2_good": "真香啊……今夜走了位老人,家属拉着我的手道谢。这盏茶,敬他们。",
+ "su_r2_plain": "茶还行。今夜病房平静,平静得累人。",
+ "su_r2_wrong": "香气没出来……像我今晚的运气。算了。",
+ "sys_continue_ask": "检测到没打烊的茶馆。单击继续,右滑两次重开新店。",
+ "sys_help": "左右滑选茶,单击定下。听水声,双击提壶;滴答密,双击出汤。上滑状态,下滑菜单。",
+ "sys_menu": "菜单。单击切换,双击确认。",
+ "sys_menu_help": "重新听帮助。",
+ "sys_menu_resume": "回到堂前。",
+ "sys_menu_save": "保存并回大厅。",
+ "sys_menu_upg": "打烊置办。",
+ "sys_reset_ask": "重开新店?口碑和存款都从头来。再右滑一次,确认。",
+ "sys_saved": "进度已保存。",
+ "tea_dianhong": "滇红。红茶性暖,滚水冲,经得住闷,越闷越醇。",
+ "tea_longjing": "龙井。绿茶性鲜:水将沸就提壶,出汤要快。",
+ "tea_moli": "茉莉花茶。香靠滚水激:水滚透再冲,出汤要快。",
+ "tea_puer": "普洱。老茶经泡:滚水才泡得开,多闷一会儿更醇。",
+ "tea_tieguanyin": "铁观音。乌龙要滚水才醒,闷到滴答密了再出汤。",
+ "tea_yinzhen": "白毫银针。嫩芽金贵:水将沸就提,闷到滴答密。",
+ "tut_d0": "先看茶柜。左右滑,一罐一罐听。",
+ "tut_done": "都会了。往后每一晚,都这么泡。",
+ "tut_serve": "茶好了。单击,端出去。",
+ "tut_skip": "已跳过教学。左右滑选茶,单击选定,双击动手。",
+ "tut_status": "上滑,听今晚的局面:第几位客人,口碑如何;客人要的茶,上滑灶上随时再听。",
+ "tut_steep": "注水,闷泡。滴答由稀到密,密起来就是将好——双击,出汤。",
+ "tut_tea": "单击,选定这罐茶。",
+ "tut_water": "灶上坐水。泡泡细密是将沸,咕嘟连片是滚透——听到细密,双击提壶。",
+ "upg_cabinet": "茶柜扩容,十五文。往后普洱、白毫银针,都上柜。",
+ "upg_lock": "招牌还挂不得:口碑得十二分往上,欠账也得清。",
+ "upg_none": "眼下的钱和账,还置办不起。改日再说。",
+ "upg_open": "要添置点什么?左右滑看,单击买定。",
+ "upg_sign": "立一块招牌,二十文。要口碑立得住——十二分往上才挂。",
+ "upg_teaware": "添一副新茶具,十二文。手上更准,火候窗更宽。",
+ "water_early": "急了,水还没醒透。这一步,偏了。",
+ "water_late": "水滚老了。这一步,偏了。",
+ "water_ok": "正是时候。",
+ "zhou_e_a": "明天铺子歇一天,儿子回来帮我盘货。这盏茶,记你头上了!",
+ "zhou_e_b": "电话里跟儿子拌了两句嘴。没事——茶还热着,日子还长。",
+ "zhou_e_c": "铺子我想关了,儿子叫我过去帮工。茶馆的灯,替我多亮会儿。",
+ "zhou_enter": "小掌柜!老位置,还给我留着呢吧?",
+ "zhou_o1": "修了一天车,嗓子眼里全是机油味。就你那龙井,给我去去火。",
+ "zhou_o2": "今天冷。来盏顶饱的、浓的,扛饿又扛冻。",
+ "zhou_o3": "今晚就想要头一回那盏。一样的,再来一份。",
+ "zhou_r1_good": "嚯!就是这个味儿!多谢啦,小掌柜。",
+ "zhou_r1_plain": "嗯……还行。今天手底下,差了点意思。",
+ "zhou_r1_wrong": "这是我要的龙井吗?……算了算了,凑合喝。",
+ "zhou_r2_good": "对喽,暖到脚后跟了!跟你说——我儿子今天来电话了。",
+ "zhou_r2_plain": "茶是茶,水是水,差点火候。儿子的事,改天再说吧。",
+ "zhou_r2_wrong": "……今晚这盏不对。儿子的事,不说也罢。"
}
- },
- "abyss": {
- "b_go": "第一潜,找船。耳朵交给声呐。",
- "b_goal": "海燕号,五个人。你的双瓶,够下四潜。",
- "b_open": "风停了。我站在问海号甲板上,下面三千米,是海燕号。",
- "b_rule": "规矩就一条:气不够一潜,人就必须上浮。",
- "bai_a": "哈哈,救援的?我这腿,跟冷却管缠上了。",
- "bai_b": "艇上的药板烧了。病舱那两个,比我悬。",
- "bai_out": "腿还在!我的腿还在!走,我给你带路。",
- "bai_thanks": "这片海养着一村人。这份情,我记一辈子。",
- "chen_a": "你来了。小郑股骨断了,我给他固定好了。",
- "chen_b": "救援钟一次带一个。我是医生,我最后走。",
- "chen_last": "去吧。灯我留着,人齐了就熄。",
- "chen_stay": "去吧。我守着灯,灯不灭,人就不散。",
- "chen_up": "……好。小郑,等我,上面给你热粥。",
- "d1_code": "是老白的暗号:腿被压住,先泄压,再撬。记住这个敲法。",
- "d1_listen": "都别出声。管子那头,敲得很稳。",
- "d1_log": "日志里有失事前,最后一段录音。给你,替我们收好。",
- "d1_nolog": "日志可以补,人不能等。走了。",
- "d1_surf": "小舟出水,第一潜收工。往返,扣三格气。",
- "d1_up": "小舟,抓住我的肩锁。我们上。",
- "d2_cut": "切割枪。老白,闭眼,憋气。",
- "d2_flash": "火花炸了一下,虚惊。老白咳着,腿抽出来了。",
- "d2_leave": "阀门交给母船。你先上,腿要紧。",
- "d2_pry": "老白,忍住。先泄压,再撬。",
- "d2_pry_ok": "暗号没白听。管子一松,钢梁抬起来了。",
- "d2_pry_slow": "摸着找泄压阀,多费了一格气。腿,出来了。",
- "d2_supply": "潜友阿凯捎来应急瓶。甲板上,粥给你温着。",
- "d2_surf": "老白出水。他一直扒着舱门,往水里看。",
- "d2_valve": "电池舱我陪你去。这片海不能脏。",
- "d2_valve_e": "阀门关死了。两格气,换一片干净海。",
- "d3_chen": "陈医官,你的手在抖。这次,听我的。",
- "d3_chen_e": "陈医官出水。小郑固定在吊床上,呼吸平稳。",
- "d3_promise": "四小时内,我下来。等我。",
- "d3_spare": "备用瓶留下。灯,给我亮着。",
- "d3_spare_e": "备用瓶挂上了,能多撑十二小时。",
- "d3_surf": "病舱的人出水。海燕号的呻吟,隔着水都听得见。",
- "d3_zheng": "小郑先走。陈医官,下一潜,就是你的。",
- "d3_zheng_e": "小郑吊上去了。他一路,都没敢出声。",
- "d4_fast": "来不及了。直浮!",
- "d4_fast_e": "违规快浮。医疗舱的灯,先给你们开好。",
- "d4_pick_chen": "陈医官,轮到你了。抓住,上浮。",
- "d4_pick_gao": "船长,抓住我。海燕号的事,上面再说。",
- "d4_pick_zheng": "小郑,吊床连人一起。走了。",
- "d4_silent": "纪律就是纪律。抓住,上浮。",
- "d4_slow": "逐站停,慢慢浮。规矩不能破。",
- "d4_slow_e": "减压站一个个过。气瓶在跳,人稳着。",
- "d4_stay_lost": "另一位,留在了倾斜的船舱。航标灯,替所有人亮着。",
- "d4_surf": "最后一潜收工。问海号的甲板,从没这么亮过。",
- "d4_talk": "日志我听完了。海燕号为什么沉,我会带上去。走吧。",
- "d9_bell": "最后一潜。不为救人,为个交代。",
- "d9_bello": "船钟出水。海燕号的声音,回家了。",
- "d9_rest": "交代,留给明天的人。我去医疗舱。",
- "dry_a": "气瓶用干了。立刻上浮。",
- "dry_b": "气花在了人身上。人,都上来了。",
- "dv1_down": "下潜开始。水会越来越黑,声音会越来越多。",
- "dv1_link": "回波后面有杂音,是电台!接通了。",
- "dv1_metal": "金属回波,钢板。听见这个,就是海燕号的船身。",
- "dv1_teach": "到深度了。声呐静了。单击,发一枚脉冲。",
- "dv2_down": "第二潜,机舱。顺着敲管的声音走。",
- "dv2_found": "碎石回波后面,敲管声密了。机舱到了。",
- "dv3_down": "第三潜,病舱。海燕号在倾斜,别恋战。",
- "dv3_groan": "回波发闷。船体在呻吟,它撑不久了。",
- "dv4_down": "最后一潜,指挥舱。海燕号,撑不住了。",
- "dv4_dual": "两个人下同一潜。这趟往返,扣四格气。",
- "dv4_none": "气不够一潜了。第四潜,取消。",
- "dv4_slide": "它滑了!抓稳索缆,指挥舱里还有人!",
- "e1_a": "五个人都在甲板上。船钟的第一声,是替这条沟敲的。",
- "e1_b": "三年了,我终于敢往下看。明天,想再潜一次。",
- "e2_a": "五个人都救上来了。船钟,留在了沟底。",
- "e2_b": "没人怪我。可半夜醒来,总听见钟在响。",
- "e3_a": "没能都带回来。可我到底下去了,敲响了那口钟。",
- "e3_b": "钟声替他们,在沟底响了一声。这样,也好。",
- "e4_a": "我按规矩上浮了。规矩里,没写怎么难过。",
- "e4_b": "沟底很安静。安静得,像三年前那天。",
- "ep_bai_no": "老白:腿打了钢钉。他说,瘸着也值。",
- "ep_bai_ok": "老白:腿保住了。阀门那夜之后,见人就夸你。",
- "ep_chen_lost": "陈医官:她守着灯,到最后一小时。灯,还亮着。",
- "ep_chen_ok": "陈医官:回了医院。诊室里,挂着一盏海底的灯。",
- "ep_gao_lost": "高船长:随海燕号留在沟底。航标灯,还亮着。",
- "ep_gao_peace": "高船长:退役申请自己写的。第一行写着:数据不如人。",
- "ep_gao_up": "高船长:上了岸,一直没说话。听说,他在学敲管语。",
- "ep_lead": "收队了。调度台给你记一笔——他们,后来怎样了。",
- "ep_trench_bell": "沟底:船钟挂在问海号桅杆上。风一过,就响一声。",
- "ep_trench_deep": "沟底:很深,很静。海燕号睡在里面,像睡着了。",
- "ep_zheng_lost": "小郑:吊床随船,滑进了沟底。他没来得及看日出。",
- "ep_zheng_ok": "小郑:拆了石膏,第一件事,去看海。",
- "ep_zhou_no": "小舟:声呐日志没了。她凭记忆,重新描了一遍海图。",
- "ep_zhou_ok": "小舟:归队报告打了三页。她说,声音都记得。",
- "g9_dry": "一格气都不剩了。能带的,你都带回来了。",
- "g9_in": "医疗舱躺满了。你的气瓶剩多少,你比我清楚。",
- "g9_knot": "三年前,也是这条沟。我按时上浮了,搭档没有。",
- "gao_a": "救援员。我船上,还剩两个活人。",
- "gao_b": "都带走,我最后上。这是船长的规矩。",
- "gao_c": "三年前……没什么。走吧,别耽误。",
- "gao_confess": "日志你拿了?里面写着。是我下令,多采了一小时。",
- "gao_final": "别下来。带他们回家,就算救完了。海燕号,通话结束。",
- "gao_last": "航标灯替我留着。就说,船长睡了。",
- "gao_peace": "……好。这一次,听救援员的。",
- "gd_again": "还在吗?单击继续。",
- "gd_brief": "单击继续简报。要选择时,向左或向右滑。",
- "gd_continue": "单击屏幕,继续。",
- "gd_invalid": "这个手势,水里用不上。",
- "gd_ping1": "声呐待命。单击,发脉冲。",
- "gd_ping2": "回波不会自己来。单击。",
- "gd_prog1": "滑动在这里用不上。想想调度刚说的话。",
- "gd_prog2": "别乱。停一下,想想下一步。",
- "oxy_crit": "氧气见底,必须上浮。",
- "oxy_crit_deck": "氧气见底,一潜都下不去了。",
- "oxy_full": "气瓶还足,救得动。",
- "oxy_gain": "应急瓶接上了,多三格。",
- "oxy_low": "氧气告急,只够最后一潜。",
- "oxy_ok": "氧气还够两潜。",
- "p1": "管路在响。向左滑,停下来听敲管的暗号。向右滑,先带小舟上浮。",
- "p2": "小舟想回去拿声呐日志。向左滑,等她。向右滑,直接上浮。",
- "p3": "钢梁压着腿。向左滑,泄压后慢慢撬。向右滑,切割枪,快切。",
- "p4": "老白要去关电池舱阀门。向左滑,陪他去。向右滑,直接上浮。",
- "p5": "病舱一次只能走一个。向左滑,先带陈医官。向右滑,先带小郑。",
- "p6": "留守的人要空气。向左滑,留下你的备用瓶。向右滑,约定下一潜来接。",
- "p7": "双人上浮。向左滑,逐站减压慢慢浮。向右滑,违规直浮,搏一把。",
- "p7_chen": "气只够带一个。向左滑,带船长。向右滑,带陈医官。",
- "p7_zheng": "气只够带一个。向左滑,带船长。向右滑,带小郑。",
- "p8": "船长的话没说完。向左滑,把你听到的说出来。向右滑,什么都不问,拉他上浮。",
- "p9": "海燕号的船钟,还挂在沉船上。向左滑,用最后的气,下去取。向右滑,进医疗舱。",
- "prog_d1": "现在是第一次下潜。",
- "prog_d2": "现在是第二次下潜。",
- "prog_d3": "现在是第三次下潜。",
- "prog_d4": "现在是最后一次下潜。",
- "prog_saved1": "已经救上一个人。",
- "prog_saved2": "已经救上两个人。",
- "prog_saved3": "已经救上三个人。",
- "prog_saved4": "已经救上四个人。",
- "prog_saved5": "五个人都在甲板上了。",
- "sys_continue_ask": "检测到你的下潜记录。单击继续上次,右滑开始新救援。",
- "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。选择时,左右滑。",
- "sys_menu": "菜单。单击切换选项,双击确认。",
- "sys_menu_lobby": "保存并回大厅。",
- "sys_menu_restart": "重新开始这次救援。",
- "sys_menu_resume": "回到水下。",
- "sys_new_dive": "新的一次下潜,开始了。",
- "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
- "sys_skip": "听过的句子再播时,单击就能跳过。",
- "z1_a": "……有人吗?声呐兵,小舟。我们还活着,全艇五个人。",
- "z1_b": "轮机长老白困在机舱,陈医官和小郑在病舱,船长在指挥舱。",
- "z1_bye": "好。上面……是不是天亮了?",
- "z1_knock": "等等,你听。管子里,有人在敲。"
- },
- "bridge": {
- "cr_decide": "听选项,下令。",
- "cr_timeout": "没来得及下令。",
- "die_adv_sys": "系统离线时,别把宝押在它身上。",
- "die_adv_to": "早下令,勤靠港,别硬扛。",
- "die_intro": "舰体解体在即,全员撤离。",
- "die_meteor": "陨石撕开了船身。",
- "die_pirate": "海盗的炮火击穿了舰体。",
- "die_rad": "辐射熔穿了舱壁。",
- "dir_bow": "方位,舰首。",
- "dir_port": "方位,左舷。",
- "dir_star": "方位,右舷。",
- "dir_stern": "方位,舰尾。",
- "doc_aid": "幸好停了船,他们撑不了多久了。",
- "doc_care": "有伤员的地方,就有我。",
- "doc_ignore": "……我没有什么要说的。",
- "doc_trap": "有人拿求救当诱饵,小心。",
- "dock_empty": "全舰状态良好,无需整备。",
- "dock_go": "启航,继续巡逻。",
- "dock_open": "靠港整备。左右滑看项目,单击执行。",
- "eng_fix": "修好了,再听它稳稳地转。",
- "eng_gripe": "护盾不是这么用的,舰长……",
- "eng_sup": "交给我,三分钟,给它救活。",
- "eng_wear": "老伙计累出毛病了,让我来。",
- "evt_distress": "断续三短,求救信号。",
- "evt_dock": "本段结束,靠港整备。",
- "evt_meteor": "碎石呼啸,陨石群。",
- "evt_pirate": "敌船引擎,海盗。",
- "evt_radiation": "计数急响,辐射云。",
- "evt_resume": "启航,下一段巡航。",
- "gd_cruise": "还在巡航。上滑,巡检全舰。",
- "gd_decide": "还在等命令。左右滑,听选项。",
- "gd_dock": "还在整备。左右滑,单击执行。",
- "gd_invalid": "这个操作,这里用不上。",
- "hint_dock3": "整备完毕,就启航。",
- "intro_1": "你是巡逻舰星环号的舰长。在这条航线上,耳朵就是雷达。",
- "intro_2": "全舰四个系统:引擎、护盾、扫描、武器,各守一方。",
- "intro_3": "引擎在舰尾低鸣,护盾在舰首嗡响。",
- "intro_4": "扫描在左舷扫掠,武器在右舷充能。",
- "intro_5": "危机从哪边来,哪边先遭殃。",
- "loy_aid": "医师与大副,记下了这次驰援。",
- "loy_breach": "工程师心疼过载的护盾。",
- "loy_evade_pirate": "大副觉得,这一躲有些窝囊。",
- "loy_fight_win": "大副打得尽兴,士气高涨。",
- "loy_ignore": "求救没了下文,医师很失望。",
- "loy_rad": "医师在处理伤员。",
- "merit_1": "功勋,寥寥。",
- "merit_2": "功勋,可观。",
- "merit_3": "功勋,丰厚。",
- "opt_aid": "驰援,靠扫描。",
- "opt_breach": "硬闯,靠护盾。",
- "opt_evade": "规避机动,靠引擎。",
- "opt_fight": "迎战,靠武器。",
- "opt_ignore": "按兵不动,不理会。",
- "opt_route_rich": "矿富航线,采得多,磨损也多。",
- "opt_route_safe": "稳妥航线,采集平平,太平。",
- "port_back": "返回。",
- "port_open": "星港整备,功勋兑换。左右滑看,单击定。",
- "port_poor": "功勋不够。",
- "rate_a": "出色完成巡逻。",
- "rate_b": "巡逻结束,有惊无险。",
- "rate_c": "巡逻结束,遍体鳞伤。",
- "rate_d": "巡逻失败,弃舰撤离。",
- "rate_s": "教科书巡逻,功勋卓著。",
- "recap_go": "继续航行。",
- "rep_engine": "修理引擎,升一级,两资源。",
- "rep_ok": "修理完成。",
- "rep_open": "巡逻归来,全舰记功。剩余资源已折算功勋。",
- "rep_poor": "资源不够。",
- "rep_scan": "修理扫描,升一级,两资源。",
- "rep_shield": "修理护盾,升一级,两资源。",
- "rep_weapon": "修理武器,升一级,两资源。",
- "res_ambush": "遭了伏击,舰体受创。",
- "res_bad": "损失惨重。",
- "res_clean": "干净利落,有惊无险。",
- "res_hurt": "舰体受创。",
- "res_mine": "轰开碎石,采到矿材,资源加一。",
- "res_plunder": "海盗击退,缴获物资,资源加二。",
- "res_rad": "全船受照。",
- "res_reward": "救援成功,对方致谢,资源加二。",
- "route_ask": "选择巡航航线。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "settle_hook": "星港期待你的下一次巡逻。单击,返航。",
- "st_doc_1": "医师,离心。",
- "st_doc_2": "医师,平常。",
- "st_doc_3": "医师,信赖。",
- "st_eng_1": "工程师,离心。",
- "st_eng_2": "工程师,平常。",
- "st_eng_3": "工程师,信赖。",
- "st_hull_1": "舰体,稳固。",
- "st_hull_2": "舰体,带伤。",
- "st_hull_3": "舰体,危急。",
- "st_rp_1": "资源紧张。",
- "st_rp_2": "资源够用。",
- "st_rp_3": "资源充足。",
- "st_seg_1": "第一巡航段。",
- "st_seg_2": "第二巡航段。",
- "st_seg_3": "第三巡航段。",
- "st_seg_4": "第四巡航段,末段。",
- "st_xo_1": "大副,离心。",
- "st_xo_2": "大副,平常。",
- "st_xo_3": "大副,信赖。",
- "sup_doc": "医师带人抢修,舰体补回一点。",
- "sup_eng": "工程师出手,系统复航了。",
- "sup_none": "这个岗位,眼下没人顶上。",
- "sup_xo": "大副坐上炮位,火力压制!",
- "sys_continue_ask": "检测到未完成的巡逻。单击继续,右滑进星港。",
- "sys_engine_dmg": "引擎,受损。",
- "sys_engine_off": "引擎,离线。",
- "sys_help": "巡航中,上滑巡检全舰;危机中,左右滑听选项,单击下令。下滑菜单,双击重新听。",
- "sys_menu": "菜单。单击切换,双击确认。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_restart": "放弃本次巡逻。",
- "sys_menu_resume": "回到舰桥。",
- "sys_menu_save": "保存并回大厅。",
- "sys_new_patrol": "新巡逻,星环号启航。",
- "sys_saved": "进度已保存。",
- "sys_scan_dmg": "扫描,受损。",
- "sys_scan_off": "扫描,离线。",
- "sys_shield_dmg": "护盾,受损。",
- "sys_shield_off": "护盾,离线。",
- "sys_weapon_dmg": "武器,受损。",
- "sys_weapon_off": "武器,离线。",
- "trap_hint": "求救码后面,有引擎声,多留心。",
- "tut_after": "就是这样:听声,辨型,下令。",
- "tut_aid": "驰援靠扫描。我们的扫描,稳得很。",
- "tut_all_ok": "四个音都稳,全舰正常。",
- "tut_crisis": "有情况。听签名音,辨认类型。",
- "tut_d0": "先试巡检。向上滑,听全舰状态。",
- "tut_decide": "左右滑听选项,单击下令。",
- "tut_done": "教学完了。舰长,航线交给你。",
- "tut_loyal": "船员的心分三档:离心、平常、信赖。上滑巡检听得到。",
- "tut_skip": "已跳过教学。上滑巡检,危机时左右滑听选项。",
- "upg_aegis": "应急护盾,每段首次受创减一。功勋七十。",
- "upg_armor1": "加装装甲,舰体上限加一。功勋四十。",
- "upg_armor2": "重型装甲,舰体上限再加一。功勋六十。",
- "upg_buy": "改装完成。",
- "upg_done": "这项已改装到位。",
- "upg_harvest": "采集协议,每段多一份资源。功勋三十。",
- "upg_spare": "备用零件,出发自带一批物资。功勋二十。",
- "upg_vet": "老兵船组,开局全员忠诚加一。功勋五十。",
- "xo_aid": "驰援是应该的,星环号不是过路人。",
- "xo_fight": "舰长,交给我,炮位就绪!",
- "xo_uneasy": "又是一路躲。舰长,弟兄们想打。",
- "xo_win": "打得漂亮,这条航线够他们传一阵子。"
- },
- "cipher": {
- "b_chief": "四封电文,一封都不许漏。你的耳朵,是处里最值钱的东西。",
- "b_goal": "今晚频道里有四封密电。每一个字,都要过你的耳朵。",
- "b_open": "民国二十九年,江城。电讯处的夜班,从零点的电波声开始。",
- "b_rule": "北风问候你。规矩就一条:听不清,就再听一遍。",
- "book_0": "密码本,一页都不剩了。",
- "book_1": "密码本,只剩最后一页。",
- "book_2": "密码本,还剩两页。",
- "book_3": "密码本,还剩三页。",
- "cand_bay": "货船。",
- "cand_day": "客车。",
- "cand_hand": "今夜交接。",
- "cand_land": "地点变更。",
- "cand_ray": "巡逻艇。",
- "cand_sand": "明晨交接。",
- "cand_say": "约谈。",
- "cand_sly": "内部排查。",
- "cand_spy": "内线确认。",
- "cand_tap": "窃听令。",
- "cand_tip": "线人费。",
- "cand_top": "黑名单。",
- "cf_confirm": "就这个词?再单击,定下来。",
- "d9_caught_e": "信号被咬住了。别回头,走水路。快。",
- "d9_send": "北风,北风。处置令,今夜三时。撤。",
- "d9_send_e": "收到了。你的手法,我听了一整晚。快走。",
- "d9_sleep": "机关上了。雨声里,只剩挂钟。",
- "d9_sleepe": "天亮之前,还有两个钟头。守住。",
- "dv1_ask": "密码本第一页。三个词,哪个是它?",
- "dv1_right": "货船,译对了。药品,装在货船的底舱。",
- "dv1_teach": "电文进来了。先双击,把它重新听一遍。",
- "dv1_teach2": "左右滑,听密码本上的候选词。单击,选定一个。",
- "dv1_wrong": "不对。听清楚:B,一长,三短。",
- "dv2_ask": "密码本第二页。三个词,选一个。",
- "dv3_ask": "密码本第三页。三个词,选一个。",
- "dv4_ask": "密码本第四页。三个词,选一个。",
- "e1_a": "电波追不上我了。码头的灯,一盏一盏地灭。",
- "e1_b": "新的密码本,在城外渡口等我。黎明,比想象中安静。",
- "e2_a": "交了班,一切照旧。没人知道今晚频道里发生过什么。",
- "e2_b": "只是北风的呼叫,到天亮也没人接。下一次,我会接吗。",
- "e3_a": "我把警报拍了三遍。门开的时候,挂钟正好敲三点。",
- "e3_b": "审讯室的灯,也很亮。可码头那边,一个人都没少。",
- "e4_a": "两点五十九分,脚步停在门口。我把最后一页密码,塞进了炉子。",
- "e4_b": "耳机还挂着。里面有一封电文,永远译不完了。",
- "end_c1": "这是你在电波里挣下的第一个结局。",
- "end_c2": "这是你在电波里挣下的第二个结局。",
- "end_c3": "这是你在电波里挣下的第三个结局。",
- "end_c4": "四个结局,都收进你的密码本了。",
- "ep_hand_no": "交接:码头的灯,白亮了一夜。",
- "ep_hand_ok": "交接:胶卷上了船,手很稳。",
- "ep_lead": "天亮了。北风给你记了最后一笔账——今晚的事,都有了去向。",
- "ep_list_no": "名单:天亮时,多了一个红圈。",
- "ep_list_ok": "名单:码头连夜搬了家。卷宗里,少了一个人。",
- "ep_med_no": "药品:没人接住那三箱药。船,白白过了江。",
- "ep_med_ok": "药品:货船丑时靠岸,三箱药,一箱不少。",
- "ep_spy_no": "处置令:差的那三个字母,差了一整条命。",
- "ep_spy_ok": "处置令:你译对了它。北风,撤在你前头。",
- "exp_calm": "这一晚,还没人看你第二眼。",
- "exp_hot": "门外,好像有人换了岗。",
- "exp_low": "处长端着茶,多看了你一眼。",
- "exp_mid": "走廊里的脚步声,慢了下来。",
- "g9_in": "频道要收了。最后一件事,是你自己。",
- "g9_knot": "三年前,我译错了一封电。那之后,我再没见过我的上线。",
- "gd_again": "还在吗?单击继续。",
- "gd_brief": "单击继续值机。要选词时,向左或向右滑。",
- "gd_continue": "单击屏幕,继续。",
- "gd_invalid": "这个手势,值机室里用不上。",
- "gd_prog1": "光切词没有用。双击,先听电文。",
- "gd_prog2": "别急。停下来,把电文听完整。",
- "gd_tune1": "电文在等。左右滑,听候选词。",
- "gd_tune2": "双击,把电文再听一遍。再双击,会放慢。",
- "hint_t1": "我教你一页:第一个字母,是 B。一长,三短。",
- "hint_t2": "翻到这页:第二个字母,是 O。三长。",
- "hint_t3": "翻到这页:第一个字母,是 H。四短。",
- "hint_t4": "翻到这页:第二个字母,是 P。短,两长,短。",
- "m2_chief": "嗯,译得很全。去吧。",
- "m4_chief_a": "值机员,今晚的频道,很热闹啊。",
- "m4_chief_b": "你的耳朵最好。听见什么,记得……要报。",
- "m4_chief_c": "行。去睡吧,明天还有明天的事。",
- "n1": "零点半。挂钟走了半圈,雨没有停。",
- "n2": "一点整。处长的灯,还亮着。",
- "n3": "一点三刻。雨小了,频道里很静。",
- "p2": "药品船,丑时过江。向左滑,把船期报给北风。向右滑,压进值机日志。",
- "p4_blind": "一封通报。向左滑,压进抽屉,谁的耳朵也别装。向右滑,按流程呈报处长。",
- "p4_known": "名单上有码头。向左滑,暗号示警,让他连夜搬家。向右滑,按流程呈报处长。",
- "p6": "交接在你手里。向左滑,亲自去码头跑一趟。向右滑,留书暗号,托给下一班。",
- "p8_blind": "收台之前。向左滑,回一封例行电文,搅一搅水。向右滑,什么都不做。",
- "p8_known": "三点之前。向左滑,拍一封假电,说北风昨夜已撤。向右滑,手离开放键器,装傻。",
- "p9_blind": "北风在等答复。向左滑,开机,把今晚发出去。向右滑,例行收台。",
- "p9_known": "收网之前。向左滑,开机,发最后一电。向右滑,关机,装睡到天亮。",
- "prog_t1": "现在是今晚第一封电文。",
- "prog_t2": "现在是第二封,内部通报。",
- "prog_t3": "现在是第三封,交接电文。",
- "prog_t4": "第四封,最后一封。",
- "r1a_e": "收到。江上有人等你。第一封,做得稳。",
- "r1a_send": "北风,北风。货船,丑时过江,接住。",
- "r1b_e": "日志下面压着的,是三箱药。船,不会等你。",
- "r1b_hold": "先压一压。这一船的事,得看清楚再说。",
- "r2a_act": "有的字,不能落进卷宗。",
- "r2a_e": "这一页,从今天起,不存在了。",
- "r2b_act": "通报誊清,呈处长。",
- "r2b_e": "名单进了卷宗。码头,自己多保重。",
- "r3a_e": "值班室空了一刻钟。值机日志,停了一行。",
- "r3a_go": "口令我背得出。今夜,我亲自去。",
- "r3b_act": "暗号夹进交接簿,让雨替我跑这一趟。",
- "r3b_e_no": "交接的袋子,在码头放到了天亮。",
- "r3b_e_ok": "交接赶上了。袋子,连夜上了船。",
- "r4a_e": "假电出了门。对家的耳朵,听得出换人了吗。",
- "r4a_feed": "戴上手键。这一封,借快手七的手法。",
- "r4b_act": "手,离开放键器。我只是个值机的。",
- "r4b_e": "有时,什么都不做,就是做了。",
- "rev_hand": "今夜交接。丑时,老码头。",
- "rev_land": "地点变更。等下一封。",
- "rev_sand": "明晨交接。天亮再说。",
- "rev_say": "明早九时,约谈相关人员。",
- "rev_sly": "即日起,排查站内三人。",
- "rev_spy": "内线确认,今夜三时收网。代号,耳机。",
- "rev_tap": "窃听令。今夜,有人要装耳朵。",
- "rev_tip": "线人费。月底之前,有人要收钱。",
- "rev_top": "黑名单。头一个代号,叫码头。",
- "rx1_in": "第一封。江上船队的调度,拍得很稳。",
- "rx2_in": "第二封。手法很急,是内部通报。",
- "rx3_in": "第三封。很短,手法有点抖。",
- "rx4_in": "第四封。最后一个手法,你听过——快手七。",
- "sys_continue_ask": "检测到你的值机记录。单击继续上次,右滑开始新的夜班。",
- "sys_help": "单击选定,双击重新听电文。上滑听状态,下滑开菜单。选择时,左右滑。",
- "sys_menu": "菜单。单击切换选项,双击确认。",
- "sys_menu_book": "翻密码本,换一个字母。",
- "sys_menu_lobby": "保存并回大厅。",
- "sys_menu_restart": "重新开始今晚。",
- "sys_menu_resume": "回到电波里。",
- "sys_new_night": "新的夜班,开始了。",
- "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
- "sys_skip": "想跳过这句,单击就行。"
- },
- "detective": {
- "acc_ge": "我守了一夜门!温太太来借热水,她能作证!",
- "acc_shun": "我宿在城南刘掌柜家,他全家都能作证!",
- "acc_wen": "我这把年纪翻墙?先问问那墙答不答应!",
- "acc_zhou": "我十点就到家了!我家婆娘能作证!",
- "b_hint_c1": "试试指证:小顺说熄了灯,温太太说灯还亮着。",
- "b_hint_c2": "试试指证:小顺说铜秤卖了,现场铜秤还在。",
- "b_shun_1": "我走的时候,顺手熄了店堂的灯。",
- "b_shun_2": "钥匙,师父贴身带着,从不离身。",
- "b_shun_3": "那伤,八成是柴房劈柴砸的。铜秤早卖给收废品的了。",
- "b_shun_4": "库房的货,我一件都没碰过。",
- "b_shun_break_1": "匣子是我送的,可我半路折回来了……",
- "b_shun_break_2": "我把棉袄反穿,弓着背,葛大爷没认出我。",
- "b_shun_break_3": "库房的货,我拿过三件换了钱。他说要对账……秤砣下去的时候,他看着我。",
- "b_shun_react_1": "灯?我、我走的时候明明熄了……",
- "b_shun_react_2": "别问了……别问了……",
- "b_zhou_1": "我对完账就回家了,夜里雨大,路上没停。",
- "b_zhou_2": "钥匙?平时就挂在柴房铜钩上,十年了。",
- "b_zhou_3": "柴房我常去,没什么不对劲的。",
- "cf_confirm": "就这句?单击,定下来。",
- "cf_diff": "这两句,说的不是一件事。",
- "cf_hit": "对不上!矛盾成立,记入疑点。",
- "cf_pick_line": "左右滑,一句一句听。",
- "cf_same": "这两句说得一致,不矛盾。",
- "cf_second": "再选与它矛盾的那份证词。",
- "cf_self": "同一句证词,和自己比不出矛盾。",
- "cf_start": "指证矛盾。先选第一份证词。左右滑换,单击确认。",
- "fin_ask_motive": "第三问:动机是什么?",
- "fin_ask_weapon": "第二问:凶器是什么?",
- "fin_clear": "不在场证明成立。证据放人,回到证词板。",
- "fin_mv_right": "对。库里短的东西,就是引线。",
- "fin_mv_wrong": "不对。账上短的东西,才是引线。记下了。",
- "fin_pre": "证据在手,就此结案?单击,定下来;滑走,继续查。",
- "fin_right": "证据链闭合。周先生,你还有什么话说?",
- "fin_right_b": "证据链闭合。小顺,你还有什么话说?",
- "fin_start": "结案陈词。先指认真凶:四位证人,选一个。",
- "fin_who_confirm": "就指认这位?单击,定下来。",
- "fin_wp_right": "对。创口的铜屑,不见了的秤砣,都指向它。",
- "fin_wp_wrong": "不对。铜屑不答应。记下了。",
- "fo_1": "验尸报告,念给你听。",
- "fo_2": "死亡时间,昨夜十点到十点半。",
- "fo_3": "后脑单次钝器伤,一击毙命。创口嵌有铜屑,凶器是铜器。",
- "fo_4": "死者双手干净,没有搏斗痕迹。",
- "fo_5": "鞋底是干的。当夜,死者没出过后门。",
- "gd_board": "还在证词板。左右滑,换卷宗。",
- "gd_board_cf": "都听过了。按住屏幕,去指证。",
- "gd_cf": "还在选证词。左右滑,单击确认。",
- "gd_fin": "在想?左右滑选,单击定。",
- "gd_invalid": "这个操作,这里用不上。",
- "hint_a": "探长,还没听的卷宗,先过一遍耳朵。",
- "hint_b": "探长,证词里有对不上的地方,逐句比对。",
- "hint_c1": "试试指证:周先生说熄了灯,温太太说灯还亮着。",
- "hint_c2": "试试指证:周先生说铜秤卖了,现场铜秤还在。",
- "hint_fin": "疑点齐了。去结案陈词。",
- "intro_1": "雨下了一整夜。清晨,聚宝斋后院,古董商沈万川死了。",
- "intro_2": "你是专案组探长。这桩案子,归你。",
- "intro_3": "卷宗六份:四位证人的证词,现场勘验,法医报告。",
- "intro_w3": "周先生,管了十年的账,见人三分笑。",
- "item_case": "结案陈词。",
- "item_fore": "法医报告。",
- "item_scene": "现场勘验。",
- "item_w1": "门卫老葛的证词。",
- "item_w2": "学徒小顺的证词。",
- "item_w3": "账房周先生的证词。",
- "item_w4": "房东温太太的证词。",
- "item_who_w1": "门卫老葛。",
- "item_who_w2": "学徒小顺。",
- "item_who_w3": "账房周先生。",
- "item_who_w4": "房东温太太。",
- "mv_1": "监守自盗。",
- "mv_2": "寻仇泄愤。",
- "mv_3": "劫财入户。",
- "rate_a": "干净利落的结案。",
- "rate_b": "案子结了,卷宗上有疏漏。",
- "rate_c": "案子是结了,卷宗上补丁不少。",
- "rate_s": "教科书结案。四处疑点,一击即中。",
- "recap_cf": "卷宗都在耳朵里了。挑一句你不信的,按住指证。",
- "recap_go": "接着查。",
- "sc_0": "你打伞进了后院。雨水顺着瓦檐,淌成一道帘子。",
- "sc_1": "柴房门口,沈万川面朝下倒着。后脑一处伤,现场没有凶器。",
- "sc_2": "后门门闩完好,是死者自己开的门。生人叫不开这扇门。",
- "sc_3": "泥地上只有进来的脚印,没有出去的。墙根的花盆,翻了一个。",
- "sc_4": "库房铜秤立在架上,秤砣不见了。",
- "sc_5": "柴房墙上,挂钥匙的铜钩,空着。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "settle_hook": "同一场雨里,还有别的案子。单击,接新案。",
- "settle_open": "案件归档。雨,停了。",
- "st_asked_0": "六份卷宗,一份都没听。",
- "st_asked_1": "已听一份,还有五份。",
- "st_asked_2": "已听两份,还有四份。",
- "st_asked_3": "已听三份,还有三份。",
- "st_asked_4": "已听四份,还有两份。",
- "st_asked_5": "已听五份,还有一份。",
- "st_asked_6": "六份都听完了。",
- "st_doubt_0": "疑点,还没有。",
- "st_doubt_1": "疑点,一处。",
- "st_doubt_2": "疑点,两处。",
- "st_doubt_3": "疑点,三处。",
- "st_doubt_4": "疑点,四处,齐了。",
- "st_miss_0": "指证,一次没错。",
- "st_miss_1": "指证,错过一两回。",
- "st_miss_2": "指证,错了不少。",
- "st_wrong": "错指一回,记档。",
- "sys_continue_ask": "检测到未结的案子。单击继续,右滑换一桩新案。",
- "sys_help": "左右滑换卷宗,单击听取,双击重新听。长按指证,上滑状态,下滑菜单。",
- "sys_menu": "菜单。单击切换,双击确认。",
- "sys_menu_cf": "去指证。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_restart": "重新查这桩案子。",
- "sys_menu_resume": "回到证词板。",
- "sys_menu_save": "保存并回大厅。",
- "sys_new_case": "新案开卷。",
- "sys_saved": "进度已保存。",
- "tut_cf_ok": "指证就是这样。练习不算数,真矛盾要靠耳朵找。",
- "tut_cf_try": "练习一次。选一份证词,单击确认;再选一份,任意一句。",
- "tut_confront": "按住屏幕,进入指证。去找两句对不上的证词。",
- "tut_d0": "先熟悉证词板。左右滑,换卷宗。",
- "tut_done": "教学完了。开始查案。",
- "tut_listen": "单击,听取当前卷宗。",
- "tut_replay": "双击,重新听这一句。",
- "tut_skip": "已跳过教学。左右滑换卷宗,单击听取;按住屏幕,指证矛盾。",
- "tut_status": "上滑,随时听进度:问了几份,疑点几处。",
- "w1_1": "昨儿夜里雨大,我守着街门,一步没敢挪窝。",
- "w1_2": "九点四十,雨点子刚砸下来,小顺打着伞出的街门。",
- "w1_3": "十点一刻,一位先生收着黑伞进了后巷。个儿高,微驼背。",
- "w1_4": "九点五十,周账房出的街门,跟我说了声,回家。",
- "w1_5": "后半夜,温太太还来门房借过一回热水。",
- "w1_6": "听说店里账上短了银子,沈老板撂了话,月底清账。",
- "w2_1": "夜里,师父打发我去城南,给刘掌柜送匣子。",
- "w2_2": "雨太大,刘掌柜留我住的,今早才回店。",
- "w2_3": "库房钥匙?师父嫌沉,平日就挂在柴房墙上的铜钩。",
- "w2_4": "师父的账,向来只信周先生一个人。",
- "w2_5": "后门那闩,生人叫不开。熟人来了,师父才亲自去开。",
- "w2_6": "周先生常念叨,账房的活,越到夜里越清静。",
- "wen_1": "雨是九点四十下的。我正收晾的衣裳,记得真真的。",
- "wen_2": "十点二十,我出门倒垃圾。聚宝斋店堂的灯,亮着呢。",
- "wen_3": "刚回屋,柴房后墙咯噔一响,有人爬墙!花盆翻了一个。",
- "wen_4": "吓得我蒙头半宿没睡着,天亮才敢吱声。",
- "wen_5": "店里短银子的事,街坊都有耳闻。上礼拜他还摔了账本。",
- "wen_6": "周账房那人,见人三分笑,账算得比谁都精。",
- "wp_1": "松木劈柴。",
- "wp_2": "铜秤砣。",
- "wp_3": "铁门闩。",
- "wp_4": "青瓷花盆。",
- "z_1": "我七点进店上夜账。九点五十对完,锁了前门回家。",
- "z_2": "临走,我顺手熄了店堂的灯。那会儿,店里就剩老板。",
- "z_3": "库房钥匙?沈老板贴身带着,从不离身。",
- "z_4": "那伤,是松木劈柴砸的。铜秤?上个月卖给收废品的了。",
- "z_5": "我到家倒头就睡,夜里的事,一概不知。",
- "z_6": "你们要是不信,去问我家婆娘。",
- "z_break_1": "别念了……我说。库房短的三件货,是我抵了赌债。",
- "z_break_2": "他说月底清账,要报官。我求他,他不肯。",
- "z_break_3": "我只想把钥匙放回去,把被盗做真。抡起秤砣的时候,他认出了我。",
- "z_react_1": "灯?……许是我记岔了。人上了岁数,记性不济。",
- "z_react_2": "钥匙的事……他、他有时候,也贴身带着的……",
- "z_react_3": "秤!秤的事,你们别再问了……",
- "z_react_4": "……随你们怎么问。我要回去了。",
- "z_react_w": "铜器?……我那是顺口猜的。凶器的事,我怎么会知道。"
- },
- "dungeon": {
- "btl_bat": "盲眼蝠扑了过来!",
- "btl_behind": "它在你背后,转身再挡。",
- "btl_crab": "窟主石甲蟹,就在你面前。",
- "btl_crawler": "绕行者贴上来了,小心背后!",
- "btl_flee": "你甩掉了它,被抓了一下。",
- "btl_flee_boss": "退路塌了,跑不掉!",
- "btl_guard": "石像卫醒了!",
- "btl_half_crab": "石甲蟹的甲裂了!",
- "btl_half_king": "王怒了,脚步更重了!",
- "btl_half_leech": "腐沼蟒暴怒了!",
- "btl_kill": "它倒下了。",
- "btl_king": "窟中之王,就在深处。",
- "btl_leech": "窟主腐沼蟒,挡住了楼梯。",
- "btl_loot_1": "战利不多。",
- "btl_loot_2": "小有收获。",
- "btl_loot_3": "大有收获。",
- "btl_lvup": "你的拳脚更利落了。",
- "btl_mush": "蘑菇怪拦住了你!",
- "btl_no_turn": "它贴着你不放,不用转身。",
- "btl_parried": "挡下了大半!",
- "btl_rat": "窟鼠窜了出来!",
- "btl_spider": "洞蛛落地了!",
- "btl_swish": "挥空了,它不在你面前。",
- "die_adv_1": "下次,前摇声响时就双击。",
- "die_adv_2": "打不过,就按住屏幕逃跑。",
- "die_adv_3": "身后有动静,先转身。",
- "die_cause_1": "你被小怪拖垮了。",
- "die_cause_2": "你没挡住那记重击。",
- "die_cause_3": "你背后的偷袭,要了命。",
- "die_intro": "你倒下了。",
- "evt_armor": "换上更硬的护甲,更抗打了。",
- "evt_coin_1": "捡到几枚金币。",
- "evt_coin_2": "捡到一小把金币。",
- "evt_coin_3": "捡到一大袋金币。",
- "evt_descend": "你顺着楼梯,往下潜。",
- "evt_potion": "一瓶药水,收进腰带。",
- "evt_potion_full": "腰带满了,药水留在原地。",
- "evt_stairs_lock": "楼梯被大东西堵住了,先赢它。",
- "evt_weapon": "捡到更快的短刃,出手更狠了。",
- "gd_invalid": "这个操作在这里用不上。",
- "gd_pulse": "单击脉冲,听听四周。",
- "gd_turn": "轮到你了。单击挥击。",
- "gold_some": "带回来一点,不多。",
- "help_battle": "敌人前摇声响时双击格挡,单击挥击。打不过就按住屏幕逃跑。",
- "help_explore": "单击脉冲,按住前进,左右滑转身。双击再听,上滑状态,下滑菜单。",
- "intro_1": "你在黑暗中醒来。这里是回声地窟。",
- "intro_2": "伸手不见五指,声音就是你的眼睛。",
- "meta_gold_1": "这趟没带回什么。",
- "meta_gold_2": "这趟带回一些金币。",
- "meta_gold_3": "这趟满载而归。",
- "nav_done": "到了,就是这里。",
- "nav_e": "往东。",
- "nav_n": "往北。",
- "nav_s": "往南。",
- "nav_w": "往西。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "settle_again": "单击,再探一次。",
- "settle_stronger": "下个周目,你会更强。",
- "settle_win_1": "你捧起了地窟之心,通关了!",
- "settle_win_2": "黑暗的尽头,是光。",
- "st_best_1": "你还没到过第三层。",
- "st_best_2": "你最远到过中层。",
- "st_best_3": "你到过最深层。",
- "st_face_e": "你面朝东。",
- "st_face_n": "你面朝北。",
- "st_face_s": "你面朝南。",
- "st_face_w": "你面朝西。",
- "st_floor_1": "这是第一层。",
- "st_floor_2": "这是第二层。",
- "st_floor_3": "这是第三层。",
- "st_floor_4": "这是第四层。",
- "st_floor_5": "这是第五层。",
- "st_floor_6": "这是第六层。",
- "st_floor_7": "这是第七层。",
- "st_gold_1": "口袋空空。",
- "st_gold_2": "有些积蓄。",
- "st_gold_3": "收获可观。",
- "st_gold_4": "腰包鼓鼓。",
- "st_hp_1": "你毫发无损。",
- "st_hp_2": "你受了点伤。",
- "st_hp_3": "你伤势不轻。",
- "st_hp_4": "你命悬一线。",
- "st_threat_both": "两边都有动静。",
- "st_threat_left": "左边有脚步声。",
- "st_threat_none": "附近很安静。",
- "st_threat_right": "右边有脚步声。",
- "stair_dir_e": "楼梯在东边。",
- "stair_dir_n": "楼梯在北边。",
- "stair_dir_s": "楼梯在南边。",
- "stair_dir_w": "楼梯在西边。",
- "stair_hint_a": "找找铁器的回声,那是楼梯。",
- "stair_hint_b": "楼梯有大东西守着,先赢它。",
- "sys_continue_ask": "检测到探窟记录。单击继续,右滑重新开始。",
- "sys_menu": "菜单。单击切换,双击确认。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_restart": "重新开始本周目。",
- "sys_menu_resume": "返回探索。",
- "sys_menu_save": "保存并回大厅。",
- "sys_new_run": "新的探窟,开始了。",
- "sys_saved": "进度已保存。",
- "tut_attack": "现在单击,挥拳打它。",
- "tut_d0": "先学会用耳朵看。单击,发出声波脉冲。",
- "tut_done": "教学完了。地窟很深,小心走。",
- "tut_echo_come": "听,回声回来了。",
- "tut_flee_hold": "想逃跑,按住别松手。",
- "tut_front_rule": "回声回来越快,墙就越近。",
- "tut_kill": "打中了,就是这样。",
- "tut_menu": "下滑,打开菜单。",
- "tut_mob": "前面有东西!放心,它伤不到你。",
- "tut_parry": "听到它的动静,双击格挡。",
- "tut_parry_miss": "没挡住也别怕,它伤不到你。",
- "tut_parry_ok": "挡住了!",
- "tut_replay": "双击,再发一次脉冲,不要钱。",
- "tut_side_rule": "两侧的回声,发闷是墙,空旷是通路。",
- "tut_skip": "已跳过教学。单击脉冲,先听听四周。",
- "tut_stairs": "铁器的回声,就是下潜的楼梯。",
- "tut_stairs_on": "楼梯就在脚下。单击,下潜。",
- "tut_status": "上滑,随时听自己的状态。",
- "tut_turn": "左滑右滑,可以转身。",
- "tut_walk": "按住屏幕不放,你就往前走。",
- "unlock_blade": "解锁武器,开局带着短刃。",
- "unlock_echo": "解锁回声强化,侧向听得更远。",
- "unlock_lead": "攒够了新的遗产。",
- "unlock_none": "金币还不够,继续攒。",
- "unlock_potion": "解锁行囊药,开局自带一瓶。",
- "unlock_veil": "解锁护符,每层头一下减半。",
- "unlock_vigor": "解锁体魄,起始更强壮。"
- },
- "escape": {
- "again": "单击屏幕,再来一次。下滑,打开菜单。",
- "box_fixed": "电箱运转正常,电流的嗡鸣声平稳而持续。",
- "empty_1": "房间里空空荡荡,只有你自己的回声。",
- "empty_2": "你伸出手,摸到的只有冰冷粗糙的墙壁。",
- "empty_3": "除了远处的水滴声,这里什么都没有。",
- "escape": "你扳动开关。电机轰鸣,沉重的铁门缓缓升起,刺眼的光线涌了进来。你眯起眼睛,向前迈出了第一步。自由了。你逃出来了。",
- "fix_box": "你把保险丝用力按进卡座。火花一闪,嗡鸣声响起——头顶的线路恢复供电了!",
- "found_key": "你蹲下身在储物架的角落里摸索,指尖碰到一个冰凉的金属物件——是一把钥匙!钥匙到手了。",
- "g0_intro": "黑暗。你在废弃的地下设施里醒来,什么都想不起来。你必须找到出路。",
- "g1_done": "很好,你迈出了第一步。",
- "g1_move": "先活动一下。朝任意方向滑一下,走一小步。",
- "g2_wall": "这个房间不大,四面都是墙。再滑两下,试试碰碰墙。",
- "g3_left": "跟着我指的路走。向左滑。",
- "g4_down": "对。再向下滑。",
- "g5_inspect": "听到水声了吗?单击一下,仔细检查这个房间。",
- "g5_key": "你摸到了一把钥匙!",
- "g6_done": "对,就是这样。接下来,靠你自己了。",
- "g6_doubletap": "钥匙能开锁。双击,是把物品用出去的用法。现在,双击试试。",
- "g7_goal": "找到能用这把钥匙打开的东西。需要帮助时,在原地双击。",
- "gd_next_fuse": "保险丝到手。接下来,去找电箱。",
- "gd_room_d": "下面的房间。",
- "gd_room_l": "左面的房间。",
- "gd_room_r": "右面的房间。",
- "gd_room_u": "上面的房间。",
- "guide_blunt_down": "手指贴着屏幕,向下推一下。",
- "guide_blunt_left": "手指贴着屏幕,向左推一下。",
- "guide_blunt_right": "手指贴着屏幕,向右推一下。",
- "guide_blunt_up": "手指贴着屏幕,向上推一下。",
- "guide_offpath": "先跟我走。",
- "guide_skip": "跳过引导,直接开始自由探索。",
- "guide_wrong_down": "不是这个方向。向下滑。",
- "guide_wrong_gesture": "不是这个操作。照我说的做。",
- "guide_wrong_left": "不是这个方向。向左滑。",
- "guide_wrong_right": "不是这个方向。向右滑。",
- "guide_wrong_up": "不是这个方向。向上滑。",
- "help_ops": "滑动,在房间之间移动。单击,检查房间,或者重听房间的声音。双击,使用物品,或者查看背包。",
- "inspect_box_dead": "墙上是一只电箱,箱盖敞开着,里面的保险丝座空空如也。没有电,这里的大门永远打不开。",
- "inspect_cabinet_locked": "这个房间里立着一个铁柜,柜门上挂着一把锁。也许,有什么钥匙能打开它。",
- "inspect_gate": "面前是一扇沉重的铁门。门边的电子锁一片漆黑,没有任何反应。它需要电力。",
- "inspect_gate_ready": "电子锁的指示灯亮了,发出微弱的绿光。大门已经通电。双击,打开它,离开这里。",
- "inv_both": "你身上带着一把钥匙和一枚保险丝。",
- "inv_empty": "你摸了摸身上,什么也没有。",
- "inv_fuse": "你身上带着一枚保险丝。",
- "inv_key": "你身上带着一把钥匙。",
- "menu_back": "返回游戏。",
- "menu_home": "回大厅。",
- "menu_open": "菜单。",
- "menu_restart": "重新开始。",
- "nav_down": "向下滑。",
- "nav_left": "向左滑。",
- "nav_right": "向右滑。",
- "nav_up": "向上滑。",
- "reopen_prompt": "上滑,重新听一遍引导。单击,直接开始。",
- "replay": "黑暗再次合拢。你回到了中央的房间。这一次,你会更快。",
- "room_cabinet": "这个房间里,立着一个铁柜。",
- "room_gate": "面前,是一扇沉重的铁门。",
- "room_power": "这个房间的墙上,有一只电箱。",
- "room_storage": "一间储物间。货架上堆满杂物,角落里传来水滴声。",
- "skip_hint": "单击可跳过旁白。",
- "start_room": "你站在设施中央的房间里。滑动移动,单击检查,双击使用物品。",
- "stuck_ask": "需要帮助吗?",
- "stuck_box_1": "保险丝属于电箱。有电流声的地方,就有电箱。",
- "stuck_box_2": "去西北角的电箱房,双击,把保险丝装进电箱。",
- "stuck_box_3": "跟我说的方向走,去电箱所在的房间。",
- "stuck_cabinet_1": "钥匙就在你身上。它能打开某一把锁。",
- "stuck_cabinet_2": "去东边的铁柜房,双击,用钥匙打开铁柜。",
- "stuck_cabinet_3": "跟我说的方向走,去铁柜所在的房间。",
- "stuck_gate_1": "电已经通了。该去找那扇铁门了。",
- "stuck_gate_2": "去东南角的大门,双击,打开它,离开这里。",
- "stuck_gate_3": "跟我说的方向走,去大门所在的房间。",
- "stuck_key_1": "铁锈味最重的地方,值得仔细看看。",
- "stuck_key_2": "去西南角的储物间,单击检查,找到钥匙。",
- "stuck_key_3": "跟我说的方向走,去西南角的储物间。",
- "time_band1": "你逃出来了,用时不到两分钟。了不起!",
- "time_band2": "你逃出来了,用时不到五分钟。",
- "time_band3": "你逃出来了,用时不到十分钟。",
- "time_band4": "你逃出来了,用时超过十分钟。",
- "unlock_cabinet": "钥匙插进锁孔,缓缓转动。咔哒一声,柜门开了。柜子深处,躺着一枚保险丝。保险丝到手了。",
- "use_fail": "这里没有用得上东西的地方。换个房间试试,或者先单击检查一下周围。",
- "wall": "那边是墙,换个方向。"
- },
- "hunt": {
- "breach": "有野兽冲进营地了!",
- "breach_heavy": "巨兽撞进营地,损伤很重!",
- "danger_low": "营地危险了,一只都不能再漏!",
- "end_again": "单击,再猎一局。",
- "end_lose": "营地守不住了,撤退!",
- "end_rank": "成绩已记入猎手榜。",
- "end_win": "天亮了,营地还在。",
- "gd_idle": "听声音的方向,滑过去。",
- "gd_invalid": "这个操作现在用不上。",
- "grade_a": "评级,A。漂亮。",
- "grade_b": "评级,B。守得还行。",
- "grade_c": "评级,C。险胜。",
- "grade_s": "评级,S!完美的围猎。",
- "help_main": "朝声音的方向滑,就是出击。单击呼喊支援,双击旋风斩。上滑状态,下滑菜单。",
- "hp_band1": "营地固若金汤。",
- "hp_band2": "营地受了些损伤。",
- "hp_band3": "营地损毁过半。",
- "hp_band4": "营地快守不住了。",
- "intro_1": "夜幕降临,野兽在山林里游荡。",
- "intro_2": "你们是守夜的猎人,营地就在身后。",
- "kill_band0": "你还没开张。",
- "kill_band1": "你小有斩获。",
- "kill_band2": "你战果累累。",
- "net_back": "联系恢复了,接着打。",
- "net_gone": "回不去那场围猎了,回大厅。",
- "net_lost": "与营地断了联系,正在重连。",
- "net_to_bot": "有猎人离队,老猎手顶上。",
- "npc_yan_breach": "漏了一个,都小心。",
- "npc_yan_cover": "这边交给我。",
- "npc_yan_greet": "我来了,这边有我。",
- "npc_yan_help_ack": "撑住,我来了。",
- "npc_yan_help_call": "我这侧吃紧,来个人搭把手!",
- "npc_yan_kill": "拿下!",
- "npc_yan_skill": "都闪开,看我的!",
- "npc_yan_wave": "新一波,稳住。",
- "npc_zheng_breach": "哎呀,漏了一个!",
- "npc_zheng_cover": "这边我罩着。",
- "npc_zheng_greet": "小筝到位,开工啦。",
- "npc_zheng_help_ack": "别慌,我来了!",
- "npc_zheng_help_call": "这边太多了,谁来帮一下!",
- "npc_zheng_kill": "搞定!",
- "npc_zheng_skill": "看我清场!",
- "npc_zheng_wave": "又来一波,打起精神。",
- "npc_zhou_breach": "啧,溜进去一只。",
- "npc_zhou_cover": "这边交给我吧。",
- "npc_zhou_greet": "老周我守着,放心。",
- "npc_zhou_help_ack": "听见了,这就到。",
- "npc_zhou_help_call": "我这边压不住了,来人。",
- "npc_zhou_kill": "嗯,解决了。",
- "npc_zhou_skill": "让让,老骨头活动活动。",
- "npc_zhou_wave": "听,又来了。",
- "room_start": "狩猎开始,先听声音的方向。",
- "room_wait": "房间已开好,等同伴到齐。单击,立即开局。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "skill_ready": "旋风斩准备好了。",
- "st_wave_a": "还在头几波。",
- "st_wave_b": "打到中段了。",
- "st_wave_c": "最后一波了。",
- "sys_menu": "菜单。单击切换,双击确认。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_home": "退出房间,回大厅。",
- "sys_menu_resume": "回到猎场。",
- "team_3": "三名猎人在守。",
- "team_4": "四名猎人全在。",
- "threat_few": "有野兽贴近了,听方向出手。",
- "threat_many": "四周全是动静,快出手!",
- "threat_none": "近处暂时没有野兽。",
- "tut_attack": "听,有狼在靠近。朝声音的方向,滑一下。",
- "tut_breach": "野兽冲进营地,营地就会受损。撑过五波就赢。",
- "tut_callout": "单击一下,呼喊支援,队友会来帮你。",
- "tut_callout_ok": "听到没,同伴回应你了。",
- "tut_done": "教学完了。真正的围猎,现在开始。",
- "tut_kill_ok": "好,杀掉了。就是这样。",
- "tut_rule": "野兽会从八个方向围上来。声音在哪边,就往哪边滑。",
- "tut_skill": "双击,旋风斩,清掉身边一圈。",
- "tut_skill_cd": "旋风斩有八秒冷却。冷却中双击,重新听威胁。",
- "tut_skip": "已跳过教学,开打。",
- "tut_status": "上滑,听营地状态。下滑,打开菜单。",
- "wave_band1": "第一波来了,别慌。",
- "wave_band2": "第二波,比刚才多。",
- "wave_band3": "第三波,有大家伙混在里面。",
- "wave_band4": "第四波,更快,更多。",
- "wave_band5": "最后一波,全来了!",
- "wave_clear": "这一波,守住了。"
- },
- "keeper": {
- "amo_a": "……有人吗……顺发号……船进水了……",
- "amo_b": "白角塔!是你吗?求你,回个话!",
- "amo_c": "我爷爷,四十年前也是在这片海没的。他说,白角的灯灭过一下。",
- "amo_d": "塔……听得到吗?水,到膝盖了。",
- "amo_e": "守塔人……塔里就你一个人?家里人不拦着你干这行?",
- "amo_f": "裂了!水进得更快了。塔,告诉我怎么办!",
- "amo_g": "……我爷爷,就在那七个人里。难怪他到死,都念着白角的灯。",
- "amo_h": "风太大……嗯。那晚的风,一定很大。",
- "b_goal": "今夜两艘货轮过境。守住灯,也守住频道。",
- "b_open": "白角灯塔,风暴夜。我是今晚的守塔人。",
- "b_rain": "浪拍到第七级台阶。雾角两长一短——塔在,我也在。",
- "b_rule": "岸台的规矩就一条:风暴夜,灯不能灭。",
- "c1_ask": "顺发号,报你的方位,报进水的速度。",
- "c1_aske": "他更慌了。人没接住,数字也乱。",
- "c1_asko": "方位……仪表进水了,我,我看不清……",
- "c1_diary": "暗格里是祖父的日志。缺了最后一页。",
- "c1_focus": "先守住这盏灯。旧账,天亮再算。",
- "c1_focuse": "灯转得稳。可那句「灭过一下」,留在了你耳朵里。",
- "c1_hold": "别慌。我在白角,哪儿也不去。慢慢说。",
- "c1_holde": "他喘匀了。先接人,再办事。",
- "c1_holdo": "……好,好。你在。我听见了。",
- "c1_open": "父亲的钥匙,就在抽屉里。灯座第三级,开了。",
- "c1_tune": "频道里有动静。很轻,像隔着整片海。",
- "c2_back": "频道又响了。顺发号的引擎,时断时续。",
- "c2_crack": "听!他那边,船板裂了!",
- "c2_key": "父亲桌上那支手电,尾盖里卷着一页纸。",
- "c2_shore": "岸台,记下他的船位。请渔政天亮前到。",
- "c2_shoreo": "船位落在图上了。渔政的船,最快也要天亮。",
- "c2_song": "跟我念:浪头过,船头抬。浪头退,船头落。",
- "c2_songo": "浪头过,船头抬……真的稳了些!这口诀,谁教你的?",
- "c3_dark": "你离塔的时候,发条走到了头。灯,灭过一刻钟。过境的货轮,平安。",
- "c3_eye": "风眼过了。最后的浪墙,就跟在后面。",
- "c3_page": "手电的尾盖旋开了。那页纸,在灯下摊平。",
- "c3_wall": "浪墙起来了!就是现在!",
- "c4_pass": "家里人?都在大陆。这行当,习惯了。",
- "c4_passo": "哦……你也是一个人守夜。我们俩,隔着一道海。",
- "c4_true": "我父亲也是守塔人。十二年前风暴夜,他出海救人,没有回来。",
- "c4_trueo": "……对不起。难怪今晚,你一直都在。",
- "c5_patch": "拿堵漏垫顶住裂缝。人守在电台边,我一直在。",
- "c5_patcho": "顶住了!水慢下来了。我不走,守着电台。",
- "c5_suit": "穿上救生衣,带上信号灯,站到甲板上去。",
- "c5_suito": "穿好了。要是船散了,我就抱着它漂。",
- "c6_reade": "四十年,两代人,一条规矩。今晚,轮到你选了。",
- "c6_shut": "合上。守塔人的事,守塔人自己扛。",
- "c7_go": "机械上满发条,灯能自己转到天亮。等着我。",
- "c7_go2": "发条……我只上了半卷。快去,快回。",
- "c7_hold": "顺发号,听我的。灯照着的那条道,跟我念,一步一步来。",
- "c8_math": "坐标向东两百米。灯光扫过去,看见救生衣了!",
- "c8_matho": "塔!你的灯扫到我啦!我在这边!",
- "c8_new": "数三个浪头,借着风的角度,钻新缝!",
- "c8_newo": "一个,两个,三——过去了!塔,我过来了!",
- "c8_old": "走老航道。多绕半里,绕开所有的暗礁。",
- "c8_oldo": "老航道……我爷爷念叨过这条道!稳了!",
- "c8_song": "他爷爷传下的渔歌……在哪?再唱一遍!",
- "c8_songo": "海风那个吹呀——塔!是你吗?我在这儿!",
- "c9_found": "他在半路改了主意。天亮时,渔队找到了他。活着,湿透了。",
- "c9_land": "顺发号过了礁缝,搁上背风湾的滩。人,站上了岸。",
- "c9_return": "接驳艇回来了。两个人,一身水,一盏灯。",
- "d9_keep": "那晚风太大,灯出了点故障。别再问了,孩子,回家吧。",
- "d9_keepe": "这个话题,沉回了海里。天,亮了。",
- "d9_tell_a": "四十年前守塔的,是我爷爷。他离灯去救自己的儿子。灯灭那刻,回澜号……对不住。",
- "d9_tell_b": "我只知道,那晚守塔的是我爷爷,灯灭过一下。剩下的,我也不敢说全。",
- "d9_telle": "他听完,沉默了很久。天,亮了。",
- "e1_a": "天亮了。他在门厅睡熟,那页纸攥在手里。灯,亮到了最后一刻。",
- "e1_b": "回澜号的账,翻开了第一页。这座塔,等了四十年。",
- "e2_a": "他走的时候,天刚亮。我送到码头,什么也没说。",
- "e2_b": "缺页放回灯底。有些东西,再压一代人。灯,还转着。",
- "e3_a": "我把知道的,都说了。他望着海,半信半疑地点头。",
- "e3_b": "碎片也是真话。剩下的,让海自己讲吧。",
- "e4_a": "天亮,各自归位。他回他的港,我守我的灯。",
- "e4_b": "隔着一道海,两座塔,谁也没再提那晚。",
- "ep_amo_dawn": "阿澈:抱着冷藏柜漂到天亮。打那以后,出海带两台电台。",
- "ep_amo_home": "阿澈:那晚之后改跑日班。他说,夜里的海,有守塔人听着。",
- "ep_amo_solo": "阿澈:自己把船开上了背风湾。船主骂了船,没骂人。",
- "ep_dad": "值班表上,你替十二年前那个班次签了字。老陈,收工了。",
- "ep_lamp_dark": "灯塔记录簿:凌晨两点,灯灭一刻钟。那一行,你写得格外用力。",
- "ep_lamp_full": "灯塔记录簿:你离塔三刻,灯自己转着。父亲的发条,说中了。",
- "ep_lamp_hold": "灯塔记录簿:转灯整夜未停。你一步,也没离开过它。",
- "ep_lead": "风停了。岸台给你记一笔——这一晚,后来怎样了。",
- "ep_log_kept": "灯下的旧账,又压回了黑暗里。",
- "ep_log_told": "灯下的旧账,今夜见了光。",
- "ep_shore": "岸台晨报:风暴过境,航道平安。白角灯,正常。",
- "g9_in": "风,一层一层退下去。天边,有点灰了。",
- "g9_knot": "十二年了。这一晚,我总算替父亲,站完了他的班。",
- "gd_again": "还在吗?单击继续。",
- "gd_brief": "单击,继续值守。要选择时,向左或向右滑。",
- "gd_continue": "单击屏幕,继续。",
- "gd_invalid": "这个手势,塔里用不上。",
- "gd_prog1": "滑动这里用不上。想想岸台刚说的话。",
- "gd_prog2": "别乱。停一停,再听一遍。",
- "lull_1": "岸台通报:风加到十级。第一程,过去了。",
- "lull_2": "风眼凌晨过境。第二程,到顶了。",
- "m6_seal": "那些旧东西,你今晚没碰过。缺页的事,你一无所知。",
- "p1": "他的声音在抖。向左滑,先接住这个人。向右滑,先要他的船位。",
- "p2": "他提到四十年前。向左滑,去翻灯座下的暗格。向右滑,先专心守灯。",
- "p3": "他快撑不住了。向左滑,用守塔人的口诀带他稳船。向右滑,把船位报给岸台。",
- "p4": "他问起你的人。向左滑,告诉他真话。向右滑,轻轻带过。",
- "p5": "船在漏。向左滑,让他回舱堵漏,守住电台。向右滑,让他穿救生衣,上甲板。",
- "p6": "祖父的最后一页。向左滑,今晚就读完它。向右滑,合上,塞回灯底。",
- "p7": "浪墙压过来了。向左滑,给灯上满发条,驾接驳艇去接他。向右滑,守着灯,用声音引他过礁。",
- "p8_boat": "海上没有灯。向左滑,循着他哼的渔歌找他。向右滑,按推算的坐标,直线搜。",
- "p8_reef": "礁缝两道口。向左滑,走老航道,稳但绕远。向右滑,钻新缝,近但冒险。",
- "p9a": "他问起四十年前的灯。向左滑,把缺页的事,连根说给他。向右滑,就说,那晚风太大。",
- "p9b": "他问起四十年前的灯。你知道的,只有碎片。向左滑,把碎片给他。向右滑,说风太大。",
- "prog_m1": "风暴起来了。今晚第一程。",
- "prog_m2": "风暴到顶。第二程。",
- "prog_m3": "风在退。最后一程。",
- "prog_mem_f": "这是回忆:父亲的最后一晚,十二年前。",
- "prog_mem_g": "这是回忆:祖父的年代,四十年前。",
- "rev_c1": "唱针落下。缺的那一页,自己开了口。",
- "rev_c2": "我写下这些,等一个敢看的人。那晚,我的儿子,偷了接驳艇。",
- "rev_c3": "我去追他。灯,离了人。半个时辰,回澜号,七个人。",
- "rev_c4": "儿子回来了。这页我撕下来,压进灯底。守塔人,不能离灯。",
- "rev_c5": "风声回来了。原来那道家规,是这么来的。",
- "rev_f1": "唱针又落下了。十二年前,也是这样的风。",
- "rev_f2": "白角塔,我是老陈。接驳艇上两个人,都活着。",
- "rev_f3": "守塔人听见了求救,就不能装没听见。等我回来。",
- "rev_f4": "塔上的机械上满发条,能自己转一夜。给我留着门。",
- "rev_f5": "风声回来了。那扇门,留到今天。",
- "rev_g1": "唱针落下。四十年前,也是这盏灯下。",
- "rev_g2": "手稳住。灯罩擦到第三遍,才算干净。",
- "rev_g3": "记住,灯下压着的东西,比灯重。守塔人,替它守一辈子。",
- "rev_g4": "风声回来了。爷爷,我听见了。",
- "rev_teach": "听到唱针落下、风声退后,是回忆。风声回来,就是现在。",
- "sys_continue_ask": "检测到你的值守记录。单击继续上次,右滑开始新的风暴夜。",
- "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。选择时,左右滑。",
- "sys_menu": "菜单。单击切换选项,双击确认。",
- "sys_menu_lobby": "保存并回大厅。",
- "sys_menu_restart": "重新开始今夜。",
- "sys_menu_resume": "回到值守。",
- "sys_new_night": "新的风暴夜,开始了。",
- "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
- "sys_skip": "想跳过这句,单击就行。",
- "tr_deep": "他把命,交给了你的声音。",
- "tr_half": "他信一半,疑一半。",
- "tr_thin": "今晚,他只信自己的手。",
- "tru_full": "三代人的账,今夜见底了。",
- "tru_one": "灯下的旧账,你翻开了一角。",
- "tru_two": "祖父和父亲的事,你都翻到了。",
- "tru_zero": "旧账压在灯底,你一页没翻。"
- },
- "radio": {
- "b_goal": "今晚五通电话。说什么话,由你决定。",
- "b_open": "午夜零点,红灯亮起。欢迎回到《今夜不眠》。",
- "b_rain": "雨下了一整晚。热线灯,马上就要亮了。",
- "b_rule": "台里的规矩就一条:先接住人,再接电话。",
- "d9_avoid": "各位,今晚到这里。明晚零点,今夜不眠,不见不散。",
- "d9_avoide": "留言机的红灯,又多亮了一夜。",
- "d9_face": "师父,三年了。这句晚安,我替您播。各位,晚安。",
- "d9_facee": "带子里其实只有电流声。但空着的那一秒,你说满了。",
- "e1_a": "天亮了,热线灯还亮着。你们的晚安,是这座城市的心跳。",
- "e1_b": "这把话筒,我总算接得住了。明晚零点,接着不眠。",
- "e2_a": "今晚的热线烧得发烫。全城的失眠者,都被接住了。",
- "e2_b": "只是路过留言机的时候,你还是没敢看它。红灯灭得很慢。",
- "e3_a": "口碑掉了一夜。可那句迟到三年的晚安,今晚说出去了。",
- "e3_b": "一个人的频道,也是频道。师父,收到了吗?",
- "e4_a": "今夜不眠,静音收播。有的夜班,谁也接不住谁。",
- "e4_b": "留言机还在闪。你没看它,它也没怪你。明晚再说吧。",
- "ep_deer_no": "小鹿退了票。检票口的灯,记得那趟没上成的车。",
- "ep_deer_ok": "小鹿上车了。她妈后来打电话说,那声妈,比奖杯值钱。",
- "ep_han_no": "老韩在服务区睡了一觉。学费齐了,那首歌没放成。",
- "ep_han_ok": "老韩到家了。后视镜上,多了朵小红花。",
- "ep_kid_no": "糖糖后来又打来过一次。还是那句:楼下在吵。",
- "ep_kid_ok": "糖糖家的门,这个月没再摔过。她说这是主播魔法。",
- "ep_lead": "收播了。导播间替你记了一笔账——今晚的人都怎样了。",
- "ep_wife_no": "陈姐在公车站坐到了末班车。那通电话,成了没寄出的信。",
- "ep_wife_ok": "陈姐家切了蛋糕。那句「回来吧」,是我这晚听过最好的声音。",
- "ep_zhou_no": "老周在便利店屋檐下坐到天亮。没出事,也没人听见他的歌。",
- "ep_zhou_ok": "老周:孙子替他买了老花镜。回信说,谢谢那首歌。",
- "g9_in": "五线收工。垫乐起——零点档,还剩最后一段。",
- "gd_again": "还在吗?单击继续。",
- "gd_brief": "单击继续节目。请选择的时候,向左或向右滑。",
- "gd_continue": "单击屏幕,继续。",
- "gd_invalid": "这个手势,直播间里用不上。",
- "gd_ring1": "热线在闪。单击,接听。",
- "gd_ring2": "灯还亮着,听众在等。单击,接听。",
- "h1_a": "主播,别挂。陪我说话,我的眼皮,沉得很。",
- "h1_b": "跑完这趟,闺女的学费就齐了。雨刷都快刮不动了。",
- "h1_danger": "车道偏了——听!",
- "h1_dango": "嘶——好险!前车急刹,我擦着护栏过去了。彻底醒了!",
- "h1_echo": "对了。头通电话那位大爷,就是这片被巡逻队找到的。这城市的夜,是接着的。",
- "h1_in": "五线来电。引擎声没停过——他在开车!",
- "h1_stop": "听我的,前面三公里有服务区。学费急,命更急。",
- "h1_stope": "他下了高速。单子黄了,人齐了。",
- "h1_stopo": "行,听你的。进了服务区,我给你们放首歌听。",
- "h1_talk": "说说她。开学第一天,她跟你说的头一句话,是什么?",
- "h1_talke": "吓醒的,也算醒。这一趟,聊到家。",
- "h1_talko": "她说,爸,我在学校给你赚了朵小红花。哈哈,哈哈……",
- "k1_a": "喂……有人吗?我睡不着。",
- "k1_ask": "睡不着的时候,心里是不是装着事?说给我听听。",
- "k1_asko": "爸爸妈妈摔门了。是不是……我做错了什么呀。",
- "k1_b": "家里灯关了。可是楼下,一直有声音。",
- "k1_in": "三线来电。听呼吸,是个小孩。",
- "k1_lie": "睡吧。明天一睁眼,什么都会好起来的。",
- "k1_liee": "你许了个兑不了的现。孩子睡了,谎留下了。",
- "k1_lieo": "真的吗?拉钩。晚安……",
- "k1_lull": "闭上眼睛。风把云朵盖在被子上,月亮替你值夜班。",
- "k1_lulle": "睡着了。可你没听见,她在怕什么。",
- "k1_lullo": "月亮也睡了……那我也睡。",
- "k1_truth": "糖糖,记住,大人的事,不是小孩的错。一个字都不是。",
- "k1_truthe": "蛋糕。记下来——四线的来电,可能跟这个家有关。",
- "k1_trutho": "嗯……那我睡了。他们明天,会一起给我切蛋糕吗?",
- "l1_a": "主播,退票窗口十一点半就关了。我站这儿半小时了。",
- "l1_b": "票是回去看我妈的。可我试镜又黄了,两手空空……",
- "l1_free": "退不退,都是你的自由。夜还长,慢慢想。",
- "l1_freee": "她走了。没上车,也没退票。年轻人的夜,长了点。",
- "l1_freeo": "嗯……我再想想。窗口要关了,我先过去了。",
- "l1_go": "你妈等的不是奖杯,是你进门喊的那声妈。",
- "l1_goe": "二线收工。这句话,值一个头条。",
- "l1_goo": "呜……嗯。不退了,我现在就去检票。谢谢您。",
- "l1_in": "二线来电。姑娘,声音很轻,像怕吵到谁。",
- "p1": "老人在发抖。向左滑,陪他哼那首老歌。向右滑,冷静问他路口的路牌。",
- "p2": "雨声更密了。向左滑,留在原地陪他等巡逻队。向右滑,转接派出所。",
- "p3": "向左滑,告诉她这趟车值得上。向右滑,把选择还给她。",
- "p4": "向左滑,唱一段摇篮曲哄她睡。向右滑,轻轻问她怎么了。",
- "p5": "孩子的声音在抖。向左滑,告诉她这不是她的错。向右滑,答应她明天都会好。",
- "p6": "摔门声你听见了。向左滑,替孩子给她带句话。向右滑,劝她回家把话说开。",
- "p7": "她的呼吸平了。向左滑,留在直播里,让全城等这个门铃。向右滑,换垫乐,私下陪她说完。",
- "p8": "方向盘比话筒危险。向左滑,陪他聊聊闺女。向右滑,让他立刻进服务区。",
- "p9": "留言机红灯在闪,是老主播三年前没播完的那句晚安。向左滑,替他播出去。向右滑,照常收播。",
- "prog_c1": "现在是今晚第一通电话。",
- "prog_c2": "现在是今晚第二通电话。",
- "prog_c3": "现在是今晚第三通电话。",
- "prog_c4": "现在是今晚第四通电话。",
- "prog_c5": "现在是今晚第五通电话。",
- "rep_high": "今晚的口碑,在听众里立住了。",
- "rep_low": "今晚的口碑,还没立起来。",
- "rep_mid": "今晚的口碑,不好不坏。",
- "sys_continue_ask": "检测到你的夜班记录。单击继续上次,右滑开始新的夜晚。",
- "sys_help": "单击继续,双击重新听。上滑听状态,下滑开菜单。请选择时,左右滑。",
- "sys_menu": "菜单。单击切换选项,双击确认。",
- "sys_menu_lobby": "保存并回大厅。",
- "sys_menu_restart": "重新开始今晚。",
- "sys_menu_resume": "回到直播。",
- "sys_new_night": "新的夜晚,开始了。",
- "sys_saved": "进度已保存。",
- "sys_settings": "音色、语速、背景音乐,请回大厅修改。",
- "sys_skip": "想跳过这句,单击就行。",
- "w1_a": "主播,我就想找个人说说。我家那口子,今晚要出远门的活儿。",
- "w1_air": "陈姐,别挂。让他接电话——全城都在听。",
- "w1_aire": "电话那头,传来跑步声。今晚的高光时刻。",
- "w1_airo": "喂!回来吧!蛋糕要化了,孩子等着呢!",
- "w1_b": "明天孩子生日!蛋糕都订好了,他人要今晚走!",
- "w1_home": "吵架隔着电话吵不赢。回家吧,蛋糕别放到坏了。",
- "w1_homee": "她往回走了。成不成,看他们自己的了。",
- "w1_homeo": "嗯……我这就往回走。谢谢你,听我瞎嚷嚷。",
- "w1_in": "四线来电。户外风声大,是位大姐。",
- "w1_priv": "这里只有我们俩了。想说就说,想哭就哭。",
- "w1_prive": "灯牌是你亲手关的,故事还是完整的。稳。",
- "w1_privq": "呜……其实他订完蛋糕就跟我道歉了。是我,把门摔得太响。",
- "w1_say": "四十分钟前,有个孩子问我们:爸妈摔门,是不是她的错。",
- "w1_say2": "今天有位小朋友,还在等爸妈回家切蛋糕。",
- "w1_say2e": "话递到了。就差最后一脚。",
- "w1_say2o": "蛋糕……是他订的。他嘴上不说,心里都记着。",
- "w1_saye": "她攥着电话,很久没出声。风都停了。",
- "w1_sayo": "什么?她还没睡?这么晚了,她还醒着?",
- "z1_a": "主播……我,我找不到回家的路了。",
- "z1_adone": "他慌了。先接住情绪,再走流程。",
- "z1_ask": "大爷,路口有什么招牌?念一个给我听听。",
- "z1_asko": "招牌……雨糊住了,我眼花,看不清啊……",
- "z1_b": "雨太大了。我本来,只想买副老花镜。",
- "z1_bad": "说不清……我真是,说不清了……",
- "z1_bade": "地址没报清就转接,雨又大。这通砸了。先稳人,再办事。",
- "z1_ok1": "就这么接。记住这个手感。",
- "z1_pol": "大爷,我把您转给派出所,他们马上就到。",
- "z1_pole": "转接完成,地址报得清。干净利落。",
- "z1_polo": "好,好。谢谢你啊,谢谢。",
- "z1_ring_in": "一线来电。七十多岁,雨夜,走丢了。",
- "z1_sdone": "他稳住了。老歌,比路牌管用。",
- "z1_song": "大爷别急,这首歌我也会。咱们一句一句来。",
- "z1_songo": "对,对!路口修车铺,天天放这首!",
- "z1_stay": "哪儿也不去。我陪你,这首歌还长着呢。",
- "z1_staye": "十五分钟后,巡逻灯停在路口。全城听见老人笑了。",
- "z1_stayo": "好,好。有人说话,我就不怕了。"
- },
- "rhythm": {
- "gd_answer": "现在跟着我打。",
- "gd_count": "四拍之后,继续。",
- "gd_miss": "慢了半拍,下一小节跟上我就行。",
- "gd_miss_early": "抢拍了。等声音落下再滑。",
- "gd_miss_late": "慢了半拍。跟着节拍走。",
- "gd_miss_none": "这拍没接。我停下的时候,就轮到你了。",
- "gd_miss_wrong": "方向不对。跟着音色滑。",
- "gd_slow": "我放慢一些,跟着试试。",
- "grade_a": "A 级!准确率超过八成五,非常出色。",
- "grade_b": "B 级,准确率超过七成。不错,还能更好。",
- "grade_c": "C 级,准确率不到七成。别灰心,再来一遍。",
- "grade_s": "S 级!准确率超过九成五,完美演出。",
- "menu_lobby": "回大厅。",
- "menu_main": "菜单。单击切换选项,双击确认。",
- "menu_resume": "继续演奏。",
- "mid_song": "过半了,保持。",
- "new_best_combo": "新连击纪录!",
- "restart": "单击再来一遍,右滑下一首,下滑回大厅。",
- "retry_early": "早了,等鼓点再出手。",
- "retry_gesture": "不是这个手势,再听一遍。",
- "retry_late": "晚了,跟着鼓点走。",
- "retry_listen": "再听一遍,跟着来。",
- "retry_skip": "没关系,我们先走下一句。",
- "rules": "规则:我奏一句,你在下一小节原样跟打。音要对,拍点也要对。",
- "select_hint": "左右滑选曲目,单击开始,下滑回大厅。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "skip_hint": "单击可跳过旁白。",
- "song1_name": "第一首,启程,九十拍。",
- "song2_name": "第二首,追风,一百零五拍。",
- "song3_name": "第三首,星爆,一百二十拍。",
- "song_locked": "这首还没解锁。上一首拿到 B 级以上就能解锁。",
- "tut_1": "听,底鼓。在下一小节的同一个位置,单击。",
- "tut_2": "这次是左和右。跟着打,左滑,右滑。",
- "tut_3": "最后一句,三个音,中间是双击。",
- "tut_done": "很好,演出开始。",
- "tut_skip": "跳过教学,直接开始。",
- "unlock_song2": "新曲目解锁,追风!",
- "unlock_song3": "新曲目解锁,星爆!",
- "welcome": "欢迎来到节拍行者。跟着音乐,我奏一句,你跟一句。",
- "welcome_back": "欢迎回来。我奏一句,你跟一句。"
- },
- "rpg": {
- "boss1_warn": "里面就是黑风寨主。你现在回去练练再来,也来得及。",
- "btl_enemy_die": "敌人倒下了。",
- "btl_flee": "你抽身退出了战斗。",
- "btl_flee_fail": "没甩掉!它追上来了。",
- "btl_half_bandit": "山贼的攻势缓了下来。",
- "btl_levelup": "你的修为精进了。",
- "btl_loot_big": "大获全胜,收获颇丰。",
- "btl_loot_mid": "收获不少。",
- "btl_loot_small": "小有收获。",
- "btl_lose": "你倒下了,黑暗吞没了一切。",
- "btl_lose_hint": "记住,听清前摇,双击格挡。",
- "btl_noflee": "避无可避!",
- "btl_noitem": "没有金疮药了。",
- "btl_nomp": "内劲不足。",
- "btl_start_bandit": "山贼围上来了!",
- "btl_start_boss1": "黑风寨主,就在你面前。",
- "btl_start_elite": "寨丁头目挡住了去路!",
- "btl_start_spider": "毒蛛从树上垂了下来!",
- "btl_start_wolf": "野狼拦路!",
- "btl_win": "战斗胜利。",
- "cmd_attack": "攻击。",
- "cmd_defend": "防御。",
- "cmd_item": "金疮药。",
- "cmd_skill": "破空斩。",
- "desc_chest": "一个枯树洞。洞里似乎藏着什么。",
- "desc_chest_re": "你回到枯树洞前。",
- "desc_deepwood": "密林深处。虫鸣急促,远处有狼嚎,杀气很重。",
- "desc_deepwood_re": "你回到密林深处。",
- "desc_fork": "岔路口。风声在左右两边,听起来不太一样。",
- "desc_fork_re": "你回到岔路口。",
- "desc_gate": "黑风寨门前。火把熊熊,人声嘈杂。",
- "desc_hall": "聚义厅。火盆熊熊,大厅空旷,回声冰冷。",
- "desc_hunter": "猎人小屋。柴火正旺,还有磨刀的声音。",
- "desc_hunter_re": "你回到猎人小屋。",
- "desc_path": "林间小路。风穿过树叶,脚下的落叶沙沙作响。",
- "desc_path_re": "你回到林间小路。",
- "desc_stream": "溪流。水声潺潺,是个歇脚的好地方。",
- "desc_stream_re": "你回到溪流边。",
- "desc_village": "雾口村。篝火噼啪作响,村民低声议论着林子里的土匪。",
- "desc_village_re": "你回到了雾口村。",
- "evt_ch1_end": "寨主倒了,但徒弟不在这里。一张字条,指向南方的腐沼。",
- "evt_chest": "树洞里有两瓶金疮药,你收好了。",
- "evt_gate_open": "寨门缓缓打开。",
- "evt_gold15": "你在落叶下摸到十五枚金币。",
- "evt_hunter_gift": "老猎人塞给你一瓶金疮药,还说商店会给你算便宜些。",
- "evt_nothing": "这里什么都没有了。",
- "foe_hp_high": "敌人气焰正盛。",
- "foe_hp_low": "敌人撑不住了。",
- "foe_hp_mid": "敌人露出疲态。",
- "gd_parry_miss": "前摇声起的时候双击,才能格挡。",
- "gd_stall": "想好了吗?左右滑动选择,单击出手。",
- "gd_wrap_first": "回到第一个。",
- "gd_wrap_last": "最后一个了。",
- "help_battle": "战斗中,左右滑选招式,单击出手。听到敌人的前摇,双击格挡。",
- "help_explore": "左右滑切换选项,单击确认。双击重新听场景,上滑查看状态,下滑打开菜单。",
- "intro_1": "你的眼睛看不见了。但你的耳朵,比谁都灵。",
- "intro_2": "黑风寨掳走了你唯一的徒弟。追进迷雾林,把他们连根拔起。",
- "intro_3": "先记住,怎么用耳朵走路。",
- "npc_boss1_1": "盲剑客?正好,省得挖你的眼睛。",
- "npc_boss1_2": "有两下子。可惜,你听不懂死期的声音。",
- "npc_boss1_die": "白无瞳……会找到你……",
- "npc_elite_1": "哪儿来的瞎子,敢闯黑风寨!",
- "npc_elite_die": "寨主……会替我报仇……",
- "npc_elite_half": "你……你到底是什么人!",
- "npc_headman_1": "外乡人,林子里不太平。这五十金,拿着防身。",
- "npc_headman_2": "商店就在村里,缺什么就去看看。",
- "npc_headman_3": "听说你是用耳朵走路的剑客?保重啊。",
- "npc_headman_4": "救救那些被掳走的孩子吧。",
- "npc_hunter_1": "站住。……哦,是个用耳朵的。",
- "npc_hunter_2": "寨子里有我旧识。带上这个,别死在路上。",
- "npc_hunter_3": "黑风寨主的双刀很快,听清他出刀前的动静。",
- "npc_hunter_4": "去吧。让我听听,你的传说。",
- "opt_assault": "强攻寨门。",
- "opt_back": "返回。",
- "opt_drink": "饮水休息。",
- "opt_go_chest": "往左,看看树洞。",
- "opt_go_deepwood": "前进,进密林深处。",
- "opt_go_fork": "前进,去岔路口。",
- "opt_go_gate": "前进,去寨门。",
- "opt_go_hunter": "前进,去猎人小屋。",
- "opt_go_path": "前进,去林间小路。",
- "opt_go_stream": "往右,去溪流。",
- "opt_investigate": "调查四周。",
- "opt_leave": "离开。",
- "opt_open_chest": "打开树洞。",
- "opt_rest": "休息一晚。",
- "opt_shop": "去商店。",
- "opt_sneak": "绕行潜入。",
- "opt_status": "查看状态。",
- "opt_talk_hunter": "和老猎人谈谈。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "shop_buy": "买下了。",
- "shop_open": "商店。左右滑看看货,单击购买。",
- "shop_owned": "这件你已经有了。",
- "shop_poor": "钱不够。",
- "shop_price_armor": "皮甲,八十金。",
- "shop_price_potion": "金疮药,三十金。",
- "shop_price_sword": "铁剑,一百金。",
- "skip_hint": "单击可跳过旁白。",
- "st_armor_iron": "你身着铁鳞甲。",
- "st_armor_leather": "你身着皮甲。",
- "st_armor_none": "你身无片甲。",
- "st_gold_poor": "口袋空空。",
- "st_gold_rich": "腰包鼓鼓。",
- "st_gold_some": "有些积蓄。",
- "st_hp_high": "你状态很好。",
- "st_hp_low": "你伤势很重,命悬一线。",
- "st_hp_mid": "你受了伤。",
- "st_lv_high": "你已是高手。",
- "st_lv_low": "你初出茅庐。",
- "st_lv_mid": "你小有名气。",
- "st_weapon_iron": "你手持铁剑。",
- "st_weapon_none": "你赤手空拳。",
- "st_weapon_steel": "你手持青钢剑。",
- "st_weapon_wind": "你手持听风剑。",
- "sys_continue_ask": "检测到你的旅程记录。单击继续,右滑开始新的旅程。",
- "sys_drink": "溪水清冽,你喝了个饱,伤势尽消。",
- "sys_menu": "菜单。左右滑选择,单击确认。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_resume": "继续旅程。",
- "sys_menu_save": "保存并回大厅。",
- "sys_new_game": "新的旅程,开始了。",
- "sys_rest": "你在篝火边睡了一觉,状态全满。",
- "sys_saved": "进度已保存。",
- "tut_b0": "战斗里,左右滑选招式,单击出手。听到这个声音,就是你的回合。先滑一滑,试试。",
- "tut_b1": "它要扑了,听前摇!",
- "tut_b2": "就是现在,双击格挡!",
- "tut_b2b": "挡得漂亮。",
- "tut_b3": "挡住了!轮到你了。左右滑选攻击,单击出剑。",
- "tut_b4": "没挡住也没关系,再来一次。",
- "tut_b5": "好剑法!接下来,靠你自己了。",
- "tut_b6": "来不及格挡,就选防御。左右滑,选防御,单击。",
- "tut_battle_1": "第一场战斗来了。别慌,战斗是回合制:你先出手,敌人再反击。",
- "tut_battle_2": "左右滑切换招式,攻击、破空斩、防御、金疮药。单击,出手。",
- "tut_battle_3": "敌人出手前有一声前摇。听到前摇,马上双击,就能格挡。",
- "tut_battle_4": "没把握就防御,伤害减半。金疮药可以回血。",
- "tut_battle_5": "记住:听清前摇,双击格挡。开始吧!"
- },
- "simon": {
- "chance_plus": "机会加一。",
- "chances_out": "重听机会用完了,小心。",
- "correct": "答对了!",
- "gameover": "游戏结束。",
- "gd_chances_left0": "免费重听用完了。之后重听会花一次机会,别怕,慢慢来。",
- "gd_chances_left1": "免费重听还剩一次。",
- "gd_clear": "漂亮,过了。",
- "gd_economy": "记不住就向上滑,重新听一遍。免费机会有两次,用完要扣一次机会。",
- "gd_occ_both": "这一轮,向上滑和双击都是作答。",
- "gd_occ_dt": "这一轮,双击是作答。",
- "gd_occ_up": "这一轮,向上滑是作答。",
- "gd_record": "破纪录了。",
- "gd_relisten": "需要的话,向上滑可以重新听一遍序列。",
- "menu_back": "返回游戏。",
- "menu_home": "回大厅。",
- "menu_open": "菜单。",
- "menu_restart": "重新开始。",
- "new_record": "新纪录!",
- "relisten": "再听一遍。",
- "replay": "单击屏幕,再来一局。",
- "retry_use": "错了。用一次机会,再听一遍。",
- "round_01": "第一轮,听好了。",
- "round_02": "第二轮,听好了。",
- "round_03": "第三轮,听好了。",
- "round_04": "第四轮,听好了。",
- "round_05": "第五轮,听好了。",
- "round_06": "第六轮,听好了。",
- "round_07": "第七轮,听好了。",
- "round_08": "第八轮,听好了。",
- "round_09": "第九轮,听好了。",
- "round_10": "第十轮,听好了。",
- "round_11": "第十一轮,听好了。",
- "round_12": "第十二轮,听好了。",
- "round_13": "第十三轮,听好了。",
- "round_14": "第十四轮,听好了。",
- "round_15": "第十五轮,听好了。",
- "round_16": "第十六轮,听好了。",
- "round_17": "第十七轮,听好了。",
- "round_18": "第十八轮,听好了。",
- "round_19": "第十九轮,听好了。",
- "round_20": "第二十轮,听好了。",
- "round_more": "新的一轮,听好了。",
- "rules": "上行音,向上滑。下行音,向下滑。左边的音,向左滑。右边的音,向右滑。一声轻响,单击。两声轻响,双击。",
- "rules_prompt": "上滑,重听规则。下滑,打开菜单。",
- "score_band1": "一轮都没坚持下来。别灰心。",
- "score_band2": "你坚持了三轮以内。",
- "score_band3": "你坚持了五轮左右。",
- "score_band4": "你坚持了将近十轮。",
- "score_band5": "你坚持了十轮以上,很厉害。",
- "score_band6": "你坚持了十五轮以上,大师级!",
- "skip_hint": "单击可跳过旁白。",
- "t0_goal": "我会演奏一串声音,请你记住顺序,原样复现。",
- "t0_welcome": "欢迎来到音序回响。先认识六种声音。",
- "t1_up": "向上滑,是这个声音。",
- "t2_down": "向下滑,是这个声音。",
- "t3_left": "向左滑,是这个声音。",
- "t4_right": "向右滑,是这个声音。",
- "t5_tap": "单击,是这个声音。",
- "t6_double": "双击,是这个声音。",
- "t7_ready": "六种声音都记住了。后面的序列,会越来越长。",
- "t7_retry": "答错可以消耗机会重听。向上滑,可以随时重听。",
- "t_blunt_double": "用指尖,快速点两下屏幕。",
- "t_blunt_down": "手指贴着屏幕,向下推一下。",
- "t_blunt_left": "手指贴着屏幕,向左推一下。",
- "t_blunt_right": "手指贴着屏幕,向右推一下。",
- "t_blunt_tap": "用指尖,轻轻点一下屏幕。",
- "t_blunt_up": "手指贴着屏幕,向上推一下。",
- "t_ok": "对了。",
- "t_skip": "跳过教学,直接开始。",
- "t_try": "你试试。",
- "t_wrong_double": "不是这个,双击试试。",
- "t_wrong_down": "不是这个,向下滑试试。",
- "t_wrong_left": "不是这个,向左滑试试。",
- "t_wrong_right": "不是这个,向右滑试试。",
- "t_wrong_tap": "不是这个,单击试试。",
- "t_wrong_up": "不是这个,向上滑试试。",
- "wrong": "错了。",
- "your_turn": "轮到你了。"
- },
- "space": {
- "dir_down": "下!",
- "dir_left": "左!",
- "dir_right": "右!",
- "dir_up": "上!",
- "dodge_1": "只拨开几颗。",
- "dodge_2": "拨开了十来颗。",
- "dodge_3": "拨开了几十颗。",
- "dodge_4": "拨开了一大群,漂亮。",
- "drill_done": "四个方向你都会了。引擎点火,出发!",
- "drill_down": "下面是低沉的轰隆。向下滑!",
- "drill_good": "漂亮。",
- "drill_left": "听,左边有陨石。向左滑,把它拨开!",
- "drill_moveon": "没关系,跟着我,我们继续。",
- "drill_retry_down": "轰隆声在下面,向下滑。",
- "drill_retry_left": "那是左边来的,向左滑。",
- "drill_retry_right": "那是右边来的,向右滑。",
- "drill_retry_up": "声音又高又尖,是上面,向上滑。",
- "drill_right": "这次在右边。向右滑!",
- "drill_rule": "陨石来了,会有声音告诉你方位。",
- "drill_skip": "跳过演练,直接出发。",
- "drill_up": "上面有东西,声音又尖又高。向上滑!",
- "drill_welcome": "欢迎登上盲航。你只有一双耳朵。",
- "feat_boost": "试试单击,引擎会短促加速,直接冲过空隙。",
- "feat_boost_done": "感觉到了吗?加速的时候,陨石撞不上你。",
- "feat_shield": "双击展开护盾,能挡下一次撞击。",
- "feat_shield_done": "护盾展开后会自动充能,好了我会告诉你。",
- "gd_hit_hint": "被撞了。听方位,同向滑动就能拨开。",
- "gd_last_life": "这是最后一次机会,撑住。",
- "help_recap": "左边来向左滑,右边来向右滑,上面来向上滑,下面来向下滑。单击加速,双击护盾。",
- "hit_down": "下面撞上的。听到低沉的轰隆,向下滑。",
- "hit_last": "船体只剩最后一次了,小心!",
- "hit_left": "左边撞上的。听到左边的呼啸,向左滑。",
- "hit_right": "右边撞上的。听到右边的呼啸,向右滑。",
- "hit_up": "上面撞上的。听到高高的呼啸,向上滑。",
- "menu_help": "重新听教学要点。",
- "menu_lobby": "回大厅。",
- "menu_main": "菜单。单击切换选项,双击确认。",
- "menu_resume": "继续飞行。",
- "ms_10": "十颗了,稳。",
- "ms_100": "一百颗!天空属于你。",
- "ms_25": "二十五颗,老练的飞行员。",
- "ms_50": "五十颗,传奇。",
- "new_record": "新纪录!",
- "paused": "已暂停。",
- "protect_down": "训练护盾接住了。那颗在下面,听到低沉的轰隆,向下滑。",
- "protect_end": "训练护盾关闭。接下来,靠你自己了。",
- "protect_left": "训练护盾接住了。那颗在左边,听到左边的呼啸,向左滑。",
- "protect_right": "训练护盾接住了。那颗在右边,听到右边的呼啸,向右滑。",
- "protect_up": "训练护盾接住了。那颗在上面,听到高高的呼啸,向上滑。",
- "restart_hint": "单击再飞一次,下滑回大厅。",
- "second_run_ask": "上滑重新听演练,单击直接出发。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "shield_block": "护盾挡下了撞击。",
- "shield_ready": "护盾充能完毕。",
- "skip_hint": "单击可跳过旁白。",
- "time_1": "不到三十秒,再试一次。",
- "time_2": "超过三十秒,有进步。",
- "time_3": "超过一分钟,合格的飞行员。",
- "time_4": "超过两分钟,王牌飞行员。"
- },
- "storyline": {
- "e1_child": "姐姐,姐姐!天亮了!妈妈说过的,天亮了,就可以不数啦!",
- "e1_dawn": "加密频道那头沉默了三秒。然后,一个你等了三十天的声音响了起来:“姐?姐!是你吗?”天亮之前,避难所的救援队打开了大门。猎狗的人,在北区的高墙下溃散了。你抱着晨晨,听见广播塔里,重新响起了音乐。后来人们说,这座城市,是从一个女人的声音开始,重新活过来的。——好结局:黎明。感谢你,陪林晚走完了这条路。单击屏幕,可以回到故事开始的地方。",
- "e2_price": "你赶在车队前面,撞进了避难所的大门。“关掉广播!关灯!猎狗来了——!”那一夜,北区守住了。探照灯熄灭的时候,晨晨从人群里扑出来抱住你,才发现你胳膊上的血,已经把半边袖子浸透了。坐标是你交出去的,命,是你抢回来的。你赢了,用一条胳膊的代价。——结局:代价。单击屏幕,重新开始。",
- "e3_alone": "你逃了。一路向南,没有回头。三天后,收音机里关于北区的广播,停了。又过了七天,你在一个废弃的加油站里,听见最后一个频段,也变成了沙沙声。你活下来了。只是从此以后的每一个夜里,你都会想起那声口哨,和你报出坐标时,自己发抖的声音。——坏结局:孤声。单击屏幕,重新开始。",
- "e4_static": "公开频道,把所有人都引来了——幸存者,还有猎狗。塔顶的风很大,你看见山下火把连成的长龙,也看见避难所方向亮起的防御火光。猎狗的刀抵上来的时候,你对着麦克风笑了:“听见了吗,晨晨?姐姐的声音,全城都听见了。”信号中断了。但那晚之后,北区,再没有人投降。——结局:静默。单击屏幕,重新开始。",
- "gd_again": "还在吗?单击继续。",
- "gd_brief": "单击继续剧情。请选择的时候,左右滑动。",
- "gd_continue": "轻触屏幕,继续。",
- "gd_invalid": "这个操作在这里用不上。",
- "help": "操作说明。单击屏幕:继续剧情。双击:重听刚才的台词。向上滑:听这段说明和当前进度。向下滑:呼出菜单,菜单里可以重新开始。当旁白说“请选择”的时候,向左滑或者向右滑,做出你的决定。选择无法撤销。",
- "menu": "菜单。向左滑:重新开始整个故事。向右滑,或者单击:回到故事。向上滑:听操作说明。",
- "n00_intro": "大停电后的第三十天,城市陷入彻底的黑暗。没有电,没有网络,只有收音机里偶尔闪过的沙沙声,像垂死者的呼吸。你是林晚,一名前急救员。在这个故事里,你用声音活下去。请记住:单击屏幕,继续剧情;双击,重听上一句;向上滑,听你的状态和帮助;向下滑,呼出菜单。当我说“请选择”的时候,向左滑,或者向右滑,做出你的决定。选择一旦做出,就无法回头。现在,单击屏幕,睁开眼睛。",
- "n01_wake": "后脑一阵钝痛,嘴里全是铁锈味。你在废弃的地铁站里醒来,四周黑得像沉在水底。背包还压在身下,手电筒却不知去向。远处滴水的声音,一下,一下,像某种倒计时。",
- "n02_linwan": "咳……咳咳……我还活着。晨晨,你在哪儿……你说过,会在北区等我。姐一定,一定找到你。",
- "n03_msg": "姐,如果你听到这个,说明你还活着,太好了。听着,跟着广播塔的红色信号灯走,别相信任何自称救援队的人。北区,北区有真正的避难所。我在这儿等你。姐,一定要来。",
- "n03_radio": "收音机……还好,没摔坏。等等,这是什么……这段录音,是三天前的……",
- "n04_exit": "你扶着潮湿的墙,一步一步往外摸。第五十步,脚尖踢到一个硬物——是一支手电,还剩半格电。光柱劈开黑暗的那一瞬,你看见墙上用红漆刷着一行大字:别去北区。",
- "n05_bcast": "北区避难所,仍在接收幸存者。重复,北区避难所,仍在接收幸存者。坐标,三、七点、五。请沿广播塔红色信号灯方向前进。",
- "n05_signal": "就在这时,背包侧袋里的收音机,沙沙声忽然变得清晰。一个平稳的女声,一遍又一遍地重复着:",
- "n06_whistle": "你刚走上街面,黑暗里忽然响起一声口哨。接着是第二声,第三声,从不同的方向,把你围在中间。有人的手电光,扫过你的脸。",
- "n07_dog": "哟,瞧瞧,有肥羊自己送上门了。别跑啊。这片儿的路,都是我猎狗修的。想过去?行啊,把包留下,把你值钱的玩意儿留下。人嘛……也留下。",
- "n08_vent": "你一矮身,钻进了通风管道。铁皮贴着脊背,窄得几乎无法呼吸。身后传来咒骂和铁棍敲击管道口的声音,越来越近,又渐渐远去。十分钟后,你从两条街外的井口爬出来,肺里像塞满了沙子。",
- "n09_dead": "你屏住呼吸,把自己埋进路边冰冷的尸体堆里。手电、罐头、半瓶水,被他们一样一样摸走。有人踢了你一脚,你纹丝不动。就在他们离开时,你听见一句不该听见的话——“北区那个陷阱,今晚就收网。”",
- "n10_rain": "酸雨开始下了。街面上升起细密的嘶嘶声,像无数条小蛇在游。雨幕那头,隐约传来一阵哭声——细细的,是个孩子。",
- "n11_child": "哭声来自一间塌了一半的便利店。一个小男孩抱着膝盖坐在货架底下,身边躺着一个再也不会醒来的女人。他抬起头,脸上全是灰,小声说:“我叫小满。妈妈说,数到一千,她就会醒。我已经数到……数到好多个一千了。”",
- "n12_take": "小满,别怕。数到一千太慢了。跟姐姐走,姐姐带你去找一座会发光的塔。抓紧我的手,别松开。",
- "n13_leave": "你把仅剩的一罐罐头放在他身边,转身走进雨里。身后,孩子重新开始数数:一……二……三……你告诉自己,别回头。千万别回头。",
- "n14_ignore": "哭声被你甩在身后,越来越远,最后混进雨声里,再也听不见了。你走得很快,快得像在逃跑。快一点,再快一点。你对自己说,只要到了北区,这一切就都值了。",
- "n15_bridge": "两个小时后,江水拦住了去路。跨江大桥断成两截,桥身斜插进黑沉沉的江面。要去广播塔,只剩两条路:桥下的污水涵洞,黑得看不见底;或者,桥上悬着的钢索,在风里荡来荡去。",
- "n16_culvert": "涵洞里,污水没到胸口,又冷又黏,带着腐烂的甜味。走到一半,水面下有什么东西,擦着你的腿滑了过去。你没有叫出声,只是走,一步,一步,直到看见洞口那点灰白的天光。",
- "n16b_culvert_c": "你让小满骑在肩上,自己蹚进没到胸口的污水里。又冷又黏,带着腐烂的甜味。走到一半,水面下有什么东西擦过你的腿,小满吓得一抖,你抬手按住他的膝盖:“数数。”他小声数起来,一,二,三……数到一百七,你们看见了洞口的天光。",
- "n17_cable": "钢索比想象中更滑。酸雨把它泡得发黏,你每挪一步,整根钢索就晃一下。江风从断桥的缺口灌进来,像有无数只手在水底下拽你的脚。你不往下看。你只知道,前面就是北岸。",
- "n17b_cable_c": "钢索比想象中更滑。小满趴在你背上,一声不吭,两条小胳膊勒得你生疼。走到一半,钢索猛地一沉,你听见身后钢丝崩断的脆响。“闭眼。”你说。然后你用尽全身力气,向前,向前,直到膝盖磕上北岸的石头。",
- "n18_dog": "啧啧啧。涵洞也拦不住你,钢索也拦不住你,命真大啊。正式认识一下——猎狗。北区广播塔底下这片,归我管。把你妹妹的坐标,还有包里剩下的东西,交出来。交出来,我让你死得体面点。",
- "n19_betray": "好,好,我说。北区,避难所,坐标是……三、七点、五。拿去,都拿去。求你……放我走。",
- "n20_convoy": "猎狗的车队朝北区开走了,探照灯在雨幕里划出一道道口子。你蹲在原地,胃里一阵一阵地泛酸。晨晨在北区。而刚才,是你,亲手把狼,引到了她的门口。",
- "n21_redeem": "再快一点……再快一点!晨晨,等我。这一次,姐说什么,也不会再把你弄丢了!",
- "n22_fight": "你往后退了半步,忽然笑了:“坐标在我脑子里。杀了我,你什么都拿不到。”猎狗愣了半秒。就是这半秒,你抓起一把沙土扬在他脸上,转身就跑。子弹擦着肩膀打进墙里,火辣辣地疼。但你在跑,你在跑——活着的感觉,从来没有这么清楚过。",
- "n23_tower": "广播塔就立在头顶,红色的信号灯在雨里一闪一闪,像一颗还在跳动的心脏。塔底的中控台居然还能用。只要爬上去,你就能接入城市广播网,把警报发给北区的每一个人。问题是——用哪个频道。",
- "n24_open": "所有人注意!所有人注意!我是林晚!北区避难所正在遭到袭击,重复,正在遭到袭击!能听见的人,拿起你身边能当武器的东西,去北区!救他们——也救救我们!",
- "n25_secure": "北区,北区,这里是林晚。频率七点五,老规矩。猎狗带人来了,至少二十个,有车。顶住,我马上到。重复,顶住,我马上到。",
- "p1": "请选择。向左滑:先检查背包里的收音机。向右滑:先摸黑寻找出口。",
- "p2": "请选择。向左滑:钻进旁边的通风管道。向右滑:躺进路边的尸体堆里装死。",
- "p3": "请选择。向左滑:循着哭声过去看看。向右滑:不去管它,直接去北区。",
- "p4": "请选择。向左滑:带上小满一起走。向右滑:留下食物,独自上路。",
- "p5": "请选择。向左滑:走桥下的污水涵洞。向右滑:爬桥上悬着的钢索。",
- "p6": "请选择。向左滑:交出坐标,保命要紧。向右滑:拒绝他,想办法周旋。",
- "p7": "请选择。向左滑:追上去,警告避难所。向右滑:自己逃命,越远越好。",
- "p8": "请选择。向左滑:用公开频道广播,让全城都听见。向右滑:用加密频段,只发给避难所。",
- "skip_hint": "单击可跳过旁白。",
- "status1": "当前进度:第一幕,城南地铁站附近。你的目标:活着离开这片废墟,前往北区的广播塔,寻找妹妹林晨的下落。",
- "status2": "当前进度:第二幕,酸雨笼罩的街区与断桥。你的目标:渡过江水,抵达广播塔。小心,猎狗的人,就在附近。",
- "status3": "当前进度:第三幕,广播塔下。你的目标:把警报发出去,找到林晨。这是最后一段路了。"
- },
- "teahouse": {
- "amb_1": "车铃一响,晚班的邮差探进头来。老规矩:茉莉花茶,要滚烫的。",
- "amb_2": "门帘一挑,绣坊的阿姐收了工,想喝一盏清火的龙井。",
- "amb_3": "巷口的醉汉扶着门框,含含糊糊,只嚷嚷要最浓的滇红。",
- "amb_react_good": "他喝得很慢,末了多搁下两文。",
- "amb_react_plain": "他喝完,点点头,搁下茶钱。",
- "amb_react_wrong": "他抿了一口,搁下半盏,晃出去了。",
- "bai_e_a": "明儿我把棋盘搬来,你这儿灯亮,我天天来摆谱——就当,她还在看着。",
- "bai_e_b": "回去还是那间空屋子。不过睡前有盏茶垫着,梦能沉一点。",
- "bai_e_c": "下个月,我搬去养老院了。这把紫砂壶,留给茶馆吧。",
- "bai_enter": "小掌柜,给我的紫砂壶,留个座。",
- "bai_o1": "晚饭积了食。要一盏刮油的、经得住泡的,我喝得慢。",
- "bai_o2": "昨儿那盏不错。今晚想喝口陈的,越陈越好。",
- "bai_o3": "就馋那口陈味。老伙计,看你的手艺了。",
- "bai_r1_good": "好茶,有回甘。像我家老婆子腌的萝卜干,越嚼越有味。",
- "bai_r1_plain": "嗯,茶汤尚可。人老了,舌头也钝了。",
- "bai_r1_wrong": "这不是我要的那口。不怪你——是我话没说全。",
- "bai_r2_good": "陈味出来了。四十年前,我跟老婆子初见,就是一盏普洱。",
- "bai_r2_plain": "茶汤淡了些。故事嘛,等茶好了再说。",
- "bai_r2_wrong": "……不是我惦记的那口。罢了,回家睡了。",
- "brew_start": "回到灶前。",
- "bridge_good": "客人把这盏茶喝得很慢,像是就着茶,把心事也喝顺了。",
- "bridge_plain": "茶喝完了,客人点点头,起身。",
- "bridge_wrong": "那盏茶凉在桌上,客人走的时候,没回头。",
- "chapter_end": "第一章完。这条巷子的夜,你都听过了。茶馆的故事,还长。",
- "close_coin_1": "今晚进账,不到十五文。",
- "close_coin_2": "今晚进账,十五到二十四文。",
- "close_coin_3": "今晚进账,二十五文往上。",
- "close_open": "客人走尽了。收壶,打烊。",
- "debt_clear": "旧账清了,秦婶把那一页翻了过去。",
- "gd_brew": "还在灶上,听声动手,双击。",
- "gd_close": "账报完了。单击,熄灯睡下。",
- "gd_invalid": "这个操作,这里用不上。",
- "gd_serve": "客人还在堂前。上滑,再听一遍他要的茶。",
- "he_e_a": "学费攒齐了,明天去看闺女。老师说她考了年级前十——这盏,我慢慢喝。",
- "he_e_b": "钱还差一点,再跑一个月。茶馆这盏灯,是我每晚的路标。",
- "he_e_c": "我把夜班退了。闺女在电话里说:妈,钱够用。这盏茶,我喝得最慢。",
- "he_enter": "师傅,门口能停车不?——哦,我是说,喝茶。",
- "he_o1": "跑了一宿,眼睛发涩,脑子发木。要一盏清口的,不要浓的。",
- "he_o2": "今晚不打算睡了,还要跑单。要最浓的,越浓越好。",
- "he_o3": "最后一趟车收工。想要一盏柔的,收收心。",
- "he_r1_good": "清亮,像拿凉水洗了把脸。今晚最后一单,稳了。",
- "he_r1_plain": "一般吧,能开就行。",
- "he_r1_wrong": "不是这口……算了,我还得赶路。",
- "he_r2_good": "得劲儿!闺女的照片就贴在方向盘上——再跑俩月,学费就齐了。",
- "he_r2_plain": "不够劲,今晚里程表怕是要难看。",
- "he_r2_wrong": "淡了。算了,我赶时间。",
- "hint_water": "水听两遍:泡泡细密是将沸,咕嘟连片是滚透。",
- "intro_1": "巷子最深处,有一盏亮到后半夜的灯。",
- "intro_2": "你接手了这家茶馆。今晚,是它易主后的头一晚。",
- "intro_3": "泡茶三步:选茶、候汤、出汤。手上的事,耳朵说了算。",
- "night_1": "头一晚。灯亮了,水坐上,茶馆开门。",
- "night_2": "第二晚。老客们,已经认得这条巷子。",
- "night_3": "第三晚。今天,是收房钱的日子。",
- "night_4": "第四晚。熟客进门,都不用问位子了。",
- "night_5": "第五晚。这一章的夜,快要听全了。",
- "night_more": "又一夜。灯还亮着,茶还热着。",
- "recap_go": "接着张罗。",
- "rent_due": "今天是房钱的日子,这一回,二十文。",
- "rent_ok": "房钱交清,秦婶没多话。",
- "rent_short": "房钱不够,差的那几文先记在账上。秦婶撂下一句:下回一起算。",
- "res_good": "这一盏,泡得地道。",
- "res_plain": "这一盏,泡得中平。",
- "res_wrong": "这一盏,泡岔了——不是客人今晚要的那口。",
- "serve_link": "你把茶端了过去。",
- "settings_hint": "音色、语速、背景音乐,请回大厅修改。",
- "settle_night": "熄了灯,这一晚就过去了。单击,睡下。",
- "shi_e_a": "成绩出来了,比模拟考高了四十多分!这盏茶,算我请全茶馆的!",
- "shi_e_b": "考完了,心里反倒空荡荡的。去哪读书,听爸妈安排吧。",
- "shi_e_c": "考砸了,茶也不对味……但至少,这儿的灯一直亮着。",
- "shi_enter": "老板……还有位子吗?我背单词,背得头疼。",
- "shi_o1": "想喝点香的提提神,但别太浓——喝完回家还得睡,明天早读。",
- "shi_o2": "模拟考砸了,心里烧得慌。想喝口最清火的。",
- "shi_o3": "考完了!今晚想喝口金贵的,犒劳自己。",
- "shi_r1_good": "好香!脑子清醒了。这是我攒的早饭钱……值了。",
- "shi_r1_plain": "还行吧。单词它还是不进脑子。",
- "shi_r1_wrong": "有点苦……没事,我泡的方便面更苦。",
- "shi_r2_good": "凉丝丝的,火气下去一半。老板,你说我还能考上吗?……算了,当我没问。",
- "shi_r2_plain": "茶一般,我也一般,挺配的。",
- "shi_r2_wrong": "不是这个味儿……回家还得接着刷题。",
- "st_debt_1": "账上,还欠着秦婶的钱。",
- "st_guest_1": "今晚第一位客人。",
- "st_guest_2": "今晚第二位客人。",
- "st_guest_3": "今晚第三位客人。",
- "st_guest_4": "今晚第四位客人。",
- "st_guest_5": "今晚第五位客人。",
- "st_purse_1": "钱箱见底,不到十文。",
- "st_purse_2": "钱箱周转得开,不愁明日开销。",
- "st_purse_3": "手头宽裕,二十五文往上。",
- "st_rep_1": "口碑还没立起来,街坊不知道巷子里有这家茶馆。",
- "st_rep_2": "有了回头客,口碑立住脚了。",
- "st_rep_3": "巷子口都在传你的茶,小有名气。",
- "st_rep_4": "一盏难求,茶客口耳相传。",
- "steep_early": "出急了,茶还睡着。这一步,偏了。",
- "steep_late": "闷过了,汤要发苦。这一步,偏了。",
- "steep_ok": "出汤,正好。",
- "su_e_a": "我调去白天班啦,还能常来。给你带我们科的喜糖。",
- "su_e_b": "还在犹豫,夜班再值一季。好在这盏茶,够我撑到天亮。",
- "su_e_c": "我递了辞呈,往后去哪还没想好。但今晚茶馆的灯,我记住了。",
- "su_enter": "请问……还营业吗?我刚下夜班。",
- "su_o1": "胃里发凉,人空荡荡的。想要一盏暖的,别太冲,喝完好睡。",
- "su_o2": "今晚换个口味,想要香的。可我还得眯一会儿才接班。",
- "su_o3": "最后一晚了,明天起不用值夜班。还是头一回那种,暖的。",
- "su_r1_good": "好暖……像被窝里塞了个汤婆子。谢谢你。",
- "su_r1_plain": "嗯,是热乎的。今晚,凑合能睡。",
- "su_r1_wrong": "这盏……有点寒。没关系,是我没说清。",
- "su_r2_good": "真香啊……今夜走了位老人,家属拉着我的手道谢。这盏茶,敬他们。",
- "su_r2_plain": "茶还行。今夜病房平静,平静得累人。",
- "su_r2_wrong": "香气没出来……像我今晚的运气。算了。",
- "sys_continue_ask": "检测到没打烊的茶馆。单击继续,右滑两次重开新店。",
- "sys_help": "左右滑选茶,单击定下。听水声,双击提壶;滴答密,双击出汤。上滑状态,下滑菜单。",
- "sys_menu": "菜单。单击切换,双击确认。",
- "sys_menu_help": "重新听帮助。",
- "sys_menu_resume": "回到堂前。",
- "sys_menu_save": "保存并回大厅。",
- "sys_menu_upg": "打烊置办。",
- "sys_reset_ask": "重开新店?口碑和存款都从头来。再右滑一次,确认。",
- "sys_saved": "进度已保存。",
- "tea_dianhong": "滇红。红茶性暖,滚水冲,经得住闷,越闷越醇。",
- "tea_longjing": "龙井。绿茶性鲜:水将沸就提壶,出汤要快。",
- "tea_moli": "茉莉花茶。香靠滚水激:水滚透再冲,出汤要快。",
- "tea_puer": "普洱。老茶经泡:滚水才泡得开,多闷一会儿更醇。",
- "tea_tieguanyin": "铁观音。乌龙要滚水才醒,闷到滴答密了再出汤。",
- "tea_yinzhen": "白毫银针。嫩芽金贵:水将沸就提,闷到滴答密。",
- "tut_d0": "先看茶柜。左右滑,一罐一罐听。",
- "tut_done": "都会了。往后每一晚,都这么泡。",
- "tut_serve": "茶好了。单击,端出去。",
- "tut_skip": "已跳过教学。左右滑选茶,单击选定,双击动手。",
- "tut_status": "上滑,听今晚的局面:第几位客人,口碑如何;客人要的茶,上滑灶上随时再听。",
- "tut_steep": "注水,闷泡。滴答由稀到密,密起来就是将好——双击,出汤。",
- "tut_tea": "单击,选定这罐茶。",
- "tut_water": "灶上坐水。泡泡细密是将沸,咕嘟连片是滚透——听到细密,双击提壶。",
- "upg_cabinet": "茶柜扩容,十五文。往后普洱、白毫银针,都上柜。",
- "upg_lock": "招牌还挂不得:口碑得十二分往上,欠账也得清。",
- "upg_none": "眼下的钱和账,还置办不起。改日再说。",
- "upg_open": "要添置点什么?左右滑看,单击买定。",
- "upg_sign": "立一块招牌,二十文。要口碑立得住——十二分往上才挂。",
- "upg_teaware": "添一副新茶具,十二文。手上更准,火候窗更宽。",
- "water_early": "急了,水还没醒透。这一步,偏了。",
- "water_late": "水滚老了。这一步,偏了。",
- "water_ok": "正是时候。",
- "zhou_e_a": "明天铺子歇一天,儿子回来帮我盘货。这盏茶,记你头上了!",
- "zhou_e_b": "电话里跟儿子拌了两句嘴。没事——茶还热着,日子还长。",
- "zhou_e_c": "铺子我想关了,儿子叫我过去帮工。茶馆的灯,替我多亮会儿。",
- "zhou_enter": "小掌柜!老位置,还给我留着呢吧?",
- "zhou_o1": "修了一天车,嗓子眼里全是机油味。就你那龙井,给我去去火。",
- "zhou_o2": "今天冷。来盏顶饱的、浓的,扛饿又扛冻。",
- "zhou_o3": "今晚就想要头一回那盏。一样的,再来一份。",
- "zhou_r1_good": "嚯!就是这个味儿!多谢啦,小掌柜。",
- "zhou_r1_plain": "嗯……还行。今天手底下,差了点意思。",
- "zhou_r1_wrong": "这是我要的龙井吗?……算了算了,凑合喝。",
- "zhou_r2_good": "对喽,暖到脚后跟了!跟你说——我儿子今天来电话了。",
- "zhou_r2_plain": "茶是茶,水是水,差点火候。儿子的事,改天再说吧。",
- "zhou_r2_wrong": "……今晚这盏不对。儿子的事,不说也罢。"
- }
}
\ No newline at end of file
diff --git a/web/space/audio/sfx/alarm.m4a b/web/space/audio/sfx/alarm.m4a
index 3b6fe69a..0f6f4187 100644
Binary files a/web/space/audio/sfx/alarm.m4a and b/web/space/audio/sfx/alarm.m4a differ
diff --git a/web/space/audio/sfx/alarm.ogg b/web/space/audio/sfx/alarm.ogg
index 069746b8..1416e8d8 100644
Binary files a/web/space/audio/sfx/alarm.ogg and b/web/space/audio/sfx/alarm.ogg differ
diff --git a/web/space/audio/sfx/boost.m4a b/web/space/audio/sfx/boost.m4a
index 8e8e6985..749e4d10 100644
Binary files a/web/space/audio/sfx/boost.m4a and b/web/space/audio/sfx/boost.m4a differ
diff --git a/web/space/audio/sfx/boost.ogg b/web/space/audio/sfx/boost.ogg
index fc40612f..e73585f8 100644
Binary files a/web/space/audio/sfx/boost.ogg and b/web/space/audio/sfx/boost.ogg differ
diff --git a/web/space/audio/sfx/dodge.m4a b/web/space/audio/sfx/dodge.m4a
index 054e1eee..68399d57 100644
Binary files a/web/space/audio/sfx/dodge.m4a and b/web/space/audio/sfx/dodge.m4a differ
diff --git a/web/space/audio/sfx/dodge.ogg b/web/space/audio/sfx/dodge.ogg
index 44d47418..8c774dd1 100644
Binary files a/web/space/audio/sfx/dodge.ogg and b/web/space/audio/sfx/dodge.ogg differ
diff --git a/web/space/audio/sfx/shield.m4a b/web/space/audio/sfx/shield.m4a
index b061a5c0..09db78bc 100644
Binary files a/web/space/audio/sfx/shield.m4a and b/web/space/audio/sfx/shield.m4a differ
diff --git a/web/space/audio/sfx/shield.ogg b/web/space/audio/sfx/shield.ogg
index 50449844..be89e1bc 100644
Binary files a/web/space/audio/sfx/shield.ogg and b/web/space/audio/sfx/shield.ogg differ
diff --git a/web/space/audio/sfx/shield_block.m4a b/web/space/audio/sfx/shield_block.m4a
index f245c111..c2cbf88e 100644
Binary files a/web/space/audio/sfx/shield_block.m4a and b/web/space/audio/sfx/shield_block.m4a differ
diff --git a/web/space/audio/sfx/shield_block.ogg b/web/space/audio/sfx/shield_block.ogg
index ff49d3a1..e3294e39 100644
Binary files a/web/space/audio/sfx/shield_block.ogg and b/web/space/audio/sfx/shield_block.ogg differ
diff --git a/web/space/audio/sfx/whiff.m4a b/web/space/audio/sfx/whiff.m4a
new file mode 100644
index 00000000..364234f4
Binary files /dev/null and b/web/space/audio/sfx/whiff.m4a differ
diff --git a/web/space/audio/sfx/whiff.ogg b/web/space/audio/sfx/whiff.ogg
new file mode 100644
index 00000000..608a7b46
Binary files /dev/null and b/web/space/audio/sfx/whiff.ogg differ
diff --git a/web/space/audio/voice/female/boost_not_ready.m4a b/web/space/audio/voice/female/boost_not_ready.m4a
new file mode 100644
index 00000000..fe09a78a
Binary files /dev/null and b/web/space/audio/voice/female/boost_not_ready.m4a differ
diff --git a/web/space/audio/voice/female/boost_not_ready.ogg b/web/space/audio/voice/female/boost_not_ready.ogg
new file mode 100644
index 00000000..8ccdc594
Binary files /dev/null and b/web/space/audio/voice/female/boost_not_ready.ogg differ
diff --git a/web/space/audio/voice/female/protect_soon.m4a b/web/space/audio/voice/female/protect_soon.m4a
new file mode 100644
index 00000000..f48cd747
Binary files /dev/null and b/web/space/audio/voice/female/protect_soon.m4a differ
diff --git a/web/space/audio/voice/female/protect_soon.ogg b/web/space/audio/voice/female/protect_soon.ogg
new file mode 100644
index 00000000..2ac78ff5
Binary files /dev/null and b/web/space/audio/voice/female/protect_soon.ogg differ
diff --git a/web/space/audio/voice/male/boost_not_ready.m4a b/web/space/audio/voice/male/boost_not_ready.m4a
new file mode 100644
index 00000000..d0d407a3
Binary files /dev/null and b/web/space/audio/voice/male/boost_not_ready.m4a differ
diff --git a/web/space/audio/voice/male/boost_not_ready.ogg b/web/space/audio/voice/male/boost_not_ready.ogg
new file mode 100644
index 00000000..b05d2d34
Binary files /dev/null and b/web/space/audio/voice/male/boost_not_ready.ogg differ
diff --git a/web/space/audio/voice/male/protect_soon.m4a b/web/space/audio/voice/male/protect_soon.m4a
new file mode 100644
index 00000000..3670902a
Binary files /dev/null and b/web/space/audio/voice/male/protect_soon.m4a differ
diff --git a/web/space/audio/voice/male/protect_soon.ogg b/web/space/audio/voice/male/protect_soon.ogg
new file mode 100644
index 00000000..c5bbc79c
Binary files /dev/null and b/web/space/audio/voice/male/protect_soon.ogg differ
diff --git a/web/space/game.js b/web/space/game.js
index 38373597..bcb6d7bf 100644
--- a/web/space/game.js
+++ b/web/space/game.js
@@ -68,6 +68,24 @@
* 第二个 play 漏杀前一个 → 双管线并播 + ScriptProcessor 节点永久泄漏(live 探针
* 实录 dir_up/hit_down 交替抽读百余次)。本层 voice 播放全部经 _voicePlay 串行门
* (等上次令牌落位再发下一次)+ 对局语音全量 prewarm 缓存热,引擎零改动。
+ *
+ * R5(space polish round1/round2,research/space-polish/):
+ * - **刺耳重合成**:alarm/dodge/shield_block/boost/shield 五件程序合成重制
+ * (tools/gen_space_syn.py,真峰值≤-3dBFS、≥3kHz 能量近零),新增 sfx/whiff。
+ * - **归因真话·接力补 replay**(live A t+151-163:保护期结束 8 秒三连撞,
+ * hit_left/hit_down 被 spawn 呼喊零毫秒顶断,玩家至死不知方位):呼喊维持
+ * 生存优先裁定不变,但 hit_/protect_end 起播时登记 _defendedId,
+ * 呼喊播完的 onComplete 发现登记未清除(=被顶断)→ queue 接 replay,
+ * 保证每句归因/保护期结束宣告完整送达(含 hit_last 排队其后)。
+ * - **保护期 protect_* 去重**:6.96s 教学句对 4.0s 刷怪间隔互相截到 4.0s
+ * (live A 保护期 7 连 TRUNCATED),改为上一句在播即跳过(shield_block 音 +
+ * WARNING 震不变),每句教学完整播完。
+ * - **加速冷却拒绝**(P1/P2/P4:冷却中单击全静默):_deny 共用去抖
+ * (heartbeat + voice/boost_not_ready 新句),护盾拒绝同路径(原句不变)。
+ * - **protect_soon**:50s 预告"训练护盾还剩十秒"(queue 不顶句),保护期结束
+ * 前给反应慢的玩家提前量;菜单/分批引入打断由 _rearmRunTimers 补播。
+ * - **激活确认震动**:boost/shield 激活补 CONFIRM 震(04 §5 承诺,此前漏装);
+ * 挥空/滑错方向补 sfx/whiff 轻叹(0.55 音量,引擎 swipe 震动已有)。
*/
import { Game } from '../engine/game.js';
import { Guide } from '../engine/guide.js';
@@ -88,7 +106,7 @@ const DODGE_GRACE_MS = 250; // 判定宽限:spawn 前/撞击点后各让 25
const ALARM_LEAD_MS = 1000; // 撞击前多久开始警报(两档:1s / 0.5s)
const SHIELD_DURATION_MS = 6000;
const SHIELD_COOLDOWN_MS = 15000; // round4 R1:30s→15s(冷却过长 + 失败零反馈是 P1)
-const SHIELD_DENY_DEBOUNCE_MS = 4000; // 护盾不可用应答(语音+震动)去抖
+const DENY_DEBOUNCE_MS = 4000; // R5:护盾/加速不可用应答(语音+震动)共用去抖
const BOOST_DURATION_MS = 1800;
const BOOST_COOLDOWN_MS = 3000;
const RAMP_MS = 120000; // 难度爬升到满所需时长(保护期后起算)
@@ -98,6 +116,7 @@ const PROTECT_SPAWN_MS = 4000;
const BARE_GRACE_METEORS = 3; // 保护期结束后前 N 颗裸飞陨石保持保护期节奏(round4 R1 不断崖)
const MENU_CALM_MS = 800; // 下滑开菜单冷静期:最近判定后 N ms 内下滑=躲避意图(round2 R2 误暂停修复)
const DRILL_APPROACH_MS = 4500; // 演练陨石逼近(慢速、无伤害)
+const PROTECT_SOON_MS = 50000; // R5:保护期还剩 10s 预告(protect_soon)
const BOOST_INTRO_MS = 20000; // 单击引入时刻
const SHIELD_INTRO_MS = 45000; // 双击引入时刻
const FEATURE_WAIT_MS = 8000; // 分批引入等待玩家操作上限
@@ -157,6 +176,7 @@ export class SpaceGame extends Game {
this.runStart = 0;
this.protectionUntil = 0;
this._protectAnnounced = false;
+ this._protectSoonAnnounced = false; // R5:50s 预告已播标记
this.swipes = [];
this.obstacles = new Set();
this.drillOb = null;
@@ -169,9 +189,11 @@ export class SpaceGame extends Game {
this.featureKind = null;
this._menuIdx = 0;
this._bareCount = 0; // 保护期结束后已刷裸飞陨石数(断崖过渡用)
- this._shieldDenyAt = -Infinity; // 护盾不可用应答去抖时间戳
+ this._denyAt = -Infinity; // 护盾/加速不可用应答共用去抖时间戳(R5)
this._hitLastPending = false; // hits===2 时 hit_last 待接播标记(呼喊接力用)
this._hitLastPlaying = false; // hit_last 在播标记(警告链呼喊抑制用,round2 R2)
+ this._defendedId = null; // R5:归因/保护结束句防顶断 replay 登记
+ this._protectSaying = false; // R5:protect_* 教学句在播标记(去重用)
this._lastResolveAt = -Infinity; // 最近一次陨石判定时刻(下滑开菜单冷静期,round2 R2)
// F6:警报去重 / danger 去抖时间戳(soft/loud 分档 + danger 全局)
this._alarmSoftAt = -Infinity;
@@ -185,14 +207,15 @@ export class SpaceGame extends Game {
this.audio.prewarm([
'sfx/whoosh_left', 'sfx/whoosh_right', 'sfx/whoosh_up', 'sfx/whoosh_down',
'sfx/alarm', 'sfx/boost', 'sfx/shield', 'sfx/shield_block',
- 'sfx/dodge', 'sfx/hit', 'sfx/crash',
+ 'sfx/dodge', 'sfx/hit', 'sfx/crash', 'sfx/whiff',
// 对局期可能并发的语音全量预热(voice 播放安全门配套:缓存热 = 令牌落位
// 只需数个 microtask,门内零等待):方向呼喊/归因/保护/护盾/引入/里程碑/向导
'voice/dir_left', 'voice/dir_right', 'voice/dir_up', 'voice/dir_down',
'voice/hit_left', 'voice/hit_right', 'voice/hit_up', 'voice/hit_down', 'voice/hit_last',
'voice/protect_left', 'voice/protect_right', 'voice/protect_up', 'voice/protect_down',
- 'voice/protect_end', 'voice/shield_ready', 'voice/shield_block',
+ 'voice/protect_end', 'voice/protect_soon', 'voice/shield_ready', 'voice/shield_block',
'voice/feat_boost', 'voice/feat_boost_done', 'voice/feat_shield', 'voice/feat_shield_done',
+ 'voice/boost_not_ready',
'voice/ms_10', 'voice/ms_25', 'voice/ms_50', 'voice/ms_100',
'voice/gd_hit_hint', 'voice/gd_last_life',
'voice/paused', 'voice/menu_main', 'voice/menu_resume', 'voice/menu_lobby',
@@ -365,6 +388,7 @@ export class SpaceGame extends Game {
// 单击/双击引入教学仅首局(标记在实例上,重开不再调度,第 2 局起机制开局即用)
if (!this.boostIntroDone) this._after(BOOST_INTRO_MS, () => this._beginFeature('boost'));
if (!this.shieldIntroDone) this._after(SHIELD_INTRO_MS, () => this._beginFeature('shield'));
+ this._after(PROTECT_SOON_MS, () => this._announceProtectionSoon()); // R5:50s 预告
this._after(PROTECTION_MS, () => this._announceProtectionEnd());
}
@@ -378,6 +402,7 @@ export class SpaceGame extends Game {
case 'up': case 'left': case 'right':
this.swipes.push({ dir: g, t: now });
this._trimSwipes(now);
+ this._whiffIfUnmatched(g);
break;
case 'down':
// 下滑冲突折中:有下方陨石悬置时是闪避,否则呼出菜单。
@@ -388,6 +413,7 @@ export class SpaceGame extends Game {
if ([...this.obstacles].some((ob) => ob.dir === 'down')) {
this.swipes.push({ dir: g, t: now });
this._trimSwipes(now);
+ this._whiffIfUnmatched(g);
} else if (now - this._lastResolveAt > MENU_CALM_MS) {
this._openMenu();
}
@@ -401,6 +427,10 @@ export class SpaceGame extends Game {
this.boostUntil = now + BOOST_DURATION_MS;
this.boostReadyAt = now + BOOST_COOLDOWN_MS;
this.audio.play('sfx/boost');
+ vibrate('confirm'); // R5:激活确认(04 §5 承诺,此前漏装)
+ } else if (this.boostIntroDone) {
+ // R5:冷却中单击必须有回音(P1/P2/P4:冷却零反馈是动作盲区)
+ this._deny(now, 'voice/boost_not_ready');
}
break;
case 'doubletap':
@@ -409,25 +439,38 @@ export class SpaceGame extends Game {
this.shieldUpUntil = now + SHIELD_DURATION_MS;
this.shieldReadyAt = now + SHIELD_COOLDOWN_MS;
this.audio.play('sfx/shield');
+ vibrate('confirm'); // R5:激活确认(04 §5 承诺,此前漏装)
this._scheduleShieldReady();
} else {
- this._shieldDeny(now); // 不可用必须有回音(round4 R1:panic 双击零反馈是 P1)
+ this._deny(now, 'voice/feat_shield_done'); // 不可用必须有回音(round4 R1:panic 双击零反馈是 P1)
}
break;
}
}
/**
- * 护盾不可用(未引入/充能中)的即时应答:现成句 feat_shield_done
- * ("会自动充能,好了我会告诉你"语义正合)+ HEARTBEAT 震,4s 去抖防连刷。
- * 注:voice_text.json 无"护盾还没好"专用句,复用此句属 round4 R1 裁定。
+ * R5:无效手势轻反馈(归因真话)。滑向没有任何悬置陨石的方向 = 挥空——
+ * 引擎 swipe 识别震动已有("收到了"),这里补一声轻叹("但这下没用"),
+ * 与成功闪避的 dodge 音形成对偶,避免玩家怀疑输入失灵。音量压低不抢戏。
*/
- _shieldDeny(now) {
- if (now - this._shieldDenyAt < SHIELD_DENY_DEBOUNCE_MS) return;
- this._shieldDenyAt = now;
+ _whiffIfUnmatched(dir) {
+ if (![...this.obstacles].some((ob) => ob.dir === dir)) {
+ this.audio.play('sfx/whiff', { volume: 0.55 });
+ }
+ }
+
+ /**
+ * 护盾/加速不可用(未引入/充能中)的即时应答:HEARTBEAT 震 + 语音提示,
+ * 4s 共用去抖防连刷(R5 起护盾/加速同路径,仅语音 id 不同)。
+ * 护盾句复用 feat_shield_done("会自动充能,好了我会告诉你"语义正合,round4 R1 裁定);
+ * 加速句用新句 boost_not_ready("引擎还在冷却,稍等一下。",R5)。
+ * 警告链在播时排队到链尾,不顶断"最后一命"(round2 R2)。
+ */
+ _deny(now, voiceId) {
+ if (now - this._denyAt < DENY_DEBOUNCE_MS) return;
+ this._denyAt = now;
vibrate('heartbeat');
- // 警告链在播时排队到链尾,不顶断"最后一命"(round2 R2)
- this.audio.play('voice/feat_shield_done', this._warnActive() ? { queue: true } : undefined);
+ this.audio.play(voiceId, this._warnActive() ? { queue: true } : undefined);
}
/** 护盾充能完毕播报 + PICKUP 震动(若仍在这一局)。语音排队播,不顶 protect_end/归因句。 */
@@ -469,12 +512,14 @@ export class SpaceGame extends Game {
this.boostUntil = now + BOOST_DURATION_MS;
this.boostReadyAt = now + BOOST_COOLDOWN_MS;
this.audio.play('sfx/boost');
+ vibrate('confirm'); // R5:激活确认(04 §5)
this._speak(['voice/feat_boost_done']);
this._endFeature();
} else {
this.shieldUpUntil = now + SHIELD_DURATION_MS;
this.shieldReadyAt = now + SHIELD_COOLDOWN_MS;
this.audio.play('sfx/shield');
+ vibrate('confirm'); // R5:激活确认(04 §5)
this._speak(['voice/feat_shield_done']);
this._endFeature(); // _endFeature → _rearmRunTimers 会按 shieldReadyAt 重排充能播报
}
@@ -506,6 +551,15 @@ export class SpaceGame extends Game {
if (remain <= 0) this._announceProtectionEnd(); // 已过期,立即补播
else this._after(remain, () => this._announceProtectionEnd());
}
+ // R5:50s 预告补播(菜单/分批引入打断后的恢复)
+ if (!this._protectSoonAnnounced) {
+ const soonRemain = this.runStart + PROTECT_SOON_MS - now;
+ if (soonRemain <= 0) {
+ if (this.protectionUntil > now) this._announceProtectionSoon();
+ } else {
+ this._after(soonRemain, () => this._announceProtectionSoon());
+ }
+ }
if (this.shieldReadyAt > now) {
this._scheduleShieldReady(this.shieldReadyAt - now);
}
@@ -515,12 +569,52 @@ export class SpaceGame extends Game {
// ---------------- 保护期 ----------------
+ /** R5:50s 预告(保护期还剩 10 秒)。queue 不顶在播教学句;被打断由 _rearmRunTimers 补播。 */
+ _announceProtectionSoon() {
+ if (this._protectSoonAnnounced) return;
+ if (this.phase !== 'playing') return; // 菜单/分批引入中,恢复时补播
+ this._protectSoonAnnounced = true;
+ this.audio.play('voice/protect_soon', { queue: true });
+ }
+
+ /** R5:保护结束宣告走防顶断登记(live A t+151.6:被 spawn 呼喊顶得只剩 0.5s)。 */
_announceProtectionEnd() {
if (this._protectAnnounced) return;
if (this.phase !== 'playing') return; // 菜单/分批引入中,恢复时由 _rearmRunTimers 补播
this._protectAnnounced = true;
vibrate('warning');
- this.audio.play('voice/protect_end');
+ this._defendVoice('voice/protect_end');
+ }
+
+ /**
+ * R5 防顶断登记:生存语义长句(hit_/protect_end)起播时登记 id;
+ * 自然播完/被跳过 → onComplete 清除登记(= 完好送达);
+ * 被 spawn 呼喊顶断 → 登记残留,呼喊播完的 onComplete 走 _replayDefended
+ * queue 接 replay(呼喊生存优先裁定不变,句子保证完整送达一次)。
+ */
+ _defendVoice(id, onDone) {
+ this._defendedId = id;
+ this.audio.play(id, {
+ onComplete: () => {
+ if (this._defendedId === id) this._defendedId = null;
+ if (onDone) onDone();
+ },
+ });
+ }
+
+ /** R5:呼喊播完时发现登记残留(= 顶断了生存句)→ queue 接 replay,不顶新威胁信息。
+ * @returns {boolean} 是否发生了 replay(发生了则 hit_last 由 replay 播完接力,不必此刻 drain) */
+ _replayDefended() {
+ const id = this._defendedId;
+ if (!id) return false;
+ this._defendedId = null;
+ if (id.startsWith('voice/hit_')) {
+ // 归因 replay 播完仍要接"最后一命"(语义链:先因后果)
+ this.audio.play(id, { queue: true, onComplete: () => this._drainHitLast() });
+ } else {
+ this.audio.play(id, { queue: true });
+ }
+ return true;
}
// ---------------- 陨石调度 ----------------
@@ -562,7 +656,9 @@ export class SpaceGame extends Game {
// 被下一颗的呼喊顶断(live B5:高速段警告刚起播就被顶没);归因在播期间呼喊
// 保留生存优先级(顶断 → 接力,低延迟警告路径不变)。
if (impactAt > this.protectionUntil && !this._hitLastPlaying) {
- this.audio.play(`voice/dir_${dir}`, { onComplete: () => this._drainHitLast() });
+ // onComplete 双职责(R5):① 顶断了归因/保护结束句 → queue 接 replay(replay 播完
+ // 自行接力 hit_last);② 呼喊接力(round4 R1):无 replay 时 hit_last 挂起直接接播。
+ this.audio.play(`voice/dir_${dir}`, { onComplete: () => { if (!this._replayDefended()) this._drainHitLast(); } });
}
// 警报两档渐强,DANGER 震动同步叠加。
// F6(round2):警报音效同 600ms 窗口去重(双陨石同时逼近只起一波警报,
@@ -625,7 +721,13 @@ export class SpaceGame extends Game {
if (this._inProtection()) {
this.audio.play('sfx/shield_block');
vibrate('warning');
- this.audio.play(`voice/protect_${ob.dir}`);
+ // R5 去重:6.96s 教学句对 4.0s 刷怪间隔(live A 保护期 7 连 TRUNCATED,
+ // 每句都截在同一个字上)——上一句在播即跳过,保证每句完整送达;
+ // 被跳过的那次仍有 shield_block 音 + WARNING 震落位。
+ if (!this._protectSaying) {
+ this._protectSaying = true;
+ this.audio.play(`voice/protect_${ob.dir}`, { onComplete: () => { this._protectSaying = false; } });
+ }
return;
}
// 5) 实打实撞上:HIT 震动 + 归因语音(第 2 次加"只剩最后一次")
@@ -642,15 +744,16 @@ export class SpaceGame extends Game {
// 顶断路径:归因被呼喊顶掉 → 呼喊播完的 onComplete(_spawnObstacle 挂的)
// → _drainHitLast 接播。重开/回大厅由 _resetRunState 清挂起。
if (this.hits === 2) this._hitLastPending = true;
- this.audio.play(`voice/hit_${ob.dir}`, {
- onComplete: () => {
- if (this.hits === 1) {
- // 第 1 次受击补指令式 gd_hit_hint(hit_ 已归因方位,这句补
- // "该怎么拨",onceKey 同局一次)
- this.guide.error({ voice: 'gd_hit_hint', onceKey: 'space_hit_hint', skipHaptic: true });
- }
- this._drainHitLast();
- },
+ // R5:归因句走防顶断登记(_defendVoice)——被 spawn 呼喊顶断时由呼喊
+ // onComplete 走 _replayDefended 补 replay(live A t+155.13/159.13:
+ // hit_left/hit_down 零毫秒被杀,玩家至死不知方位)。
+ this._defendVoice(`voice/hit_${ob.dir}`, () => {
+ if (this.hits === 1) {
+ // 第 1 次受击补指令式 gd_hit_hint(hit_ 已归因方位,这句补
+ // "该怎么拨",onceKey 同局一次)
+ this.guide.error({ voice: 'gd_hit_hint', onceKey: 'space_hit_hint', skipHaptic: true });
+ }
+ this._drainHitLast();
});
}
}
diff --git a/web/space/test/playtest.mjs b/web/space/test/playtest.mjs
index 9b70a3f5..d6eccd70 100644
--- a/web/space/test/playtest.mjs
+++ b/web/space/test/playtest.mjs
@@ -3,7 +3,9 @@
* + 边界断言)与 §7(全局通用断言),以及本轮改动(状态 BGM / skipVoice / skip_hint)、
* §11 round4-live 修复(方向呼喊提前到 spawn / 闪避窗口=呼啸全程 / 护盾 15s+不可用应答 /
* 保护期断崖过渡 / hit_last 呼喊接力 / feat 教学仅首局),以及 round2 R2 修复
- * (下滑开菜单冷静期防误暂停 / 暂停恢复缓冲 / 回大厅收尾流程 / 警告链呼喊抑制+坠毁掐断)。
+ * (下滑开菜单冷静期防误暂停 / 暂停恢复缓冲 / 回大厅收尾流程 / 警告链呼喊抑制+坠毁掐断),
+ * 以及 R5 space polish 修复(research/space-polish/:归因防顶断 replay / protect_* 去重 /
+ * protect_soon 50s 预告 / 加速冷却拒绝 boost_not_ready / 激活 CONFIRM 震 / whiff 挥空音)。
*
* 用法:tools/node/bin/node web/space/test/playtest.mjs
*
@@ -179,6 +181,7 @@ function makeHarness() {
const voices = (plays) => plays.filter((p) => p.id.startsWith('voice/')).map((p) => p.id);
const lastVoice = (plays) => voices(plays).at(-1);
const vibrated = (pat) => vibrations.some((v) => Array.isArray(v) && v.join() === pat);
+const confirmCount = () => vibrations.filter((v) => Array.isArray(v) && v.join() === '20').length;
try {
// ======================================================================
@@ -267,6 +270,21 @@ try {
assert(!plays.some((p) => p.t >= t0 && p.id.startsWith('voice/dir_')),
'撞击点落在保护期内的陨石 spawn 不播 dir_(§11:protect 长句教学优先)');
+ // -- R5:protect_* 去重——上一句教学在播时新吸收只发 shield_block 音 + WARNING 震,
+ // 不再互截(live A 保护期 7 连 TRUNCATED 修复) --
+ const protectVoiceCount = voices(plays).filter((id) => id.startsWith('voice/protect_')).length;
+ const shieldBlockCount = plays.filter((p) => p.id === 'sfx/shield_block').length;
+ game.obstacles.clear();
+ const obP2 = { dir: 'right', impactAt: clock.now + 100 };
+ game.obstacles.add(obP2);
+ game._after(100, () => game._resolve(obP2));
+ await advance(150);
+ assert(game.hits === 0, 'R5 去重吸收仍不掉血(训练护盾)');
+ assert(voices(plays).filter((id) => id.startsWith('voice/protect_')).length === protectVoiceCount,
+ 'protect_* 在播时新吸收跳过语音(R5 去重,每句教学完整播完)');
+ assert(plays.filter((p) => p.id === 'sfx/shield_block').length === shieldBlockCount + 1,
+ '去重吸收仍有 shield_block 音落位');
+
// -- §5.3 第 20s 单击引入(feat_boost 可跳) --
await advance(t0 + 20000 - clock.now);
assert(game.phase === 'feature' && game.featureKind === 'boost', '第 20s 暂停刷怪教单击');
@@ -279,6 +297,7 @@ try {
assert(game.boostUntil > clock.now, '旁白已跳后单击 → boost 生效(§5.3)');
assert(game.phase === 'playing', '分批引入结束恢复 playing');
assert(lastVoice(plays) === 'voice/feat_boost_done', 'feat_boost_done 确认句');
+ assert(confirmCount() >= 1, '加速激活 CONFIRM 震(R5 兑现 04 §5)');
// 加速增益期间的撞击算冲过空隙
game.obstacles.clear();
@@ -293,6 +312,7 @@ try {
assert(game.phase === 'feature' && game.featureKind === 'shield', '第 45s 教双击护盾');
game.onGesture('doubletap'); await tick();
assert(game.shieldUpUntil > clock.now, '双击 → 护盾生效(§5.3)');
+ assert(confirmCount() >= 2, '护盾激活 CONFIRM 震(R5 兑现 04 §5)');
assert(game.shieldReadyAt === clock.now + 15000, '护盾充能 15s 锁定(§11 改口,原 30s)');
assert(game.phase === 'playing', '护盾引入结束恢复 playing');
@@ -325,12 +345,37 @@ try {
// -- §5.4 保护解除播报 --
await advance(t0 + 60050 - clock.now);
assert(game._protectAnnounced && voices(plays).includes('voice/protect_end'), '60s 保护解除播报');
+ assert(game._protectSoonAnnounced && voices(plays).includes('voice/protect_soon'),
+ '50s 保护期预告 protect_soon(R5:给反应慢的玩家 10s 提前量)');
// -- 边界:护盾充能完毕播报,且只播一次(回归:曾双重调度播两次) --
await advance(game.shieldReadyAt - clock.now + 50);
assert(voices(plays).filter((id) => id === 'voice/shield_ready').length === 1,
'shield_ready 充能完毕播报恰好一次');
assert(vibrated('15'), '护盾就绪 PICKUP 震动');
+ await advance(2000); // 静场起点
+ { // 排队的 protect_soon/protect_end/shield_ready 串行播完(虚拟时钟下语音门有落位延迟,
+ // 轮询等待而非固定 advance——拒绝用例需要 voice 真正空闲)
+ let guard = 0;
+ while (audio.isVoicePlaying() && guard++ < 20) await advance(300);
+ }
+ assert(!audio.isVoicePlaying(), '静场:排队的状态句播完,拒绝用例需 voice 空闲');
+
+ // -- R5:加速冷却拒绝(归因真话:冷却单击必须有回音,此前全静默) --
+ const notReadyCount = () => voices(plays).filter((id) => id === 'voice/boost_not_ready').length;
+ const denyVoiceBefore = notReadyCount();
+ const confirmBefore = confirmCount();
+ game.onGesture('tap'); await tick(); // voice 空闲 → 加速直接生效
+ assert(game.boostUntil > clock.now, 'R5 用例前置:加速激活');
+ assert(confirmCount() === confirmBefore + 1, '对局期加速激活 CONFIRM 震(R5)');
+ const boostUntilLocked = game.boostUntil;
+ game.onGesture('tap'); await tick(); // 冷却中(3s)→ 拒绝
+ assert(game.boostUntil === boostUntilLocked, '冷却中单击不重置加速');
+ assert(notReadyCount() === denyVoiceBefore + 1, '加速冷却拒绝播报 boost_not_ready(R5)');
+ assert(vibrated('40,100,40'), '加速冷却拒绝 HEARTBEAT 震(R5)');
+ game.onGesture('tap'); await tick();
+ assert(notReadyCount() === denyVoiceBefore + 1, '加速冷却拒绝 4s 去抖(连刷不重播)');
+ await advance(3100); // 冷却结束,后续用例不受影响
// -- §5.4/§11 正常闪避 3 颗(同向滑;§11 起窗口=呼啸全程,此处仍在撞击前 800ms 出手) --
// 同循环验证 §11 断崖过渡(裸飞第 1~3 颗逼近固定 4.0s)与方向呼喊时机(spawn 同窗)
@@ -378,6 +423,7 @@ try {
naturalSpawn();
const obH1 = [...game.obstacles].at(-1);
game.onGesture('right'); // 反向
+ assert(plays.some((p) => p.id === 'sfx/whiff'), '滑错方向有挥空轻叹(R5 归因真话:无效手势有回音)');
await advance(obH1.impactAt - clock.now + 50);
assert(game.hits === 1, '反向滑不判闪避,撞击 hits=1');
assert(lastVoice(plays) === 'voice/hit_left', 'hit_ 归因方向与来袭一致');
@@ -402,11 +448,20 @@ try {
const obNext = [...game.obstacles].at(-1);
await tick();
assert(h.voiceStarts.at(-1).id === 'voice/dir_left', '下一颗 spawn 呼喊顶断归因(生存优先级)');
- await advance(1300); // 呼喊播完 → onComplete 接力 → hit_last 自动接播
+ assert(game._defendedId === 'voice/hit_right', '归因被顶断后登记残留(R5 防顶断登记)');
+ // R5:登记残留 → 呼喊播完的 onComplete 走 _replayDefended queue 补 replay(归因完整送达)。
+ // 虚拟时钟下语音门有落位延迟,用轮询等 replay/接播事件而非固定 advance 步长。
+ const hitRightStarts = () => h.voiceStarts.filter((v) => v.id === 'voice/hit_right').length;
+ let guard = 0;
+ while (hitRightStarts() < 2 && guard++ < 16) await advance(300);
+ assert(hitRightStarts() === 2, '归因被呼喊顶断后补 replay(R5:玩家不再丢失方位归因)');
+ assert(game._defendedId === null, 'replay 后登记清除');
+ while (h.voiceStarts.at(-1).id !== 'voice/hit_last' && guard++ < 32) await advance(300);
assert(h.voiceStarts.at(-1).id === 'voice/hit_last',
- '归因被呼喊顶断后 hit_last 仍接播(§11:最后一命不再被静默吞掉)');
+ '归因 replay 播完接播 hit_last(§11:最后一命不再被静默吞掉,R5 先因后果)');
assert(game._hitLastPending === false, 'hit_last 接播后挂起标记清除');
assert(game._hitLastPlaying === true, 'hit_last 在播标记置位(round2 R2)');
+ game.obstacles.delete(obNext); // R5:replay 多耗一个呼喊周期,提前摘除防其撞击点坠毁干扰抑制用例
// round2 R2:hit_last 在播期间新刷陨石的 spawn 呼喊被抑制(警告播完前不被顶断)
const shoutMark2 = h.voiceStarts.length;
randQueue.push(0.5); // up
@@ -415,14 +470,14 @@ try {
await tick();
assert(!h.voiceStarts.slice(shoutMark2).some((v) => v.id === 'voice/dir_up'),
'hit_last 在播期间 spawn 不播方向呼喊(round2 R2:警告播完前不被顶断)');
- await advance(1300); // hit_last 播完 → 呼喊抑制解除
+ game.obstacles.delete(obNext2); // 立即摘除(后续轮询等待会越过其撞击点)
+ let guard2 = 0;
+ while (game._hitLastPlaying && guard2++ < 16) await advance(300);
assert(game._hitLastPlaying === false, 'hit_last 播完在播标记清除');
randQueue.push(0.5); // up:链后再刷陨石,方向呼喊恢复
naturalSpawn();
await tick();
assert(h.voiceStarts.at(-1).id === 'voice/dir_up', '警告链结束后方向呼喊恢复(round2 R2)');
- game.obstacles.delete(obNext);
- game.obstacles.delete(obNext2);
game.obstacles.clear(); game.swipes = [];
// -- 边界:里程碑 dodges=10 播 ms_10 --