Proxyos Weekly 039
Laurence-042
- 2 minutes read - 328 wordsTL;DR 概览
用 1000 目打磨了一会后发现得上 300 目,下期继续磨
本期目标
- 一个打磨完的 demo
进展速记(Changelog)
本期假设 / 预期
我当时以为世界是怎样的? 这个预期中,哪一条被证伪 / 被削弱 / 被确认?
估计会改不少文案,可能需要按需加些音效,ascii art 也得更新下
虽然预期的问题都搞定了,但问题比想象得多,下周继续改
本期确定性变化
哪些东西现在「更确定」或「被明确否定」了? “确认 X 不可行” “删掉 Y 抽象” “意识到 Z 是伪问题”
新增:
- 已解锁文件不存在的话,会在游戏开始时重新复制
- 添加音效
变更:
- 修正先前遗留的“文件管理器”相关描述,因为现在内置文件管理器已经被移除了,玩家只能“打开工作区”
- 整理了时间线,并确定了各个关键时间的发生时间,修正了相关实现
- @neuro_dominator 改名叫 @lucid_synapse 了,突然意识到和 neuro-sama 撞了
- 调整
ProxyOS_操作手册.md的内容,使其更符合当前实际 - 先前混用了“数据段”和“信息段”,统一为后者
- 调整了系统指南的和其他
.md文件的形式,改为了默认主页和。txt,否则玩家不知道.md的话就尴尬了 - 可维护性优化
- 改了 bootup banner
修复:
- 轻聊不该在序章就解锁
- 轻聊不该在没数据的时候显示当前联系人
- 注册后的应用查询异常
删除:
- 简化 bootup message 的输出方式,移除单独的前缀,统一用完整的 bootup message 文件
主要进展内容/本期关键判断点
我做出了哪些「如果错了也要付代价」的判断?
整理时间线
当时写剧本的时候一拍脑袋随便选了一个数,但现在看来以其为叙事年份十分不符合设定。所以重新整理了统一改了。
得益于一开始就在注意可维护性、避免重复实现,这个修改基本上只需要改一个 game_time 模块就搞定了
添加音效
这游戏设计有些特殊,因为其表现上是一个调试终端,设定上也是游戏中的开发人员所使用的工具,所以其音效逻辑也和其他游戏(甚至同属操作系统模拟类的游戏)有很大不同
虽然我个人觉得按照设定这玩意连 SFX 都不该有(毕竟是开发人员的调试工具),但是设身处地作为玩家思考,我觉得没有音效会天然带来“完成度极低”的偏见
所以 SFX 是肯定得加的,大致包含以下内容
- 终端按键声、命令回显、错误提示音 — 沉浸感和完成度
- 窗口开关、通知弹出、任务完成 - 操作提示
- 恢复模式的"模块修复成功/失败" - 情绪节点,音效能放大感受
但 BGM……说实话我不太确定。它平常肯定不该有啥持续 BGM,顶多有点环境音。但是这个环境音属实在设定上也圆不回去,而且我不认为玩家写代码的时候喜欢这个游戏悬浮窗发出空调嗡嗡声、远处机械声、电流噪声啥的。
但我想在一些关键剧情上,也许可以适当加些 BGM?不,至少现在我觉得没有那么大收益,反而可能因为做不好反而破坏了沉浸体验。玩家的情感调动应该是随系统切换和信息获取走的,加 BGM 反而画蛇添足
附属项目
更新 bootup banner 的时候意识到一个限制:这个游戏的 Terminal 宽度十分受限,所以必须使用-|/_等极简 ascii 来在较小的宽度下清晰展示出其形状。
我的 bootup banner 的原始图形是 svg 格式的,而当前市面上的 image to ascii art 工具大多生成的都通过重复特定符号来表现明暗差异来复刻有明暗过渡的图像,并不适用于我的场景。
因此,我需要开发一个为 svg 特化的、可以使用边缘检测等方式绘制极简 ascii art 的工具
然后呢,就是这个嘞:Laurence-042/mini-ascii-art
根据原图
生成的效果还不错,稍微改改就能用
++----++ //\ ++----++
\\ // \\ // \ // \\ //
\/+---++- - -++- --+\-- -++---+\/
\\\ ///\\ //\\\ ///
\+/+--++++--+\+/
/+\+--++++--+/+\
// \\\// \\/// \\
+- - -++- --+/- - -+
\\ /
++
//\\
++----++
\\ //
\\// 在这个附属项目里,我没再写完整 story,而是只写了个项目背景开头的技术选型,剩下都交给 claude 了。
反正这玩意复杂度不高,也只用一次,这种情况下没必要太细节。
沉迷副项目
这就是 ai 时代了,ai 辅助编程的情况下,我可以在审一个项目中 ai 写的代码是否满足要求的同时,让另一个项目中的 ai 也写着代码
而三线并行就会导致我还没看完代码,就有 ai 干完活干等了,而且我大脑内存也没那么大。
单线的话,ai 写代码的时候我就只能折腾和代码无关的部分
如果不搞副项目而是去做专门学习之类的,又会因为频繁切换上下文和注意力而收效甚微
所以最优解是双线搞项目,搞项目的过程也是学习过程
所以我把正在开发的这个游戏作为主项目,实验性质的奇奇怪怪工具作为副项目
这期我的副项目是一个翻译工具,主要是为了玩日文黄油。有个作者也不知道咋想的,拿 Light.VN 做了个回合战斗 RPG,然后市面上我能找到的非 OCR 翻译工具除了 RenpyThief 都歇菜了。而基于 OCR 的 WindowTranslator 又受限于 OCR 精度和缺乏翻译上下文,翻译出的结果质量不咋样。所以我准备做一个取百家之长,用 Hook 的精确文本补 OCR 的识别精度,用 OCR 的位置信息补 Hook 的文本区域,然后再带上翻译 context 来让对话翻译具备上下文,以此改善 llm 翻译质量
然后就经历了下面这样的天坑之路
- 不就是把 OCR 和 hook 结合嘛,windows 快速 ocr 然后用更高准确率的专用 ocr,最后和 hook 结果比对拿到正确文本,不就齐活了?
- OCR
- 不对,这 manga-ocr 识别准确率怎么还不如 windows 自带的日文 ocr
- 不对,聚合算法恐怕没我想的那么简单
- 不对,怎么识别区域歪了
- Hook
- 怎么尝试 hook Windows 的文字输出 API 时啥都没找到?噢跨平台引擎自己搞了文字渲染
- 怎么连 FreeType 都不带
- 全量 hook .pdata 指定的函数,看参数就完事了
- 卧槽 49k 各函数,游戏直接炸了。frida 太重了,切 minhook 并参考 Textractor
- 怎么 minhook 也 hook 炸了?噢 Textractor 也会 hook 炸,不是我的问题
- 别一次全 hook,渐进式地分批 hook、分批禁用 hook,这样活跃的 hook 不足之前的 1/10,这样可以尽量减少对游戏的干扰
- 怎么还在炸?噢还是太多了,得在 dll 里就做抑制
- 不对,为啥输出当前文本的函数地址一直在变?
- 不对,有些文本好像始终没显示?噢草,一直显示最高 score 的文本了,应该显示当前文本并更新 score 的
- 不对,函数地址还是一直在变?我得看看内存啥样
- 不对,一次发言里的两句话竟然是分两次输出的,而且 hook 到的两句话出现的函数不仅不一样,涉及这两句话的函数数量都不一样,这 TM 啥情况?我得看看内存
- 不对,这两句话在内存里到处出现,而且没有明显相近的,这玩意怕不是在一个复杂结构体里
- 欸对,我之前 hook 到的出现都是 r11 之类的寄存器,这些也不是函数入参寄存器啊,这 TM 是函数调用者的局部变量!难怪不稳定
- 哦我懂了,得找指针链,只看真函数参数,然后顺着参数里的指针找结构体,然后在结构体里找成员的指针和成员的成员的指针
- MD,性能垮了,尝试通过聚合、主函数识别等机制改善性能
不过不得不说,每个坑都确实让我学到了一些东西,也让我重温了已经快忘光的《深入理解计算机系统》,这种在底层思考预编译、解释型、JIT 的不同表现的经历更是让我自认为受益不少
瓶颈与问题清单
哪些问题还没解,但也许我已经知道“它们不是什么”?
下期计划
- 一个打磨完的 demo
- 但我够呛能打磨完,所以这里分个小目标:把界面框架打磨完,内容可以下下期
试玩版
预计第一个可玩版本将在第二章的主线内容完成后推出