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

最新の投稿

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

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

第4次スーパーロボット大戦 BGMデータの読み方

 



 そろそろBGMの移植実験は一旦止めて別の作業に移ろうと思いますが、今までの解析で気が
付いた点などをいくつか記載しておきます。何かの参考になれば幸いです。

  • 魔装機神やバトルロボット烈伝のBGMデータに使用されているオペコードは第4次スーパーロボット大戦のそれとは完全互換ではなく第4次の発展型と思われ、一部の仕様変更や追加コードが確認できる。これらのオペコードが含まれているBGMデータを第4次にコンバートすると何らかの不具合(正常な波形データの再生ができない、途中で曲の再生が止まる、など)が発生する。
  • 例えばバトルロボット烈伝では「疾風ザブングル」がこれに該当し、魔装機神ではほぼ大半のBGMがまともに再生できない(「終わりなき戦い」や「炎の中華体育教師」などは特に顕著)。まともに再生できてもループの際に不具合が発生し二周目からおかしくなるものも多い(「ダークプリズン」ではループ時の一瞬スローになる命令が解除されず二周目以降はずっとスローテンポのまま、「フラッパーガール」はループ直前の間奏に入ると正常に再生されなくなり、二周目に入るとループのたびに更におかしくなる、など)。未確認ではあるが、逆に第4次から魔装機神やバトルロボット烈伝にBGMデータをコンバートする分には問題はないものと思われる。
  • 各種BGMやSEに使用されるサンプリングデータ(いわゆる「楽器の音色」など)は作品間で完全に互換性があるので相手先に移植すれば問題なく使える(第4次のサンプリングデータのオフセットは#220000から3バイトで始まり、格納箇所はそのオフセットを読み取れば判明する)。例えば、魔装機神で多用されているシャウトやバトルロボット烈伝で多用されているトランペットのサンプリングデータを移植すれば第4次でも問題なく同じ音色で再生する事が可能である。
  • 第4次におけるBGM再生に使う波形スロット(と呼ぶのだろうか)の使用領域は基本的に#18~#1Fというたったの8スロットで、これを超えて#20以降を使用すると戦闘BGMとして使用した際に#20以上のスロット領域を使用する武器アニメ(サンアタックや超電磁スピン、アカシックバスター、ファンネル系SEが使用される武器など)のを選択して戦闘が始まると同時にフリーズする(恐らく内部的にはバッファがオーバーフローしているものと思われます)。基本的には#20はサンプルテーブルに「11 0B」が付記されていなければセーフ(後述)といった感じになっている。なお、魔装機神やバトルロボット烈伝では使用可能領域が#00~#0C(ひょっとすると#0Fまで使用できるかもしれません)までに改善されている。波形データやサンプルテーブルデータを見比べるとその辺りがよく理解できるはず。
  • ROMの#230000台(#230200~)に格納されているサンプルテーブルデータの最初に「11 0B」と記載(「波形スロット#11にサンプリングデータ#0Bを読み込む」という意味)されていない曲(「ザンボット・コンビネーション」など)を戦闘BGMとして使用すると使用武器しだいで撃墜アニメのSEの一部が無音になる。これが付記されていない曲の大半はスロットを#20以上に拡張しているものばかりなので恐らくバッファオーバーフロー防止対策と思われる。「11 0B」を追加すれば正常にSEが再生されるようになるが今度は例のフリーズ該当武器に引っかかるようになる。完全にSEが再生される戦闘BGMを自作したい場合は、何が何でもスロットの使用領域を#1Fまでに収める(=使えるサンプリングデータが8個までという意味で、波形データが8個しか使えないという意味ではない)ように努力しよう。
  • サンプルテーブルデータは2バイト構成で、先の1バイトが波形データスロットID、後の1バイトがサンプリングデータのID。例えば「18 1E」であれば「そのBGMの波形スロット#18にはサンプリングデータ#1Eが適用される」という意味。データ終端には「FD」と記載すること。なお、SEのサンプルテーブルではデータ終端にFFを使用している場合もあるようだ。

  • BGMそのものの再生速度や再生音量はROMの#220590~#22060Fで調整できる。2バイトで構成されており、前1バイトが再生速度、後ろ1バイトが再生音量。テーブルはBGMデータ終端の2バイトに記載されている数値に対応しており、例えばBGMデータの終端に「2F 00」と記載されていればその曲は#22060E~#22060Fの数値が適用される事になる。
  • BGM番号は#3Fまで設定可能。それ以上は例えプログラムを書き換えようが#228000のBGMデータオフセットテーブルを拡張しようが不可能。つまり追加できる曲数は割と限られる事になる。時には追加によって使わない事が確定したBGMのオフセットを追加したデータに割り振るなどの対策も講じる必要があるだろう。
  • BGMデータの見方について。最初の4バイトは波形データのヘッダーで、波形データのサイズとSPC700におけるデータ展開の起点を示す。例えば「60 00 00 02 」であれば「波形データのサイズは0060h、データ展開の起点はSPC700の#0200から」という意味。基本的にウィンキーソフトの作品はSPC700の#0200を起点にした仕様になっている。その後に波形データがヘッダーの通りのサイズで記述されている。波形データは8バイト構成(例:18 FF F2 08 A8 73 40 E8)で、先頭1バイトに参照スロットの番号が記載(第4次だったら#18~、魔装機神やバトルロボット烈伝だったら#00~)される。この1バイトがサンプリングテーブルで指定されたサンプリングデータを読み込む仕組み。残りの7バイトはその波形データの基本音量や基本音階などの設定だが今回は割愛(いずれ解説します)。
  • 波形データが終わると続く4バイト(例:19 0D 00 52)はSPC700用ヘッダーで、使用するプログラムサイズとプログラム展開先の起点を示しておりそれぞれ2バイト。例の場合であれば「プログラムサイズは0D19h、展開先は#5200から」という意味。第4次であれば#5200、魔装機神であれば#3C00、バトルロボット烈伝であれば#7600となっている。また、この後に続くオペコードのうち「6E XX YY ZZ」(XX=01~07)群はそれぞれのデータの参照先(YY ZZ)を示しており、、01は「トラックの開始情報」、02~07は「各トラックのシーケンスデータの起点」である。
  • つまり、オペコードが同じ規格のBGMデータをコンバートするだけであればサンプルテーブルと各プログラム起点データ参照先の値を全て同じ設定に合わせる事で簡単に対応できるという事になる(+サンプリングデータの移植)。例えば魔装機神やバトルロボット烈伝から第4次であれば各波形データの先頭1バイトの値とサンプルテーブルの各1バイトの値を変換(00→18、01→19、02→1A、など)し、データの展開先を#3C00からではなく#5200からを基準にしたものに書き換えればよい(端的に言えばSPC700用ヘッダーの数値と6E XXに続くYY ZZの数値に差分を足したり引いたりする。第4次であれば魔装機神のデータの該当箇所に+1600h、バトルロボット烈伝のデータは-2200hに記述を変更)。基本規格が同じでオペコードに差異のないデータであれば、これでほぼ使用可能になる。ただし前述の通り魔装機神やバトルロボット烈伝は基本的な規格は同じだが一部オペコードが変更されたり追加されたりしているので、オペコードが違う場合は相違箇所を地道に調査して修正しなければならない(私もまだ完全に把握はしておりません)。

とりあえずこんなところでしょうか。私自身もまだまだBGMデータを自作できるまでには至っておらず、既存のデータの初歩的な改変と参照サンプリングデータや音階やテンポや和音を変更したりといった簡単な事しかできておりません。いつかBGMを完全に自作したいとは考えておりますので、BGM関連の解析やオペコードの解説などは気が向いたらそのうち更新しようと思います。

コメント

人気の投稿

第4次スーパーロボット大戦 初期型ROMと後期型ROMの物理的な見分け方と入手方法

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

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