gestures.js: 新增长按(1s)、两指长按(暂停)、三指点击(退出),支持多指检测 engine.js: REPLY_COUNT变量、长按重播/状态广播、暂停恢复退出机制、 选择提示音、结局台词预录音频替换TTS、内容预警+心理热线 story.js: MSG-10/11 follow-up补全down(沉默)选项 index.html: 操作指南添加长按/安全手势、内容预警文字 batch_tts_voxcpm.py: 新增12条台词(结局旁白+系统提示+分支NPC反应) audio/mp3/tts: 12个VoxCPM2生成的林夏声线MP3 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
251 lines
8.1 KiB
Markdown
251 lines
8.1 KiB
Markdown
# 林夏 v2 收尾任务文档
|
|
|
|
## 一、游戏开发任务
|
|
|
|
### G1: 手势系统升级 — gestures.js
|
|
|
|
**现状**: 仅支持 6 种手势(单击/双击/四方向滑动),无长按、无多指手势
|
|
**目标**: 新增长按(1s)、两指长按(暂停)、三指点击(退出)
|
|
|
|
**交付物**:
|
|
- 长按检测:touchstart 后 1000ms 无移动 → emit `longpress`
|
|
- 两指长按检测:两指同时触屏 1000ms → emit `twofinger_longpress`
|
|
- 三指点击检测:三指同时触屏后抬起 → emit `threefinger_tap`
|
|
- touchmove 监听:移动超阈值取消长按
|
|
- 键盘映射:L=长按, P=暂停, Q=退出
|
|
|
|
**测试case**:
|
|
1. 单指按住 1.5s 不动 → 触发 longpress,不触发 singletap
|
|
2. 单指按住 0.3s 抬起 → 触发 singletap,不触发 longpress
|
|
3. 单指按住后滑动 → 触发 swipe,不触发 longpress
|
|
4. 双指按住 1.5s → 触发 twofinger_longpress
|
|
5. 双指快速点击(<1s)→ 不触发任何事件(忽略)
|
|
6. 三指同时触屏后抬起 → 触发 threefinger_tap
|
|
7. 键盘 L/P/Q 分别触发对应事件
|
|
|
|
---
|
|
|
|
### G2: 变量系统补全 — engine.js
|
|
|
|
**现状**: 使用 `UNREAD` 变量,缺少 `REPLY_COUNT`
|
|
**目标**: 添加 `REPLY_COUNT`,在玩家做出非沉默选择时递增
|
|
|
|
**交付物**:
|
|
- `vars` 对象新增 `REPLY_COUNT: 0`
|
|
- `_handleChoice()` 中非沉默选择时 `REPLY_COUNT++`
|
|
- 结局 C 判定改用 `REPLY_COUNT <= 2`
|
|
|
|
**测试case**:
|
|
1. 选择右滑(温暖) → REPLY_COUNT 递增 1
|
|
2. 选择下滑(沉默, isSilence=true) → REPLY_COUNT 不变
|
|
3. 双击跳过选择 → REPLY_COUNT 不变
|
|
4. 全程极少回复(REPLY_COUNT<=2) + 全部已读 → 触发结局 C
|
|
|
|
---
|
|
|
|
### G3: 长按手势处理 — engine.js
|
|
|
|
**现状**: 无长按处理
|
|
**目标**: playing/choosing 状态重播当前消息音频;其他状态广播未读数
|
|
|
|
**交付物**:
|
|
- `_onLongPress()` 方法
|
|
- playing/responding/reacting → 中断当前播放,重播 currentMsg.audio
|
|
- choosing → 重播 currentMsg.audio(不退出选择状态)
|
|
- idle/notification → TTS 播报 "当前未读 N 条消息"
|
|
|
|
**测试case**:
|
|
1. playing 状态长按 → 当前语音重头播放
|
|
2. choosing 状态长按 → 重播 NPC 问题,仍可继续选择
|
|
3. idle 状态长按 → TTS 播报未读数
|
|
4. ending 状态长按 → 无反应
|
|
|
|
---
|
|
|
|
### G4: 暂停/退出机制 — engine.js
|
|
|
|
**现状**: 无暂停/退出功能
|
|
**目标**: 两指长按暂停,单击恢复,三指点击退出
|
|
|
|
**交付物**:
|
|
- 新状态 `paused`
|
|
- `_onPause()`: 保存当前状态、停止所有音频/震动、TTS 播报暂停提示
|
|
- `_onResume()`: 恢复到 choosing/idle(语音无法断点续播)
|
|
- `_onExit()`: 仅 paused 状态可用,TTS 播报感谢后返回开始页
|
|
- hint 栏显示暂停状态提示
|
|
|
|
**测试case**:
|
|
1. playing 状态两指长按 → 音频停止,进入 paused,TTS 播报暂停
|
|
2. paused 状态单击 → 恢复游戏
|
|
3. paused 状态三指点击 → 退出到开始页
|
|
4. 非 paused 状态三指点击 → 无反应
|
|
5. ending 状态两指长按 → 无反应(结局不可暂停)
|
|
|
|
---
|
|
|
|
### G5: 选择状态语音提示 — engine.js
|
|
|
|
**现状**: 进入 choosing 仅播放 choiceReady 音效 + confirm 震动
|
|
**目标**: 追加 TTS 播报 "等待回复"
|
|
|
|
**交付物**:
|
|
- `_enterChoosing()` 中 SFX_UI.choiceReady() 后追加 TTS.speak('等待回复')
|
|
|
|
**测试case**:
|
|
1. 播放完 NPC 语音进入选择 → 听到 "叮" + TTS "等待回复"
|
|
2. 快速双击跳过 → TTS 被中断,不卡住
|
|
|
|
---
|
|
|
|
### G6: 结局语音化 — engine.js
|
|
|
|
**现状**: 结局使用 `_showCaption(text)` 显示视觉文字(与零视觉设计矛盾)
|
|
**目标**: 结局台词通过 TTS 朗读(后续替换为预录音频)
|
|
|
|
**交付物**:
|
|
- `_endingA/B/C/D/E` 中 `_showCaption(text)` → `TTS.speak(text)`(保留 caption 作为补充)
|
|
- 结局 E 周南语音播完后 TTS 说 "好"
|
|
|
|
**测试case**:
|
|
1. 触发结局 A → 听到水壶声 + TTS "明天再说"
|
|
2. 触发结局 D → 听到鸟鸣声 + TTS "早上好"
|
|
3. 触发结局 E → 周南语音 + TTS "好"
|
|
4. TTS 不可用时 → caption 仍然显示(降级方案)
|
|
|
|
---
|
|
|
|
### G7: 内容安全 — engine.js + index.html
|
|
|
|
**现状**: 无内容预警和求助信息
|
|
**目标**: 游戏开始前播报内容预警,结局后显示心理支持热线
|
|
|
|
**交付物**:
|
|
- `start()` 开头:TTS 播报 "本游戏涉及孤独、家庭关系等情感话题,请在舒适的状态下体验"
|
|
- 结局播完后:TTS 播报 "如需倾诉,全国心理援助热线 400-161-9995"
|
|
- index.html 开始页添加内容预警文字
|
|
|
|
**测试case**:
|
|
1. 游戏启动 → 先听到内容预警,再开始环境音
|
|
2. 任意结局完成后 → 听到热线播报
|
|
3. 开始页可见内容预警文字
|
|
|
|
---
|
|
|
|
### G8: 分支补全 — story.js
|
|
|
|
**现状**: MSG-10/11 follow-up 缺少沉默(down)选项
|
|
**目标**: 补全所有未闭合分支
|
|
|
|
**交付物**:
|
|
- MSG-10 right follow-up: 添加 down(沉默) 选项
|
|
- MSG-10 up follow-up: 添加 down(沉默) 选项
|
|
- MSG-11 up follow-up: 添加 down(沉默) 选项
|
|
|
|
**测试case**:
|
|
1. MSG-10 温暖回复后 → 可选右滑/上滑/下滑(沉默)
|
|
2. MSG-10 追问后通话 → 可选右滑/上滑/下滑(沉默)
|
|
3. MSG-11 追问后 → 可选右滑/左滑/下滑(沉默)
|
|
|
|
---
|
|
|
|
### G9: 操作指南更新 — index.html
|
|
|
|
**现状**: 开始页操作说明缺少长按和安全手势
|
|
**目标**: 补充完整操作说明
|
|
|
|
**交付物**:
|
|
- 添加 "播放中" 长按重播说明
|
|
- 添加 "随时可用" 安全手势分组(两指长按暂停、三指点击退出)
|
|
|
|
**测试case**:
|
|
1. 开始页显示完整操作说明,含长按和安全手势
|
|
|
|
---
|
|
|
|
## 二、音频制作任务(需 VoxCPM2 服务)
|
|
|
|
### A1: 结局旁白音频
|
|
|
|
**现状**: 结局台词无预录音频,依赖 TTS
|
|
**目标**: 用林夏声线生成 5 条结局旁白
|
|
|
|
**交付物** (5 个 MP3):
|
|
| 文件名 | 台词 |
|
|
|---------|------|
|
|
| `v2_ending_a_linxia_wav_v1.mp3` | "明天再说。" |
|
|
| `v2_ending_b_linxia_wav_v1.mp3` | "寄出去了。" |
|
|
| `v2_ending_c_linxia_wav_v1.mp3` | "今晚就这样。" |
|
|
| `v2_ending_d_linxia_wav_v1.mp3` | "早上好。" |
|
|
| `v2_ending_e_linxia_wav_v1.mp3` | "好。" |
|
|
|
|
**测试case**:
|
|
1. 每个文件 < 3s,采样率 24kHz+,音色一致
|
|
2. 语气匹配情境(A 疲惫温柔、D 平静、E 轻快)
|
|
|
|
---
|
|
|
|
### A2: 系统提示音频
|
|
|
|
**现状**: 无系统提示预录音频
|
|
**目标**: 生成游戏流程中的系统语音提示
|
|
|
|
**交付物** (4 个 MP3):
|
|
| 文件名 | 台词 |
|
|
|---------|------|
|
|
| `v2_sys_wait_reply_wav_v1.mp3` | "等待回复" |
|
|
| `v2_sys_paused_wav_v1.mp3` | "游戏已暂停。单击继续,三指点击退出" |
|
|
| `v2_sys_content_warning_wav_v1.mp3` | "本游戏涉及孤独、家庭关系等情感话题,请在舒适的状态下体验" |
|
|
| `v2_sys_hotline_wav_v1.mp3` | "如需倾诉,全国心理援助热线 400-161-9995" |
|
|
|
|
**测试case**:
|
|
1. 音色使用林夏声线,语速适中
|
|
2. 暂停提示 < 5s,内容预警 < 8s
|
|
|
|
---
|
|
|
|
### A3: 新增分支台词音频
|
|
|
|
**现状**: MSG-10/11 补全的 down 分支缺音频
|
|
**目标**: 生成沉默后 NPC 反应音频
|
|
|
|
**交付物** (3 个 MP3):
|
|
| 文件名 | 角色 | 台词 |
|
|
|---------|------|------|
|
|
| `v2_msg10_rw_react_silent_wav_v1.mp3` | 妈妈 | "那早点睡啊。" |
|
|
| `v2_msg10_call_react_down_wav_v1.mp3` | 妈妈 | "……没事就好。早点睡。" |
|
|
| `v2_msg11_r3_react_silent_wav_v1.mp3` | 阿哲 | "行吧,那我不来了。" |
|
|
|
|
**测试case**:
|
|
1. 音色与对应角色现有音频一致
|
|
2. 语气自然,符合上下文
|
|
|
|
---
|
|
|
|
### A4: MSG-16 后期处理
|
|
|
|
**现状**: seg5-6 是奶奶无声电话的描述段,需要电话底噪叠加
|
|
**目标**: 与 MSG-08 未知号码呼吸声使用匹配的底噪
|
|
|
|
**交付物**:
|
|
- `lv11_0200_mom_voice_01_seg5_wav_v1.mp3` 叠加电话底噪
|
|
- `lv11_0200_mom_voice_01_seg6_wav_v1.mp3` 叠加电话底噪
|
|
|
|
**测试case**:
|
|
1. seg5-6 可听到轻微电话底噪(与 MSG-08 sfx_breathing_unknown_v1.mp3 风格匹配)
|
|
2. 底噪不盖过妈妈说话声(底噪 -18dB 以下)
|
|
|
|
---
|
|
|
|
## 三、执行顺序
|
|
|
|
```
|
|
阶段一(代码 — 立即执行):
|
|
G1 → G2 → G3/G4/G5 → G6 → G7 → G8 → G9
|
|
|
|
阶段二(音频 — 需 VoxCPM2):
|
|
A1 → A2 → A3 → A4
|
|
|
|
阶段三(集成):
|
|
结局音频替换 TTS → 系统提示音替换 TTS → 回归测试
|
|
```
|