PS2版DQ5 いまさら調査

コードはRubyっぽく書いてます。書き方がフラフラしててすいません。

2017/11/03
味方への状態変化成功率を追加。
2017/10/01
アンリミテッド:出目表のプログラムへのリンクを修正したり当たり目一覧を追加したり。
2017/09/30
アンリミテッド:出目表を追加。
2016/01/23
PS版DQ7の先攻率のグラフを作ったついでにこっちでも作った。
2016/01/13
行動順値の分布が下に偏る例として挙げた除数を112000000から11200000に修正。一桁間違えてました!
2015/09/06
打撃ダメージシミュレータの痛恨の一撃で0除算エラーが発生するバグを修正。
2015/09/05
集中攻撃特性を追加。ついでにPS版DQ5 モンスターデータも更新。
2015/08/11
打撃ダメージシミュレータを妖精の剣に対応。
2015/06/28
エンカ域の境界を追加。

アンリミテッド:出目表

概要: PS2版DQ5の乱数は、Mersenne Twisterで実装されている。乱数の状態をメモリから取り出してMTをシミュレーションすれば簡単に無限に回転表を作れる(はず)んだから、そこからなんとかして現在地を特定すればノーリセでカジノ技できるんじゃね? というお話。

100C 10C(左端)
=
1C(左から2番目)
10C(左から2番目)
=
1C(左端)
10C(左から3番目)
=
1C(左から4番目)
10C(左から4番目)
=
1C(左から3番目)
出目表(1万回転まで) 100c-10k.txt 10c1-10k.txt 10c2-10k.txt 10c3-10k.txt 10c4-10k.txt
乱数 mod 16と出目の対応 0 77777 77777 77777 77777 77777
1 53254 77777 64354 36246 34323
2 55244 33536 25446 24422 23542
3 52333 22452 42222 42264 42325
4 43254 23225 66756 23322 33432
5 53222 53466 72433 65243 22246
6 52244 24456 45552 52534 36623
7 33664 43452 63323 36235 52532
8 26334 23726 55246 22423 43247
9 53225 23454 32453 43254 22323
A 65446 25622 64635 34335 35452
B 53334 33246 45226 25624 24234
C 53552 26453 72652 53452 62663
D 34333 63452 63464 64626 35223
E 53444 43326 35526 55323 24435
F 43555 22452 42433 43342 43232
パターン重複数 10010 00120 12000 12211 12232
出現回数 7 11111 22322 31211 11111 11112
6(BAR) 11111 11116 51215 22212 11211
5(スイカ) 92242 11171 15251 33122 12212
4(ベル) 21248 21811 42522 33334 33331
3(プラム) 29442 29111 22234 34433 54355
2(チェリー) 12622 82245 15343 43564 55555

参考文献

allgreenさんのスロットツール(現在は非公開)
readme.txtの参考欄にMersenne Twisterの記述あり(ということはこの人も無限に出目表作れてるよね……)。
スロット乱数制御研究  ドラクエ5 PS2版
そうこの雑記帳 DQ5カジノスロット1000回転以降に関してまとめ
5000回転までの出目表。
考察/スロット完全攻略/ドラゴンクエスト5攻略
考察力しゅごい。

集中攻撃特性

集中攻撃特性をもつモンスター

実際の例(ともしびこぞう)

ターン数馬車外メンバーともしびこぞうの行動
ABCD
1主人公打撃打撃メラメラ
2ヘンリー打撃メラ打撃メラ
3主人公・ヘンリー集中攻撃対象
ヘンリー主人公ヘンリー未設定
A
1T目で主人公に設定されるが、2T目の打撃でヘンリーに再設定される。
B
2T目の行動が打撃でないため、集中攻撃対象は主人公のままである。
C
2T目の打撃で初めてヘンリーに設定される。
D
1,2T目ともに打撃でないため、集中攻撃対象が設定されるのは3T目以降になる。選択率は通常の打撃被弾率と同じ8:6である。

エンカ域の境界

画像が多いため別ページへ。


行動順

spd * 0.5 + rand(0.0...spd*0.5) # spd * rand(0.5...1.0)

実数乱数について

上に挙げた式では省いているが、PS2版DQ5では0以上x未満の実数乱数を得るとき、以下のようにrand(0, 0xffffff) % (x * 100000).floorを求め、その剰余をまた実数に変換して100000.0で除算するという方法をとっている。

divisor = (x * 100000.0).floor # 除数
rand(0..0xffffff) % divisor / 100000.0 # 0xffffff = 16777215

