こんにちは。ますたーです。
今回は、FRLG自動化の第1弾として、24番道路の5人抜き(通称:ゴールデンボールブリッジ)の「きんのたま」回収を自動化しました。
なお、Arduino Leonardo自動化の導入・機材構成については導入記事を参考にしてください。
導入記事:【Arduino自動化01】Arduino開発環境の導入
※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。
概要
ポケモンFRLGの序盤・ハナダシティに到達した頃にできる金策として有名な、24番道路*1の5人抜き達成報酬「きんのたま」の無限回収する自動化プログラムを組みました。約1時間放置で16個(80,000円)稼ぐことができます。

ゴールデンボールブリッジの6人目は「きんのたま」をくれる。
その後の戦いに負ければ何度でも再挑戦できるのだ(効率は約1時間で16個(=8万円))
目次です。なお、ソースコードだけほしい方は3-2まで読み飛ばしてください。
1.ハナダシティの北・ゴールデンボールブリッジ
ハナダシティの北・24番道路の入口には、6人のトレーナーが待ち構える長い橋があります。作中でも「ゴールデンボールブリッジ」と呼ばれているようですが、その名前が冠する通り、「きんのたま(売価:5,000円)」を受け取れる場所です。受け取り方は、5人のトレーナーを倒し、6人目のトレーナーに話しかけるだけです。

この はしは ひと よんで ゴールデンボール ブリッジ!▼
5にん かちぬけば ごうかな しょうひんが もらえる!▼

6人目は勝利を称え、賞品として「きんのたま」をくれる
しかし、「上手い話には裏がある」とはよく言ったもので、この6人目の男性から「きんのたま」を受け取るや否や、作中のマフィア「ロケット団」に勧誘されるのです。主人公は当然ロケット団には入りませんから、ポケモンバトルになります。当然、勝てなければ先に進むことが出来ないため、シナリオを進めることもできません*2。
一方で、相手は「アーボ♂(Lv.15)」「ズバット♂(Lv.15)」の2匹だけなので、簡単に倒すことができます。主人公に敗れると「それだけの うでが あれば ロケットだん でも えらく なれるのに もったいないぜ!」と言って、その場を通してくれます。

6人目の正体はロケット団だった!いきなり毒蛇をけしかけてくる根っからの悪党なのだ
2.きんのたまをくれる6人目に負ければ、何度でも再挑戦できる
さて。前述の通り、シナリオ上では6人目(ロケットだんのしたっぱ)に勝利し次の街を目指すのですが、この6人目のトレーナーに敗北してもロケット団に入らされることはなく、通常通り最後に立ち寄ったポケモンセンターに強制送還されます。つまり、6人目には再挑戦ができます。言い換えると、6人目に負ければ「きんのたま」を再度受け取ることができるということです。シナリオ上、ハナダシティに到着した頃であれば、「きんのたま(売価5,000円)」は大きな金額となり、1周にかかる時間も90秒~120秒程度ですから、序盤の金策としては非常に優秀です。
6人目に負ければ、もう一度ポケモンセンターからやり直せる。
つまり、負け続ければ「きんのたま」を何度でも受け取ることができるのだ!
これを手順として整理すると、下記のようになります。
【ゴールデンボールブリッジ「きんのたま」無限回収の手順】
- ハナダシティのポケモンセンターを出て、北に向かう
- ゴールデンボールブリッジの6人目(ロケットだんのしたっぱ)に話しかける
- 賞品として「きんのたま」を受け取る(5,000円のプラス)
- その後の戦闘で敗北する
- 最後に立ち寄ったポケモンセンター(ハナダシティ)に送還される
- 手順1に戻ってやり直し
ちなみに、FRLGでは、敗北時(手順4)で支払う金額は、手持ちポケモンの最大レベルとバッジの数に依存します*3。このシナリオの時点では、バッジは1個または2個ですから、計算式としては「手持ちの最大レベル×16円(バッジが1個の場合)」「手持ちの最大レベル×24円(バッジが2個の場合)」となります。仮に手持ちポケモンがLv100だったとしても2,400円しか取られないため、「きんのたま」1個でお釣りが来ますね。
敗北時に支払う賞金は、バッジの数に応じた金額と手持ちの最大レベルで決定される。
例えば手持ちの最大Lvが6ならば、バッジ1個で16円×6=96円、バッジ2個で24円×6=144円だ
なお、戦闘にかかる時間は、手持ちポケモンの弱さや相性によって大きく増減しますが、ほとんどの場合3分程度に収まります。しかも「きんのたま」を受け取ってからポケモンセンターに強制送還されるまではA連打だけなので、連射コントローラーなどがあれば比較的手軽に周回することもできます。
ただし、ポケモンセンターからゴールデンボールブリッジまでは操作が必要になるので、完全に自動化したい場合はマクロコントーラーやマイコンボードなどの利用が必須になります。本ブログでは、マイコンボードとして「Arduino Leonardo」を使っています(→購入リンクならびに詳しいセットアップ手順は導入記事「【Arduino自動化01】Arduino開発環境の導入」を参照のこと)。
3.ソースコード
今回は、Arduino Leonardoを使って、ポケモンFRLGの24番道路「ゴールデンボールブリッジ」で、5人抜きの報酬「きんのたま」を無限に回収し続けるプログラムを作成しました。
3-1.事前準備
事前準備として、手持ちポケモンを十分に弱いポケモン1匹にして、かつ、1番目の「わざ」を攻撃技以外にしてください。できるだけ早く倒されたいため、「かみつく」「どくばり」「まきつく」が等倍以上になるポケモンをおすすめします。また、相手ポケモンはオスなので、プリンやピッピなどの「メロメロボディ」を持ったポケモンは避けるほうが懸命です。
手持ちポケモンは、十分に弱い1匹だけにして、1番目のわざは攻撃技以外にしよう
そして、「せってい」の「ボタンモード」を「LR」または「ヘルプ」にしてください!(絶対に「かたて」にしないでください)。本プログラムでは「十字キー」を使って主人公を操作しているため、「かたて」モードになっていると意図通りの挙動になりません*4。合わせて、効率化のために「せんとうアニメ」は「みない」、「はなしのはやさ」は「はやい」にしておくことをおすすめします。

