认识 TASBot,一款由 Linux 驱动的机器人,为慈善事业玩电子游戏

作者:Allan Cecil

一款由 Linux 驱动的机器人能比你更快地玩电子游戏吗? 只有当他从钢琴卷轴中获得提示……并且不会失步时才能做到。

请允许我从工具辅助速通的简史开始讲起。那是 2003 年。当时,全球只有不到一半的发达国家能够接入互联网,YouTube 尚未诞生。智能手机还很罕见,并且处于起步阶段。奔腾 III 处理器仍然很常见,内存以兆字节为单位衡量。正是在这片原始的混沌之中,一个有趣的视频文件在网络上流传开来——一个 18MB 的 .wmv 文件,仅标记为“超级马里奥兄弟 3 时间竞速视频”[原文如此]。随之而来的是一段绝对疯狂的 11 分钟游戏通关视频,由一个名叫 Morimoto 的人完成,其中充满了险象环生、零死亡,并且马里奥在看似毫不费力地获得 99 条生命后摧毁了库巴。唯一的其他背景是一个日语页面的链接,而且那个时代 Windows Media Video 格式粗糙的编码使得休闲观众很难观察到这是一个模拟器录制,而不是真实的任天堂娱乐系统 (NES) 游戏机的输出。

""

图 1. Morimoto 2003 年的《超级马里奥兄弟 3》(SMB3) 时间竞速视频

事实上,该视频编码是使用 Famtasia NES 模拟器制作的,使用了工具辅助速通 (TAS) 重新录制工具,该工具包含一个由所有按键序列组成的“电影文件”,以及保存状态或 CPU 和内存快照,允许返回到之前的状态。本质上,Morimoto 通过使用工具增强了他自己的人类技能,这些工具允许他在对自己的游戏质量不满意时随时返回到之前的保存点。通过迭代备份并仅保留最佳结果,他创造了他当时认为的完美游戏通关。我第一次看到这段视频时,并不知道它是如何制作的,但它让我大为震惊,并让我产生了许多我找不到答案的问题。

人类速通社区成员自然对他们认为的未标记的憎恶行为感到非常冒犯,这类似于允许服用兴奋剂的运动员参加奥运会。他们的观点是,任何以任何方式增强人类原始能力的东西(即使像 PC 游戏中的键盘宏这样基本的东西)都被认为是作弊,而 Morimoto 的速通只不过是一个最好被忽视的骗局。其中既有吸引力,又有阴谋和分裂。回想起来,这正是新网站的完美配方。

一位名叫 Bisqwit 的勤奋观众对 Morimoto 的 SMB3 速通印象深刻,并在 2003 年末创立了最终将成为 TASVideos.org 的网站。他努力确保尽可能安抚人类速通社区,在所有工具辅助游戏编码上提供免责声明,以帮助确保后来的观众知道这并非纯粹的人类技能展示。他通过一个 历史复兴项目Morimoto 的速通 提供了背景信息。

其他人很快也加入了他的行列,一个蓬勃发展的社区团结在超级游戏和速通的创作周围,以及各种工具的创作周围,例如逐帧前进和嵌入式 Lua 模拟器脚本,以进一步实现“完美”输入,没有任何错误。受 Doom Done Quick 启发的较早的 TAS 速通,将分段的 Doom 速通推向了以前闻所未闻的极端,也被添加到该网站,使人们了解了比 Morimoto 的 SMB3 速通早得多的 TAS 内容。

我也是早期看到 Morimoto 的 SMB3 速通的众多人之一,然后我很快将其抛诸脑后,直到 TASVideos 的规模增长到大约在 2006 年引起了我的注意。到 2008 年,我已经以 dwangoAC 的名字加入了该网站,目的是提交我的第一个 TAS 尝试,使用 Linux 兼容的 FCEUX NES 模拟器完成 NES 弹珠台模拟游戏 High Speed。我加入了这个行列,因为 TAS 已经成为一种独特的艺术形式,锚定在 TASVideos.org,拥有一个组织严密的评审、发布者(视频编码器)和模拟器编码员社区。TASVideos 自此成熟为 TAS 内容的事实存储库,现在托管着大量跨越多个游戏平台的 TAS 电影。

