【ポケモンSWSH】Arduinoを使ってタマゴ孵化自動プログラムを作ってみた

 マーシーです。

ポケモンをプレイしている人の大半が時間を費やしているタマゴ孵化について

某Arduino先生の力を使って,自動化しプレイ効率を上げていく話です。

プログラム自体は2年ほど前に作成して現在進行系で活用しているのですが,

今回はその”プログラムフローのまとめ”と

ずっと考えて手を付けていなかった”改善案の実装”について

簡単に書いていきます。


1.目的

2.準備するもの

3.作成したプログラム(Mark1)

    3.1 設計指針

    3.2 初期条件

    3.3 フローチャート

4.作成したプログラム(Mark2)

    4.1 設計指針

    4.2 初期条件

    4.3 フローチャート

5.プログラムの比較

6.まとめ

7.おまけ


1.目的

ポケモンSWSHにおいてタマゴ孵化作業を自動化する。

2.準備するもの

・H/W:NintendoSwitch本体
・S/W:ポケモンSWSH
 *メタモン(6V),孵化要員(ほのおのからだなど),まるいおまもりを
  揃えておくことを推奨
・Arduino環境(S/W,H/W)
 *詳細はこちら

*かわらずのいしやあかいいと,夢特性,オシャボ,タマゴわざなどの
遺伝条件の基礎は解説しませんので各自勉強してください。

3.作成したプログラム(Mark1)

まずは2年ぐらい程前に作成し,最近までブラッシュアップを続けてきたプログラムについて簡単に記載します。

9世代でも同じようなプログラムを作成すると思うので,
今のうちにSWSH仕様をまとめておきます。

3.1 設計指針

・ポケモンSWSHでタマゴ孵化を自動化する。
・ポケモンは①5体受け取り→②孵化→③ボックス格納を繰り返す
・孵化作業を継続するボックス数は設定値とする。表3.1.1にタマゴ孵化に関連する設定パラメータを,表3.1.2にポケモン種族ごとの走行パラメータ参考値をそれぞれ示す。

表3.1.1 タマゴ孵化パラメータ
No.Parameter概要Default
1EggNumタマゴの受け取り回数最大値5
*孵化要員以外の
 手持ちの数
2PokeNum孵化作業1サイクルの
繰り返し回数
6
*6サイクルでEggNumと
 掛け合わせ最大30
3BoxNum一度のシーケンスで孵化作業を
継続するボックス設定値
1〜
*1ボックス分孵化
4Run8Numタマゴ受け取りまでの8の字
走行回数(下記動画参照)
ポケモン種族の
サイクル数ごとに設定
*表3.1.2参照
5RunNum左右走行の往復回数ポケモン種族の
孵化歩数ごとに設定
*表3.1.2参照
6RunToR1回分の右方向への走行回数6
7RunToL1回分の左方向への走行回数6
8
9
10

表3.1.2 走行系のパラメーター参考値
No.ポケモンタマゴ歩数
最大値
サイクル数Run8NumRunNum
1ドラメシヤ107934039
2プテラ95083029
3クリムガン82233029
4ゾウドウ69382528
5ヒバニー56532527
6デンヂムシ43681526
7モルペコ30831025
8グレッグル25601014
9コイキング1280513
10

・8の字走行の参考動画
 *単純な走行でも構わないが,「現在のArduinoのシーケンスがどのあたりか?」を視覚的に判別しやすくするために”8の字走行”を導入した。

・その他

3.2 初期条件

・5番道路で自転車に乗っていること
・手持ちは孵化要員(ほのおのからだなど)を1体にしておく
・タマゴ孵化するポケモンを預けた状態で,
 預け屋さんが腕を組んでいる状態にしておく
・1ボックス以上のからボックスを用意し,
 "X"→”ポケモン選択”→"L"のボタン操作にて
 対象ボックスに移動すること
・メニュー配置,設定は下記をデフォルトとする(図3.2.1)。

図3.2.1 メニュー配置の初期設定

・その他
→"まるいおまもり”を所持していることを前提としてい点に注意。
→対象ポケモンを預ける作業,持ち物を変える作業は手動での操作になります。
→自分が見落としている初期条件があるかもなので注意してください。

3.3 フローチャート

図3.3.1にMark1のプログラムの全体フローチャートを示す。

