ユーザ用ツール

サイト用ツール


サイドバー

guide:ワールドマップの道

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座標、つまり、上から下へ、分割してデータに格納していきます。

道は、8×8のタイルで構成されています。
そのため、道の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] 道の終点。

道データ

guide/ワールドマップの道.txt · 最終更新: 2018/09/09 00:42 (外部編集)