スキップしてメイン コンテンツに移動

最新の投稿

キャプテン翼4 ドリブルバグ修正計画

 久々にキャプテン翼4をプレイしていて気が付いたのですが、フィールドで選手がボールを保持してドリブルをしているお馴染みの画面で、よく見ると上の写真のように画面の右端に妙な黒い線が走っているのを確認しました。最初は私が各データの位置を色々と移設した際に何か作業を誤まったのかと思っていたのですが、何も改変していない元のままのデータのROMでプレイしても同じ現象が発生したのでこれは何らかの不具合=バグではないかと思われます。一応これを消す方法は見つけたのですが、それを実行すると以下の写真のようになってしまいます。  確かに画面右端の黒い線は消えましたが、今度は画面の下半分に表示されるレーダーのコート図面が消えてしまいます。どうやらこの画面を表示するにあたってカットインやクローズアップ演出を表示する定義と同じスクリプトやコマンドコードでの設定がされているようなのですが、この定義のうちコート図を表示する定義(=ID15)に設定ミスがあるようなのです。この写真はコート表示に使用するスクリプトIDを無効化した状態でコート図もラインも消えるのですが、これをプログラム側から修正しようとすると何故かコート図だけが消滅して黒いラインはしっかりと残るので、このスクリプトやコマンドコードの場所を特定しない事には完全な修正は不可能です。まだ調査を始めたばかりでスクリプトそのものの記述場所が特定できていませんが、正式に修正が完了した際には修正パッチを公開する予定です。

第4次スーパーロボット大戦 MAP上の変形・合体・分離ユニットのコマンド制限について

 突然ですが、友人から「変形や合体するユニットに関する質問と解析の依頼が来ているので代わりに解析して解説記事を書いて欲しい」という話がありましたので、今回はその内容を取り上げてみます。

 まずは変形ユニットから。友人の資料の記述方式に従って解説します。MAP上でユニットの変形設定を制御しているのは以下のサブルーチン(A057~A099)です。


00A057 BD 65 18         LDA $1865,X ユニットID取得

00A05A 29 FF 01         AND #$01FF 絞り込み:最大値を01FFとする

00A05D 64 2A STZ $2A M=7E002Aをゼロにする

00A05F 85 2C STA $2C AをM=7E002Cに書き込み

00A061 85 2E STA $2E AをM=7E002Eに書き込み

00A063 A0 07 00         LDY #$0007 ユニット定義の7番目(=変形設定)を取得

00A066 22 72 B3 80 JSL $80B372 $00B372 サブルーチン00B372を呼び出し

00A06A E2 20 SEP #$20         8bit化

00A06C 29 7F AND #$7F 絞り込み:最大値を7Fとする

00A06E F0 26 BEQ $26 $00A096 YESならばジャンプ

00A070 C9 08 CMP #$08 変形パターンチェック:08?

00A072 F0 26 BEQ $26 $00A09A YESならばジャンプ

00A074 C9 09 CMP #$09 変形パターンチェック:09?

00A076 F0 28 BEQ $28 $00A0A0 YESならばジャンプ

00A078 C9 28 CMP #$28 変形パターンチェック:28?

00A07A F0 1E BEQ $1E $00A09A YESならばジャンプ

00A07C C9 29 CMP #$29 変形パターンチェック:29?

00A07E F0 20 BEQ $20 $00A0A0 YESならばジャンプ

00A080 C9 30 CMP #$30 変形パターンチェック:30?

00A082 F0 16 BEQ $16 $00A09A YESならばジャンプ

00A084 C9 31 CMP #$31 変形パターンチェック:31?

00A086 F0 18 BEQ $18 $00A0A0 YESならばジャンプ

00A088 29 78 AND #$78 絞り込み:最大値を78とする

00A08A C9 18 CMP #$18 変形パターンチェック:18?

00A08C F0 21 BEQ $21 $00A0AF YESならばジャンプ

00A08E C9 20 CMP #$20 変形パターンチェック:20?

00A090 F0 1B BEQ $1B $00A0AD YESならばジャンプ

00A092 C9 38 CMP #$38 変形パターンチェック:38?

00A094 F0 15 BEQ $15 $00A0AB YESならばジャンプ

00A096 C2 20 REP #$20 16bit化

00A098 38         SEC Cフラグをセット

00A099 6B         RTL サブルーチンの終了


 次に、複数の機体による合体・分離ユニット。MAP上でユニットの変形設定を制御しているのは以下のサブルーチン(A223~A05F)です。


00A223 BD 65 18         LDA $1865,X ユニットID取得

00A226 29 FF 01         AND #$01FF 絞り込み:最大値を01FFとする

00A229 64 2A STZ $2A M=7E002Aをゼロにする

00A22B 85 2C STA $2C AをM=7E002Cに書き込み

00A22D 85 2E STA $2E AをM=7E002Eに書き込み

00A22F A0 07 00         LDY #$0007 ユニット定義の7番目(=変形設定)を取得

00A232 22 72 B3 80 JSL $80B372 $00B372 サブルーチン00B372を呼び出し

00A236 E2 20 SEP #$20         8bit化

00A238 29 7F AND #$7F 絞り込み:最大値を7Fとする

00A23A C9 10 CMP #$10 変形パターンチェック:10?

00A23C F0 22 BEQ $22 $00A260 YESならばジャンプ

00A23E C9 5A CMP #$5A 変形パターンチェック:5A?

00A240 F0 29 BEQ $29 $00A26B YESならばジャンプ

