Files
blind/other_docs/gdd/redesign_v2.md
T
2026-05-24 10:40:33 +08:00

29 KiB
Raw Blame History

《林夏》重构设计文档 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 14 段醉酒语音,断断续续):

  • "林夏……我跟你说个事"
  • "阿哲那个人……大三的时候追过我"
  • "但我没答应他……因为我知道你喜欢他"
  • "我到现在都没跟你说……对不起"
方向 林夏说 小美反应 效果
右滑 "小美……你没事吧。" "我没事……我就是喝多了想告诉你……你别怪我。" [哭] 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:林夏说话中(播放林夏语音 + 打字/发送音效)
  • reactingNPC 反应播放中

数据结构变更

// 每条消息的 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: { ... },
}

对话流程伪代码

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 种手势,含义一致