DQ3 固定長データ「モンスター」のフィールドの有効活用の調査

実のところ改造作業は一応プチプチと継続中ではあるものの、このサイトの更新ネタとして特に取り上げるネタもなく、断続更新に移行中なわけですが*1、最近「移動呪文」「戦闘呪文」のレコードサイズを増やす作業をしたりと、「横幅(レコードサイズ)が足りねえなあ」と思うことが多くなってきました。「移動呪文」や「戦闘呪文」はレコード数が大して多くないのと、プログラム中で参照されている場所が極めて限定的なため、比較的安全な作業なわけですが、「モンスター」「アイテム」「戦闘行動」といった参照される場所が極めて多いデータについてはレコードサイズを増やすというのはやって出来なくはないですが作業量が多く、確認作業も厄介です。というわけで、現実的な解決策は、「使用される可能性の少ない場所を有効利用する」ということになります。開発のベースであるDQ3 Extendedでも、アイテムに関しては追加職業用の装備・使用可能フラグのために他を削って使いまわしたりしていますが、やることは基本同じです。今回は取り上げませんが、もう1つの手としては、「別の場所に追加フィールド専用の固定長レコードを定義する」があります。追加したい要素が多い場合はこっちの手を使ってもいいかもしれません。ROM拡張によって余裕は十分にあるのでそのへんはお好みということで。というわけで順番に見ていきます。アドレス等はDQ3 Extended ver1.43以降をベースにします。

  • 1バイト目 2~7ビット目(5ビット) 固定文字列ID(モンスター名)

DQ3 Extendedはあらかじめ追加モンスターについても固定文字列IDを割り当てているため、256レコード全てについて、最大7ビットまでしか使用しません。なので、上位5ビットは空いているといえば空いているのですが、戦闘中以外に格闘場でも使われると思われるので、変更範囲が多少広くなる可能性があります。使える領域はかなり大きいものの、正直あまり気が進みません。

  • 6バイト目 7ビット目(1ビット) 攻撃力

DQ3の世界において、攻撃力の最大は闇ゾーマの500なので、上位1ビットが空いているといえば空いています。また、参照位置もモンスターを追加する時に参照されるくらい(のはず)なので、変更範囲も限定的です。問題は512以上の攻撃力を設定したい場合には使えないというのと、使えても1ビットしか使えない点です。ちなみに守備力はメタル系のデフォルトの守備力が最大の1023に設定されているため空きはありません。

  • SR: $029BAE ドラゴラム
029BD1JSL $C2CC92SR: $02CC92 引数:1#$0006 引数:2#$0FFCモンスター情報取得
  • SR: $02C2F8 モンスター固定情報取得SR_0002
02C2F8JSL $C2CC92SR: $02CC92 引数:1#$0006 引数:2#$0FFCモンスター情報取得
02C300RTSreturn

#$0FFCを#$03FCに変更

  • 13バイト目 6~7ビット目(2ビット) モンスターグラフィック

外部から新規にモンスターグラフィックをインポートしない場合は上位2ビットが空いています。これも参照位置は限定的なはず。

  • SR: $047E1E 出現モンスター描画
047E21JSL $C2CC8BSR: $02CC8B 引数:1#$000D 引数:2#$00FF
  • SR: $047EA2 モンスター出現数決定?
047EE4JSL $C2CC8BSR: $02CC8B 引数:1#$000D 引数:2#$00FF
  • SR: $048242 モンスターグラフィック描画
04824CJSL $C2CC8BSR: $02CC8B 引数:1#$000D 引数:2#$00FF

#$00FFを#$003Fに変更

  • 30バイト目 3ビット目(1ビット) 集中攻撃

見る限り集中攻撃は0か1のbool型でしか使用されていない(データも0か1しか存在しない)にも関わらず2ビット取られています。DQ6で集中攻撃のパターンに3パターンあったんでしょうか(DQ6は未解析のため不明)。参照位置は1ヶ所のはず。

  • SR: 02C3B2 モンスター固定情報取得SR_000A
02C3B2JSL $C2CC92SR: $02CC92 引数:1#$001E 引数:2#$000Cモンスター情報取得
02C3BARTSreturn

#000Cを#0004に変更

  • 35バイト目 5~7ビット目(3ビット) 最大HP

DQ3の世界において、HP最大はしんりゅうの7300なので、上位3ビットは空いています。参照位置もモンスター追加時だけのはず(ベホマの時はFFFFが加算)なので変更範囲は1ヶ所のはず。上位3ビットを別目的で使用する場合にはHPの最大値は8191、上位2ビットの場合は16383になります。

  • SR: 02C3B2 モンスター固定情報取得SR_000A
02C2D0JSL $C2CC70SR: $02CC70 引数:1#$0022モンスター情報取得
02C2D6RTSreturn

SR: $02CC92 引数:1#$0022 引数:2#$1FFF, #3FFFに変更 サイズが足りないので別SRを定義する必要あり

  • 36バイト目 4ビット目(1ビット) 最大出現数

1グループにつき8体まで設定できるようにするため、4ビット使われていますが、モンスターを定義して最大出現数が0というのはありえないので、3ビットにして得た値に1をプラスする、という方法が考えられます。これも参照位置は限定的なはず。

  • 36バイト目 5~7ビット目(3ビット) 空き

もともと空いています。ここの使用が一番安全。

そもそもの出発点は「耐性情報を追加したい」なので、自分としては連続して2ビット使える領域がいくつかあるといいなあというところです(離れた場所の1ビット2つを合成するのは極力避けたい)。集中攻撃の上位1ビットにメタル系を移動して、出現数(36バイト目1~4ビット目)を1ビット右にシフトするか、出現数を3ビットに変更すれば、上位4ビットが空くので耐性情報を2つ追加で定義できます。それ以上はちょっときついかなあ…。というところで思考停止したので終わります。

*1:やるとしたら次はDQ6の戦闘部分の解析だと思うのですが、調査にも時間がかかりそうです。特技の豊富さやAIもあるのでネタとしてなかなか魅力的ですww。

コメント

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