Proxyos Weekly 063
Laurence-042
- 2 minutes read - 250 wordsTL;DR 概览
优化了第二章的整体表现和剧情流程,优化了桌宠系统使其支持更复杂的对话,优化任务系统表现力
本期目标
- 把 demo 从 alpha 打磨到 beta
- 完成测试
- 第一章
- 【低优先级】xterm 的 col 似乎计算不太对劲,有时候一行末尾的字只显示了一半,需要看下 xterm 实现,必要的话进行修复
- 【低优先级】xterm 的 cursor_pos 在 cursor 不在视野内时返回末行 pos 是个 bug,而且在外面基本没法绕,只能修 xterm。这个 bug 不修会导致无法在向上滚动时正确隐藏输入区
- 第二章
- 修复剧本系统重构后不再合适的编排
- 全量测试
- 第一章
- 完成测试
- beta 打磨完成后
- 开个 itch
- 琢磨下宣传
进展速记
本期假设 / 预期
预期:
搞定第二章全量测试
结果:
勉强算是搞定了,还搞定了一大堆重量级修复和优化
本期确定性变化
新增:
- 为桌宠系统补充提示、闲聊与回顾的内容
- 为 debug panel 添加反解锁信息段、将事件重设为未执行的功能,以保证核心数据状态完全可以通过 debug panel 操作
- 添加在主路线但不强制看的额外信息来为对世界观有兴趣的玩家提供详细描述
变更:
- 让准备编程环境的 action 内置 unlock file 的调用,而不是在剧本里编排两者,以此高内聚低耦合
- 优化{{player_username}}等占位符的处理,将其中心化来方便后续维护
- 大改第二章的引入,以此让体验更加流畅
- 增强桌宠系统
- 大改其数据结构,使其支持对话树
- 调整数据组织方式,提高可维护性
- 调整布局,使其一致性更强,并降低认知负载
- 优化 tres 修复工具,使其可以自动处理错误的转义和声明顺序问题
- 带退出/取消的对话框的默认选项设置为取消,提高易用性
- ControlPanel 的时间显示调整为精确到分钟,来让玩家每次启动更有实感
- 优化任务完成反馈,添加了动画
- 优化调试面板的任务状态操作功能,现在其触发任务的大部分流程都和正常触发一致了
- 优化了任务更新时的流程,其会通过要求任务详情节点更新来实现,而不是摧毁后重新初始化
修复:
- 修复安全内核桌宠错误使用{{player_name}}而非{{player_username}}导致显示异常的 bug
- 调整文案,规避使用的 markdown 插件对下划线
_的处理不对导致部分文本出现异常的 bug - 消除所有告警(绝大部分是整数除法)
- 修复任务超时警告会终止玩家推进时间的 bug
- 修复玩家推进时间后任务详情显示的倒数时间不变的 bug
- 修复大改期间遗漏的第二章事件
- 修复序章时“记忆备份。txt”文件未出现在玩家的工作目录的 bug
- 修复调试面板没有正常根据选中的任务更新状态选择器值的 bug
删除:
主要进展内容/本期关键判断点
我做出了哪些「如果错了也要付代价」的判断?
大改第二章的引入,明确任务和剧本系统的定位
虽然我本以为自己已经搞好了,但是俗话说活到老学到老……又被自己教做游戏了
简单来说,之前的游戏循环是“玩家接任务-找信息段/写代码-提交信息段/提交代码”
但是这就导致一个问题:当剧情中玩家的行为到达一个检查点时,npc 本应自动反应,而不是等待玩家提交信息段/代码
或者更直观地说,当前的问题表现是:玩家在网站上完成了注册,那么按照设定 npc 会立刻做出反应,玩家也没有把注册结果提交给控制节点的理由。但如果玩家不提交,那就没法跟踪任务进度,进而导致这个期间缺乏中心化的玩家进度标识,导致 desktopPet 的“聊聊先前”、“随便聊聊”、“当前任务”都无法配置任务引用来作为提供内容的基准参考
我的解法是通过编排,保证任何时候总有至少一个主线任务处于激活状态,而对于叙事上不该作为任务显示的,就作为隐藏任务,并在玩家获得信息段后自动完成
虽然这看着有点 wow 当年兔子地狱的既视感,但我觉得就目前的设计来看,这确实是 ROI 最高的方案。如果硬要做事件和任务分层、将任务视为特殊事件,那反而平白带来了额外复杂度
桌宠系统的资源维护
之前 claude 实现的版本里,是按照模块划分资源的。比如桌宠系统就是单独的 desktop_pet 目录
但我觉得最好分架构来,章节中特有、任务中特有、章节后解锁、任务后解锁这样的桌宠回应应该和 game_content 的对应资源放一个目录(独立 tres,不合入现有资源,避免强耦合),然后随机的公共数据放 game_content 的 desktop_pet 目录下,由加载器(类似 TaskManager 加载 TaskDefinitio)进行加载
这样以后加资源的时候更好管理
也就是说,使用了如下组织形式
game_content/
desktop_pet/
global_pool.tres ← 全局随机,无条件
chapter_2/
desktop_pet/
chapter_2_active.tres ← 进入 ch2 后解锁
chapter_2_unlocked.tres ← ch2 全部任务完成后解锁(可选)
tasks/
task_01_sensitive_word_filter/
desktop_pet/
task_01_active.tres ← task_01 进行中时
task_01_unlocked.tres ← task_01 完成后解锁桌宠系统的架构变更
先前随机消息池和任务帮助是两套系统。前者是 Array[String] 的平铺文本列表,桌宠随机抽取一条说出来,玩家没有参与感;后者是 ExampleHelpRegistry(是的,之前 claude 写的示例我懒得改类型名就一直留到现在) + HelpEntry 的独立资源体系,用整数游标(help_cursors)依次消费提示文本。
寻思了下发现这个架构不太合适:随机消息是桌宠单方面发言、玩家只能看;任务帮助里的"先前任务"选项本质上也是闲聊性质的选项,和随机消息池功能重叠;两套资源类型(HelpEntry vs 文本列表)维护起来割裂。
所以把两者统一成了基于对话树的 PetChatPool / PetChatEntry / PetChatChoice 体系。每个 pool .tres 通过 is_help 标志区分"帮助池"和"闲聊池",结构完全相同。PetChatEntry 支持 choices[] 分支和 follow_up 线性链接,玩家可以参与对话;seen_branches 字段记录已访问的分支,支持渐进解锁。启动时通过 _scan_chat_pools() 自动扫描 game_content 各章节目录,无需手动注册注册表资源。
瓶颈与问题清单
哪些问题还没解,但也许我已经知道“它们不是什么”?
下期计划
- 把 demo 从 alpha 打磨到 beta
- 完成测试
- 第一章
- 【低优先级】xterm 存在一些bug,可能需要看下其实现并修复,麻烦的话自己实现一个xterm
- col 似乎计算不太对劲,有时候一行末尾的字只显示了一半,需要看下 xterm 实现,必要的话进行修复
- cursor_pos 在 cursor 不在视野内时返回末行 pos 是个 bug,而且在外面基本没法绕,只能修 xterm。这个 bug 不修会导致无法在向上滚动时正确隐藏输入区
- 【低优先级】xterm 存在一些bug,可能需要看下其实现并修复,麻烦的话自己实现一个xterm
- 第一章
- 完成测试
- beta 打磨完成后
- 开个 itch
- 琢磨下宣传
试玩版
暂缓,第一次上传需要做好准备,等进入 beta 阶段再说