自动演奏乐器:一段先有技术的插曲

我想暂时退后一步,谈谈一点历史。几个世纪以前,令人难以置信的发明家开始使用带有像超大音乐盒一样的钉子的大鼓,以及更复杂的装置,使用空气通过纸板、纸张甚至金属片上打孔的孔来驱动管风琴,从而创造了第一批自动演奏乐器。无论采用何种机制,最终结果都是一个预先安排好的音符序列,可以确定性地回放,这种艺术形式在 20 世纪 20 年代获得了广泛的普及。整个钢琴卷轴制造商行业都存在,他们或多或少地就家用自动钢琴的标准化钢琴卷轴格式达成了一致。

""

图 2. Aeolian 公司卷轴图书馆,西班牙马德里,约 1918 年;图片来源:pianola.org

一些钢琴卷轴是由著名的钢琴家坐在再现钢琴前制作的,再现钢琴会忠实地记录每一个音符(无论好坏),通常通过在纸卷上实时打孔,随着钢琴家的演奏进行。最终,经过几次尝试后,钢琴家的成果将令人满意,然后钢琴卷轴将被复制并出售给客户,以便在家中的自动钢琴上演奏。现代游戏相当于人类速通玩家录制他们的单段尝试,并在网上发布他们的最佳结果。

其他编排的音乐作品是通过手工制作的,方法是阅读原始编排,并一次一行地打孔,同时补偿诸如速度变化以及钢琴卷轴直径缩小导致纸张移动速度随着乐曲的播放而变化等因素。我会将此比作制作一个普通的 TAS。在某个时候,制作这些预先编排的作品的人拼凑在一起,钢琴键盘上有 88 个键,但人类只有十根手指,并推断出钢琴卷轴反正不是为人类设计的,因此添加一些额外的同时按键以增强作品的冲击力也无妨。几十年后的逻辑最终结果现在被称为 Black MIDI 作品,但这又是另一篇文章的主题了。关键是,如果你将人类的局限性排除在等式之外,你可以在许多艺术形式中做一些相当有趣的事情。

重放设备的黎明

随着 PC 规格在过去几年中的提高,使用增加的资源来提高模拟精度成为可能,而不会使模拟器变得难以忍受的缓慢。这使得一个更雄心勃勃的概念得以形成:获取 TAS 电影文件并强制原始未修改的游戏机以相同方式运行的想法。这项壮举依赖于对游戏机每个组件的极其精确的模拟,包括任何基于卡带的内存映射器和扩展芯片。理论是,如果模拟器能够足够精确地逐步执行整个系统的执行和相互依赖关系,那么逻辑上应该可以将相同的按键序列提供给真实的游戏机并获得相同的结果。这种确定性行为即使在看起来包含随机性的游戏中也是可行的,因为许多游戏机不包含外部熵源,并且依赖于玩家输入作为伪随机数生成器的唯一种子——这意味着从开机开始按顺序发送给定的按键序列每次都会产生相同的游戏状态。

这个想法最早在 2006 年提出,但直到 2009 年,一位名叫 true 的 TASVideos 用户才开始开发一种设备,通过控制器端口向 NES 发送预先录制的输入。同年,一位名叫 Jaku 的黑客独立创建了一种设备,该设备能够回放 SMB1 的整个第一关,这在 TASVideos 社区不知情的情况下。最终在 2011 年,micro500 成功完成了 SMB1 的整个通关验证,这要归功于 FCEUX 模拟器的精度改进,并且他创建了一个关于 如何构建他的 NESBot 的 Instructables 指南。DarkKobold 遵循 micro500 的指南制作了自己的设备,并在 SGDQ 2011 上公开回放了 SMB2Wizards and Warriors 3(稍后会详细介绍)。到年底,SoulCal 创建了一个名为 Droid64 的重放设备,该设备能够回放 N64 游戏 Super Mario 64 的完整 120 星通关。

从 2011 年开始,人们对使用重放设备在原始硬件上回放 TAS 电影文件越来越感兴趣,并将其称为游戏机验证,但只有少数创作者拥有必要的重放设备硬件。TASVideos 进行了更新,添加了一个特殊类别来表示已通过游戏机验证的速通,并使用真实游戏机回放速通的摄像头拍摄照片提供证明。GhostSonic 改编了他的重放设备以在世嘉 Genesis 上工作,后来 endrift 使用 Gamecube 的 Game Boy Player 创建了一个 Game Boy Advance 设备。尽管所有这些方面都取得了进展,但输入可以发送到游戏机的概念在 TASVideos 之外通常并不为人所知。

