Sprite拡張
スプライト(歩行グラフィック)の拡張手順の説明を行なう。
・データ構造理解
・拡張手順
・拡張後の利用方法
データ構造理解
スプライトデータ構造。今回はFR男主人公を例に挙げる。FF FF : Starter Bytes
00 : Palette
11 02 11 00 02 : Unknown1
10 00 : Width (10=16pix)
20 00 : Height(20=32pix)
10 01 00 00 : Palette Registers
98 77 36 08 : Pointer1
24 78 36 08 : Pointer2
F8 74 36 08 : Pointer3
28 41 36 08 : Sprite Pointer
F0 11 1F 08 : Unknown2
これらのデータの事を、本項目では「SpiteMainData」と称す。
…これだけを見せられてもさっぱりだと思うので、順に説明していこう。
なお、"Unknown"・"Starter Bytes"・"Pointer"・"Palette Registers"に関しては、
スプライト拡張と特に関係ないので、本項目では無視する。
Palette:スプライトに用いるパレットの指定。ROMによって数値が決められている。
例)FRでは「3,4,5,6,7,8,9,A,0,1,2,B,C,10,11,13,15,14」のみが利用可能
Width:スプライトの横幅指定。10 00で16pix,20 00で32pixと+10毎に16pix増える。
Height:スプライトの高さ指定。10 00で16pix,20 00で32pixと+10毎に16pix増える。
※これらの横幅,高さ指定は有限
Sprite Pointer:歩行グラフィックなど、スプライトを格納したオフセットを参照する。
Sprite Pointer詳細
FR男主人公を例に挙げる。
F0 FB 31 08 00 01 00 00 : FrontSprite1
F0 FC 31 08 00 01 00 00 : BackSprite1
F0 FD 31 08 00 01 00 00 : SideSprite1
F0 FE 31 08 00 01 00 00 : FrontSprite2
F0 FF 31 08 00 01 00 00 : FrontSprite3
F0 00 32 08 00 01 00 00 : BackSprite2
F0 01 32 08 00 01 00 00 : BackSprite3
F0 02 32 08 00 01 00 00 : SideSprite2
F0 03 32 08 00 01 00 00 : SideSprite3
Front〜は正面スプライト・Back〜は背面スプライト・Side〜は横のスプライトを指す。
なお、横のスプライトは左向き分しか存在しないが、右向き分は左向き分を反転させている。
主人公系のスプライトには、後続にランニングシューズ時のスプライトなどが格納されている為、Sprite Pointerはもう少し多くなるが、通常NPCは8枚なので今回は8枚分の記載とした。
参考:各用途毎のスプライト枚数
1枚:アイテム 正面のみ必要とする物
8枚:通常NPC バトルサーチャーのアクションは含まず
9枚:トレーナーNPC バトルサーチャーのアクションを含む
20枚:主人公 通常分+ランニングシューズ分+α
参考:1画像辺りの消費容量
16x32のスプライト:1枚/256(0x100)byte
16x16のスプライト:1枚/128(0x50)byte
従って16*32のスプライトを追加するには、
・SpriteMainData 36(0x24)byte
・Sprite Pointer α*8byte
・スプライトを格納する空き領域 α*256(α*0x100)byte
(α=必要枚数)
以上のデータを最低限作成・確保する必要がある。
拡張手順
※FRによる拡張手順。上記SpriteMainDataを参照するDBが0x363E38に存在する。
このオフセットから604(0x25C)byte分をコピー。
コピーした物を空き領域に貼り付ける。
0x05EBB4で0x363E38を参照しているので、先程貼りつけた先頭部のオフセットに置換。
0805eba0 cmp r1, #97
ここでスプライトの個数制限を行なっているので、#97(151)を#EF(239)に変更。
以上でスプライトデータ拡張作業は終了となる。
*追記
スプライト番号#F0が例外処理(0x4010の値でスプライト変化)対象の為、#FF(255)は非推奨。
拡張後の利用方法
追加分のSpriteMainData,Sprite Pointer,スプライトα枚を格納する空き領域を作成,確保。空き領域に貼りつけたDBの末尾にSpriteMainDataの先頭オフセットを指定。
以上でデータの追加は完了。
問題は編集方法であるが、OverWorldEditorのiniをSpriteMainDataのオフセットに書き換えて編集…となる。
OverWorldEditorもNamelessSpriteEditorもSpriteMainDataを参照する事で閲覧,編集を可能としている為、既存分と拡張分の同時編集は難しいかも。
後先の事を考慮して、追加分のSpriteMainDataは連続して並べておくと良い。