DQ3 パレットアクセス拡張(挫折)

現在DQ3 Extended ver1.43を改造のベースとして使用しているのですが、各種データ系のレコード数が大幅に拡張されています。が、1つ空きが余りないデータがあります。それがパレットアクセス($5E0000-)なのですが、既に938/1024レコード使用されており、未使用はわずか80レコード前後に過ぎません。これはパレットアクセスのインデックスが各所で10ビットで定義されているため、どうしようも無い制限なのですが、80というのはあまりに少なすぎます。モンスターの色違いを定義するだけで1レコード消費、新しい呪文のエフェクトをDQ6から引っ張ってくるのにまた数レコード消費と、かなり根っこの部分で共通で使われるデータなので消費量が多いのです。既にリリースしているDQ3SFC K.Mixでも調子にのってバンバン使ったせいで、気がつけば残り40レコードとなってしまい、「これは本格的にヤバイ」ということでなんとかならないか考えてみました。案としては以下の2つです。

  1. モンスターのパレットアクセスIDは1-7フィールドが空でもったいないのでそこを詰めて使用する
  2. パレットアクセス2ともいうべき10ビットマックスのデータを別に定義し、特定の一部のプログラムはそちらを使用する

当然ですが、どちらにしてもプログラム部分の書き換えは必須です。まず、1については、モンスターのパレットアクセスIDを見ると先頭のフィールドしか使用されておらず、あとは全部0です。モンスターIDと連動させて、モンスターIDを8で割った余りをどこかに保持しておいて指定されたパレットアクセスIDと組み合わせて取得するフィールドの値をずらす、ということをすればいいのでは、という実装が浮かびます。これにより最大256-64=192個節約が可能です。というわけで、関連しそうな部分を見てみました。

  • SR: $048242 モンスターグラフィック描画
048242 PHY Push Y
048243 JSL $C2CC8B SR: $02CC8B 引数:1#$0008 引数:2#$FFC0 パレットアクセスID取得
04824B TAY Y=A
04824C JSL $C2CC8B SR: $02CC8B 引数:1#$000D 引数:2#$00FF モンスターグラフィックID取得
048254 TAX X=A
048255 TYA A=Y
048256 JSR $825B SR: $04825B モンスターグラフィック関連情報取得
048259 PLY Pull Y
04825A RTS return
  • SR: $04825B モンスターグラフィック関連情報取得
04825B PHA Push A
04825C PHX Push X
04825D PHY Push Y
04825E STA $4245 $4245=A
048261 STX $4E4B $4E4B=X
048264 JSL $C903EE SR: $0903EE 引数:1#$00 引数:2#$0009 引数:3#$CE1000 引数:4#$0000 モンスターグラフィックIDからスプライトIDを取得
048270 STA $4E4D $4E4D=A
048273 LDX #$0000 X=#$0000
0482B4 LDA #$0008 A=#$0008 パレットのセット方法指定?
0482B7 STA $4247 $4247=A
0482BA LDA #$0000 A=#$0000
0482BD JSL $C79ED3 SR: $079ED3

この$7E4247の値は最終的にSR: $079FB5で使用されます。

  • SR: $079FB5 ?
079FB9 LDX $4247 X=$4247
079FBC JSR $A02A SR: $($07A02A+X)

SR: $($07A02A+X)で呼ばれるSR群はパレットアクセスからおそらくパレットIDをセットするSR群(SR: $00305F, $003086, $0030AC, $0030F8, $00311F, $003145)を呼んでいるようです。これらのSRを比較してみるとわかりますが、実装はほとんど同じで、$7E8A8Aにセットする値だけが#$01, #$02, #$03, #$09, #$0A, #$0Bと異なるだけです。この内部でパレットアクセスにアクセスするSR: $00323Bを呼んでいます。このあたりでこれ以上の解析をギブアップしました。かなり低レベルの操作のため、はっきり言って何をやっているかさっぱりわかりません。

次に2については、浅知恵で、いま見てきたあたりのSRをコピーしてパレットアクセスにアクセスしている部分のアドレスだけを新しく定義したパレットアクセス2(仮称)にする、という変更をすることになります。詳細は省きますが、結論として、「影響範囲が確定できないのでかなり大変」ということがわかりました。正しく動作しない場合にすぐわかるように、モンスターのパレットアクセスIDをオリジナルそのままではなく、パレットアクセス2の先頭から使うようにIDの値を全部シフトしてみました。立ち絵とほとんどのアニメーションについてはよさそうだったのですが、こちらが攻撃したり呪文を使った時のエフェクト時にパレットがおかしくなる問題が発生しました。おそらく、エフェクト時のパレットもまとめて移動する必要がありそうです。エフェクトで使用されているパレットをピックアップ(データとしてまとめられているわけではなく、各エフェクトプログラム内でハードコードされている)するのはかなり大変で、1つ1つの確認作業が相当大変そうです。というわけで、これまた挫折ということになりました。人間本当に必要にならないと本腰を入れて作業できないもので、とりあえずはペンディングとします。

モンスター側のアニメーションはOKでも…

呪文を使うと御覧の通り。