为慈善事业游戏

随着时间的推移,SpeedDemosArchive.com 或 SDA 成为记录人类电子游戏速通尝试的最常用网站。几位 SDA 用户决定举办一个慈善筹款活动,速通玩家将在其中连续完成一个又一个游戏,不停歇地进行 2010 年的 24/7 马拉松活动,他们称之为经典游戏速通 (Classic Games Done Quick)(向早期的 Doom Done Quick 命名致敬)。该活动取得了成功,为 CARE 筹集了超过 10,000 美元。组织者继续举办一系列越来越成功的为期一周的马拉松活动,每年两次在 GamesDoneQuick.com 举行,主要受益于无国界医生组织和预防癌症基金会,随着时间的推移,可以说在知名度上超越了 SDA。

早在 DarkKobold 在 2011 年夏季游戏速通 (SGDQ) 上使用 NESBot 时,这些活动仍然在组织者之一的地下室举行,但是当冬季的 Awesome Games Done Quick (AGDQ) 2014 马拉松正在计划时,这些活动的规模已经大幅增加,数百名与会者在越来越大的酒店宴会厅现场观看速通。大约在这个时候,我对亲自参加活动产生了兴趣,但我不满足于仅仅露面观看。我想以某种方式参与其中。很多人都有同样的想法,而且很明显,只有最有趣或执行得最好的速通才有机会入选。由于某种原因,与 TAS 相关的内容的想法最初并没有在我脑海中浮现(而且令人尴尬的是,我曾短暂地考虑过速通游戏 Scribblenauts Unlimited,直到我很快发现,如果没有更多的练习,我缺乏必要的技能,但我就此打住)。

随着时间的推移,我恢复了理智,想起了我的 TAS 根基,并自愿在活动中展示 TAS 重放。尽管有一些来自已建立的 SDA 成员的不同声音,他们仍然对 Morimoto 冲突感到不满,但总体反响是积极的。最终,TAS 提交被接受,并在马拉松赛程中分配了 30 分钟。

与游戏机对话(并希望它回应)

当我提交 AGDQ 2014 TAS 重放时,我最初不确定我是否可以成功完成速通的游戏机验证。当时,我没有任何硬件和有限的经验,并且熟悉从示波器到移位寄存器的一切事物是一个令人生畏的学习曲线。我从一位同事那里借了一个 Arduino,并开始尝试根据 micro500 的 Instructables 指南构建我自己的 NESBot。虽然从技术上讲我成功了,因为我能够回放 俄罗斯方块 的速通,但我很快就清楚地意识到,我在旧面包板上使用随意零件进行的业余尝试非常脆弱。在考虑了让该设备在飞机飞行中完好无损所需的条件后,我做出了明智的决定,放弃了该设计。

""

图 3. “脆弱”不足以形容 SD 卡引脚连接。

我的下一次尝试在理论上将从接线角度来看简单得多,方法是仅使用 Raspberry Pi 1 Model B 上的 GPIO 引脚以及一些电阻器,使其能够处理来自游戏机的 5v 电压。没过多久我就知道我需要帮助了,部分原因是我在电气工程方面超出了我的能力范围。像 zid 这样的人在漫长的故障排除过程中帮助了我,但在那之前,他们不得不耐心地帮助我理清控制器输入实际工作方式的精神模型。

当我还是个孩子的时候,我非常困惑 NES 控制器怎么可能工作。我注意到控制器上有八个按钮,但我只在形状奇特的 NES 连接器上看到了七个引脚,我以为每个按钮都需要一根单独的导线。在雅达利和类似游戏机上发现的早期设计确实做到了这一点,但随着添加到控制器上的按钮越来越多,使用移位寄存器变得有意义,移位寄存器可以并行摄取所有按钮,但将数据通过单根串行数据线发送到游戏机,以降低布线成本。

