見出し画像

ポケモンSVどうぐプリンターの自動化

注意:この記事にはネタバレ要素が含まれます。
2023/12/28 マイナーチェンジ

はじめに

ポケットモンスターSVの追加コンテンツ第二弾「藍の円盤」とても楽しいです。

今作では「どうぐプリンター」という新しい装置が登場しました。剣盾のウッウロボみたいな感じですが、BPとポケモンの落とし物を入れることで、アイテムを生成できる画期的な装置です。
何がいいかというとたまにおしゃぼが出るんですよね。

特に「コンペボール」と「サファリボール」はポケモンSVでは「藍の円盤」で初登場?なので、かなりねらいたいボールです。

準備

ゲーム内

どうぐプリンターは最終段階まであげておきます。

BPとデリバードのにもつ「ジュラルドンのさび」を頑張って集めておきます。デリバードのにもつジュラルドンのさびなのは、単純に今大量発生しているからで、年末年始に大量発生するジュラルドン、もしくは素材集めに適したポケモンに変えたものも実装予定です(とはいえ画像の差し替えだけですが…)
今のところ「ピンプクのおとしもの」や「ヤミラミのほうせき」が効率よさそうです。

準備ができたら白衣のお姉さんの前に立ちます。

プログラム

Poke-Controller-Modified を使います。環境構築などはほかに記事がたくさんあるので省略します。

今回実装したコードはこんな感じです。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from Commands.PythonCommandBase import PythonCommand, ImageProcPythonCommand
from Commands.Keys import KeyPress, Button, Direction, Stick
from PIL import Image, ImageOps
import numpy as np

class ItemPrinter(ImageProcPythonCommand):
    NAME = 'どうぐプリンター自動化'

    # 何回プリントするか
    max_count_print = 9

    def __init__(self, cam):
        super().__init__(cam)

    def do(self):
        count = 0
        # アイテム画面になるまでA連打(最初)
        while not self.isContainTemplate('SVItem/list.png', threshold=0.8, use_gray=False, show_value=False):
            self.press(Button.A, wait=0.5)

        while True:
            if count > self.max_count_print:
                self.LINE_text("指定回数を超えました")
                self.finish()

            self.wait(1.0)

            count += 1

            print('-------プリント開始:', count, '回目-------')

            while not self.isContainTemplate('SVItem/list.png', threshold=0.8, use_gray=False, show_value=False):
                self.wait(1)

            # 「デリバードのにもつを選択するまで下]
            # while not self.isContainTemplate('SVItem/deri.png', threshold=0.8, use_gray=False, show_value=False):
            #     self.press(Direction.DOWN, wait=0.5)
                
            # 「ジュラルドンのさびを選択するまで下]
            while not self.isContainTemplate('SVItem/jura.png', threshold=0.8, use_gray=False, show_value=False):
                self.press(Direction.UP, wait=0.7)
            
            self.wait(0.5)

            self.press(Button.A, wait=0.5)
            self.press(Direction.LEFT, wait=0.5)
            self.press(Button.A, wait=0.5)

            self.wait(0.5)
            self.press(Button.PLUS, wait=0.5)

            # ゲットしたアイテムが表示されるまでA連打
            while not self.isContainTemplate('SVItem/gottonItem.png', threshold=0.6, use_gray=False, show_value=False):
                self.press(Button.A, wait=0.8)

            self.press(Button.A, wait=0.5)

本来消すべき部分が消えていないのはお許しください。

SerialController\Commands\PythonCommands\ImageProcessingOnly\itemPrinter.py という階層に保存します。

また今回使う画像は以下のような画像を用意しています。

SVItem/list.png
SVItem/deri.png
SVItem/gottonItem.png
SVItem/jura.png


実施すると10回くらい回して完了したらLINEに通知してくれます

動き

2023/12/28 デリバードのにもつからジュラルドンのさびに変更しました。

あんまりデバッグしていないので、なんとなく動くというくらいです。
おとしもののリストが開けたら、「デリバードのにもつ」までカーソルを動かしていきます。
手動でやるときは右を三回やったあとにカーソルを下に動かしていく方がはやいのですが、イレギュラーな動きをやると自動化ではしんどいので下に動いていくだけです。
ジュラルドンだと上にちょっとカーソルを動かせばいいので、ジュラルドンの方が効率はいいはず -> 結論ジュラルドンのさびの方が全然効率的でした。

「デリバードのにもつ」を19個入れたら、プリントを始めます。手に入れたアイテムが表示されるまでA連打しています。
本当は再度落とし物のリストが表示されるまでA連打したかったのですが、リストの表示に遅さがあって、別のアイテムを選んでしまったので、こういう動きにしています。

注意

プログラムの実行は自己責任でお願いします。コレクレーのコインとか入れちゃうと悲しすぎるのですが、それが起こる可能性もあります。

最後に

テンションがあがってコードを書きましたが、忙しい人はふつうにがっこうさいきょうたいかいを周回して、集まったお金で

こちらのコードを動かした方がいいです(サファリ、コンペは手に入りませんが…)。

BP集めとポケモンの落とし物集めを自動化するのはおそらくけっこう大変で、当分の間は手動でやる必要があるからです。
落とし物あつめはけっこう効率的にできますが、BP集めはマルチでやらないと厳しいです。今はポケモンのプレイヤーも多く、マルチでも人が集まりやすいかもしれませんが、三か月後は誰もやっていないかもしれません。

雑感

最近まで自動化のプログラムをマイナーチェンジして遊んでいるだけだったので、自動化のコードを新しく作りたいと思って久しぶりにコードを書きました。
どうぐプリンターは一回の試行時間が短いので、作りやすい気がします。

DMAの自動化を作った方は本当にすごいですね。

変更点

2023/12/28 に「デリバードのにもつ」から「ジュラルドンのさび」に変更しました。今ジュラルドンがたいりょうはっせいしているのもありますが、「ジュラルドンのさび」はアイテム選択時十字キー上だけですぐにいける上に、「デリバードのにもつ」のように飛ばしてしまうことが少ないので、効率が上がります。
自動化前提なら「ジュラルドンのさび」を集めておくのがよさそうです

この記事が気に入ったらサポートをしてみませんか?