为现代电脑重建的《横扫千军》

查看原文 HN 讨论

文章摘要

Nanolathe 是一个开源游戏引擎项目,目标是让 1997 年 Cavedog 出品的经典即时战略游戏《横扫千军》(Total Annihilation,简称 TA)在现代的 Windows、Mac 和 Linux 上原生运行。它直接读取原版游戏的地图、单位和战役数据,网站上还提供一个无需安装、无需原版文件的浏览器试玩版,包含三个原版战役关卡。作者是 Daniel Taylor,网站页脚写着”Daniel Taylor 的业余项目”。项目名 Nanolathe 取自 TA 里建造单位使用的”纳米车床”。HN 上提交者是 jttnr,作者本人没有在评论区出现,下面主要根据官网首页、”关于”页、功能页和 GitHub README 介绍。

为什么要重建 TA。 作者在”关于”页里说,TA 发布时他还是个少年,后来跟其他玩家一起做 mod 和 3D 模型,再后来工作和孩子占据了这些时间。多年后重拾 TA,他想让它在自己的 MacBook Pro 上跑起来,这最终变成了一个重建引擎的副业项目。因为原版的美术、动画和界面都现成可用,他可以集中精力研究游戏是怎么运行的。他公开引擎和研究资料,是希望想做 mod、想调查 TA 某个老行为、或者想实验自己 RTS 的人都能用上。

先忠实复刻,再谈改动。 第一目标是尽可能还原零售版 TA 的行为。作者强调细节规则很重要:一个游戏可能看起来对,行为却不一样;有了可靠的基准,才好判断引擎的某个改动到底产生了什么效果。为此 README 里把玩法规则分成三档:默认的”Modern”(社区行为加上 Nanolathe 有文档记录的改进,如移动和建造优化)、”Strict 3.1”(复刻零售 3.1 版行为,连有记录的缺陷也保留)和”Community 3.9”(研究得出的社区补丁行为)。渲染则有更多自由:现代 GPU 渲染器加入了镜头缩放(从 2 倍特写一直拉远到全图,单位太小时改用阵营颜色的战术图标)、动态光照、爆炸照亮周围单位、辉光、流动的水面和反射折射、燃烧树木上方的热浪扭曲、刚被摧毁的残骸发光后逐渐冷却、飞机阴影随高度变柔和、金属与涂漆表面的不同高光,以及把原版 32×32 地形贴图块按局部图案匹配合成为 64×64 的更高细节版本。老派的 CPU 渲染外观也保留着,游戏中按 F10 随时切换,渲染选择不影响玩法规则。首页有一个可拖动的对比滑块,展示同一时刻一个 Jeffy(一种小型侦察车)在 Greenhaven 地图上爆炸、旁边的 Bulldog 坦克被照亮的画面,并附上了详细的截图条件说明,强调没有任何裁剪、修饰或重采样。

怎么摸清 TA 的行为。 作者先从录像、解码 TA Demo Recorder 的回放文件和往原版游戏里加载测试数据入手;当靠观察解释不了某个行为时,就借助对可执行文件的”净室”(clean-room)逆向工程来补全。研究文档会区分”已确认”“有依据的推断”和”仍然未知”。网站上还公开了大量文件格式和研究资料。

AI 写了大部分代码。 这一点作者在”关于”页里直接写明:AI 工具帮助分析录像、调查可执行文件、推导净室设计,编程工具写了大部分实现;他自己的角色是决定做什么、检查正确性、测试性能和处理各种失败。他说正是这种帮助让这么大的项目能用业余时间完成,即便如此,也花了几个月对照原版游戏测试,中间还有失败的尝试和放弃的项目。GitHub 仓库里的 AGENTS.md 给 AI 智能体定了”四条规则”:绝不臆造行为(未解决的问题留 TODO 并记录在研究文档里,”诚实的空白是完成,貌似合理的猜测是缺陷”);绝不撤销其他智能体的工作;”克隆行为,而不是代码”(反汇编、反编译输出、地址等原始资料只能留在单独目录里,进入研究文档和代码前必须转述为独立措辞的算法描述);所有人都在各自的 git worktree 里工作。

