《星际迷航》这个大 IP 在几十年的工夫里衍生出了泛滥电影、小说和游戏,在各个领域遍地开花。自《星际迷航》系列游戏推出以来曾经有了多个系列,吸引了不少忠诚粉丝。
Emanuele Bolognesi 就是复旧游戏、复旧编程的忠诚爱好者。过来一段时间他利用全副闲暇工夫全身心的投入到了重写 1978 年的老版《超级星际迷航》中。
《超级星际迷航》是一个古老的纯文本游戏,是一种用 BASIC 编写的基于回合的空间策略模仿的例子。在这个游戏中,你是 Enterprise 星际飞船的船长,你的工作是侦察联盟空间并毁灭所有入侵的 Klingon 飞船。
游戏过程中你必须小心治理飞船的能量,应用相位炮和鱼雷捣毁 Klingon 飞船,并且找到星际基地来修复损坏并补充你的能量。所有这些,都是通过屏幕上的几个角色和丰盛的想象力出现进去的。
只管它很简略,但它是编程和游戏设计的一个很好的例子。你能够在提示符下管制命令的输出:NAV 挪动飞船,PHA 用相位枪停火,LRS 用近程传感器扫描象限等等。
《超级星际迷航》创立于 1974 年,在 1978 年由 Bob Leedom 撰写改良版本,并在《BASIC COMPUTER GAMES》一书中出版后大受欢迎。
《超级星际迷航》不是一个在磁盘上发行的游戏,这本书中蕴含了代码,人们不得不在计算机上输出代码。因为过后 BASIC 是一种通用语言,因而游戏代码能够在许多不同的机器上运行。
37 年后重温经典游戏
1983 年,Emanuele Bolognesi 买了一本意大利出版的书,书名叫《Zap! Pow! Boom! Arcade Games for the VIC-20 by Mark Ramshaw》。它蕴含用 BASIC 编写的 VIC-20 的 30 款游戏,其中第八个游戏叫做《星际迷航》。
Emanuele Bolognesi 将它全副拷贝到本人的 VIC-20 上。他说:“它很简略,但我立即爱上了它。这可能是我在那台电脑上玩过的最好的游戏。”
37 年过来了,Emanuele Bolognesi 才意识到这个程序实际上是 Leedom 的《超级星际迷航》的改编版。他立刻决定尝试原版的《超级星际迷航》。他在 Vintage BASIC 网站下载了 BASIC 解释器、游戏的源代码而后开始运行它。
重写代码,还原经典
对这款经典游戏重燃趣味后,Emanuele Bolognesi 开始搜寻这些年来是否有人用更易读的格局重写了这个游戏。但 1978 年的代码看起来很神秘,简直没有正文来解释它的算法。
Emanuele Bolognesi 在互联网上找到了很多游戏端口,但没有一个是 1978 年的《超级星际迷航》。这些新版本采纳了隐形安装、超新星、死亡射线等特色。但这些都不是最原始的版本,所以 Emanuele Bolognesi 本人重写它的代码。
最后,他抉择用 Perl 来编写,因为它是一种能够在任何 Mac 或 Linux 上运行的脚本语言,并且因为 Perl 具备 goto 语句。Emanuele Bolognesi 认为,至多在最后,不应用任何 goto 就移植所有原始的 BASIC 代码是不可能的。
然而,即便是简略的翻译也比他预期的要难,移植 500 行 BASIC 代码(尽可能打包)以节俭内存,这意味着每行蕴含用分号分隔的几条指令,并且没有任何空间。例如:
Emanuele Bolognesi 急躁地重写了每一行,尝试防止任何谬误,因为如果错过一点就可能扭转所有。他一开始采纳了 1:1 翻译,然而很快意识到了这可能导致无奈浏览。所以他开始将一些 if-then-goto 转换成 if-then-else 块。
从下面的代码中,能够在第 3170 行看到“THEN3500”,它会进行从行首开始的“for”循环(对于那些没有在 BASIC 中编程的循环,您能够输出“IF THEN < line-number”> 而不是“IF-THEN GOTO < line-number >”)。因而,Emanuele Bolognesi 在他的代码中把它变成了
break
(“
last
” in Perl).
Emanuele Bolognesi 很快意识到有些 gotos 跳到了一些意想不到的中央,比方函数的两头局部,或者某个块的两头局部。
急躁地辨认和拆散所有代码块是这项工作中最艰难的局部,但它对于了解游戏机制十分有用。只有是 Emanuele Bolognesi 相熟的代码,他还会给变量起一些有意义的名字,比方“EnergyLevel”而不是“e”或“TotalKlingonShips”而不是“K3”。
在 Perl 版本之后,Emanuele Bolognesi 决定将游戏移植到 LUA。为了做到这一点他基本上从头开始查看所有的代码。在 Perl 中,他应用了大量
next
(aka
continue
) and
last
然而 LUA 中没有一个,因而 Emanuele Bolognesi 不得不重写大部分循环。他说:“我不得不抵赖当初的代码好多了,而且我对所有的局部都十分理解。”在编写的时候,Emanuele Bolognesi 还给很多想要了解这个程序的人留下了很多评论。
显然,这项工作是永远不会实现的,代码还能够失去更多改良。然而当初,它齐全能够运行了,游戏的外观和行为都与原始游戏完全相同。
对喜爱复旧游戏的爱好者来说,重温经典比减少更多体验更有意义,因为有很多更新的版本曾经做到了这些。保留原有的货色,通过这种简略的形式重现经典也别有一番滋味。