例によって「ダウンロード」ページにうpしてあります。前回は作ってすぐリリースしてしまっていたので、実際に使ってみると案の定いろいろと不具合が見つかりました。基本的には1.1.0のバグフィックス版ですが、ちょこちょこと機能追加を行っています。今回の変更点は以下のとおり。
- SFCDQ5対応プラグイン公開
- プログラム部分のm,xフラグの表示
- フィールド型:アドレスリスト(sa2, sa3)の定義時にm,xフラグの状態を指定できる
1は別にDQ5の改造を始めるというわけではなく、SFCGENEditorのLoROM対応を確認するためにDQ5を選んだだけです(もともとはDQ5のボスに攻撃した時のエフェクトをDQ3に移植したくて解析をほんの少しやっていたので手をつけやすいというのもありました)。DQ5は天下の中村光一氏のチュンソフトが開発したということでその実装を覗くというのはなんとも恐れ多い感じがしますがwww、当然ながら実装はDQ3,6とは全く違います。DQ3,6以外の実装を知らないのでなんとも言えないのですが、一番大きな違いだと感じたのは「BRK命令の引数が可変個になる」というものです。具体的にはBRK命令の直後の値によって引数の数を変えているみたいで、プレーンな逆アセンブラではまともに解釈できません(多分)。というわけでDQ5用のプラグインを作成し、その中でBRKのみ解釈を行うようにしました。DQ3,6でもBRKは通常と異なり引数を2バイト取り、NPCの会話処理をしていたのですが、DQ5のように多彩な処理をBRKで行うというのには驚きました。なんでそうしてるのかはさっぱりわかりませんが。以下一例。
- SR: $100034 戦闘1ターン分の処理?
100034 | JSR $8FD7 | SR: $100FD7 | |
---|---|---|---|
100037 | BCS #$2B | if(c==on) goto $100064 | |
100039 | BRK #$89 #$68 #$45 | goto $000F80 #$89 #$68 #$45 | 3つ引数をとっている |
10003D | LDA $46 | A=DP($46) | |
10003F | BNE #$10 | if(z==off) goto $100051 | |
100041 | BRK #$95 #$FF | goto $000F80 #$95 #$FF | 2つ引数をとっている |
100044 | BRK #$96 #$18 | goto $000F80 #$96 #$18 | 2つ引数をとっている |
100047 | BRK #$96 #$26 | goto $000F80 #$96 #$26 | 2つ引数をとっている |
略 |
もちろん現状でも完全なものではなく、目につく範囲のプログラム解釈がそれなりつじつまが合っているっぽい程度のものでしかありませんし、それらの処理が何を意味しているかについても全く調べていません。また、DQ5はモンスターのステータス情報を複数の分割されたレコードに格納しています(例攻撃力、HPなど)。現状SFCGENEditorはこういうデータ形式には対応していないのですが、ROMサイズの厳しいSFC初期~中期のゲームはこの格納方法が頻繁に使われているだろうと推測できるため、近い将来SFCGENEditor上では1つのまとまった値として表示/編集ができるようにするつもりです。おそらくDQ5のプラグインがある程度完成度が高まればあまりいじらずにDQ12のプラグインも作成できると思います(やるかどうかは全く未定)。ドラクエ命さんのところとs-endoさんのところの情報を利用して文字列のデコードをするところまでは実装しています(編集機能は実装の予定なし)。
2,3はDQ5のプログラム部分の解釈をしていくにあたり、m,xフラグの初期状態がONになっていることが多く、より精密にコントロールする必要があることがわかってきたための機能拡張です。DQ3,6ではm,xフラグはほとんどOFFなので影響はまずありません。
コメント