※本記事は、ポケモン剣盾:冠の雪原の巨人伝説の遺跡に出現するレジロック、レジアイス、レジスチルについて、色違いが出現するまでのリセマラ(逃げマラ?)を自動化するプログラムについて解説した記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。
2021.05.19追記 光るエフェクトの時間差で色違いを判定する、同じような動作で厳選している先駆者様が2020.11月段階でおります(Arduino UNO)。てっきり画像認識で判定しているものと勘違いしており、記事等をスルーしておりました。
こちらの方が無駄な動作が多く、劣化パクリみたいになっている気はしますが、Leonardo用に移植ということでご容赦願います。本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。
きっかけ、動機
ポケモン剣盾DLC第2弾冠の雪原において、レジギガスを除くレジ系はすべて遺跡の床を踏んで光らせることで固定シンボルとして出現し、色違いも存在します(他の多くの伝説は大マックスアドベンチャーなので面倒)。色違い厳選において、床を光らせる作業を繰り返すのが面倒になったので自動化を試みました。
また、色違いの出現の判定を「人間による目視」や「画像認識による判定」なしにマイコンのみで完結させる方法を思いついたので試してみました。
これで何ができるの?
今回は床を踏み分ける必要のないレジロック、レジアイス、レジスチル(以下、レジ3種)について、床の丸をすべて踏む>シンボルエンカウント>逃げるを繰り返すことにしました。これにより、床を踏んでから戦闘、色違いでなければ逃げるという動作を自動化できます。
またこれらのレジ系は、捕獲しない限り、つまりは戦闘で倒すか逃げるかしている限りは再び出現させることができます。つまりセーブしないでリセットをする必要がなく、戦闘化に逃げた後は再び床を踏むループを繰り返すことができます。
ここで問題となるのは、出現したレジ系が色違いであった場合に「逃げる」を押してしまうとループさせる努力が無駄になるという点です。そこで、色違いが出現したときのエフェクトによる時間差を利用して、色違いが出現したときにループが途切れる、つまり色違いが出現したときは「逃げる」を押さないように工夫しました。これにより、準備をしたうえでマイコンを挿すだけで色違いの出現まで人力の作業をする必要がなくなります。
原理、おおまかな流れ
概要
本プログラムでは、レジ3種について、床の丸をすべて踏む>シンボルエンカウント>逃げるを繰り返すことにしました。戦闘で色違いが出現した場合にループが途切れるようにしました。以下では、移動パート(非戦闘時)と戦闘パート(戦闘時)、加えて待機パート(色違い出現時のみ分岐)の2つに分けて説明します。
移動パート
移動パートでは、以下の図のように動きます。図の四角は遺跡の部屋を表しています。
左上に進み続けて止まったところ(左上角の赤丸)を初期位置とします。レジ3種の床の丸の位置について、形は異なりますが、横の列としてみた場合に3列すべて共通の位置となりますので、同じプログラムを流用できます。青矢印のように動き、床の丸をすべて踏みます。
床の丸をすべて踏んだ場合、ニブニブニブと 揺れてテキストが表示されます。その後、壁づたいに石像(上中央の赤丸)に話しかけると、戦闘が開始します。戦闘中~逃げる動作は後述します。
先頭から逃げた後は、水色矢印のように動きます。 部屋を一度出ることで、万一うまく床を踏めていなかった場合の床の光をリセットします。その後再び入り、壁づたいに進むことで初期位置に戻ります。あとは最初から順に動作を繰り返します。
戦闘パート
戦闘パートでは、基本的には「たたかう」「ポケモン」「バッグ」「にげる」の選択画面で「にげる」を選択して戦闘を終了します。
「にげる」を選択する操作は簡単です。「たたかう」などのコマンド画面で、
1. 十字ボタン上↑を1回押し、カーソルを「たたかう」から「にげる」に動かす
2. Aボタンを押す(うまくにげきれた!)
これだけです。
問題は、「色違いが出たときに逃げるを押してはならない」ということです。
Q. 戦闘時における、色違いと通常色とでカラーリング以外に異なる点は何でしょうか?
A. 色違いの出現時に「キランッ」と光るエフェクトが入る点です。
この光るエフェクトによって通常色と比較して約2秒ほど演出が長くなり、つまりは「たたかう」コマンドが表示されるまでの時間が2秒ほど長くなります。 この約2秒間のあいだにボタン入力を入れることで、色違い出現時の操作を通常時と分岐させることができます。つまり、約2秒間のあいだに入力された十字ボタン上↑が反応せずに戦闘を開始させることができます。色違い出現時の分岐した行動を待機パートとし、引き続き説明します。
待機パート
色違いが出現した場合に、戦闘パートから分岐させることが可能となりました。分岐させた後には、ボールを投げて捕獲する必要があります。ただし、マスターボール以外のボールで捕獲できる確率は低く、画像認識等なしに全自動で捕獲するのは現実的でないと判断しました。
そこで必要となるのは、
人間が色違いの出現に気づくまで倒したり逃げたりしない
ということです。
ただし、マイコン自体は色違いの出現を判断できないので、移動パートと戦闘パートを繰り返します。その中で、左スティックやA、Bボタンの入力は必須となります。
Q. 戦闘時において、Bボタンを連打しても画面が切り替わらず、「たたかう」コマンド画面に移ることがない状況とは何でしょうか?
A. 戦闘ポケモンが瀕死になり、次のポケモンを選択する状況です。
手持ちポケモンの選択画面で唯一、先頭が瀕死した直後の状態ではBボタンを連打して画面をキャンセルすることができません。また、カーソルが瀕死ポケモン(一番上)にある場合はAボタンを連打しても選出できず、画面が切り替わりません。
つまり、戦闘ポケモンが瀕死になり、次のポケモンを選択する画面に移動することができれば、次のポケモンが選択されずにハマり続けるといった状況を作り出すことが可能となります。
このハマりが解消されないように上記の「戦闘パート」「移動パート」を調節しました。
誤動作への対策
上記の動作にあたり、以下の誤動作が考えられ、対策をしております。
・移動パートで、床をうまく踏むことができない
>床をうまく踏めなかった場合は、石像に話しかけても戦闘は開始されません。一部の床が光ったままになるので、一度部屋を出てから入りなおすことで床の光をリセットします。
準備、必要なもの
本スケッチでは、特に以下の準備が必要となります。
・自爆技(自分が瀕死になる技)を1番上の技に持つポケモン、先頭に置き、けむり玉をもたせる。また、なつき度を下げる。
(自爆技のうち、置き土産はクリアボディに効かないため不可。)
(なつき度が歩くとともに増えるため、レジ3種に使い続けると上がっている可能性あり。なつき度が上がるとモーションが増え、「たたかう」が表示されるまでの時間が増える。なつき度は漢方薬を与えることで減少。)
・その他に捕獲用のポケモンやボールを用意
・ゲームを起動してからマイコンを挿して開始する前に、遺跡の入り口を出入りして外のフィールドを見ておく。
(ゲーム起動から最初のマップの切り替わりでロード時間が長くなり、ずれる可能性があるため)
作成したスケッチ
作成したスケッチは以下のようになります。また、スケッチのファイルはこちらからDLできます。
なお、執筆者がスケッチを作成するにあたり使用した環境は以下のようになります。
・データは中国語(繫体字)のソード
・手持ち最初のポケモンはイエッサン♀(二つ名無し)、1番上の技はいやしのねがい
捕獲するレジ系の種類や、使用する言語やポケモン、あるいは本体などによって話しかけてから戦闘が始まるまでの時間が前後する可能性があります。
その場合はスケッチ赤字の15000を調節してください。通常色が出現したときに、「たたかう」コマンドがひょうじされてから2秒以内にカーソルが「逃げる」に動く(=十字上ボタンを入力する)ようにしてください。
本スケッチを実際に使用した動画はこちら↓
* レジロック、アイス、スチル色違い厳選のための周回、色違いが出たらそのままハマって停止
* レジ3種同様に可能(要微調整)
*
* 初期条件は以下の通り
* 1. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨、置き土産はクリアボディのため不可)、確実に逃げるためにけむり玉を持たせる
* また、なつき度は下げておく(歩いているうちに上がり、余計なモーションが増えるため)
* 2. その他、捕獲要因やボールを用意
* 3. フィールドの切り替わり初回のみロードが長いことがあるので、ソフト起動してから1回は遺跡入り口を出入り
* (遺跡外でセーブ推奨、その場合は遺跡に入るだけでOK)
* 4. レジ3種それぞれの遺跡、床は光らせずに部屋の左上へ
* 5. マイコンを挿して周回スタート、ソフトリセットした場合は3からやり直し
*/
#include <auto_command_util.h>
void regiBattle(){
// 話しかける前に、(色違いが出た時のハマりを継続するために)B連打から上長押しでカーソル1番上を選択
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
// 石像話しかけ~戦闘
pushButton(Button::A, 1000, 2);
// 下の時間は、使用する言語、ポケモン等で多少ずれる可能性があり、15000前後で要調整
// 色違いのエフェクトが約2秒のため、「たたかう」が表示されて2秒以内に次の十字上↑入力がされるようにする
pushButton(Button::A, 15000);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つめの上入力間に合わないため戦闘>自爆技で自分側瀕死
// Aボタンを2回以上連続して押す場合は、あらかじめ上長押しでカーソル1番上を選択
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 800);
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
pushButton(Button::A, 800,2);
pushButton(Button::B, 1000,5);
// 色でなければ戦闘終了、色ならば次のポケモン選択画面で待機
}
void regiSteelWalk(){
// 左上角に進み続けてぶつかる
tiltJoystick(-100, -100, 0, 0, 4500);
// 下移動、光る床上段へ
tiltJoystick(0, 100, 0, 0, 865);
// 右移動、光る床上段を光らせる
tiltJoystick(100, 0, 0, 0, 4000);
// 下移動、光る床中段へ
tiltJoystick(0, 100, 0, 0, 535);
// 左移動、光る床上段を光らせる
tiltJoystick(-100, 0, 0, 0, 4000);
// 下移動、光る床中段へ
tiltJoystick(0, 100, 0, 0, 535);
// 右移動、光る床上段を光らせる
tiltJoystick(100, 0, 0, 0, 4000);
// 石像光る、テキスト進める
pushButton(Button::B, 1000,4);
// 右壁に進み続けてぶつかる
tiltJoystick(100, 0, 0, 0, 2000);
// 右上角に進み続けてぶつかる
tiltJoystick(100, -100, 0, 0, 4500);
// 左上に進み続けて石像まで移動
tiltJoystick(-100, -100, 0, 0, 2000);
}
void regiReset(){
// 石像前から、一度外に出ることで床をリセットする
tiltJoystick(0, 100, 0, 0, 7000);
// 左上移動、光る床を踏まずに左上角へ
tiltJoystick(-100, -30, 0, 0, 2000);
}
void setup(){
pushButton(Button::B, 500, 13); // 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
}
void loop(){
regiSteelWalk();
regiBattle();
regiReset();
}
最後に
本スケッチを使用することで、レジ系3種の色違いを出現させるまでの作業を寝てる間などに可能となります(執筆者の場合、ロック、スチルは運よく1晩程度、アイスは運悪く4晩程度かかりました。)。床を踏んで光らせるといった作業も必要なくなります。色違いが出た場合、マイコンを外してプレイヤーが操作するまで待機し続けるため、好きなボールでの捕獲が可能です。
今回はレジ系3種についてスケッチを作成しましたが、少し改良することでレジエレキ、ドラゴについても同様に色違い厳選が可能となります。これらについては近日記事を作成するかと思います。レジエレキ、ドラゴ用スケッチ作成しました。また、レジギガスについては色違いの捕獲までを自動で行うことが可能なので、これについてもいずれUPします。
プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。
Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】 | ||||
|
このコメントは投稿者によって削除されました。
返信削除コメント失礼します
返信削除一度外に出るとすぐに戻らずに外に居続けてしまいます
なにか対策等ありまりましたら教えていただきたいです。
自己解決いたしました。void regiReset(){
返信削除// 石像前から、一度外に出ることで床をリセットする
tiltJoystick(0, 100, 0, 0, 7000);の値100を試しに200にしてみた結果一度も外に出ることなく床を踏むようになりました。
また、void regiReset(){
返信削除// 石像前から、一度外に出ることで床をリセットする
tiltJoystick(0, 100, 0, 0, 7000);の値7000を試しに8000に変えてみたところ外に出てから元の場所に戻るようになりました。
自動化プログラムを作ってくださりありがとうございます。
解決策のコメントありがとうございます。自己解決したようで良かったです。今後の参考にさせていただきます。
削除