🌍

ポケモンZAの色違い狙いをRaspberry Pi 5で自動化する

に公開

はじめに

最近ポケモンZAをやり始めました。プレイ時間50時間にしてようやくひかるおまもりを手に入れられたので、楽に色違いを狙っていきたいと思います。

プロコンのスティックをゴム等で固定しながらAボタンの自動連射設定をしている人が多そうですが、Pythonスクリプトで制御してしまえば楽なのではということで書いてみました。

今回はベンチ厳選のみ取り上げますが、エリアチェンジなどの少し複雑なコントローラ操作が必要なものも自動化可能です。

ちなみにうちにはまだSwitch2が届いていないので、Switch1でしか動作確認していません。コントローラのペアリングまわりとか多少は変わっているのでしょうか?

tl;dr

  1. RaspiとBluetoothアダプタ(USB接続)を用意。(恐らくRaspi内蔵のBTアダプタでもできるが試してない)
  2. システムのpythonでvenvを作成
  3. nxbt及びjoycontrol-pluginloaderをインストール
  4. 既存のコントローラを削除してからペアリングする
  5. 自動化用のスクリプトを実行する

手順

1. 準備

以下を準備してください

  • SwitchまたはSwitch2
  • Raspbery pi(4でも5でもいいと思います。今回はRaspberry Piの4GBモデルを利用)
  • USB接続のBluetoothアダプタ

BluetoothアダプタはRaspbery piに接続します。

以下の手順でpokeza_autoディレクトリを用意してjoycontrol-pluginloaderをインストールします。
ちなみに、bluetooth周りの実行のためにRoot権限が必要なので、以下の作業はすべてrootから行っておくほうが楽です。

mkdir pokeza_auto && cd pokeza_auto
python3 -m venv .venv
source .venv/bin/activate

sudo apt install libdbus-1-dev libglib2.0-dev
git clone --recursive https://github.com/Almtr/joycontrol-pluginloader.git
cd joycontrol-pluginloader
pip install .
cd ..

2. ペアリング

先にペアリング済みのコントローラを削除しておきます。この操作もスクリプト実行ごとにやらないとだめそうです。

bluetoothctl devices
(ペアリング済みのデバイス一覧が表示される)

bluetoothctl remove XX:XX:XX:XX:XX:XX(削除したいデバイスのMACアドレス)

以下のように疑似コントローラのペアリングを行います。

sudo joycontrol-pluginloader joycontrol-pluginloader/plugins/tests/PairingController.py

コントローラメニューの持ち方を変更するを選択するとペアリングが完了します。

3. 実行

以下のスクリプトを作成します。
vim AutoBench.py

AutoBench.py
import logging
from JoycontrolPlugin import JoycontrolPlugin

logger = logging.getLogger(__name__)

class AutoBench(JoycontrolPlugin):
    async def run(self):
        logger.info('Bボタンで画面を抜けています...')
        
        # Bボタンを3回押す
        for i in range(3):
            await self.button_push('b')
            await self.wait(0.3)
            logger.info(f'Bボタン {i+1}回目')
        
        await self.wait(0.5)
        
        # Homeボタンを押す
        logger.info('Homeボタンを押してゲームに戻ります...')
        await self.button_push('home')
        await self.wait(2)
        
        logger.info('左スティック下 + Aボタン連打を開始します')
        
        try:
            # 左スティックを下に倒す
            await self.left_stick('down')
            
            # 無限ループでAボタン連打
            count = 0
            while True:
                await self.button_push('a')
                count += 1
                if count % 10000 == 0:
                    logger.info(f'{count}回押しました')
                await self.wait(0.1)
                
        except KeyboardInterrupt:
            logger.info('終了します')
        finally:
            # スティックを中央に戻す
            await self.left_stick('center')

あとはjoycontrol-pluginloader -r XX:XX:XX:XX:XX:XX AutoBench.pyで実行できます。

A連打とスティック下を自動化するだけのスクリプトなので、実行前にベンチの前に立っておく必要があるので注意です。

トラブルシューティング

引っかかったことをメモしておきます。

ペアリング時に既存のBluetoothデバイスなどがあって警告が出る

ペアリング時に

[12:49:32] joycontrol.server create_hid_server::64 WARNING - detected too many SDP-records. Switch might refuse connection.
[12:49:32] joycontrol.server create_hid_server::67 WARNING - Attempting initial pairing, but switches are paired:

のような警告が出る場合、以下のように既存のBluetoothデバイスの削除やキャッシュの削除をすると改善するかもしれません。

bluetoothctl devices
(ペアリング済みのデバイス一覧が表示される)

bluetoothctl remove XX:XX:XX:XX:XX:XX(削除したいデバイスのMACアドレス)
sudo systemctl stop bluetooth
sudo rm -f /var/lib/bluetooth/*/cache/*
sudo systemctl restart bluetooth

ファイル名及びクラス名について

スネークケース(auto_bench等)が使えないようです。クラス名及びファイル名は同名のパスカルケース(AutoBench等)としておくのが安全なようです。

おわりに

この記事が何かの役に立ちましたら幸いです。

皆様もよいミアレライフを。

Discussion