ユーザ用ツール

サイト用ツール


サイドバー

guide:ワールドマップ画像の入れ替え

目次

FE8ワールドマップの入れ替える方法について説明します。

マップ作成支援ツール
Map creator

概要

ワールドマップは4つある

ゲーム中に下の方に表示されるminimap

サイズ64×64
画像アドレス0xB26A6C (圧縮)
パレット0xB2715C

ゲーム中のフィールドとなるワールドマップ

サイズ480×320
画像アドレス0xB085F8 (無圧縮)
パレット0xB1B278,B1B298,B1B2B8,B1B2D8
暗パレット0xB1B1F8,0xB1B218,0xB1B238,0xB1B258

イベント等、序章のプロローグで表示されるワールドマップ

サイズ240×160
画像アドレス0xB1E9B8 圧縮されてる
パレット0xB23D3C,B23D5C,B23D7C,B23D9C
TSA0xB237EC 圧縮されている

ゲームOPで表示されるワールドマップ

サイズ240×160
画像アドレス0xB4BBA0 圧縮されている
パレット0xB4FCD4
TSA0xB4F758 圧縮されている

16色限定で話をします。

FE8ではTSA等を利用して、16色以上色を作ることが出来ます。
具体的には、GBAは、8*8のタイルから構成されたタイルデータを持ち、
そのタイルごとにパレットを切り替えて、16色を超える画像を出せます。
ただ、これはとても難しく、データを用意するのも大変なので、今回は利用しません。
今回は、すべて16色に限定して、楽にワールドマップを定義する方法について説明します。
(0番目を透過色にしないことをおすすめします。)

ワールドマップのデータはどこにあるの?

laqieerさんの解析資料を見てください。
アドレスとかいろいろ掲載されています。
彼の解析のおかげで、いろいろな事実が判明しました。

[FE8] World Map Graphic Insertion
http://feuniverse.us/t/fe8-world-map-graphic-insertion/1738/1

用意するもの

バイナリエディタ
http://www.vector.co.jp/soft/win95/util/se079072.html

NLZ-GBA Advance (または GBA Graphics Editor)
http://www.romhacking.net/utilities/529/

edge
http://takabosoft.com/edge

ワールドマップにしたいデータ
今回は、wikipediaにあるオーストラリ大陸の画像を入れてみます。
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%AA%E3%82%A2#/media/File:Australia_satellite_plane.jpg

参考例

FE8_AU_PATCH 大陸を全部AUに置き換えただけのパッチです。
参考にしてください。
http://ux.getuploader.com/FE4/download/243/FE8_AU_PATCH.7z

minimapを入れ替える

一番簡単なものからいきます。
ゲーム中に下の方に表示されるminimapを入れ替えてみます。

サイズ64×64
画像アドレス0xB26A6C (圧縮)
パレット0xB2715C

サイズ 64×64の 16色 png画像を用意してください。
今回はこの画像に差し替えてみます。
https://i.imgur.com/qNopQuX.png

step_a01

NLZ-GBA Advance を立ち上げて、
左上の File handling をクリックし、
Load Rom で FE8聖魔のrom を読み込みます。
i.imgur.com_pylinxn.jpg

新規にromを読み込んだ場合は、
romをスキャンしてもいいかと聞かれるので、OKと答えます。
ROMと同じ場所に romの名前.nlzというキャッシュが作られます。
i.imgur.com_phidtn5.jpg

step_a02

romを読み込んだから、このような画面になります。
i.imgur.com_rtvuii0.jpg

step_a03

赤枠で囲った Compressed graphics にチェックが入っていることを確認してください。
緑枠で囲った Width に、8 と入力します。
青枠で囲った Offset に、B26A6C と入力します。
紫枠で囲った ROM Pallet offset に、 B2715C と入力します。
そうすると、ウィンドウに minimapが表示されます。
i.imgur.com_ibhv3lv.jpg

これらの設定は、変更するものの設定からきています。

サイズ64×64 → 64 / 8ドット単位 = 8
パレット0xB2715C → 0xというのは16進数というマークなのでそれ以降を入れる
画像アドレス0xB26A6C 圧縮 → 圧縮されているのでCompressed graphicsを有効にします

step_a04

Import a bitmapボタンをクリックします。
i.imgur.com_fukislr.jpg

step_a05

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
i.imgur.com_r3ei0qi.jpg