行動順値計算ではxにspd*0.5が代入される。spdが低いうちはまだいいのだが、問題なのはspdが高いとき。最大でも16777215の被除数に対し除数がかなり大きくなり、その剰余つまり乱数の分布が下に偏ってしまう。分布が一様から最も遠ざかるのはspd224(x=112.0)付近のときか。このときの式の一部を抜き出すとrand(0..16777215) % 11200000とかやっている。ただし分布がいくら偏ろうが乱数の範囲そのものは変化しないため、spd2倍以上で確定先攻という原則が破られることはない。

下の表は行動順シミュレータで100万回試行した結果(「4 vs 3」はspd比が等しく除数が小さい時の比較対象;一様分布とほぼ変わりないことがわかる)。先攻率の差が相当広がる状況を想定したつもりだが、それでも先攻率が理論値から5.5%落ちる程度。ならそう問題視することもない? spdが高くかつ近いときは相手の分布も下に偏りがちだろうし、spdが離れているときは行動順値のとる範囲自体が重なりにくい。

素早さ224 vs 1684 vs 3
先攻率一様分布83.34%83.30%
実際の分布77.76%83.25%

打撃ダメージ計算でも実数乱数を求めることがあるが、高spd時の行動順値計算ほどの大きな除数は出てこない。せいぜいがatk/16.0*100000.0程度。

相手の素早さ別グラフ

行動順シミュレータ詳細版100万回試行結果。素早さの低いほうがまだ一様分布の曲線に近いことがわかると思う。

一様分布の場合(実際にはこうならない)
vs 親分ゴースト(素早さ20)
vs カンダタ(素早さ30)
vs ジャミ(素早さ50)
vs ブオーン・ミルド2(素早さ75)
vs ゲマ1(素早さ90)
vs はぐれメタル(素早さ150)

制限スロット

モンスターの行動スロットには、そのひとつひとつに「同グループ単位で1Tにつき1度しか選択されないフラグ」が設定されている。「賢さ」とはまた別のスロット再抽選要素であり、いわゆる「制限行動」はこれによって実現されている。以下、このフラグを「制限フラグ」、制限フラグの立っているスロットを「制限スロット」と呼ぶ(恐らく複数行動不可フラグと同じモノだが、ちょっと長いのでこう呼び替えさせてもらいました)。また、制限スロットの行動は"*"つきで表す。

行動確率の計算表はかなり大きいため別途Googleシートに示す。ここで挙げたモンスター以外の制限スロットを知りたい方はPS版DQ5 モンスターデータをご参照ください。

溶岩原人

攻撃*火炎攻撃*火炎*様子攻撃
重み111111
分布16.67%16.67%16.67%16.67%16.67%16.67%

既によく知られている「火炎の息≦2回/T」は火炎スロット2個とも制限スロットであるため。「様子を見る≦1回/T」も唯一の様子スロットが制限スロットであるため。

溶岩原人3匹のとき、火炎0:27.67%、火炎1:55.00%、火炎2:17.33%となる。ついでに火炎2+隊列4/4打撃は、火炎2+打撃:12.33% * 1/10 = 1.23%となる。

ホースデビル

攻撃*メラ攻撃メラ攻撃攻撃
重み685848382717
分布26.56%22.66%18.75%14.88%10.55%6.64%

溶岩原人の火炎の息は2スロットとも制限スロットだったのに対し、ホースデビルのメラミは制限・非制限スロットが混在している。行動の制限は行動種別単位ではなくスロット単位で行われるため、スロット2選択後はスロット4のほうだけ残ってメラミ選択率が低下するのに対し、スロット4選択後はスロット2,4ともに残るため選択率はそのまま据え置きになる。このようにスロット次第でその後のメラミ選択率が変化するものの、ホースデビルの唱えたメラミがどちらのスロット由来なのか判別する方法はない。

3匹グループの場合、メラ0:24.41%、メラ1:52.48%、メラ2:20.80%、メラ3:2.31%となる。ホースデビルのメラミに似たパターンに、ブリザードマン(凍える吹雪:*凍える吹雪:攻撃:攻撃:*ヒャダルコ:攻撃 = 1:1:1:1:1:1)の吹雪などがある。

ゲマ1

*激炎マホ攻撃*メラ攻撃*メラ
重み111111
分布16.67%16.67%16.67%16.67%16.67%16.67%

制限フラグは2匹以上のグループだけに適用されるものではない。1匹グループであっても、そのモンスターが2回行動するならその2回目の行動に適用される。2回行動のあるボスはブオーンとミルド2とエスタークを除き、制限フラグによってなにかしら行動の制約を受けている。ゲマ1もそのうちのひとつ。

激しい炎は24.44%で≦1回/T。メラゾーマはスロット2個とも制限スロットであるため、メラ1:42.22%に対しメラ2:3.33%とかなり落ちる。また、マホカンタ状態だと賢さ2のゲマ1はマホカンタのスロットを除外するため、激しい炎:29.00%、メラ1:48.00%、メラ2:5.00%と全体的に確率が上昇する。