[設計メモ]
・自転車走行中にNCPになるべく接触しないようにする
 特に野生ポケモン(ヌイコグマやチラーミィ)にエンカウントすると
 プログラムのフローが機能しなくなるため注意。

図3.3.1 タマゴ孵化フローチャート(Mark1)

*1 
プログラムとしては”タウンマップ”にカーソルが合っていることが必要だが,
”ポケモン”からボックスへアクセスした後に作業を再開することが多いため,
”ポケモン”→”タウンマップ”にカーソルを変更するフローを追加している。

*2
図3.3.2にそらをとぶフローの補足を示す。該当フローでの移動前後の位置は図のとおり。
図3.3.2 そらをとぶフロー補足

*3
タマゴを受け取る際に,タマゴができている/できていない状態の両方に対応できるようにプログラミンする必要あり

*4
*2のそらをとぶ操作をした後,①自転車から降りて数歩下へ→②右を向く→③再度自転車に乗る操作を行うことで,5番道路の中心から往復走行ができる。
”タマゴ孵化走行フロー”途中にRestartを挿むことで,5番道路の上下に走行が偏り,NCPや野生ポケモンとのエンカウントを減らすことができる。

*5
RunToR,RunToLの設定値だけ,①1.49秒右スティック→②Bボタン押下を繰り返す。
自転車のチャージが溜まっており,タイミングが合えばターボ走行が可能となる。

*6
図3.3.3にボックスへのタマゴ格納(Mark1)を示す。For文の変数値を参照し,ボックスへの預け方を変更させる。

図3.3.3 ボックスへのタマゴ格納(Mark1)

4.作成したプログラム(Mark2)

3章に示したプログラムは大まかに以下のようなフローで動作している。
①5匹ワンセットとしてポケモンを受け取り
②孵化走行
③ボックス預け

改善項目としては以下が挙げられる。
[課題]
・①のフェーズにてタマゴを受け取ったまま,再度8の字走行でタマゴを受け取ろうとするため,タマゴ1匹目と5匹目では孵化歩数に大きな差異が生じる。
・②のフェースでスティック操作+Bボタンを繰り返す必要がある。
[改善箇所]
・自転車のターボ走行の使用効率が悪い
・タマゴ孵化にムラがあるため,Bボタン押下のタイミングが合わないとロスタイムが多くなる。

<20220828追記>
さらに孵化効率を改善したMark2改を作成する。
Mark2の弱点として,「タマゴを受け取るたびにボックスへアクセスし,格納する」を4回繰り返す。このフローに時間がかかっている。
そこで,「手持ちがMAX時に受け取ったタマゴを自動でボックスへ機能」を使い,更なる効率化を図る。

4.1 設計指針

3章に示したプログラムを一部改修する(3.1との差異を表記)。
・タマゴ受け取り後,一度ボックスに預ける
・5匹分受け取った後に走行フローを行う。
・図4.1.1にタマゴ孵化走行フロー(Mark2)のコンセプトを,表4.1.1に走行1〜4の設計指針をそれぞれ示す。走行フローでは,①初期位置までの走行→②自転車のターボ走行→③微調整フェーズ→④連続孵化フェーズの4段階を設けることで孵化走行の効率を向上させる。

図4.1.1 タマゴ孵化走行フロー(Mark2)のコンセプト

表4.1.1 走行1〜4の設計指針
走行概要走行方法変数
走行1初期位置走行タマゴ受け取り人の前からターフタウン直前の
橋まで走行する(外乱に当たらないように注意)。
-
走行2ターボ走行孵化歩数を稼ぐメイン走行(片道走行=1カウント)。
B押下と4.5秒スティック押下を繰り返す。
st_run2
(設定値)
走行3調整走行走行2終了後,5番道路の端から,「おや...?」が
表示するまで走行する。
st_run3
(設定値)
走行4孵化走行B押下と0.5秒スティック押下を繰り返す。
ターフタウンへ走行する際はターフタウンに入らない
ように注意する。
st_run4
(固定値)


・図4.1.2にタマゴの受け取りシーケンスを,図4.1.3ボックスへ格納シーケンスをそれぞれ示す。Mark2ではMark1からの効率化を図り,”はんい選択”の使用など操作方法を変更する。
図4.1.2 タマゴの受け取りシーケンス

