わどるDAILY

つれづれと

KDL2の乱数(RNG)について

f:id:WaddleDX:20210503201941p:plain 星のカービィ2(以下KDL2)の乱数について色々書きます

乱数のメモリ

  • メモリアドレスは$6A30-$6A31の2バイト
    • WRAMドメインでは$1A30-$1A31
    • トルエンディアン
    • 乱数行動に適用するのは上位8ビット($6A31)のみ

疑似乱数計算

KDL2の疑似乱数は線形合同法によって生成される

計算式は以下の通り

(次のRNG) = (現在のRNG)× 0x5 + 0x3711 mod 0x10000

  • 実際にはいくつかの命令に分割されているが、簡素な式にしている
  • 上記の計算により、0x10000(65536)回の乱数消費でループする

乱数消費を伴う行動一覧

  • 起動時の乱数は0x0000
  • デモプレイ開始時に乱数が0x0000に初期化される

ゲーム開始時

  • タイトル画面
    • 操作可能なタイミングから1F毎に乱数を1つ消費
  • ファイル選択画面
    • 操作可能なタイミングから1F毎に乱数を1つ消費

着地星

f:id:WaddleDX:20210503202003j:plain

  • 地形にぶつかった時に出る小さい星
  • いずれの場合も乱数を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:下」により、着地星は下方向に出てくる

乱数消費はこの一連の流れで行われる