Try   HackMD

【エメラルド】キンセツゲームコーナーで遊ぼう

この記事はPokémon Past Generation Advent Calendar 2023360日目分 の記事です。

今回は短め。

回そうルーレット

いきなりですが、こちらをご覧ください。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

ふとルーレットで6連続大当たりを当てることが出来ないか? というアイデアを思いつき実践した動画になります。これをやったのもう半年前なのか

こちらは拙作の Project_Eryxにより全ての操作を自動化した上で実行しています。

操作コード抜粋
@exportmacro("ルーレット自動化")
def roulette(cmd:Command):
    while True:
        st = time.perf_counter()
        soft_reset(cmd)

        cmd.press(Button.A, wait=st+17.36 - time.perf_counter())
        cmd.press(Button.A, wait=st + 19.76 - time.perf_counter())
        cmd.press(Button.A, wait=(st:=st+22.97) - time.perf_counter())
        
        # ball 1
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B, wait=(st:=st+20.0) - time.perf_counter())

        cmd.press(Button.A, wait=(st:=st+3.355) - time.perf_counter())
        
        # ball 2
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B, wait=(st:=st+20.0) - time.perf_counter())

        cmd.press(Button.A, wait=(st:=st+3.36) - time.perf_counter())

        # ball 3
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B, wait=(st:=st+19.93) - time.perf_counter())

        cmd.press(Button.A, wait=(st:=st+3.17) - time.perf_counter())
        
        # ball 4
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B, wait=(st:=st+19.83) - time.perf_counter())

        cmd.press(Button.A, wait=(st:=st+3.53) - time.perf_counter())
        
        # ball5
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B, wait=(st:=st+19.70) - time.perf_counter())

        cmd.press(Button.A, wait=(st:=st+2.80) - time.perf_counter())
        
        # ball6
        cmd.press(Button.A, wait=15.0)

        cmd.press(Button.B, wait=4.0)
        cmd.press(Button.B)
        cmd.press(Button.B, wait=1.0)
        cmd.press(Button.B, wait=1.0)

        cmd.press(Button.PLUS)
        cmd.press(Hat.DOWN)
        cmd.press(Hat.DOWN)
        cmd.press(Hat.DOWN)
        cmd.press(Hat.DOWN)
        cmd.press(Hat.DOWN)

        cmd.press(Button.A, wait=1.0)
        cmd.press(Button.A, wait=0.5)
        cmd.press(Button.A, wait=8.5)

def soft_reset(cmd:Command, battery_dried = True):
    """
    リセットする関数。リセット入力後フィールド画面に移行するまでを自動化します。
    """ 
    cmd.press(Button.A, Button.B, Button.PLUS, Button.X, dur=1.0, wait=4.5)
    cmd.press(Button.A, wait=1.0)# オープニングスキップ
    cmd.press(Button.A, wait=0.5)# プレタイトルスキップ
    cmd.press(Button.A, wait=3.0)# タイトルスキップ
    if battery_dried:
        cmd.press(Button.A, wait=2.5)# でんちぎれの ために...
        cmd.press(Button.A, wait=1.0) #とけいに かんけいする...
    cmd.press(Button.A, wait=2.4)# つづきから はじめる

この自動化、実は隠れて凄いことをやっていたりします。

本作におけるルーレットはボールの投入速度や投入位置が乱数によって決定されています。単にルーレットが見かけ上同じ位置でBETを決定しても、必ずしも同じ位置にボールがポケットされるとは限りません。

他にもBET待機画面とそれ以外とでルーレットの回転速度が異なるといった仕様も相まって、意外と状況再現が難しいのがこのゲームの特徴です。

今回のように6連続で大当たりを成功させるためには、各タイミングでのボタン操作を正確に行う必要があります。

正直、自前のツールでここまでの精度を出せるとは思っていなかったのは内緒。

挑戦状

ということで折角なので(?)他の自動化フレームワークで同様のチャレンジをされる方を募集します。

Nx Macro Controller / Poke Controller (及びその拡張FW)を用いて、上記の動画と同様に6連続でルーレットの大当たりを成功させた方 先着1名に Amazonギフト券をプレゼントします。(期限:2024/12/25)

ご応募いただける方は今年のPokémon Past Generation Advent Calendar 2024 にproof動画を添えて記事を投稿くださいませ。

皆様の挑戦をお待ちしております!