致敬 Atari 2600 上最好的游戏之一:《River Raid》
文章摘要
这是一个可以直接在浏览器里玩的《River Raid》(中文常译「河上突击」/「河流突袭」),原作由 Carol Shaw 设计编程,1982 年由 Activision 发行于 Atari 2600。页面标题强调它是「从原版 ROM 重建的卡带,一条指令一条指令地还原」:每一段河岸、每一座桥、每一个油库和每一发导弹的行为,都和真机一模一样。作者 Plicerin 的个人站点还挂着一个「经典移植」合集,主题是把 80 年代初的游戏从原始卡带、街机 ROM 和磁盘重建到浏览器里,再拿真 ROM 校验。
玩法说明。 页面本身就是一份精心写的说明书:玩家驾驶战机沿河向上飞,射掉挡路的东西;燃油每一帧都在消耗,「比看起来快」,低于四分之一时会响起警告音,飞过油库可以加油,但如果把油库打掉能得 80 分却失去补给。撞到河岸、桥或水面上的任何东西都会坠机。开局三架飞机,每 1 万分奖一架,最多九架。各类目标的分值也列得清清楚楚:油轮 30 分、直升机 60 分(旋翼是隔帧切换的两个图形)、喷气机 100 分(第三段开始出现,横穿整个屏幕并在边缘环绕)、桥 500 分,河岸上的房子 0 分,是「河上唯一不值钱的东西」。页面支持键盘、手柄和触屏(手机上有方向键和开火按钮),并解释了为什么手柄上所有按键都是开火——因为 Atari 摇杆只有一个按钮和八个方向。
4KB 里装下一条无尽之河。 页面最精彩的部分是对原版设计的讲解:整个游戏只有 4096 字节,河流从未被存储下来。每个 32 行高的河道块都是在滚入屏幕前一刻,由一个 16 位随机数生成器现场生成的,而这个生成器每局都从同一个种子 $A814 起步——这就是为什么河流永无尽头,却每次都一模一样。32 个块组成一段,每段以一条公路和一座桥结尾;奇数段是直的,偶数段蜿蜒并被岛屿分叉;越往上敌人越多、油库越少。坠机后河流会倒回本段开头并精确重放,因为卡带在那里保存了随机数状态。
不是模拟器,而是逐指令移植。 作者强调这不是在跑模拟器:卡带里的每个例程都被逐条 6502 指令改写成 JavaScript,并且在同样地址的同样 128 字节 RAM 上运作。为了证明这一点,旁边跑着一个小型 6502 核心执行真 ROM,每一帧逐字节比对。页面列出的数字是:4.5 万帧对比零差异、30 万个河流生成器状态(第 1 至 48 段)全部核对、开场画面 31840 个像素与 Stella 模拟器截图完全一致。GitHub README 进一步说明了各个模块:河道块生成器、160 条扫描线上的绘制模型、每块一次的硬件碰撞检测、状态栏内核,以及一个按 Ron Fries 的 TIASound 结构写的声音生成器;也坦承了已知差距,例如多项式噪声的 LFSR 相位尚未与 Stella 的音频逐一对比。
读 ROM 读出来的冷知识。 作者列出了说明书里从未提到的几处实现细节:内存里根本没有「分数」,六位数字其实是指向数字图形的指针,加分就是给指针做加法;碰撞完全来自 TIA 芯片的硬件锁存器,每个河道块读一次,没有任何碰撞计算;撞上船、直升机或喷气机坠毁时仍会给你记分;碰到房子跑的是和碰到油库相同的代码;当新块刚滚入时,最顶部的碰撞会被记到一个并不存在的「第七块」上,标志位落进了第一个对象的位置字节里。作者说移植版把这些全都保留了,「因为那就是这个游戏」。页面致谢了 Thomas Jentzsch 2001 年的反汇编和 Stella 的 NTSC 调色板,并声明 ROM 文件不随项目分发。
HN 评论精华
这个帖子只有 21 分、11 条评论,讨论规模很小,且大部分评论是对 Atari 2600 时代的怀旧闲聊,而非针对这个移植项目本身。
- plicerin(作者)只留了一句话,重复页面的副标题:「从原版 ROM 重建的卡带,一次一条指令。」DroneBetter 回了一句带刺的话,说要是有个「LLM 制造」的标签就好了,这样不声明使用 LLM 就可以被惩罚。这是帖子里唯一涉及 AI 的质疑,作者没有回应。(值得一提的是,项目 README 中提到其致敬页面是「claude.ai artifact 的源文件」,但页面本身并未专门说明开发中使用 AI 的程度。)
- glimshe 认为当年喜欢这款游戏的人大多早已不玩电子游戏了,和几乎所有 Atari 游戏一样,它很难吸引年轻一代超过几分钟,「但我仍然怀念它」。probablyStimmed 打趣问「几岁该戒游戏?替朋友问的」,glimshe 回答「等我戒了再告诉你」。
- sublinear 不同意,认为这款游戏放到今天依然站得住:操控做得好的老游戏,有一种专属于各自主机、别处找不到的「手感」;人们之所以忽视 NES 之前的家用机,正是因为缺乏对其中佳作的展示。
- sixothree 认为 NES 基本就是能吸引年轻人的分水岭。vunderba 表示赞同:他让在 PS3、Switch 时代长大的弟妹试过,2600 画面太原始(据说设计上同屏只能显示五个可移动对象);他还指出 NES 某种意义上「作弊」了,因为卡带里可以带 MMC3/MMC5 之类的扩展芯片,大大延长了主机寿命。
- dole 补充说 Atari 同样「作弊」过:David Crane 为《Pitfall II》设计了 DPC 芯片,Atari 自家的 SARA Superchip 用在《Crystal Castles》《Jr. Pac-Man》等后期卡带上,Starpath Supercharger 的游戏也明显更大更漂亮。他感叹从 1978 年 VCS 发布、1984 年《Pitfall II》到 1986 年《塞尔达》用的 MMC1、1988 年《超级马里奥兄弟 3》用的 MMC3,把运算和存储卸载到卡带的思路在短短几年里进步惊人。
- pupppet 说小时候觉得大多数 2600 游戏玩法太浅,玩几分钟就腻,唯独双人《Combat》例外;vunderba 附和说怀旧滤镜对他也毫无作用,但《Combat》确实好玩,因为子弹可以「拐弯」。