トップ «前の日記(07/19) 最新 次の日記(07/24)» 編集

hossy online - といぼっくす

ゲームの感想日記、たまにIT・プログラミングの話


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の凄い所って、こう、乱数テーブルの知名度を上げたことにあるのではないかと思ってみました。 ...それは言い過ぎ?(汗)