このリポジトリには、ポケットモンスター プラチナを超える入力のリストが含まれています。テクニックとシミュレーションを組み合わせて使用することで、ゲームの進行が保証されます。 RNG 操作は必要なく、フレームパーフェクトな入力も必要ありません。また、入力のシーケンスは静的であり、ゲーム内の出来事に関係なく変更されません。
シミュレーターのコードはここで見つけることができます
入力はcommands
ディレクトリにあります。各ファイルはゲームの異なる部分に対応しており、それぞれ 1 から 9 まで相互に流れ込みます。テスト用にゲームのメモリを変更するためのヘルパー ファイルや、プレイ中の入力を記録するためのファイルもあります。
各コマンド ファイルには、 [
という形式のコマンドのリストが含まれています。最初の値は実行するコマンド、2 番目の値はそのコマンドを保持するフレーム数です。コマンドがボタンを押す一連の場合、
そのコマンドを何回繰り返すかを示します。
基本的なコマンドは次のとおりです。
指示 | 説明 |
---|---|
ある | あ |
b | B |
うふ | 上 |
DF | 下 |
もし | 左 |
RF | 右 |
セント | 始める |
× | × |
y | Y |
ウブ | 上+B |
データベース | 下+B |
ポンド | 左+B |
RB | 右+B |
w | 待って |
選択、L、R などの他のボタンは使用されません。
コマンド ファイルでは、これらの基本的なボタンの押下セットを表すために追加のコマンドが使用されます。たとえば、A を 10 回押すには、A ボタンを 60 フレーム間押し続けるコマンドを 10 回続けて押すのではなく、 {'press_a', 10}
が省略表現として使用されます。
各ファイルには、メモリーメールの処理、標準的な戦闘アクションの実行、繰り返す必要があるゲームのセクションの移動など、さまざまなルーチンを実行する最大 12 個のカスタム コマンドも定義されています。
l
、 r
、 u
、およびd
コマンドは、ある方向に 1 歩進むことの短縮形であり、 lf
、 rf
、 uf
、およびdf
、一定のフレーム数の間方向ボタンを押し続けるためのコマンドであることに注意してください。
コマンドを手動で作成するのではなく、シーケンスを変更したり、新しいシーケンスを作成したりする場合は、 recordInputs
ファイルを bizhawk エミュレータと組み合わせて使用し、入力を記録し、次に使用できる形式で出力できます。スクリプト。
入力を記録するには、まずコントローラーのホットキーをクリアする必要があります。つまり、エミュレーターが入力をコマンドとして直接使用しないようにします。これはConfig -> Controllers -> Misc -> Clear
で実行できます。同じメニューのMisc -> Load Defaults
を使用して、後でホットキーをロードし直すことができます。
次に、 Tools -> Lua Console -> Script -> Open Script
の順に選択して lua コンソールを開き、そこでrecordInputs.lua
スクリプトを開きます。スクリプトの実行が開始されると、入力が記録されます。
ボタンのホットキーは、 recordInputs.lua
ファイルにリストされていますが、最も重要な 2 つは、記録終了時にフォーマットされたコマンドのリストを出力するlshift
と、60 フレーム待機コマンドを追加するrshift
です。入力レコーダーはアイドル時間を記録しません。つまり、 rshift
で待機時間を追加しない場合、コマンドは中断せずに次々と迅速に実行されるだけです。
これにより、入力の出力リストと、再生時に実際に行った内容が異なります。待機時間を追加するのを忘れがちで、再生時に問題が発生する可能性があります。ただし、利点として、入力をタイマーに記録する必要がないという点です。
他のキーはエミュレータのデフォルトと一致し、矢印キーは移動、 x
、 z
、 s
、 a
はA
、 B
、 X
、 Y
、そしてenter
開始を表します。
ゲームの開始時に必須の入力であるタッチ コントロールには、多少の不安定性がある可能性があります。先に進むには、画面の中央をタップしてモンスターボールの中心を打つ必要があります。これは非標準のアナログ入力であり、コードではtouch_middle
として示されます。これは 1 回だけ発生します。
また、単に私が気づいていなかったり、確認するつもりがなかったことが入力に反映されていない可能性もあります。この人的エラーは、シーケンスに問題やバグがないかを何度確認したとしても、常に存在します。
Pokémon は、線形合同乱数ジェネレーター (LCRNG) を使用して、ほとんどの乱数を生成します。これは、十分にランダムに見える数値のシーケンスを作成し、そのシーケンスを一度に 1 つずつ実行して「ランダムな」数値を生成することによって機能します。
第 4 世代のポケモン ゲームは、乱数を循環せず、必要な場合にのみ乱数を使用するという点で、以前のゲームとは異なります。
たとえば、Ruby/Sapphire/Emerald では、ゲーム内で何も起こっていなくても、ゲームは 1 フレームおきに乱数のシーケンスを実行し、ゲームが要求したときに現在存在する数値を生成します。
ダイヤモンド/パール/プラチナでは、ゲームが値を要求するまで、乱数ジェネレーターは静的なままです。つまり、ゲーム内の何もないエリアに立っている場合、乱数発生器は何も行いません。
コイン投げなど、特定のアクションに対する乱数ジェネレーターの考えられるすべての結果をシミュレートした場合、第 4 世代ゲームでは、タイミングに関係なく、この結果は決定的です (誰もいない、または「静かな」エリアにいると仮定して)。
第 3 世代ゲームでは、この結果は決定的ではなく、タイミングによって異なります。つまり、今コインを投げると、2 秒後に投げた場合とは異なる結果になる可能性があります。
私たちの目的では、第 4 世代ゲームのこの品質により、人間のプレイヤーがこの入力リストを使用してゲームをプレイしたとしても、依然として適切に機能します。これは、人間のプレイヤーが正確なタイミングで入力を行うわけではないためです。ボタンを少し早く押すか、少し遅く押します。ボタンを押すのが早すぎない限り、ゲームの結果に影響を与えることなく、無期限にボタンを遅らせることができます (最終的にボタンを押すと仮定します)。
この原理を使用して、ポケットモンスター プラチナの乱数列で 40 億の可能なシード、つまり開始位置をすべてシミュレートすることで、考えられるすべてのゲームで何が起こるかを予測することができます。たとえば、コインを 100 回投げると、結果の数は決定されます。すべてをチェックすることで、最悪/最良のシナリオを見つけることができます。この場合、それは 80/20 の分割です。
コイン投げの場合、このプロセスは、単純な統計を使用して期待値を決定するために数学を使用することに非常によく似ています。ポケモンの戦いなど、より複雑な物事の場合、数学を使用して結果を決定することは非常に困難になります。クリティカル、ミス、ダメージロール、AI 判定、二次効果のチャンスなどを考慮した確率を計算するよりも、40 億通りの可能性をすべてシミュレートする方が簡単です。
こうすることで、考えられるすべてのゲームでどの戦略が勝つかを洞察できるようになり、数学的には失敗したり負けたりする可能性がある場合でも、100% の確実性でさまざまなトレーナーを倒すことができます。
最終結果はこの一連の入力であり、誤入力やバグがない限り、プラチナのすべてのゲームを最初から最後まで失敗することなく勝つことができます。