図4.1.3 ボックスへの格納シーケンス

<20220828追記>
Mark2改では「タマゴの受け取りシーケンス」と「ボックスへの格納シーケンス」を変更する。
・図4.1.2aにMark2改における「タマゴの受け取りシーケンス」を示す。
手持ちの先頭を「タマゴ孵化要員」,その他を「タマゴ以外のポケモンで5体」で手持ちをMAXとする。
→初期設定したボックスを特定の配置とすることで,タマゴ5こが縦並びに自動で送られるようにする。

図4.1.2a タマゴの受け取りシーケンス(Mark2改)

・図4.1.3aにMark2改における「ボックスへのシーケンス」を示す。
→タマゴを手持ちに入れるときは,べんり操作にて手持ちのポケモンとタマゴをワン悪性で入れ替える。タマゴが5こできていない場合,手持ち側に空白ができ自動的に詰められるため,手持ちの6体目から2体目の順にて入れ替えを行う。入れ替え後,タマゴを格納するボックスへと移動させる。
→孵化したタマゴをボックスに入れるときはMark2と同様にはんい選択で一括で格納する。
その後,初期設定ボックスに移動し,タマゴと入れ替えた手持ち5体をもう一度手持ちに入れる。

図4.1.3 ボックスへの格納シーケンス


・表4.1.2に3章からの変更するパラメータ一覧を示す(赤字は表3.1.1からの変更点)

表4.1.2 タマゴ孵化パラメータ
No.Parameter概要Default
1EggNumタマゴの受け取り回数最大値5
*孵化要員以外の
 手持ちの数
2PokeNum孵化作業1サイクルの
繰り返し回数
6
*6サイクルでEggNumと
 掛け合わせ最大30
3BoxNum一度のシーケンスで孵化作業を
継続するボックス設定値
1〜
*1ボックス分孵化
4Run8Numタマゴ受け取りまでの8の字
走行回数(下記動画参照)
ポケモン種族の
サイクル数ごとに設定
*表4.1.3参照
5RunNum左右走行の往復回数ポケモン種族の
孵化歩数ごとに設定
*下表参照
6RunToR1回分の右方向への走行回数6 3
7RunToL1回分の左方向への走行回数6 3
8st_run2表4.1.1の走行2の回数ポケモン種族の
孵化歩数ごとに設定
*表4.1.3参照
9st_run3表4.1.1の走行3の走行秒数ポケモン種族の
孵化歩数ごとに設定
*表4.1.3参照
10st_run4表4.1.1の走行4の繰り返し回数固定値125
*調整あり


表3.1.2 走行系のパラメーター参考値
No.ポケモンタマゴ歩数
最大値
サイクル
Run8Numst_run2st_run3
1ドラメシヤ10793403418
2プテラ950830247
3クリムガン8223302311
4ゾウドウ693825232
5ヒバニー565325223
6デンヂムシ4368152118
7モルペコ3083102110
8グレッグル2560102022
9コイキング128052011
10


4.2 初期条件

3.2と同じ

<Mark2改の場合>
・手持ちの先頭を”孵化要員”,残り5枠をタマゴ以外のポケモンを配置し,6体MAXとする。
・初期ボックスを特定の配置にする(図4.1.2a)。


4.3 フローチャート

図4.3.1にMark2のプログラムの全体フローチャートを,図4.3.1にタマゴ孵化走行フローのフローチャートをそれぞれ示す。図4.3.1の赤文字部分は図3.3.1からの差分箇所
図4.3.1 タマゴ孵化フローチャート(Mark2)


図4.3.2 走行フロー(Mark2)
*1
iが偶数か奇数かで「ターフタウン→バウタウン側へ走行」と
「バウタウン→ターフタウン側へ走行」を切り分ける

*2
st_run2が偶数か奇数かで「ターフタウン→バウタウン側へ走行」と
「バウタウン→ターフタウン側へ走行」を切り分ける

5.プログラムの比較

表5.1にプログラムごとのシーケンスサイクル比較を示す。3章の旧プログラム(Mark1)と4章の新プログラム(Mark2)で”タマゴ5コ受け取り→孵化→ボックス格納”までの1サイクルのシーケンス時間を測定し,その差を比較した結果です。
<Mark2改の結果を追記>