00A242 C9 2D CMP #$2D 変形パターンチェック:2D?

00A244 F0 25 BEQ $25 $00A26B YESならばジャンプ

00A246 C9 2E CMP #$2E 変形パターンチェック:2E?

00A248 F0 21 BEQ $21 $00A26B YESならばジャンプ

00A24A C9 2F CMP #$2F 変形パターンチェック:2F?

00A24C F0 1D BEQ $1D $00A26B YESならばジャンプ

00A24E C9 34 CMP #$34 変形パターンチェック:34?

00A250 F0 2A BEQ $2A $00A27C YESならばジャンプ

00A252 29 78 AND #$78 絞り込み:最大値を78とする

00A254 C9 40 CMP #$40 変形パターンチェック:40?

00A256 F0 33 BEQ $33 $00A28B YESならばジャンプ

00A258 C9 50 CMP #$50 変形パターンチェック:50?

00A25A F0 3E BEQ $3E $00A29A YESならばジャンプ

00A25C C2 20 REP #$20 16bit化

00A25E 38         SEC Cフラグをセット

00A25F 6B         RTL サブルーチンの終了


 質問と依頼の主旨は「特定の機体をMAP上で変形や合体禁止にできるようにして欲しい」という事らしいので、これらのサブルーチンにアクセスするサブルーチンの呼び出し先(つまり「22 57 A0 80」や「22 23 A2 80」)の指定アドレスを書き換えて「機体IDを取得する追加サブルーチン」を記述した空き領域に移動、そこで機体IDの結果それぞれのアドレスにジャンプなりサブルーチンを呼び出す命令なりを作ればいいわけです。この解説でサブルーチンの組み立ては理解できたと思うのですが、分からないと色々と申し訳ないので以下にサンプルを記述します。


例.1)変形制限ユニットの設定。

前提として01FF00以下の空き領域に機体ID取得サブルーチンを組み立てるものとする。

「00CFEB~00CFE」と「039563~039566」の「22 57 A0 80」を「22 00 FF 81」に変更し、01FF00以下に追加サブルーチンを記述。今回は「Zガンダム(0112)」と「ウェイブライダー(0113)」がMAP上で変形できないように設定。記述内容は以下の通り。


01FF00 BD 65 18     LDA $1865,X ユニットID取得

01FF03 29 FF 01     AND #$01FF 絞り込み:最大値を01FFとする

01FF06 C9 12 01     CMP #$0112 ユニットIDチェック:Zガンダム(0112)?

01FF09 F0 09     BEQ $09               $01FF14 YESならばジャンプ

01FF0B C9 13 01     CMP #$0113 ユニットIDチェック:ウェイブライダー(0113)?

01FF0E F0 04     BEQ $04 $01FF14 YESならばジャンプ

01FF10 5C 5D A0 80 JML $80A05D $00A05D(サブルーチンの続き)にジャンプ

01FF14 C2 20     REP #$20 16bit化

01FF16 38     SEC Cフラグをクリア

01FF17 6B     RTL サブルーチンの終了


以上のような処理で、変形させたくない(「変形」コマンドを表示させない)機体があれば同じようにIDを記述していけばいいという方式です。


例.2)分離制限ユニットの設定。

前提として01FF80以下の空き領域に機体ID取得サブルーチンを組み立てるものとする。

「00D06D~00D070」と「02A4AE~02A4B1」と「03957B~03957E」の「22 23 A2 80」を「22 80 FF 81」に変更し、01FF80以下に追加サブルーチンを記述。今回は「コンバトラーV(0030)」と「ザンボット3(003E)」と「ダンクーガ(0043)」がMAP上で変形できないように設定。記述内容は以下の通り。


01FF80 BD 65 18     LDA $1865,X ユニットID取得

01FF83 29 FF 01     AND #$01FF 絞り込み:最大値を01FFとする

01FF86 C9 32 00     CMP #$0032 ユニットIDチェック:コンバトラーV(0032)?

01FF89 F0 0E     BEQ $0E $01FF99 YESならばジャンプ

01FF8B C9 3E 00     CMP #$003E ユニットIDチェック:ザンボット3(003E)?

01FF8E F0 09     BEQ $09 $01FF99 YESならばジャンプ

01FF90 C9 43 00     CMP #$0043 ユニットIDチェック:ダンクーガ(0043)?

01FF93 F0 04     BEQ $04 $01FF99 YESならばジャンプ

01FF95 5C 29 A2 80 JML $80A229 $00A229(サブルーチンの続き)にジャンプ

01FF99 C2 20     REP #$20 16bit化

01FF9B 38     SEC Cフラグをセット

01FF9C 6B     RTL サブルーチンの終了


以上のような処理で、分離させたくない(「分離」コマンドを表示させない)機体があれば同じようにIDを記述していけばいいという方式です。

 今回は割愛しましたが、これに更なる分岐条件としてイベントフラグの判定を組み込めば、ダンクーガのように特定のイベントフラグ成立後に分離や変形が可能になったり、逆に分離や変形を不能にする事も可能なので、需要と機会があればその辺りの解説もしたいところです。

 これらを参考に解析の腕を磨き、依頼者の方にはいつか必ず面白いハックロムを公開していただけると私としてもありがたい限りです。

コメント

人気の投稿

第4次スーパーロボット大戦 改造コスト&改造数値分岐パッチを公開しました

キャプテン翼4 レベル補正変更パッチを公開しました

キャプテン翼4 ドリブルバグ修正計画