2回行動の合間にマホカンタが解けたり、メラが選択されない味方単騎マホカンタ状態の行動確率はめんどいのでなし。

トンネラー

*助け攻撃*助け攻撃攻撃攻撃
重み------
分布*助け→攻撃→*助け→攻撃→攻撃→攻撃

最後にローテーション行動を行うモンスターが影響を受ける例を挙げる。トンネラー2匹グループ時の1T目からの行動を以下に示す(テーブル書くのめんどい):

# 0:攻撃、1:助け
A	10100010100010100010
B	01000101000101000101

1T目にBの方がスロット1を飛ばされているのがわかる。前述したように行動はスロット単位で制限されるため、Aに取られたスロット1をBは選択できない。このときBは再抽選ではなくローテ上の次のスロットであるスロット2を選ぶ。1T目にBのローテーションがズラされたことにより、その後は制限スロットが重なることなく安定してローテーションが回る。なおこいつは賢さ0なのでモンスターを呼べない状況でも構わず「助けを呼ぶ」を行う。そのため仲間呼びスペース不足によるローテーション崩れは起きない。行動パターンが同じ「ローテーションA」でも賢さ2のマドハンド(仲間(ゴーレム)→仲間→仲間→攻撃→仲間(ゴーレム)→攻撃)ならまたややこしい行動をとるかもしれない。

制限フラグが設定されているスロットは驚くほど多いが、同時にそれが死にステと化しているモンスターも多い。単体のグループでしか出現しないデッドエンペラーの「いかづちの杖」然り、ゴンズさんの「武器を振り回す」然り・・・


打撃ダメージ計算式

打撃ダメージシミュレータ(要Ruby)
調査の成果。キラーピアス等の2回攻撃武器以外ほぼ全ての場合に対応できると思います。
ただ、浮動小数点数の精度がPS2は単精度、Rubyは一般的に倍精度で、そのため結果にズレが生じることがあるようです。実際、それによる魔神の金槌のダメージ範囲のズレを確認しました。
基本値 = (atk - def/2.0) / 2.0
種類条件計算式
通常攻撃式1
基本値 > 0.5 && 基本値 > atk/16.0 && atk > def/2.0
基本値 + rand(0.0...基本値/8.0) - 基本値/16.0 + rand(0.0...2.0) - 1.0
式2
基本値 > 0.5
rand(0.0...atk/16.0)
式3
基本値 <= 0.5
rand(0.0...1.0) < 0.75 ? 1 : 0
会心の一撃(1/64)
(atk * (rand(95...105) / 100.0) + 0.5).floor
魔神の金槌(1/2)
(atk * (rand(95...106) / 100.0) + 0.5).floor
痛恨の一撃(1/4)
(atk + rand(0...atk/20) + 0.5).floor

省略やはったりもあるがだいたいこんな感じ。式1〜3はこの後にも属性武器やバイキルト等の計算が続く。会心・魔槌・痛恨はこのままのダメージが出る。


通常エンカのモンスターの初期HP

base = mhp * 0.85
incr = mhp * rand(0.0...0.15)
hp = (base + incr + 0.5).floor # (mhp * rand(0.85...1.0)).round

下限は(mhp * 0.85).round。一様分布ではない。

メタル系の初期HP分布

メタルスライム(mhp5)の初期HPが4である確率は、それをpとおいて 5 * (0.85+0.15p) + 0.5 < 5 を解き、0 <= p < 1/3 より1/3。はぐれメタル、メタルキングについても同様に求められる。

mhp不等式初期HP分布
mhp-1mhp
メタルスライム5mhp * (0.85+0.15p) + 0.5 < mhp0 <= p < 1/333.33%66.67%
はぐれメタル60 <= p < 4/944.44%55.56%
メタルキング70 <= p < 11/2152.38%47.62%

隊列別打撃被弾率

生存人数1列目2列目3列目4列目
4人重み8642
分布40.00%30.00%20.00%10.00%
3人重み864-
分布44.44%33.33%22.22%-
2人重み86--
分布57.14%42.86%--

呪文のほうはどうやら等確率らしい。


逃走成功率

成功率に関わるのは全体/個人逃げ問わず「にげる」の試行回数のみ、確定逃げなし。まあ月並みな結果。

試行回数1234〜
成功率1/21/23/47/8
分布50.00%25.00%18.75%6.25%

ベラ

