ポケモン剣盾の乱数調整作業自動化

# はじめに
ポケモン剣盾の乱数調整作業（+その他）の自動化のためのハードとソフトを作りました．
乱数調整の日付変更の作業などを自動でやりたいという人におすすめです．大量の日付変更（一万回くらい）も可能になります．
多少の電子工作の知識を必要とします．
注意：ここにあるものはすべて自己責任にて行ってください．

# モチベーション
- さびたコイルさん(@rusted_coil)らがポケモン剣盾用乱数調整ツール [1-Star Seed Search](https://rusted-coil.hateblo.jp/entry/2020/01/07/184005)を公開してくださっているためレイド乱数ができるようになった．
- シード特定のための作業や最後の乱数消費作業はすべて手動でやるのは少し大変なので，自動化したい．
- @Sobassyさんが[Arduinoを使ってSwitchを操作する方法](https://qiita.com/sobassy/items/cb707e50f2f27a851886)を紹介してくださっている．
- 乱数調整は何種類か操作が必要なので，Arduinoのファームウェアを書き込みなおす必要性がある．それは面倒なのでPCとArduinoを接続してPCのプログラムからArduinoを操作すれば楽になりそう．

# 概要
- ArduinoはHID化してSwitchにコントローラとして接続できる．このコントローラをPCのソフトウェアから操作したいので，ArduinoのUARTで通信する．
- ArduinoはPCから受け取ったボタン命令をただ実行するだけで，内部に「日付を進める」などの操作を記述しない．操作を作る時，ボタンの間のdelayを調整することになるが，こうすることでいちいちArduinoに書き込む必要がない．
- PC側のプログラムはGUIを作りたかったのでVisualStudioでフォームアプリケーションを作った．
- github https://github.com/chibi314/PokemonSWSHAutomation

# 必要なもの
- .NET環境のあるWindowsPC (Windows 10を推奨 それ以外で動作確認していないので)
- Arduino Leonard 若しくはその互換
    - 自分は[これ](https://www.amazon.co.jp/HiLetgo%C2%AE-Leonardo-ATmega32U4-%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B01M6WULAO/ref=pd_nav_hcs_rp_3/355-8044116-8392514?_encoding=UTF8&pd_rd_i=B01M6WULAO&pd_rd_r=40eb3273-ffe2-4d24-8b50-273c54b0e9e4&pd_rd_w=dBQsI&pd_rd_wg=7pcSQ&pf_rd_p=88a00f39-ea6c-45b5-99f9-c3d924de750d&pf_rd_r=HE8D6MS71T2ZC6KVGHFH&psc=1&refRID=HE8D6MS71T2ZC6KVGHFH)を買いました
    - リンク先のものが売り切れているようでしたが，「Leonardo Pro micro」などで調べて出てくるものでATmega32U4が載っているものであればおそらく大丈夫です．([これ](https://www.amazon.co.jp/KKHMF-Leonardo-ATmega32U4-%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B07F2Z7T8W/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=leonardo+pro+micro&qid=1579184285&s=industrial&sr=1-2)とか) 手元で確認はしていません．
- FTDI FT232 (USBシリアル変換)
    - ジャンパ線を使うなら[これ](https://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%8F%E3%83%A4%E3%83%88-MM-FT232-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/dp/B00J7LEM6G/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=FT232&qid=1578833394&s=industrial&sr=1-6)とか
    - 自分はユニバーサル基板にはんだ付けしたい+USB microBケーブルを使いたかったので[これ](http://akizukidenshi.com/catalog/g/gK-09951/)買いました
- ブレッドボード，ジャンパ線若しくはユニバーサル基板
    - 詳しくは後述
    - ユニバーサル基板を使うならはんだごて，はんだなども必要
- SwitchとArduinoをつなぐUSBケーブル (A - microB等)
- PCとArduinoをつなぐUSBケーブル (A - microB等)

# 手順1 Arduino+FT232基板の制作
- Arduino LeonardのUARTをFT232に接続します．
- 図のように接続してください．

![アートボード 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/c7490003-608b-68eb-d676-bc608ae68d43.png)

- 注意点
    - TX, RXはクロスするように接続(TX同士，RX同士を接続しないように)
    - FT232側にCTS, RTSなどのピンがあるかもしれないが，何も接続しなくてよい
    - ArduinoのUARTの電圧は5Vなので，FT232側で5Vに設定する(5Vと3.3Vを切り替えるスイッチが存在する．ない場合はそもそも5Vのものを買う)

自分は以下のようにユニバーサル基板にはんだ付けして接続しました．
ブレッドボードでもいいですが個人的には場所をとる上に接触不良しやすいのではんだ付けをお勧めします．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/3f3988d5-f13b-0112-cb73-e162dcdbce72.png" width="700">

# 手順2 Arduinoのファームウェアの書き込み
- 1. Arduino IDEをインストールする
    - [ここ](https://www.arduino.cc/download_handler.php?f=/arduino-1.8.10-windows.exe)にアクセスし，JUST DOWNLOADを押す．（お財布に余裕のある方はCONTRIBUTE & DOWNLOAD)
- 2. Switch操作用ライブラリをインストールする
    - [ここ](https://github.com/celclow/SwitchControlLibrary)にアクセスし，`Clone or download`→ `Download ZIP`
    - ZIPを解凍し，できた`SwitchControlLibrary-master`を`[Arduinoがインストールされたディレクトリ]/libraries`の中に配置する．
    - [参考](https://qiita.com/sobassy/items/cb707e50f2f27a851886)
- 3. Arduino STLをインストールする
    - [ここ](https://www.arduinolibraries.info/libraries/arduino-stl)から最新のZIPをダウンロードし，解凍する
    - 2と同様に`[Arduinoがインストールされたディレクトリ]/libraries`の中に配置する
- 4. `[Arduinoがインストールされたディレクトリ]/hardware/arduino/avr/boards.txt`を開き，285, 286行目を以下のように変更する．このときメモ帳ではなくVSCodeなどで編集すること。

```
leonardo.vid=0x0f0d
leonardo.pid=0x0092
```
同ファイルの311, 312行目を以下のように変更する．

```
leonardo.build.vid=0x0f0d
leonardo.build.pid=0x0092
```

（追記）boards.txtの場所が違う場合があるらしい．うまくいかない場合，
`C:\Users\ユーザー名\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\boards.txt`を編集する．　[参考](https://qiita.com/sobassy/items/cb707e50f2f27a851886)

- 5. Arduinoに書き込むファームウェアをダウンロードする．
    - [ここ](https://github.com/chibi314/PokemonSWSHAutomation)にアクセスし，`Clone or download`→ `Download ZIP`して解凍
    - Arduino IDEを開き，`PokemonSWSHAutomation-master\arduino_firmware\pokemon_automation_arduino_firmware\pokemon_automation_arduino_firmware.ino`を開く．
- 6. ArduinoをUSBケーブルでPCに接続する
- 7. Arduino IDEでボードとポートを以下のように選択
    - ポート番号はPCによって変わります．

![アートボード 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/398dacd2-3d89-2a3d-3f59-744a43329183.png)
![アートボード 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/c79d78f4-3f54-8213-4bbc-071279fdea0e.png)

- 8. 図に示した書き込みボタンをクリックし，待つ．正しく書き込めたら図のように「ボードへの書き込みが完了しました」というメッセージが出る．

![アートボード 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/993aee17-379a-60d9-4ffa-9aa07ccc8c55.png)

# 手順3 Switch，PC，Arduinoを接続し，PCプログラムを起動する
- 1. Switchのホーム画面からコントローラー→持ちかた/順番を変えるに進み，コントローラを待機する状態にする．
- 2. ArduinoとSwitchを接続する．FT232のUSBポートと間違えないように注意．ファームウェアが正しく書き込まれていればコントローラーとして認識される．
    - このときFT232側をPCに先に繋いでいると給電されている可能性があるため，PCとの接続は切っておいたほうが良い．
- 3. FT232とPCを接続し，手順2でダウンロードした`PokemonSWSHAutomation-master\PokemonAutomation\PokemonAutomation\bin\Release\PokemonAUtomation.exe`を実行する．以下，ソフトの使い方の説明．

# 使い方説明
![アートボード 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/9054a4be-f6cc-da1e-e62a-c8274c31fee1.png)

- 初めにポートを選択してFT232に接続する．
    - 他にUSBデバイスをつないでいない場合(COMXが他にない場合)は起動と同時に繋がっている．もし複数ある場合はクリックしてプルダウンし，FT232のポートを選択すると繋がる．
- 正しく繋がっていれば，コントローラ部分のボタンを押せばSwitchを操作できる．例えばHomeを押せばHome画面へ行くはず．
- 日付を設定する
    - まずSwitchの設定の`インターネットで時間を合わせる`をOFFにしておく
    - 今のSwitchの時間をソフトの右上の部分に設定する．クリックしてプルダウンすると年月日が選択できる．日を決定するとその日付に設定される．ボックス下の`Date`に設定された日付が表示されるので，それで確認する．
   
## 日付進めボタン(シード特定用)の使い方
- まず光の柱が立っている巣穴を選択し，この画面まで進める．
![アートボード 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/2f579b51-30af-c047-0a51-ac22566ae2ce.png)

- この状態から`+1 Day` `+3 Days` `+4 Days`を押すとそれぞれ1日，3日，4日進む．
    - シード特定では`+3 Days`を押しまくることになる
- このボタンはトグルボタンとなっているので，もう一度クリックすると一連の動作を終えた後停止する．

## 日付進めボタン(シード特定後)の使い方
- ランクバトルを行い，対戦を終えた後インターネットの接続を切りローカル通信の状態にする．これでSwitchの日付を変更するとゲーム内で日付が変更された判定となる．
- コントローラーパネルのボタンを押してこの画面まで進める．
    - カーソルが`現在の日付と時刻`に合っていることを確認
  
![アートボード 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260126/57f35f4c-53cd-cbdf-1322-8248a0aa8142.png)

- `+ N Days`ボタンの左のボックスに進めたい日付を入れ，`+ N Days`ボタンをクリックすると，日付の変更が行われる．
    - これをワイルドエリアでやると高確率でポケモンがエラーを吐いて終了するので，ワイルドエリアにいない方が良い．また，それでも落ちる可能性はあるので，小分けにしてセーブを挟んだ方が安全．
- このボタンはトグルボタンとなっているので，もう一度クリックすると一連の動作を終えた後停止する．

## Loto ID(IDくじ)ボタンの使い方
- ランクバトルを行い，対戦を終えた後インターネットの接続を切りローカル通信の状態にする．
- ポケモンセンターのロトミの前までくる．Aボタンを押したらロトミに話しかけられる状態にする．
- その状態でLoto IDボタンを押すと日付を変更し，IDくじを引くことを繰り返す．
- このボタンはトグルボタンとなっているので，もう一度クリックすると一連の動作を終えた後停止する．

# 最後に
- ここに書いてあることを行う場合，すべて自己責任にてお願いします．
- 説明に抜けがある気がするので，不足している部分やソフトウェアのバグ報告などがありましたら，[github](https://github.com/chibi314/PokemonSWSHAutomation)のissueに報告お願いします．
- 質問はtwitter @chibi314 まで
- 「自動化」といいつつわりと手動なので，Switchの画面をキャプチャして画像認識にて完全自動化したいですね・・・