文档整理: - 重写 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
126 lines
7.2 KiB
JavaScript
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;
|
|
},
|
|
},
|
|
},
|
|
};
|