为什么用 Go。 作者说 Go 编译快,改一下用 go run 就能试,适合他的工作方式。垃圾回收在游戏里确实需要小心,比如在加载阶段分配内存、游戏中通过对象池复用,以减少回收器的工作,这方面还有性能优化要做。窗口、图形和音频由 Ebitengine 负责,整个引擎无需 C 或 C++ 编译器就能构建,安装也更简单。

目前完成度。 单人战役、遭遇战和”生存”模式大体完成,但仍有 bug、一些小功能缺失和兼容性问题。在线对战支持 2 到 10 人遭遇战、2 到 3 人生存模式,可以加电脑玩家、聊天、共享资源、结盟,桌面版和浏览器版玩家可以一起玩,每场战斗都会生成回放;断线重连和联机存档还没做。浏览器试玩支持桌面版 Chrome、Edge 和 Safari,Firefox 和移动设备尚未验证。完整游戏需要自己拥有的原版文件(GOG、Steam 或当年的光盘均可)。引擎代码采用 MIT 许可证,TA 的美术和其他游戏内容另有条款,项目声明与游戏版权方没有任何关联。作者接下来在做新的”Modern AI”、可选的移动改进和 mod 支持,目前已支持 ProTA、Escalation、TA Zero 等社区 mod 的部分版本。

HN 评论精华

本帖 697 分、约 270 条评论。作者没有参与讨论。评论区明显分成几股:怀旧和推荐其他 TA 系游戏、对网站 AI 文风的强烈反感、AI 辅助”净室”逆向在法律上是否站得住,以及对 Go 实现和画面改进的评价。

“去玩 Beyond All Reason 吧”。 讨论最多的反而是另一款游戏。modeless 推荐了 Beyond All Reason(BAR),一款开源的 TA 精神续作,他认为是同类中最好的,画面精良、生活质量功能丰富,还支持上百名玩家、数万单位的超大战斗,并贴了一场 150 人对局的视频。Buttons840 说他打过 40 对 40 的局,引擎轻松扛住,”实际上没有单位上限”;他还讲了个趣事:在那局里他按下暂停,在聊天里打了”门”(去开门),有人抱怨但没人取消暂停,几秒后他说”开玩笑的”自己恢复了,”那一刻我感受到了让 79 个人等我去开门的快乐”。关于 BAR 社区是否对新手友好,有人夸社区宽容,也有人说在 8v8 里练手时被骂得很惨,引出了一长串争论。iamnothere 认为 BAR 太”街机化”、更像在和星际争霸竞争,而 Forged Alliance Forever(FAF,《最高指挥官:钢铁同盟》的社区续命项目)节奏更慢、规模更宏大;也有人推荐同样基于 Spring/Recoil 引擎的 Zero-K。talloaktrees 提醒很多评论者没分清忠实复刻和单位、玩法都完全不同的”精神续作”;ThrowawayR2 说这个项目的价值在于能体验未经重新平衡的原版玩法,战役、音乐和旁白近三十年后依然经得起考验,”无论是谁做的,谢谢你”。killerstorm 也说 BAR 没有单人战役,而他很喜欢 TA 战役的氛围:”一场始于意识从血肉转移到机器的冲突,升级为摧毁了一百万个世界的战争。”

《最高指挥官》也想要一个。 arikrahman 希望《最高指挥官》(SupCom)也有类似项目,maqp 和 klibertp 解释 SupCom 的硬伤:模拟逻辑塞在单线程里,加上 Lua 及其垃圾回收的开销,大地图对战 AI 打到 40 分钟后,模拟 1 秒游戏时间可能要 3 到 4 秒。slightlygrilled 说他正在做 SupCom 的重建,已经接近同等功能版本,并展示了 64000 个单位的空战,后期对战 AI 仍能以 4 倍实时速度运行,引来一片求代码的回复。philipov 提到 TA 部分原班人马做的《横扫千星》(Planetary Annihilation),但多人觉得它没抓住原作的魔力,球形地图也不讨喜。

