この部分が戦闘相手の個体値を決める所です(黄色版)
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回出ました!
確率を語るにはまだ回数が足りませんが、とりあえず結果は「でる」ということがわかりました。
【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
ということで、結局この数字はゲットした後も書き替えられることはありませんでした。
チェックは入っていないと見ていいでしょう。