07/20
_ [DQ9] ホイミテーブルを途中から調べられるか
確実に錬金やオーブを取るのに使う、ホイミテーブル。これを調べるために、ホイミ回復量やリッカの宿の泉のアイテム確認などいくつかのツールがあります。
これらのツールを使うためには、基本的には直前にDSの電源on、またはDSiではタイトル画面に戻る必要があります。この作業がちょっと面倒で、できれば途中から調べられないかと思ってみました。
ホイミテーブル計算式
このような式で表されるようです。ホイミ1回から100回までのテーブルです。
seed = 0x32743 # 0x32700..0x327ff 100.times do |i| seed = (seed * 0x5d588b656c078965 + 0x269ec3) & (2**64 - 1) printf("%2d: %5.2f%%\n", i+1, (seed >> 32) * 100.0 / 2**32) end
内部的に64bitの整数を持っています。そのうち上位の数桁がホイミの回復値などに使われると。
話を簡単にするために、クリア後の泉のアイテムで。14種類のアイテムが出てきて、うち12個が出現率1/16、2個が出現率1/8。すると1回のアイテムを拾った時の情報量は、3.75bit ほど。64bit の情報を得るためには、最大14個の落ちているアイテムでは足りません。それに、もし出せるまでホイミを繰り返したとしても、どう逆算して求めればいいかと。
初期シードが 0x32700..0x327ff の間というのを条件に、1000個とか10000個とかのマップを事前に用意しておくと、少しは調べやすくなります。しかし、範囲を広げるほど、必要な調査の数も増えるわけで。
はい、リセットした方が早いと思います(汗)。最初ならたったの256通り、8bit。
逆にシードが分かっていて戦闘などでホイミテーブルの位置を見失ったときのために、その位置を調べるツールがあります。これは便利だなぁと。
青宝箱テーブル
ちなみに、青宝箱の乱数っぽいものはこちら。ゆりっぺ地図4Fの右上にあるグループ9(Aランク)宝箱の、7秒〜30秒まで。1%単位で何かのアイテムとの対応関係があります。
def dq9_rand(seed, n = 1) n.times do |i| seed = (seed * 1103515245 + 12345) & (2**32 - 1) end (seed >> 16) & 0x7fff end map = 0x7FE0 # yurippe floor = 4 # 3.. type = 1 # 1..3 seed = map + floor - 5 (7..30).each do |sec| printf("%2d: %2d%%\n", sec, dq9_rand(seed + sec, type) * 100.0 / 0x8000) end
この式から、去年の日記に書いた [パンドラボックスに挟まれるソーマとげんま] のようなテーブルに。この結果からなら逆算できるかなと思っていました。
しかし、ホイミテーブルはしっかり乱数していましたと。
最後に
Wi-Fiショッピングのための乱数調整ツールを作っている方もいるそうです。解析する方は本当にどうやっているのだろうかと。それらの方々のお陰で、装備品コンプリートまでは現実的に思える難易度になっています。多分。最初は絶対無理だろうと(汗)。
DQ9の凄い所って、こう、乱数テーブルの知名度を上げたことにあるのではないかと思ってみました。 ...それは言い過ぎ?(汗)