step_a06

minimapが置き換わるはずです。
i.imgur.com_73nxyma.jpg

step_a07

Write to ROM で結果をROMに保存します。
保存する前にromのバックアップは忘れずに
i.imgur.com_sfiiwgp.jpg

step_a08

改造したromを読み込んでゲームを進めてみてください。
minimapがオーストラリアになっているはずです。

(長くなるので、次から一部説明を省きます。)

i.imgur.com_4o1kllu.jpg

トラブルシューティング

Q:NLZ-GBA Advanceが動かない

A:romと同名.nlz ファイルがあれば削除してみてください。
i.imgur.com_mavhu8g.jpg

ゲーム中のフィールドとなるワールドマップを入れ替える。

ゲーム中に操作することになるフィールドマップを入れ替えてみます。
フィールドマップは pallet map構造になっており、
4つのパレットを8*8タイルごとに切り替えて表示することができます。
が、そうすると話がややこしくなるので、ここでは 16色限定で話をします。

サイズ480×320
画像アドレス0xB085F8 (無圧縮)
パレット0xB1B278 -
暗パレット0xB1B1F8 -

サイズ 480×320の 16色 png画像を用意してください。
注意:パレット 0番目の色を透過色にしてはいけません。絶対にダメです。
注意:パレット 0番目に何を指定しても黒(RGB(0,0,0))になります。

今回は、この画像におきかえてみます。
https://i.imgur.com/nBlcdtE.png

step_b01

NLZ-GBA Advance を立ち上げて、
左上の File handling をクリックし、
Load Rom で FE8聖魔のrom を読み込みます。

赤枠で囲った Compressed graphics のチェックをオフにしてください。
緑枠で囲った Width に、60 と入力します。
青枠で囲った Offset に、B085F8 と入力します。
紫枠で囲った ROM Pallet offset に、 B1B278 と入力します。
そうすると、ウィンドウに ワールドマップが表示されます。

i.imgur.com_gbfaqdk.jpg

step_b02

Import a bitmapをクリックします。
i.imgur.com_bmtquyc.jpg

step_b03

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
i.imgur.com_ajg9nv8.jpg

step_b04

ワールドマップが、置き換わっているはずです。

i.imgur.com_7jo0wth.jpg

ここで、セーブ・・・するまえに、やることがあります。
ワールドマップは、8*8のタイルで4つのパレットを切り替えることで16色を超える色がだせるのですが、
今回これを利用しません。
どのタイルが、どの色を使うのかをpallet mapというデータで定義されていますが、
これを変更するのは少々やっかいなので、
代わりに、4つのパレットを全部同じ色にすることで、この問題を強引に解決します。

パレットは、0xB1B278 から、 0x20バイトずつ、4つあります。
今回、0xB1B278を設定したので、残りの3つを設定します。

パレット一覧
B1B278(これはもう設定済み)
B1B298これから設定する
B1B2B8
B1B2D8

step_b05

ROM Pallet offset を B1B2B8 に設定し、
Import a bitmapをクリックします。
i.imgur.com_wvtavle.jpg

step_b06

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
同様に、設定してください。
i.imgur.com_ssi0sga.jpg

step_b07

パレット B1B298 を設定できました。
i.imgur.com_ewizrlk.jpg

どうように、パレット B1B2B8 と B1B2D8も設定してください。

パレット一覧
B1B278(これはもう設定済み)
B1B298(これはもう設定済み)
B1B2B8これから設定する
B1B2D8

step_b08

パレット B1B2B8 を設定します。
i.imgur.com_dlfup0o.jpg

step_b09

パレット B1B2D8 を設定します。
i.imgur.com_dyhp7gd.jpg

step_b10

4つのパレットを設定し終わったら、
File → Save で結果をROMに保存します。
保存する前にromのバックアップは忘れずに。
i.imgur.com_9vqyuk0.jpg

step_b11

改造したromを読み込んでゲームを進めてみてください。
ワールドマップが、オーストラリアになっているはずです。
i.imgur.com_dprqkse.jpg

step_b12

追記
これ以外にもパレットがあるらしいです。
拠点を選択した時、ワールドマップが少し暗くなって、
台詞が始まりますが、このパレットは別の位置にあります。

暗くなるパレット一覧
B1B1F8
B1B218
B1B238
B1B258

これらにも、値を設定してあげてください。

