# 【エメラルド】キンセツゲームコーナーで遊ぼう
この記事は[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動画を添えて記事を投稿くださいませ。
皆様の挑戦をお待ちしております!