下载 App

【聚光灯21天】DAY 12·配音、主题曲,和一次把载体换掉的转向

修改于10/2020 浏览 包含 AI 合成内容
TapTap
今天很长。上午在填内容(配音、歌曲),下午做了一个改变项目走向的决定:
封存 UrhoX(Lua)版,重开 H5(Vite + TypeScript)版。
这不是推倒重来——规则引擎一行不改,原样复用。

一、配音:从"部分覆盖"到"全量覆盖"

DAY 11 的 voice-manifest 只认三类:主线章节 / 抉择卡 / 结局。真跑起来立刻发现——随机事件、危机事件、历史修正(反噬)全是哑的。
这三种恰恰是玩家最需要声音的地方:随机事件是突如其来的插曲,危机是生死关头,反噬是"你逆天改命的代价"——默片一样滑过去,情绪全丢了。

给 manifest 加一层结构

原结构 chapters[剧本][章节] 装不下"不属于任何章节的事件",加一层 specials:
specials[剧本][事件id] = { segs = {正文音频...}, opts = {选项结算音频...} }
覆盖三类:随机事件(R-1…R-12)、危机事件(C-1…C-DEATH)、历史修正(corr1…corr9)。

反噬事件的 id 是算出来的

修正事件本身没有 id——CORRECTIONS 是个数组,条目只有 title/segs。音频文件得有名字,所以用下标当 id;但引擎侧拿到的是条目对象,不知道自己是第几个,于是反查下标:
lua复制
lua
local corrId = nil for i = 1, #self.d.CORRECTIONS do if self.d.CORRECTIONS[i] == c then corrId = i break end end
反噬事件复用同一批条目,所以也查同一个 corrId。

结果

类别条数
主线章节933
随机事件285
抉择卡228
历史修正133
危机事件124
结局82
其他142
合计1927 条 / 261MB

二、五首主题曲

双轨设计:先伴奏,后开唱

每曲分两条音轨——无人声版(inst)与有人声版(vocal):
进对局 → 从头播无人声版 → 放完接有人声版 → 有人声版放完回无人声版,循环
为什么不直接循环人声版:人声版有词,反复循环会烦。所以第一遍先给伴奏(进入状态),第二遍开唱(点题),之后回伴奏循环(不打扰)。
两个工程细节:朗读时自动压低 BGM(DUCK 0.45);人声版提前 1.5 秒切回伴奏(LEAD),避开尾奏留白。还有一处——引擎不暴露音频精确时长,循环点判不了,所以时长是 ffprobe 量出来写死在曲库里的。

五首,五个切口

第一版我自己不满意——因为写成了生平全景:序章、少年、发迹、巅峰、败亡,一段不落。那不是歌,是百科词条。
重写时立了五条原则:史实准确 / 新切口 / 去辞藻堆砌 / 重韵律 / 立意明确。核心是去百科化——一首歌只取"那一刻"。
剧本曲名切口
李斯《上蔡叹》刑场临刑前,对儿子说的话
荆轲《易水寒》易水送别,唱罢就车而去
韩信《淮阴月》长乐宫钟室之死
陈胜《无相忘》誓言「苟富贵,无相忘」与其背叛
项羽《不肯过江东》乌江渡口,亭长撑船来迎,他不肯过
每句词都得有史书出处,存档里配了意象对照表(如"上蔡东门一条黄狗追一只兔"出《史记·李斯列传》)。

三、转向:封存 Lua 版,重开 H5 版

TapTap
这是今天最重要的决定。

封存的是什么

封存日期   2026-10-12
封存标签   archive/urhox-lua-2026-10-11
冻结范围   scripts/(Lua)只读不改;prot/ 继续作为规则真源被 H5 复用
不是废弃,是封存。 Lua 版本身是完整的——规则引擎、五本剧本、60 张抉择卡、UI 全套、存读档、音频,全部跑通。

为什么不重写规则