行動パターン
ベラの基本行動比率はモンスターの「確率依存3」と同じく、ホイミ:攻撃:ルカナン:ギラ:攻撃:マヌーサ = 200:40:8:4:3:1
行動の再抽選
モンスターのような再抽選は発生しない。ホイミ対象がいない状況でホイミが選択された場合、ベラは攻撃を行う。つまりホイミの選択率がそのまま攻撃選択率に加算されるかたちになる。
行動ホイミ攻撃ルカナンギラマヌーサ
重み20040+3841
分布基本78.13%16.80%3.13%1.56%0.39%
ホイミ対象なし-94.92%3.13%1.56%0.39%
ルカナン対象なし78.13%16.80%-4.69%0.39%
(通常再抽選が発生する状況で、ベラはホイミの代わりに攻撃を、ルカナンの代わりにギラを使用することから、ひとつ後ろに選択スロットがズレる仕様と考えられる)
ルカナン選択率
再抽選がないのでMP切れなどの邪魔がない限り常に8/256=3.13%
ホイミ条件
hp < [mhp / 2.0]
mhpが奇数の場合、hp = (mhp-1) / 2 のとき(25/51など)は条件を満たさないことに注意。
ホイミ優先順位
主人公=ボロンゴ>ベラ
主人公とボロンゴがともに条件を満たす場合は1:1で決まる。ベラが自分自身を回復するのは、条件を満たすのがベラしかいない場合に限る。

ゆきのじょおうは おおきく いきを すいこんだ。

雪の女王(atk50)の力ため打撃がベラ(def31)に命中した場合のダメージ分布(シミュレータ100万回試行):

ダメージ確率
300.16%
310.18%
322.60%
332.57%
347.37%
357.44%
3610.82%
3710.70%
3811.48%
3911.44%
409.02%
419.03%
426.63%
434.25%
444.24%
450.83%
460.83%
470.42%
平均38.3086
範囲30..47
38以上58.17%

計算に必要な他のパラメータは、

雪の女王3n+1T打撃選択率
1/2
隊列3/3打撃被弾率
2/9
ベラみかわし率
1/6

以上より、雪の女王の力ため直後のターンにHPまんたんのベラが死ぬ確率が求められる。

1/2 * 2/9 * 5/6 * 58.17% = 5.39%

これはひどい。ぼくとか即死率が5割を超えてるとは思わなかったですね。


味方への状態変化成功率

基本成功率(%) (一部の攻撃のみ)
攻撃\対象人間仲間モンスター(耐性別)
完全
マホトラ10010080330
ルカニ1001006410.890
メガンテ1005035150
ラリホーマ75100100660
ルカナン701006410.890
マヌーサ
砂煙
62.55035150
ザキ
ザラキ
マホトーン
ラリホー
甘い息
おたけび
毒の息
37.55035150
メダパニ255035150
焼け付く息12.55035150
特殊装備
装備倍率効果対象
状態変化攻撃
エルフのお守り1/4 即死
マヒ
不気味な光
眠り
呪文封じ
混乱
-
黄金のティアラ1/2
メタルキングの盾1/2 即死
混乱
マヌーサ
ラリホー
ラリホーマ
天使のレオタード1/2即死-

敵に対する状態変化成功率は恐らく全てマホトラと同じ(ラリホーマのみ[その倍, 100%].minか)だが、味方に対する状態変化成功率は攻撃によって異なる。

判定処理の疑似コード。謎の分岐により成功率は「基本成功率 * 特殊装備倍率」よりもコンマ数%だけ高くなるが、無視してよい。

def hit_state?
  rnd = rand(0..0xffffff) % 1000
  limit = (基本成功率 * 特殊装備倍率 * 10).floor

  # 乱数に0x10のビットが立っていると条件を反転(なぜ?)
  if rnd & 0x10 != 0
    1000 - limit < rnd
  else
    rnd < limit
  end
end

状態変化の持続

行動回数12345678910平均
マヒ解除率00001/83/85/81116.63
分布0.00%0.00%0.00%0.00%12.50%32.81%34.18%20.51%0.00%0.00%
眠り解除率03/85/87/81111112.89
分布0.00%37.50%39.06%20.51%2.93%0.00%0.00%0.00%0.00%0.00%
マヌーサ解除率00003/85/87/81115.89
分布0.00%0.00%0.00%0.00%37.50%39.06%20.51%2.93%0.00%0.00%
マホトーン解除率0000005/86/87/817.48
分布0.00%0.00%0.00%0.00%0.00%0.00%62.50%28.13%8.20%1.17%
メダパニ解除率000001/83/85/8117.63
分布0.00%0.00%0.00%0.00%0.00%12.50%32.81%34.18%20.51%0.00%
マホカンタ解除率000005/86/87/8116.48
分布0.00%0.00%0.00%0.00%0.00%62.50%28.13%8.20%1.17%0.00%
眩しい光解除率4/81111111111.5
分布50.00%50.00%0.00%0.00%0.00%0.00%0.00%0.00%0.00%0.00%

参考文献