docs(new8): 批次 2/3 策划全套落地(17-abyss/18-detective/19-cipher/20-teahouse 主设计+台词表,含 13 号断言登记)
- abyss:声呐双通道仲裁/氧气软失败经济 512 组合穷举/148 句;detective:证词矛盾数据单源推导/158 句;cipher:摩尔斯运行时合成/暴露度经济/139 句;teahouse:泡茶三步小局听觉分层/5 晚经济逐晚验算/163 句 - 全部内化批次 1 教训(教学承诺兑现/双轨看门狗/档位措辞真实/结算死窗/键盘变体标注)
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
# 20b · 《深夜茶馆》语音台词表(voice ids,录音依据)
|
||||
|
||||
> **给音频总监的录制说明**
|
||||
> - **旁白双性别组**(98 句):旁白只做系统/指引/教学/状态/账目/氛围客人转述,**不念客人台词**。落 `web/teahouse/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
|
||||
> - female = `Serena`,instruct 常量:`温润平和的女声,深夜茶馆掌柜,从容安稳,像守着一炉将开的水`
|
||||
> - male = `Uncle_Fu`,instruct 常量:`低沉温润的男声,深夜茶馆掌柜,从容安稳,像守着一炉将开的水`
|
||||
> - 两常量全表统一(含教学/泡茶/账目/置办),禁止句级变体、禁语速词(引擎 SoundTouch 变速)。
|
||||
> - **NPC 平铺组**(65 句):弧线客人台词=NPC 平铺单音色、**不做双性别**,落 `web/teahouse/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中)。说话人 5 个(≤6 上限);**氛围客人(邮差/绣娘/醉客)零 NPC 句**,由旁白转述(amb_1..3)——成本与区分度双省。区分度风险逐人标注:
|
||||
> | 角色 | speaker | instruct 常量 | 区分度风险 |
|
||||
> |---|---|---|---|
|
||||
> | 老周(58 岁修车师傅) | `Eric` | `沙哑洪亮的男声,修车铺老师傅,大嗓门,直爽热乎` | 低 |
|
||||
> | 苏晚(29 岁夜班护士) | `Vivian` | `轻柔平稳的女声,夜班护士,温和疲惫,吐字干净` | 低 |
|
||||
> | 陈拾(17 岁高三生) | `Dylan` | `年轻清亮的男声,高三学生,紧张,语速快,有点怯` | 低 |
|
||||
> | 白老先生(74 岁) | `Uncle_Fu` | `苍老缓慢的男声,独居老先生,慢条斯理,带茶韵` | **中**:与 male 旁白同 speaker——sig_bai 前缀+苍老腔+人称差(客人第一人称/旁白第三人称),试听确认 |
|
||||
> | 何雨眠(36 岁的姐) | `Serena` | `低哑爽利的女声,夜班出租车司机,利落,带笑带倦` | **中**:与 female 旁白同 speaker——sig_he 前缀+人称差+句间 0.6s,试听确认 |
|
||||
> - **声音演技核心**:晚 2 反应句(话头展开)与晚 3 结局句(A 暖 / B 平 / C 涩 三方向)是本作表演高潮;情绪全部写在句内文本(省略号/破折号引导),instruct 恒定不变(音色漂移禁令)。
|
||||
> - **数字规避**:进度/口碑/存款/进账/晚数全部分档整句(st_guest 5 档 / st_rep 4 档 / st_purse 3 档 / close_coin 3 档 / night 6 档);**客人序号不拼接**(st_guest 整句);价钱写死在整句里(十五文/二十文/十二文)。
|
||||
> - **称呼中性**:旁白称玩家「你」;NPC 称「小掌柜/老板/师傅」(店主人称中性,旁白性别随设置变化不影响客人台词)。
|
||||
> - **多音字自查**:见文末表(已排雷:全表「还」只用 hái 义、无「血爪挨壳酽」、「重听」一律写「重新听/再听一遍」、「空落落」改「空荡荡」)。
|
||||
> - **键盘变体(V 组)**:操作提示句在 `gesture.inputMode()==='key'` 时改播 `_k` 变体(touch 回基础句);变体与基础句 id 一一对应、集中登记见文末 V 组。
|
||||
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 需新增 teahouse 行 + TEAHOUSE_NPC 平铺表);生成后 `--convert` 落盘 + `tools/check_all_assets.py` 终检(双格式配对、双性别集合一致)。
|
||||
|
||||
## G0 组 · 系统/菜单/帮助(旁白 ×10)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 菜单。单击切换,双击确认。 | 下滑呼出模态菜单 |
|
||||
| `sys_menu_resume` | 回到堂前。 | 菜单项 |
|
||||
| `sys_menu_upg` | 打烊置办。 | 菜单项(仅 CLOSE 态) |
|
||||
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
|
||||
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
|
||||
| `sys_saved` | 进度已保存。 | 存档写入后 |
|
||||
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
|
||||
| `sys_help` | 左右滑选茶,单击定下。听水声,双击提壶;滴答密,双击出汤。上滑状态,下滑菜单。 | 菜单内上滑 / 帮助项 |
|
||||
| `sys_continue_ask` | 检测到没打烊的茶馆。单击继续,右滑两次重开新店。 | 有存档进游戏(TITLE) |
|
||||
| `sys_reset_ask` | 重开新店?口碑和存款都从头来。再右滑一次,确认。 | TITLE 右滑(二次确认) |
|
||||
|
||||
## G1 组 · 开场/教学(旁白 ×17;water_*/steep_* 教学与正片共用)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `intro_1` | 巷子最深处,有一盏亮到后半夜的灯。 | 首晚开场链 1 |
|
||||
| `intro_2` | 你接手了这家茶馆。今晚,是它易主后的头一晚。 | 开场链 2 |
|
||||
| `intro_3` | 泡茶三步:选茶、候汤、出汤。手上的事,耳朵说了算。 | 开场链 3 |
|
||||
| `tut_d0` | 先看茶柜。左右滑,一罐一罐听。 | D0 前(豁免教学起点) |
|
||||
| `tut_tea` | 单击,选定这罐茶。 | D1 前 |
|
||||
| `tut_water` | 灶上坐水。听——泡泡细密的时候,双击,提壶。 | D2 前(豁免 E1 教学) |
|
||||
| `tut_steep` | 注水,闷泡。滴答声密起来,双击,出汤。 | D3 前 |
|
||||
| `tut_serve` | 茶好了。单击,端出去。 | D4 前 |
|
||||
| `tut_status` | 上滑,听今晚的局面:第几位客人,口碑如何。 | D5 前 |
|
||||
| `tut_done` | 都会了。往后每一晚,都这么泡。 | D6(教学完成) |
|
||||
| `tut_skip` | 已跳过教学。左右滑选茶,单击选定,双击动手。 | 下滑跳过教学 |
|
||||
| `water_early` | 急了,水还没醒透。这一步,偏了。 | 候汤早于窗(教学+正片) |
|
||||
| `water_ok` | 正是时候。 | 候汤入窗 |
|
||||
| `water_late` | 水滚老了。这一步,偏了。 | 候汤晚于窗/未出手 |
|
||||
| `steep_early` | 出急了,茶还睡着。这一步,偏了。 | 闷泡早于窗 |
|
||||
| `steep_ok` | 出汤,正好。 | 闷泡入窗 |
|
||||
| `steep_late` | 闷过了,汤要发苦。这一步,偏了。 | 闷泡晚于窗/未出手 |
|
||||
|
||||
## G2 组 · 状态/茶名(旁白 ×18;茶名句=每罐口诀随身播报,知识单源)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `st_guest_1` | 今晚第一位客人。 | 状态链(当前客序 1) |
|
||||
| `st_guest_2` | 今晚第二位客人。 | 客序 2 |
|
||||
| `st_guest_3` | 今晚第三位客人。 | 客序 3 |
|
||||
| `st_guest_4` | 今晚第四位客人。 | 客序 4 |
|
||||
| `st_guest_5` | 今晚第五位客人。 | 客序 5(N6+ 超员兜底) |
|
||||
| `st_rep_1` | 口碑还没立起来,街坊不知道巷子里有这家茶馆。 | 口碑 0-4(跨档播报+状态链) |
|
||||
| `st_rep_2` | 有了回头客,口碑立住脚了。 | 口碑 5-11 |
|
||||
| `st_rep_3` | 巷子口都在传你的茶,小有名气。 | 口碑 12-19 |
|
||||
| `st_rep_4` | 一盏难求,茶客口耳相传。 | 口碑 ≥20 |
|
||||
| `st_purse_1` | 钱箱见底,不到十文。 | 存款 <10 |
|
||||
| `st_purse_2` | 钱箱周转得开,不愁明日开销。 | 存款 10-24 |
|
||||
| `st_purse_3` | 手头宽裕,二十五文往上。 | 存款 ≥25 |
|
||||
| `tea_longjing` | 龙井。绿茶性鲜:水将沸就提壶,出汤要快。 | 选茶预览(初始柜) |
|
||||
| `tea_moli` | 茉莉花茶。香靠滚水激:水滚透再冲,出汤要快。 | 选茶预览(初始柜) |
|
||||
| `tea_tieguanyin` | 铁观音。乌龙要滚水才醒,闷到滴答密了再出汤。 | 选茶预览(初始柜) |
|
||||
| `tea_dianhong` | 滇红。红茶性暖,滚水冲,经得住闷,越闷越醇。 | 选茶预览(初始柜) |
|
||||
| `tea_puer` | 普洱。老茶经泡:滚水才泡得开,多闷一会儿更醇。 | 选茶预览(茶柜扩容后) |
|
||||
| `tea_yinzhen` | 白毫银针。嫩芽金贵:水将沸就提,闷到滴答密。 | 选茶预览(茶柜扩容后) |
|
||||
|
||||
## G3 组 · 泡茶衔接(旁白 ×5)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `brew_start` | 回到灶前。 | 每次进 BREW(可跳句) |
|
||||
| `res_good` | 这一盏,泡得地道。 | 判定=好茶(不可跳) |
|
||||
| `res_plain` | 这一盏,泡得中平。 | 判定=普通(不可跳) |
|
||||
| `res_wrong` | 这一盏,泡岔了——不是客人今晚要的那口。 | 判定=错茶(不可跳,真话归因) |
|
||||
| `serve_link` | 你把茶端了过去。 | 上茶转场 |
|
||||
|
||||
## G4 组 · 反应过场/氛围客人(旁白 ×9)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `bridge_good` | 客人把这盏茶喝得很慢,像是就着茶,把心事也喝顺了。 | 弧线客好茶反应句后 |
|
||||
| `bridge_plain` | 茶喝完了,客人点点头,起身。 | 普通反应后 |
|
||||
| `bridge_wrong` | 那盏茶凉在桌上,客人走的时候,没回头。 | 错茶反应后 |
|
||||
| `amb_1` | 车铃一响,晚班的邮差探进头来。老规矩:茉莉花茶,要滚烫的。 | 氛围客·邮差点单(旁白转述) |
|
||||
| `amb_2` | 门帘一挑,绣坊的阿姐收了工,想喝一盏清火的龙井。 | 氛围客·绣娘点单 |
|
||||
| `amb_3` | 巷口的醉汉扶着门框,含含糊糊,只嚷嚷要最浓的滇红。 | 氛围客·醉客点单 |
|
||||
| `amb_react_good` | 他喝得很慢,末了多搁下两文。 | 氛围客好茶(打赏 2 文) |
|
||||
| `amb_react_plain` | 他喝完,点点头,搁下茶钱。 | 氛围客普通 |
|
||||
| `amb_react_wrong` | 他抿了一口,搁下半盏,晃出去了。 | 氛围客错茶(免单) |
|
||||
|
||||
## G5 组 · 打烊/经济/置办(旁白 ×16)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `close_open` | 客人走尽了。收壶,打烊。 | 打烊链首(settle 签名同点) |
|
||||
| `close_coin_1` | 今晚进账,不到十五文。 | 当晚收入 <15 |
|
||||
| `close_coin_2` | 今晚进账,十五到二十四文。 | 收入 15-24 |
|
||||
| `close_coin_3` | 今晚进账,二十五文往上。 | 收入 ≥25 |
|
||||
| `rent_due` | 今天是房钱的日子,这一回,二十文。 | 房租夜链段(每 3 晚) |
|
||||
| `rent_ok` | 房钱交清,秦婶没多话。 | 扣款足额 |
|
||||
| `rent_short` | 房钱不够,差的那几文先记在账上。秦婶撂下一句:下回一起算。 | 扣款不足→欠账(danger 签名同点;不可跳) |
|
||||
| `debt_clear` | 旧账清了,秦婶把那一页翻了过去。 | 还清欠账 |
|
||||
| `st_debt_1` | 账上,还欠着秦婶的钱。 | 打烊链内 debt>0 时 |
|
||||
| `settle_night` | 熄了灯,这一晚就过去了。单击,睡下。 | 打烊链尾(链锁解除后单击生效;键盘态播 settle_night_k) |
|
||||
| `upg_open` | 要添置点什么?左右滑看,单击买定。 | CLOSE 菜单「打烊置办」二级列表入口 |
|
||||
| `upg_cabinet` | 茶柜扩容,十五文。往后普洱、白毫银针,都上柜。 | 置办选项 1(报价=扣款) |
|
||||
| `upg_teaware` | 添一副新茶具,十二文。手上更准,火候窗更宽。 | 置办选项 2 |
|
||||
| `upg_sign` | 立一块招牌,二十文。要口碑立得住——十二分往上才挂。 | 置办选项 3 |
|
||||
| `upg_none` | 眼下的钱和账,还置办不起。改日再说。 | 钱不够/有欠账(真话) |
|
||||
| `upg_lock` | 招牌还挂不得:口碑得十二分往上,欠账也得清。 | 招招牌条件不足(真话) |
|
||||
|
||||
## G6 组 · 看门狗/纠错/复述(旁白 ×6)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `gd_serve` | 客人还在堂前。上滑,再听一遍他要的茶。 | SERVE 无操作轨 L1(10s,full,idle-only) |
|
||||
| `gd_brew` | 还在灶上,听声动手,双击。 | BREW-TEA 无操作轨 L1(12s;时机窗内不播,只 earcon) |
|
||||
| `gd_close` | 账报完了。单击,熄灯睡下。 | CLOSE 链完无操作 L1(15s) |
|
||||
| `gd_invalid` | 这个操作,这里用不上。 | 无效手势纠错(onceKey 同局 1 次) |
|
||||
| `hint_water` | 水听两遍:泡泡细密是将沸,咕嘟连片是滚透。 | 无进展轨 L2(90s,泡茶口诀)/菜单恢复 WATER 复述 |
|
||||
| `recap_go` | 接着张罗。 | 中断复述链尾 |
|
||||
|
||||
## G7 组 · 晚数/章节(旁白 ×7)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `night_1` | 头一晚。灯亮了,水坐上,茶馆开门。 | N1 开场(lamp_light 后) |
|
||||
| `night_2` | 第二晚。老客们,已经认得这条巷子。 | N2 开场 |
|
||||
| `night_3` | 第三晚。今天,是收房钱的日子。 | N3 开场(预告房租) |
|
||||
| `night_4` | 第四晚。熟客进门,都不用问位子了。 | N4 开场 |
|
||||
| `night_5` | 第五晚。这一章的夜,快要听全了。 | N5 开场 |
|
||||
| `night_more` | 又一夜。灯还亮着,茶还热着。 | N6+ 开场(无尽营业) |
|
||||
| `chapter_end` | 第一章完。这条巷子的夜,你都听过了。茶馆的故事,还长。 | N5 打烊链内(settle_night 前) |
|
||||
|
||||
## V 组 · 键盘变体(旁白 ×10;`gesture.inputMode()==='key'` 时替代同名基础句)
|
||||
|
||||
| id | 替代基础句 | 台词全文 |
|
||||
|---|---|---|
|
||||
| `sys_help_k` | sys_help | 方向键选茶,空格定下。听水声,回车提壶;滴答密,回车出汤。上键状态,下键菜单。 |
|
||||
| `tut_d0_k` | tut_d0 | 先看茶柜。左右方向键,一罐一罐听。 |
|
||||
| `tut_tea_k` | tut_tea | 空格,选定这罐茶。 |
|
||||
| `tut_water_k` | tut_water | 灶上坐水。听——泡泡细密的时候,回车,提壶。 |
|
||||
| `tut_steep_k` | tut_steep | 注水,闷泡。滴答声密起来,回车,出汤。 |
|
||||
| `tut_serve_k` | tut_serve | 茶好了。空格,端出去。 |
|
||||
| `gd_serve_k` | gd_serve | 客人还在堂前。上键,再听一遍他要的茶。 |
|
||||
| `gd_brew_k` | gd_brew | 还在灶上,听声动手,回车。 |
|
||||
| `settle_night_k` | settle_night | 熄了灯,这一晚就过去了。按空格,睡下。 |
|
||||
| `upg_open_k` | upg_open | 要添置点什么?左右方向键看,空格买定。 |
|
||||
|
||||
## N1 组 · 老周(NPC Eric 平铺 ×13,sig_zhou 前缀;弧线=与儿子的心结)
|
||||
|
||||
| id | 台词全文 | 线索标签 |
|
||||
|---|---|---|
|
||||
| `zhou_enter` | 小掌柜!老位置,还给我留着呢吧? | 进门句(三晚复用) |
|
||||
| `zhou_o1` | 修了一天车,嗓子眼里全是机油味。就你那龙井,给我去去火。 | tea=longjing(明示,教学保送) |
|
||||
| `zhou_r1_good` | 嚯!就是这个味儿!多谢啦,小掌柜。 | 晚1 好茶反应 |
|
||||
| `zhou_r1_plain` | 嗯……还行。今天手底下,差了点意思。 | 晚1 普通 |
|
||||
| `zhou_r1_wrong` | 这是我要的龙井吗?……算了算了,凑合喝。 | 晚1 错茶 |
|
||||
| `zhou_o2` | 今天冷。来盏顶饱的、浓的,扛饿又扛冻。 | tea=dianhong(浓暖→红茶久闷) |
|
||||
| `zhou_r2_good` | 对喽,暖到脚后跟了!跟你说——我儿子今天来电话了。 | 晚2 好(话头开) |
|
||||
| `zhou_r2_plain` | 茶是茶,水是水,差点火候。儿子的事,改天再说吧。 | 晚2 普通(留白钩子) |
|
||||
| `zhou_r2_wrong` | ……今晚这盏不对。儿子的事,不说也罢。 | 晚2 错 |
|
||||
| `zhou_o3` | 今晚就想要头一回那盏。一样的,再来一份。 | tea=longjing(回环) |
|
||||
| `zhou_e_a` | 明天铺子歇一天,儿子回来帮我盘货。这盏茶,记你头上了! | 结局 A(sum≥2,暖) |
|
||||
| `zhou_e_b` | 电话里跟儿子拌了两句嘴。没事——茶还热着,日子还长。 | 结局 B(平) |
|
||||
| `zhou_e_c` | 铺子我想关了,儿子叫我过去帮工。茶馆的灯,替我多亮会儿。 | 结局 C(涩) |
|
||||
|
||||
## N2 组 · 苏晚(NPC Vivian 平铺 ×13,sig_su 前缀;弧线=夜班去留)
|
||||
|
||||
| id | 台词全文 | 线索标签 |
|
||||
|---|---|---|
|
||||
| `su_enter` | 请问……还营业吗?我刚下夜班。 | 进门句 |
|
||||
| `su_o1` | 胃里发凉,人空荡荡的。想要一盏暖的,别太冲,喝完好睡。 | tea=dianhong(暖不冲) |
|
||||
| `su_r1_good` | 好暖……像被窝里塞了个汤婆子。谢谢你。 | 晚1 好 |
|
||||
| `su_r1_plain` | 嗯,是热乎的。今晚,凑合能睡。 | 晚1 普通 |
|
||||
| `su_r1_wrong` | 这盏……有点寒。没关系,是我没说清。 | 晚1 错 |
|
||||
| `su_o2` | 今晚换个口味,想要香的。可我还得眯一会儿才接班。 | tea=moli(香+快出汤不浓) |
|
||||
| `su_r2_good` | 真香啊……今夜走了位老人,家属拉着我的手道谢。这盏茶,敬他们。 | 晚2 好 |
|
||||
| `su_r2_plain` | 茶还行。今夜病房平静,平静得累人。 | 晚2 普通 |
|
||||
| `su_r2_wrong` | 香气没出来……像我今晚的运气。算了。 | 晚2 错 |
|
||||
| `su_o3` | 最后一晚了,明天起不用值夜班。还是头一回那种,暖的。 | tea=dianhong(回环) |
|
||||
| `su_e_a` | 我调去白天班啦,还能常来。给你带我们科的喜糖。 | 结局 A |
|
||||
| `su_e_b` | 还在犹豫,夜班再值一季。好在这盏茶,够我撑到天亮。 | 结局 B |
|
||||
| `su_e_c` | 我递了辞呈,往后去哪还没想好。但今晚茶馆的灯,我记住了。 | 结局 C |
|
||||
|
||||
## N3 组 · 陈拾(NPC Dylan 平铺 ×13,sig_shi 前缀;弧线=大考)
|
||||
|
||||
| id | 台词全文 | 线索标签 |
|
||||
|---|---|---|
|
||||
| `shi_enter` | 老板……还有位子吗?我背单词,背得头疼。 | 进门句 |
|
||||
| `shi_o1` | 想喝点香的提提神,但别太浓——喝完回家还得睡,明天早读。 | tea=moli(香不浓) |
|
||||
| `shi_r1_good` | 好香!脑子清醒了。这是我攒的早饭钱……值了。 | 晚1 好 |
|
||||
| `shi_r1_plain` | 还行吧。单词它还是不进脑子。 | 晚1 普通 |
|
||||
| `shi_r1_wrong` | 有点苦……没事,我泡的方便面更苦。 | 晚1 错 |
|
||||
| `shi_o2` | 模拟考砸了,心里烧得慌。想喝口最清火的。 | tea=longjing(清火→绿) |
|
||||
| `shi_r2_good` | 凉丝丝的,火气下去一半。老板,你说我还能考上吗?……算了,当我没问。 | 晚2 好 |
|
||||
| `shi_r2_plain` | 茶一般,我也一般,挺配的。 | 晚2 普通 |
|
||||
| `shi_r2_wrong` | 不是这个味儿……回家还得接着刷题。 | 晚2 错 |
|
||||
| `shi_o3` | 考完了!今晚想喝口金贵的,犒劳自己。 | tea=yinzhen(金贵→银针,需茶柜) |
|
||||
| `shi_e_a` | 成绩出来了,比模拟考高了四十多分!这盏茶,算我请全茶馆的! | 结局 A |
|
||||
| `shi_e_b` | 考完了,心里反倒空荡荡的。去哪读书,听爸妈安排吧。 | 结局 B |
|
||||
| `shi_e_c` | 考砸了,茶也不对味……但至少,这儿的灯一直亮着。 | 结局 C |
|
||||
|
||||
## N4 组 · 白老先生(NPC Uncle_Fu 平铺 ×13,sig_bai 前缀;弧线=老伴忌日)
|
||||
|
||||
| id | 台词全文 | 线索标签 |
|
||||
|---|---|---|
|
||||
| `bai_enter` | 小掌柜,给我的紫砂壶,留个座。 | 进门句 |
|
||||
| `bai_o1` | 晚饭积了食。要一盏刮油的、经得住泡的,我喝得慢。 | tea=tieguanyin(刮油经泡→乌龙) |
|
||||
| `bai_r1_good` | 好茶,有回甘。像我家老婆子腌的萝卜干,越嚼越有味。 | 晚1 好 |
|
||||
| `bai_r1_plain` | 嗯,茶汤尚可。人老了,舌头也钝了。 | 晚1 普通 |
|
||||
| `bai_r1_wrong` | 这不是我要的那口。不怪你——是我话没说全。 | 晚1 错 |
|
||||
| `bai_o2` | 昨儿那盏不错。今晚想喝口陈的,越陈越好。 | tea=puer(陈→普洱,需茶柜) |
|
||||
| `bai_r2_good` | 陈味出来了。四十年前,我跟老婆子初见,就是一盏普洱。 | 晚2 好(故事开) |
|
||||
| `bai_r2_plain` | 茶汤淡了些。故事嘛,等茶好了再说。 | 晚2 普通(留白钩子) |
|
||||
| `bai_r2_wrong` | ……不是我惦记的那口。罢了,回家睡了。 | 晚2 错 |
|
||||
| `bai_o3` | 就馋那口陈味。老伙计,看你的手艺了。 | tea=puer(回环) |
|
||||
| `bai_e_a` | 明儿我把棋盘搬来,你这儿灯亮,我天天来摆谱——就当,她还在看着。 | 结局 A |
|
||||
| `bai_e_b` | 回去还是那间空屋子。不过睡前有盏茶垫着,梦能沉一点。 | 结局 B |
|
||||
| `bai_e_c` | 下个月,我搬去养老院了。这把紫砂壶,留给茶馆吧。 | 结局 C |
|
||||
|
||||
## N5 组 · 何雨眠(NPC Serena 平铺 ×13,sig_he 前缀;弧线=攒学费)
|
||||
|
||||
| id | 台词全文 | 线索标签 |
|
||||
|---|---|---|
|
||||
| `he_enter` | 师傅,门口能停车不?——哦,我是说,喝茶。 | 进门句 |
|
||||
| `he_o1` | 跑了一宿,眼睛发涩,脑子发木。要一盏清口的,不要浓的。 | tea=longjing(清口不浓→绿快出汤) |
|
||||
| `he_r1_good` | 清亮,像拿凉水洗了把脸。今晚最后一单,稳了。 | 晚1 好 |
|
||||
| `he_r1_plain` | 一般吧,能开就行。 | 晚1 普通 |
|
||||
| `he_r1_wrong` | 不是这口……算了,我还得赶路。 | 晚1 错 |
|
||||
| `he_o2` | 今晚不打算睡了,还要跑单。要最浓的,越浓越好。 | tea=puer(最浓→普洱久闷,需茶柜) |
|
||||
| `he_r2_good` | 得劲儿!闺女的照片就贴在方向盘上——再跑俩月,学费就齐了。 | 晚2 好 |
|
||||
| `he_r2_plain` | 不够劲,今晚里程表怕是要难看。 | 晚2 普通 |
|
||||
| `he_r2_wrong` | 淡了。算了,我赶时间。 | 晚2 错 |
|
||||
| `he_o3` | 最后一趟车收工。想要一盏柔的,收收心。 | tea=yinzhen(柔→银针,需茶柜) |
|
||||
| `he_e_a` | 学费攒齐了,明天去看闺女。老师说她考了年级前十——这盏,我慢慢喝。 | 结局 A |
|
||||
| `he_e_b` | 钱还差一点,再跑一个月。茶馆这盏灯,是我每晚的路标。 | 结局 B |
|
||||
| `he_e_c` | 我把夜班退了。闺女在电话里说:妈,钱够用。这盏茶,我喝得最慢。 | 结局 C |
|
||||
|
||||
---
|
||||
|
||||
**合计:163 句 ≤170 上限**(旁白 98 ×2 性别 = 196 条 + NPC 平铺 65 条 = **261 条音频** ×2 格式 = 522 文件)。
|
||||
分组账:G0 10 + G1 17 + G2 18 + G3 5 + G4 9 + G5 16 + G6 6 + G7 7 + V 10 = 98(旁白);N1-N5 各 13 = 65(NPC)。
|
||||
链路汇总:
|
||||
- 客人链 = `door_bell → steps_in → sig_* → enter → o_N`(点单毕自动进 BREW);
|
||||
- 判定链 = `water_early/ok/late → steep_early/ok/late → res_good/plain/wrong → serve_link → sig_* → 反应/结局句 → bridge_*`(+coin/rep 音效);
|
||||
- 状态链 = `[BREW:sig_*+o_N 重播] → st_guest_n → st_rep_m → st_purse_k`;
|
||||
- 打烊链 = `close_open → close_coin_档 → [rent_due→rent_ok/rent_short] → [st_debt_1] → [chapter_end] → settle_night`(800ms 死窗+链锁);
|
||||
- 中断复述链 = `st_guest_n → st_rep_m → [sig_*+o_N] → recap_go`。
|
||||
矩阵对照与触发逻辑见 [20-teahouse.md](20-teahouse.md) §3/§6/§7;资产规模核对见其 §8。
|
||||
|
||||
### 多音字/发音风险自查(文本层已排雷+待试听清单)
|
||||
|
||||
| 位置 | 原文 | 风险 | 建议换写法 |
|
||||
|---|---|---|---|
|
||||
| tut_steep / steep_late 等 | 闷泡、闷到滴答密、闷过了 | 「闷」mēn/mèn(茶艺读 mèn) | 误读时改「扣着盖子泡」「浸过头」 |
|
||||
| steep_early | 茶还睡着 | 「着」zhe/zháo(此处 zháo,入睡义) | 误读时改「茶还没醒透」 |
|
||||
| bridge_good | 就着茶 | 「着」zhuó | 误读时改「配着茶」 |
|
||||
| amb_2 | 门帘一挑 | 「挑」tiǎo | 误读时改「门帘一掀」 |
|
||||
| he_r2_good | 得劲儿 | 「得」děi(口语) | 误读时改「真带劲」 |
|
||||
| shi_r1_good / upg_lock | 攒的早饭钱 / 攒足了 | 「攒」zǎn/cuán | 误读时改「省下的早饭钱」「攒够」→「凑够」 |
|
||||
| zhou_o3 / su_o3 | 头一回那盏 / 头一回那种 | 「回」口语连读 | 低风险,试听确认 |
|
||||
| 多处 | 还在/还有/还得/还是 | 「还」全表只用 hái 义(已排 huán 义句) | — |
|
||||
| 已排雷 | 全表 | 无「血爪挨壳酽」;「重听」一律写「重新听/再听一遍」;「空落落」统一「空荡荡」;数字全部整句写死(十五/二十/二十五/十二),无拼接 | — |
|
||||
@@ -0,0 +1,527 @@
|
||||
# 20 · 《深夜茶馆》完整设计(teahouse / Late Night Teahouse)
|
||||
|
||||
> **给开发者的实现要点摘要**
|
||||
> 1. 经营养成 RPG:核心动词=**泡茶**。一晚=3-5 位客人(本文定 4)≈13-17 分钟=单局;每位客人 2-4 分钟完整小循环(P3 三分钟颗粒)。泡茶小局三步:**左右滑选茶+单击选定 → 听水声双击提壶(候汤)→ 听滴答双击出汤(闷泡)**——时机步绑双击(即时,规避单击 300ms 延迟,dungeon 格挡先例),选茶步零豁免。
|
||||
> 2. 手势宪法三件套全状态保留(上滑状态/下滑菜单/双击重听);**唯一豁免 E1=时机步双击≠重听**(重听职责由上滑状态链第一段「重播客人点单句」承接),E2=链播中单击=跳句(12 号既有口径),E3=BREW 态关长按快进。教学讲清。
|
||||
> 3. **听觉分层铁律**(本作最大风险):注水/沸腾/滴答三重音**时间上串行不重叠**,任意时刻≤(1 条主操作音+BGM)=2 声流;语音只出现在步与步之间的静默点;滴答只在闷泡最后 ~2.5s 关键窗;BREW 时机窗内看门狗只发 earcon 不发语音。
|
||||
> 4. 客人=声音群像:5 位弧线客人 NPC 平铺(5 音色,2 处与旁白同 speaker 已标风险)+3 位氛围客人**旁白转述零 NPC 句**。弧线 3 晚×3 方向(好/普通/错茶),结局按方向累计值三选一——**全部从数据单源推导**(点单句→茶参数→时机判定→三档结果→方向值),播报值=运行值。
|
||||
> 5. 经济账目真实(radio rep 教训加倍):口碑/收入/房租/欠账每一档播报与累积值一一映射;错茶=免单(收入 0、口碑−1,无其他惩罚);房租不足=「贴钱记账」剧情挫折,**无 game over**。§7.5 有完整 5 晚剧本逐晚验算。
|
||||
> 6. 随机性:N1-N5 剧本夜**固定客序**(连续剧结构);seed PRNG(mulberry32)只管 N6+ 氛围客轮换/口味与提示轮询。`opts.seed` 注入可复现。
|
||||
> 7. 台词表 [20-teahouse-voice-ids.md](20-teahouse-voice-ids.md):旁白 98 ×2 性别 + NPC 平铺 65 = **163 句 ≤170 上限**;操作提示句键盘变体 `_k` 集中登记(V 组,`gesture.inputMode()` 选播)。CLOSE 结算链 800ms 手势死窗+链锁(dungeon H1 / detective VERDICT 同款)。
|
||||
> 8. 规模对标 detective:单文件 game.js 预计 900-1100 行;bgm 3 + sfx ~26 + voice 261 条(×2 格式=522 文件)。断言清单住本文档 §11(13 号文档 §20/§21 先例登记)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 概述
|
||||
|
||||
- **一句话**:你接手巷子深处一家亮到后半夜的小茶馆,客人的故事随你泡的茶展开——泡对了,暖的是人心;泡错了,故事照样走,只是方向不同。
|
||||
- **题材**:经营养成。核心命题「茶是热的,夜是长的」——纯音频天然适合:茶的好坏本来就只能靠听(水声、滴答)与「尝」(客人的声音反应)来感知;经营账目是规整的听觉播报链;客人群像是本作最大资产(8 位客人=8 种声音人生)。
|
||||
- **玩法定位**(方法论 §4.1 无现成行,状态层重点自定):**状态即节拍**(一晚=固定客序推进,永不迷失「接下来干嘛」)+ **听觉判定**(时机步靠耳朵)+ **账目真实**(经济播报与累积值单源)。
|
||||
- **单局=一晚**:4 位客人,13-17 分钟(首晚含教学 17-20);章程 15-25 分钟区间达标。**一章=5 晚**(全部弧线收束);每客人 2-4 分钟= P3 自然切分颗粒,任意客人结算后存档退出、回来一句话接上。
|
||||
- **无死亡无惩罚**:泡错茶=客人免单+吐槽+故事走涩向;房租不足=秦婶记账(贴钱营业),永远没有 game over。轻压力=经济账每晚都要对(口碑档/收入档/欠账)。
|
||||
- **与现有 10 游戏的关系**:状态档位链承接 dungeon(上滑多段链);双轨看门狗承接 dungeon E0-1/E0-2;NPC 群像+签名 earcon 承接 detective(sig_* 前缀);时机判定承接 rpg 格挡(双击+前摇窗口);「声音演技弧线」承接 radio(多晚连续剧);经营元进度为本作新增系统(8 款新模式探索点)。
|
||||
|
||||
## 2. 手势映射与豁免登记
|
||||
|
||||
### 2.1 每晚开场(OPENING)
|
||||
|
||||
| 手势 | 首晚(含教学 DRILL) | 常规晚 |
|
||||
|---|---|---|
|
||||
| 单击 | 教学步骤作答(D1/D4) | 跳句(开场链可跳) |
|
||||
| 双击 | 重听教学句 | 重听当前句 |
|
||||
| 左滑/右滑 | D0 步作答;其余 error | error 震 |
|
||||
| 上滑 | 状态链(D5 教后可用) | 状态链 |
|
||||
| 下滑 | **跳过教学**(tut_skip;meta.drillDone) | 菜单 |
|
||||
| 长按/松开 | error | error |
|
||||
|
||||
开场链:lamp_light(点灯 sfx)→ night_N(分档句)→(首晚 intro_1..3→DRILL)→ 1.5s 后门铃,自动进 SERVE。
|
||||
|
||||
### 2.2 堂前(SERVE:WELCOME/TALK/REACT 三个自动链子相位)
|
||||
|
||||
| 手势 | 链播中(进门/点单/反应) | 空闲(链完待自动转场间隙) |
|
||||
|---|---|---|
|
||||
| 单击 | **跳句**(12 号口径;关键句「不可跳」仅 res_* 结果句与 rent_*) | 提前切下一段(加速) |
|
||||
| 双击 | **重听当前句**(宪法语义保留) | 重听末句 |
|
||||
| 左滑/右滑 | 静默忽略(纯聆听保护,simon playback 先例) | 同左 |
|
||||
| 上滑 | 状态链(queue 排队,链播完后续) | 状态链 |
|
||||
| 下滑 | 菜单(打开即停链;关闭→**重播被停句**,storyline「节点不丢」先例) | 菜单 |
|
||||
| 长按/松开 | 引擎快进(旁白 1.7×,不豁免)/ 恢复常速 | error |
|
||||
|
||||
### 2.3 泡茶小局(BREW:TEA 选茶 → WATER 候汤 → STEEP 闷泡三子相位)
|
||||
|
||||
| 手势 | TEA(选茶) | WATER(候汤) | STEEP(闷泡) |
|
||||
|---|---|---|---|
|
||||
| 左滑/右滑 | 换茶罐(循环):tea_jar sfx + 茶名句(含口诀) | error 震+`gd_invalid`(**不判错步**) | 同左 |
|
||||
| 单击 | **选定此茶** → 自动进候汤(scoop sfx) | error 震+纠错(等时机) | 同左 |
|
||||
| 双击 | 重听当前茶名句(宪法语义保留) | **提壶**(时机判定,即时) | **出汤**(时机判定,即时) |
|
||||
| 上滑 | 状态链(**第一段=重播当前客人点单句**+sig,需求随时可查) | 同左(链排队;水声时间线**照走**,错过=真话归因「水滚老了」) | 同左 |
|
||||
| 下滑 | 菜单(冻结全部计时) | 菜单(冻结水声时间线) | 菜单(冻结滴答) |
|
||||
| 长按/松开 | error(E3:BREW 全态 `setRateBoostEnabled(false)`) | 同左 | 同左 |
|
||||
|
||||
菜单关闭恢复(A2 count-in 口径):TEA→重播当前茶名句;WATER→重播 `hint_water` 口诀;STEEP→重播当前茶名句;水声时间线从冻结点续走。
|
||||
|
||||
### 2.4 打烊(CLOSE)/ 标题(TITLE)
|
||||
|
||||
| 手势 | CLOSE(结算链) | CLOSE(链完) | TITLE |
|
||||
|---|---|---|---|
|
||||
| 单击 | **吞掉**(800ms 死窗+链锁,§4.4) | **睡下**→OPENING(night+1)(settle_night 承诺言行一致) | 继续(有档)/ 新店(无档) |
|
||||
| 双击 | 吞掉 | 重听结算链 | 重听 continue_ask |
|
||||
| 右滑 | 吞掉 | error | 重开新店:播 sys_reset_ask,**再右滑一次**确认(其余手势取消) |
|
||||
| 上滑 | 吞掉 | 重听账目链(st_rep→st_purse→置办清单) | 店铺概况(口碑档→存款档→已置办句重播) |
|
||||
| 下滑 | 吞掉 | 菜单(含「打烊置办」项) | 菜单 |
|
||||
| 左滑/长按 | 吞掉 | error | error |
|
||||
|
||||
### 2.5 模态菜单(遵守 00 §5.2 全球约定,无豁免)
|
||||
|
||||
下滑呼出(停链/冻结计时)→ 单击循环切项 → 双击确认 → 上滑帮助 → 下滑关闭。选项:返回堂前 / **打烊置办**(仅 CLOSE;进二级列表同范式:茶柜/茶具/招牌/算了)/ 保存并回大厅 / 重新听帮助。
|
||||
|
||||
### 2.6 每状态手势映射总表(6 手势+长按松开,全状态覆盖)
|
||||
|
||||
| 手势 | TITLE | OPENING | SERVE | BREW-TEA | BREW-水 | BREW-闷 | CLOSE | MENU |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 单击 | 继续/新店 | 作答/跳句 | 跳句/加速 | 选定茶 | error+纠错 | error+纠错 | 吞/睡下 | 循环切项 |
|
||||
| 双击 | 重听 | 重听教学句 | 重听当前句 | 重听茶名句 | **提壶** | **出汤** | 吞/重听链 | 确认执行 |
|
||||
| 左滑 | error | 教学指定/err | 忽略 | 上一罐 | error | error | 吞/err | 上一项 |
|
||||
| 右滑 | reset(两次) | 教学指定/err | 忽略 | 下一罐 | error | error | 吞/err | 下一项 |
|
||||
| 上滑 | 店铺概况 | 状态 | 状态链 | 状态(含需求) | 状态链 | 状态链 | 吞/账目链 | 帮助 |
|
||||
| 下滑 | 菜单 | 菜单/跳教学 | 菜单 | 菜单(冻结) | 菜单(冻结) | 菜单(冻结) | 吞/菜单 | 关闭 |
|
||||
| 长按 | error | error | 快进(引擎) | error | error | error | 吞/err | error |
|
||||
| 长按松开 | — | — | 恢复常速 | — | — | — | — | — |
|
||||
|
||||
无效手势一律 error 震;full 档 `gd_invalid`(onceKey 同局 1 次);idle-only(引擎 guide 已实现)。
|
||||
|
||||
### 2.7 豁免登记(必须显式)
|
||||
|
||||
| # | 豁免条目 | 理由(先例) |
|
||||
|---|---|---|
|
||||
| E1 | BREW 时机步(候汤/闷泡)双击=提壶/出汤,非重听 | 即时判定绑双击规避单击 300ms 延迟(dungeon 战斗双击=格挡、rpg 前摇格挡同款);重听职责不缺位——上滑状态链第一段=重播客人点单句(含 sig),选茶步双击仍=重听茶名句。教学 D2/D3 讲清 |
|
||||
| E2 | SERVE 链播中单击=跳句(非「确认」) | 12 号 §1 既有口径(rpg/storyline/escape 先例);关键句(res_*、rent_*)登记不可跳 |
|
||||
| E3 | BREW 态 `setRateBoostEnabled(false)` | 长按在 BREW 是无效输入;防误触快进(dungeon/rhythm/space 对局期先例) |
|
||||
|
||||
无 immediateTap;tap 只用于非即时操作(选定/跳句/睡下/菜单)。
|
||||
|
||||
## 3. 核心动词:泡茶小局(信息设计)
|
||||
|
||||
### 3.1 三步手势序列规格
|
||||
|
||||
| 步 | 输入 | 选项数 | 音反馈 | 错误容限 | 时长 |
|
||||
|---|---|---|---|---|---|
|
||||
| ① 选茶 TEA | 左右滑循环+单击选定 | 茶柜 4 罐(扩容后 6) | 每次切换:tea_jar(0.3s)→ 茶名句(含该茶口诀,**知识随身播报**);选定:tea_scoop | 无限切换无时间压力;**选定后不可改**(错茶=故事走涩向+免单,无惩罚);上滑随时重听客人点单 | 8-25s |
|
||||
| ② 候汤 WATER | **双击提壶** | 1(时机) | 水声时间线(见 3.2):细密气泡→将沸→滚透→滚老,单条 11s | 窗宽 ±1.5s(茶具升级 ±2.3s;首晚 ×1.3);早=「欠火」晚=「过老」均记偏**不终止流程**;无出手 t=11s 自动过老继续 | 11s 封顶 |
|
||||
| ③ 闷泡 STEEP | **双击出汤** | 1(时机) | 注水 2s→舒展沙沙 2s→**静默**(仅 BGM)→目标前 2.5s 起 tick 滴答(窗内加速) | 窗宽 [目标−1.0, 目标+1.4]s(茶具 +0.8s;首晚 ×1.3);早=「涩」晚=「苦」记偏;无出手 +4s 自动出汤继续 | 9-21s |
|
||||
|
||||
- 判定与结果(**数据单源**,无独立状态):`{茶对错, 水档, 闷档}` → 茶错⇒res_wrong;茶对∧水 ok∧闷 ok⇒res_good;茶对∧任一偏⇒res_plain。三档结果→客人反应三方向(§6.4)。
|
||||
- 每步结算即归因(真话律):`water_early/ok/late`、`steep_early/ok/late` 按真实时机选播;错手势(时机步内滑/单击)**不判错步**——只有时机本身决定品质,绝不报假归因。
|
||||
|
||||
### 3.2 水声时间线(声学编码,全在引擎能力内)
|
||||
|
||||
不用实时 WebAudio 节点(playtest mock 只覆盖 bufferSource/gain):全部=预生成 sfx one-shot + setTimeout 调度 + volume。
|
||||
|
||||
```
|
||||
t=0 water_pour 注水 one-shot(2s)
|
||||
t=2.0 boil_blip 单泡音起播:间隔 700ms(温水段)
|
||||
t=3.5 ── 将沸窗开(绿茶/银针的提壶窗)── blip 间隔 350ms + boil_simmer 低鸣 one-shot 链
|
||||
t=6.5 ── 滚透窗开(茉莉/铁观音/滇红/普洱的提壶窗)── boil_roar 连片 one-shot 链(2s/段)
|
||||
t=9.5 窗闭:boil_over 剧烈嘶鸣(滚老)
|
||||
t=11.0 无出手→自动过老,播 water_late,进闷泡
|
||||
```
|
||||
|
||||
- 两窗共用一条时间线,茶种决定用哪扇窗(茶名句口诀即判据:「将沸就提」vs「滚透才冲」)。
|
||||
- 闷泡时间线:pour(2s)→ steep_rustle 沙沙(2s)→ 静默(BGM only)→ 目标前 2.5s tick_slow 起(1s/拍)→ 入窗 tick_fast(0.6s/拍)→ 窗后 +4s 自动出汤。
|
||||
- 目标闷时(自注水毕):快 7s(龙井/茉莉)/ 中 11s(铁观音/银针)/ 久 15s(滇红/普洱)。
|
||||
|
||||
### 3.3 听觉分层表(本作最大风险预防:并发声流 ≤2)
|
||||
|
||||
| 时刻 | 声流①(内容) | 声流②(床) | 语音 | 断言口径 |
|
||||
|---|---|---|---|---|
|
||||
| 客人进门/点单/反应 | —— | BGM serve | 客人句(1 条) | BGM+voice=2 ✓ |
|
||||
| 选茶 | tea_jar/scoop one-shot(≤0.3s,串行于语音前) | BGM serve | 茶名句 | one-shot 与 voice 不叠(jar 先响完再播句) |
|
||||
| 候汤 | boil_blip/roar 调度流 | BGM brew | **零语音**(设计禁止) | 水声期间 voice 播放事件=0 |
|
||||
| 闷泡静默段 | 无 tick | BGM brew | 零语音 | 1 声流(最安静段=呼吸感) |
|
||||
| 滴答关键窗 | tick 滴答 | BGM brew | **零语音**(看门狗也只发 earcon,§9.2) | tick 活跃窗内 voice 事件=0 |
|
||||
| 打烊结算 | coin/lamp one-shot | BGM menu | 账目句链 | 串行 |
|
||||
|
||||
- 频带分离:沸腾=低频(150-500Hz 咕嘟)、滴答=高频木鱼(~880Hz 族)、人声=中频——即偶发瞬时叠听也不糊(Brewster 指南)。
|
||||
- 滴答只在关键窗(需求原文兑现):静默闷泡段绝不加节拍器。
|
||||
|
||||
## 4. 状态机
|
||||
|
||||
### 4.1 状态列表
|
||||
|
||||
`TITLE / OPENING / SERVE / BREW / CLOSE` + `MENU`(挂起 overlay,记录返回态)。SERVE 子相位=WELCOME/TALK/REACT(自动链);BREW 子相位=TEA/WATER/STEEP;CLOSE 子相位=TALLY(链)/SHOP(菜单内置办)。
|
||||
|
||||
### 4.2 转移图
|
||||
|
||||
```
|
||||
start ──> TITLE ──tap(有档)──> OPENING(night_N) ──自动──> SERVE(客人1)
|
||||
│tap(无档) │
|
||||
│右滑×2=重开新店(run+meta 清) │点单链完,自动
|
||||
v v
|
||||
(大厅) SERVE ⇄ BREW(每位客人一圈)
|
||||
SERVE(末位客人反应毕) ──自动──> CLOSE(打烊链)
|
||||
CLOSE ──tap──> OPENING(night+1) [N5 链含 chapter_end;N6+ 无尽营业]
|
||||
任意正交态 ──下滑──> MENU ──关闭──> 原状态(SERVE 重播被停句;BREW 冻结后恢复)
|
||||
```
|
||||
|
||||
### 4.3 语音链推进契约
|
||||
|
||||
- 客人链/结算链=onComplete 串行(句间 0.8s);单句 8s 无 onComplete(资产缺失)→ 告警续链(「屏蔽任意 voice 流程不卡死」契约)。
|
||||
- 教学链 `_speakGuarded` 串行(radio/dungeon D0-1 同款,杜绝同 tick 双调度抢占)。
|
||||
- CLOSE 结算链为**独占链**:链首停看门狗;链内不受理手势(§4.4)。
|
||||
|
||||
### 4.4 打烊死窗与链锁(dungeon H1 / detective VERDICT 内化)
|
||||
|
||||
- 进 CLOSE 即盖 `CLOSE_GRACE_MS=800` 死窗戳(touchstart+450ms 长按判定+300ms 双击窗 ≈750ms,800 全盖);死窗内一切手势吞掉(ghost 手势不算输入、不碰看门狗)。
|
||||
- 链锁:close_open→账目句→(房租/欠账句)→(chapter_end)→settle_night 落声前,单击/右滑/长按一律吞掉;链完成后单击=睡下(settle_night「单击,睡下」言行一致——simon round1-live 教训)。双击=重听链仅链完成后受理。
|
||||
|
||||
## 5. 教学编排(DRILL,首晚寄生于第 1 位客人=老周①)
|
||||
|
||||
每步=一句短旁白→等待实操→反馈;做错重教同一步(**新短句 ≤2 次**)后自动演示通过;下滑=跳过(tut_skip),`meta.drillDone` 持久化。教学客老周①**明示茶名**(龙井)+首晚窗口 ×1.3 → 好茶近乎保送、账目照常(首胜≤3min,A5)。
|
||||
|
||||
| 步 | 旁白 | 等待动作 | 通过条件/反馈 |
|
||||
|---|---|---|---|
|
||||
| D0 | intro_1..3 + tut_d0 | 左滑或右滑任一 | tea_jar+茶名句;confirm 震。**首输入 ≈t+20s(<60s ✓)** |
|
||||
| D1 | tut_tea | 单击 | tea_scoop → 自动坐水 |
|
||||
| D2 | tut_water | 双击(将沸窗内) | water_ok(偏了也继续:water_early/late 真话归因+重教短句) |
|
||||
| D3 | (水毕自动)tut_steep | 双击(滴答密时) | steep_ok(同上容错) |
|
||||
| D4 | tut_serve | 单击 | pour_cup → 老周 r1 反应句。**首正反馈 ≈t+2.5-3min(≤3min ✓)** |
|
||||
| D5 | tut_status | 上滑 | 状态链(st_guest→st_rep→st_purse) |
|
||||
| D6 | (老周出门后)tut_done | — | 第 2 位客人门铃,自由营业 |
|
||||
|
||||
- 滚透窗(茉莉等 4 茶)不设专门教学步:靠茶名句口诀+hint_water+首晚宽窗自然过渡(知识单源=茶名句,承诺必兑现)。
|
||||
- 教学无进展轨(E0-2 先例):30s earcon → 60s 短句 → **90s 自动替打当前步**(自动选定/提壶/出汤,演示通过不卡流程)。
|
||||
|
||||
## 6. 客人系统
|
||||
|
||||
### 6.1 客人档案 JSON 草案(数据单源:点单句→茶参数→判定→方向→结局)
|
||||
|
||||
```json
|
||||
{
|
||||
"schema": 1,
|
||||
"teas": {
|
||||
"longjing": { "name": "tea_longjing", "price": 6, "water": "simmer", "steep": "fast", "shelf": true },
|
||||
"moli": { "name": "tea_moli", "price": 4, "water": "rolling", "steep": "fast", "shelf": true },
|
||||
"tieguanyin": { "name": "tea_tieguanyin", "price": 8, "water": "rolling", "steep": "mid", "shelf": true },
|
||||
"dianhong": { "name": "tea_dianhong", "price": 5, "water": "rolling", "steep": "long", "shelf": true },
|
||||
"puer": { "name": "tea_puer", "price": 7, "water": "rolling", "steep": "long", "shelf": "cabinet" },
|
||||
"yinzhen": { "name": "tea_yinzhen", "price": 10, "water": "simmer", "steep": "mid", "shelf": "cabinet" }
|
||||
},
|
||||
"arcGuests": [
|
||||
{ "id": "zhou", "name": "老周", "sig": "sig_zhou",
|
||||
"enter": "zhou_enter", "orders": ["zhou_o1", "zhou_o2", "zhou_o3"],
|
||||
"teaByVisit": ["longjing", "dianhong", "longjing"],
|
||||
"reactions": [["zhou_r1_good", "zhou_r1_plain", "zhou_r1_wrong"],
|
||||
["zhou_r2_good", "zhou_r2_plain", "zhou_r2_wrong"], null],
|
||||
"endings": ["zhou_e_a", "zhou_e_b", "zhou_e_c"] },
|
||||
{ "id": "su", "name": "苏晚", "sig": "sig_su", "enter": "su_enter",
|
||||
"orders": ["su_o1", "su_o2", "su_o3"],
|
||||
"teaByVisit": ["dianhong", "moli", "dianhong"],
|
||||
"reactions": [["su_r1_good","su_r1_plain","su_r1_wrong"],
|
||||
["su_r2_good","su_r2_plain","su_r2_wrong"], null],
|
||||
"endings": ["su_e_a", "su_e_b", "su_e_c"] },
|
||||
{ "id": "shi", "name": "陈拾", "sig": "sig_shi", "enter": "shi_enter",
|
||||
"orders": ["shi_o1", "shi_o2", "shi_o3"],
|
||||
"teaByVisit": ["moli", "longjing", "yinzhen"],
|
||||
"reactions": [["shi_r1_good","shi_r1_plain","shi_r1_wrong"],
|
||||
["shi_r2_good","shi_r2_plain","shi_r2_wrong"], null],
|
||||
"endings": ["shi_e_a", "shi_e_b", "shi_e_c"] },
|
||||
{ "id": "bai", "name": "白老先生", "sig": "sig_bai", "enter": "bai_enter",
|
||||
"orders": ["bai_o1", "bai_o2", "bai_o3"],
|
||||
"teaByVisit": ["tieguanyin", "puer", "puer"],
|
||||
"reactions": [["bai_r1_good","bai_r1_plain","bai_r1_wrong"],
|
||||
["bai_r2_good","bai_r2_plain","bai_r2_wrong"], null],
|
||||
"endings": ["bai_e_a", "bai_e_b", "bai_e_c"] },
|
||||
{ "id": "he", "name": "何雨眠", "sig": "sig_he", "enter": "he_enter",
|
||||
"orders": ["he_o1", "he_o2", "he_o3"],
|
||||
"teaByVisit": ["longjing", "puer", "yinzhen"],
|
||||
"reactions": [["he_r1_good","he_r1_plain","he_r1_wrong"],
|
||||
["he_r2_good","he_r2_plain","he_r2_wrong"], null],
|
||||
"endings": ["he_e_a", "he_e_b", "he_e_c"] }
|
||||
],
|
||||
"ambientGuests": [
|
||||
{ "id": "postman", "order": "amb_1", "teaPool": ["moli"] },
|
||||
{ "id": "embroider", "order": "amb_2", "teaPool": ["longjing"] },
|
||||
{ "id": "drunk", "order": "amb_3", "teaPool": ["dianhong"] }
|
||||
],
|
||||
"nights": [
|
||||
["zhou", "amb:postman", "su", "shi"],
|
||||
["zhou", "bai", "he", "shi"],
|
||||
["zhou", "su", "bai", "amb:drunk"],
|
||||
["he", "shi", "su", "amb:postman"],
|
||||
["bai", "he", "amb:embroider", "amb:postman"]
|
||||
],
|
||||
"nightsEndless": { "pool": ["amb:postman", "amb:embroider", "amb:drunk"], "size": 4 },
|
||||
"economy": { "tipGood": 2, "rentEvery": 3, "rent": 20,
|
||||
"repGain": { "good": 1, "plain": 0, "wrong": -1 },
|
||||
"pay": { "good": "price+2", "plain": "price", "wrong": 0 },
|
||||
"upgrades": [
|
||||
{ "id": "cabinet", "voice": "upg_cabinet", "cost": 15 },
|
||||
{ "id": "teaware", "voice": "upg_teaware", "cost": 12 },
|
||||
{ "id": "sign", "voice": "upg_sign", "cost": 20, "repReq": 12 } ] }
|
||||
}
|
||||
```
|
||||
|
||||
- 氛围客人点单句由旁白转述(amb_1..3,句内已含茶名与参数暗示);判定同弧线客人(teaPool/口味由 seed 决定 N6+ 变体,N1-N5 用表内固定值)。
|
||||
- **矩阵不变式(dev/playtest 双保险)**:每晚每位客人的点单句 ⇒ `(tea, water窗, steep窗)` 三元组与 `teas[teaByVisit[i]]` 严格一致;任何台词改稿若使点单句暗示的茶与 teaByVisit 不符,断言立即失败(防「文案事故变成归因假话」)。
|
||||
|
||||
### 6.2 弧线节点表(5 位客人 × 3 晚;方向值 好茶+1 / 普通 0 / 错茶−1)
|
||||
|
||||
| 客人 | 晚1 相遇 | 晚2 深入 | 晚3 收束(结局=按累计 sum) |
|
||||
|---|---|---|---|
|
||||
| 老周(修车师傅,儿子在外多年) | 点龙井去火;r1×3 | 点浓暖的(滇红);r2×3 起「儿子来电」话头 | 「头一回那盏再来一份」(龙井回环);sum≥2=A 父子回来帮工 / B 电话拌嘴日子照过 / C 关铺去投儿子 |
|
||||
| 苏晚(夜班护士,去留抉择) | 点暖的不冲(滇红);r1×3 | 点香的(茉莉);r2×3 讲科室一夜 | 「还是头一回那种」(滇红回环);A 调白天班白天来 / B 再值一季看看 / C 递辞呈但记住这盏灯 |
|
||||
| 陈拾(高三生,大考) | 点香提神不浓(茉莉);r1×3 | 点清火的(龙井);r2×3 问「还能考上吗」 | 「喝口金贵的犒劳自己」(银针,需茶柜);A 超常发挥请全馆 / B 听家里安排 / C 考砸但灯还亮着 |
|
||||
| 白老先生(独居,老伴忌日) | 点刮油经泡的(铁观音);r1×3 | 点陈味(普洱,需茶柜);r2×3 忆四十年前一盏普洱 | 「就馋那口陈味」(普洱);A 搬棋盘天天来「当她在看着」 / B 空屋但有茶垫梦 / C 搬去养老院留壶给茶馆 |
|
||||
| 何雨眠(夜班出租车司机,攒学费) | 点清口不浓(龙井);r1×3 | 点最浓的(普洱,需茶柜);r2×3 讲闺女照片贴方向盘 | 「一盏柔的收收心」(银针,需茶柜);A 学费齐了去看闺女 / B 差一点再跑一月 / C 退了夜班「这盏喝得最慢」 |
|
||||
|
||||
- 结局映射:`sum = Σ方向值(3 晚)`;`sum≥2 → A(暖);−1≤sum≤1 → B(平);sum≤−2 → C(涩)`。
|
||||
- 茶柜锁与弧线的 roguelike 纹理:白老②③/何②③/陈③ 需要「茶柜扩容」解锁的普洱/银针——没置办的玩家必然错过好茶档,弧线自然走平/涩向(**这是经营决策的重量,不是 bug**;§7.5 剧本 B 验算)。全 A 路径可行性:N2 打烊置办茶柜(15 文)即解锁全部弧线茶(§7.5 剧本 A)。
|
||||
- 晚 3 收束夜=「反应与结局合一」:结局句本身回应今晚的茶(A 段必有对茶的正面回应、C 段必有遗憾——见台词表 N 组)。
|
||||
|
||||
### 6.3 声音群像:区分度(本作最大资产风险,逐人标注)
|
||||
|
||||
| 角色 | speaker | instruct 常量 | 区分度风险 |
|
||||
|---|---|---|---|
|
||||
| 旁白(掌柜系统音) | female=Serena / male=Uncle_Fu | 见台词表头 | 基准 |
|
||||
| 老周(58 修车师傅) | `Eric` | 沙哑洪亮的男声,修车铺老师傅,大嗓门,直爽热乎 | 低:与两侧旁白均不同 speaker |
|
||||
| 苏晚(29 夜班护士) | `Vivian` | 轻柔平稳的女声,夜班护士,温和疲惫,吐字干净 | 低:同上 |
|
||||
| 陈拾(17 高三生) | `Dylan` | 年轻清亮的男声,高三学生,紧张,语速快,有点怯 | 低:同上 |
|
||||
| 白老先生(74) | `Uncle_Fu` | 苍老缓慢的男声,独居老先生,慢条斯理,带茶韵 | **中**:与 male 旁白同 speaker——靠 sig_bai 前缀+苍老腔 instruct+人称差(客人第一人称/旁白第三人称「客人」)+句间 0.6s;试听确认 |
|
||||
| 何雨眠(36 的姐) | `Serena` | 低哑爽利的女声,夜班出租车司机,利落,带笑带倦 | **中**:与 female 旁白同 speaker——同上缓解;试听确认 |
|
||||
| 氛围客人 ×3 | 旁白转述 | 同旁白 | 无(零 NPC 句,成本与风险双省) |
|
||||
|
||||
NPC 音色数=5 ≤6(radio/detective 满配先例);每位弧线客人**专属签名 earcon**(sig_*,0.3-0.5s)在进门句/状态链需求重播/反应句前必响——认人是「sig+speaker+instruct」三层冗余。
|
||||
|
||||
## 7. 经营数值(口碑/收入/房租经济表)
|
||||
|
||||
### 7.1 每晚事件表(N1-N5 剧本夜)
|
||||
|
||||
| 晚 | 客序 | 事件 |
|
||||
|---|---|---|
|
||||
| 1 | 老周①/邮差/苏晚①/陈拾① | 教学;首胜保送;无房租 |
|
||||
| 2 | 老周②/白老①/何①/陈拾② | 普洱银针需求首次逼近(茶柜压力);打烊可置办 |
|
||||
| 3 | 老周③/苏晚②/白老②/醉汉 | **房租夜①**(20 文);老周弧线收束 |
|
||||
| 4 | 何②/陈拾③/苏晚③/邮差 | 苏晚/陈拾弧线收束 |
|
||||
| 5 | 白老③/何③/绣娘/邮差 | **房租夜②**;白老/何收束;chapter_end |
|
||||
|
||||
N6+(无尽营业):4 席=氛围客轮换(seed 定序/口味),房租照收,经济维持。
|
||||
|
||||
### 7.2 累积公式
|
||||
|
||||
```
|
||||
rep:初始 0,clamp ≥0。每客 good +1 / plain 0 / wrong −1。每晚 Δ∈[−4,+4]。
|
||||
purse(存款):初始 0。CLOSE 时 income 计入 → 先还债(debt 清零播 debt_clear)→ 房租夜扣 rent
|
||||
(不足 → 差额入 debt,播 rent_short + danger 签名)→ 可置办(不透支)。
|
||||
income(当晚):Σ 每客 pay = good: 茶价+2 打赏 / plain: 茶价 / wrong: 0(免单)。
|
||||
方向值(弧线):good +1 / plain 0 / wrong −1,sum 三晚 → 结局 A/B/C。
|
||||
upgrades:cabinet 15(普洱+银针上柜)/ teaware 12(时机窗 +0.8s)/ sign 20(需 rep≥12,每晚结算 rep+1)。
|
||||
```
|
||||
|
||||
### 7.3 档位播报措辞与账目一一映射(radio rep 教训:播报值=运行值,跨档才播、双向都播)
|
||||
|
||||
| 账本 | 档 | 阈值 | 播报句(id) | 措辞↔账目 |
|
||||
|---|---|---|---|---|
|
||||
| 口碑 rep | 1 冷清 | 0-4 | st_rep_1「口碑还没立起来」 | 「没立起来」=rep<5 |
|
||||
| | 2 回头 | 5-11 | st_rep_2「有了回头客」 | 「回头客」=rep≥5 |
|
||||
| | 3 名声 | 12-19 | st_rep_3「巷子口都在传」 | 「传」=rep≥12 |
|
||||
| | 4 招牌 | ≥20 | st_rep_4「一盏难求」 | 「难求」=rep≥20 |
|
||||
| 当晚收入 | 1 | <15 | close_coin_1「不到十五文」 | 与逐客 pay 之和相等 |
|
||||
| | 2 | 15-24 | close_coin_2「十五到二十五文」 | 同上 |
|
||||
| | 3 | ≥25 | close_coin_3「二十五文往上」 | 同上 |
|
||||
| 存款 purse | 1 | <10 | st_purse_1「钱箱见底」 | 结算后实值 |
|
||||
| | 2 | 10-24 | st_purse_2「周转得开」 | 同上 |
|
||||
| | 3 | ≥25 | st_purse_3「手头宽裕」 | 同上 |
|
||||
| 欠账 debt | — | >0 | st_debt_1「账上还欠着秦婶的钱」 | CLOSE 链内、还清播 debt_clear |
|
||||
| 房租 | — | 每 3 晚 20 文 | rent_due→rent_ok / rent_short | 不足额=差额入账,**无 game over** |
|
||||
|
||||
### 7.4 店铺升级树(roguelike 跨晚进度,localStorage+服务器双存)
|
||||
|
||||
```
|
||||
茶柜扩容 15 ──> 普洱(7文·滚·久)+白毫银针(10文·将沸·中)上柜 ──> 解锁白老②③/何②③/陈③ 的好茶路径
|
||||
新茶具 12 ──> 候汤/闷泡窗各 +0.8s(容错拉满,P4)
|
||||
立招牌 20(需 rep≥12 且 debt=0)──> 每晚结算 rep+1(口碑发酵)
|
||||
```
|
||||
|
||||
### 7.5 完整 5 晚剧本验算(剧本 A「用心掌柜」——口碑/收入逐晚对账)
|
||||
|
||||
| 晚 | 逐客结果(茶·三档) | 逐客收入 | 当晚收入 | rep 流程(跨档播报点) | purse 流程 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | 周好(龙井)/邮好(茉莉)/苏好(滇红)/陈好(茉莉) | 8/6/7/6 | 27(coin_3) | 0→4(无跨档) | 0→27 |
|
||||
| 2 | 周普(滇红)/白好(铁观音)/何错(泡了茉莉)/陈好(龙井) | 5/10/0/8 | 23(coin_2) | 4→5(**st_rep_2**)→4(**st_rep_1**,何错跌回)→5(**st_rep_2**) | 27+23=50;置办茶柜 −15 → **35** |
|
||||
| 3 | 周好(龙井)/苏好(茉莉)/白好(普洱)/醉普(滇红) | 8/6/9/5 | 28(coin_3) | 5→8;**老周 sum=+1+0+1=2 → 结局 A** | 35+28=63;房租 −20 → 43;置办茶具 −12 → **31** |
|
||||
| 4 | 何好(普洱)/陈好(银针)/苏错(泡了龙井)/邮普(茉莉) | 9/12/0/4 | 25(coin_3) | 8→9→10→9(**st_rep_2**下沿内,不跨档)→9;陈 sum=3→A;苏 sum=+1+1−1=1→**B** | 31+25=**56** |
|
||||
| 5 | 白好(普洱)/何好(银针)/绣普(龙井)/邮好(茉莉) | 9/12/6/6 | 33(coin_3) | 9→10→11→11→12(末客后**st_rep_3**);白 sum=3→A;何 sum=−1+1+1=1→**B** | 56+33=89;房租 −20 → 69;**立招牌 −20(rep=12 恰达标)→ 49** |
|
||||
|
||||
终局:rep 12(档3)/ purse 49 / 升级 3/3 / debt 0 / 结局 3A+2B;chapter_end → N6+ 无尽营业。
|
||||
**对账断言**:每晚 close_coin 档=逐客 pay 之和所在档;每次 st_rep 播报时的 rep 实值=该档阈值区间;置办价=upg 表——playtest 锁定(假话即失败)。
|
||||
|
||||
### 7.6 剧本 B「贴钱营业」验算(欠账机制可达性)
|
||||
|
||||
N1-N3 全错(每客免单+rep−1,rep clamp 0):income 0/0/0,purse 0;N3 房租 20 > 0 → **rent_short+danger,debt=20**(贴钱营业,无 game over);无茶柜 → N4 何②/陈③必然错茶(普洱/银针缺位,弧线走涩向——经营决策的真实重量);N4 苏好+邮普 income 11 → 还债 11(debt 9);N5 绣普+邮好 income 12 → 还债 9(**debt_clear**)→ purse 3 → 房租 → debt 17。终局 rep 2(档1)、结局 2C+3B——**活着,且每一句播报与账本一致**。
|
||||
|
||||
## 8. 音频三层
|
||||
|
||||
### 8.1 BGM(3 首,Mureka instrumental,-20 LUFS,ogg+m4a,无缝循环)
|
||||
|
||||
| id | 状态映射 | Mureka prompt(英文) |
|
||||
|---|---|---|
|
||||
| bgm/menu | TITLE / MENU / CLOSE(结算 volume 0.5) | "Cozy late night tea house, soft guzheng and bamboo flute duet, warm kettle hum and faint vinyl crackle, intimate and unhurried, no drums, no vocals, seamless loop" |
|
||||
| bgm/serve | OPENING / SERVE | "Gentle Chinese tea house evening theme, sparse pipa and soft erhu, distant crickets and quiet old-street ambience, warm storytelling mood, no vocals, seamless loop" |
|
||||
| bgm/brew | BREW(三子相位) | "Minimalist zen tea brewing music, very sparse guqin notes over soft water ambience, meditative, wide and quiet dynamics, no vocals, seamless loop" |
|
||||
|
||||
切换全走引擎 crossfade;voice duck 20% 引擎自动。预算:3 曲 ×2 候选=6 任务 $0.18(上限 $2.00 内)。brew 曲**特意稀疏**——给操作音让频带(§3.3)。
|
||||
|
||||
### 8.2 SFX(~26 个;SA3=Stable Audio 3,SYN=程序合成;双格式、真峰值 ≤-3dBFS)
|
||||
|
||||
| 类别 | id | 方式 | 说明 |
|
||||
|---|---|---|---|
|
||||
| 进门 | `door_bell` | SA3 | 铜铃两响(0.5s,客人进门/出门) |
|
||||
| | `steps_in` `steps_out` | SA3 | 布鞋脚步 1.2s(in 由远及近预 pan 派生,dungeon 工艺) |
|
||||
| 客人签名 | `sig_zhou` | SYN | 扳手磕搪瓷缸一响 |
|
||||
| | `sig_su` | SYN | 指尖叩桌面两下 |
|
||||
| | `sig_shi` | SYN | 拉链+书本落桌 |
|
||||
| | `sig_bai` | SYN | 棋子落木盘一响 |
|
||||
| | `sig_he` | SYN | 车钥匙串抖两下 |
|
||||
| 选茶 | `tea_jar` `tea_scoop` | SYN | 木罐启盖+茶叶沙沙 / 铜勺入壶 |
|
||||
| 候汤 | `water_pour` | SA3 | 注水 one-shot 2s |
|
||||
| | `boil_blip` `boil_simmer` `boil_roar` `boil_over` | SA3+SYN | 单泡/低鸣/连片滚沸/过老嘶鸣(one-shot 链调度,§3.2;**不用循环 sfx**——引擎 sfx 层无 loop) |
|
||||
| | `kettle_lift` | SYN | 提壶离火蒸汽「呲」 |
|
||||
| 闷泡 | `steep_rustle` | SYN | 干茶舒展沙沙(2s,低响度) |
|
||||
| | `tick_slow` `tick_fast` | SYN | 木鱼滴答两档(880Hz 族;**只进关键窗**) |
|
||||
| 上茶 | `pour_cup` | SA3 | 茶汤入盏+盏托轻磕 |
|
||||
| 账目 | `coin_soft` `coin_stack` | SYN | 单枚铜钱/三枚铜钱落桌(plain/good);wrong=无币声(免单静默+反应句) |
|
||||
| | `rep_chime` `rep_fall` | SYN | 上行/下行双音(口碑跨档瞬时标记,配合档句) |
|
||||
| 仪式 | `lamp_light` `lamp_off` | SYN | 开灯「嗒」/熄灯(每晚开张与睡下) |
|
||||
| | `shop_buy` `upg_install` | SYN | 算盘+钱柜抽屉 / 木工轻敲(置办) |
|
||||
| 看门狗 | `turn_tick` | SYN | 880Hz 木鱼族轻响(无进展轨 L1,dungeon 配方自存一份) |
|
||||
|
||||
SA3 任务 ~10 个(door_bell/steps×2/water_pour/boil 家族 2 条/pour_cup);其余 SYN 兜底。
|
||||
|
||||
### 8.3 voice(163 句:旁白 98 ×2 性别 + NPC 平铺 65)
|
||||
|
||||
- **旁白**(系统/教学/状态/账目/氛围客转述):female=Serena / male=Uncle_Fu,instruct 全表统一(台词表头);数字全分档整句(st_guest 5 档/st_rep 4/st_purse 3/close_coin 3/night 6 档),无运行时拼接。
|
||||
- **NPC 平铺**(弧线客人台词):5 speaker+instruct 恒定(§6.3 区分度表);不做双性别;落 `voice/` 根目录(引擎平铺回退命中)。台词全文、触发、键盘变体、多音字自查见 [20-teahouse-voice-ids.md](20-teahouse-voice-ids.md)。
|
||||
- 声音演技核心:晚 3 结局句(A/B/C 三方向 ×5 客人)与晚 2 反应句的递进(故事感全在句内文本+标点引导,instruct 恒定)。
|
||||
|
||||
## 9. 向导层接入(engine/guide.js,不新增 earcon 词表)
|
||||
|
||||
### 9.1 状态签名(进入状态时播)
|
||||
|
||||
| 状态 | guide.state() | 时点 |
|
||||
|---|---|---|
|
||||
| TITLE / MENU / CLOSE 链 | `menu`(CLOSE 链完)| 进标题、开菜单、进结算 |
|
||||
| OPENING / SERVE | `explore` | 开场、每位客人进门 |
|
||||
| BREW | `battle` | 选茶步起(「小局起」的统一签名) |
|
||||
| CLOSE 链内 | `settle` | 打烊链首 |
|
||||
| danger | `danger` | rent_short 当刻(每欠账事件 1 次) |
|
||||
|
||||
choice 不使用(无抉择态,登记)。
|
||||
|
||||
### 9.2 turn cue 与看门狗(双轨——批次 1 教训固化)
|
||||
|
||||
| 等待点 | 机制 | at | say(full 档;第 2 级一律纯 nudge) |
|
||||
|---|---|---|---|
|
||||
| BREW 各子相位入口 | guide.turn | — | turn earcon + confirm 震 |
|
||||
| SERVE 空闲 | 无操作轨 | [10s, 25s] | gd_serve / null |
|
||||
| BREW-TEA | 无操作轨 | [12s, 30s] | gd_brew / null |
|
||||
| **BREW-WATER/STEEP 时机窗内** | 只 earcon | [12s] | **语音一律不发**(§3.3 分层铁律;语音会占第 3 声流) |
|
||||
| CLOSE 链完 | 无操作轨 | [15s, 35s] | gd_close / null |
|
||||
| DRILL 每步 | 无进展轨 | [30/60/90s] | earcon→短句→自动替打(§5) |
|
||||
|
||||
### 9.3 无进展轨(营业态卡关三级——「乱按也要被营业」)
|
||||
|
||||
进展事件=客人相位推进(进门/点单/上茶/反应毕)/BREW 步骤推进/打烊/置办(`_progressTrack()` 挂点:各链 onComplete、判定函数、状态进入)。只由进展重置——乱按(狂切茶罐不听、反复开菜单)永远攒不满进展,三级必达:
|
||||
|
||||
- [45s] L1:turn_tick earcon(不占台词通道)→ [90s] L2:`hint_water`(泡茶口诀)/`gd_serve`(堂前)→ [150s] L3:**重播当前客人点单句**(BREW/堂前通用的真话提示——把线索原句还给玩家,不替选茶);L3 后每 150s 重复(每句全局限 2 次,之后静默)。
|
||||
- 无操作轨与无进展轨并行取先到;两轨短句内容同级交叉登记防重复;纠错/提示 idle-only、过期丢弃(引擎已实现)。
|
||||
|
||||
## 10. 存档设计(跨晚进度)
|
||||
|
||||
```json
|
||||
{
|
||||
"schema": 1, "game": "teahouse", "updatedAt": 0,
|
||||
"summary": "第3晚 · 客人2/4 · 口碑·有了回头客 · 存款35文 · 欠账0文",
|
||||
"meta": { "drillDone": true, "nightsClosed": 2, "rep": 5, "purse": 35, "debt": 0,
|
||||
"upgrades": ["cabinet"], "chapterEnd": false },
|
||||
"run": { "night": 3, "guestIdx": 2,
|
||||
"results": ["good", "plain"],
|
||||
"incomeTonight": 5,
|
||||
"guestStory": { "zhou": 1 },
|
||||
"rentCharged": false }
|
||||
}
|
||||
```
|
||||
|
||||
- summary 生成规则:`第{night}晚 · 客人{guestIdx+1}/4 · 口碑·{rep 档名} · 存款{purse}文 · 欠账{debt}文`(打烊后 run 清空,summary=`第{nightsClosed}晚打烊 · 口碑·{档名} · 存款{purse}文`)。
|
||||
- 保存时机:每客反应毕 / 打烊链完 / 置办后 / 菜单「保存并回大厅」。localStorage + PUT 服务器。
|
||||
- 读取:有 run → TITLE 播 sys_continue_ask,单击继续 → **客人粒度恢复**(当前客人从进门链重放,已结算客人不重复)→ 局面复述链 `st_guest_n → st_rep → (BREW 则加 sig+点单句) → recap_go`,≤5s 回到可操作。右滑 ×2=重开新店(run+meta 清零,播 sys_reset_ask 二次确认)。
|
||||
|
||||
## 11. playtest 断言清单(登记 13 号文档新增 §teahouse;mock 对齐 web/rpg/test/playtest.mjs;一律 guide:'off')
|
||||
|
||||
**关键路径**(seed=42,N1-N3,≤120 手势;全章 N1-N5 ≤200):
|
||||
1. 启动→TITLE(无档)→单击→OPENING(night_1):intro 三句+D0..D6 逐步 voice 序与 drillStep 递进;D2/D3 时机步双击;首晚窗口 ×1.3 断言;下滑跳过路径+meta.drillDone 二周目不再进。
|
||||
2. **泡茶小局三步**:TEA 左右滑循环(wrap)+茶名句播报+单击选定→WATER 时间线(blip 间隔 700/350ms、roar 链、窗位=茶参数)→双击在窗内=water_ok/窗前=water_early/窗后=water_late;t=11s 无出手自动过老;STEEP tick 只在目标前 2.5s 起、窗内加速、同三档+超时自动出汤;判定三元组与 §3.1 映射(good/plain/wrong)逐组合注入验证(含「茶对双偏=plain」「茶错=wrong 即水闷全 ok」)。
|
||||
3. **矩阵不变式**:全弧线客人×全部访问 → teaByVisit 与 teas 表参数一致;氛围客 teaPool 同;同 seed 两次构造 `run._schedule`(N6+ 轮换序)深相等。
|
||||
4. **客人弧线三方向**:逐客注入三晚结果矩阵(全好/混合/全错)→ 结局句=A/B/C 与 sum 映射一致;反应句三方向与当晚结果一致(假话即失败);晚 3 结局句替换反应句路径。
|
||||
5. **经济账目验算**:按 §7.5 剧本 A 逐晚走(茶种/时机注入)→ close_coin 档=逐客 pay 和;rep 跨档播报点与实值一致(含双向跌档);置办扣款与 upg 表;N3/N5 房租扣款;剧本 B:全错→免单→rent_short+danger+debt 流转+debt_clear+rep clamp 0。
|
||||
6. **听觉分层**:WATER/STEEP 时机窗内 voice 播放事件=0(看门狗 suppressed 断言);语音 start 事件与 boil/tick 活跃区间零相交;语音只在步间静默点。
|
||||
7. **打烊死窗+链锁**:进 CLOSE 同拍与 +300ms 各补一记在途 tap → 均被吞;结算链完整有序(close_open→coin→[rent]→[debt]→[chapter_end]→settle_night);链完成后单击=睡下→OPENING(night+1);N5 后 night_more+氛围客轮换。
|
||||
8. **看门狗双轨**:SERVE 10s/25s、BREW-TEA 12s/30s;乱按 96s 零进展 → 45s earcon/90s 短句/150s 重播点单句;有真实进展零提示;BREW 时机窗内只 earcon 无语音。
|
||||
9. **中断复述**:存档重进(客人粒度)→ sys_continue_ask→单击→复述链序 st_guest→st_rep→(BREW 加 sig+点单句)→recap_go;上滑同链可重放。
|
||||
10. **E1 豁免**:BREW 时机步双击=提壶/出汤(非重听);选茶步双击=重听茶名句;上滑状态链第一段=sig+点单句重播;BREW 长按=error(rateLog 断言 E3)。
|
||||
11. **菜单/置办/存档**:模态菜单循环-确认-关闭;CLOSE 菜单「打烊置办」二级列表;teaware 购后窗口 +0.8s 实测;sign 的 rep≥12 与 debt=0 门(upg_lock/upg_none 真话);「保存并回大厅」PUT data.summary 命中生成规则。
|
||||
12. **键盘变体**:`settings.input='key'` 后播 sys_help_k/tut_water_k 等 V 组(inputMode 联动);'touch' 回基础句。
|
||||
|
||||
**边界断言**:
|
||||
- 零惩罚:全 run 无 game over 路径;错茶免单但仍推进故事;rep clamp ≥0;purse 不透支。
|
||||
- 归因真话:water/steep 三档句与注入时机严格对应;res_wrong 只在茶错时播;「没出手」归「水滚老了/闷过了」(真实:未操作)。
|
||||
- SERVE 链播中单击=跳句(res_*/rent_* 不可跳)、双击=重听当前句、左右滑静默忽略;菜单关闭重播被停句。
|
||||
- BREW 菜单冻结:水声时间线/滴答全停(快进虚拟时钟断言零调度);关闭恢复从冻结点续走+复述句。
|
||||
- 屏蔽任意 voice 资产:链 8s 兜底推进,流程到打烊不死锁。
|
||||
- guide=off:全静、零定时器;资产齐套:voice 双性别 id 集合一致+NPC 平铺存在+sfx/bgm 双格式。
|
||||
- 首晚 FTUE:首输入 <60s(D0 ≈t+20s);首正反馈 ≤3min(D4 老周反应)。
|
||||
|
||||
**失败即不通过**:归因假话(档位句/结局句/反应句与数据实值不符);点单句与 teaByVisit 矛盾;同 seed 两次构造不一致;教学计入惩罚;CLOSE 链被手势截杀;时机窗内出现语音;免费重听(状态链)被收费或受限。
|
||||
|
||||
## 12. 节奏曲线(一晚/一弧线两级)
|
||||
|
||||
### 一晚(单局 13-17 分钟;首晚 17-20)
|
||||
|
||||
| 阶段 | 时长 | 内容 | 奖励点(≤60s 一个) |
|
||||
|---|---|---|---|
|
||||
| 开场 | 0:20-0:35 | 点灯+night 句(首晚 intro+教学) | — |
|
||||
| 客人 ×4 | 各 2.5-4 分钟 | 进门 15s→点单 20s→泡茶 45-75s→反应 25s | 每步 water_ok/steep_ok 即时确认;res 三档;反应句+币声;口碑跨档 chime |
|
||||
| 打烊 | 1:30 | 账目链→(房租/欠账)→(置办)→睡下 | 账目+置办+settle 钩子 |
|
||||
|
||||
- 每位客人=一个完整起承转合(P3 三分钟颗粒:任意客人结算后退出,回来一句话接上)。
|
||||
- 紧张度曲线温和:泡茶小局是每 3 分钟一个的「微专注峰」(时机步),其余是聆听叙事谷——峰谷交替,不疲劳(P4)。
|
||||
|
||||
### 一条弧线(3 晚,跨局)
|
||||
|
||||
晚 1 相遇(立谜:他是谁/他要什么)→ 晚 2 深入(话头展开+方向累计)→ 晚 3 收束(结局三方向)。跨晚钩子=反应句留白(「儿子的事,改天再说吧」)+ 结算 settle_night「明晚,茶馆还等你开门」;5 晚后 chapter_end 收第一章,无尽营业+二周目变体空间(氛围客 seed 轮换)。
|
||||
|
||||
## 13. 自检清单
|
||||
|
||||
| # | 硬约束/教训 | 自检 |
|
||||
|---|---|---|
|
||||
| 1 | FTUE 首输入 <60s | D0 ≈t+20s ✓(§5) |
|
||||
| 2 | 首正反馈 ≤3min | D4 老周反应 ≈t+2.5-3min(首晚宽窗保送好茶)✓ |
|
||||
| 3 | 学习期零惩罚 | 首晚窗口 ×1.3+教学明示茶名;全域无 game over;错茶免单非死亡 ✓ |
|
||||
| 4 | 失败三问归因+真话律 | 水闷各三档句按真实时机;res_wrong 只在茶错;「没出手」归「滚老/闷过」;§11 失败项锁定 ✓ |
|
||||
| 5 | 手势宪法三件套不豁免 | 上滑状态/下滑菜单/双击重听全状态保留(时机步双击偏离=豁免 E1 登记+教学讲清+状态链承接重听)✓ |
|
||||
| 6 | 教学承诺兑现 | tut_water/tut_steep 承诺的双击时机语义正片恒成立;settle_night「单击睡下」死窗+链锁后言行一致;upg 句报价=扣款 ✓ |
|
||||
| 7 | 结算链完整 | CLOSE 800ms 死窗+链锁(dungeon H1 内化)✓(§4.4) |
|
||||
| 8 | 档位措辞真实 | §7.3 表:每句措辞↔阈值区间一一映射;跨档双向播报;播报值=运行值(radio rep 教训+经营玩家对账最敏感)✓ |
|
||||
| 9 | 经济账目验算 | §7.5 剧本 A 五晚逐晚验算(27/23/28/25/33 收入、rep 0→12、purse 0→49、3A+2B)+ §7.6 剧本 B 欠账可达 ✓ |
|
||||
| 10 | 弧线三方向可走通 | sum 映射 A(≥2)/B(−1..1)/C(≤−2);每客注入全好/全错/混合三路径(§11.4);茶柜锁=设计内经营重量(剧本 A 证明全 A 可达)✓ |
|
||||
| 11 | 听觉负荷(本作特有风险) | 三重音时间串行零重叠;语音只在步间;滴答只进关键窗;时机窗内看门狗只 earcon;频带分离;并发声流恒 ≤2(§3.3 表+断言 6)✓ |
|
||||
| 12 | 信息密度 | 列表逐项预览(茶罐循环一次一罐一句);状态链 ≤4 段+需求重播;客人链句粒度可停可跳可重听 ✓ |
|
||||
| 13 | 向导层 | 签名 5 态(choice 登记不用);双轨看门狗(乱按必被抢救+时机窗静默特例);提示 idle-only/queue/onceKey ✓(§9) |
|
||||
| 14 | seed 可复现 | mulberry32+opts.seed;N1-N5 表驱动剧本夜;N6+ 轮换洗牌全 PRNG+深相等断言 ✓ |
|
||||
| 15 | P1 视障 | 双击=即时时机键(读屏手速友好);状态链=需求+第几位+口碑+存款随时可查;账目真实;5 音色群像+sig 三层冗余认人;2.2× 语速引擎既有 ✓ |
|
||||
| 16 | P3 通勤 | 每客人 2-4 分钟完整颗粒;中断复述「今晚第几位/口碑档」;菜单随时存档退出 ✓ |
|
||||
| 17 | P4 工人 | 零新手势;时机窗 ±1.5s 宽+超时自动继续(绝不卡死不挨骂);错茶故事照样走 ✓ |
|
||||
| 18 | P2 大学生 | 弧线三方向收集+章节完结+升级树+招牌追求(rep≥12)✓ |
|
||||
| 19 | 台词规范 | 163 句 ≤170;全句 ≤40 字(实测 ≤36);数字全分档整句(guest 5/rep 4/purse 3/coin 3/night 6);「重新听」写法;同角色 speaker+instruct 恒定 ✓(台词表) |
|
||||
| 20 | 键盘通道 | V 组 10 变体集中登记,inputMode() 选播;方向键/空格/回车全手势可达(§5.5 平行通道,游戏层零改动)✓ |
|
||||
| 21 | 引擎能力边界 | 无实时节点(one-shot 链+setTimeout 调度);sfx 无 loop 需求(调度链实现);tap 延迟只用于非即时;资产缺失静默跳过+8s 兜底;30MB 预算内 ✓ |
|
||||
| 22 | 密度下限(dungeon D0-3 教训) | 一晚=固定客序节拍器(结构性密度);营业态无进展轨兜底;客人间隙 1.2s 自动推进无真空 ✓ |
|
||||
Reference in New Issue
Block a user