「最高素質のポケモンは出ない」ことになっているらしい??

もしこれが本当なら、「ラッキーにも最高素質のポケモンをゲットした方=改造した」とされてしまうことに・・・
場合によっては「うそつき」にされてしまう大切なことなので、これは調べましょう!本当の所はどうなんでしょうか?


最高素質はプログラム中でチェックされているか?

    この部分が戦闘相手の個体値を決める所です(黄色版)
    ROMF:6FA4 FA 34 D0     ld   a,(D034)	; (D034)の値を読む
    ROMF:6FA7 FE 02        cp   02		; 02だとトレーナー戦
    ROMF:6FA9 3E 98        ld   a,98	;
    ROMF:6FAB 06 88        ld   b,88	;
    ROMF:6FAD 28 07        jr   z,6FB6	; トレーナー戦のポケモンは 98/88 を個体値とする
    ROMF:6FAF CD 21 73     call 7321	; ランダム作成(その1)#野生のポケモン用
    ROMF:6FB2 47           ld   b,a		;
    ROMF:6FB3 CD 21 73     call 7321	; ランダム作成(その2)
    ROMF:6FB6 21 D8 CF     ld   hl,CFD8	; 
    ROMF:6FB9 22           ldi  (hl),a	; 素早さ/特殊の個体値
    ROMF:6FBA 70           ld   (hl),b	; 攻撃/守りの個体値
    
    ようするに、ランダムな数字を作って、それをメモリーの決められた場所に書くだけです。
    考えられる可能性としては・・・次のうちのどれかでしょう。

      【1】FFFFh(最高素質)はランダムで出ないようになっている。
      【2】FFFFhの場合、その後に書き替えてしまう


    【1】ランダムでFFFFhは出るか?

      ランダム作成ルーチンはゲームボーイ特有のハードがらみの変数を使っているので、簡単には解析できません。ならば・・・ということで数を取ってみました。具体的な方法は「プログラムの書き換えです」。こんなのを作ってみました。タイミングとかが狂うとあれなんで、作成部分はオリジナルに忠実にして、あとはできたデーターをひたすらメモリーに書いていくというやつです。実際のところ、作ったプログラムの内容はどうでもいいんですけど、「本当にやったのか?」とか「はったりだ〜!」と言われない為に、念には念を(^-^;
      ROMF:6F98 00           nop           ;
      ROMF:6F99 21 00 A0     ld   hl,A000  ; メモリーをクリア
      ROMF:6F9C 01 FF 1F     ld   bc,1FFF  ;
      ROMF:6F9F AF           xor  a        ;
      ROMF:6FA0 22           ldi  (hl),a   ;
      ROMF:6FA1 0B           dec  bc       ;
      ROMF:6FA2 B1           or   c        ;
      ROMF:6FA3 20 FA        jr   nz,6F9F  ;
      ROMF:6FA5 B0           or   b        ;
      ROMF:6FA6 20 F7        jr   nz,6F9F  ;
      ROMF:6FA8 00           nop           ;
      ROMF:6FA9 21 00 A0     ld   hl,A000  ;
      ROMF:6FAC 01 FF 0F     ld   bc,0FFF  ;--- 次の行からオリジナルと同じ---
      ROMF:6FAF CD 21 73     call 7321     ; ランダム作成(その1)
      ROMF:6FB2 57           ld   d,a      ;
      ROMF:6FB3 CD 21 73     call 7321     ; ランダム作成(その2)
      ROMF:6FB6 5F           ld   e,a      ; メモリーに書き込む
      ROMF:6FB7 22           ldi  (hl),a   ;
      ROMF:6FB8 7A           ld   a,d      ;
      ROMF:6FB9 22           ldi  (hl),a   ;
      ROMF:6FBA 14           inc  d        ; ---ここまでオリジナルと同じ---
      ROMF:6FBB 20 06        jr   nz,6FC3  ;
      ROMF:6FBD 1C           inc  e        ;
      ROMF:6FBE 20 03        jr   nz,6FC3  ;
      ROMF:6FC0 00           nop           ; FFFFhが出るとここに来る
      ROMF:6FC1 18 09        jr   6FCC     ;
      ROMF:6FC3 AF           xor  a        ;
      ROMF:6FC4 0B           dec  bc       ;
      ROMF:6FC5 B1           or   c        ;
      ROMF:6FC6 20 E7        jr   nz,6FAF  ;
      ROMF:6FC8 B0           or   b        ;
      ROMF:6FC9 20 E4        jr   nz,6FAF  ;
      ROMF:6FCB 00           nop           ;
      
      このルーチンで1回のループで0FFFh=4095パターンのランダム作成ができます。これをひたすらファイルに書き出す→繰り返すという暇な作業を56回もやってしまいました(注:だからと言って暇ではありません、はい)
      ということで、こんなやり方でランダム作成を22万7704回やってみたところ2回出ました!

      →結果をまとめたファイル rnd.lzh (609kB) 28400行あるので強力なエディター必要かも


      確率を語るにはまだ回数が足りませんが、とりあえず結果は「でる」ということがわかりました。


    【2】最高素質チェックはあるか?

      ということで最高素質(FFFFh)はやっぱり出るということがわかったんですけど、じゃぁもしFFFFhが出たら、書き替えられるようなことがあるのか調べてみましょう。

      上のリスト(オレンジ色の部分)で、6FB6でa=FFh,b=FFhと入力して、最高素質にしてしまいます。それからゲットするまでに、この値が書き替えられるかどうか調べてみましょう。

      戦闘相手のパラメータ(詳しくはわかっているメモリーアドレスを見てね)
        RAM0:CFB0 0AEBFF00000000000000000000000024
        RAM0:CFC0 0043AC43505050000000000024000E00
        RAM0:CFD0 000002FF10000000FFFF02000E000700	黄色の数字が個体値
        RAM0:CFE0 070007000723000000282D283823FF37
        
      ゲットした後のパラメータ
        RAM1:D120 FEF650052415605483FFFF24000E0000
        RAM1:D130 0002FF1000000095AF00000900000000
        RAM1:D140 000000000000FFFF2300000002000E00	黄色の数字が個体値
        RAM1:D150 07000700070007150193660018180393
        
      ということで、結局この数字はゲットした後も書き替えられることはありませんでした。
      チェックは入っていないと見ていいでしょう。

結論:最高素質のポケモンはやっぱり出る! がんばってゲットしようね(^^)


戻る