ポケモンSVのお金稼ぎ&レベルアップと1BOXに溜まったいらないポケモン逃がすのを自動化してみた

こんにちは、おのぽんです。
みなさんポケモンSVやってますか？僕はスカーレットをやってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200862/7da4885d-c34b-aca2-182d-56ce6e46685a.png)

　今作は、今まで以上に資金をポケモンに投資できる仕組みにみたいなゲームになっていて、「世の中は金じゃ」みたいな隠れたメッセージを感じます。
そして、とある場所ではいろいろ頑張ると、画面を見ずともAボタン連打で勝手に稼げる様にはなります。
　しかし、この手法を使ってもお金は稼げても他のポケモンのレベルアップを行うことはできません。（後述しますが、2匹以上連れて行くとAボタン連打では途中で進行不能となってしまいます。）

おのぽんは思いました。

**<span style="font-size:150%;">「ポケモンはお金を稼ぐゲームじゃない。レベルを上げてこそポケモンだろ！！！！！」</span>**

と。

とはいえ、作業は面倒なので、勝手にポケモンのレベルは上がっていてほしいと思う今日この頃。

というわけで、今回はその辺りの面倒な作業を自動化してしまおうという企画（？）です！！

# Arduino（アルデュイーノ） とは

https://e-words.jp/w/Arduino.html
> 手の平サイズの小さな電子基板にコンピュータとして最低限必要な要素を実装した、いわゆるワンボードマイコンの一つ。

です。

活用事例は色々ありますが、色々なセンサーを拡張したり（別途購入が必要）、センサーと連携しながらC++で書いたプログラムを動かすこともできるため、何かしらのプロトタイプを作るのに適したデバイスです。
下記の記事にできることがまとまっております。

https://goworkship.com/magazine/what_can_arduino_do/


今回はこれを使って自動化を進めてみようと思います。
Arduinoには色々種類があり、Nintendo Switchと繋ぐためには、Arduino Leonardo として使える商品を購入する必要があるとのことでした。

https://www.amazon.co.jp/gp/product/B086GPX434/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200862/8c09e147-52c1-c0ae-2a07-0311027f0e75.png)

僕は上記のものを購入しましたが、1400円ほどでした、安い！
そして実物はめちゃくちゃ小さい！

実際に利用する際は、下記の用にmicroUSBでArudinoに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200862/4b6e09d8-513f-9bf7-8f6d-86aab45e4611.png)

# Arduinoとswitchの接続方法や開発環境づくり

この辺のサイトを見れば一通り開発できるようになるので、割愛します。

https://tangential-star.hatenablog.jp/entry/20201107/1604761008#%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AEPC%E4%BB%A5%E5%A4%96

# 詰まったポイント

## boards.txtの書き換え場所

ArduinoをSwitchのコントローラーとして偽装して利用できるようにするためには、boards.txtと呼ばれるファイルを修正する必要があります。
Windowsで開発するユーザが多いようで、なかなかMacでのboards.txtの場所がわからず困ってました。
ググったりしていると、大体の人が

` /Applications/Arduino\ IDE.app/Contents/Java/hardware/arduino/avr/boards.txt`

にあるよ！

と言っているのですが、

僕の環境ではなぜかJavaディレクトリが存在せず、代わりに

`/Users/{USER}/Library/Arduino15/packages/arduino/hardware/avr/1.8.2/boards.txt`

という全然違うパスにboards.txtがいました🤔

## boards.txtを書き換えても反映されない

これが一番なんで？となった点でした。
Libraryの中身を書き換えた場合は、Arduino IDEを再起動しないといけないようです。

## ArduinoってどうやってSwitchと繋いで実行するんだろ？

Arduino初心者の僕はその辺りが全然わかっておらず、とりあえず試しに挿してみたら動作しました。
Arduinoは性質上、USBを繋いで準備ができ次第、勝手にプログラムが起動するようになっているようです。

## 最初のコマンド3つが動かなかった

Arduinoはメソッドが大きく2つ用意されており、

```c++
// 最初に一度だけ呼ばれる
void setup() {
}

// Arduinoが起動している間、延々と叩かれ続ける
void loop() {
}
```

となっております。

しかし、僕の買ったマイコンが不調なのか、今回使っているライブラリのせいなのか原因はよくわかりませんが、「AAAB」と順番に入力されるプログラムを実行すると、

