忍者ブログ

データ置き場

ニコ生RTA放送を見ていて湧いた疑問を調査してアップするかも。ほぼドラクエのみを扱うブログ風のマニアックなサイト

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

大灯台2F宝箱のグレムリンバグ遭遇時の対処法(SFC版DQ1・2)

2014.01.19追記: 手っ取り早くバグの対策をしたい場合は最近公開した判定ツールを使う事を勧めます。

【グループ分けに関するメモリ(Kriさんが発見されました)】
メモリアドレス7E0F3D以降に出現した敵のグループ番号(0,1,2,...)が格納される。
7E0F3Dは左端の敵に、7E0F3Eはその右隣の敵に対応している。
取りうる値の範囲は7E0F3Dから順に0,0-1,0-2,0-3,0-4,...となる(チートを使用した場合この限りではない)。
通常戦闘ではこのメモリがエンカウントするたびに書き換わる。
敵の出現数と同じだけ書き換わったり、後ろの方のメモリまで書き換わったりする詳細は不明である
敵を選択後サイズ計算して溢れた場合に、出現していない敵のグループ番号が設定される

出現した敵が4体でメモリが0,1,1,2の場合はグループ0が1体(左端)、グループ1が2体、グループ2が1体出現する。
つまり値(グループ番号)が同じ敵は同グループとなる。
攻撃対象のウィンドウにはグループ番号が0のものから順に表示される。
DQ2groupNo.png

【グレムリンバグの発生条件(攻撃対象選択バグ)】
大灯台2Fの宝箱を開けると出現するグレムリン4体の戦闘では、前述のメモリが書き換わらず、直前のエンカウントと同じ状態となっている。
グレムリンバグは7E0F3D-40にある4つの値を並び替えても連続にならない場合に起こる。
例えば1がない0,0,0,2や、2がない0,1,1,3の場合である。
一例をあげると「ゴーゴンヘッド2体,サーべウルフ1体,ミイラ男1体」のエンカウントで"0,0,1,2"となり、
グレムリン4体との戦いの直前に「ドラゴンフライ3体」に遭遇して"0,0,0,2"となった場合である。

余談だが、敵IDの同じ敵が出現した場合、アドレスが若い方から順にA,B,Cと名前にアルファベットが付けられるため、
グループ分けメモリが0,1,0,0となるとグレムリンA,C,Dがグループ0に、グループ2にBが割り振られ、
「せんせー、グレムリンBくんが仲間はずれです!」
とみんなに言われてしまうとか…。

【グレムリンバグの症状】
このバグが起こると出現時のメッセージに表示されていない敵の名前が出ることがある。
画面にはグラフィックが4体分表示されているのに、攻撃対象選択欄には合計で2体か3体しか表示されない。
さらに敵を選択する攻撃(呪文や道具も含む)を行うとフリーズする可能性がある。
それは行動前に選んだグループが全滅していた場合であり、「〇〇のこうげき!」と表示されたままフリーズする。
(ムーンブルクがバギを選択していてもこうげきと表示される)
対象選択欄に表示されたグレムリンを無事に倒し終わると対象選択欄に名前が表示されなくなる
そのまま対象選択欄にカーソルを持って行くと上下に動かすことができるが、選んでもたいてい行動順が回ってきた時点で同様にフリーズする。

【グレバグ遭遇時の対処法】
しかし、実は攻撃対象をうまく選択すればフリーズを避けることができる。
このときの選択欄はカーソルの初期位置がグループ0,その下がグループ1,グループ2,...となっているからである。
つまり、登場時に表示されるグループ数から残りのグレムリンのグループ番号を推定し、
攻撃対象の名前が消えたあとに対応する箇所を選べばよいのである。
RTAなどの低レベル攻略で万が一バグに遭遇してもこの方法で対処することができる。

~対処法~
ベギラマなどの全体攻撃があればなるべくそれだけでダメージを与える。
それ以外の場合、戦闘開始時に攻撃対象が何グループ表示されたか確認する。
全体攻撃以外の攻撃をする場合、行動前に攻撃対象に選んだグループが全滅しないように注意する。
『攻撃対象の名前が消えたあとの敵の選択方法』
最初に1グループだけ表示されていたのであればカーソルの初期位置から3番目を選択すればフリーズしない。
最初に2グループ表示されていたら4番目を選択すれば良い。
カーソルの位置がわからなくなったらBボタンを押して選択し直せば問題ない。
『例外』はチート使わなければたぶんメモリが0,0,0,3の時だけ。
この場合はグループ3が残っているので4番目を選ぶ。
直前のエンカが4体4グループ→単一グループ3体(**)の場合
(ただし、間に2匹のエンカウントが発生したりした場合も起こりうる)
カーソルの初期位置から『(グループ番号格納メモリの値)+1』番目の敵を選択すればフリーズしないと言える。

(**; 追記にて大灯台2F以上では"単一グループ"にあたるドラゴンフライが3体出た場合だけ注意すれば良いとわかりました。)

↓検証に使った例
・1グループ2体のみ表示
0022         →3番目を選択
・1グループ3体のみ表示(*)
0020 0002      →3番目を選択
0003          →4番目を選択
・2グループ表示
0023 0113 0103 0013 →4番目を選択
(*; 選択欄から名前が消えたときに3番目か4番目かどちらを選べば良いのかわからなくなってしまう。)

【グレムリン戦突入前の注意】
といっても直前のエンカウントが単一3体(**)にならないように注意するだけである。
この場合、バグるとメモリが0002か0003か不明なため。

(**; 追記にて大灯台2F以上では"単一グループ"にあたるドラゴンフライが3体出た場合だけ注意すれば良いとわかりました。)
PR

SFC版DQ2のフィールドマップ、ルプガナ~世界樹のルート取り

自分でマッピングしたフィールドマップに、遠藤さんのサイトにあったエンカウントエリアと、出現モンスターのリストを対応させたもの
マップダウンロード(ods)
最新版:dl.dropbox.com/u/24283494/DQ12fieldmap_monsterver2_4.ods
sheet1はコメント欄常に表示。sheet2はカーソルを重ねれば表示。
Lapse Pointer さんのサイトで出現パターンの決定アルゴリズムが記載されている
http://www.geocities.co.jp/Playtown-Darts/8566/dq/dq2info.htm#3

ルプガナ~ザハン~ローレシア~炎の祠~世界樹のルート取り
バピラスエリアを極力避けようとする場合の理想的なルート取り
(多少危険でも直前でエンカウントしたりリザードフライ4体が出たりする事もあるので、どちらが良いと考えるかは人それぞれ)
ザハンからバピラスエリアを避けて西へ進むと周りに目印がない。
聖水を記載の位置で使用すればメッセージの出た位置で北上すればエリア外を通ることができるはず。
ただし、実際に確認はしていない。

追記:マップの最新版を併記

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
カレンダー
10 2017/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
プロフィール
HN:
bamboo
性別:
非公開
自己紹介:
2010年の3月ごろニコニコ生放送のゲーム放送でRTAを知ってよく見るようになった。
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog
バーコード
ブログ内検索
カウンター
忍者アナライズ
  Copyright 2017 データ置き場 All rights reserved.
Template Design by LockHeart|powered by NINJA TOOLS 忍者ブログ [PR]