从 NES、SNES 或任何类似的串行控制器读取游戏机上的普通控制器上的玩家输入的过程如下。首先,考虑玩家正在按下一下或多个按钮的情况——假设是向右和 B 按钮以“为了伟大的正义而向右跑”。游戏向控制器发送一个锁存信号,有效地告诉它准备好被读取,然后发送一个时钟线信号,此时以约定的顺序排列的第一个按钮的状态从控制器返回到游戏机上的串行数据线;假设它是 A 按钮。由于未按下该按钮,因此通过保持线路高电平来发送二进制 0(逻辑在 NES 上是反转的)。对于每个按钮,该过程都会重复,在本例中,向右和 B 将在适当的时钟后通过保持串行线路低电平作为 1 发送回来。所有这些单独的按钮按下最终都将存储为内存中的一个字节(或者对于 SNES,为两个字节),以供游戏操作。所有这些都相对简单明了,但挑战在于,虽然锁存之间的时间通常以毫秒为单位衡量,但每个时钟脉冲之间的时间可能在纳秒级。

""

图 4. 锁存、脉冲(时钟)和数据线示例

回到可怜的 Raspberry Pi——在纳秒时间范围内进行 GPIO 轮询并不是它的强项之一。我们很快发现,由于 Linux 内核的 GPIO 引脚轮询频率不足,它经常会错过时钟信号,有时甚至会错过锁存信号。那时,我已经是 北湾 Linux 用户组 的主席,我想尽可能好地代表 Linux,所以我努力寻找一种方法将其纳入其中。解决方案是使用 true 设计的设备,他将他的 NES/SNES 重放设备命名为缓冲控制器输入,这使得 Raspberry Pi 能够以更易于实现的速率发送串行数据。两个板卡的融合安装在 R.O.B. 机器人上,这启发我将整个装置称为 ROBBerry Pi,但这个名字并没有持续多久。可能是由于我的(现在回想起来)有点糟糕的名字,多个社区成员一致选择了“TASBot”这个名字,并且这个名字流传了下来。我现在认为自己是 TASBot 的守护者,他是一个独一无二的个体,拥有自己的个性,他使用各种重放设备来参与他最喜欢的消遣:以非人的速度突破游戏。

""

图 5. TASBot 在早期 LEGO 积木之前的样子

贪吃蛇、乓和 ACE

对于 TASBot 在 AGDQ 2014 上的首次亮相,我们从 NES 游戏 Gradius 开始,但它在大约一分钟左右就失步了。失步类似于在自动钢琴上回放时纸卷卡住或撕裂;钢琴卷轴继续旋转,但你通常可以肯定不会从中得到任何理智的东西。在 Gradius 的例子中,输入与游戏状态在当时需要的状态失步的结果是在火山手中瞬间死亡。我们不情愿地将 Gradius 放在一边,转而进行由 Weatherton 和 micro500 领导的 Mario Kart 64 TAS 重放,该重放完美无瑕,并恢复了我们的信心。

AGDQ 2014 上真正引人注目的作品是 Super Mario World。Masterjun 在当时不久前发现了一个 SMW 中的 任意代码执行 (ACE) 漏洞,该漏洞使他能够完全控制游戏,使用人类不可能实现的技术,就像那些需要超过十根手指的钢琴卷轴作品一样。最初,我们只是打算用它来直接跳到片尾字幕,但在我们活动开始前的几个小时里,他能够完成一些更有趣的事情,即导致游戏出现故障,变成黑屏,然后突然开始用马里奥的头玩 Pong。随后是经典游戏 Snake 的实现。我们甚至移交了控制器,并让人类玩,以表明这不是一个把戏。

该活动的综合结果超出了我们以往的任何预期。包括 ExtremeTech,尤其是 Ars Technica 的 Kyle Orland 在内的多家新闻媒体报道了这些事迹,事后数十万人观看了 YouTube 上的恶作剧。在过去的八届 GDQ 活动和此后的几次辅助亮相中,TASBot 反复展示了黑客、程序员和像 Ilari、p4plus2、total、Lord Tom 以及许多其他人这样的杰出头脑的惊人才能。GDQ 活动上的 TAS 内容保守地为慈善事业筹集了超过 40 万美元,而 GDQ 活动本身为慈善事业筹集了超过 1600 万美元,并且经常在单次活动中突破 200 万美元,任何给定时间的现场观众通常超过 20 万。已经制作了多个新的重放设备,例如 true 独特的独立多重放设备、micro500 的 TASLink 4 端口和极其通用的设备,以及 total 基于 PSoC5 的高数据速率设备。

