FE8聖魔の光石で、\\ ワールドマップに自由に道を引く方法を説明します。
====== そもそも道を引くには? ======
ワールドマップで道を引くイベント命令は、以下のようになります。\\
魔伝への道を引く
40900000
1b000000
ヴェルニへ道を引く
40900000
09000000
40900000 XX000000 XX=道ID で、道を引くことが出来ます。\\
道を引く命令は他にもあります。(aeraさんのWMcode.txtより)\\
40900000 XX000000 道を出す(上で解説しましたね)
40910000 XX000000 静かに道を出す
40920000 XX000000 道を消す
また、主人公を拠点へ転送する命令もあります\\
60C30000 00000F00 XX000000 40850000 00000000 XX=拠点ID
(他にも移動命令は有ります)
その他の命令は、こちらをご覧ください。\\ NG MANSIONの[FE8]WMイベントコード\\ http://ngmansion.webcrow.jp/wp/2016/02/22/fe8wm%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/
====== ワールドマップの道データ ======
ワールドマップ道データは、\\ 0x1F6340 から順番に並んでいます。\\ (laqieerさんのコメントを参考にしています)\\ \\ 道のデータは以下の12バイトのデータです。\\ これが、 0x1F6340 から、道IDの順番に格納されています。\\
struct route{
void* pointer1; //道の形を定義するポインタ
byte 起点拠点ID; //道の開始起点となる拠点ID
byte 終点拠点ID; //道の終点起点となる拠点ID
byte zero1; //謎 00固定
byte zero2; //謎 00固定
void* pointer2; //道を主人公がたどるパスを定義するポインタ
//nullを指定すると、拠点間の最短ルートを通る。
//直線の道ならばnullでok.
};
拠点IDとは、ProjectFEGBAの自動イベントの拠点コードです。\\
====== pointer1の内容 道の形 ======
pointer1の道の形は、以下のデータ構造です。\\ 結構変なデータ構造になります。\\
struct route_pointer1 {
byte X座標; //ワールドマップ座標 / 8 を書く
byte Y座標; //ワールドマップ座標 / 8 を書く
byte 個数; //このY行目にタイルがX方向にいくつ並んでいるか
byte dummy1; //必ず 0x01 になるらしい
//このY行のXデータが 個数 分続く.
struct route_line {
byte タイル番号 // (tile & 0xFF) - 1 0からスタート
byte タイルフラグ // 回転ないなら0 、回転があればそれ以外の数字?
}
route_line arr[X軸個数];
};
route_pointer1[Y軸個数];
終端データ
FF 00 00 00
道をY座標、つまり、上から下へ、分割してデータに格納していきます。\\ \\ 道は、8x8のタイルで構成されています。\\ そのため、道のX座標とY座標は、ワールドマップ座標/8 したものになります。\\ \\ 例えば、こういうL字型の道があったとしたら、\\
AB
CDEF
その道の形を定義するpointer1の先にある内容はこうなります。\\
X座標 = AのX / 8
Y座標 = AのY / 8
個数 = ABの2つだから2
dummy1= 常に1
Aタイル番号
Aタイル番号フラグ
Bタイル番号
Bタイル番号フラグ
C座標 = CのX / 8
C座標 = CのY / 8
個数 = CDEFの4つだから4
dummy1= 常に1
Cタイル番号
Cタイル番号フラグ
Dタイル番号
Dタイル番号フラグ
Eタイル番号
Eタイル番号フラグ
Fタイル番号
Fタイル番号フラグ
FF 終端データ
00
00
00
と、いう風になります。\\ \\ これをいちいち手で書くと辛いので、laqieerさんがツールを作ってくれました。\\
[FE8] World Map Routes Insertion\\ http://feuniverse.us/t/fe8-world-map-routes-insertion/1718 \\ \\ \\ タイルセット番号とタイル番号フラグを知りたい方は、このプログラムを詳しくて見てみるといいです。\\ \\
====== pointer2の内容 パス ======
とりあえず、普通の道だったら、 pointer2 = 00000000 (null)を指定しておけば、
拠点間を直線で移動してくれます。
struct position{
BYTE nazo_header1;
BYTE nazo_header2;
BYTE zero1;
BYTE zero2;
u16 x;
u16 y;
};
終端
FF FF FF FF
\\ 道の起点から、移動するマップの座標をマップのワールド座標で記載する。\\ ワールド座標とは、 拠点等を設置するときに使う WORD(u16 リトルエンディアン)の座標系です。\\ \\ 道の起点から、position position position ... と位置を記載していき、 FF FF FF FF の終端コードで終わる。\\ \\ \\ 道の起点と、道の終点の座標は不要。あくまでも途中の経路の座標を書く。\\ \\ つまり、道の起点と道の終点が、直角で折れ曲がるL字を書く場合は、\\ L字の角のposition1つだけと終端コードFF FF FF FF になる。\\ 道の起点 [position] [FF FF FF FF] 道の終点。\\
====== 道データ ======
[[:WM命令:道]]