サイファーの日記

過去作の乱数について書きます

【VC黄】カビゴンの状況再現

1. はじめに

この記事では、VCピカチュウ版で個体値FFFFカビゴン(12番道路の固定シンボルのみ)の状況再現をする方法を説明していきます。

以前は使わなかったサーボモーターなどで操作を一部自動化する必要があるので、人によっては準備が大変です。ただ装置の扱いに慣れていれば、毎回3時間以内には終えられると思います。サーボの使い方などはここでは詳しく解説していないので他の専門のサイトを参照してください。

2. 準備

・TN「イエロー」のデータ*1
ポケモンのふえ、マスターボール
・12番道路のNPC、アイテムに干渉しない
ArduinoArduinoとPCをつなぐUSBケーブル、サーボモーター3個、サーボモーターを押さえる何か3個*2、ジャンパワイヤー12本程度、ブレッドボード

3. 実践

3-1. カビゴンの目の前でセーブ

11番道路のゲートから入って、12番道路にいるカビゴンの左隣でセーブします。念のため、セーブ時に主人公の顔が下を向いているようにしてください。

道具については、バッグの一番上にポケモンのふえ、そのすぐ下にマスターボールを入れるようにしてください。普段自分は上から3番目にじてんしゃ、4番目にふしぎなアメ5個も入れています。*3再現性に大きく影響するかは微妙ですが、念のためこれらの道具も追加で入れておくと安心です。


3-2. サーボを3DSに固定

サーボを3DSに固定します。分かりにくいですが、上の画像ではSG92Rというサーボの黒い羽とボタンとの隙間はかなり狭くなっています。

サーボをどれくらいの圧力で押さえるか、羽がボタンのどこに触れるかなどで操作タイミングは微妙にズレるので以下の作業の中で吟味してください。


3-3. プログラムを書き込んで実行

以下のようなプログラムをArduinoに書き込みます。 

#include <Servo.h>  

Servo myservo0;
Servo myservo1;
Servo myservo2;
unsigned long startTime;


void setup(void) {
  myservo0.attach(6); //十字キー下
  myservo0.write(110);  
  myservo1.attach(5); //Aボタン
  myservo1.write(115);  
  myservo2.attach(4); //Bボタン
  myservo2.write(120);
  delay(1500);
  startTime = millis();  
}
void loop() {

  //十字キー下のサーボの角度
  int v = 110; //離す
  int z = 119; //押す

  //Aボタンのサーボの角度
  int x = 115; //離す
  int y = 120; //押す

  //Bボタンのサーボの角度
  int r = 120; //離す
  int l = 108; //押す
 
  long f = 34740; //メスならf = 32200(メスの詳細は割愛)
  
  unsigned long currentMillis = millis();

  // 経過時間を計算
  unsigned long elapsedTime = currentMillis - startTime;

  // 指定した時間を超えたらサーボが動く
  if (elapsedTime >= 0 && elapsedTime < 100) {
    myservo1.write(y);
  } else if (elapsedTime >= 100 && elapsedTime < 14745) {
    myservo1.write(x);
  } else if (elapsedTime >= 14745 && elapsedTime < 14800) {
    myservo0.write(z);
  } else if (elapsedTime >= 14800 && elapsedTime < 14860) {
    myservo0.write(v);
  } else if (elapsedTime >= 14860 && elapsedTime < 14915) {
    myservo0.write(z);
  } else if (elapsedTime >= 14915 && elapsedTime < 15245) {
    myservo0.write(v);
    myservo1.write(y);
  } else if (elapsedTime >= 15245 && elapsedTime < 15290) {
    myservo1.write(x);
  } else if (elapsedTime >= 15290 && elapsedTime < 15715) {
    myservo1.write(y);
  } else if (elapsedTime >= 15715 && elapsedTime < 17245) {
    myservo1.write(x);
    myservo2.write(l);
  } else if (elapsedTime >= 17245 && elapsedTime < 17925) {
    myservo2.write(r);
  } else if (elapsedTime >= f && elapsedTime < f+2000) {
    myservo2.write(l);
  } else if (elapsedTime >= f+2000) {
    myservo2.write(r);
    while (1) {} // プログラムを停止
  } 
}