自動化を行う場合は、必ず「ボタンモード」を「LR」か「ヘルプ」にしておこう(重要)。
「かたて」にすると、十字キーで主人公を操作できなくなってしまうのだ
また、ソースコード中の40行目の「RENDA_TIME」の数字を、必要に応じて書き換えてください。これは「きんのたま」の受け取り~ポケモンセンターでの回復までにかかる時間です。
#define RENDA_TIME (190)
筆者の環境では「190秒」で999試行(約60時間)の放置に成功していますので、特にこだわりがなければこの数字で良いと考えます*5。
3-2.ソースコード全文
下記がソースコードの全文です。
#include <SwitchControlLibrary.h>
#define HOLDTIME (95)
#define SWITCH_VER (20)
#define RENDA_TIME (190)
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);
PushKey("B", HOLDTIME, 300);
delay(1000);
}
void loop() {
PushKey("Down", 1700, 2800);
SwitchControlLibrary().PressButtonB();
PushKey("left", 450, 10);
PushKey("up", 450, 10);
PushKey("left", 1400, 10);
PushKey("up", 1000, 10);
SwitchControlLibrary().ReleaseButtonB();
PushKey("right", 3900, 20);
SwitchControlLibrary().PressButtonB();
PushKey("up", 6500, 10);
SwitchControlLibrary().ReleaseButtonB();
renda("A", RENDA_TIME);
renda("B", 11);
}
int PushKey(char* keyname, int holdtime, int delaytime){
if(strlen(keyname)==1){
switch(keyname[0]){
case 'A': case 'a':
SwitchControlLibrary().PressButtonA(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonA(); delay(delaytime);
break;
case 'B': case 'b':
SwitchControlLibrary().PressButtonB(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonB(); delay(delaytime);
break;
case 'X': case 'x':
SwitchControlLibrary().PressButtonX(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonX(); delay(delaytime);
break;
case 'Y': case 'y':
SwitchControlLibrary().PressButtonY(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonY(); delay(delaytime);
break;
case 'L': case 'l':
SwitchControlLibrary().PressButtonL(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonL(); delay(delaytime);
break;
case 'R': case 'r':
SwitchControlLibrary().PressButtonR(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonR(); delay(delaytime);
break;
case 'H': case 'h':
SwitchControlLibrary().PressButtonHome(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
break;
case '+': case 'p': case 'P':
SwitchControlLibrary().PressButtonPlus(); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().ReleaseButtonPlus(); delay(delaytime);
break;
case '-': case 'm': case 'M':
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':
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':
SwitchControlLibrary().MoveHat(2); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
break;
case 'l': case 'L':
SwitchControlLibrary().MoveHat(6); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
break;
case 'u': case 'U':
SwitchControlLibrary().MoveHat(0); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
break;
case 'd': case 'D':
SwitchControlLibrary().MoveHat(4); delay(holdtime);
if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
break;
case 'H': case 'h':
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){
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){
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;
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;
}
4.動作確認:約60時間で999個カンストしました
今回のプログラムを実行すると、ポケモンセンターから出てゴールデンボールブリッジの6人目に話しかけて戦闘で負けて、再びこれを繰り返し続けます。筆者もこのプログラムを使って、約60時間で999個の「きんのたま」を回収することができました(カンスト)。
プログラムを使って約60時間で「きんのたま」999個を回収したぞ
ちなみに、経過時間ごとの「きんのたま」の回収状況は下表の通りです。
きんのたま回収の経過時間と累計数
| 経過時間 |
回収した「きんのたま」 |
| 0:00 |
0個 |
| 0:53 |
14個 |
| 6:49 |
112個 |
| 18:29 |
304個 |
| 21:15 |
350個 |
| 28:45 |
474個 |
| 40:35 |
670個 |
| 43:55 |
725個 |
| 52:35 |
868個 |
| 59:40 |
976個 |
ちなみに、「きんのたま」がリュックに999個ある状態で6人目に話しかけると「リュックが いっぱいだ」と表示されて戦闘にすらなりませんので、一定数溜まってきたらパソコンに預けるか、売却も検討しましょう。
ただし、パソコンに預けることができる「きんのたま」も999個までです。同じ第三世代のルビー・サファイア・エメラルドとは違い、同一アイテムをカンストさせた状態で複数預けることができないため、所持できる「きんのたま」の上限は、リュック999個+パソコン999個の合計1998個になるので、放置し過ぎに注意しましょう(そんな人はいないと思いますが笑)。
リュックもパソコンも同じアイテムは999個までしか保管できないのだ。
「これいじょう あずけられません!」「これいじょう バッグに はいりません」
余談ですが、「きんのたま」を200個売却することで100万円分にはなりますが、主人公は「おこづかい」を999,999円までしか所持できないので、作中ではどう頑張っても100万円を貯めることはできません。
つまり、ハナダシティ南に位置する自転車屋さん「ミラクル・サイクル」では、お金をいくら貯めても自転車を購入することはできませんので、もし100万円貯めて自転車を買うぞ、と意気込んでいる方がいらっしゃったら、それは徒労になる、ということを付記しておきます。

主人公はおこづかいを999,999円までしか持てない。
ミラクル・サイクルの自転車(100万円)はどう頑張っても買えないのだ
5.あとがき
さて、今回はFRLGの自動化記事の第1弾として、シナリオ序盤の金策となる「ゴールデンボールブリッジ『きんのたま』回収」を紹介しました。
個人的に、FRLGはたくさん遊んだ作品の1つなので、とても懐かしいです。あまりにも懐かしかったので、現在遊んでいるポケモンレジェンズZAを放置して、未だDLCも遊ぶことなくFRLGで遊び始めました(…が、この自動化で80時間ほど放置しているのでまだバッジは1個です)。
運よくポケモンセンターオンラインでの「特別版」の争奪戦にも打ち勝ち、ファーストロットで購入することができてホクホクした気持ちです(個人的には、先月に結婚したのでとてもプライベートが充実しています)。

ポケモンセンター発売の「特別版」FRLGも購入することができた!(19,800円)
さて、このブログでは、今後、FRLG自動化の記事も執筆していけたらと思いますが、なにぶんマイペースな更新なので、温かい目でご覧いただければと思います。
何よりも、私自身がゲームであまり遊べていないので、まずはレジェンズZAもFRLGも、シナリオクリアを目指して進めていけたらと思います!
ではではc⌒っ.ω.)っ
2026/3/8追記:FRLG自動化の「第2弾」を書きました!ぜひ!
⇒ 【FRLG自動化02】野生ポケモン色違い厳選【あまいかおり】
--
本ブログについて:本ブログについて
Arduino導入記事:【Arduino自動化01】Arduino開発環境の導入
ポケモン剣盾の記事:ポケモン剣盾Arduino自動化 カテゴリーの記事一覧
ポケモンBDSPの記事:ダイパリメイクArduino自動化 カテゴリーの記事一覧
レジェンズアルセウスの記事:レジェンズアルセウスArduino自動化 カテゴリーの記事一覧
スカーレット・バイオレットの記事:スカーレットバイオレットArduino自動化 カテゴリーの記事一覧
レジェンズZ-Aの記事:レジェンズZA自動化 カテゴリーの記事一覧
ポケモンFRLGの記事:ポケモンFRLG自動化 カテゴリーの記事一覧
YouTubeチャンネル:ますたーの忘備録 - YouTube
www.youtube.com