对网站 AI 文风的反感。 这是第二大话题,语气相当激烈。Jabrov 说”受够了 AI 网站”,rvz 看到首页的”同一场景。同一瞬间。”就关掉了标签页。joefourier 批评那种短促重复的句式(”一个开放的引擎。由你定制的空间。”“同一场景,同一瞬间,同样的爆炸,不同的氛围。”),质问到底是什么训练流程造成了这种同质化的风格。samstress 注意到 AI 生成的网站常在卡片布局里加”01、02、03”编号,几乎成了和破折号一样的 AI 识别标志;elxr 说只要告诉模型别加两位数章节编号就能去掉,做这些网站的人只是不在乎。JDups 说看到游戏 mod 这种为爱发电的项目满篇 AI 写的领英腔就很倒胃口,”如果你对自己做的 mod 感到兴奋,不需要 AI 替你描述它”;brettermeier 反驳网站可能正是项目里最不好玩、最适合交给 AI 的部分。Nition 指出页面说原版是”等角视角”并不准确,由此引发了等角、正交和俯视投影的术语之争。dweinus 问:页面文字都这么糊弄,凭什么相信代码更用心?也有几条更尖锐的”AI 垃圾”类评论直接表示不感兴趣。

AI 净室逆向合法吗。 noduerme 引用项目研究文档里”这是一份净室行为契约,不是源码翻译,刻意省略了可执行文件地址……”的说明,认为这和大多数盗窃、洗白一样”并不高明”。IshKebab 概括了做法:让 AI 逆向分析并写文档,再让另一个 AI 依据文档实现,他怀疑这在法庭上站不住,而且净室流程通常需要两个独立团队,这里只有一个人;他附上了律所关于”AI 净室法律危机”的文章,结论是尚属灰色地带。ThrowawayR2 举了康柏克隆 IBM PC BIOS 的例子,说 Linux 也是靠净室重写才没被 AT&T 或 SCO 告垮;IshKebab 被反问”Linus 写 Linux 时也没有两个团队”。noduerme 认为 LLM 本身就是一个巨大的反编译器加编译器,用它做的东西本质上不”干净”。skotobaza 和 gmerc 则强调发布包里不含任何受版权保护的表达,玩家仍需自备原版资源,”你得把版权重新定义为对潜在空间某个区域的所有权才行”。Rabbit504030201 斥之为”花了太多力气的盗版”,希望 GitHub 把它下架;skotobaza 反驳说你还得买原版才能玩,算什么盗版。mmaunder 对 AGENTS.md 的四条规则感兴趣,scotty79 认为那是人为了防止并行智能体互相踩脚而定的。

技术与画面评价。 提交者 jttnr 说抛开 AI 不谈,用 Go 实现这个选择很有意思,go.mod 里的 Ebiten 效果惊人;tholford 也说”Go 写的游戏引擎,喜闻乐见”。rfgplk 抱怨浏览器版加载要好几秒、光标明显延迟、画面卡顿,00deadbeef 则说原生 beta 版在 4K 下毫无卡顿。Retr0id 说他自己做引擎重写时也加过泛光,最后觉得俗气,认为这里的画面”增强”也有点俗,但完全理解那种冲动;Attummm、singingtoday、zombot 都觉得原版软件渲染更清晰、爆炸更好看。richardfey 花了一个小时没跑起来,说报错和文档很不友好。

怀旧。 mmh0000 说 TA 发布时他 12 岁,那是他最早的电脑游戏之一,也是他接触 RTS 的起点,后来改单位上限、加入 HEAT.NET 战队,”然后生活就来了”;sucrose 说小时候没电脑可用时,会把单位画在纸上摆在桌上玩。Melatonic 怀念原版那段旁白,AlexErrant 怀念 TA 的配乐。lproven 抱怨页面没解释 TA 是什么、原来跑在什么平台上,违背了技术写作”每一页都是第一页”的原则,cestith 和 matchstickman23 回应说首页明明写着,并补充了背景:这是 Cavedog 1997 年的 RTS,是 Spring、最高指挥官系列、BAR 等一长串游戏的精神祖先。