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