※本記事は、ポケモン剣盾のカレーの証について、キャンプでカレーを作り、やってきたポケモンに話しかけてゲットする操作を自動化するプログラムについて解説した03回目の記事より、プログラムの改良、再公開を行う記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。
1年以上前に作成した旧カレー厳選自動化を使用する機会がありましたので、改良を施しました。
・カレー作成の火おこし、かきまぜ作業を最適化し、投入する具材次第でリザードン級のカレーを作ることができるようになりました。
・カレー作りの操作と野生ポケモンゲットの操作を分割して記述し、目的ごと(野生ポケモンゲットorなつき度上げ)に合わせて野生ポケモンゲットの操作を省略しやすくしました。
本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。
きっかけ、動機
1年以上前に、旧カレー厳選自動化を行いました。カレーの証持ちの野生ポケモンを捕獲するのが目的であり、当時は真作色証ヤバチャを入手する最も確率の高い方法でした(現在は乱数調整が解明されたので、乱数の及んでいないカレーがある意味1番レアなヤバチャかもしれません)。
今回は、なかよしリボンを付けるためのなつき度上げにカレー作りを使用しました。当時に比べてカレー作りに関する情報が充実しており、リザードン級を1人でも出せることを初めて知ったため、効率を上げるために改良することとしました。
これで何ができるの?
ポケモン剣盾本編のフィールド(道路、洞窟等。ワイルドエリア不可)でキャンプを開いた状態から、カレーを作る>広場にいるポケモンに話しかける を繰り返すプログラムを改良しました。ストーリー自動化に用いたスティック回しなどを流用したおかげで、1人でもリザードン級のカレーを作ることができるようになりました。1時間当たり6匹ほどの野生ポケモンを捕獲します。
ついでに、カレー作り部分とポケモンに話しかける部分のプログラムの記述を分割し、目的に応じて編集しやすくしました。野生ポケモンは必要なく、懐かせるために特化したい場合などは話しかけるパートを削除することで効率化できます。原理、おおまかな流れ
概要
旧カレー厳選自動化をベースとしておりますので、内容は概ね同じです。当時は不明だった内容を以下で補足していきます。
本プログラムでは、カレーを作る>広場にいるポケモンに話しかける を繰り返しております。
カレー作り
キャンプを開いた後、ポケモンとふれあえる広場の画面からカレー作りを開始します。
カレーの完成度については、ポケモンWiki様の「カレーライス」のページに詳しく書かれていることから参考にさせていただきました。
ざっくり説明すると、
・食材、きのみにはそれぞれポイントが設定されており、入れる食材ときのみで最大50pt、調理作業の上手さで最大29ptのポイントを合計した値からリザードン級、ダイオウドウ級などの完成度が決定する。
・5段階の完成度に応じて、もらえる経験値やなつき度、野生ポケモンがやってくる確率が変化する。野生ポケモンがやってくる確率はリザードン級25%、ダイオウドウ級20%、マホミル級15%のため、カレーの証厳選においては完成度が厳選効率に直結する。
・なつき度(なかよし度)の上昇はカレー作りに使用したきのみのポイントの半分の値が入る。現在のなかよし度に関係なく入るため、レベルアップのみでは上昇しなくなるなかよし度160~255でのなつき度上げにおいて効率が良い。
これらを踏まえて、以下で解説していきます。
入れる食材・きのみについて
入れる食材やきのみにはそれぞれポイントが設定されており、合計50ptを上限として加算されます。
今回の自動化では、カレー作りの操作で25pt以上が入るため、食材等のポイント50ptでリザードン級、30pt以上でダイオウドウ級のカレーを作ることができます。
・1ptのきのみ(クラボモモンオレン)はブラッシータウンで売っているため、上限いっぱいまで買うことをおすすめ
・店で買うことのできないキョダイパウダーは50ptのため、入れる木の実に関係なく上限に達する(店売りしておらず、レイドバトル、雪原ワットショップで入手可能)。
・ 店売り食材はそれぞれ2200円=24pt, 900円=18pt...と6pt刻みで異なる。店売りきのみとの組み合わせでは50ptに到達できない
以上のことから、
リザードン級
キョダイパウダー(50pt)+店売りきのみ1個
あるいは
2200円食材(24pt)+努力値下げきのみ以上(3pt)のレア度の木の実複数(3×9)
ダイオウドウ級
2200円食材(24pt)+店売りきのみ6個(6pt)
のいずれかの組み合わせをおすすめします。
キョダイパウダーの入手は雪原ワットショップ目玉商品購入の自動化の使用をおすすめします。
調理操作について
今回の自動化では、火おこしやかき混ぜの調理作業を改良しました。
火おこしで15pt(結構シビア), かきまぜで10pt(基準緩い?), まごころで4ptが上限として入るため、食材等で50pt加算すれば1人リザードン級も可能。
今回はとりあえず調理操作で25ptは確保できているかと思います。
広場での話しかけ
カレーを作り終えた後、広場の画面に戻ります。ここで、野生ポケモンがやってきた(「・・・」吹き出しが出ている)場合は話しかけることでゲットできます。野生ポケモンはそのエリアでランダムエンカウントするポケモンからランダムで出現します。
話しかける操作は、カメラを左右に移動させながらAボタンを連打しています。野生ポケモン出現の有無や場所はマイコン単体では確認できないため、手あたり次第の連打となります。
前回プログラムより動きを改良しましたが、体の小さい(当たり判定が小さい)ポケモンや足の遅いポケモン(やってくるまでに時間がかかる)(例:ユキハミ、カラナクシなど)だと、話しかけてボールにはいるまでがうまくいかないことがあります。確実に手に入れたい場合は、カレーを作り終えるごとに画面を目視確認することをおすすめします。
捕獲するボールについて
バッグにモンスターボールが入っている場合、カレーにつられてやってきたポケモンは必ずモンスターボールに入ります。
モンスターボールがない場合はスーパーボール、ハイパーボールの順に優先されてボールに入ります。その他のボールには入りません。
ハイパーボールに入れたい場合はモンスター、スーパーボールをすべて売りましょう。
使用するポケモンについて
やってきたポケモンに話しかけるにはカメラをポケモンに合わせる必要がありますが、画像認識をしていないのでカメラを横移動させて手当たり次第にAボタンを押します。この時、手持ちのポケモンに対してAボタンを押すと寄ってきます。近くにいると会話となりカメラ移動等ができないので、手持ちポケモンは体が小さく、足の遅いポケモンを推奨します。
動画中ではカラナクシ、カジリガメを使用しておりますが、最適解はユキハミのように思います。
なお、野生ポケモンがやってくる条件は、社交性というポケモンの隠しステータスの合計値が一定以上であることのようです。1匹当たりの上限255×6匹=1530のうち、1200を超えないとポケモンはやってこないようです。
手持ちポケモンが初めてカレーの証厳選をおこなう場合、社交性を上げるためにカレーを食べさせましょう。リザードン級なら1食で+20上昇のようです。この場合、野生ポケモンをゲットする操作を省略して構いません。
準備、必要なもの
本スケッチでは、特に以下の準備が必要となります。
初期条件は以下の通り
1. 設定より、捕まえたポケモンは自動でBOX送りにする
2. 必要な食材、きのみを大量に集める(下記を参考に高級食材購入や雪原ワットショップ自動化などの利用を推奨)。そしてそれぞれお気に入りにしてリスト1番上へ並び替え、木の実や食材のカーソルを1番上にしてバッグを閉じる
3. カレーにつられてやってくる野生ポケモンはモンスターボール>スーパー>ハイパーの優先度で捕まるため、モンスターボール以外で捕まえたい場合は優先度上位のボールをすべて売却しておく
4. 懐かせたいポケモンなど6匹を手持ちに入れる。カレーの証の野生ポケモンに話しかけやすくしたい場合、体が小さく足の遅いポケモンを推奨(ユキハミなど)。
5. 目的の野生ポケモンがいるエリア(本編道路等のみ、ワイルドエリアやDLCエリアは不可)に行き、キャンプを開く。草むらの外、万一ループが途切れて誤動作してもいいように、影響の少ない場所を選ぶ。
6. プログラム内の設定項目にて投入するきのみの個数を選択する。また、手持ちポケモンを懐かせるだけで野生ポケモンが必要ない場合、初めての使用で手持ちポケモンの社交性(野生ポケモンの呼び出しに関係する数値)が低い場合は、プログラム1番下のvoid loop内、checkWildPokemonをコメントアウト(//を頭につける)ことで、野生ポケモンに話しかける機能を省略可能
7. 以上を設定したうえでマイコンに書き込み、Switchに挿して自動化開始。自動では野生ポケモンを捕まえられないことがあるため、目視でも確認することを推奨
作成したスケッチ
作成したスケッチはこちら
本スケッチを実際に使用した動画はこちら↓。
* ポケモン剣盾のキャンプにて、大量に購入した食材と木の実を使用してカレー作りを自動化。
* カレー作る>調理開始>リザードン級>フィールド上のポケモン(やってきたやつ)に話しかける>以下ループ
* カレーを作った後、キャンプ内を自動で見まわし、やってきたカレーの証持ちのポケモンに自動で話しかけて捕獲する
* 野生ポケモンが小さかったり、手持ちポケモンが密集していたりすると話しかけられないことがある(改善の余地あり)ため、動作中は目視で確認することをおすすめ。
*
* 以前に作ったカレー作り自動化を改良し、1人調理でリザードン級のカレーに対応および木の実個数の指定を可能なように修正
* また、カレー作りとポケモン話しかけを分割し、目的ごとに話しかけ部分を削除等可能なように修正したため、なかよしリボン目的で懐かせるためにも使用可能
*
* リザードン級を作るために必要な食材は、以下の設定項目にて記載(ポケモンWikiあたりに詳しく書かれています)
*
* 初期条件は以下の通り
* 1. 設定より、捕まえたポケモンは自動でBOX送りにする
* 2. 必要な食材、きのみを大量に集める(下記を参考に高級食材購入や雪原ワットショップ自動化などの利用を推奨)。
* そしてそれぞれお気に入りにしてリスト1番上へ並び替え、木の実や食材のカーソルを1番上にしてバッグを閉じる
* 3. カレーにつられてやってくる野生ポケモンはモンスターボール>スーパー>ハイパーの優先度で捕まるため、モンスターボール以外で捕まえたい場合は優先度上位のボールをすべて売却しておく
* 4. 懐かせたいポケモンなど6匹を手持ちに入れる。カレーの証の野生ポケモンに話しかけやすくしたい場合、体が小さく足の遅いポケモンを推奨(ユキハミなど)。
* 5. 目的の野生ポケモンがいるエリア(本編道路等のみ、ワイルドエリアやDLCエリアは不可)に行き、キャンプを開く
* 草むらの外、万一ループが途切れて誤動作してもいいように、影響の少ない場所を選ぶ。
* 6. 以下プログラム内の設定項目にて投入するきのみの個数を選択する。
* また、手持ちポケモンを懐かせるだけで野生ポケモンが必要ない場合、初めての使用で手持ちポケモンの社交性(野生ポケモンの呼び出しに関係する数値)が低い場合は、
* プログラム1番下のvoid loop内、checkWildPokemonをコメントアウト(//を頭につける)ことで、野生ポケモンに話しかける機能を省略可能
* 7. 以上を設定したうえでマイコンに書き込み、Switchに挿して自動化開始。
* 自動では野生ポケモンを捕まえられないことがあるため、目視でも確認することを推奨
*
*/
#include <auto_command_util.h>
/*
* リザードン級に必要な食材について(詳しくはポケモンWikiの「カレーライス」を参照)
* カレー作りに使用する食材、きのみにはそれぞれポイントが設定されており、投入食材、きのみと調理で加算される合計ポイントでおいしさが5段階評価される。
* リザードン級は完成ポイント75以上(野生ポケモン出現25%)、ダイオウドウ級は55(20%)、マホミル級は30(15%)
*
* 投入食材ときのみで得られるポイントは50が上限である。また、本自動化での調理により25以上(上限29?)が入手できる。
* したがって、リザードン級にしたい場合は食材などで50ポイント、ダイオウドウ級の場合は30ポイントを目安に投入する必要あり
*
* 組み合わせ例は以下の通り
* ★5リザードン級
* ・巨大パウダー(50pt、レイド報酬or雪原ワットショップ)+適当な木の実1個(既に上限のためなんでも良し、ブラッシータウンでクラボのみ等購入可能)
* ・2200円食材(24pt)+努力値下げ木の実9個以上(3pt×9=27, ザロクなどを木の実集め自動化にて)orスターのみ1個orサンのみ2個(30pt, 雪原ワットショップ)
*
* ★4ダイオウドウ級
* ・2200円食材+購入可能クラボのみ等6個以上(24+6=30pt)
*/
//----------以下、設定項目----------
// カレーに使用する木の実(リスト1番上)の使用個数を設定
// 1~10個の範囲で設定
const int how_many_berrys = 1;
// その他、カレー調理がずれる場合は、「cookCurry」内のdelay箇所を調整
//----------設定項目おわり----------
// ラテラルタウンのジムチャレンジ、乗り物をRスティック回転でまわずための関数をカレーかき混ぜに流用
// 「1秒あたりの回転数(round/sec)*10」、「回転させる時間(ミリ秒)」、「回転方向(時計回りなら1/反時計なら-1)」をそれぞれ指定する
// ~(50, 3000, -1);の場合、反時計回りに5.0 round/secを3秒間(3秒で15回転)行う
// 回転数は100を割り切れる数でない場合はずれるため注意
// 開店時間のうち1周に満たない端数は切り捨てる
void guruGuru(int drps, int msec, int direc){
// 残り時間
int jikan = msec;
// 1回転あたりにかかる時間(ms)/10(cs)
int cspr = 1000/drps;
// 残り時間が1回転当たりの時間を上回る限り、1回転ずつ時間を消費する
while(jikan >= cspr*10){
// 1回転を10分割して入力する
SwitchController().setStickTiltRatio(0, 0, 0, -100);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, 59 * direc, -81);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, 95 * direc, -31);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, 95 * direc, 31);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, 59 * direc, 81);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, 0, 100);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, -59 * direc, 81);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, -95 * direc, 31);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, -95 * direc, -31);
delay(cspr);
SwitchController().setStickTiltRatio(0, 0, -59 * direc, -81);
delay(cspr);
jikan = jikan - cspr *10;
}
}
// 料理をするシーケンス
void cookCurry(){
//料理開始
pushButton(Button::X, 300);
pushHatButtonContinuous(Hat::LEFT, 1400);
delay(200);
pushHatButton(Hat::RIGHT, 200);
pushButton(Button::A, 500);
pushButton(Button::A, 1900);
// 具財を選択
pushButton(Button::A, 500, 4);
// きのみを選択
pushButton(Button::A, 300);
// 上記設定項目にて指定した個数を選択、1~6個の場合は上入力、7~10の場合は下入力
if(how_many_berrys <7){
pushHatButton(Hat::UP, 200, how_many_berrys - 1);
}else{
pushHatButton(Hat::DOWN, 200, 11 - how_many_berrys);
}
pushButton(Button::A, 1300);
// 9個以下の場合は準備OK(10この場合はなくても良い)
pushButton(Button::PLUS, 300);
//料理開始
pushButton(Button::A, 500);
// うちわであおぐところまで待機、入れる木の実の個数による時間差を考慮
delay(6500 + how_many_berrys *50);
for(int i=0; i<150; i++){
SwitchController().pressButton(Button::A);
delay(50);
SwitchController().releaseButton(Button::A);
SwitchController().pressButton(Button::ZR);
delay(50);
SwitchController().releaseButton(Button::ZR);
}
pushButton(Button::A, 400, 13);
// かきまぜ
for(int i=0; i<24; i++){
guruGuru(25, 1000, 1);
}
SwitchController().setStickTiltRatio(0, 0, 0, 0);
// まごころ、以下のdelayを調節
delay(2600);
pushButton(Button::A, 19400);
//完成~評価
pushButton(Button::A, 13000);
pushButton(Button::A, 2000);
}
// 料理後に野生ポケモンがきているかを確認
// 必要ない場合(社交性が低い場合、なつき度上げの効率を高めたい場合など)は、void loop内のcheckWildPokemonをコメントアウト
void checkWildPokemon(){
// カレー調理終了後、広場にいる野生ポケモンに話しかける
// 広場にて、Rスティックにて視点を右上へ
tiltJoystick(0, 0, 80, -80, 1000);
// Rスティック左へ、かつA連打
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(300);
SwitchController().setStickTiltRatio(0, 0, -50, 5);
pushButton(Button::A, 50,14);
// ポケモンと会話している場合は終了
// 野生ポケモンをキャンセルしないように下2回
pushButton(Button::A, 1000);
pushHatButton(Hat::DOWN, 200, 2);
// 左上へカメラ移動
SwitchController().setStickTiltRatio(0, 0, -90, -50);
pushButton(Button::A, 2000);
// Rスティック右へ、かつA連打
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(300);
SwitchController().setStickTiltRatio(0, 0, 50, 5);
pushButton(Button::A, 50,14);
// ポケモンと会話している場合は終了
// 野生ポケモンをキャンセルしないように下2回
pushButton(Button::A, 1000);
pushHatButton(Hat::DOWN, 200, 2);
// 右上へカメラ移動
SwitchController().setStickTiltRatio(0, 0, 90, -50);
pushButton(Button::A, 2000);
// Rスティック左へ、かつA連打
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(200);
SwitchController().setStickTiltRatio(0, 0, -50, 10);
pushButton(Button::A, 50,14);
// ポケモンと会話している場合は終了
// 野生ポケモンをキャンセルしないように下2回
pushButton(Button::A, 1000);
pushHatButton(Hat::DOWN, 200, 2);
// 左上へカメラ移動
SwitchController().setStickTiltRatio(0, 0, -90, -50);
pushButton(Button::A, 2000);
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(200);
// Rスティック右上へ、かつA連打
SwitchController().setStickTiltRatio(0, 0, 50, 10);
pushButton(Button::A, 50,14);
// ポケモンと会話している場合は終了
// 野生ポケモンをキャンセルしないように下2回
pushButton(Button::A, 1000);
pushHatButton(Hat::DOWN, 200, 2);
pushButton(Button::A, 100);
// 右上へカメラ移動
SwitchController().setStickTiltRatio(0, 0, 90, -50);
pushButton(Button::A, 2000);
// カメラ下げ
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(300);
// カメラ向き変更、繰り返し
SwitchController().setStickTiltRatio(0, 0, -50, 0);
pushButton(Button::A, 50,25);
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(150);
SwitchController().setStickTiltRatio(0, 0, 50, 0);
pushButton(Button::A, 50,25);
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(150);
SwitchController().setStickTiltRatio(0, 0, -50, 0);
pushButton(Button::A, 50,25);
SwitchController().setStickTiltRatio(0, 0, 0, 50);
delay(150);
SwitchController().setStickTiltRatio(0, 0, 50, 0);
pushButton(Button::A, 50,15);
// 会話を終了
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::B, 300, 7);
pushButton(Button::X, 1000);
pushButton(Button::B, 500);
pushButton(Button::X, 1000);
pushButton(Button::B, 500);
pushHatButtonContinuous(Hat::DOWN, 1000);
}
// キャンプ広場スタート
void setup(){
pushButton(Button::B, 500, 13); // 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
// キャンプを閉じないようにする
pushButton(Button::X, 500);
pushButton(Button::B, 500);
}
void loop(){
cookCurry();
// カレー調理後に野生ポケモン出現を確認しなくていい場合は以下のcheckWildPokemonをコメントアウトする
checkWildPokemon();
}
最後に
本スケッチを使用することで、カレーの証持ちのポケモンをゲットするためのキャンプでのカレー作りを自動化することができます。以前のプログラムを改良することで、カレー証厳選もなつき度上げも効率的になりました。
カレーの証色違い、結局のところ前回作成時からほとんどプログラムを使用しておらず、ゲットできていません。この機会にでてくればいいな~と思いつつ、やはり出現25%×色違い1/4096はなかなかに際どい確率です。1時間で6匹のため、1か月動かし続けて1匹くらいでしょうか。
今回のプログラムでは、やってきたポケモンに話しかける操作でうまく話しかけられない場合が存在しています。 より効率的、確実に話しかける方法がありましたら教えていただけますと幸いです。
その他にもプログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。
Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】 | ||||
|
0 件のコメント:
コメントを投稿