Log

いろいろ

ポケモンDX~Final~

お金を集めました。
ポケモンDX - Log

きのみを集めました。
ポケモンDX2 - Log

バトルに向けて最後の課題。ラスタルです。テラピースはお金で解決できません。今回はこれを集めます。マイコンが。

方針。

  • 星3と星4のテラレイドバトルをおこなう*1
  • ↑を一生繰り返す

星4までのテラレイドバトルであればテツノカイナのインファイト連打で勝てます。星5以上になると弱点を付くなり、補助技を使うなり、工夫する必要がでてくるかと。それにはプログラムを組むのにも時間がかかるし、何より処理が失敗するリスクが増えてしまいます。また、レイドバトルの時間も増えそうです。結局、星4以下を刈り取る方がトータルで効率的だと思います。

というわけでメイン処理。

star3 star4
# レイドを調べる
self.press(Button.A, wait=2.0)
while not self.isContainTemplate('Raid/star3.png', 0.8, use_gray=False) \
    or not self.isContainTemplate('Raid/star4.png', 0.8, use_gray=False):
    print('raid not found')
    self.press(Button.B, wait=1.0)
    self.change_date()
    self.wait(2.0)
    self.press(Button.A, wait=2.0)

# 「ひとりで挑戦」を選択してレイドバトル
self.press(Hat.BTM, wait=1.0)
self.press(Button.A, wait=1.0)
self.raid_battle()

use_grayはデフォルトでTrueですが、誤検知が発生したためFalseとしています。

レイドがない場合はchange_dateで日付を変更します。

datetime_settings
print('change date')
    # ホーム画面 > 設定 > 本体
self.press(Button.HOME, wait=1.0)
self.press(Hat.BTM)
self.press(Hat.RIGHT)
self.press(Hat.RIGHT)
self.press(Hat.RIGHT)
self.press(Hat.RIGHT)
self.press(Hat.RIGHT)
self.press(Button.A, wait=1.5)  
self.press(Hat.BTM, duration=2.0, wait=1.0)
self.press(Button.A, wait=1.0)

# 日付と時刻の設定を探す
while not self.isContainTemplate('Raid/datetime_settings.png', 0.8):
    self.press(Hat.BTM, wait=1.0)
self.press(Button.A, wait=1.0)

# 日付を1日進めてゲーム画面に戻る
self.press(Hat.BTM)
self.press(Hat.BTM)
self.press(Button.A, wait=1.0)
self.press(Hat.RIGHT)
self.press(Hat.RIGHT)
self.press(Hat.TOP)
self.press(Button.A)
self.press(Button.A)
self.press(Button.A)
self.press(Button.A)
self.wait(0.5)
self.press(Button.HOME, wait=1.0)
self.press(Button.HOME, wait=1.0)

さて、最後に実際の対戦部分ですが、これはインファイト(先頭の技)を連打するだけです。

battle_menu get_pokemon
print('raid battle start')
self.wait(10.0)

while True:
    # 技選択画面
    if self.isContainTemplate('Raid/battle_menu.png', 0.8):
        print('atack')
        self.press(Button.A, wait=0.5)
        self.press(Button.A, wait=0.5)
        self.press(Button.A, wait=0.5)
    # 勝利画面
    if self.isContainTemplate('Raid/get_pokemon.png', 0.8):
        print('win')
        # つかまえない
        self.press(Hat.BTM, wait=0.5)
        self.press(Button.A, wait=0.5)
        # 報酬を受け取って終了
        self.wait(5.0)
        self.press(Button.A, wait=1.0)
        break
    # 負けることはない
    # if

    self.wait(3.0)

print('raid batlle end')

…待てよ?インファイトはゴーストには効かない…?そう思ってしばらく対戦を眺めていたら、味方が倒してくれていました。CPUって役に立つんだ。

待機時間は例のごとくsegmentation faultが発生しないようisContainTemplateの処理回数を抑えるために入れています。ここで朗報。リアルタイム表示をオフにすることでsegmentation faultの発生を抑えられる気がしてきました。その場合、現在の画面が見えないので困っちゃいそうですが、HDMI分配器で別のディスプレイに出力することで解決しました。

カオス

またハードウェアを買ったので今日の食費はないし、そもそもご飯を食べるスペースがありません…

1回のレイドバトルで大体3個くらいテラピースが手に入ります。1時間で10戦くらいはこなしてくれるので、全18タイプを999個集めるには600時間くらいかかる計算です。1ヶ月くらい。先は長いぜ。

何日か走らせてみたところこんな感じ。

アメたくさん

はねもたくさん

ピースはまだまだ

たまに失敗するので要介護ですが、リモートワークなので問題ありません。とくに修正するつもりなし。

それではまた1ヶ月後に👋

*1:ストーリークリア後は星3以上のレイドしか出現しないようでした。