乱数

アルゴリズム

一般的な線形合同法であり、Visual C++の実装と同一のものです。
xは乱数生成用の静的変数です。

int rand(){
  x = (x * 214013) + 2531011;
  return (int)(x >> 16) & 32767;
}

これを値丸め用にラップしたものが乱数に使われています。

int CS_rand(int Min, int Max){
  int range = Max - Min + 1;
  return (rand() % range) + Min;
}

なお、時間などを用いたシード値設定の処理は存在しないので、
ゲームのスタート時からフレーム単位で同じ動きをした場合全く同じ乱数が出ます。

調整方法

乱数の主な消費場所は以下の通りです。
  • 武器の発射の瞬間
  • 武器弾の移動中
  • 煙の発生
  • 画面揺れ効果
  • 一部のエフェクト
  • 多くのNPC
武器の発射が最も手っ取り早く柔軟に乱数を変動させられると思われます。
ただし発射の瞬間だけでなく武器弾が存在している間も変動の可能性があるので注意が必要です。
また、画面が揺れている最中などは常に乱数が変動しているため、例として聖域などは入るタイミングで調整できると思われます。

通常ゲーム画面以外のタイトル画面/メニュー画面などにおいて乱数が消費される場所は存在しません。
なので、調整は全て通常ゲーム画面内で行う必要があります。

確率データ

敵のドロップするアイテムの種類
  • ハート1/5
  • ミサイルを所持している場合 ミサイル1/5 経験値3/5
  • ミサイル所持していない場合 経験値4/5

その他

改造版製作における簡易的な乱数発生手段として以下のような方法があります。
  • 煙(スプライト番号4番)を発生させ少し待ったあとにそれが存在しているか調べる
  • 8800~8831のフラグを参照する(8800~8831はメモリにおいて0x49E1EC/ゲーム開始後経過フレーム数を指す)
    • ※0x49E1ECのタイマーはメニュー画面では停止しているため同じ数しか返さないので注意
最終更新:2018年08月12日 02:56