因为规则早就不在 Lua 里了。
这个项目的规则真源一直是 JS(prot/engine.js)——Lua 是它的逐位移植,两者由 100 局对拍网守护(p2-replay:同种子 ⇒ 同轨迹)。所以换载体时:
规则引擎  → prot/engine.js 原样复用(H5 用 Vite alias 指过去,不拷贝)
剧本数据  → prot/lua-data/*.json 原样 import
对拍网    → 继续守护同一份代码
换掉的只是"渲染层",不是"游戏"。 这是这个项目架构上最值钱的一笔:DAY 6 把规则抽成 JS 真源 + Lua 移植时,没人想到它会在 DAY 12 救回整个项目。

换掉的理由

维度Lua 版(UrhoX)H5 版
布局Yoga + NanoVG,踩了一路的坑浏览器 CSS,原生能力
调试只能看日志DevTools 断点 / 元素检查
验收人肉点CDP 自动化(真 Chrome 跑)
类型EmmyLua 注解TypeScript 强类型
工具链受限Vite 生态
Lua 版 DAY 8–11 的日志里,一半篇幅在修布局:flexShrink 默认 0、百分比宽在 content-derived 父容器下塌成 auto、nvgIntersectScissor 只裁矩形、立绘贴图比例……这些坑浏览器里根本不存在。

但坑不是白踩的

封存说明里专门留了一节 “已验证的视觉规则(P3 复刻时照搬)”——Lua 版真机趟过的 9 条结论,H5 直接复用,不必重踩:
规则说明
立绘底部锚定按底边对齐,不随容器高度居中
贴图比例卡片宽高按立绘 512:768 反推,勿用自适应宽
容器重建须 Destroy只 detach 不释放 → 长会话内存单调增长
跨重建复用的控件先 Remove罗盘等常驻控件须先摘除再销毁,避免连坐
clearMain 先 cancel 再 clear渐显队列会回填内容,顺序颠倒会残留上一页文本
…(共 9 条)
同一个坑不该踩两次。 换了载体,这些结论照样成立——因为它们是布局语义层面的,不是某个引擎的怪癖。

H5 版已经长什么样

h5/ 目录已开工(83 文件 / 2.4MB):
h5/src/
  main.ts           145 行   入口 + 启动自检(证明 @engine / @data 两条链路通)
  game/session.ts   794 行   会话层
  shell/shell.ts    110 行   外壳
  shell/scale.ts    122 行   分辨率缩放
  ui/kit.ts         112 行   UI 套件
  ui/radar.ts       105 行   雷达图
  data/scenarios.ts  36 行   数据管线(@data → prot/lua-data/*.json)
  styles/          1440 行   art / base / game / stage
h5/tests/                   浏览器验收:chain / viewports / backtrack
h5/scripts/verify-data.mjs  构建期数据门禁
两处值得记的设计:
① 构建期数据门禁。 dev/build 之前强制跑 prot/p1-verify.js —— 数据一旦跑偏,dev 直接不启动,而不是等对拍到才发现。(这个门禁的存在本身有来历:DAY 10 曾因只重生成 golden.json、漏跑 p1-convert.js 而让 p1-verify 由绿转红。)
② 浏览器验收测试,不引 Playwright/Puppeteer。 Node 18+ 自带 WebSocket,直接说 CDP 就够,省下几百 KB 测试依赖——和首屏体积预算的目标一致。
三套测试各管一件事:
文件验什么
chain.cjs李斯第一章全链路(序章→词条→行动卡→关键事件→选项→属性增减→章末)
viewports.cjs8 种视口下布局不塌(窄屏右栏 13rem 定宽会挤爆叙事区,已加 880px 断点降级)
backtrack.cjs回溯按钮 → 确认浮层 → 回章首(验成就与偏离度不重置、配额按章计、coef 衰减)

四、附带登记的已知问题

成就图标:64 个缺失

prot/test-ui-contract.js 是测试套件里唯一的红灯:89 通过 / 5 失败,5 个失败是同一契约"成就图标"按剧本各报一次,合计 64 处引用、60 个去重成就 id 缺图。
关键判断:assets/ach/ 目录根本不存在,且 git log --all -- assets/ach 命中 0 条——这一整类资产从未进入过版本控制。
所以不该把它塞进 EXEMPT 豁免表:逐项豁免是"个别项待交付"的性质,把 60 个 id 一次性写进豁免,会让这条契约永久变绿,把"整类资产缺席"这个真实缺口永久掩盖掉。
登记为已知问题,不阻塞 P2(P2 只做最小可玩闭环,不渲染成就面板)。修复留给 P3(美术复刻)。

差分测试抓不到的东西

封存说明里记了一条方法论级的教训:
对拍网能证明「JS 与 Lua 一致」,不能证明「两侧都对」。
实例:抉择卡重复结算——choiceUsed 只过滤强制发牌候选,未从普通抽牌池剔除,导致已落定的"一次性"卡被再次发出并二次结算。JS 与 Lua 完全同错,所以 100/100 全绿仍然放行。DAY 10 由独立审查发现并修复。
建议:H5 阶段为关键规则补不依赖 JS 的独立断言(例如"抉择卡落定后 N 轮内不得再出现于 offer")。

今天的数字

项值
配音1927 条 / 261MB
主题曲5 首 + 待机曲,每曲双轨
Lua 版封存规模scripts/ 21 个 .lua / 30,393 行(冻结)
规则真源prot/ 35 个 .js / 16,179 行(继续维护)
H5 版开工83 文件 / 2.4MB
新登记问题成就图标 64 缺失(不阻塞)

今天最值钱的一条

封存不是失败,是止损;而复用规则真源,是前面九天里最值钱的一次架构决定。
如果把规则写在 Lua 里,今天的转向就是九天的重写。但因为 DAY 6 把规则抽成了 JS 真源 + Lua 移植(由对拍网锁死等价),今天换载体时:规则一行不改,数据原样 import,测试继续守护同一份代码——换掉的只是渲染层。
“把什么东西放在哪里”,比"把什么东西写得多好"更早决定命运。
写歌也是一样:"写全"和"写准"是两件事。第一版五首我"写全"了(生平一段不落),却没有一首"写准"(没有切口)。删掉四分之三,只留那一刻,歌才立住。

明天

  1. H5 版 P2 闭环 —— 把 Lua 版跑通的那条链路(序章→…→下一章)在浏览器里重建
  2. 浏览器验收常跑 —— chain / viewports / backtrack 三套进日常
  3. 独立断言补强 —— 针对"两侧同错"这类盲区,补不依赖 JS 的断言
  4. 音频真机验收 —— 1927 条配音 + 5 首曲的播放/循环/压低
horizontal linehorizontal line
载体:转向 H5(Vite + TypeScript),规则引擎复用 prot/engine.js · Lua 版封存于 archive/urhox-lua-2026-10-11 · 状态:配音 1927 条 + 五首主题曲;H5 版开工 · 对拍网:100/100 全绿
【童谣镇】聚光灯第二次开发日志截图
【童谣镇】聚光灯第二次开发日志
开发进度: 美术 1、主角人物立绘已细化完成 2、所有NPC的QQ人形象与呼吸动画已设计完成 3、大部分UI界面已设计完成 4、面包房建模与树屋建模以及基础房屋、路灯、树木模型已完成。 5、制作过场动效,制作通用动效材质ing 6、广场资产替换、永续桥和植被的资产替换、房屋资产替换,河流制作 7、学校模型的材质完成 8、石墩子、小道具模型制作ing 9、NPC正比胸像绘制ing 策划 1、任务系统
11 赞
10 回复
《卡牌工业》开发日志 01|从“涌现”到产线对打截图
《卡牌工业》开发日志 01|从“涌现”到产线对打
大家好,我们正在用 Godot 做一个暂名《卡牌工业》的游戏。目前已经跑通了最小的生产与战斗循环,也做了两轮迭代。这篇先记录一下:面对“涌现”这个题目,我们讨论过什么,又为什么最后收敛到卡牌和工厂。 第一步:头脑风暴,涌现可以是什么? 刚看到“涌现”这个题目时,我们的想法几乎朝每个方向散开了。塔防、物理搭建、探索、解谜、经济系统、叙事,甚至增量游戏,都能让简单规则在玩家的操作中长出新的结果。再想下
1 回复
《气味之城》开发日志#1|为什么"涌现"和猫是天作之合截图
《气味之城》开发日志#1|为什么"涌现"和猫是天作之合
大家好,我是一个人报名了 2026 聚光灯 21 天游戏创作挑战 的独立开发者。今年主题公布那一刻我就笑出了声——涌现。因为我已经想做这个游戏很久了: 《气味之城》:你不是猫神,你只是一只猫。 先说一个所有养猫人都懂的事实:你永远无法"教会"一只猫任何它自己不想学会的事。但你家猫可能自己学会了——听见冰箱开门就瞬移到厨房;你心情不好时过来踩奶;凌晨三点准时在你身上练马拉松。没人教过它,这些行为是它
3 赞
6 回复
00:30
《失心》游戏开发者日志01|游戏UI迭代及实机演示截图
《失心》游戏开发者日志01|游戏UI迭代及实机演示
进入《失心》之前,玩家首先看到的是我们工作室 UNLOOK 的标识。我们将原来的标识转成 SVG,并让其中的红色瞳点转动、观察,再逐步显露完整字形,希望这个短暂的开场能带出一点好奇和不安。 这次《失心》的开局 UI,我们围绕小灵通(因为游戏的主要交互道具就是小灵通)做了几轮调整,希望玩家从打开游戏开始,就能感受到故事里的年代和气氛(故事年代背景为2000s)。 早期版本先确定了一个方向:把菜单放进
15 赞
10 回复
00:34
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!截图
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!
- 人类曾因掌握元素合成技术而一度辉煌,又因滥用元素能量而逐渐从内里衰败。 - 30世纪80年代。社会文化充斥着激进乐观主义与庞大机械美学,在这里,污染和能源共生,幸福与痛苦并存。官方广播和宣传画里依旧在宣扬“科学将战胜一切”、“元素能量将再造新农田”的口号,而世界主城却已经因为污染过度而濒临崩溃、空间挤压严重。为了寻找新的生存空间与无污染能源,官方启动了“重构拓荒计划”。 - 玩家将作为前线拓展
18 赞
6 回复
00:07
雨天決行 开发者日志02-人工智能的自我修养截图
雨天決行 开发者日志02-人工智能的自我修养
又和大家见面啦!第二篇日志,说实话一开始不知道该怎么编排,但团队里惊喜的成果越来越多,我们已经迫不及待把更新的内容端上来给大家啦!那么事不宜迟,快来看看都有什么新情报吧ദ്ദി˶ー̀֊ー́ )✧ 一.美术(重磅升级) 以主美小为的生命力作为燃料(bushi)本次美术组取得了大进程!首先是各个ui界面的优化和细化,上次大家看到时还只是初具雏形的草稿,现在大多都完整起来了哦! 同时,随着配色的补全,手
43 赞
36 回复
00:10
群迹·上取其下,下取其上截图
群迹·上取其下,下取其上
#聚光灯gamejam开发者日志 向大家汇报一下今日进度,目前在和蚁群的默认移动算法进行斗智斗勇。或许是我的AI对蚂蚁有别样的理解,其实最初写出的方案更接近于围绕着恒星公转的行星。 哦我还以为文章里可以插入多支视频视频,想要展示一些其它的运动方式,可惜了。那么就简单在上方传一个比较典型的,有点类似于蟑螂的运行方式。 目前仍在解决蚁群的随机运动,和玩家可操纵性之间的平衡问题。以及如各位所见,目前的
4 赞
1 回复
【2026聚光灯日志01】什么叫你把手牌,骰子和战棋融合了?截图
【2026聚光灯日志01】什么叫你把手牌,骰子和战棋融合了?
大家好啊,我是官方小编,一位还在学校的独自开发的苦逼带学生 这次算是第二次正式参加GameJam,而这回的比赛主题是【涌现】 嗯…老实说,一开始我还真只是从中文语义上来看,理解成“大量的出现”,直到询问ai哦哦哦我这就才想起来还有英文的“整体大于部分之和”意思来着 说起这个主题的意思,立马想起的类 吸血鬼幸存者 ,或者是 文明 系列的各种爆怪,爆兵的设计,即大量的出现敌人或者单位 而从第二个
4 赞
4 回复
00:48
Day1 《逆种》截图
Day1 《逆种》
《逆种》 俯视角快节奏近战动作 Roguelite。 你的打法是自然选择,5 层进化的终点,最终 Boss「逆种」是你亲手培育的克星。 一局 8-15 分钟,死亡即收获,你的怪物通过分享码替你和全世界打。 一、九项核心决定 # 决定项 结论 1 战斗手感 近战为主·哈迪斯风(轻三连段/蓄力重击/冲刺割裂/处决) 2 进化透明度 渐进式透明(表型可视化 → 仪式 diff → 扫描仪 DNA 面板)
4 赞
6 回复
开发者日志#01:涌现!! 披着科幻外衣的涌现式增量游戏!!!!截图
开发者日志#01:涌现!! 披着科幻外衣的涌现式增量游戏!!!!
随着Game Jam 主题公示,我们团队立马着手维持了三天的激烈讨论!决定做一个披着科幻外衣的蚂蚁农场以boids算法为灵感的涌现式增量游戏!!! 至此,方案敲定,我们团队将开发一个可升级的自主群体模拟,并且初步规划了玩家游戏时的体验流程: (1)阶段1(开局30s,触发痛点,会有一次提升,但是游戏仍然艰难):一张地图分布着资源点和仓库,玩家此时只能徒手采集资源点的矿石拖入仓库,矿石可以造机器人;
14 赞
7 回复