i.imgur.com_hwdcfod.jpg

トラブルシューティング

Q:画像にブロックノイズみたいなのが乗った。

A:パレットを4種類同一にしましたか?
step_b05あたりを見直してください。
i.imgur.com_skkkand.jpg

Q:16色以上のワールドマップを作りたい

A:pallet mapを指定してください。
pallet mapは、lz77で圧縮されているので、解凍してください。
解凍すると、 1200バイトのデータになります。

解凍後の pallet map をバイナリエディタで開いて書き換えてください。
mapを8*8のタイルに分割し、そのタイルが何番目のパレットを使うかを格納していきます。

1バイトに2タイルの情報がはいっています。
0x33 だった場合、
0x33 & 0xf == 1つ目のタイルは 0x3(つまり4番目のパレットを使う)
(0x33»8) & 0xf == 2つ目のタイルは 0x3(つまり4番目のパレットを使う)

これを1200バイト定義することで、すべてのタイルのパレット割り当てを定義してます。
1200バイト*2タイル=2400タイル
(480×320 は、 (480/8)*(320/8)=2400タイル)

修正後は、lz77で圧縮しromに書き戻してください。
このとき、サイズが超えてしまう場合は、移さないとだめでしょうね。

イベント等、序章のプロローグで表示されるワールドマップを入れ替える

イベント等、序章のプロローグなどの、イベントで表示されるワールドマップを入れ替えます。
このマップも、8*8タイルごとで4つのパレットを切り替えて表示していますが、
フィールドのワールドマップとは違いTSAという方法で、切り替えを行っています。

TSAを操作すると、話がとてもややこしくなるので、
ここでも、4つとも同じパレットを設定することで話を進めます。

サイズ240×160
画像アドレス0xB1E9B8 圧縮されてる
パレット0xB23D3C -
TSA0xB237EC 圧縮されている

240×160の16色pngを用意してください。
(注意:パレット 0番目の色を透過色にしてはいけません。絶対にダメです。)

今回はこの画像に置き換えます。
https://i.imgur.com/4RM8NNO.png

step_c01からstep_c06でやる加工前の元画像
https://i.imgur.com/tJSkuTa.png

step_c01

まず最初にしないといけないことが一つあります。
イベント等、序章のプロローグで表示されるワールドマップは、 240×160なのですが、
そのまま、この画像を使うことができません。
以下のように、先頭8×8のタイルを後方に移動しなくてはいません。
そして、先頭の8×8をパレット0番で塗らないといけません。
i.imgur.com_wnll7fx.jpg

step_c02

画像の加工には、edgeを使います。
edgeを立ち上げて、240×160の画像を読み込みます。
i.imgur.com_uqwswnc.jpg

step_c03

メニューから、
設定 → キャンバスの大きさ変更 を選択します。
i.imgur.com_kjzwxjn.jpg

step_c04

240×160 から、高さを増やして、
240×168 に、変更します。
i.imgur.com_qdleyx7.jpg

step_c05

拡大などをうまく使い、
先頭の 8×8 ピクセルを切り取り・・・・
i.imgur.com_epgzrp8.jpg

step_c06

ファイル最後の行に移動させます。

i.imgur.com_r8tidle.jpg

必ず、先頭 8×8の部分が、
パレット0番の色で塗られていることを確認してください。

以上の処理をした画像をこれです。
もし、動作しない場合は、この画像と見比べてください。

画像ができたら、
次は、今までと同じように、NLZ-GBA Advanceで画像を入れます。

step_c07

NLZ-GBA Advance を立ち上げて、
左上の File handling をクリックし、
Load Rom で FE8聖魔のrom を読み込みます。

赤枠で囲った Compressed graphics にチェックが入っていることを確認してください。
緑枠で囲った Width に、30 と入力します。
青枠で囲った Offset に、B1E9B8 と入力します。
紫枠で囲った ROM Pallet offset に、 B23D3C と入力します。
そうすると、ウィンドウに
イベント等、序章のプロローグなどのイベントで表示されるワールドマップが表示されます。

i.imgur.com_brmzce8.jpg

step_c08

Import a bitmapをクリックします。
i.imgur.com_gqbofdf.jpg

step_c09

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
i.imgur.com_liovghe.jpg

step_c10

画像が変更できました。
i.imgur.com_memv39c.jpg

ここで・・・保存するまえに、やることがあります。

