以下の内容はhttps://tangential-star.hatenablog.jp/entry/Arduino_pokemon_FRLG01_NuggetBridgeより取得しました。


【FRLG自動化01】ゴールデンボールブリッジきんのたま回収【序盤金策】

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

 

今回は、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人目に負ければ、もう一度ポケモンセンターからやり直せる。
つまり、負け続ければ「きんのたま」を何度でも受け取ることができるのだ!

これを手順として整理すると、下記のようになります。

【ゴールデンボールブリッジ「きんのたま」無限回収の手順】

  1. ハナダシティのポケモンセンターを出て、北に向かう
  2. ゴールデンボールブリッジの6人目(ロケットだんのしたっぱ)に話しかける
  3. 賞品として「きんのたま」を受け取る(5,000円のプラス)
  4. その後の戦闘で敗北する
  5. 最後に立ち寄ったポケモンセンター(ハナダシティ)に送還される
  6. 手順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) // 何秒間、Aを連打し続けるか
// ★★★ここを書き換える↑★★★

筆者の環境では「190秒」で999試行(約60時間)の放置に成功していますので、特にこだわりがなければこの数字で良いと考えます*5

 

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

下記がソースコードの全文です。

/*  FRLG ゴールデンボールブリッジ「きんのたま」無限回収(24番道路の5人抜き)の自動化
 *   
 *   【説明】
 *   24ばんどうろの北にある「ゴールデンボールブリッジ」の「5人抜き」の景品をもらい続けるプログラム。
 *   5人抜きを終えた先の男性(ロケット団のしたっぱ)からは戦闘前に「きんのたま(売値5,000円)」がもらえます。
 *   この6人目の男性との戦闘に敗北することで、再度「きんのたま」をもらうことができます。
 *   このプログラムでは、これをひたすら繰り返し続けます。
 *   
 *   時間効率としては、ぶっ通し39時間42分で「きんのたま」656個が獲得できました(実測値)。
 *   1時間で8万円(きんのたま16個)くらいの効率ですね。
 *   もっと早めるためには、40行目の「RENDA_TIME」の値を190から減らしてください。
 *   
 *   【準備】
 *   ・ゴールデンボールブリッジの5人抜きを完了させ、6人目の男に「勝利していない」状態にする。【←1番重要】
 *   ・手持ちポケモンは十分に弱いポケモン1匹だけにする。
 *   ・手持ちポケモンの1番目のわざを「にらみつける」など、攻撃技以外にする。
 *   ・「せってい」から「せんとうアニメ」を「みない」にしておく。
 *   ・「せってい」から「話のはやさ」を「はやい」にしておく。
 *   ・「せってい」から「ボタンモード」を「LR」または「ヘルプ」にする ※「かたて」にしない【重要】
 *   ・そのポケモンが全滅するまでの時間を測ってプログラム40行目「RENDA_TIME」に記入しておく(デフォルトで190にしています。単位は秒です)。
 *   ・ハナダシティのポケモンセンターのジョーイさんの目の前にいる状態にする!
 *   
 *   【挙動】
 *   ArduinoをSwitchにさすと、ハナダシティのポケモンセンターから出てゴールデンボールブリッジに向かいます。
 *   その後、ゴールデンボールブリッジまで自動で進み、6人目の男と戦闘を行います。
 *   そして、A連打で自滅してポケモンセンターまで戻ってきて、またループします。
 *   
 *   ★Switch2でしか動作確認していません。必要に応じて、待機時間などを調整してください。
 *   ★39時間42分の連続稼働を確認していますが、動作を保証するものではありません。
 *   
 *  (c) 2026 ますたーの忘備録
 *  https://tangential-star.hatenablog.jp/
*/

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

// ★★★ここを書き換える↓★★★
#define RENDA_TIME (190) // 何秒間、Aを連打し続けるか
// ★★★ここを書き換える↑★★★

// ボタン押しラッパー関数
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);
}

// ハナダシティのポケモンセンターからスタート
void loop() {

  // ■ポケモンセンターから出る
  PushKey("Down", 1700, 2800); // ↓キー入力


  // ■ゴールデンボールブリッジに向かう
  SwitchControlLibrary().PressButtonB(); // Bを押しながら
  PushKey("left", 450, 10); // ←キー入力
  PushKey("up", 450, 10); // ↑キー入力
  PushKey("left", 1400, 10); // ←キー入力
  PushKey("up", 1000, 10); // ↑キー入力
  SwitchControlLibrary().ReleaseButtonB(); // Bを離す

  PushKey("right", 3900, 20); // →キー入力

  // ■6人目のお兄さんまで走る
  SwitchControlLibrary().PressButtonB(); // Bを押しながら
  PushKey("up", 6500, 10); // ↑キー入力
  SwitchControlLibrary().ReleaseButtonB(); // Bを離す

  // ■戦闘開始~敗北まで(ポケモンセンターに送られる)
  renda("A", RENDA_TIME); // RENDA_TIME秒間、ひたすらA連打して戦闘を終える(敗北する)

  // ■ジョーイさんの話しかけを解除する
  renda("B", 11); // 11秒間、B連打して会話終了
}


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;
}

 

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

 

 

*1:24番道路・ハナダシティの北には、いわゆる「ゴールデンボールブリッジ」という橋があります

*2:ハナダシティから次の街を目指すには、ゴールデンボールブリッジを抜けて、「ハナダのみさき」にあるマサキの家を訪れる必要があります。つまり、この6人目を倒さない限り、シナリオが進みません

*3:敗北時に支払う賞金額は、同じ第三世代のルビー・サファイア・エメラルドでは一律で「半額」のペナルティでしたから、とても遊びやすくなったと言えます

*4:Switch版のFRLGにおける「かたて」とは、GBA当時の「L=A」とは異なり、文字通りJoy-con片手で遊べるように再設計されたキーコンフィグになっており、十字キーにStartボタンやSelectボタンが割り当てられています。

*5:筆者は十分に長い時間として「190秒」で設定していますが、相手が「にらみつける」を連続で使うなどで戦闘時間が間延びする可能性があるため、その特性上、放置での自動化を保証できるものではありません




以上の内容はhttps://tangential-star.hatenablog.jp/entry/Arduino_pokemon_FRLG01_NuggetBridgeより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14