ファミリーコンピュータ版ドラゴンクエスト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 を使って、威力の分布をグラフで示します。急ごしらえなのでわかりにくいと思いますが、横に威力、縦に確率を取り、赤がその値が出る確率、緑がその値以上が出る確率となります。ボタンを押すことで、威力の基準値を変えられます。