第 6 章
时之笛里的任意门
《塞尔达传说:时之笛》的卡带插入任天堂64主机时,会发出一声沉闷的咔嗒。这个声音在1998年冬天响彻了全球数百万个客厅。玩家们拿起三叉戟形状的控制器,第一次推动模拟摇杆,看着少年林克在科克里森林的树屋里醒来。
他们不知道的是,自己正在进入一个此后二十五年里不断被拆解、测绘、重写规则的世界。任天堂64的卡带是一种基于掩膜只读存储器的介质。一旦数据被烧录进硅片,它就不可更改。游戏发售时,卡带里装着三千二百万字节的代码——海拉尔平原的几何数据、林克的骨骼动画、每一段过场动画的文本、加农城堡的砖石纹理、所有敌人的行为逻辑。这些代码被封装在塑料外壳里,理论上,它们构成了一个封闭的、不可变动的规则系统。
玩家能做的,就是在系统预设的路径上行走:收集三块精灵石,拔起大师之剑,穿越七年的沉睡,击败六个神殿的Boss,最终面对加农。这是设计者意图中的完整旅程。没有其他可能。
1998年的游戏评论界几乎异口同声地赞美《时之笛》的完美。然而,正如速通文化基因中那与生俱来的审视与信任机制,总有一部分人会去寻找规则之外的可能——他们要回答的,正是那个关于证明、验证与信任根基的问题。
它获得了日本游戏大奖、互动艺术与科学学会的年度最佳游戏奖,以及几乎所有主流游戏媒体的满分评价。评论家们谈论的是它的锁定战斗系统、它的昼夜循环、它用陶笛演奏旋律来改变世界的创意。没有人谈论它的代码。代码是隐形的。对绝大多数玩家而言,游戏就是屏幕上呈现的那个世界——有草、有风、有城堡和迷宫的世界。
但有一小部分人已经开始用不同的眼光看待游戏。他们不是游戏设计师,也不是职业评论家。他们是玩家,但他们的玩法与普通玩家截然不同。
当大多数人还在海拉尔平原上骑马、钓鱼、寻找隐藏的心之碎片时,这些人已经在反复通关的过程中注意到了一些奇怪的现象:某个墙角在特定角度翻滚时可以穿过;某段对话在精确的帧数内跳过可以省掉一次过场动画;某个道具在菜单中按特定顺序排列时,游戏会短暂地出现一帧画面撕裂。这些现象在普通玩家眼里只是无意义的画面错误,但在这些人看来,它们是系统在呼吸——是代码逻辑在屏幕上的投影。他们是速通者。他们是把游戏拆开的人。
到2003年,《时之笛》的速通社群已经在日本和北美的网络论坛上运转了将近五年。他们建立起了自己的排行榜、自己的术语体系、自己的验证标准。最快通关纪录被压缩到了五个小时以内——不是靠更快的战斗,而是靠对游戏漏洞的系统性利用。
他们发现,林克可以在持剑后跳的同时按下翻滚键,从而获得一个微小的速度加成。他们发现,在特定角度侧身走过某些墙壁时,碰撞检测会失效,林克可以跌出地图边界,直接掉进下一个区域。这些技巧被命名为“后跳加速”“穿墙”“虚空传送”。每一个技巧的发现都意味着纪录被刷新一次,而每一次刷新都意味着对游戏系统的理解又深入了一层。
但这些技巧有一个共同点:它们仍然在游戏原有的规则框架内运作。后跳加速利用的是移动速度计算中的一个溢出漏洞,但它仍然在执行游戏原有的速度计算代码。穿墙利用的是碰撞检测在特定角度下的精度损失,但它仍然在调用游戏原有的碰撞检测函数。
速通者们在寻找捷径,但这些捷径仍然是游戏代码中本来就存在的路径——只是没有被设计者意图覆盖而已。
2003年初春,日本匿名论坛2ch的游戏速通板块出现了一个帖子。发帖人的ID是一串随机字符,这在2ch的文化中很常见——匿名是默认状态,身份不重要,重要的是你展示了什么。帖子标题大致可以翻译为“《时之笛》新发现:从平原直接到加农城”。标题本身已经足够惊人,但更惊人的是附件中的录像。
这段录像的拍摄方式很原始。操作者用摄像机对准电视屏幕录制,画面边缘有显像管的弧形畸变,色彩因为拍摄角度而略微偏淡。录像开始时,少年林克站在海拉尔平原的中央,周围是一望无际的草地和远处隐约可见的死亡之山。
操作者让林克向前走了几步,然后开始执行一连串动作。这些动作在任何一个正常玩家的眼里都毫无意义。林克先是向前翻滚了一次,然后站起来,向空中挥了一剑。接着,他打开菜单,在物品栏中将笛子和炸弹分别移动到特定位置,关闭菜单,再次翻滚。
然后他切换视角,面向一个没有目标的方向,使用了炸弹——炸弹在他脚下爆炸,林克被炸飞,但就在被炸飞的动画尚未结束时,他打开了菜单,切换了装备,关闭菜单,在落地的一瞬间再次翻滚。
这一整套动作持续了大约四十秒。如果逐帧分解,它包含至少十五次精确的输入操作,每一次操作的时间窗口都在六十分之一秒以内。任何一个步骤出错,整段序列都会失败。但操作者没有出错。
当最后一个翻滚动作完成时,画面突然闪烁了一帧——不是正常的画面切换,而是一种类似信号中断的剧烈闪烁——然后林克消失了。下一个画面,他站在加农城堡的顶层。不是城堡入口,不是城堡内的某个楼层,而是顶层——最终Boss房间的门外。那个房间的门紧锁着,需要完成六个神殿的所有试炼才能打开。但林克现在就站在那扇门前。他只需要推开门,就可以直接面对加农。
整个游戏的主线流程——收集精灵石、拔剑、穿越七年、六个神殿、所有Boss战——全部被跳过了。2ch论坛的早期回复记录了这个发现引发的第一波冲击。
“うそだろ?”——“骗人的吧?”这是一个匿名用户在三秒内发出的回复。“マジ?”——“真的?”另一个用户在一分钟后跟帖。然后是一连串的表情符号:“( ゚Д゚)”“(;゚д゚)”“キタ━━━━(゚∀゚)━━━━!!”——来了!来了!来了!
这些回复是典型的日式网络表达,但它们的密集程度超出了常规。在接下来的几个小时内,帖子回复数突破了三百。有人开始逐帧分析录像,有人在询问操作的具体步骤,有人在怀疑这是模拟器修改内存的结果。
怀疑是速通社群的本能——五年前《黄金眼》时代建立起来的验证基因在这里继续运转。一个匿名用户贴出了模拟器调试器的截图,指出如果录像中的操作序列确实在真实硬件上执行,那么它就不可能是简单的内存修改。另一个用户上传了自己按录像步骤操作的失败尝试,证明这套动作的难度远超一般技巧。
随后几周,真相逐渐浮出水面。北美和欧洲的速通社群通过跨洋的网络连接加入讨论,他们带来了不同的技术工具和不同的分析视角。
有人在PC模拟器上逐帧复现了录像中的操作序列,同时打开了内存查看器。内存查看器是一个十六进制的数字矩阵,每一行代表游戏运行时内存中的一个地址,每一个数字代表该地址当前存储的值。在正常游戏过程中,这些数字以可预测的模式变化——林克的坐标随移动更新,生命值随受伤减少,物品栏随装备切换而改写。
但当复现者执行到录像中那串奇怪动作的第十六步时,内存查看器上出现了一个异常:一段本应存储林克位置坐标的内存地址,突然被写入了加农城堡顶层的坐标值。这不是漏洞利用。这是代码劫持。
游戏程序在运行时,会按照固定的顺序从内存中读取指令和数据。林克的位置坐标存储在内存中的特定地址,当玩家正常移动时,游戏会读取手柄输入,计算出新的坐标值,然后将新值写回那个地址。但《时之笛》的程序中存在一个设计者从未预料到的脆弱点:当玩家在特定帧数内执行特定序列的动作时,手柄输入数据会溢出原本分配的内存空间,覆盖相邻的内存区域。
如果操作者精确控制这些溢出数据的排列方式,他就可以在游戏内存中写入任意值——不仅仅是坐标,还可以是道具状态、事件标志、甚至是可执行代码的片段。这就是“任意代码执行”的核心机制。游戏不再是被动地响应玩家的操作,而是被玩家主动地重写了内部逻辑。那些看似无意义的翻滚、挥剑、切换道具,其实是一串经过精心计算的机器指令。每一个动作对应一个特定的内存写入操作,当所有操作按精确顺序完成后,它们组合成了一条完整的命令:将林克的位置坐标改写为加农城堡顶层。
这不是在游戏规则内寻找最优解。这是在游戏规则之外,重新定义什么是“解”。
这个发现引发的冲击波远超技术层面。在接下来的几个月里,《时之笛》速通社群内部爆发了一场激烈的争论。
争论的焦点不是任意代码执行的可行性——录像的真实性很快得到了多方面的验证——而是它的合法性。速通排行榜的管理员们面临一个前所未有的问题:使用任意代码执行的通关记录,应该被归入哪个类别?
在现有的分类体系中,速通被分为“无限制”和“无漏洞”两大类。无限制类别允许使用一切游戏内存在的技巧,包括漏洞利用;无漏洞类别则要求玩家按照设计者意图完成游戏。
但任意代码执行不属于这两个类别中的任何一个。它既不是游戏内存在的技巧——它重写了游戏本身——也不是遵循设计者意图的玩法。它是一个新的东西。
有人提议创建一个新的分类:“任意代码执行类”。但这个提议立刻引发了更根本的质疑:如果允许任意代码执行,那么“通关”本身还意味着什么?理论上,一个对游戏内存结构足够了解的玩家,可以在游戏启动后的第一帧就写入一条直接触发通关动画的指令。整个游戏的流程——从科克里森林到加农城堡的漫长旅程——将被压缩为不到一秒钟。这确实是最快的通关方式。但这是否还是“玩”游戏?
争论在2003年夏天达到了白热化。日本社群的一位资深速通者——他的论坛ID后来被广泛引用,但从未与真实姓名关联——发表了一篇长文,提出了一个影响深远的论点。
他写道:速通的意义不在于快,而在于理解。我们比任何人都更认真地阅读游戏,我们读懂了设计者写下的每一条规则,也读懂了他们无意中留下的每一条裂缝。任意代码执行是这种阅读的终极形态——它意味着我们读懂了游戏不仅是表面规则,也是底层的机器指令和内存状态。这不是背叛速通精神,这是速通精神的完成。
反对者的回应同样有力。北美社群的一位知名验证员——他曾在《黄金眼》时代逐帧审核过上百盘录像带——在Speed Demos Archive论坛上写道:速通的前提是我们在同一个规则体系内竞争。如果你可以改写规则,那就不再是竞赛,而是编程。我尊重编程,但编程不是速通。速通者挑战的是游戏,不是计算机。
这场争论没有产生统一的结论。不同的排行榜选择了不同的分类标准。一些平台将任意代码执行通关单独列出,标注为“理论最快时间”;另一些平台拒绝收录任何使用任意代码执行的记录,将它们视为“展示性操作”而非竞速成绩;
还有一些平台创建了更细致的子分类,根据任意代码执行的深度和广度划分等级。这种分类上的分裂并非《时之笛》独有——它很快蔓延到了其他游戏的速通社群,成为整个亚文化必须面对的共同问题。
但真正让这场争论具有持久意义的,不是技术细节,而是它揭示的一个根本困境。速通者一直以“最认真的读者”自居——他们比普通玩家更深入地理解游戏系统,他们的每一次纪录刷新都是对游戏规则的一次重新解读。
但任意代码执行的出现让这种“阅读”触及了一个危险的边界:当阅读深入到了可以重写文本的程度,读者与文本之间的关系就发生了不可逆的改变。你不再是在阅读一本书,你是在重写这本书。而重写之后,你读到的还是原来那本书吗?
这个问题没有标准答案。但它在2003年被提出之后,就再也没有离开过速通文化的讨论核心。它像一颗投入水中的石子,涟漪在接下来的二十年里不断扩散。每一次新技术的出现——工具辅助速通、机器学习优化、硬件层面的漏洞利用——都会重新激活这场争论。
而每一次争论的底层逻辑,都可以追溯到那个日本玩家在海拉尔平原上执行的那四十秒奇怪动作。那些动作的精确序列后来被完整地记录了下来。翻滚、挥剑、打开菜单、切换道具、使用炸弹、在空中切换装备、落地翻滚——每一个步骤对应的帧数窗口被反复验证和优化。到2004年初,社群中已经有人将这套操作压缩到了三十五秒以内。
但操作本身的技术难度并不是这个故事的核心。核心是那个操作者在执行这些动作时,他看到的不是屏幕上的林克,而是内存中的数字矩阵。他不是一个在海拉尔平原上奔跑的少年,他是一个在三千二百万字节的硅片上行走的读者。他读懂了游戏最底层的语言,然后用那种语言写下了自己的命令。
这种阅读方式彻底改变了速通者与游戏开发者之间的关系。在任意代码执行被发现之前,开发者通常将速通者视为一种无害的异常——他们用奇怪的方式玩自己设计的游戏,这有点令人恼火,但也算是一种另类的赞美。但任意代码执行改变了这种看法。
它证明了一件事:在足够认真的读者面前,没有任何规则系统是封闭的。开发者写下的每一行代码都可能被拆解、被重组、被改写。游戏不再是一个由设计者单向输出的文本,它变成了一个由设计者和玩家共同书写的动态系统。
这个认识在随后的几年里缓慢地渗透进了游戏行业。一些开发者开始主动在游戏中为速通者留出捷径——不是漏洞,而是刻意的设计。另一些开发者则走向了反面,他们在代码中添加了更严格的完整性校验,试图阻止任意代码执行的发生。
但无论开发者的态度如何,2003年的那个发现已经不可逆转地改变了游戏的本质。它证明了游戏不是一套固定的规则,而是一套可以被彻底读懂、然后被彻底重写的系统。而读懂它的人,才是最终掌握规则的人。
在2ch论坛的那个帖子沉入页面深处之后——这是所有论坛帖子的必然命运——它所引发的连锁反应仍在继续。Speed Demos Archive的管理员们开始重新修订排行榜的分类规则,这个过程持续了将近一年。
最终形成的分类体系比之前复杂了数倍,它引入了“主要漏洞利用”“次要漏洞利用”“任意代码执行”等新的标签,试图在开放性和公平性之间找到一个脆弱的平衡。但这个平衡本身就是一个不断移动的目标。每一次新发现的公布都会让分类体系再次面临修订的压力。
任意代码执行的技术本身也在不断进化。2004年,一个欧洲玩家发现了一种更高效的写入方式,将操作时间从三十五秒压缩到了二十秒。2005年,另一个玩家发现,通过在写入过程中加入一个额外的菜单操作,可以触发更复杂的指令序列——不仅仅是传送坐标,还可以直接修改通关标志位,让游戏以为玩家已经击败了所有Boss。这意味着林克甚至不需要出现在加农城堡顶层,他可以在海拉尔平原上直接触发通关动画。
屏幕上的林克站在草地上,画面突然切换,开始播放制作人员名单。整个游戏被压缩到了不到三分钟。
这个记录在社群中引发了新一轮的争论。三分钟通关——《时之笛》,一款被设计为需要至少三十小时才能完成的游戏,被压缩到了三分钟。
在录像发布后的最初七十二小时里,2ch论坛的那个帖子经历了从怀疑到震惊再到恐慌的完整情感光谱。帖子标题后来被证实是“【时オカ】ハイラル平原からガノン城最上阶へ直接ワープ”,发帖人的ID是一串无意义的字母数字组合——“名无しさん@お腹いっぱい”,这是2ch的默认匿名名称,意为“饱腹的无名氏”。这个ID每天有成千上万人在使用,没有人能追踪到操作者的真实身份。但他在录像中展示的那四十秒操作,却比任何署名都更深刻地刻进了速通史。
早期回复中有一条被后来者反复引用:“これはバグじゃない。ゲームが书き換えられてる。”(这不是漏洞。游戏被改写了。)发这条回复的用户使用了另一个默认匿名ID,但他的判断精准得令人不安。
他不是在描述一个技术现象,他是在命名一个认识论断裂。在此之前,“漏洞利用”这个词覆盖了速通者对游戏规则的一切偏离行为——穿墙是漏洞,后跳加速是漏洞,跳过过场动画是漏洞。但任意代码执行不是漏洞。漏洞是系统内部的裂缝,你从中穿过,但系统的墙体仍然存在。任意代码执行是拆掉了墙体本身,用拆下来的砖石建造了一扇任意门。
这扇任意门的运作原理在随后几周内被逐步还原。北美社群的一位程序员——他在Speed Demos Archive上的ID是“Nahoc”,一个倒过来拼写的名字——发布了第一篇完整的技术分析。他使用N64模拟器的调试工具,在逐帧执行那四十秒操作的同时,记录了内存中每一个相关地址的值变化。
他的分析揭示了一个令人惊叹的事实:那些看似随机的动作序列,其实是一套精确编排的内存写入程序。林克的每一次翻滚触发了一个特定的物理计算,该计算会短暂占用一段内存缓冲区。每一次挥剑修改了战斗状态标志位,该标志位恰好与物品栏数据的存储地址相邻。每一次菜单操作——打开、移动物品、关闭——都在重新排列内存中道具ID的排列顺序。当炸弹爆炸时,伤害计算函数被调用,它的返回值被写入了碰撞检测的临时缓存区。而那个临时缓存区,在特定帧数内,恰好与被覆写的坐标地址共享同一段物理内存。这不是巧合。这是对《时之笛》内存映射关系的彻底理解。
操作者必须知道海拉尔平原的几何数据存储在哪个地址段、林克的动画状态机占用多少字节、菜单系统的栈结构如何嵌套、炸弹爆炸的粒子效果计算会临时征用哪一段内存空间。他必须知道所有这些信息,然后设计出一套动作序列,使得每一步操作的副作用都精确地修改目标地址的一个比特位,最终组合成加农城堡顶层的坐标值。Nahoc在他的分析帖结尾写道:“这不是玩游戏。这是用游戏手柄编写汇编代码。”
这句话迅速在社群中传播开来。它准确地捕捉到了任意代码执行的本质矛盾:操作者表面上是在操控林克,实际上是在操控内存;他使用的输入设备是游戏手柄,但他编写的指令是机器码。他的手在按按钮,但他的思维在比特层面运行。
这种双重性使得任意代码执行无法被纳入现有的任何评价体系。如果它是编程,那么它应该被归入工具辅助速通的范畴——但工具辅助速通的前提是使用外部工具,而任意代码执行完全在原始硬件上完成。如果它是游戏技巧,那么它应该被允许进入无限制排行榜——但它跳过的不是某个关卡,而是整个游戏流程本身。
一位日本玩家在2ch上写道:“RTAの意味を考え直さなければならない。”(我们必须重新思考RTA的意义。)RTA是“Real Time Attack”的缩写,即实时竞速,这是速通文化的核心概念。但“实时”在这里意味着什么?
如果三分钟的通关时间中,前两分五十秒是在执行内存写入程序,只有最后十秒是游戏实际播放通关动画的时间,那么这“三分钟”究竟是对什么的测量?是对游戏流程的测量,还是对内存操作速度的测量?这些问题在2003年春天没有答案。但它们的提出本身就标志着一个转折:速通者开始意识到,他们不仅是在比赛中争夺更短的时间,也是在争论中争夺“时间”的定义本身。
这种自我反思在社群内部产生了深刻的分裂。分裂不是沿着国界或语言展开的——日本社群和北美社群内部都有支持和反对的声音——而是沿着对“速通”本质的不同理解展开的。支持任意代码执行的人倾向于将速通视为一种智力挑战:目标是用一切可能的手段达到通关状态,手段的合法性取决于它是否在原始硬件上实现,而不取决于它是否符合设计者意图。
在这个框架下,任意代码执行不仅是合法的,而且是速通的最高形式——它证明了你对游戏的理解已经超越了表面规则,深入到了系统的物理层。反对者则坚持一种竞技伦理:速通的前提是所有参与者在同一个规则体系内竞争,如果你可以改写规则体系本身,那么竞争就失去了共同基础。
这个论点的一个早期表述出现在2003年4月的一篇英文帖子里,作者是Speed Demos Archive的一位资深验证员,他的ID是“Radix”。他写道:“我们一直在玩同一款游戏。如果你玩的游戏可以被你改写,那我们玩的就不再是同一款游戏了。”
这句话后来被反复引用、反驳、修正和重新解释。支持者指出,即使在没有任意代码执行的情况下,不同玩家使用的游戏版本、硬件状态、控制器磨损程度都不完全相同,“同一款游戏”从来就是一个理想化的假设。反对者则回应说,版本差异和硬件差异是外部变量,它们影响的只是游戏运行的条件,而任意代码执行改变的是游戏运行的逻辑——这是类别上的不同,不是程度上的不同。
这场争论没有产生统一结论——它只是把问题推得更深:当阅读深入到可以重写文本的程度,“通关”这个词本身是否还成立?
这是对游戏系统的终极理解,还是对游戏本身的终极否定?没有人能给出一个让所有人信服的答案。但所有人都意识到,他们正在见证一个亚文化从技术探索走向自我反思的转折点。速通者不再仅仅是在拆解游戏,他们开始定义拆解的边界。而定义边界这件事,本质上是一个哲学问题,不是一个技术问题。
那个在2ch上发布录像的匿名玩家很可能没有意识到自己引发的连锁反应有多大。他可能只是一个对游戏机制充满好奇心的人,在某个深夜的反复试验中偶然触发了那个内存溢出的瞬间。他看到林克出现在加农城堡顶层时,可能只是觉得有趣,或者震惊,或者两者皆有。他录下了那段录像,上传到论坛,然后消失在匿名的网络深处。
但他的那四十秒操作成为了速通文化史上一个不可磨灭的时刻——不是因为它的技术难度而是因为它提出的问题:当读者可以重写文本时阅读本身意味着什么?这个问题在2003年没有被解决,在2004年没有被解决,在2005年仍然没有被解决它像一根刺一样扎在速通文化的肌理中每当技术边界被再次推进时它就会被重新触碰
而当速通者们开始意识到他们不仅是在比赛谁更快也是在不断重新定义“更快”的含义时他们就不得不面对一个更根本的问题:谁来制定规则?是开发者?是玩家?还是那个可以被任意重写的代码本身?