イベント等、序章のプロローグなどのイベントで表示されるワールドマップは、
TSAで、4つのパレットを8*8のタイルで切り替えて表示させています。
TSAの変更はいろいろと大変なので、4つのパレットをすべて同じ色にすることで対応します。

パレットは、0xB23D3C から、 0x20バイトずつ、4つあります。
今回、0xB23D3Cを設定したので、残りの3つを設定します。

パレット一覧
B23D3C(これはもう設定済み)
B23D5Cこれから設定する
B23D7C
B23D9C

step_c11

ROM Pallet offset を B23D5C に設定し、
Import a bitmapをクリックします。

i.imgur.com_zd10wjb.jpg

step_c12

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
同様に、設定してください。

i.imgur.com_ymac00k.jpg

step_c13

パレット B23D5C を設定できました。
i.imgur.com_tsdjuiz.jpg


どうように、パレット B23D7C と B23D9Cも設定してください。

パレット一覧
B23D3C(これはもう設定済み)
B23D5C(これはもう設定済み)
B23D7Cこれから設定する
B23D9C

step_c14

パレット B23D7C を設定します。
i.imgur.com_njiekgw.jpg

step_c15

パレット B23D9C を設定します。
i.imgur.com_oihebcg.jpg

step_c16

4つのパレットを設定し終わったら、
Write to ROM で結果をROMに保存します。
保存する前にromのバックアップは忘れずに。
i.imgur.com_hywgwob.jpg

step_c17

改造したromを読み込んでゲームを進めてみてください。
イベント等、序章のプロローグなどのイベントのワールドマップが、
オーストラリアになっているはずです。
i.imgur.com_ihowixi.jpg

トラブルシューティング

Q:画像がしましまになった。

A:パレットを4種類同一にしましたか?
step_c10あたりを見直してください。
i.imgur.com_scc82ch.jpg

Q:画面が淡色になりました。

A:先頭の8×8タイルを開け、パレット0番で塗っていますか?
step_c01あたりからやり直してください
i.imgur.com_nse360w.jpg

Q:16色を超える色を扱いたいです。

A:がんばって、TSAを設定してください。

ゲームOPで表示されるワールドマップを入れ替える

ゲームOPで一瞬だけ登場するワールドマップを入れ替えます。
この変更が一番ややこしいです。
難しい理由は、TSAを変更なくてはいけないためです。
そして、このTSAは圧縮されています。

OPをカットするパッチを使い、OPを消す予定の方は、
どうせ表示されないので無理して変更する必要はありません。

あえて、困難に挑みたい方は、がんばりましょう。

サイズ240×160
画像アドレス0xB4BBA0 圧縮されている
パレット0xB4FCD4
TSA0xB4F758 圧縮されている

今回は、この画像に置き換えます。
https://i.imgur.com/DW4i8QL.png

step_d01-step_d04でやる加工前の元画像
https://i.imgur.com/I0qC9T5.png

step_d01

OPのマップは240×160の画像で表示されますが、
インポートする画像は、 240×160ではダメです。
今回は、幅を+16した、 256×160の画像が必要です。
i.imgur.com_hfztzrm.jpg

step_d02

edgeを立ちあがて、メニューから、
設定 → キャンバスの大きさ変更
を選択します。
i.imgur.com_gydeixw.jpg

step_d03

幅を +16 して、
256×160 とします。
i.imgur.com_swjtq7p.jpg

step_d04

幅を追加したら、そのまま何もせずに、
保存して、edgeを終了します。

step_d05

画像を追加する前に、まだやることがあります。
TSAデータを更新する必要があります。
このまま画像を追加しても、TSAによって崩れた画像になってしまいます。
TSAには、8*8のタイルに画像を分割し、そのタイルがどこの位置で、どのパレットを利用しているか、反転などの操作をするかなどのい情報が格納されています。
今回の利用するTSAはさらにそのデータがlz77で圧縮されているのでとてもやっかいです。
私の方で、普通の画像を正しく表示する圧縮されたTSAを作成しておきましたので、これをご利用ください。

これどう使うのか?
バイナリエディタで、romに追加します。
TSAは0xB4F758なので、この領域に上書きすればいい・・・というわけではありません。

