グラフィカルアニメーション - Rickisthe1/CoilSnake-m2-basic GitHub Wiki
グラフィックアニメーション
注意: ここで使用されているすべてのアドレスは、ヘッダーなしROM用です。
各ファットタイルセットには、最大8つのグラフィックアニメーションのリストがあります。これらのアニメーションは、異なるタイミングで8x8タイルをSFC/SNESのVRAMに「DMA転送」することで、ミニタイルが使用されているすべてのメタタイルで変化しているように見せます。与えられたファットタイルセットのグラフィックアニメーションに使用されるタイルのセットは、すべて4bppのグラフィックデータの1つのブロブにまとめて格納されます。(この文脈で「タイル」とは、ミニタイルの1つの特定のレイヤーを指します。)簡単に言えば、これを「タイルクラスタ」と呼びます。クラスタは、すべてのアニメーションに対して最大256個のタイルを含むことができます。
アニメーションリスト内の各グラフィックアニメーションには、次の情報が含まれています:
- アニメーション内のフレーム(静止画)の数。 「フレーム数」
- 各アニメーションフレーム(静止画)が画面に表示されるフレーム数(時間の単位)。 「ディレイ」
- グラフィックデータのサイズ(タイル数 * 32、マップグラフィックは4bppなので、VRAM内で1つのアニメーションで連続した多くのタイルを置き換えることができます)
- コピー元(すべてのアニメーションフレームが格納されているファットタイルセットのアニメーショングラフィックブロブ内のオフセット)
- コピー先(タイルをコピーするVRAMのアドレス)
まきへびドライとMOTHER 2プロジェクトエディタは、現在、グラフィックアニメーションの表示/編集に対応していません。
ROM内には、圧縮されたアニメーショングラフィックデータのクラスタへの32ビットポインタのテーブルが $EF11CB
にあり、グラフィックアニメーションのリストへの32ビットポインタのテーブルは $EF121B
にあります。リストの最初のバイトはエントリ数で、その後にグラフィックアニメーションの配列が続きます。各アニメーションは、フレーム数(1バイト)、ディレイ(1バイト)、サイズ(2バイト)、src(2バイト)、およびdest(2バイト)で構成されています。
パレットアニメーション(フラッシュ効果)
各イベントパレットには、マップがフェードインした後に表示される32種類のパレットアニメーションのいずれかを選択するオプションがあります(番号は1〜32)。(これらのうち、面白いものは8個しかありません。)パレットアニメーションへの32ビットポインタのテーブルは、ROMの $DFE4E1
にあります。パレットアニメーションは、圧縮されたパレットデータへの32ビットポインタ、アニメーションフレーム数分の色(96 * フレーム数)、アニメーションフレームごとの持続時間を示す1バイトが続きます。パレットアニメーションは、元のゲームのRAMレイアウトを使用して、最大10フレームのアニメーションフレームを含むことができます。
まきへびドライとMOTHER 2プロジェクトエディタは、パレットアニメーションの編集に対応していませんが、前述のように、map_palette_settings.yml
で特定のイベントパレットがどのアニメーションを使用するかを選択するのは簡単です。
グラフィックアニメーションの変更
アニメーションタイルの2つの主要な部分は、グラフィック(クラスタ)と、それらがどのようにアニメートするかを制御する設定です。これらの2つのデータを指すポインタのテーブルも2つあります。
タイルクラスタポインタテーブル はROMの $2F11CB
にあり、80バイトの長さです。20エントリがあり(各タイルセットに1つ)、各エントリは単純に4バイトのポインタでタイルクラスタを指しています。このテーブルのリストは、このページの最後にあります。タイルクラスタのグラフィックは、通常のマップタイルと同じようにROM内で圧縮されています。Exhalを使用して簡単に解凍して編集でき、Inhalを使って再挿入できます。タイルクラスタポインタテーブルに提供されているポインタを使って解凍し、YY-CHRなどのタイルエディタで解凍したグラフィックを編集できます。変更したグラフィッククラスタが元のものより大きい場合は、それを別の自由な場所に移動し、すべてのポインタを合わせる必要があります。
タイル設定ポインタテーブル は $2F121B
にあり、これも80バイトで、20エントリがあります。再び、各エントリは順番に各タイルセットに対応しており、タイルアニメーション設定を指しています。タイルクラスタの編集は比較的簡単ですが、最も難しい部分はアニメーション設定です。設定に慣れれば、新しいエントリを追加したり変更したりするのは簡単です。しかし、エントリを追加するには、それを移動させてポインタを再設定する必要があり、後続のデータを上書きしないようにする必要があります(ただし、ハックで使われていないデータがあり、それを削除しても問題ない場合は、使用されないタイルセットに限り他のエントリを上書きしてもかまいません)。
アニメーションタイル設定形式:
Onettのタイルセットのために使用される2番目の設定エントリを例に取ります。
Onettの設定は、ROMの $2F1294
にあり、次のようになります:
02 04 13 40 01 20 00 10 00 02 14 40 00 20 05 B0 00
最初のバイトは、いくつのグループがあるかを示すヘッダーです。各グループは8バイトの長さです。これを分解すると、このようになります:
02
04 13 40 01 20 00 10 00
02 14 40 00 20 05 B0 00
Onettでは、最初のグループは水のために、2番目のグループは夜の星のために使用されます。各グループは次のパターンに従います:
AA BB CC CC DD DD EE EE
AA
= このアニメーションのフレーム数。最初のグループ(水)は4フレーム、2番目のグループ(星)は2フレームです。BB
= アニメーションの速度(フレーム数単位)。最初のグループは0x13、これは10進数で19です。各アニメーションフレームは、次のフレームに切り替わる前に19ゲームフレーム(60fps)表示されます。CC CC
= 各フレームの文字列長を定義します。この「文字列長」の設定は少し複雑ですが、タイルクラスタをエディタで開くと、次のように表示されます:
文字列の長さ設定を理解するには、次のように並べてみると、タイルの順番を理解しやすくなります:
最初のグループには4つのフレーム(上から下まで)があり、それぞれが10タイルの長さであることが分かります。「10タイルの長さ」という部分が文字列長です。
ここで CC CC
が 40 01
だったのを覚えていますか?その2バイトを入れ替えると(なぜかは、下記の「エンディアン」のセクションを見てください)、0x140
になります。各タイルは 0x20
として数えられるので、タイルの数に 0x20
を掛けます。0xA
と 0x20
を掛けると 0x140
になります(または、10を32で掛けた後に結果を16進数に変換します。10×32は320で、それを16進数に変換すると0x140
になります)。この文字列の目的は、後述する EE EE
で始まる、アニメーションで置き換えられるタイルの最初の位置を定義することです。
DD DD
= クラスタ内でアニメーションが開始するタイルのオフセットを設定します。例として、星のグループを使うと、次のように確認できます:
DD DD
が 20 05
である場合、順番に反転させて 0x520
となります。これは 0x20
の倍数です。0x520
を 0x20
で割ると、0x29
、つまり41になります。タイルクラスタ内で41番目が最初の星です。
最初のグループを見ると、クラスタオフセットは 20 00
となっており、これは単に1です。
EE EE
= どのミニタイルを置き換えるかを指定します。これは選択したミニタイルだけでなく、CC CC
の文字列長によって定義されたいくつかのミニタイルも置き換えます。EE EE
の設定は0x10
の倍数になります。