Files
blind/gdd/redesign_v2.md
T
2026-05-19 00:34:23 +08:00

584 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 《林夏》重构设计文档 v2
## 一、问题诊断
### 问题1:主角是哑巴
玩家听完 NPC 语音 → 滑动选择 → 什么声音都没有 → 直接跳到下一个人。
林夏在整个游戏中没有"说过一句话"。玩家的操作没有任何可听到的结果。
这不是互动,这是单方面的被动收听。
### 问题2:选择没有区别
温暖/冷淡/追问/沉默 → 改变了一个隐形的分数 → 同样的流程 → 下一条消息。
玩家听不到、感受不到任何区别。四个方向滑动在体验上完全一样。
选择只有在产生可感知的不同后果时才有意义。
### 根本原因
游戏缺少**对话的第二段**。真正的对话是:
```
她说 → 我答 → 她对我的回答做出反应
```
当前的游戏只有第一段。缺少"我答"和"她的反应"。
## 二、核心设计理念
### 一句话总结
**每次选择都必须产生玩家能听到的、不同的后果。**
### 三个原则
1. **林夏必须有声音**
玩家做出选择后,林夏要说话(或沉默——但沉默本身也要被对方感知到)。
2. **NPC 必须对林夏的回应做出反应**
温暖的回应 → NPC 继续说,说得更多更深。
冷淡的回应 → NPC 尴尬地收住,对话很快结束。
追问 → NPC 透露新信息(你在其他路径听不到)。
沉默 → NPC 感受到沉默,可能追问、可能放弃。
3. **不同的路径 = 不同的内容**
玩家选温暖和选冷淡,应该听到完全不同的音频。
不是"播同一段然后改个隐藏分数",而是真正不同的声音。
## 三、交互模型
### 手势(保持 6 种,不变)
| 手势 | 全局含义 |
|--------|------------|
| 单击 | 接受/回应/继续 |
| 双击 | 跳过/忽略 |
| 右滑 | 温暖/靠近 |
| 左滑 | 冷淡/推开 |
| 上滑 | 好奇/追问 |
| 下滑 | 沉默/退缩 |
### 新的对话流程
```
┌─────────────────────────────────────────────────┐
│ [提示音 + 震动] │
│ 消息到达 │
│ → 单击播放 / 双击跳过 │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ NPC 语音播放(Round 1
│ "你被甩了我都听说了,明天陪你喝酒" │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ [选择提示音] │
│ 等待玩家操作 │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ [打字音效 ~1秒] │
│ [发送音效] │
│ 林夏的语音播放 │
│ 右滑 → "好啊,明天不见不散。" │
│ 左滑 → "再说吧。" │
│ 上滑 → "你怎么知道的啊?" │
│ 下滑 → [一秒沉默] │
│ 单击 → "嗯。" │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ NPC 反应播放(Round 2)—— 因选择而异 │
│ │
│ 右滑路径: "行!那我叫上安安!老地方见!" │
│ 左滑路径: "……好吧,你休息。" │
│ 上滑路径: "还不是阿哲那个大嘴巴告诉我的……" │
│ 下滑路径: "??你还活着吗哈哈。算了不打扰你了" │
│ 单击路径: "嗯是什么意思啊哈哈!行吧你休息" │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ [可选] Round 3: 继续对话(仅追问路径) │
│ "阿哲到处跟人说你们分手的事……" │
│ → 再次选择 → 林夏回应 → 对话结束 │
└──────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ [过渡音效] → 等待 → 下一条消息 │
└─────────────────────────────────────────────────┘
```
### 关键区别
| 方面 | 旧版 | 新版 |
|-----------|------------------------|-------------------------------|
| 林夏的声音 | 无 | 每次选择后都有语音 |
| NPC 反应 | 无,直接跳到下一条 | 根据选择播放不同的反应语音 |
| 选择的感受 | 四个方向一样 | 四个方向各自导向不同的音频内容 |
| 对话长度 | 固定(听完就完) | 温暖/追问路径更长,冷淡/沉默更短 |
| 信息量 | 固定 | 追问路径可以获得独家信息 |
## 四、林夏的声音设计
### 设计原则
林夏是一个 24 岁的女生,今晚经历了分手+失业+家庭压力。
她的声音应该是:**疲惫但清醒、克制但有温度、年轻但不幼稚。**
### 语音类型
#### A. 通用短句(可跨消息复用)
| 编号 | 情感方向 | 台词 | 时长 | 复用场景 |
|------|---------|---------------|--------|-----------------|
| G01 | 单击 | "嗯。" | 0.5s | 任何简单回应 |
| G02 | 单击 | "好。" | 0.5s | 同意类 |
| G03 | 温暖 | "嗯~好啊。" | 1s | 接受邀约 |
| G04 | 温暖 | [轻笑] | 1s | 轻松回应 |
| G05 | 冷淡 | "知道了。" | 0.8s | 敷衍回应 |
| G06 | 冷淡 | "行吧。" | 0.6s | 不情愿同意 |
| G07 | 追问 | "嗯?" | 0.5s | 想听更多 |
| G08 | 追问 | "然后呢?" | 0.8s | 催促继续 |
| G09 | 沉默 | [轻呼吸] | 1.5s | 说不出口 |
| G10 | 沉默 | [沉默+叹气] | 2s | 无力回应 |
#### B. 场景专属台词(每条消息独有)
每条有选择的消息需要 3-5 条林夏专属台词,详见第五节。
### 录制要求
- 同一个声优录制所有林夏的台词
- 录音环境安静(模拟深夜卧室发语音的感觉)
- 情绪基调:不是哭,不是崩溃,是一种**撑着的疲惫**
- 总量估算:通用 10 条 + 专属 ~40 条 = **约 50 条短语音,总时长约 2 分钟**
## 五、16 条消息重新设计
> 每条消息标注:NPC 说什么(Round 1)→ 玩家选择 → 林夏说什么 → NPC 怎么反应(Round 2
> 追问路径可能延伸到 Round 3。
---
### MSG-01 妈妈 · 电话
**类型**:来电
**Round 1**(接听后):妈妈说"今晚煮了你爱吃的排骨,你什么时候回来呀。"
**接听后无选择**——这是第一通电话,让玩家熟悉"接电话 → 听完"的流程。
通话结束后,林夏轻轻说一句"嗯……好。"(自动播放,不需选择)
**不接** → 直接跳到下一条。妈妈的来电未接。
**状态**:接听 → MOM_LINK = true
---
### MSG-02 小美 · 微信语音 ×3(教学关)
**Round 1**:小美连发三条语音:
- "林夏!你还活着吗!"
- "你被甩了我都听说了——别难过啊"
- "明天陪你喝酒,去不去"
**选择 + Round 2**
| 方向 | 林夏说 | 小美反应 | 效果 |
|------|--------------------------|-----------------------------------------------|--------------|
| 右滑 | "好啊,明天不见不散。" | "行!那我叫上安安!老地方见!别放鸽子啊!" | engagement+2 |
| 左滑 | "再说吧。" | "……好吧。你要是改主意了随时说。" | avoidance+1 |
| 上滑 | "你怎么知道的啊?" | "还不是阿哲自己发朋友圈!你不知道吗?他发了又秒删……" | engagement+1, **独家信息** |
| 下滑 | [沉默 2s] | "??你还活着吗哈哈。好了不烦你了,有事找我。" | avoidance+2 |
| 单击 | "嗯。" | "嗯是什么意思啊哈哈!行吧你休息。" | engagement+0 |
**追问路径 Round 3**(上滑后):
小美说完"他发了又秒删" → 选择提示音
- 右滑 → 林夏:"他……发了什么?" → 小美:"就发了一张你们以前的照片,配了一句'值得'。两分钟就删了" → **独家信息**
- 其他 → 对话结束
---
### MSG-03 外卖小哥 · 电话
**类型**:来电
**Round 1**:外卖小哥:"你好,你的麻辣烫到了,在楼下。"
**接听后自动**:林夏说"好,我下来拿。"(无选择)
**不接** → 漏接。
*设计意图*:日常感。即使世界在崩塌,外卖还是要拿。
---
### MSG-04 阿哲 · 微信语音
**Round 1**:阿哲说"那个……我的 AirPods 好像落你那了,方便帮我寄一下吗?"
| 方向 | 林夏说 | 阿哲反应 | 效果 |
|------|--------------------------|---------------------------------------------|-------------------|
| 右滑 | "你那边……还好吗。" | "我……挺好的。" [停顿] "你呢?" | engagement+2 |
| 左滑 | "知道了。明天寄。" | "嗯……谢了。" | HE_BACK=false, avoidance+1 |
| 上滑 | "你怎么不自己来拿。" | "我……不太方便过去。" [欲言又止] | engagement+2 |
| 下滑 | [沉默 3s] | [等了5秒] "那……我晚点再说吧。" → (10秒后阿哲撤回消息) | HE_BACK=null, avoidance+2 |
| 单击 | "好。" | "谢谢。" | HE_BACK=false, engagement+1 |
**右滑 Round 3**(阿哲问"你呢?"后):
- 右滑 → 林夏:"不太好。" → 阿哲:"……对不起。" [然后挂断般的沉默]
- 左滑 → 林夏:"挺好的。" → 阿哲:"那就好。" [敷衍,对话结束]
- 下滑 → [沉默] → 阿哲:"……那,晚安。"
**上滑 Round 3**(阿哲说"不太方便"后):
- 上滑 → 林夏:"为什么。" → 阿哲:"我……" [长停顿] "没什么。你寄吧。" → HE_BACK=false
- 右滑 → 林夏:"算了,不问了。" → 对话结束
---
### MSG-05 HR王姐 · 微信语音
**Round 1**:王姐说"小夏,离职流程周三前办完就行。别有压力。"
| 方向 | 林夏说 | 王姐反应 | 效果 |
|------|---------------------------|--------------------------------------------------|--------------|
| 右滑 | "谢谢王姐。" | "别客气。你还年轻,出去看看也好。这行业你知道的。" | engagement+1 |
| 左滑 | "好的,知道了。" | [无反应,对话结束] | avoidance+0 |
| 上滑 | "王姐……有什么建议吗?" | "你想听真话?别在这行耗了。你有本事,去试试别的。" → **独家** | engagement+2 |
| 下滑 | [沉默] | [无反应,对话结束] | avoidance+1 |
| 单击 | "好。" | [无反应,对话结束] | engagement+0 |
---
### MSG-06 安安 · 微信语音
**Round 1**:安安在酒吧里大喊:"我在 Helens!快来!今天 happy hour"(背景很吵)
| 方向 | 林夏说 | 安安反应 | 效果 |
|------|---------------------------|------------------------------------------------|--------------|
| 右滑 | "在哪儿啊?我看看吧。" | "对面那个!我给你留了位置!赶紧赶紧!" | engagement+2 |
| 左滑 | "不了,你们玩好。" | "好吧!那我给你寄一杯!" [大笑] | avoidance+0 |
| 上滑 | "你喝了多少了?" | "才两杯!我清醒得很!……好吧三杯。快来!" | engagement+1 |
| 下滑 | [沉默] | "喂?信号不好吗?好吧以后再约!" | avoidance+1 |
| 单击 | "嗯。" | "嗯是来还是不来啊!算了回头聊!" | engagement+0 |
---
### MSG-07 大学寝室群 · 5条语音
**Round 1**:群消息连续播放:
- 室友A"我升主管了!!!"
- 室友A"请你们吃饭!!"
- 室友B"我的天!恭喜!!"
- 室友B"必须喝一个!"
- 室友C"@林夏 你也来吧"
| 方向 | 林夏说 | 群里反应 | 效果 |
|------|--------------------------|------------------------------------------------|-------------------|
| 右滑 | "恭喜恭喜!太厉害了!" | 室友A:"哈哈谢谢!我请客!你最近怎么样啊?" | GROUP_REPLY, engagement+2 |
| 左滑 | "恭喜。" | [群里继续聊别的,没人注意到你的冷淡] | avoidance+1 |
| 上滑 | "怎么升的啊?讲讲!" | 室友A:"说来话长!我们老板走了我就顶上了哈哈" → **信息** | GROUP_REPLY, engagement+2 |
| 下滑 | [沉默,不回群] | [群里继续热闹,但渐渐没人@你了] | avoidance+2 |
| 单击 | [发一个表情] | 室友B"林夏发表情了哈哈" | GROUP_REPLY, engagement+0 |
**右滑 Round 3**(室友A 问"你最近怎么样"后):
- 右滑 → 林夏:"挺好的~你请客我去!" → 室友们欢呼
- 左滑 → 林夏:"还行。" → 室友B:"你是不是有事啊?没事可以跟我们说" → **关心**
- 下滑 → [沉默] → 对话自然结束
---
### MSG-08 未知号码 · 电话(悬疑)
**类型**:来电
**接听后**:只有呼吸声,6 秒后自动挂断。然后心跳音效。
**无选择**——悬疑钩子。
**不接** → 未接来电,号码显示"未知"。
---
### MSG-09 小美(醉)· 语音
**BGM 切换为悬疑风格**
**Round 1**4 段醉酒语音,断断续续):
- "林夏……我跟你说个事"
- "阿哲那个人……大三的时候追过我"
- "但我没答应他……因为我知道你喜欢他"
- "我到现在都没跟你说……对不起"
| 方向 | 林夏说 | 小美反应 | 效果 |
|------|----------------------------|-----------------------------------------------|-------------------|
| 右滑 | "小美……你没事吧。" | "我没事……我就是喝多了想告诉你……你别怪我。" [哭] | engagement+2 |
| 左滑 | "我知道了。" | [沉默 3 秒] → 小美撤回了刚才的语音 | avoidance+1 |
| 上滑 | "你……为什么现在才说。" | "因为你今天……我怕你以后恨我……" → **深入** | engagement+2 |
| 下滑 | [沉默] | [10 秒后] 小美撤回了刚才的语音 | avoidance+2, nostalgia+1 |
| 单击 | "嗯。" | "你不生气吗?" [等 3 秒] "算了……当我没说" | nostalgia+1 |
**上滑 Round 3**(小美说"怕你恨我"后):
- 右滑 → 林夏:"我不恨你。" → 小美 [大哭]:"谢谢你……谢谢你林夏"
- 左滑 → 林夏:"我得想想。" → 小美:"好……对不起" → 对话结束
- 下滑 → [沉默] → 小美:"你还在吗?" → [长沉默] → 小美撤回
---
### MSG-10 妈妈 · 文字消息
**Round 1**:消息到达提示音。短暂停顿后,TTS 朗读三个字——"睡了吗?"
| 方向 | 林夏说 | 妈妈反应 | 效果 |
|------|----------------------------|----------------------------------------------|--------------------|
| 右滑 | "没有,怎么了?" | 妈妈发语音:"没事,就是想起来问一下。今天怎么样?" | MOM_LINK, engagement+2 |
| 左滑 | "嗯,要睡了。" | 妈妈发文字:"好,早点睡。"TTS | MOM_LINK, avoidance+1 |
| 上滑 | "妈……你能打电话给我吗?" | [电话铃响] 妈妈打来了!→ 接听后妈妈说"怎么了夏夏?" | MOM_LINK, engagement+3 |
| 下滑 | [不回复] | [30 秒后] 妈妈发文字:"看到了回一下。"TTS | avoidance+2 |
| 单击 | "嗯。" | 妈妈发文字:"嗯就是睡了?晚安。"TTS | MOM_LINK |
**上滑路径**(妈妈打来电话后):
这是一通真正的电话。妈妈说"怎么了夏夏?你声音不对。"
- 右滑 → 林夏:"没什么……就是有点累。" → 妈妈:"累了就回家歇几天。妈煮了排骨。"
- 上滑 → 林夏:"妈,我辞职了。" → 妈妈 [沉默 2 秒]:"辞了就辞了。回来再说。"
- 下滑 → [沉默,只有呼吸] → 妈妈:"不想说就不说。妈在这呢。"
**右滑路径**(妈妈问"今天怎么样"后):
- 右滑 → 林夏:"还好。" → 妈妈:"那就好。别太晚了。"
- 上滑 → 林夏:"不太好。" → 妈妈:"怎么了?" → [可继续展开]
---
### MSG-11 阿哲 · 电话(关键分支)
**类型**:来电
**Round 1**(接听后):阿哲说"那个……AirPods 的事,我能过去拿吗?就 5 分钟。"
| 方向 | 林夏说 | 阿哲反应 | 效果 |
|------|-------------------------|------------------------------------------|-----------------|
| 右滑 | "可以。但只有 5 分钟。" | "好,我马上过来。谢谢。" → [挂断] | HE_BACK=true |
| 左滑 | "不方便。我明天寄给你。" | "好吧……那谢了。" → [挂断] | HE_BACK=false |
| 上滑 | "为什么非要今天来?" | "我……明天要出差。" [停顿] "就 5 分钟。" | 继续选择 |
| 下滑 | [沉默 → 挂断音] | [电话断了] | HE_BACK=false |
| 单击 | "不了。" | "好。" → [挂断] | HE_BACK=false |
**如果 HE_BACK=true** → 消息 12 之前插入门铃声 + 敲门声
---
### MSG-12 周南 · 微信语音
**Round 1**:周南说"林夏,是我,周南。初三坐你后桌那个。好久没联系了,今天突然想到你。"
| 方向 | 林夏说 | 周南反应 | 效果 |
|------|----------------------------|--------------------------------------------------|---------------------|
| 右滑 | "周南!你还记得我啊!" | "当然记得。你是我们班最安静的那个。" [轻笑] | ZHOUNAN_DEPTH+1, engagement+2 |
| 左滑 | "嗯,你好。" | "嗯……好久不见。你现在在哪呢?" | ZHOUNAN_DEPTH+1, nostalgia+1 |
| 上滑 | "你怎么有我微信的?" | "你忘了吗?毕业那天你加的我。不过你可能早忘了哈哈。" | ZHOUNAN_DEPTH+1, nostalgia+2 |
| 下滑 | [沉默] | "你是不是不记得我了?没关系的。就是突然想说声嗨。" | nostalgia+1 |
| 单击 | "嗯……好久不见。" | "是啊,好久不见。" | ZHOUNAN_DEPTH+1 |
---
### MSG-13 周南 · 长语音 ×4
**BGM 切换为周南主题**
**Round 1**(四段语音,讲他的十年):
- "高考那年我没考好,去复读了"
- "后来上了个二本,学了个不喜欢的专业"
- "毕业回了老家,在我爸店里帮忙"
- "今年刚来北京出差……今天是我生日"
| 方向 | 林夏说 | 周南反应 | 效果 |
|------|---------------------------|--------------------------------------------------|----------------------|
| 右滑 | "一个人在北京,还好吗?" | "还行吧。习惯了。你呢?你在北京过得好吗?" | ZHOUNAN_DEPTH+1, engagement+2 |
| 左滑 | "你讲了好多。" | "是吗?不好意思,话太多了。" [轻笑] | ZHOUNAN_DEPTH+1, nostalgia+1 |
| 上滑 | "……生日快乐。" | [沉默 2 秒] "谢谢你。你是今天第一个跟我说的。" | ZHOUNAN_DEPTH+1, ZHOUNAN_SHARE, nostalgia+2 |
| 下滑 | [沉默] | "不好意思突然说这么多……那,晚安。" | avoidance+1 |
| 单击 | "嗯,我都听到了。" | "嗯。谢谢你听我说。" | ZHOUNAN_DEPTH+1 |
**右滑 Round 3**(周南问"你在北京过得好吗"后):
- 右滑 → 林夏:"不太好。今天也是我的坏日子。" → 周南:"那我们算是难兄难妹了。" [轻笑] → **ZHOUNAN_SHARE**
- 左滑 → 林夏:"还行吧。" → 周南:"那就好。"
- 上滑 → 林夏:"你为什么突然联系我?" → 周南:"因为……今天生日嘛,想起以前的事。想起你。"
---
### MSG-14 妈妈 · 第二次电话
**类型**:来电
**Round 1**:妈妈说"夏夏,你不接电话我有点担心。你还好吗?"
接听后 → 林夏自动说"嗯,我没事。"
妈妈:"真的没事?" → 短暂停顿
- 如果之前 MOM_LINK=true"好。那早点睡。妈爱你。"
- 如果之前 MOM_LINK=false:"你今天怎么都不理妈妈?出什么事了吗?" → 玩家可选择
**状态**:接听 → MOM_LINK=true
---
### MSG-15 时光胶囊 · 系统通知
**特殊消息**:系统提示音 + "3 年前的今晚,你给自己录过一段备忘录。"
- 单击播放 → 根据玩家画像播放不同版本 → SELF_RECORD=true
- 双击跳过 → avoidance+2
*无选择交互。这条消息是独白时刻。*
---
### MSG-16 妈妈 · 长语音(结局前奏)
**条件**MOM_LINK=true 时播放
**8 段语音**:妈妈讲她 24 岁那年的故事——1995 年在广州被辞退、被甩、外婆每天打电话问"吃了吗"。
*无选择交互。这是全游戏最长的独白,让玩家安静听完。*
播放结束 → 触发结局判定。
## 六、情感反馈系统
### 环境音随情感变化
游戏底层跑着环境音轨。根据玩家的累计 profile 分数,环境音逐渐变化:
| 倾向 | 环境音特征 | 过渡时机 |
|------------|-------------------------------|-----------------|
| engagement | 柔和雨声、远处隐约的音乐、温暖感 | 每 3 条消息检查 |
| avoidance | 安静、时钟滴答、偶尔远处车声 | 每 3 条消息检查 |
| nostalgia | 梦幻混响、远处风铃、slightly reverb | 每 3 条消息检查 |
### 对话节奏随情感变化
| 玩家倾向 | 消息间隔 | 说明 |
|-------------|-----------|--------------------------|
| 多次温暖/追问 | 较短(1.5s)| 夜晚感觉充实,消息来得快 |
| 多次冷淡/沉默 | 较长(3-4s)| 空虚感,等待的时间更长 |
## 七、结局系统(不变,但感受更强)
5 个结局的触发条件保持不变。但因为整个游戏中玩家做了大量有感知的选择,到达结局时会更有"是我导致了这个结局"的感觉。
| 结局 | 条件 | 描述 |
|-----|---------------------------|-------------|
| A | MOM_LINK + SELF_RECORD | 明天再说 |
| B | HE_BACK=false + ZHOUNAN≥1 | 寄出 |
| C | 全部已读 + 回复≤2 | 今晚就这样 |
| D | UNREAD≥8 | 早上好 |
| E | ZHOUNAN≥2 + SHARE + profile | 好 |
## 八、音频资产需求清单
### 林夏语音
| 类别 | 数量 | 平均时长 | 总时长 |
|--------------|---------|---------|------------|
| 通用短句 | 10 条 | 1s | ~10s |
| 消息专属台词 | ~45 条 | 2s | ~90s |
| **合计** | **~55 条** | | **~100s** |
### NPC 反应语音(Round 2 & 3
| 角色 | 条数 | 总时长估算 |
|---------|---------|----------|
| 小美 | 10 条 | ~40s |
| 阿哲 | 8 条 | ~30s |
| 王姐 | 3 条 | ~10s |
| 安安 | 5 条 | ~15s |
| 寝室群 | 8 条 | ~30s |
| 妈妈 | 10 条 | ~40s |
| 周南 | 10 条 | ~40s |
| **合计** | **~54 条** | **~205s** |
### 总计新增音频
- 林夏 ~55 条,~100 秒
- NPC 反应 ~54 条,~205 秒
- **总计约 109 条语音,约 5 分钟录制量**
### UI 音效(合成,无需录制)
保持现有合成音效方案:notify, choiceReady, choiceWarm, choiceCold, choiceCurious, choiceSilent, skip, next, ending。
新增:
- `typing`:打字/录音音效(1-2 秒,合成或使用现有 sfx_keyboard
- `send`:发送音效(极短,合成)
## 九、技术实现概要
### 新状态机
```
idle → notification/ringing → playing → choosing → responding → reacting → [choosing | idle]
```
新增两个状态:
- **responding**:林夏说话中(播放林夏语音 + 打字/发送音效)
- **reacting**NPC 反应播放中
### 数据结构变更
```javascript
// 每条消息的 choices 结构
choices: {
right: {
linxia: 'audio/linxia/msg02_warm.mp3', // 林夏的回应
npcReact: ['audio/xiaomei/msg02_react_warm.mp3'], // NPC 的反应
state: { ... },
profile: { engagement: 2 },
followUp: { // 可选:Round 3 继续对话
audio: ['audio/xiaomei/msg02_followup.mp3'],
choices: { ... } // 递归结构
}
},
left: { ... },
up: { ... },
down: { ... },
tap: { ... },
}
```
### 对话流程伪代码
```javascript
async _handleChoice(dir) {
const choice = this.currentMsg.choices[dir];
// 1. 播放情感音效
SFX_UI[emotionSfx[dir]]();
// 2. 打字/发送音效
this.state = 'responding';
await Snd.playFXAsync('typing', 1000);
Snd.playFXOnce('send');
// 3. 播放林夏的回应
if (choice.linxia) {
await Snd.playVoiceAsync([choice.linxia]);
} else {
await sleep(1500); // 沉默
}
// 4. 播放 NPC 反应
if (choice.npcReact) {
this.state = 'reacting';
await Snd.playVoiceAsync(choice.npcReact);
}
// 5. 如果有后续对话
if (choice.followUp) {
this.currentMsg = choice.followUp;
this.state = 'playing';
await Snd.playVoiceAsync(choice.followUp.audio);
if (choice.followUp.choices) {
this.state = 'choosing';
return; // 等待下一次选择
}
}
// 6. 推进到下一条
this._proceedToNext();
}
```
## 十、总结
| 维度 | 旧版 | 新版 |
|-----------|--------------------|---------------------------------|
| 林夏的存在感 | 隐形 | 有声音、有性格、有情绪变化 |
| 选择的感受 | 四个方向一样 | 听到完全不同的对话和反应 |
| 对话深度 | 单轮 | 2-3 轮,追问路径可获独家信息 |
| 情感反馈 | 无 | 环境音变化 + 对话节奏变化 |
| 新增录音量 | — | ~5 分钟(109 条短语音) |
| 交互复杂度 | 不变 | 6 种手势,含义一致 |