""

图 6. TASBot 与 dwangoAC 拿着的 micro500 的 TASLink 板

就我个人而言,TASVideos 网站工作人员,包括 Nach 和 Mothrayas,邀请我加入他们,我以官方 TASVideos 大使的身份加入了工作人员。在 Ange Albertini 的图形帮助下,我继续在 DEFCON、GeekPwn、Thotcon 和其他会议上展示了我们所做的工作,并展示了使用 TAS 技术在游戏中寻找漏洞如何帮助教授逆向工程技能。

TASBot 游戏的多种方式

我仍然对我领导的团队所取得的成就感到震惊。我可能是主要的组织者和演示者,但如果没有庞大团队的人才和动力,我们所做的这一切都不可能实现。TASBot.net 有一个完整的列表,您可以在其中看到一些非常疯狂的东西

  • 使用 micro500 的 TASLink 4 端口重放设备,通过相同的按键序列同时通关 Super Mario Bros. 1、2、3 和 Lost Levels
  • Super Mario Bros. 由于 p4plus2 构思和执行的真正富有灵感的设置, Super Mario World 内部 玩。
  • micro500 的 Brain Age 由诸如绘制狗头图片以及仍然用正确答案回答数学问题之类的艺术作品组成。
  • 来自 p4plus2 和许多其他人的 Pokemon Plays Twitch,我们在其中使用 Linux 脚本向 Twitch 聊天发送消息,并将其显示在超级 Game Boy 内的 Pokemon Red 中。
  • Sk'Hype,其中使用了两台用于立体声音频的 NES 游戏机和一台用于视频的 SNES 游戏机来执行远程视频通话,该视频通话完全从 Linux 脚本编写,帧率为 10 fps,并得到了由 micro500、MediaMagnet、p4plus2、total、Ilari、fuzyll 和许多其他人组成的庞大团队的帮助。
是电缆的问题

因此,如果您感到受虐狂,您可能会问自己是否可以在家中的复古游戏机上做到这一点。在某种意义上,答案是相当肯定的,因为存在几个参考设计可供选择——特别是 PSoC5 DevKit 板仅售 15 美元,尽管使用 Linux 刷新 total 的固件加载可能很棘手。然而,这不是最大的问题,因为这个荣誉归于电缆。最大的问题是,较高数据速率的速通需要一条甚至两条额外的 NES 或 SNES 数据线,这些数据线通常仅用于诸如光枪之类的东西,并且未在延长电缆上填充,而延长电缆是连接到游戏机端口的最简单方法。令人惊讶的是,很难向连接器添加额外的电线,因为它们通常只不过是薄箔,以使控制器电缆具有柔韧性。

即使您坚持只需要单条数据线的简单速通,也可能需要相当精细的焊接工作才能将延长电缆连接到足够耐用的东西上,以便悬挂在面包板上或直接悬挂在 PSoC5 上。除此之外,处理游戏机的 5v 性质也可能有点挑战。我们经常思考批量生产直接连接到 NES 或 SNES 游戏机的重放设备需要什么,但到目前为止,尚不清楚它是否具有市场可行性。

""

图 7. 您的电缆可能看起来像这样。

但是……Linux 呢?

在了解了所有这些背景知识之后,终于到了展示一些涉及 Linux 终端的东西的时候了。值得一提的是,除了某些明显的例外情况外,例如使用 Hourglass 重新录制框架回放 Windows 版本的 VVVVVV,每个 GDQ 活动主要都由 Linux 驱动。一些速通像第一个 Gradius 速通一样使用 Linux,仅仅作为一种通过 USB 连接的串行接口将存储在 Linux 设备上的数据位流推送出去的方法,但一些有效载荷已经做了更极端的事情。

