破解《模拟城市 2000》存档

查看原文 HN 讨论

文章摘要

这是博客 Schemescape「个人计算机回忆录」系列中的一篇(发表于 2026 年 9 月 29 日),接在作者讲 Commodore 64 的那篇之后。作者自谦说这不是什么惊心动魄的故事,但它是自己学会「磁盘上的字节」和十六进制的那一刻,记忆鲜明,值得记下来。

童年时作者家里有一台米色的 Packard Bell 386SX 台式机,配 CRT 显示器,跑 MS-DOS 5、6。作为孩子,他把电脑主要当游戏机:《大地英豪卡门·圣地亚哥》、Operation Neptune、《俄勒冈之旅》、Scorched Earth、《模拟城市 2000》等;后来想起来其实也用过教育软件,比如音乐很棒的 Dinosaur Adventure,以及 Orbits——它会在各行星的模拟重力下同时丢鸡蛋,看哪颗落得最快,在冥王星上掉下的鸡蛋甚至不会碎(作者特意提醒,那时冥王星还算行星)。他还回忆起去 Egghead Software、Electronics Boutique 逛店,软件有精美大盒装也有成摞的 3.5 英寸软盘,并感慨那时你是真正「拥有」软件,而不是像如今这样只拿到有限授权或者干脆租用。

《模拟城市 2000》是一款等距视角的城市建造游戏。他其实玩得不多,也不擅长,总是钱用完了还没建成想要的城市。后来他得知(具体怎么知道的已经想不起来,他九成确定不是自己想到的)存档就是磁盘上的文件,可以修改。方法是:记下游戏里的金额,存档,打开存档文件搜索这个数值,改大后保存,再读档。但 DOS 自带的 EDIT 只能编辑文本,于是他接触到了「十六进制编辑器」,大概是 Norton Utilities 里的 DiskEdit。理解了十六进制就是在十进制基础上加上 A 到 F、凑成 2 的幂之后,他就能找到金额并改成全 F。

这里还有个小技巧:当时他以为存档用尽量少的字节写金额,比如初始 2 万美元(十六进制 4E20)只占两个字节,改成 FFFF 最多 65535 美元;于是他读档后随便赚几块钱,再重复一遍,就能改到 FFFFFF,约 1600 万。作者后来查了别人逆向出的存档格式才知道真相:数据经过游程编码(RLE),金额其实一直是有符号 32 位整数,只是高两个字节「0000」被压缩成了「8100」(意思是把下一个字节 00 多重复一次)。童年的方法照样有效,只要你的金额里没有重复字节。

他还记得爸爸应孩子们的要求,用 C(可能是 Power C 编译器)写过一个十进制转十六进制的小程序,他在文中用标准库重写了一个几行的版本。不过在复核记忆时他发现,DiskEdit 自带进制转换器,这一节完全多余。他还附上复现提示:DiskEdit 只在 DOSBox-X 中可用,需要通过 IMGMOUNT 挂载原始磁盘镜像,因为它直接操作硬盘而不经过 DOS 文件接口。

此后他几乎在每个游戏上都试过这招,后来还找到能在游戏运行时搜索并修改内存的工具(他记得叫 Game Wizard),可以随时把血量改满,他猜 NES 的 Game Genie 也是这么工作的。他总结作弊教会了他三件事:十六进制便于显示原始字节;磁盘上的文件可以随意访问(至少在 DOS 下,现在的手机上就没这么容易了);内存和磁盘上的字节都可以修改。这点基础看似微小,却为他后来在计算机方面的成功打下底子,也让他学会「赢」了《模拟城市 2000》之后,开始想让电脑去干一件更有野心的事:做自己的游戏。

HN 评论精华

讨论规模不大(25 条左右),主要是大家各自的童年「破解」回忆,以及对作者几处说法的纠正。

纠正与补充

同类回忆

今天的孩子还有这种机会吗?