快跑,小故障狩猎以及游戏和编码的交叉点

我是赛车手。 这意味着我会很快玩游戏。 如果您从未听说过业余爱好,那么您可能会希望我指的是时间是赛车游戏等游戏元素的游戏。 但是Speedrunning扩展到了所有类型的游戏,实际上,将其应用于从未打算快速玩的游戏时,通常会变得最有趣。 任天堂最大和最具标志性的两个系列《塞尔达传说》和《超级马里奥》正是这些类型。 这些游戏旨在以玩家感到舒适的任何节奏进行探索,并且往往具有不太雄心勃勃的游戏所不具备的复杂性和推动水平。 这种复杂性使那些游戏更容易出现故障,这是与Speedrunning完美结合的消遣方式。

许多人以与黑客一样的方式来考虑故障。 但是,利用故障是加速行驶的基础和不可或缺的组成部分。 毛刺与任何开发人员期望的机制一样,都是游戏的一部分,因为它们是游戏代码的直接结果。 作为社区的Speedrunner,尽可能多地了解游戏,并共同努力,使用所有已知的故障和自然机制来解决巨大的旅行推销员风格的优化问题,以确定最快的途径获得游戏的最终积分。

有时,您甚至没有达到预期的学分,但是无论如何它被认为是一种有效的完成方法。 超级马里奥世界3的“ any%”超速运行就是一个很好的例子。 Any%是一个超速跑步类别,指定“任何完成百分比”足以结束跑步,只要您将其记入功劳即可。 Sethbling是一位著名的速滑运动员,曾是SMW3“信用经编”的先驱之一。 由于Seth可以比我更好地解释它,因此我不会对此进行过多的技术介绍,但是运行如下。 在第一个级别中,一堆敌人和对象精灵被杀死并被操纵到像素完美的位置。 游戏有一段内存,其中这些精灵状态和坐标按顺序存储。 通过以完美的方式排列它们,您可以排列此内存块以像机器代码一样读取。 当然,问题在于游戏永远不应该从这些内存插槽中读取内容,而只能对其进行写入。 好吧,这就是Charging Chuck进来的地方。Yoshi(绿色恐龙)可以在游戏中吃很多东西,例如硬币。 他不能吃掉一个正在充电的查克敌人。 通过在加载Chuck的同时让yoshi吃硬币,可以使游戏认为Chuck是被吞噬的东西。 由于这种情况是从来没有预料到的,也不是用游戏代码来处理的,因此它跳转到执行垃圾数据,将其解释为功能代码。 你能猜出哪些数据? 是的,这是所有早先放置完美的精灵坐标。 当解释为游戏代码而不是坐标值时,它们会指示游戏将游戏模式更改为积分,完成扭曲并以42秒的惊人速度完成速度运行。

除了游戏菜单中的此数组外,游戏还具有其他7个排列的内存地址,它们代表玩家当前装备的物品。 插槽1包含B按钮上的项目ID,通常保留给剑使用。 插槽2、3和4包含当前占据三个黄色按钮的C左,C向下和C右的项目的ID。 播放器看不到插槽5、6和7,但它们分别容纳装备在插槽2、3和4上的物品的库存插槽地址。 按照上面图像标题中的示例,玩家可以将蓝色药水装备到C右。 然后,插槽4将包含数字23(蓝色药水的ID),插槽7将包含数字18(蓝色药水的家庭地址)。 现在假设玩家使用了该蓝色药水。 通过按C-right键,游戏知道将插槽4更新为ID为20的“空瓶”项目。但是,还需要确保更新菜单屏幕中的蓝色药水的版本。 为此,游戏将自身偏移三个插槽,以引用插槽7,并找出将空瓶子写入其中所需的家庭地址。 它在插槽7中找到较早的地址18,因此它知道去那里并将空瓶子的值也写为20。

因此,现在,如果由于某种小故障魔术而导致瓶子物品进入B按钮,通常是不可能发生的,那将会发生什么。 好吧,让我们按照正常的过程来看看会发生什么。 假设我们有一个蓝色的药水,B按钮上的项目23,由插槽1索引。玩家通过按B来使用该药水,将插槽1的值更改为空瓶子的20。 现在,游戏在当前插槽中添加了三个,到达插槽4,打算将此处的值用作更新的库存地址。 可是等等。 插槽4中的值根本不是库存地址。 这是玩家当前分配给c-right按钮的任何项目的ID。 这是否意味着游戏会将分配给c-right的商品的ID号解释为库存地址,并将值20写入该ID恰好对应的任何位置? 是。 是的,它会的。

Speedrunning不仅仅是掌握游戏玩法。 这是关于在代码级别理解游戏的内部运作方式,并找到开发中未考虑的漏洞利用和边缘案例。 这是关于使用这些东西与世界各地的人们合作,以多种方式(自然的和故障的)来优化复杂的目标和路径网络,以实现其中的任何一个。 当然,这是关于快速发展。