最初の1ループ目：Bのみ入力される
2ループ目以降：期待通りAAABが入力される

みたいな状況となってしまいました。

そのため、下記の様に適当なコマンドをsetup時に3回押すことで1ループ目からちゃんと動くように修正しました。

```c++
void setup() {
  // put your setup code here, to run once:
  SwitchControlLibrary(); // 初期化
  // 最初の3コマンドは認識してくれないので、
  // もし実行されても一番影響の少なそうなボタンを押す
  pushButtonLoop(Button::PLUS, 3);
}

void loop() {
    autoBattle();
}
```

## コマンド間のdelayの調整が難しい

ArduinoがSwitchで動く様にするために、

* PCでプログラムを書く
* ArduinoをPCに繋いで、プログラムを書き込む
* ArduinoをSwitchに繋ぎ直して動作チェックを行う

ということを行わないといけないので、デバッグが面倒であるという点で結構苦労しました。
何十回Arduinoを抜き差ししたことか・・・w

# 今回の産物

https://github.com/onopon/nintendo_switch
ソースコードはgithubに上げてあります。
※ 自分用なので、ほとんど気遣いがありません。悪しからず。。

今回は、下記の2つを作りました。

* 複数体ポケモンを連れていても自動バトルを可能にする
* 1ボックスにいるポケモン合計30匹を全部逃す

自動バトルはあまりに簡単だったので、他のも作ってみようかなと。

## 自動バトルでポケモンを育てる

今作では、2匹目以降にポケモンを連れていると必ず戦闘間で「ポケモンを変えるかどうか」を聞かれます。
そして、Aボタンを連打していると先頭のポケモンをもう一度選んでしまうので、「そのポケモンはもう出ているよ」と言われてしまい、ゲームが進行されなくなってしまいます。
そのため、どこかのタイミングでキャンセルする必要が出てきます。

色々思考錯誤を重ねた結果、`A6回B3回`を連打し続けると効率が良いという結論に至りました。

AAAAAABBBAAAAAABBB...

と連打され続けます。

AとBの合計回数を奇数にすることで、ゲームの進行が止まりそうな時でも少しずつAとBが押されるタイミングがずれるようになり、進行するようにするためです。（残念ながら無駄な時間がかかってしまう場合はあります）

最初はA10B3で実装しましたが、動作確認中、意外とAの回数を少なくしても進行に影響がないことがわかったので、この回数となりました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/dSiXmuwMwtc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

ちなみに8時間30分回してみて、稼いだお金は430万程度でした。
確か友達が言うには、「6時間で500万くらい」と言ってた気がするので、Bボタンのフローがある分当然ながら少し効率は悪くなります。

また、経験値も同時に測ろうと思いましたが、ヒメグマをLv1の状態でパーティに加えたところ、気づいたらLv100になってしまったので全獲得経験値がわからず・・・🤔
とりあえずヒメグマは100万の経験値を稼いだようです😊

## 1ボックスにいるポケモン合計30匹を全部逃す

<iframe width="560" height="315" src="https://www.youtube.com/embed/U480lc1Q3Jw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

ジグザグと逃していき、最後は別のポケモンを逃すような誤作動を行わないようにするために、メニューを閉じ、ホームボタンを押す動作を加えております。

ちなみにプログラム書いてる時に一度自分の手持ちのポケモン逃し始めてしまい、マジで焦りましたw
プログラムの利用は自己責任で・・・w

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">arduino使ってポケモンSVの1ボックス全部逃すプログラム書いてたら、プログラムミスって手持ちがっつり逃し始めて焦った😇 <a href="https://t.co/GRY2Klu1cp">pic.twitter.com/GRY2Klu1cp</a></p>&mdash; おのぽん (@onopon_engineer) <a href="https://twitter.com/onopon_engineer/status/1615886835435307009?ref_src=twsrc%5Etfw">January 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

今回は、「レベルを上げてこそポケモン」というモチベーションを頼りにArduinoを活用してレベル上げも自動化してみました。

が、作ってる途中で、「あれ？ポケモンってこういう楽しみ方であってるっけ？」と何度も疑問に思いましたが、Arduino使った開発（と言うほど何もしてないけど）が楽しかったので良かったです😊

せっかく買ったので、Switchで遊ぶ以外にも色々やってみたいなと思います！