Files
blind/game/js/games/fu.js
T
xsl 866f363591 项目整理:重写主文档、归档过时文档、清理死代码、新增音频制作手册
文档整理:
- 重写 game/操作说明.md 为项目主文档(6游戏/6手势/旁白/模型生成音频/TTS两步流程)
- 归档过时文档至 other_docs/(林夏原始设计、旧执行文档)
- 新增 docs/音频制作执行手册.md(从零制作游戏音频的完整流程)
- docs/ 下保留旁白音色提示词、音频脚本

代码清理:
- 删除旧架构死代码: story.js / gestures.js / profile.js
- 删除耦合旧架构的过时测试目录 game/tests/

脚本配置修正:
- check_tts_env.sh: 启动脚本路径 AutoVideo → tts-server(实际位置)
- gen_narrator_samples.py: 硬编码地址改为环境变量,默认对齐 tts-server 端口 8000
2026-06-19 22:29:04 +08:00

126 lines
7.2 KiB
JavaScript

// games/fu.js — 《浮》
// 感官漂流。十二个声音漂过来,抓住还是放走。
// 结局:旁白读出你带走了什么。
const GAME_FU = {
id: 'fu',
intro: '你漂浮在某处。不知道是水,还是梦,还是别的什么。声音会漂过来。单击,把手伸过去。双击,看着它走。',
first: 'f01',
bgm: null,
ambience: '../audio/mp3/ambience/amb_apartment_night_01_v1.mp3',
initialState: { kept: [], released: [] },
scenes: {
f01: {
delay: 2000,
narrate: '第一个。像夏天傍晚的风,带着草的气味,你说不清是哪年夏天的。它停在你身边了。',
tap: { label: '把它留住', narrate: '它停在你手心里,有点暖。',
state: s => ({ kept: [...s.kept, '夏天的风'], released: s.released }), next: 'f02' },
doubleTap:{ label: '让它走', narrate: '你看着它慢慢飘走了。',
state: s => ({ kept: s.kept, released: [...s.released, '夏天的风'] }), next: 'f02' },
},
f02: {
delay: 1500,
narrate: '第二个。某人的笑声。你认识这个笑,但你说不清是谁的。',
tap: { label: '留住它', narrate: '笑声停在你耳边,还在回响。',
state: s => ({ kept: [...s.kept, '笑声'], released: s.released }), next: 'f03' },
doubleTap:{ label: '让它走', narrate: '笑声远了。',
state: s => ({ kept: s.kept, released: [...s.released, '笑声'] }), next: 'f03' },
},
f03: {
delay: 1500,
narrate: '第三个。一种说不清楚的遗憾。它没有形状,但是很重。',
tap: { label: '接住它', narrate: '你把遗憾抱在怀里了。它很重,但你没有放开。',
state: s => ({ kept: [...s.kept, '遗憾'], released: s.released }), next: 'f04' },
doubleTap:{ label: '让它过去', narrate: '遗憾漂过去了。你呼了口气。',
state: s => ({ kept: s.kept, released: [...s.released, '遗憾'] }), next: 'f04' },
},
f04: {
delay: 1500,
narrate: '第四个。很久没有过的安全感。轻轻的,像一床旧被子的气味。',
tap: { label: '留住它', narrate: '你把它裹在身上了。',
state: s => ({ kept: [...s.kept, '安全感'], released: s.released }), next: 'f05' },
doubleTap:{ label: '放走', narrate: '安全感飘走了。你看着它走。',
state: s => ({ kept: s.kept, released: [...s.released, '安全感'] }), next: 'f05' },
},
f05: {
delay: 1500,
narrate: '第五个。想哭但没哭出来的那种感觉。像喉咙里卡着什么。',
tap: { label: '承认它', narrate: '你承认了。那个东西松动了一点点。',
state: s => ({ kept: [...s.kept, '没哭出来的眼泪'], released: s.released }), next: 'f06' },
doubleTap:{ label: '让它走', narrate: '它漂走了。喉咙还是有点紧。',
state: s => ({ kept: s.kept, released: [...s.released, '没哭出来的眼泪'] }), next: 'f06' },
},
f06: {
delay: 1500,
narrate: '第六个。一首旋律,只有开头几个音,后面的你想不起来了。',
tap: { label: '哼几下', narrate: '你在心里哼了那几个音。后面的还是想不起来,但这几个音够了。',
state: s => ({ kept: [...s.kept, '那段旋律'], released: s.released }), next: 'f07' },
doubleTap:{ label: '算了', narrate: '旋律消失了。',
state: s => ({ kept: s.kept, released: [...s.released, '那段旋律'] }), next: 'f07' },
},
f07: {
delay: 1500,
narrate: '第七个。被需要的感觉。有人曾对你说过你很重要,你还记得那句话。',
tap: { label: '带着它', narrate: '你把那句话放进口袋里了。',
state: s => ({ kept: [...s.kept, '被需要的感觉'], released: s.released }), next: 'f08' },
doubleTap:{ label: '放开', narrate: '那句话漂走了。',
state: s => ({ kept: s.kept, released: [...s.released, '被需要的感觉'] }), next: 'f08' },
},
f08: {
delay: 1500,
narrate: '第八个。一个人的时候的自在。没人看着,没人要你做什么,只是你自己。',
tap: { label: '收下', narrate: '你把这份自在收进来了。',
state: s => ({ kept: [...s.kept, '独处的自在'], released: s.released }), next: 'f09' },
doubleTap:{ label: '不需要', narrate: '它漂走了。也许你现在不需要。',
state: s => ({ kept: s.kept, released: [...s.released, '独处的自在'] }), next: 'f09' },
},
f09: {
delay: 1500,
narrate: '第九个。害怕。不知道怕什么,就是有点怕。',
tap: { label: '承认害怕', narrate: '你承认了:我有点害怕。说出来之后,它小了一点。',
state: s => ({ kept: [...s.kept, '害怕'], released: s.released }), next: 'f10' },
doubleTap:{ label: '不理它', narrate: '你没有看它,害怕漂走了。也许。',
state: s => ({ kept: s.kept, released: [...s.released, '害怕'] }), next: 'f10' },
},
f10: {
delay: 1500,
narrate: '第十个。好奇心。对某件事、某个人、某个地方,你还有好奇。',
tap: { label: '带上它', narrate: '好奇心跳进你手里了,很活跃。',
state: s => ({ kept: [...s.kept, '好奇心'], released: s.released }), next: 'f11' },
doubleTap:{ label: '放走', narrate: '好奇心漂走了,也许它去找别人了。',
state: s => ({ kept: s.kept, released: [...s.released, '好奇心'] }), next: 'f11' },
},
f11: {
delay: 1500,
narrate: '第十一个。疲惫。真实的、身体里的疲惫,它已经跟了你很久了。',
tap: { label: '承认疲惫', narrate: '你说:我累了。疲惫点了点头,说我知道。',
state: s => ({ kept: [...s.kept, '疲惫'], released: s.released }), next: 'f12' },
doubleTap:{ label: '让它走', narrate: '疲惫漂走了。你感觉稍微轻了一点点。',
state: s => ({ kept: s.kept, released: [...s.released, '疲惫'] }), next: 'f12' },
},
f12: {
delay: 2000,
narrate: '最后一个。它没有名字。是你漂浮在这里时特有的某种感觉,说不清,但它在。',
tap: { label: '带走它', narrate: '你把它揣在怀里了,连同它的没有名字。',
state: s => ({ kept: [...s.kept, '无名之物'], released: s.released }), next: null },
doubleTap:{ label: '留在这里', narrate: '你看着它留在了这片水里,这片梦里。',
state: s => ({ kept: s.kept, released: [...s.released, '无名之物'] }), next: null },
},
},
getEnding: () => 'only',
endings: {
only: {
narrate: s => {
let t = '你漂回来了。';
if (s.kept.length > 0) t += `你带走了:${s.kept.join('、')}。`;
if (s.released.length > 0) t += `你放走了:${s.released.join('、')}。`;
t += '这就是今天的你。';
return t;
},
},
},
};