表5.1 プログラムごとのシーケンスサイクル比較
No.ポケモンタマゴ歩数
最大値
①消費時間
(Mark1)
[秒]
②消費時間
(Mark2)
[秒]
差分時間
②-①
[秒]
③消費時間
(Mark2改)
[秒]
差分時間
③-①
[秒]
1ドラメシヤ10793539
(8分58秒)
499
(8分18秒)
40
(0分40秒)
457
(7分37秒)
82
(1分22秒)
2プテラ9508515
(8分35秒)
462
(7分42秒)
53
(0分53秒)
3クリムガン8223515
(8分35秒)
440
(7分20秒)
75
(1分15秒)
406
(6分46秒)
109
(1分49秒)
4ゾウドウ6938481
(8分01秒)
430
(7分10秒)
51
(0分51秒)
390
(6分30秒)
91
(1分31秒)
5ヒバニー5653449
(7分29秒)
401
(6分41秒)
48
(0分48秒)
364
(6分04秒)
85
(1分25秒)
6デンヂムシ4368415
(6分55秒)
390
(6分30秒)
25
(0分25秒)
359
(5分59秒)
56
(0分56秒)
7モルペコ3083382
(6分22秒)
385
(6分25秒)
-3
(0分3秒)
345
(5分45秒)
37
(0分37秒)
8グレッグル2560325
(5分25秒)
363
(6分03秒)
-38
(0分25秒)
325
(5分25秒)
0
(0分0秒)
9コイキング1280290
(4分50秒)
355
(5分55秒)
-65
(1分5秒)
10
一部しか比較できていませんが,全体的に40秒以上シーケンス時間を短縮できていそうです。

<Mark1>
[メリット]
・孵化歩数ごとのパラメータ設定が簡単
[デメリット]
・ロスタイムが大きいパターンがある
・ボックス操作に余分な動作が多い
[その他]
・最大歩数2560,1280の種族についてはMark1プログラムのほうが圧倒的に早いが,タマゴを受け取るシーケンスの走行が長いと,タマゴを5こ受け取る前に最初に受け取ったタマゴが孵化する。
そのため,Max5コのタマゴ受け取ることが難しいデメリットが有る

<Mark2>
[メリット]
・全体的にシーケンス時間を短縮できる
・ボックス操作がシンプルとなった
・孵化歩数が多い種族ほど,シーケンス時間の短縮効果が大きい
[デメリット]
・パラメータ調整が若干手間
(一度パラメータ設定確定してしまえばおわりですが,,,)
・Mark1では8の字走行時もタマゴ孵化歩数がカウントされていたため,孵化歩数が少ない種族に関してはタマゴ孵化走行におけるシーケンス時間の短縮効果は少ない

Mark2はまだまだ改善の余地があるので,
せめて表5.1の3083ラインはMark1よりシーケンス時間を縮めたいとこです。

<Mark2改>
[メリット]
・Mark2の弱点であったタマゴ預け屋からタマゴを受け取るシーケンスを大幅に短縮
・タマゴ歩数が少ない種族値でもシーケンス時間の短縮が見込めるようにあった
・目的のタマゴを作成するためのポケモン(オシャボ要員,タマゴ技遺伝要員,夢特性要員など)を手持ちMAXにするために使用することで,ボックスの使用率を改善した。
[デメリット]
・初期セットアップがやや複雑となった(手持ちをMAXにする,特定の配置をしたボックスに合わせておく)。


6.まとめ

SWSH環境におけるタマゴ自動孵化プログラムについてまとめてみました。
9世代でも同様のプログラムを作ると思うのでノウハウ的なものを残しておきます。

(最近はArduinoでひたすらオシャボフル遺伝を作りまくってます。)


7.おまけ

Arduino基板をむき出しの状態で使っていたので,レゴで簡単なスタックボックスを作ってみました。


[参考]


コメント

このブログの人気の投稿

【ポケモンGO】愛知県名古屋市・鶴舞公園の歩き方

【ポケモンGO】種族値,実数値,CPを計算してみた話(おまけで全ポケモン種族値リスト)

【ポケモンMATLABダメ計】ダメージ補正リスト

【ポケモン】MATLABでダメージ計算ツールを作成するお話

【ポケモンBDSP】固定シンボル色違い自動厳選プログラムのデバッグ