ファミリーコンピュータ版ドラゴンクエスト2の乱数生成について解説しています。筆者が独自に解析した結果なので、間違いが含まれる可能性もあります。
ドラゴンクエスト2の乱数には、CRC が使われています (CRC-XMODEM と呼ばれるもののようです)。JavaScript のソースで表すと、以下のようになります (ある程度解かりやすいように最適化しています)。
var crc = 0 function crcUpdate(data) { crc ^= data << 8 for (var i = 0; i < 8; ++i) { crc <<= 1 if (crc & 0x10000) { crc ^= 0x11021 } } }
乱数を求める場合、255 を渡して CRC 値を2回更新します。基本的には下位 8 ビットを使用し、乱数の範囲は 0〜255 ということになります。周期は 32767 で、245 が 127 回、それ以外の値が 128 回出るようです。
なお、他のシリーズでも、ほぼ同様のルーチンで乱数を求めているようです。また、復活の呪文や冒険の書にも、CRC が使われているそうです。
JavaScript を使って、乱数生成をシミュレートします。NEXT ボタンを押すたびに、乱数が1つ進みます。
ドラゴンクエスト2では、ダメージや HP の回復量を、すべて同じルーチンで算出しています。
まず基準となる値を求めます。これは、呪文や特殊攻撃、道具の場合は固定です。通常攻撃の場合は「攻撃力 − 守備力 ÷ 2」(端数切捨て) となります。
攻撃呪文 | |
---|---|
行動 | 基準値 |
ギラ | 40 |
ベギラマ | 50 |
バギ | 50 |
イオナズン | 130 |
回復呪文 | |
行動 | 基準値 |
ホイミ | 64 |
ベホイミ | 128 |
道具 | |
行動 | 基準値 |
まどうしのつえ | 40 |
いかづちのつえ | 50 |
いなずまのけん | 55 |
ちからのたて | 128 |
やくそう | 100 |
いのりのゆびわ | 44 |
モンスターの行動 | |
行動 | 基準値 |
ギラ | 24 |
ベギラマ | 50 |
イオナズン | 130 |
炎(弱) | 24 |
炎(中) | 50 |
炎(強) | 140 |
次に乱数を求めます。この値は、0〜15 の乱数を 16 回求め、その合計に 8 を足したものになります (0〜15 の乱数は、上記のルーチンで求めた乱数の下位 4 ビットを使用して求めます)。乱数の偏りがなければ 8〜248 となりますが、実際には 54〜197 になります。
最終的な威力は、「基準値 × 乱数 ÷ 256」で求められます。
JavaApplet を使って、威力の分布をグラフで示します。急ごしらえなのでわかりにくいと思いますが、横に威力、縦に確率を取り、赤がその値が出る確率、緑がその値以上が出る確率となります。ボタンを押すことで、威力の基準値を変えられます。