第 8 章
半按A键的十六年
审核队列里的那个提交在管理员专区挂了将近一个月。不是因为有争议。恰恰相反——每一位看过录像的管理员都确信它是真实的。
问题在于,他们不知道该怎么对待它。SDA的规则体系经过七年演化,已经能够处理绝大多数提交。计时起点、计时终点、允许使用的版本、禁止的外部工具——每一款游戏的主页面下都挂着详细的分类规则,像一部不断增厚的法典。但这部法典预设的前提是:跑者追求的是更快。所有条款都围绕“如何公平地比较完成时间”展开。
而这个提交完全不同。它不宣称自己更快。它宣称自己更少。提交者使用的游戏是《超级马力欧64》。他完成了一次通关——马力欧进入了城堡后院的那个最终管道,面对库巴,拿到了通关画面。整个过程没有使用任何作弊码或外部修改工具。但他只按了完整A键十九次。
在正常的any%速通中,即使是最激进的路线上限,A键按压次数也在四十到五十次之间。十九次意味着他省去了一半以上的跳跃动作。而他的总完成时间比当时的any%世界纪录慢了将近四十分钟。
Radix在管理员专区把录像从头到尾看了三遍。他认识提交者的ID——一个在SDA论坛上活跃了两年多的用户,此前提交过几次中规中矩的《超级马力欧64》速通录像,成绩都不算顶尖。但这次提交附带的说明文档有十二页。文档的第一句话是:“这不是一次速通。这是一个证明。”
文档详细列出了游戏中每一处通常需要按下A键才能通过的位置,以及提交者用来绕过这些位置的方法。有些方法是已知的——利用墙壁碰撞的误差积累让马力欧“爬”上本来跳不上去的平台,利用特定角度的落地取消硬直帧来连续移动而不触发跳跃判定。
但大部分方法是新的。或者说,大部分方法在速通社群中从未被认真对待过,因为它们太慢了。在一个以帧为单位的竞速世界里,一个需要花二十秒才能完成的替代方案——哪怕它省去了一次A键按压——毫无意义。没有人会为了省一个按键而牺牲二十秒。
但这个提交不在乎时间。Radix在管理员专区发了一个帖子,标题是:“我们需要一个新的分类吗?”接下来的三周里,那个帖子盖了将近四百层楼。
这场讨论暴露了一个SDA从未正式面对过的问题:速通的“速”字,到底是不是本质性的?如果一个人用更少的输入完成了游戏,但花了更多时间,这算不算一种值得被记录和排名的成就?如果算,计时还重要吗?如果不计时,排名的依据是什么?输入次数怎么计算?
什么算一次“按压”——是物理意义上的手指按下,还是游戏逻辑识别到的一次输入事件?如果是后者,模拟信号怎么处理?
最后一个问题把讨论推向了一个所有人都没预料到的方向。一位ID为“marshmallow”的管理员在帖子里贴出了一段技术说明。他指出,任天堂64手柄的A键不是数字开关,而是一个模拟输入设备。游戏引擎在每帧读取A键的模拟值——从0到127,共128个离散等级。大部分游戏逻辑只判断这个值是否超过某个阈值,超过就算“按下”,低于就算“未按”。但并非所有逻辑都是这样。
marshmallow在模拟器上做过测试:在特定的斜坡角度下,如果A键的模拟值保持在45到52之间——大约三分之一按压深度——马力欧的角色状态会在“站立”和“跳跃”之间快速切换,每帧切换一次。这种状态切换会导致游戏引擎反复重新计算重力向量,在某些地形上产生一个微小的、持续的垂直位移。这个位移太小了,肉眼几乎看不出来。
但如果持续足够久——大约两分四十秒——马力欧可以沿着一面特定的墙壁上升大约三个马力欧身位的高度。三个马力欧身位。刚好够爬上一道在常规通关中必须用完整跳跃才能越过的矮墙。marshmallow的帖子最后写道:“这意味着什么?这意味着在这款游戏里,‘按下A键’这个动作本身没有一个明确的定义。半按算不算按?三分之一按算不算按?如果我用每秒六十次的频率轻触A键,每次都只压到阈值以下——游戏认为我没按,但模拟值的波动仍然会影响物理计算——这算不算‘使用A键’?我们还没有一个答案。”
这个帖子发出之后,讨论的性质变了。管理员们不再争论要不要设立新分类,而是开始意识到,他们面对的不仅仅是一个提交审核问题。他们面对的是一个认识论问题:他们以为自己知道“输入”是什么,但《超级马力欧64》的物理引擎告诉他们,他们不知道。Radix最终做了一个决定。他给那个提交者发了一封私信,说SDA暂时无法正式收录他的录像,因为现有规则体系无法处理这种类型的挑战。但他同时说了一句话:“请不要停止。你们在做的事情比速通更大。”
这句话后来被截图,在速通社群里流传了很多年。有人说Radix当时只是出于礼貌。有人说他预见到了什么。
无论如何,那个提交没有被正式收录。但它的十二页说明文档被转贴到了《超级马力欧64》速通社区的专属论坛上。在那里,它引发了一场持续十六年的运动。
这场运动没有名字,或者说有太多名字。有人叫它“Minimal A Press Challenge”(最少A键按压挑战),有人叫它“ABP Challenge”(A Button Press Challenge),有人干脆就叫它“半按A键项目”。
参与其中的人来来去去,核心贡献者大约有三十多人,分布在北美、欧洲和日本。他们大多数从未见过面。他们在论坛帖子和YouTube评论区里交换发现,用模拟器截图和手绘的力学分析图作为证据。他们建立了一个共享的Google文档来追踪每一关的A键按压次数上限和下限——上限是目前已知的最好成绩,下限是理论最小值,由物理引擎分析推导出来。
这个文档的编辑历史跨越了十一年。他们做的第一件事,是定义术语。这是整个项目中最枯燥、最不为人知、也最重要的工作。
如果不知道“一次A键按压”是什么意思,就不可能计算按了多少次。N64手柄的A键是模拟输入,这意味着“按下”不是一个二值状态,而是一个连续区间。在什么阈值以上算“按下”?答案是:取决于具体语境。在大部分情况下,游戏引擎在模拟值超过64(半程)时判定为“按下”。但某些特定机制——比如游泳时的加速、从斜坡上滑下时的状态保持——使用的是不同的阈值。有些机制甚至不判断阈值,而是直接读取模拟值的连续变化来修改物理参数。
经过大约两年的讨论和测试,社群逐渐形成了一套约定:一次“完整A键按压”指的是模拟值从低于32上升到高于96、再回落到低于32的完整过程。这个定义排除了大部分“轻触”和“半按”操作——只要模拟值不越过96这条线,就不算一次按压。但这一定义本身就是一个工程学妥协。
它不反映任何游戏内部的逻辑边界,只是社群为了方便计数而人为划定的线。所有参与者都清楚这一点。他们接受这个定义,不是因为它正确,而是因为它有用。
定义确立之后,真正的拆解工作开始了。《超级马力欧64》有十五个主要关卡、一个枢纽世界(城堡)和三个库巴战。在任何常规通关中,玩家需要在这些区域之间移动,收集至少七十颗星星中的足够数量,才能解锁最终区域。
但在速通世界,早在2003年就有人发现可以利用后翻跳跃和墙壁碰撞的组合技绕过星星要求,直接进入最终库巴战——这就是著名的“0星通关”路线。0星路线将必须经过的区域压缩到了最小集合:城堡大厅、地下室、三楼走廊、无尽楼梯、最终库巴战战场。总共大约十二个需要穿越的空间段落。
半按A键项目的参与者们逐段拆解了这十二个空间段落。他们使用的主要工具是模拟器。不是用来作弊——他们的所有发现最终都要在真实硬件上复现才算有效——而是用来观测。
N64模拟器提供的帧前进功能让他们可以暂停游戏在任何一帧,然后逐帧推进,同时监视内存中的每一个相关变量:马力欧的三维坐标、速度向量、加速度向量、角色状态标识、碰撞判定结果、以及最重要的——A键模拟值的当前读数和历史读数。这就像把一只手表拆开,不仅能看到齿轮的转动,还能看到每一个齿轮齿在每一微秒的角度和受力。
第一个重大突破出现在2007年。一位日本玩家发现,在城堡大厅通往地下室的楼梯上,如果马力欧以一个特定角度(大约偏左十七度)走入楼梯侧面的栏杆,游戏引擎会短暂地将他的状态判定为“在空中”——尽管他的脚从未离开地面。在这个状态下,按住Z键(蹲下)并保持摇杆前推,马力欧会以每帧零点三个单位的速度缓慢前移。这个速度比走路慢得多,但它不需要任何跳跃输入。这意味着整个楼梯段——在常规速通中需要至少两次完整跳跃才能通过——可以用零次A键按压完成。
代价是时间:正常通过这段楼梯需要大约六秒,而这个方法需要将近四分钟。四分钟换两次A键按压。
这个交换比在传统速通世界里是荒谬的。但在半按A键项目里,这是无价之宝。
那位日本玩家将发现发布在一个名为“niconico”的视频网站上——当时YouTube在日本还不普及。视频标题翻译过来是:“《超级马力欧64》地下室楼梯 不使用A键通过”。视频没有解说,只有游戏画面和一段文字说明,解释操作步骤和原理。
这段视频后来被转贴到英文速通论坛上,引发了大约两周的激烈讨论。讨论的焦点不是方法本身——方法被迅速验证为有效——而是它揭示的一个更深层的事实:游戏引擎对“角色是否在地面上”的判断,依赖的不是角色的实际位置,而是一个复杂的条件组合,包括上一次碰撞判定的结果、当前帧的速度向量方向、以及角色与碰撞面的法线夹角。在这个条件组合中,存在着大量可以被利用的灰色地带。
“地面不是一个事实,”一位ID为“pannenkoek2012”的用户在讨论帖中写道,“地面是一个意见。引擎每帧都在重新形成这个意见,而我们可以影响它形成意见的过程。”
pannenkoek2012后来成为这个项目中最广为人知的名字之一。他是一位美国的计算机科学专业学生,2010年前后加入半按A键项目时只有十几岁。
在接下来的数年里,他制作了数十个视频,逐一拆解《超级马力欧64》中每一个需要A键按压的位置,并展示如何用零次或更少次数的按压来通过。他的视频风格独树一帜:没有背景音乐,没有解说配音,只有游戏画面叠加大量文字注释,标注每一帧的速度向量、角色状态和碰撞判定结果。这些视频看起来更像是学术论文的演示材料,而不是游戏视频。但它们在速通社群中获得了极高的传播度和尊敬。
2013年,pannenkoek2012发布了一个名为“石板上的铁网”(Chain Chomp's Gate)的视频。这是半按A键项目历史上最重要的视频之一。铁网位于城堡地下室的深处,是一道需要星星才能解锁的门。
在0星路线中,速通者通常使用一个被称为“门传送”的漏洞来绕过这道门——即在门开启动画的特定帧进行后翻跳跃,让马力欧在门关闭之前穿过碰撞体积。但门传送需要一次完整A键按压来执行后翻跳跃。半按A键项目想要省去这次按压。
pannenkoek2012找到的方法需要将近一个小时来执行。方法的核心原理涉及游戏物理引擎中一个极其偏门的机制:当马力欧站在一个非常微小的斜坡上——坡度小于零点五度——并且按住Z键保持蹲姿时,如果玩家以每秒约八次的频率快速轻触A键,且每次轻触的模拟值峰值不超过60(即低于“按下”阈值),马力欧的垂直速度会以每帧约0.0003个单位的速率累积。这个累积速度太小了,以至于在正常游戏过程中完全不可见。
但如果持续足够久——大约五十三分钟——累积的垂直位移足以让马力欧的脚底越过铁门底部与地面之间的微小缝隙。一旦越过这个缝隙,游戏引擎会在下一帧判定马力欧与铁门的碰撞关系为“在上方”,从而允许他通过。五十三分钟换一次A键按压。
pannenkoek2012在视频中完整展示了这个过程。视频本身被加速播放——实际时长约八分钟——但画面上的计时器显示着真实流逝的时间。观众可以看到马力欧蹲在铁门前,身体以几乎不可察觉的幅度微微颤动,计时器的数字缓慢跳动。五十三分钟的游戏内时间过去后,马力欧突然向前滑过了铁门,仿佛那扇门从未存在过。
这个视频在速通社群中产生了奇特的效应。没有人质疑它的真实性——方法原理清晰,可以被任何拥有足够耐心的人复现。但很多人感到一种难以名状的不安。不是因为这是作弊——它不是作弊,它严格遵守了社群对“不使用外部工具”和“不修改游戏内存”的定义。
而是因为它暴露了一个事实:在足够极端的分析下,游戏不再是游戏。它变成了一套纯粹的逻辑命题。五十三分钟的等待在玩游戏的人看来是疯狂的行为,但在解数学题的人看来是完全合理的策略——如果目标函数是“最小化A键按压次数”,那么时间成本为零权重。这正是半按A键项目迫使整个速通社群面对的核心问题:目标函数是什么?
速通的传统答案是:时间。一切优化服务于更快地抵达终点。但半按A键项目证明,“更快”不是唯一可能的目标函数。“更少”也是一个合法的目标——更少的输入、更少的因果干预、更少的对游戏世界状态的改变。这不是速通的反面,而是速通的极限延伸。如果速通本质上是将游戏视为一套规则系统并寻找最优解,那么“最优”的定义本身就是可变的。改变定义,就改变了整个探索的方向。
2014年到2016年是半按A键项目的黄金时期。在这两年间,一群核心贡献者将整个0星路线的理论最小A键按压次数从十九次压缩到了十二次。每一次压缩都意味着发现了新的物理引擎特性或碰撞判定漏洞。
这些发现通常遵循相似的模式:某人在逐帧分析中发现一个异常——在某帧中某个变量的值偏离了预期范围;然后追溯这个异常的原因;然后在模拟器中设计实验来验证假设;然后在真实硬件上复现;最后将方法写成文档或录成视频发布。2015年夏天的一次突破特别能说明这种工作方式。
核心人物是一位ID为“Plush”的德国玩家。他当时正在分析城堡三楼走廊的一个特定段落——一段大约三个马力欧身长的走廊尽头有一道需要跳跃才能越过的栏杆。在半按A键项目的当时最好成绩中,这道栏杆需要消耗一次A键按压:马力欧必须进行一次完整跳跃才能越过它。
Plush的目标是省去这次按压。他在逐帧分析中发现了一个细节:如果马力欧以精确的四十五度角走入栏杆与墙壁的交界处,在某一帧中,他的碰撞体积会与栏杆的碰撞体积产生一个微小的重叠——大约零点零一个单位。
这个重叠持续只有一帧。在这一帧中,如果马力欧的状态是“受伤”——即刚刚受到敌人攻击后的短暂无敌状态——游戏引擎会错误地将他推出栏杆的另一侧。
这个错误源于游戏代码中处理碰撞重叠的两个不同优先级规则之间的冲突:无敌状态的击退逻辑优先于栏杆的阻挡逻辑。
问题是:如何在栏杆旁边进入受伤状态而不使用A键?Plush花了三个月时间回答这个问题。
答案涉及城堡二楼的一个火球陷阱、精确到帧的移动路线规划、以及利用模拟摇杆的非中心位置来控制移动速度以避免触发跑步判定——跑步判定会改变受伤击退的距离公式。最终的方法需要从城堡二楼开始执行一系列精确操作,引导一个火球击中马力欧,然后在无敌状态的短暂窗口内以特定角度移动到三楼栏杆处。整个过程需要大约七分钟,替代了一次零点三秒的跳跃。
Plush将发现发布在论坛上时,他的帖子开头写道:“我不知道怎么形容这种感觉。我花了三个月时间省下一次A键按压。在这三个月里,我对这款游戏物理引擎的理解比我过去十年玩游戏的总和还要深。但如果你问我是否‘玩’了这款游戏——我不知道。我做的是别的事情。”
“我做的是别的事情。”这句话后来被反复引用,成为半按A键项目精神的非官方总结。到2016年底,0星路线的A键按压次数被压缩到了十一次。社群中的共识是,理论最小值可能在七到九次之间——有几处位置目前还没有人找到零按压通过的方法,但物理引擎分析表明并非不可能。
然而进展开始放缓。剩下的每一次按压都对应着极其困难的引擎机制问题,有些涉及随机数生成器与物理计算的耦合,有些涉及需要多帧精确同步的操作序列,其难度已经超出了人类手工操作的能力边界。
但半按A键项目的参与者们并不着急。这是这个项目与其他速通挑战最根本的区别:它不受时间约束。没有人在乎发现需要花多少时间。
pannenkoek2012曾经在一个视频的结尾写道:“这个项目可能永远不会完成。这没关系。重要的是我们知道每一步为什么可能或不可能。我们是在绘制一张地图——地图上的空白本身也是信息。”
这张地图到2020年代仍在被持续绘制。新的贡献者不断加入,带来新的分析工具和视角。有人开始使用机器学习算法来自动搜索可能的零按压路径;有人尝试将方法移植到游戏的重新编译版本中以测试边界条件;有人甚至联系了当年的任天堂开发团队成员,试图了解原始代码的设计意图——虽然大部分开发者已经记不清细节了。
十六年。比《超级马力欧64》发售到第一个0星通关之间的时间还要长得多。在这十六年里,参与半按A键项目的人们从未组织过任何线下聚会或比赛。他们没有排行榜,没有奖金,没有直播收入。他们的工作成果散落在论坛帖子、YouTube视频和共享文档中,从未被任何官方机构认可或收录。但他们建立了一套关于《超级马力欧64》物理引擎的知识体系,其深度和精确度超过了任何游戏开发者手册或学术论文。他们证明了速通可以不是竞速。
他们证明了“玩”一款游戏和“读”一款游戏之间的界限是模糊的——在最极端的情况下,“玩”就是“读”,是把游戏的每一行代码、每一个判定逻辑、每一个浮点运算误差都当作文本来细读。这种阅读不服务于任何外在目的。它不是为了更快地通关,不是为了获得更高的分数,不是为了击败其他玩家。它只是为了理解——理解这套被设计者埋入硅片和代码中的规则系统到底是如何运作的,理解它在所有可能的输入组合下会产生什么样的输出,理解它的边界在哪里。
当SDA的管理员们在2006年犹豫是否要收录那个最早的十九次A键按压提交时,他们感觉到自己正站在某种东西的边缘。他们当时无法清晰表述那是什么。十六年后,答案变得清晰了:那是速通文化对自己本质的一次重新发现。
速通不是关于速度。速度只是最显而易见的度量方式。速通是关于将游戏视为一套可以被彻底理解的规则系统,然后在这个系统内寻找最优解——无论“最优”被定义为什么。这种理解赋予速通社群一种特殊的技术权威感。
当一个人花了三个月时间逐帧分析一段走廊的碰撞判定逻辑之后,他对这款游戏的发言权就建立在了无可辩驳的具体知识之上。他不是在表达观点或品味。他在陈述事实——关于代码如何运行的事实。这种权威感在速通社群内部被广泛尊重,也使得社群在面对外部质疑时拥有了一种基于深度理解的自信。
2019年,《我的世界》速通作弊争议爆发时——一位知名主播被指控修改了游戏随机数生成概率来伪造速通成绩——社群内部的调查团队在几周内就完成了统计学分析并给出了确定性结论。调查团队使用的取证方法论和分析工具,其严谨程度令学术界人士感到惊讶。这种能力的源头可以追溯到半按A键项目这样的长期攻坚:当一群人花了十几年时间学习如何逐帧阅读游戏引擎时,他们自然也就学会了如何辨别哪些数据模式是真实的、哪些是伪造的。
这不是半按A键项目的参与者们当初预料到的后果。他们只是想省去几次按键。
但在追求这个看似荒谬的目标的过程中,他们无意间为整个速通文化锻造了一套认识论工具——一套关于如何知道你所知道的东西的方法论。pannenkoek2012在他最著名的一个视频结尾贴出了一段话。那段话后来被翻译成多种语言,在半按A键项目的共享文档首页上保留了多年:
“我花了四个小时让马力欧爬上一道楼梯而不按A键。有人问我为什么。我说因为楼梯在那里。他们说不对——山在那里才值得爬。楼梯不是山。我说:当你用足够近的距离去看时,楼梯就是山。”
这段话也许是对半按A键项目最好的总结。它同时也提出了一个让整个速通社群在此后数年间反复回响的问题:如果人类的耐心和分析力可以把一道楼梯变成一座山——那么机器呢?