DQ1・2モンスターの行動率
DQ1・2
行動は8種登録されていてそれぞれの行動に確率が設定されている。
ROMの5DA0Eからモンスター毎に各種パラメーターが格納されている。
13バイト目、上位3ビットにそのモンスター行動タイプ(行動パターン)が記されている。
不思議なことに、8タイプしかないのに魔道士やダースドラゴンなどそのモンスター専用に設定されているものもある。
解析はGeiger’s Snes9x Debugger Mark 9などの逆アセンブルツールを使った。
初めて行う解析方法なのでプログラムの解読はネットで調べながら・・・。
事前に行動タイプを調べ、対象モンスターにエンカウントした状態で上記のデータが格納されたアドレスをブレークポイントに設定し、命令をSTEP INFOなどで書き出していった。
行動率が等確率でない場合、行動番号に対応した数字0-7を$7E3000から順に書き込んでゆく操作がなされていた。
書き込む回数をあるアドレスから読み取り、その回数だけ数字を書き込み、最終的に256個のリストを作っている。その後、0-255の乱数を生成し、リストから対応する行動を選択していた。
たぶんリスト作成は1ターン目のみ行われる。
結果をまとめたものが以下のもの。
ダウンロード(モンスターの行動率)
行動タイプ5と7のローテーションは行動1から順に選択してゆくもので違いがあるのか確認できていない。
行動1から8に設定されている行動については遠藤慎悟さんのサイトにまとめられている。
DQ1・2
http://s-endo.skr.jp/dq_analyzer.html#Description-DQ12
・おまけ
乱数の取得は$E2(メモリ内のアドレス)の値がよく使われているようだが、
タイプ6の2択の場合は$67の最下位1ビットを乱数として利用している。
乱数生成の流れは
$E0にある4バイトのデータを3倍する。
3549h(16進数)足し、ここでの繰り上がり分は一番低い桁に加算(ただし16進数)。
$67にある2バイトの値を足す。
$E2(1バイト)を乱数として取り出す。
多分このような感じだが、実際に表計算ソフトで計算するいくつかの桁が1多かったり少なかったりした。
多分繰り上がりとかの処理が間違っている可能性が高い。(理解不足)
$E0(1バイト)だけでなく、$67(1バイト)も毎フレーム変化するので、
乱数生成に関係したサブルーチンは他にもあると思われる。
乱数生成
http://s-endo.skr.jp/gameprog_analysis.html#Technical_Data-DQ12
ROMの5DA0Eからモンスター毎に各種パラメーターが格納されている。
13バイト目、上位3ビットにそのモンスター行動タイプ(行動パターン)が記されている。
不思議なことに、8タイプしかないのに魔道士やダースドラゴンなどそのモンスター専用に設定されているものもある。
解析はGeiger’s Snes9x Debugger Mark 9などの逆アセンブルツールを使った。
初めて行う解析方法なのでプログラムの解読はネットで調べながら・・・。
事前に行動タイプを調べ、対象モンスターにエンカウントした状態で上記のデータが格納されたアドレスをブレークポイントに設定し、命令をSTEP INFOなどで書き出していった。
行動率が等確率でない場合、行動番号に対応した数字0-7を$7E3000から順に書き込んでゆく操作がなされていた。
書き込む回数をあるアドレスから読み取り、その回数だけ数字を書き込み、最終的に256個のリストを作っている。その後、0-255の乱数を生成し、リストから対応する行動を選択していた。
たぶんリスト作成は1ターン目のみ行われる。
結果をまとめたものが以下のもの。
ダウンロード(モンスターの行動率)
行動タイプ5と7のローテーションは行動1から順に選択してゆくもので違いがあるのか確認できていない。
行動1から8に設定されている行動については遠藤慎悟さんのサイトにまとめられている。
DQ1・2
http://s-endo.skr.jp/dq_analyzer.html#Description-DQ12
・おまけ
乱数の取得は$E2(メモリ内のアドレス)の値がよく使われているようだが、
タイプ6の2択の場合は$67の最下位1ビットを乱数として利用している。
乱数生成の流れは
$E0にある4バイトのデータを3倍する。
3549h(16進数)足し、ここでの繰り上がり分は一番低い桁に加算(ただし16進数)。
$67にある2バイトの値を足す。
$E2(1バイト)を乱数として取り出す。
多分このような感じだが、実際に表計算ソフトで計算するいくつかの桁が1多かったり少なかったりした。
多分繰り上がりとかの処理が間違っている可能性が高い。(理解不足)
$E0(1バイト)だけでなく、$67(1バイト)も毎フレーム変化するので、
乱数生成に関係したサブルーチンは他にもあると思われる。
乱数生成
http://s-endo.skr.jp/gameprog_analysis.html#Technical_Data-DQ12
追記
調査に使ったROMデータはヘッダーを削除して使用していたため、表計算ソフトに記載している行動確率のアドレスが通常と違う。
200h足せば通常のROMデータのアドレスに対応する。(上記のステータスの開始アドレスはそのままでok)
行動タイプ1~4: 05912B, 059130, 059145, 059151
追記2
追記2
ソロ状態の悪魔神官の行動率が実測と解析で開きが出た。
[No.070(46): あくましんかん]
No. 行動
01: ザオリク
02: ザオリク
03: イオナズン
04: ザオリク
05: ルカナン
06: イオナズン
07: スクルト
08: (攻撃)
ローレシア城の牢屋にいる悪魔神官の行動を実機で159ターン調査した結果(%)
イオナズン 47.8
ルカナン 16.98
スクルト 13.84
攻撃 21.38
解析結果(%)
イオナズン 47.76
ルカナン 22.39
スクルト 16.42
攻撃 13.43
※ザオリクを除外。
カイ2乗平均10.2、自由度3なので有意水準を5%(7.81)としていれば解析結果と一致しないといえる。
有意水準を1%(11.34)としていれば一致しないとは言い切れない。
(統計的な処理。ネットをあさった程度の知識)
⇒煮え切らない
乱数の生成に偏りがあるのか、サンプル数が少ない(誤差の範囲内)のか・・・・?
追記3(2011.04.11)
実機での調査はローレシア城地下の牢屋にいる悪魔神官と低レベルで戦って行動を集計したものである。
行動を何度かさせるたびに乱数の初期化のプロセスを経るため多少偏りがあった可能性がある。
追記4(2011.09.22)
後の解析で行動決定では条件を満たさない行動を選択することがあり、その敵の行動時に再度乱数計算して最大8回まで再選択することがわかっている。8回目も実行できない場合には通常攻撃に変更される。
敵の行動再選択について
再選択を考慮するとある行動を取る確率は等比数列の和で表現できる。
通常攻撃以外の行動では、
S(8)=A(1-X^8)/(1-X)
再選択がある時の通常攻撃はこれにX^8を加算し、
S(8)=A(1-X^8)/(1-X)+X^8
となる。
A; 対象となる行動の規定の確率, X; 再選択される確率(再選択)
規定の確率は再選択されない行動のみで算出した確率
調査に使ったROMデータはヘッダーを削除して使用していたため、表計算ソフトに記載している行動確率のアドレスが通常と違う。
200h足せば通常のROMデータのアドレスに対応する。(上記のステータスの開始アドレスはそのままでok)
行動タイプ1~4: 05912B, 059130, 059145, 059151
追記2
追記2
ソロ状態の悪魔神官の行動率が実測と解析で開きが出た。
[No.070(46): あくましんかん]
No. 行動
01: ザオリク
02: ザオリク
03: イオナズン
04: ザオリク
05: ルカナン
06: イオナズン
07: スクルト
08: (攻撃)
ローレシア城の牢屋にいる悪魔神官の行動を実機で159ターン調査した結果(%)
イオナズン 47.8
ルカナン 16.98
スクルト 13.84
攻撃 21.38
解析結果(%)
イオナズン 47.76
ルカナン 22.39
スクルト 16.42
攻撃 13.43
※ザオリクを除外。
カイ2乗平均10.2、自由度3なので有意水準を5%(7.81)としていれば解析結果と一致しないといえる。
有意水準を1%(11.34)としていれば一致しないとは言い切れない。
(統計的な処理。ネットをあさった程度の知識)
⇒煮え切らない
乱数の生成に偏りがあるのか、サンプル数が少ない(誤差の範囲内)のか・・・・?
追記3(2011.04.11)
実機での調査はローレシア城地下の牢屋にいる悪魔神官と低レベルで戦って行動を集計したものである。
行動を何度かさせるたびに乱数の初期化のプロセスを経るため多少偏りがあった可能性がある。
追記4(2011.09.22)
後の解析で行動決定では条件を満たさない行動を選択することがあり、その敵の行動時に再度乱数計算して最大8回まで再選択することがわかっている。8回目も実行できない場合には通常攻撃に変更される。
敵の行動再選択について
再選択を考慮するとある行動を取る確率は等比数列の和で表現できる。
通常攻撃以外の行動では、
S(8)=A(1-X^8)/(1-X)
再選択がある時の通常攻撃はこれにX^8を加算し、
S(8)=A(1-X^8)/(1-X)+X^8
となる。
A; 対象となる行動の規定の確率, X; 再選択される確率(再選択)
規定の確率は再選択されない行動のみで算出した確率
PR
Comment form
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
最新記事
(12/18)
(04/18)
(09/15)
(09/11)
(06/21)
プロフィール
HN:
bamboo
性別:
非公開
自己紹介:
2010年の3月ごろニコニコ生放送のゲーム放送でRTAを知ってよく見るようになった。
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
ブログ内検索
最古記事
(09/17)
(09/17)
(09/18)
(02/04)
(02/07)
カウンター
忍者アナライズ