# 【エメラルド】キンセツゲームコーナーで遊ぼう この記事は[Pokémon Past Generation Advent Calendar 2023](https://scrapbox.io/PokemonPRNGDiscord/Pok%C3%A9mon_Past_Generation_Advent_Calendar_2023)の**360日目分** の記事です。 今回は短め。 ## 回そうルーレット いきなりですが、こちらをご覧ください。 {%youtube uf5J_VMWKvs %} ふとルーレットで6連続大当たりを当てることが出来ないか? というアイデアを思いつき実践した動画になります。~~これをやったのもう半年前なのか...~~ こちらは拙作の [Project_Eryx](https://github.com/niart120/Project_Eryx)により全ての操作を自動化した上で実行しています。 :::spoiler 操作コード抜粋 ```python! @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](https://adventar.org/calendars/10546) にproof動画を添えて記事を投稿くださいませ。 皆様の挑戦をお待ちしております!