【FRLG自動化05】ものひろい自動化【ふしぎなアメ・きんのたま】

こんにちは。ますたーです。

 

今回は、FRLG自動化の第5弾として特性「ものひろい」による道具集めを自動化しました。

(BDSPでの自動化はこちら:【BDSP自動化04】特性「ものひろい」自動化【ふしぎなアメ・ぎんのおうかん】

 

なお、Arduino Leonardo自動化の導入・機材構成については導入記事を参考にしてください。

導入記事:【Arduino自動化01】Arduino開発環境の導入

※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。

 

概要

今回は、野生ポケモンに出会うことができる「あまいかおり」によるエンカウント自動化を応用して、「ものひろい」を実現しました。「ふしぎなアメ」や「ポイントアップ」などの貴重な道具や、金策に使える「きんのたま」、わざ「めざめるパワー」を覚えられる「わざマシン10」、珍しい「きのみ」などを自動で収集できます

ポケモンタワーで戦闘回数を稼ぎ、ものひろいを発動させるのだ。
先頭がLv100なら1試行あたり約30秒で周回できるぞ

目次です。いつも通り雑談多めです。ソースコードが欲しい方は→6章まで読み飛ばす

 

1.FRLGで「ふしぎなアメ」「ポイントアップ」が欲しい!

ポケモンFRLGにおいて、ポケモンのレベルを上げる「ふしぎなアメ」や、わざのPPを上げる「ポイントアップ」は非常に重要なアイテムだと言えます。

これらのアイテムはフィールド上で拾える個数が決まっており、それぞれ10個程度しか入手することができません。特に「ふしぎなアメ」は、FRLGにおける個体値の判定や高レベルポケモンのレベル上げに使うため、大量に所持しておくことが望ましいです。

「ふしぎなアメ」はレベル上げや個体値ジャッジなどに使える。
大量に所持しておきたいアイテムの筆頭候補だ
「ふしぎなアメ」や「ポイントアップ」は、フィールドで拾うことができる。
しかしながら、それぞれ10個程度しか落ちていない上に、拾うと二度と復活しないのだ

 

フィールドで拾う以外の入手方法として、「ふしぎなアメ」はゴージャスリゾートにいるアキホの依頼の報酬で確率入手、「ポイントアップ」はハナダシティの民家で「きのみのこな」3000ptと交換で入手でき、それぞれ複数個の入手も可能です。しかしながら、これらは恒常的な入手手段としては非常に効率が悪いです。特に後者は2人以上でのマルチプレイが必須のため、シングルプレイでは事実上複数入手ができません。

そこで、効率的かつ恒常的な複数入手方法として、特性「ものひろい」が有力候補となります。なぜならば、戦闘終了後に10%という一定の確率で発動し、これらのアイテムもその入手ラインナップに含まれているからです。

特性「ものひろい」では、戦闘後に10%の確率で、
「ふしぎなアメ」や「ポイントアップ」などの道具を拾ってきてくれる
特性「ものひろい」では、どうぐ「ふしぎなアメ」「ポイントアップ」「きんのたま」の他、
わざマシン「めざめるパワー」や、珍しい「きのみ」等が拾えるのだ

 

2.特性「ものひろい」は、戦闘終了後に「10%」の確率で発動する

さて、前章で紹介した通り、特性「ものひろい」では、「ふしぎなアメ」や「ポイントアップ」などの貴重な道具を拾うことができます。肝心の発動確率は、戦闘終了毎に「10%」の確率です。例えば、7回戦闘を行えば、約5割の確率で何か道具を拾ってくれると言えます(式: p = 1 - (1-0.1)7 = 52.1%)。

ここで、「ものひろい」は、その特性を持つポケモン毎に発動しますから、「ものひろい」を持ったポケモンを手持ちに複数加えることで、より効率的になります

具体的には、手持ちに「ものひろい」が5匹いれば、わずか1回の戦闘で約4割の確率で道具を拾うことができます(式: p = 1 - (1-0.1)5 = 40.95%)。

つまり、「ものひろい」5匹で5回戦闘を行えば、約9割の確率で道具が拾えると計算できます(式: p = 1 - { (1-0.1)5 }5  = 1 - ( 0.59049 )5 = 92.82%)。

この関係を図示したものが下記です。

「ものひろい」の発動確率は1匹につき10%。5匹いれば41%だ。
つまり、「ものひろい」5匹で5回の戦闘を行えば92.8%の確率で道具を拾えるぞ

なお、手持ちポケモン6匹が全員「ものひろい」の場合は、もっと道具の入手効率が高くなります。しかし、FRLGには特性「ものひろい」と技「あまいかおり」を両立できるポケモンが存在しないため、本記事では割愛します。

※手持ち6匹が「ものひろい」の場合の道具入手確率については、BDSP版の記事(【BDSP自動化04】特性「ものひろい」自動化【ふしぎなアメ・ぎんのおうかん】)をご参考ください。

 

3.「ものひろい」で拾えるアイテムは「きのみ」が8割、「どうぐ」が2割

前章にて「手持ち5匹で5回」戦闘を行うことで、9割方の確率で何かしらの道具を拾うことができると計算しましたが、本章では、「ものひろい」で入手できるアイテムの種類と確率について紹介します。

まず、FRLGの「ものひろい」で入手できるアイテムは全16種類で、大きく「どうぐ(4種類)」と「きのみ(12種類)」に分けることができます。

そして、入手確率は「きのみ」が80%、「どうぐ」は20%となっているようです。「ふしぎなアメ」や「ポイントアップ」の入手確率はそれぞれ5%です。

【FRLG「ものひろい」で拾えるアイテムの入手確率(全16種)】

  • どうぐ(入手確率:20%)
    • 5%:わざマシン10(めざめるパワー)
    • 5%:きんのたま
    • 5%:ポイントアップ
    • 5%:ふしぎなアメ
  • きのみ(入手確率:80%)
    • 10%:クラボのみ
    • 10%:カゴのみ
    • 10%:モモンのみ
    • 10%:チーゴのみ
    • 10%:ナナシのみ
    • 15%:オレンのみ
    • 10%:キーのみ
    • 1%:ノワキのみ
    • 1%:ドリのみ
    • 1%:シーヤのみ
    • 1%:ベリブのみ
    • 1%:カイスのみ

これらを円グラフにまとめたものが下図です。

特性「ものひろい」で拾えるアイテムの一覧。内訳は、どうぐが20%、きのみが80%だ。
どうぐは、「わざマシン10」「きんのたま」「ポイントアップ」「ふしぎなアメ」の4種類だぞ
確率の出典:ものひろいで拾うアイテム一覧 - ポケモンWiki

ちなみに、FRLG時代の「ものひろい」で拾える「どうぐ」4種類はいずれも入手手段が限られている貴重なアイテムです。

「わざマシン10(めざめるパワー)」は「ものひろい」が唯一の入手手段ですし、「ふしぎなアメ」や「ポイントアップ」についても、1人プレイにおける現実的な量産手段です。そして、「きんのたま」は【FRLG自動化01】ゴールデンボールブリッジきんのたま回収【序盤金策】でも紹介している通り、シリーズを通しての金策アイテムです。

まさに粒ぞろいですね。

「わざマシン10(めざめるパワー)」は「ものひろい」がFRLGでの唯一の入手方法なのだ

ちなみに、お気づきの方もいらっしゃるかもしれませんが、ポケモンFRLGにおける「ものひろい」は、エメラルド以降の作品と異なり、ポケモンのレベルによって拾える道具が変わりません

言い換えると、「ものひろい」を持つポケモンのレベルを100まで上げる必要がない、ということです。

すなわち、「ものひろい」を持つ野生ポケモンを捕まえるだけで下準備が完了します。次章では、おすすめの「ものひろい」要員を紹介します。

 

4.「ものひろい」要員は野生のニャースを5匹捕まえるだけでOK

さて、2章にて「ものひろい」の発動確率、3章にて「ものひろい」で入手できるアイテムの種類について紹介しました。本章では、おすすめの「ものひろい」要員について紹介します。

結論から言うと、FRLGにおける「ものひろい」要員として、おすすめのポケモンは「ニャース」です(というか、シナリオクリア以前には「ものひろい」を持つポケモンはニャースしかいないため、選択肢としても事実上一択です)。

FRLGシナリオクリア前において、ニャースは特性「ものひろい」を持つ唯一のポケモンだ。
ヤマブキシティに面した5番・6番・7番・8番道路に出現するぞ

ちなみに、「ペルシアン」に進化させるとものひろいではなくなるので注意が必要です。もっとも、FRLGの時代では控えの手持ちポケモンに経験値は入りませんから、進化に怯える必要はありません。また、おあつらえ向きに、第3世代におけるニャースの特性は「ものひろい」しかありません*1ので、ニャースを捕まえれば、そのまま「ものひろい」要員として利用できます。

なお、先述の通りFRLGにおいて「ものひろい」と「あまいかおり」を両立できるポケモンはいませんので、結論、準備としては野生のニャースを5匹捕まえるだけでOKということになります。

ポケモンFRLGでは「ものひろい」で拾える道具がレベルによって変わらない。
つまり、ニャースを5匹捕まえるだけで、最大効率での「ものひろい」パーティーになるのだ

 

5.「ものひろい」周回はポケモンタワー5階が最適解

さて、手持ちに5匹の「ものひろい」を連れたら、あとはひたすら5回の戦闘を行い、どうぐ回収をやり続けるだけですが、ポケモンの「わざPP」は有限です。言い換えれば、一定回数の戦闘を終えたら、「回復」を行う必要があります。

すなわち、野生ポケモンとの戦闘とPP回復を高効率に往復できる場所で「ものひろい」周回を行うことが求められます。

これについても結論から言えば、シオンタウンのポケモンタワー5階が最適解です。ポケモンタワー5階の中央には、ポケモンのHPやPPを回復してくれる「結界」があり、野生ポケモンの戦闘後、1マス踏み入れるだけで即時に回復することができます。

ポケモンタワーの5階中央には結界が張ってある。
足を踏み入れるだけで手持ちポケモン全員を全回復できるのだ

ちなみに、本ブログでは過去にポケモンタワー5階を「レベル上げ」だけの自動化に特化したものも紹介しています。

興味があればご参考ください(筆者としては、ものひろいも一緒にできる今回の方が珍しいどうぐが手に入る分オトクだと考えますが、時間効率との兼ね合いになりますので、お好みで使い分けてください)。

tangential-star.hatenablog.jp

 

6.ソースコード

今回は、「ポケモンタワー」の5階でポケモンを一定回数倒して手持ちポケモンの「ものひろい」を発動させる、無限どうぐ回収(ものひろい自動化)を実装しました。

6-1.事前準備

まず、手持ちポケモンに「あまいかおり」が使えるポケモン1匹と、ニャース(特性「ものひろい」を持つポケモン)を4~5匹準備してください。また、手持ちポケモンの先頭は、野生ポケモンを一撃で倒せるほど、十分にレベルの高いポケモンにします。

可能であれば先頭ポケモンに「あまいかおり」を覚えさせ、残りをニャース5匹にすると最高効率で自動化が可能です。

私は「あまいかおり」が使える先頭ポケモンとしてフシギバナを用意しましたが、「はっぱカッター」は命中率が95で安定しないため、わざマシンを使って命中100の「めざめるパワー」を採用しました。ちなみに、「めざめるパワー」は「ものひろい」で拾うことができます。

手持ち1番目は、野生のカラカラ・ゴース・ゴーストを1撃で倒せるポケモンにしよう。
1番目のわざの命中率・わざタイプに注意(ノーマル・かくとう・でんき・じめんは無効だ)

また、「せってい」から、ボタンモードを「LR」にしてください。特に「かたて」モードにしていると十字キーで主人公を操作できなくなるため、必ずLRにしてください。

そして、「ポケモン」にカーソルをあわせた状態で、メニューを閉じてから、ポケモンタワーの5階の結界のすぐ下のマスに立ってください

「あまいかおり」が使えるポケモンを手持ちに加え、ボタンモードはLRにしておこう
「ポケモン」にカーソルがある状態でメニューを閉じて準備完了。
結界のすぐ下のマスに立つことが重要だぞ

6-2.ソースコードの書き換え

続いて、プログラムのソースコードを修正します。全文は次節をご覧ください。
※ソースコードの冒頭にも書いています。それを読んで理解できる人は読み飛ばしOKです

6-2-1.手持ちポケモンの数と、「あまいかおり」を覚えたポケモンの位置

まず、「あまいかおり」を覚えたポケモンの順番をAMAI_KAORIに、手持ちポケモンの数をTEMOCHI_NUMに、それぞれ代入します(書き換えます)。

例えば、「あまいかおり」を覚えたポケモンが先頭ポケモンなら「1」、2匹目なら「2」と書き換えます。

なお、手持ちポケモンは6匹推奨なので基本的には「6」ですが、もし違う状態で自動化を行う場合はTEMOCHI_NUMの数字を書き換えてください。

// ★「あまいかおり」を覚えたポケモンが手持ちの何匹目かを指定↓
const int AMAI_KAORI = (1);  // 手持ち先頭:「1」~ 最後尾:「6」

// ★手持ちポケモンが何匹いるかを指定↓
const int TEMOCHI_NUM = (6); // 手持ちポケモンが6匹なら「6」

 

6-2-2.先頭ポケモンのわざPPと、戦闘にかかる時間

続いて、先頭ポケモンによる戦闘時間と戦闘回数を設定します。

まず、A_RENDA_TIMEに「あまいかおり」でポケモンを呼び出してから何秒間A連打を続けるかを記入します。具体的には、先頭ポケモンがレベル100であれば15秒、それ以外であればレベルアップの時間を考慮し、25秒~30秒程度を設定するとよいです。

そして、REPEAT_TIMEには、先頭ポケモンの1番目のわざのPPを入力してください。

// ★A連打する時間(秒)※連打時間
const long int A_RENDA_TIME = (30); // レベルアップの時間などを含め、「十分に長い時間」を指定してください。
// ★回復までの試行回数(何回戦闘を行い、回復を行うか)
const int REPEAT_TIME = (14); // 必ずワンパンできるなら、使う1番目のわざのPPを上限に。

 

6-2-3.手持ちの「ものひろい」の位置と、どうぐ回収の間隔

最後に、何回おきに手持ちポケモンのどうぐを回収するかと、「ものひろい(ニャース)」が手持ちの何匹目かを入力します。

まず、NUM_OF_BATTLEに、「何回ごとに道具回収を行うか」を記入します。筆者のおすすめは「5」です。理由は、2章で紹介した通り、5匹で5回戦闘を行えば約9割の確率で道具が拾えるからです。

続いて、monohiroi[]に、手持ちのポケモンの順番ごとに「ものひろい」はtrue、違う場合はfalseを入力していきます。私と同様、手持ち2番目~5番目がニャースなら、{false, true,  true,  true,  true,  true, };のままでOKです。例えば、1番目がLv100のポケモン、2番目が「あまいかおり」、3番目~6番目がニャースなら、{false, false,  true,  true,  true,  true, };のように、3,4,5,6番目だけtrueにすればOKです。なお、手持ちが6匹未満の場合には、手持ちの数に合わせて行ごと削除してください。

// ★道具回収を、何回の戦闘ごとに行うか?
const int NUM_OF_BATTLE = (4); 

// ★とくせい「ものひろい」を持つポケモンの位置
// 「ものひろい」では無いポケモンには「false」に書き換えてください
// ※FRLGにおいて、「ものひろい」「あまいかおり」を両立できるポケモンはいません。
const bool monohiroi[] = {
  false, // 1番目(手持ち先頭)
  true,  // 2番目
  true,  // 3番目
  true,  // 4番目
  true,  // 5番目
  true,  // 6番目(最後尾) 
};

 

6-3.ソースコード全文

おまたせしました。ソースコードの全文です。

ソースコードの冒頭の注意事項もよく読んで利用してください。なお、「シルフスコープ」を所持している前提ですので、まだシナリオが進んでいない人はそこまで進めてくださいね。

/*  FRLG シオンタウン「あまいかおり」で自動「ものひろい」 developed by ますたー(@tangential_star)
 *   
 *   【説明】
 *   「あまいかおり」を使って野生ポケモンと出会います。
 *   A連打で戦闘を終わらせます。指定した試行数をすぎると、一度結界の中に入って回復し、これを繰り返します。
 *   その間に、手持ちの「ものひろい」要員のどうぐを、一定回数ごとに受け取ります。
 *   ★進化のタイミングや、レベルアップによってわざを忘れる(上書きする)可能性などがあります。責任は取れません。FRLGでは
 *   ★A連打で戦闘が終わる前提でループします。十分に長い時間のA連打時間を指定するようにお願いします。
 *   
 *   【準備】
 *   ・シオンタウンのポケモンタワー5Fの「結界があるところ」に入り、結界のすぐ1歩下に立ちます。
 *   ・先頭ポケモンは、わざ1番目は命中率が100%のもので、野生ポケモンに対して十分に火力のあるものにしてください。
 *   (出現する野生ポケモンは、ゴース・ゴースト・カラカラです。ノーマルタイプやでんきタイプのわざは不適です)
 *   ・先頭ポケモンは、1番目のわざを使う仕様です。したがって、レベルアップなどで1番目のわざが変わる可能性があるため、長時間の放置は行わず、目を離さないようにしてください。
 *   ・先頭ポケモンは、戦闘開始時に「とくせい」が発生しないポケモンにしてください。
 *   ・「あまいかおり」が使えるポケモンは、フィールドで使える他のわざ(フラッシュ・いあいぎりなど)を覚えさせないようにしてください。
 *   ・「X」でメニューを開いて「ポケモン」にカーソルを合う状態にしてメニューを閉じます【重要】
 *   ・手持ちに「ものひろい」を持つポケモンを加えてください。
 *   ・
 *   
 *   ・「せってい」から「せんとうアニメ」を「みない」にしておく。
 *   ・「せってい」から「話のはやさ」を「はやい」にしておく。
 *   ・「せってい」から「ボタンモード」を「LR」または「ヘルプ」にする ※「かたて」にしない【重要】
 *   ・ソース41行目の「AMAI_KAORI」の数字に「あまいかおり」を覚えた手持ちポケモンが何匹目かを入力
 *   (手持ちの先頭なら「1」、最後尾なら「6」を入力)
 *   ・ソース44行目の「TEMOCHI_NUM」に手持ちの数を入力。
 *   (手持ちの数が6匹全部埋まっていたら「6」,3匹なら「3」など)
 *   ・ソース47行目の「A_RENDA_TIME」に、戦闘開始~フィールドに戻るまでのA連打の時間(単位:秒)を入力。
 *   (例えば15秒なら15、30秒なら30など)
 *   ・ソース50行目の「REPEAT_TIME」に、HP/PP回復までの試行回数を記入。
 *   (例えば2回なら2など)
 *   ・
 *    1戦闘ごとに10%の確率で「ものひろい」が発動します
 *    未所持6匹の「ものひろい」発動確率は、46.85%(= 1-(0.9)^6 )です。
 *    未所持5匹の「ものひろい」発動確率は、40.95%(= 1-(0.9)^5 )です。
 *    未所持4匹の「ものひろい」発動確率は、34.39%(= 1-(0.9)^4 )です。
 *   
 *   ・
 *   
 *   ★Switch2でしか動作確認していません。必要に応じて、待機時間などを調整してください。
 *  (c) 2026 ますたーの忘備録
 *  https://tangential-star.hatenablog.jp/
 */

#include <SwitchControlLibrary.h>
#define HOLDTIME (95) // 1回のキー入力の長押し時間
#define SWITCH_VER (20)

// ★★★ここを書き換える↓★★★

// ★「あまいかおり」を覚えたポケモンが手持ちの何匹目かを指定↓
const int AMAI_KAORI = (1);  // 手持ち先頭:「1」~ 最後尾:「6」

// ★手持ちポケモンが何匹いるかを指定↓
const int TEMOCHI_NUM = (6); // 手持ちポケモンが6匹なら「6」

// ★A連打する時間(秒)※連打時間
const long int A_RENDA_TIME = (30); // レベルアップの時間などを含め、「十分に長い時間」を指定してください。

// ★回復までの試行回数(何回戦闘を行い、回復を行うか)
const int REPEAT_TIME = (14); // 必ずワンパンできるなら、使う1番目のわざのPPを上限に。

// ★道具回収を、何回の戦闘ごとに行うか?
const int NUM_OF_BATTLE = (4); 

// ★とくせい「ものひろい」を持つポケモンの位置
// 「ものひろい」では無いポケモンには「false」に書き換えてください
// ※FRLGにおいて、「ものひろい」「あまいかおり」を両立できるポケモンはいません。
const bool monohiroi[] = {
  false, // 1番目(手持ち先頭)
  true,  // 2番目
  true,  // 3番目
  true,  // 4番目
  true,  // 5番目
  true,  // 6番目(最後尾) 
};


// ★★★ここを書き換える↑★★★

// グローバル変数
volatile int curBattle = NUM_OF_BATTLE;

// 関数
int pickItems(bool* party_list, size_t len);
void die(void);


// ボタン押しラッパー関数
int PushKey(char* keyname, int holdtime, int delaytime);
void TiltLeftStick(int direction_deg, double power, int holdtime, int delaytime);
void TiltRightStick(int direction_deg, double power, int holdtime, int delaytime);
void renda(char* key ,long int time_to_press_repeatedly);

void setup() {
  for(int i=0;i<3;i++)PushKey("B", HOLDTIME, 300); // Bボタンを3回押してSwitchに認識されるのを待つ
  PushKey("B", HOLDTIME, 300); // Bを押しておく。
  delay(1000);

  curBattle = 0; // 道具回収の残り回数を初期化
  
}

// 草むらの上などでスタート
void loop() {

  for(int i = 0; i < REPEAT_TIME ; i++){
    // ■フィールドで「あまいかおり」を使う
    useSweetScent(AMAI_KAORI);
    // あまいかおり エフェクト~「あ! やせいの ●●が とびだしてきた!▼」まで待機
    delay(9300);
  
    // ■戦闘に入る
    renda("A", A_RENDA_TIME);  
    // フィールドに戻る

    // 道具回収の試行回数までインクリメント
    curBattle++;

    // ★どうぐ回収
    if(curBattle >= NUM_OF_BATTLE){
      if( pickItems(monohiroi, sizeof(monohiroi)/sizeof(monohiroi[0]) ) == 0 ) die();
      curBattle = 0; // 残り回数をもとに戻す
    }      
  
  }

  PushKey("up",600, 1800); // ↑
  PushKey("A",HOLDTIME, 700); // せいなる いのりに まもられた けっかいへ はいった!▼
  PushKey("A",HOLDTIME, 700); // ますたーと ポケモンは ひと やすみして げんきに なった!
  PushKey("down",600, 200); // ↓
 
}


int pickItems(bool* party_list, size_t len = 6){
  
  if(party_list == NULL ) return 0;

  int lpcnt = 0;

  PushKey("X",HOLDTIME, 800); // メニューを開く
  PushKey("A",HOLDTIME, 1300); // 「ポケモン」を開く
  for( lpcnt = 0 ; lpcnt < len ; lpcnt++ ){
    if(party_list[lpcnt] == false){
      PushKey("Down",HOLDTIME, 400); // 次のポケモンにカーソルをあわせる
      continue;
    }
    PushKey("A",HOLDTIME,    300); // →つよさをみる
    PushKey("Up",HOLDTIME,   100); // →やめる
    PushKey("Up",HOLDTIME,   100); // →もちもの
    PushKey("A",HOLDTIME,    100); // →バッグをひらく
    PushKey("Down",HOLDTIME, 100); // →バッグへもどす or やめる
    PushKey("A",HOLDTIME,    600); // ●●から ●●を あずかりました! or ●●は なにも どうぐを もって いません!
    PushKey("B",HOLDTIME,    200); // (ポケモン選択終了)

    PushKey("Down",HOLDTIME, 200); // 次のポケモンにカーソルをあわせる
  }
  PushKey("B",HOLDTIME, 900); // メニューに戻る
  PushKey("B",HOLDTIME, 200); // メニューを閉じる(フィールドに戻る)
  return lpcnt;
}



int useSweetScent(int who_can_use){
  if(who_can_use <= 0 || who_can_use > 6) return 0;
  int lpcnt;
  PushKey("X",HOLDTIME, 800); // ★メニューを開く
  PushKey("A",HOLDTIME, 1600); // ★「ポケモン」を開く
  // ★カーソルをあわせる(上入力を必ず入れておきたいので逆順で処理)
  for(lpcnt = (TEMOCHI_NUM+2); lpcnt > who_can_use ; lpcnt-- ){ 
    PushKey("Up",HOLDTIME, 100); // ↑を押しまくる
  }
  PushKey("A",HOLDTIME,    500); // ★→つよさをみる
  PushKey("Down",HOLDTIME, 400); // ★→あまいかおり
  PushKey("A",HOLDTIME,    10); // ★(あまいかおりを使う)
  return lpcnt;
}

void die(void){
  for(;;)delay(1000);
}

int PushKey(char* keyname, int holdtime, int delaytime){
  // ホームボタン・方向キーはRight, Left, Up, Down, Homeなど2文字以上で入力。
  // その他ボタン入力は1文字(A,B,X,Y,R,L,+,-)ZR・ZLにも対応
  // 同時押しは非対応
  
  if(strlen(keyname)==1){
    switch(keyname[0]){
      case 'A': case 'a': // A
        SwitchControlLibrary().PressButtonA(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonA(); delay(delaytime);
      break;
      case 'B': case 'b': // B
        SwitchControlLibrary().PressButtonB(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonB(); delay(delaytime);
      break;
      case 'X': case 'x': // X
        SwitchControlLibrary().PressButtonX(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonX(); delay(delaytime);
      break;
      case 'Y': case 'y': // Y
        SwitchControlLibrary().PressButtonY(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonY(); delay(delaytime);
      break;
      case 'L': case 'l': // L
        SwitchControlLibrary().PressButtonL(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonL(); delay(delaytime);
      break;
      case 'R': case 'r': // R
        SwitchControlLibrary().PressButtonR(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonR(); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      break;
      case '+': case 'p': case 'P': // Plus
        SwitchControlLibrary().PressButtonPlus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonPlus(); delay(delaytime);
      break;
      case '-': case 'm': case 'M': // Minus
        SwitchControlLibrary().PressButtonMinus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonMinus(); delay(delaytime);
      break;
      default:
      break;
    }
  }else if(strlen(keyname)>=2){
    switch(keyname[0]){
      case 'z': case 'Z': // ZR/ZL
        if(keyname[1]=='R'||keyname[1]=='r'){
          SwitchControlLibrary().PressButtonZR(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZR(); delay(delaytime);
        }
        if(keyname[1]=='L'||keyname[1]=='l'){
          SwitchControlLibrary().PressButtonZL(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZL(); delay(delaytime);
        }
      break;
      case 'r': case 'R': // right
        SwitchControlLibrary().MoveHat(2); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'l': case 'L': // left
        SwitchControlLibrary().MoveHat(6); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'u': case 'U': // up
        SwitchControlLibrary().MoveHat(0); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'd': case 'D': // down
        SwitchControlLibrary().MoveHat(4); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      default:
      break;  
    }
  }else{
    return -1;
  }
  return strlen(keyname);
}

void TiltLeftStick(int direction_deg, double power, int holdtime, int delaytime){
  double rad = (double)direction_deg*PI/180.0; // 弧度法(ラジアン)変換
  int x, y;
  x = (double)128*sin(rad)*power;
  y = (double)-128*cos(rad)*power;
  x += 128; y += 128;
  if(x >= 255) x=255; if(x <= 0) x=0;
  if(y >= 255) y=255; if(y <= 0) y=0;

  SwitchControlLibrary().MoveLeftStick(x,y);
  if(holdtime> 0){ // holdtime=0のときは押しっぱなし。
    delay(holdtime);
    SwitchControlLibrary().MoveLeftStick(128,128); // 傾きを直す
  }
  if(delaytime>0) delay(delaytime);
  return;
}

void TiltRightStick(int direction_deg, double power, int holdtime, int delaytime){
  double rad = (double)direction_deg*PI/180.0; // 弧度法(ラジアン)変換
  int x, y;
  x = (double)128*sin(rad)*power;
  y = (double)-128*cos(rad)*power;
  x += 128; y += 128;
  if(x >= 255) x=255; if(x <= 0) x=0;
  if(y >= 255) y=255; if(y <= 0) y=0;

  SwitchControlLibrary().MoveRightStick(x,y);
  if(holdtime> 0){ // holdtime=0のときは押しっぱなし。
    delay(holdtime);
    SwitchControlLibrary().MoveRightStick(128,128); // 傾きを直す
  }
  if(delaytime>0) delay(delaytime);
  return;
}

void renda(char* key ,long int time_to_press_repeatedly){
  unsigned long int current_time=0;
  unsigned long int start_time=0;

  // 決められた時間ずっとA連打
  for( start_time=millis(), current_time=start_time ; current_time - start_time < (unsigned long)time_to_press_repeatedly*1000UL ; current_time=millis() ){
    PushKey(key, 50, 50); // ひたすら連打
  } 
  return;
}

 

7.あとがき

今回は「ものひろい」の自動化を紹介しました!

目的だった「ふしぎなアメ」、ポイントアップがそれぞれ500前後も集まったので満足です。というか、「オレンのみ」が早々に999個も集まってしまい、きのみぶくろが一杯になるので、それを捨てて放置したら、今度は「カゴのみ」が一杯になる、というのを経験しました。

長時間放置して、「ふしぎなアメ」は504個、「ポイントアップ」は465個になったぞ
999個持っている「きのみ」を預かろうとすると、
「きのみぶくろが いっぱいで ポケモンの どうぐを うけとれません!」となるのだ

さて。ゴールデンウィークも明けて、早くも5月中旬ですね。私はまだFRLGはシナリオクリアはしていませんが、ようやく、サカキを倒してバッジ8個になりました。あとはチャンピオンロードを抜けるだけです。四天王、待ってろよ~!笑

ちなみにその間、何をしていたかと言えば、もっぱら、サンダーとファイヤーの色違い厳選を行っていました。もちろん、自動化です。そして、どちらも成功しました!

…ので、気が向いたらブログ更新しようと思います。乞うご期待(コメントで応援があると嬉しいです)

筆者がコーディングしたフリーザー・ファイヤーの色違い厳選自動化の様子。
なみのり・かいりきの大変さはあったが、どちらも無事に成功したぞ。
自動化ソースコードは後日、ブログで紹介予定! 乞うご期待!
色違いのフリーザー・ファイヤーも無事にお迎え。色違いっていいよねぇ~

さて、個人的には仕事がとても忙しく、新生活に未だ慣れません…。

それでも、合間を縫ってポケモンで遊んでいけたらと思いますし、このブログも引き続き更新できればと思います。

これからも引き続き応援いただければと思います。

 

ではではc⌒っ.ω.)っ

 

前回の記事:【FRLG自動化04】色違いサンダー厳選【むじんはつでんしょ】

次の記事:【FRLG自動化06】色違いフリーザー厳選【ふたごじま】

(FRLGの記事一覧はこちらから→ ポケモンFRLG自動化 カテゴリーの記事一覧

--

本ブログについて:本ブログについて

 

Arduino導入記事:【Arduino自動化01】Arduino開発環境の導入

ポケモン剣盾の記事:ポケモン剣盾Arduino自動化 カテゴリーの記事一覧

ポケモンBDSPの記事:ダイパリメイクArduino自動化 カテゴリーの記事一覧

レジェンズアルセウスの記事:レジェンズアルセウスArduino自動化 カテゴリーの記事一覧

スカーレット・バイオレットの記事:スカーレットバイオレットArduino自動化 カテゴリーの記事一覧

レジェンズZ-Aの記事:レジェンズZA自動化 カテゴリーの記事一覧

ポケモンFRLGの記事:ポケモンFRLG自動化 カテゴリーの記事一覧

 

YouTubeチャンネル:ますたーの忘備録 - YouTube

www.youtube.com

 

*1:ニャースの「とくせい」は第3世代では「ものひろい」のみでしたが、第4世代以降は「テクニシャン」も追加されました。