そしてハードリセットの画面で実行します。オープニングを最速で飛ばして*4Xボタン長押しでメニューを開くまでの操作、バッグが開かれる瞬間に十字キー上(またはセレクト)を長押しする操作、カビゴンが めを さました!」画面でAを押す*5操作については手動で行います。

実行の結果、操作全体が下のポストのようになっていればOKです*6。最速入力によって笛の演出がほとんどカットされているのが特徴です。若干のタイミングの誤差で「イエローは ポケモンのふえを ふいてみた!」の末尾に一瞬「▼」のようなマークが映り込む場合もありますが、特に気にする必要はないです。


3-4. 目標IGTが出るまでレポート

上記のプログラムを実行すると多くの場合、能力値の並びがA/B/S/Cの順に76/x/28/x、または77/x/29/x(ASの個体値は11より10になることの方が多い)の個体が出てくると思います。ここでのxはBとCの能力値、個体値が等しいという意味です。

ただ、IGTによっては時々71/x/23/x(後述するズレ利用のため、ASの個体値1ではなく0が望ましい)、または80/x/32/xの個体が現れるのでこのIGTを目標にしてレポートを繰り返し書き、プログラムを実行してください。この作業は1~2時間行えば終わると思います。

いずれの個体も出ない場合は、プログラム内の変数fを増減させます。初代の乱数は1フレームごとに変化しますが、ここでのfの値はミリ秒であることに注意してください。1フレームは約17ミリ秒です。とはいっても、2つの本体(旧3DSとnew 3DSLL)で同じ設定を問題なく使いまわせたので弄ることは少ないと思われます。


3-5. 目標IGT内で操作を繰り返す

能力値が71/x/23/x、または80/x/32/xの個体が現れたら以降レポートは書き直さずにプログラムを繰り返し実行します。IGTの質にもよりますが、この作業は1時間以内には終わると思います。

同様の操作をしても生じる、わずかなタイミングのズレがBとCの値を一定数ずらしてくれるので、それを利用して80/53/32/53の理想個体を狙うことができます。71/44/23/44(アンダーフローを期待)や80/52/32/52などが目標個体に近いズレ方をしたといえます。

4. おわりに

かなり簡略化して述べましたが説明は以上です。半自動化する上でサーボなどは簡単に購入できますが、3DSにサーボを固定する道具を見つけるのが難しいです。自作以外で何か良い案があったら教えてください。ちなみに手動でやろうとすると、サイボーグになって人間をやめる必要があります。

はらだいこは覚えられないもののストーリー周回含め数時間で終わるので、理想個体のカビゴンがたくさん欲しい人は参考にしてみてください。筆者は1週間ぼちぼちやって7体捕まえました。


最後に、もしこの状況再現について更に知りたいことがあればお気軽にご連絡ください(ざっくり解説した記事なので...)。

*1:デフォルトで用意された「イエロー」を選びます。他のTNでも再現できるかは未確認ですが、もしかしたら同じ文字数(4文字)であればいけるかも...

*2:クランプや、形状にもよるがダンベルなど。難易度が高いが自作すると便利です。

*3:ふしぎなアメはおつきみやま、ハナダシティ、ロケット団アジト、ポケモンタワー、シルフカンパニーの5か所で最短入手可能です。

*4:X→A→X→Aの順に入力してフィールド上に出ます。

*5:カビゴンが めを さました!」での入力タイミングは適当でOKです。不定な入力を増やすことで乱数のパターンを増やすおまじないみたいなもの。

*6:ポスト上ではサーボではなく完全自動化2DSを使っていますが、特に差異はありません。また、BFFFを再現していた時の動画なので最後の待機時間が異なります。