該儲存庫包含將擊敗 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% 確定地擊敗不同的訓練師,即使從數學上講有可能失敗或失敗。
最終結果是這個輸入序列,它應該從頭到尾擊敗每場白金遊戲,沒有任何失敗的機會,除非輸入錯誤或錯誤。