TSAデータは圧縮に不向きなデータ構造をしており、
圧縮すると逆にデータ容量が増えてしまうことがあります。
そして、今回作成したTSAは、運が悪いことに、もともとのTSAより大きいデータです。
そのため、元の領域にいれてしまうと、romが壊れます。

仕方ないので、romの末尾に追加します。
今回は、無改造romなので、 0x01000000 に追加します。
やり方を次に説明します。

step_d06

tsa.lz77.bin をバイナリエディタで開き、
全選択します。

i.imgur.com_tt4aks7.jpg

tsa.lz77.bin は、FE8_AU_PATCHの中にはいっています。
http://ux.getuploader.com/FE4/download/243/FE8_AU_PATCH.7z

step_d07

改造しているromの末尾 0x01000000 へコピーして追加しましょう。
Ctrl + C / Ctrl + V が使えます。
i.imgur.com_ta7h4c4.jpg

step_d08

コピーできました。
i.imgur.com_r8fedls.jpg

step_d09

そして、追加したTSAを参照するように、プログラムを直します。
TSAは0xB4F758ですので、
これを参照している場所を探します。

0xB4F758はポインタです。
GBAはROMは0x08000000 以降に配置されるので、ポインタにするには 0x08000000 を足さないといけません。

TSA 0xB4F758 + 0x08000000 = 0x08B4F758

そして、GBAは、PCと同じく、リトルエンディアンなので、
2バイトずつ逆順に記述しないといけません。

0x08B4F758
↓
0x08 B4 F7 58
↓
0x58 
0x58 F7
0x58 F7 B4
0x58 F7 B4 08
↓
0x58F7B408

よって、TSA 0xB4F758を参照するとき、
0x58F7B408 という値を利用します。

この値をromから検索してみると・・・
i.imgur.com_xxyhvrm.jpg

step_d10

見つかりました。
0xCBCFC : 58 F7 B4 08 ここが、TSAの値です。
これをROM末尾に増設した TSA のアドレスに置き換えます。
i.imgur.com_bmfh6ep.jpg

step_d11

ROM末尾のアドレスは、 0x01000000 です。
ですが、参照するとは、ポインタにしないといけないので、
0x08000000 を足して、0x09000000になります 。
0x01000000 + 0x08000000 = 0x09000000

GBAは、リトルエンディアンなので、0x09000000を変換します。

0x09000000
↓
0x00
0x00 00
0x00 00 00
0x00 00 00 09
↓
0x00000009

このようになります。

0xCBCFC を、58 F7 B4 08 から、 00 00 00 09 に変更します。
i.imgur.com_in2qmqy.jpg

step_d12

TSAの追加と、参照の変更をしたら、一度ROMを保存します。
(保存する前にバックアップを忘れずに。)

step_d13

やっと、画像を登録する準備ができした。

NLZ-GBA Advance を立ち上げて、
左上の File handling をクリックし、
Load Rom で FE8聖魔のrom を読み込みます。

赤枠で囲った Compressed graphics にチェックが入っていることを確認してください。
緑枠で囲った Width に、32 と入力します。(256/8=32)
青枠で囲った Offset に、B4BBA0 と入力します。
紫枠で囲った ROM Pallet offset に、 B4FCD4 と入力します。
そうすると、ウィンドウに
かなり崩れていますがワールドマップぽいのが表示されます。
崩れているのは、TSAを正しく設定していないためです。
i.imgur.com_khcyvf4.jpg

step_b14

Import a bitmapをクリックします。
i.imgur.com_hbe1uns.jpg

step_b15

パレットも設定するので Import palette to ROM にチェックを付けてください。
OKを押して次へ進みます。
i.imgur.com_q1gruk5.jpg

step_d16

画像が変更できました。
ROMを保存します。
(保存する前にバックアップを忘れずに。)
i.imgur.com_5hzt8sp.jpg

step_d17

ROMを読み込んで実行すると、
OPデモの最初に変更したオーストラリアが表示されます。
i.imgur.com_ymbffo5.jpg

トラブルシューティング

Q:引き裂かれて崩れた画像が表示されました。

A:TSAデータを更新しましたか?
step_d05当たりをよく確認してください。
i.imgur.com_kn4h4ua.jpg

Q:リセットがかかって進まない

A:正しいTSAデータを参照するようにしていますか?
step_d05当たりをよく確認してください。

guide/ワールドマップ画像の入れ替え.txt · 最終更新: 2018/09/23 18:59 by 211.14.62.193