KDL2の乱数(RNG)について
星のカービィ2(以下KDL2)の乱数について色々書きます
乱数のメモリ
疑似乱数計算
KDL2の疑似乱数は線形合同法によって生成される
計算式は以下の通り
(次のRNG) = (現在のRNG)× 0x5 + 0x3711 mod 0x10000
- 実際にはいくつかの命令に分割されているが、簡素な式にしている
- 上記の計算により、0x10000(65536)回の乱数消費でループする
乱数消費を伴う行動一覧
- 起動時の乱数は0x0000
- デモプレイ開始時に乱数が0x0000に初期化される
ゲーム開始時
- タイトル画面
- 操作可能なタイミングから1F毎に乱数を1つ消費
- ファイル選択画面
- 操作可能なタイミングから1F毎に乱数を1つ消費
着地星
- 地形にぶつかった時に出る小さい星
- いずれの場合も乱数を1つ消費
- 乱数に基づいて8方向のどちらかに出る
- #00 - #1F:0 - 上
- #20 - #3F:1 - 右上
- #40 - #5F:2 - 右
- #60 - #7F:3 - 右下
- #80 - #9F:4 - 下
- #A0 - #BF:5 - 左下
- #C0 - #DF:6 - 左
- #E0 - #FF:7 - 左上
ワープスター
- ワープスターから出る星で乱数を1つ消費
- レベル突入時:16消費(固定)
- レベル離脱時:21消費(固定)
- ボス撃破後:24消費(固定)
- レベル選択時は消費しない
仲間が入った袋
- 仲間がランダムな場合
- #00 - #71:リック(44.5%)
- #72 - #AA:カイン(22.3%)
- #AB - #FF:クー(33.2%)
- 合体してる仲間と同じ場合はグーイorチャオの乱数取得
- 乱数が8nの場合:チャオ(12.5%)
- それ以外の場合:グーイ(87.5%)
技
- 吸い込み:エフェクト
- カービィスパーク:電気の出る方向
エフェクト
- (水中)気泡
- (強風マップ)風
- ザコ敵を倒す
その他
- 敵・ボスの行動
- 多すぎるので省略
- ボーナスゲーム
乱数消費
KDL2は乱数が絡む行動がある度に疑似乱数計算を行い、その結果に基づいて行動が決定される
例えば乱数メモリが0x4E20(20000)の時に着地した場合、着地星の出る方向を出すために以下の乱数計算をする
0x4E20 × 0x5 + 0x3711 mod 0x10000 = 0xBDB1
結果の8D81の内、上位8ビットである8Dを上記の着地星のパターンに当てはめると 「#80 - #9F:下」により、着地星は下方向に出てくる
乱数消費はこの一連の流れで行われる