有一种特别的设置将未修改的 SNES 推向了极限——一个完整的 16 位 32kHz 立体声音频播放器,我称之为 JukeSNES,它是由 total 使用大量在他之前的黑客的想法和代码片段创建的。如果您想在家中一起玩,您将需要一个相当令人生畏的设备列表,包括 SNES、Super Mario World 的副本、连接到电缆的两个控制器端口上的每条数据线,以及一个速度足够快以处理数据速率的设备,例如 total 的 PSoC5 设计。

下面列出的所有脚本和代码都可以在这个 GitHub 存储库 中找到。在关闭电源且 SMW 卡带上没有保存的情况下,连接所有设备后,运行 python3 play_r16y.py /dev/ttyACM0 smw_stereo_pcm_v6.r16m。脚本的第一个参数是重放设备连接到的串行接口,第二个参数是包含要发送的数据位流的文件,该文件由需要发送到游戏机的原始位字符串组成。(作为旁注,有为各个模拟器编写的单独的“转储脚本”,用于创建这些位流文件,但文件本身不包含有关存在多少控制器的元数据,因此一直希望找到有人站出来创建头文件格式。)

一旦一切都已准备就绪并连接好,下一步就是打开游戏机电源。如果一切顺利,游戏将开始,马里奥似乎会在第一关中做一些相当奇怪和随机的事情,最终触发一个故障,导致屏幕更改为显示有关播放音频的文本的静态视图。下一步是发出类似于以下的命令


ffmpeg -i http://radiotasbot.com:9989/ocremix" -hide_banner
 ↪-v quiet -f s16le -ac 2 -ar 32000 -acodec pcm_s16le - |
 ↪./tasbot_stream_snes_stereo16.py

其中 -i 后的部分可以是任何 ffmpeg 源。这里有很多东西需要解开,但本质上发生的事情是 ffmpeg 正在按摩音频数据以使用立体声、16 位、32-kHz 原始 PCM 音频,该音频被管道传输到流脚本中,然后该脚本将数据重新排列成我们重放设备中需要的确切位流格式。结果是声音优美的音频,它榨干了可怜的 SNES 的每一丝时钟周期。我个人使用该设备在 Twitch 上直播时借助 MediaMagnet 播放背景音乐,只是为了纯粹的极客信誉,但即使我承认它也极其复杂。

""

图 8. 如果您可以将其变得极其复杂,为什么要保持音频路由简单?

TAS 从此开始的旅程

走到这一步的道路漫长而曲折。我们过去的一些志愿者不幸离世。我们曾多次无法实现一个想法(Donkey Kong Country,我说的是你)。我个人也做出了一些我现在后悔的领导决策。尽管经历了所有的失误、失步的速通和拙劣的表演,我仍然为团队所做的工作感到自豪。

处理器现在足够快,可以使用 Linux 兼容的 Dolphin 模拟器(用于 Wii 和 Gamecube) 模拟像 Wii 这样新的游戏机,而 2018 年的 GDQ 活动也以 TASBot 玩 Gamecube 游戏为特色。奇迹般地,在我开始撰写本文之后,Clement Gallet 创建了一个名为 libTAS 的新的 Linux SDL 重新录制框架,这使得直接在 Linux 中 TAS 甚至复杂的 OpenGL 游戏成为可能。我一直对 TASVideos 上新提交的作品中展示的完美主义水平感到惊讶。Freenode IRC 上 #tasbot 的充满活力的社区以及 http://Discord.TASBot.net 桥接的社区,以及我在 http://Twitch.tv/dwangoAC 上的 Twitch 直播,已经发展成为一个由志同道合的优秀人士组成的惊人典范——即使用 TAS 内容为慈善事业筹款。能够成为比自己更伟大的事物的一部分,并且它涉及到我最喜欢的两件事:电子游戏和 Linux,这对我来说是一种个人的祝福和绝对的快乐。

资源

Allan Cecil (dwangoAC) 是 北湾 Linux 用户组 的主席。他担任 TASVideos.org 的大使,这是一个致力于使用模拟器以硬件允许的最快速度完成电子游戏的网站。他在 Twitch.tv/dwangoAC 上直播,并使用 TASBot 参与 Games Done Quick 慈善速通马拉松,以从未见过的游戏漏洞娱乐观众。白天,他是 Ciena Corporation 的高级工程师,致力于 OpenStack NFV 编排和 Linux 数据包性能优化测试。

加载 Disqus 评论