DQ3 モンスター出現数調整

バイナリwikiにも解説のある「モンスターの出現数を増やす方法」ですが、オリジナルのままで一切いじってなかったので変えてみました。

  • SR: $047C73 モンスター横幅計算?
047C90 ADC #$0002 A+=(#$0002+c) +4から変更

モンスター同士の隙間のピクセル?を4から2に変更します。

  • SR: $04797F ???
047BBD BCS #$14 if(c==on) goto $047BD3 19から変更
  • SR: $047F10 ???
0480D1 CMP #$19 A>=#$19? 19から変更

wikiによると、$047BBD,$0480D1のリミットは#$21とのことですが、手始めに1Cまでふやしてみました。#$19やら#$1Cというのは戦闘画面を8×8のタイル?を1単位としてみたときの横幅(32=256/8)のタイル数のことのようです。つまり#$21(=33)は超えられないということのようです。実際にどういう変化がおきるか見てみます。出現モンスターの数は定義上は画面の幅を考慮せずに設定できます。エンカウント直後は実際出現する数よりも多い数が7E200Xに設定されます。その後上記のSRを経て画面に収まるだけのモンスター数に調整される、ということのようですが、詳細は調べてないので不明です。

20091104022714.jpg

キメラ系が5体まで出現するようになりました。 なかなかいい感じです。しかし、その後いろいろなモンスターで動作確認していたところ、どうも一部のモンスターのスプライトが欠ける問題があることがわかりました。

20091104022713.jpg

ちょっとわかりにくいですが、ドラゴンの吐く炎の一部が欠けています。もう少し問題をはっきりさせるために、上記の#$1Cの部分を#$1Eに変えてみました。

20091104022712.jpg

明らかに一部の画像が欠けてますね。ちなみにこの現象はドラゴンのみ単独で出現した場合には発生しません。恐らく(OAMRAMから?)VRAM?に転送されるメモリの一部がモンスター種類が3種類以上になると転送しきれなくなるからなのではと想像がつくのですが、どう対応したらいいのか見当がつきません。というわけで#$19を#$1Cに変更する部分はペンディングということにします。

(11/4追記)
下の米欄のやり取りを見てもらうとわかると思いますが、どうやら#$19→#$1Cへの変更はSNESの仕様上無理なようです(pさんありがとうございました)。まあSFC最後期に出たDQ3でオリジナルの時点でそうなってるんですから冷静になって考えてみればどうしようもないんでしょう。もちろん「スプライト欠けなんかどうでもいい」という人は変更しても問題ないと思います(単に表示だけの問題なので)。ちなみに#$19というのは本当にリミットのようで#$1Aにしても↑の3枚目の画像の組み合わせでドラゴンが炎を吐くところでスプライト欠けが発生します。同じ理屈で言うとモンスター間の隙間を狭める(4→2にする)のもアウトなのですが、現状問題が発生しないのと自分が追加したモンスター「封魔石」が呼べるモンスターの数が少なすぎて脅威にならないという極めて勝手な理由で残してあります。不都合があれば元に戻すつもりです。

コメント

  1. p より:

    なんか「モンスター出現数調整」に米欄ないのでここから
    消える可能性としては
    ・1ラインに33個以上のスプライト
    ・1ラインに8×8単位で35個以上のスプライト
    ・敵用のOAMRAMへ転送するためのRAMのメモリ不足
    ・OAMRAM不足

    タイル数の多いライン+敵が動いてるときに特定のラインだけ表示されなければ上2つ

    逆にいつでも&どのタイルでも表示されないことがあるなら下2つ

    管理者より返信:

    ここは日毎にしかコメントかけないみたいです。(日を分けておけば良かった。スイマセン)

    さて、本題ですが、なんか上2つのほうが怪しそうですね。(実際にスプライトが欠けるのはほんの数瞬なので)となると、根本的な原因は、SNESのスプライト表示数の限界っていうことになるんでしょうか。となるとハードの制限ということでどうしようもなさそうですが。

  2. p より:

    DQ3のOAMRAMのためのRAMは$7EDB1F~$7EDD1E(+その後ろ$20)
    パッと見た感じ戦闘中は256タイル全てが敵用に割り振られてそう&順番に使用し、未使用RAMはY位置のみ#$E8に修正
    1.SNESGT辺りのメモリビューアで$7EDD10~$7EDD1Eを0で上書き
    2.タイル欠け発生させる
    3.RAM確認して0のままなら1ライン制限、0じゃなくなってたら256個全部使ってしまってる=OAMRAM不足

    管理者より返信:

    以前モンスター画像のデコードのところで教えてもらった情報と組み合わせて少しわかってきました。タイル欠けの発生している間に$7EDD11にブレークポイントを張ってみましたが書き込まれている様子はなく、$00のままでした。(この確認方法で合ってますかね?)この観察が正しいとなると問題は1ライン制限ってことで、これ以上はSNESの仕様でどうしようもないってことなんでしょうか。

  3. p より:

    非アクセス=タイル数は足りているはずなのでそれでおkかと

    システム上の問題なので解決はかなり面倒かつ非現実的ですね
    ・重ねて表示する絵を1枚絵にする(処理変更&容量大幅肥大)
    ・敵の処理順序を毎フレーム変更(チラつく)
    あとPPUでスプライトの表示順を変更できるけど、あれだと重ねて表示する部分の順序が逆になる可能性あるから没かな

    管理者より返信:

    やっぱりそうですか。まあ予想通りというか、可能ならオリジナルの時点で実現されてますよね。モンスター出現数を抑えるための難易度調整をタイル数で制限するとは考えにくいですし。情報ありがとうございました。

  4. i より:

    初めまして。お詳しそうなので、質問させて下さい
    24ピクセルのマドハンドを8匹出現させると、横に18ピクセル空きができます
    34ピクセルの爆弾岩は4匹までしか出現できず、横には54ピクセルも空きができています。詰めれば5匹入る筈ですが、基準がよく分かりません
    データ上のサイズをマドハンドと同じ24ピクセルにしても、画像が重なるだけでやはり4匹までしか出現しませんでした

    管理者より返信:

    爆弾岩が4体までしか出ないのはモンスター情報の「最大出現数」で4体までとなっているからだと思われます。エンカウント時のモンスター決定はいまいちはっきりとわからないのですが、幅との兼ね合いで出現数をカットするのは一番最後の処理なのではないかと。

  5. i より:

    連続投稿に気付きました。すみません
    お答えありがとうございます
    爆弾岩の画像をマドハンドに変更したところ
    マドハンドのように8匹出現させることができました
    匹数制限というのは、モンスターではなく画像ごとに決められているのでしょうか
    そのような情報はどこに記録されているのでしょうか

    管理者より返信:

    「最大出現数」はモンスター情報($020000-)の36バイト目1ビット目からです。

  6. i より:

    すみません。実はDQ6の方なんです
    互換が利くと思っていましたが、モンスターの構造体がまるで違うのですね
    DQ6のそれは、ご存じないでしょうか

    管理者より返信:

    DQ6はあまり良く知りません。http://www.geocities.jp/showa_yojyo/dq/dq6.htmlを見てみてください。

  7. i より:

    ありがとうございました

タイトルとURLをコピーしました