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