トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

解説/ワールドマップ画像の入れ替え

Last-modified: 2018-08-02 (木) 00:05:53 (822d)

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

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

概要

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

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

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

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

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

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

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

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

サイズ240x160
画像アドレス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を入れ替えてみます。

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

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

step_a01

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

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

step_a02

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

step_a03

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

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

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

step_a04

Import a bitmapボタンをクリックします。
http://i.imgur.com/fUKIslr.jpg

step_a05

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

step_a06

minimapが置き換わるはずです。
http://i.imgur.com/73NxyMa.jpg

step_a07

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

step_a08

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

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

http://i.imgur.com/4o1KlLU.jpg

トラブルシューティング

Q:NLZ-GBA Advanceが動かない

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

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

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

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

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

今回は、この画像におきかえてみます。 http://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 と入力します。
そうすると、ウィンドウに ワールドマップが表示されます。

http://i.imgur.com/gbFAqdK.jpg

step_b02

Import a bitmapをクリックします。
http://i.imgur.com/bmTqUYC.jpg

step_b03

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

step_b04

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

http://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をクリックします。
http://i.imgur.com/wVtAVLe.jpg

step_b06

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

step_b07

パレット B1B298 を設定できました。
http://i.imgur.com/EWizrlk.jpg

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

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

step_b08

パレット B1B2B8 を設定します。
http://i.imgur.com/DLFUp0O.jpg

step_b09

パレット B1B2D8 を設定します。
http://i.imgur.com/dYHp7Gd.jpg

step_b10

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

step_b11

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

step_b12

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

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

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

http://i.imgur.com/hwdCFOd.jpg

トラブルシューティング

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

A:パレットを4種類同一にしましたか?
step_b05あたりを見直してください。
http://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タイル
(480x320 は、 (480/8)*(320/8)=2400タイル)

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

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

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

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

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

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

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

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

step_c01

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

step_c02

画像の加工には、edgeを使います。
edgeを立ち上げて、240x160の画像を読み込みます。
http://i.imgur.com/UQwSWNc.jpg

step_c03

メニューから、
設定 -> キャンバスの大きさ変更 を選択します。
http://i.imgur.com/KJzwXjN.jpg

step_c04

240x160 から、高さを増やして、
240x168 に、変更します。
http://i.imgur.com/qDLEYX7.jpg

step_c05

拡大などをうまく使い、
先頭の 8x8 ピクセルを切り取り・・・・
http://i.imgur.com/EpGZrp8.jpg

step_c06

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

http://i.imgur.com/R8tidLe.jpg

必ず、先頭 8x8の部分が、
パレット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 と入力します。
そうすると、ウィンドウに
イベント等、序章のプロローグなどのイベントで表示されるワールドマップが表示されます。

http://i.imgur.com/bRmzce8.jpg

step_c08

Import a bitmapをクリックします。
http://i.imgur.com/gqBofDf.jpg

step_c09

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

step_c10

画像が変更できました。
http://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をクリックします。

http://i.imgur.com/zD10wjB.jpg

step_c12

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

http://i.imgur.com/YMac00k.jpg

step_c13

パレット B23D5C を設定できました。
http://i.imgur.com/tsDjUiz.jpg


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

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

step_c14

パレット B23D7C を設定します。
http://i.imgur.com/NJIeKgw.jpg

step_c15

パレット B23D9C を設定します。
http://i.imgur.com/oihEbcg.jpg

step_c16

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

step_c17

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

トラブルシューティング

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

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

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

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

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

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

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

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

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

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

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

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

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

step_d01

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

step_d02

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

step_d03

幅を +16 して、
256x160 とします。
http://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 をバイナリエディタで開き、
全選択します。

http://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 が使えます。
http://i.imgur.com/ta7h4c4.jpg

step_d08

コピーできました。
http://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から検索してみると・・・
http://i.imgur.com/XXYhvRM.jpg

step_d10

見つかりました。
0xCBCFC : 58 F7 B4 08 ここが、TSAの値です。
これをROM末尾に増設した TSA のアドレスに置き換えます。
http://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 に変更します。
http://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を正しく設定していないためです。
http://i.imgur.com/KhcYvF4.jpg

step_b14

Import a bitmapをクリックします。
http://i.imgur.com/HBe1Uns.jpg

step_b15

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

step_d16

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

step_d17

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

トラブルシューティング

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

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

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

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