该存储库包含将击败 Pokemon Platinum 的输入列表。使用技术和模拟的结合,可以保证游戏的进展。不涉及 RNG 操作,不需要帧完美输入,并且输入序列是静态的并且无论游戏中发生什么情况都不会改变。
您可以在这里找到模拟器代码
输入可以在commands
目录中找到。每个文件对应游戏的不同部分,并且它们从 1 到 9 相互流动。还有一个帮助文件用于更改游戏内存以进行测试,以及一个用于在玩游戏时记录输入的文件。
每个命令文件都包含格式为[
的命令列表,其中第一个值是要执行的命令,第二个值是保存该命令的帧数。如果命令是一组按钮按下,
指示要执行该命令的重复次数。
基本命令如下:
命令 | 描述 |
---|---|
一个 | 一个 |
乙 | 乙 |
超滤 | 向上 |
df | 向下 |
LF | 左边 |
射频 | 正确的 |
英石 | 开始 |
x | X |
y | 是 |
乌布 | 上+B |
数据库 | 向下+B |
磅 | 左+B |
RB | 右+B |
w | 等待 |
其他按钮,如选择、L 和 R,未使用。
在命令文件中,附加命令用于表示一组基本按钮按下操作。例如,按 A 10 次,使用{'press_a', 10}
作为简写,而不是连续 10 个命令来按住 A 按钮 60 帧。
每个文件还定义了多达 12 个自定义命令,用于执行各种例程,例如处理内存邮件、执行标准战斗动作或导航游戏中必须重复的部分。
请注意, l
、 r
、 u
和d
命令是朝某个方向迈出一步的简写, lf
、 rf
、 uf
和df
是按住方向按钮一定帧数的命令。
如果您想要修改序列或创建新序列,您可以将recordInputs
文件与 bizhawk 模拟器结合使用来记录您所做的输入,然后以可用于的格式输出它们,而不是手动编写命令。脚本。
要记录您的输入,首先您必须清除控制器热键,即防止模拟器直接将您的输入用作命令。您可以通过Config -> Controllers -> Misc -> Clear
来完成此操作。您可以稍后使用同一菜单中的Misc -> Load Defaults
加载热键。
然后,您必须通过Tools -> Lua Console -> Script -> Open Script
打开 lua 控制台,然后在其中打开recordInputs.lua
脚本。脚本开始运行后,它将记录您的输入。
按钮热键列在recordInputs.lua
文件中,但最重要的两个是lshift
和rshift
,前者在完成录制时输出格式化命令列表,后者添加 60 帧等待时间命令。输入记录器不记录空闲时间,这意味着如果您不使用rshift
添加等待时间,它只会快速地一个接一个地执行命令,而不会中断。
这会导致输入的输出列表与您在玩游戏时实际执行的操作不同。很容易忘记添加等待时间,这会导致播放时出现问题。但好处是,没有压力在计时器上记录输入。
其他键与模拟器的默认键匹配,方向键用于移动, x
、 z
、 s
、 a
表示A
、 B
、 X
、 Y
, enter
表示开始。
触摸控制可能会有一些波动,这是游戏一开始就需要输入的。要前进,您必须点击屏幕中间,击中精灵球的中心。这是非标准模拟输入,在代码中表示为touch_middle
。这只发生一次。
也有可能这些输入没有考虑到我根本不知道或没有想到检查的事情。无论我检查并重新检查问题和错误的顺序多少次,这种人为错误始终存在。
Pokemon 使用线性同余随机数生成器 (LCRNG) 来生成大部分随机数。其工作原理是创建一系列看起来足够随机的数字,然后一次一个地遍历该序列以产生“随机”数字。
第四代口袋妖怪游戏与前代游戏的不同之处在于,它们不会循环使用随机数,而是仅在需要时才使用随机数。
例如,在 Ruby/Sapphire/Emerald 中,即使游戏中没有发生任何事情,游戏也会每隔一帧逐步执行随机数序列,并在游戏要求时生成当前的任何数字。
在钻石/珍珠/白金中,随机数生成器保持静态,直到游戏要求一个值。这意味着如果您站在游戏中的空白区域,随机数生成器将不会执行任何操作。
如果您模拟随机数生成器针对给定动作(例如抛硬币)的所有可能结果,则在第 4 代游戏中,无论您的时间安排如何,此结果都是确定性的(假设您处于空旷或“安静”区域)。
在第三代游戏中,这个结果不是确定性的,它取决于你的时机。这意味着如果你现在抛硬币,可能会得到与 2 秒后抛硬币不同的结果。
就我们的目的而言,第四代游戏的这种质量使得即使人类玩家使用此输入列表来玩游戏,它仍然可以正常运行,因为人类玩家不会在准确的时间进行输入,并且要么早点按下按钮,要么晚点按下按钮。只要按钮没有按下得太早,您就可以无限期地延迟它们,而不会影响游戏的结果(假设您最终按下了按钮)。
利用这一原理,在 Pokemon Platinum 的随机数序列上模拟所有 40 亿个可能的种子或起始位置,使我们能够预测所有可能的游戏中会发生什么。例如,抛硬币 100 次有确定数量的结果。通过检查所有这些,我们可以发现最坏/最好的情况,在本例中是 80/20 的分配。
对于抛硬币来说,这个过程非常类似于使用数学来通过简单的统计来确定我们的期望值。对于更复杂的事情,比如口袋妖怪战斗,使用数学来确定结果变得更加困难。模拟所有 40 亿种可能性比计算暴击、未击中、伤害掷骰、AI rng、次要效果机会等的概率更容易。
这样做可以让我们深入了解哪些策略在每场可能的比赛中获胜,并让我能够 100% 确定地击败不同的训练师,即使从数学上讲有可能失败或失败。
最终结果是这个输入序列,它应该从头到尾击败每场白金游戏,没有任何失败的机会,除非输入错误或错误。