我在GSC Game World(2001)中的Cossacks: European Wars上长大 - 数千个单位,部队,一个经济系统,它会在你一忘记食物问题时惩罚你。去年十月,我开始将其移植到浏览器中。教程和自由玩法已经上线:https://cossacks.b-cdn.net/dist/index.html?v=2(桌面,给它一些时间来加载)。
这不是一个“氛围编码的游戏”帖子。这是一个现有C++代码库的移植,结果是一个完全不同的问题。
源代码实际上是什么样子
253个文件,192,681行C++代码。Interface.cpp有16,883行代码,NewMon.cpp有16,629行。函数长度的中位数是合理的15行 - 但105个函数超过200行,29个函数超过500行,两个函数有2,517行。
最后这个数字就是故事的全部。在2025年10月,我使用的模型有一个200k上下文窗口。NewMon.cpp文件大约有145ktoken。一个文件,所有的问题都解决了,目标代码也解决了。
全源代码大约有1.3Mtoken。
所以“粘贴文件并问”从来都不是一个选择。同样,“提取这个函数” - 2517行的Cossacks函数不是因为重复而长,而是因为它是一个状态机,行2,400依赖于行80中的标志。
具体例子
NewMonster::CreateFromFile - 2517行,解析了整个游戏中的每个单位定义。在我的移植中,它是MonsterLoader.ts(140行)和commandHandlers.ts(2553行)。同样的量,形状完全不同:一个巨大的switch变成了一个分发表。这种模式在整个移植中都是如此 - AI在我提供了足够的函数后,很好地识别了形状,但在一次性存储2517行时就无用了。
路径寻找:我停止尝试聪明
Cossacks不使用普通的A*。它使用一个运动场/锁栏系统,这就是为什么数百个单位以一群形式移动,而不是死锁的原因。因此,我将该方法移植而不是替换它,因为我尝试的每个现代替代方法看起来都是不正确的,直到一个部队进入一个狭窄点。老引擎的奇怪解决方案就是因为它是奇怪的。
模型的阵容在我面前三次改变 - 三个月
我还保留了Cursor数据库,所以这些是真正的计数,而不是氛围。1026个会话,约17200个模型回复,88个活跃天数(99个日历天):
- 2025年10月(47%的所有回复) - Claude Sonnet 4.5(42%),GPT-5(30%)。Sonnet做了大部分翻译量,GPT-5处理了最难的反向工程问题。
- 2025年11月(33%) - Sonnet 4.5 + Sonnet思考(45%),GPT-5.1和Cursor的composer-1进行机械回复。
- 2025年12月(17%) - 一切都倒转:Claude Opus 4.5(44%)和GPT-5.2(39%)。这是当大幅度重构落地时 - AI军队,旅团系统,城市逻辑。他们在十二月份变得可行,十月份就不可行了。
- 2026年1月 - GPT-5.2高和Opus 4.5的3%尾部清理。
整个项目中,Sonnet 4.5是使用最频繁的模型(约5000个回复),GPT-5第二(约2700个回复)。
令人不舒服的收获:这个项目的难度在2025年10月到2026年1月之间每六周都下降了,原因与我变得更好无关。十月份我放弃的重构在十二月份就成功了。
结果:TypeScript + PixiJS 8,805个文件,155,857行。自定义.GP资源读取器(专有索引容器)提供了打包的图集,带有一个Real-ESRGAN过滤器,使2001年纹理在现代分辨率下生存。自定义ECS。
一个好的惊喜是原始本身。随着我越来越深入源代码,我对其设计的尊严越来越多 - 机械是紧密联系的,优化是由真实硬件限制所驱动的。许多我第一次读为怪癖的东西实际上是故意的权衡。移植它,我不是在改进这些决定 - 我是在试图不破坏它们。
评论 (0)