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

最新の投稿

ファミコン版天地を喰らう 軍師キャラの隊列変更阻止について

 天地を喰らうシリーズは策略を使うにあたって「軍師」に任命された武将がいないと使用不能になるのですが、軍師に任命された武将は戦闘が開始されると隊列の一番後ろに配置され、隊列が6人以上になると直接戦闘に参加できなくなるというシステムになっています。これがいわゆる文官タイプ(武力や兵士数が低く知力が高い傾向の武将)であればまだいいのですが、劉備や馬謖や姜維のように文武両道の武将を軍師に任命する必要がある場合は事情が変わってきます。そこで、軍師に任命した武将がどのような処理で隊列の一番後ろに回されてしまうのか調べてみました。その結果、大まかに言うと「戦闘開始時にまず隊列の人数をチェックし、6人未満である場合は各武将の状態をチェックし、正常であれば隊列の位置そのまま、それ以外の状態の武将は隊列の最後尾に変更する。6人以上の場合は軍師を隊列の最後尾に移動させるが、負傷中の武将がいる場合は更に軍師の後ろに配置する」という処理内容でした。ここで言う武将の状態は「00=負傷中(戦闘不能)、40=軍師、80=正常、C0=正常かつ軍師」の4種類で、この処理内容を変更すれば軍師に任命した武将も隊列の変更がないまま戦闘に参加できそうです。つまり「隊列が6人以上でも6人未満でも武将が正常な状態であれば隊列の位置そのままを維持し、負傷中の武将のみ隊列の最後尾に変更する」とすればよいのではないでしょうか。この仮説を基に改変を行い、成功すればパッチとして公開する予定です。

第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次スーパーロボット大戦 初期型ROMと後期型ROMの物理的な見分け方と入手方法

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

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