自动化Zelda

塞尔达传说荒野之息是一款非常出色的游戏,我真的很讨厌。 我读过完成主要故事的平均时间约为45个小时,但我花了大约90个小时就完成了,只击败了4个神兽中的3个。

如果您玩了一段时间的《荒野之息》,您会注意到,要购买某些东西,例如套盔甲或精美的箭,您需要卢比(游戏的主要货币)。 不幸的是,卢比并不容易获得。 狂野的呼吸爱好者会告诉您,获得卢比最快的方法之一是玩雪球保龄球迷你游戏。

在西北,从希伯拉塔(Hebra Tower)滑行下来,有一个人叫Pondo,他一整天都在打雪仗。

Pondo制作另一个雪球

如果您和他聊天,他会提出一个可疑的提议。 将这个雪球滚下山坡,尝试撞倒别针。

每场比赛费用为20卢比。 如果您罢工,他会付给您300卢比。 那是280卢比的利润!

链接以错误的角度握住雪球,以实际击倒销钉

比看起来难。 即使是最棒的雪球投球手,也会时不时地扔出一个水沟球。 我不是最好的雪球投球手之一。

互联网上有几本指南可以教你如何成为一个更好的塞尔达投球手。 一种策略是在岩石上以某种方式站起来,使Link的右腿的一部分弯曲,然后将Sheika Sensor定位在Moose雕像的右眼上方,然后在摆雪球之前迅速拉直您的位置。 这个过程听起来很令人沮丧。

有一天晚上,在完成这项任务并没有碰到钉子的同时,我想:“必须有一种更好的方法。”如果有人在Zelda擅长打保龄球,那意味着一台计算机真的可以是很好的在塞尔达保龄球。 我们只需记录并重放动作,即可成功执行罢工。 因此,我开始研究Nintendo Switch控制器的工作原理。

可以想象,有很多人试图对Switch的不同方面进行反向工程。 我找到的最完整的指南是:

dekuNukem / Nintendo_Switch_Reverse_Engineering

Nintendo_Switch_Reverse_Engineering –探究Joycon和Nintendo Switch的内部工作原理

github.com

它具有通过物理连接和蓝牙连接将Joy-Cons连接到交换机的详细示意图。 我发现这个Github问题特别令人着迷:

蓝牙/ USB的HID协议·第7期·dekuNukem / Nintendo_Switch_Reverse_Engineering

嗨,热爱您所做的工作-非常感谢。 在社交媒体上找不到您,因此我将放弃…

github.com

它讲述了一群陌生人一起努力逆向工程控制器的工作原理的故事。 很难确切地确定他们的动机是什么。 也许他们想创建伪造的Joy-con控制器,或者只是想更改软件中它们的颜色? 我开始从一个论坛跳到另一个论坛,直到遇到这篇文章:

和它的回购:

程序/开关战斗棒

Switch-Fightstick – Nintendo Switch的概念验证LUFA项目。 使用Pokken的逆向工程技术…

github.com

我认为它并没有真正得到应有的赞誉,但我将尝试总结这些发现。

Wii U有一个名为Pokken Tournament Pro Pad的控制器。

Wii U的HORI Pokken Tournament Pro Pad

它通过USB连接。 在最近的系统更新中,任天堂在Switch上增加了对该控制器的支持。 当它连接到Switch时,它将被识别为Switch Pro控制器。 因此,无论是否对Switch Pro控制器进行了逆向工程,这个控制器都可以做到这一点,这意味着可以将USB设备假装为该设备!

事实证明,假装自己是USB设备是一个已解决的问题。 这是一个青少年:

Teensy ++ v2.0

它具有Atmel 90USB1286微控制器,该微控制器与称为LUFA的软件相结合,可以仿真整个USB设备,包括键盘,鼠标,以及对于本文最重要的操纵杆。 我主要看到它们用于构建自定义机械键盘,但是我从来没有使用过。

我最初尝试修改概念验证以使Zelda自动化的尝试没有成功,但是后来我很幸运,发现了原始项目的这个分支:

Shinyquagsire23 /开关格斗杆

Switch-Fightstick – Nintendo Switch的概念验证LUFA项目。 假装是只…

github.com

Nintendo Switch有一个名为Splatoon 2的游戏,可让您绘制帖子。 此派生将图像文件作为输入,并模拟Pokken Tournament Pro Pad控件和按钮以自动绘制1位版本的图像。 这里是输出示例:

阅读源代码后,我意识到它具有在Zelda中自动进行保龄球所需的所有元素。 它演示了如何同步控制器并以编程方式模拟按钮按下,因此我要做的就是对其进行修改以从脚本中获取输入,而不是绘制图像。

自从我自己提出脚本以来,我派生了一种类似于徽标的语言。 您可能还记得Logo,这是80年代最受欢迎的儿童编程语言。 它具有一个称为Turtle的游标,您可以通过简单的命令对其进行控制。 它具有如下语法:

像这样的程序将生成如下视觉输出:

徽标示例

如果您想到Zelda,可以用相同的方式对Link进行编程。 这是我创建的命令列表:

THROWTRIGGERS是复合按钮按下。 当您在Zelda中扔雪球时,您必须在击打R的同时向前推动模拟摇杆。TRIGGERS同时击打L和R触发器,这是在首次插入控制器时激活它所必需的。充当延迟。 在流程中有很多地方,您需要等待下一个场景加载或让Pondo完成通话。

我写的第一个脚本让Link拾起雪球,向左走,向上走,然后扔雪球,但完全错过了大头针。 它看起来像这样:

从那儿开始,我辛苦地调整了他左走,上走和罚球的数量,直到他终于被罢工。 接下来,我编写了与Pondo的整个对话的脚本,包括在适当的时间暂停。 完成后,脚本可以与Pondo启动迷你游戏,扔雪球,进行罢工,并完成迷你游戏。 最后,我创建了一个循环,以便在完成迷你游戏后立即与Pondo开始一个新的循环。

这是运行中的脚本,该脚本在我插入Teensy之后开始。 在将近一个小时的时间里,林克连续抛出22次罢工,使我的卢比收集从5827增加到12007。

如果您想自己尝试,请在此处获得说明和源代码。