Wikiマークアップ

目次

FE8でフォントがない文字を表示させると、ハートマークになります。
ハートマークではなく、好きな文字を出せるようにする方法について説明します。
i.imgur.com_9iilbuu.jpg
i.imgur.com_gpwfsfe.jpg

用意するもの

fefont
http://ux.getuploader.com/FE4/download/192/FeFont.zip

edge
http://takabosoft.com/edge

FEのフォントは2つあります。

武器名などを表示するフォントと、台詞をしゃべるためのフォントは別物です。
まずは、どちらのフォントを改造したいのか、確認する必要があります。

どちらのフォントにせよ、デザインが違うだけで、基本的にやり方は同じです。

武器フォント てつのけんを鉄の剣にしよう。

FE8には、武器フォントで鉄というフォントがなぜありません。
鉄の剣とすると、♡の剣になります。
i.imgur.com_9iilbuu.jpg

step_a00
FE8にはありませんが、FE7には、鉄の剣というアイテムが有り、鉄という武器フォントが存在します。
もし、貴方がFE7をもっているならば、そこからフォントを頂いてくることが出来ます。

step_a01

fefontを起動します。
i.imgur.com_rmotxpp.jpg

step_a02

Load ROMで fe7 をロードします。
i.imgur.com_l3bbqxe.jpg

step_a03

FE7の武器のフォントを参照したいので、コンボボックスから、
FE7烈火 武器文字 を選択します。
i.imgur.com_xrlho8z.jpg

step_a04

参照したいのは、「鉄」ですので、
文字に「鉄」と入れます。
i.imgur.com_wdd0ymt.jpg

step_a05

検索ボタンを押して、文字を探します。
i.imgur.com_cwwsojn.jpg

step_a06

文字が見つかりました。
i.imgur.com_njamvtz.jpg

「あ鉄うえ」と表示されているのは、フォントサンプルを描画しているためです。
後で説明します。

step_a07

文字が出たので、画像エクスポートボタンでpng画像として保存してください。
次は、このフォントをFE8に移植します。
i.imgur.com_sajj5sm.jpg

step_a08

とりあえず、FE FONTを一度終了して、再度立ち上げ直してください。
i.imgur.com_sn13xbp.jpg

立ち上げたら、 Load ROM を選択して FE8を開いてください。
i.imgur.com_r3pj7na.jpg

(もちろん、FE7を立ち上げぱなしにしたり、設定を変えて再利用してもいいです。)

step_a09

FE8聖魔の武器文字に、フォントを追加するので、
一番上の「FE8聖魔 武器文字」を選択します。
i.imgur.com_nycxb0d.jpg

step_a10

FE8のROMから、該当文字を探すので、
文字に「鉄」と入れ、検索ボタンを押してください。
i.imgur.com_ogruqwy.jpg

step_a11

FE8には、「鉄」という武器文字フォントがないので、該当するフォントはありませんとエラーが表示されました。
とりあえず、OKを押します。
i.imgur.com_zog6est.jpg

step_a12

新規にフォントを追加するので、ROMの末尾にポインタが移動されました。
この領域に鉄という武器文字フォントを差し込みます。
(フォントはどこの領域にでも設定できるので、ほかに割り当てたい領域があればアドレスを移動してください。)
i.imgur.com_ozm5ffh.jpg

step_a13

画像インポートを選択し、先ほどもってきた「鉄」という武器文字フォント画像を指定します。
i.imgur.com_fe3lvjg.jpg

step_a14

インポートできました。
(まだ結果は確定していません。)
i.imgur.com_bwm0qis.jpg

step_a15

文字幅があっていないので、文字幅を調整して、
後ろの文字がいい感じの位置に来るようにしてください。
i.imgur.com_cjbms5t.jpg

step_a16

位置を調整する時は、サンプル倍率で変更すると、
フォントを拡大してみることができるので便利です。
i.imgur.com_xzvstoo.jpg

サンプルとなっているものは、フォントを設定しやすくするための便利機能です。
ここでどんな設定をしても、設定には影響しません。

サンプル倍率を変更すれば、フォントを拡大して見やすくなります。
サンプル背景を変えれば、さまざまな背景下でフォントがどう見えるのかわかります。
サンプル文字列では、フォントの前の文字と後ろの文字を出して、つながりを見ることが出来ます。
(「あ鉄うえ」 と表示されているのは、サンプル文字列で、「あ○うえ」としているためです。○が現在変更している文字になります。)

武器文字は、ステータス画面や、メニュー等で使われるので、
サンプル背景色を変えて、どう見えるのか確認しましょう。
i.imgur.com_f9omivd.jpg

step_a17

ここまで確認して、問題なさそうであれば、
Write ROM ボタンで、ROMに焼きこみます。
i.imgur.com_t3fpl3w.jpg

step_a18

早速ゲームを開始してみましょう。
先ほど差し込んだフォントによって、鉄の剣と、正しく表示されているはずです。
i.imgur.com_gbnyqa3.jpg

台詞フォントにない文字を作ろう

これは明らかに矛盾しています。という時の「矛」という台詞フォントがFE8にはありません。
今度は、矛というフォントを作ってみましょう。
i.imgur.com_gpwfsfe.jpg

鉄という武器フォントは、FE7にありましたが、
今回は多分ないと思うので、自分で書かなければいけません。
いちから書いてもいいのですが、何か参考になる物があったほうがいいです。
矛という字に似ている字で、FE8にあるとすれば、予という字でしょう。
予という字を取り出して、それを元に矛という字にしてみましょう。

step_b01

Load ROM で FE8 の ROMを読み込みます。
i.imgur.com_r3pj7na.jpg

step_b02

FE8聖魔 セリフ文字を選択します。
i.imgur.com_29xexyd.jpg

step_b03

いきなり、矛をつくるとつらいので似ている文字として、
予を取得します。

文字に「予」と入れ、検索ボタンを押してください。
i.imgur.com_rxsocgp.jpg

step_b04

予というフォントがあったので表示されました。
i.imgur.com_hwof8yo.jpg

step_b05

背景色がちょっと読みづらいので変更しましょう。
i.imgur.com_xhjsqz9.jpg

step_b06

セリフの吹き出しと同じ色にしてみました。
i.imgur.com_ie1bzcm.jpg

step_b07

この、予という字をもとに、矛というフォントを作ります。
画像エクスポートで png画像として取り出します。
i.imgur.com_ivdn5jg.jpg

step_b08

edge取り出した画像を edge で開いてください。
i.imgur.com_jlctigd.jpg

step_b09

変更する前に、パレットの解説をします。
すべてのフォントは、4色の画像です。(4色無圧縮画像としてrom内に保存されています)
4色画像なので、4色を超える色で画像を書いてはいけません。
利用できるのは、左上の4つのパレットだけです。
そして、一番左上の0番パレットは背景色となります。
実質3色で書く必要があります。
i.imgur.com_16izyju.jpg

また、フォントのパレットは予め決まっています。
パレットの色を変更してもフォントの色としては反映されません。
パレットは以下のようになります。

0番透明色
1番中間色
2番白色
3番黒色

step_b10

予に書き足して、矛にしてみました。
簡単な修正ですが、それっぽく見えますでしょうか?

i.imgur.com_jexibwk.jpg

満足のいくものができたら、入れ込み作業を行います。

step_b11

FE Fontで、
文字を「矛」にして検索ボタンを押します。
i.imgur.com_o43bsbv.jpg

step_b12

「矛」という文字はないので、エラーが表示されますが、
OKボタンを押してそのまま進みます。
i.imgur.com_unolpl3.jpg

step_b13

武器フォントの時にも説明しましたが、フォントはどこのアドレスにでも置けるので、好きな空き領域に配置してください。
(何も設定しないと、ROM末尾に追加になります。)
i.imgur.com_l6iqdmq.jpg

step_b14

画像インポートで、先ほど作った「矛」というpng画像を読み込みます。
i.imgur.com_ac4uugq.jpg

step_b15

読み込めました。
i.imgur.com_xhbabis.jpg

step_b16

漢字とひらがなだと高さがちょっと違うので、
漢字同士並べた時の動作を確認したいものです。

こういうときには、サンプル文字列を利用します。
「これは○盾してる」などといれると、○の部分が変更したいフォントになります。
i.imgur.com_59b6o7j.jpg

サンプル倍率を変えれば、拡大もできます。
サンプルという名前の項目を変更しても、保存されるデータには一切関与しないので、見やすいように調整してください。
i.imgur.com_ddm4zsv.jpg

step_b17

フォントの字幅を調整してください。
そして、満足いくのができたら、 Write ROMで保存してください。
i.imgur.com_c4z02wa.jpg

step_b18

さっそくゲームを開始して、入れたフォントを確認してみましょう。
先ほど差し込んだフォントによって、矛盾と表示されていますね。
https://i.imgur.com/WVOPce2.png


以上で、武器とセリフのフォントの改造方法
移植する時と、似ているフォントから作成する方法についての解説を終わります。
これでどんな文字でも作れるようになりました。
面白い物語を作ってくださいね。

トラブルシューティング

Q:インポートしたフォントが何かおかしい

A.左上の4色だけで書いていますか?
4番目の黒色と間違えて、5番目以降の黒色で書いていることが有ります。
ちゃんと、左上の4つの色だけで書いているか確認してください。

i.imgur.com_16izyju.jpg

技術資料

此処から先はフォント構造がどうやって作られているのかという解析資料です。
特に読む必要はありませんが、詳しく知りたい方はどうぞ。

アルゴリズム

フォントはハッシュとリスト形式で管理されています。

聖魔武器フォントリストスタート0x57994c
聖魔セリフフォントリストスタート0x593f74
烈火武器フォントリストスタート0xbc1fec
烈火セリフフォントリストスタート0xbdc1e0
封印武器フォントリストスタート0x59027c
封印セリフフォントリストスタート0x5a82b0

(海外版FEはアルゴリズムが違うような気がするので未対応。)

フォントリストスタートから、たくさんのフォントリストのポインタが伸びています。
どのフォントリストを使うかは、SJISの1バイト目を利用して以下の計算式で決定します。

探索するリスト=フォントリストスタート + (SJIS1バイト目 << 2) - 0x100


例えば、聖魔武器フォントで、紋SJIS(0xE496)だと、

例:紋 SJIS(0xE496)
0x57994c + (0xE4 << 2) - 0x100 = 0x579BDC


よって、0x579BDCから、0xE4?? フォントリストがスタートします。

このフォントリストを、2バイト目 0x96 を頼りに、
0x579BDCから fontlist→next と、線形にたどります。
そして、 fontlist→SJIS2 == 0x96 のを見つけたら、
それが「紋」のフォントのデータということになります。

フォント構造体

フォントのビットマップデータは、1文字72バイト(0x48)の固定長でリスト構造
先頭4バイトは次のリストへのポインタ 終端はNULL
5バイト目が探索のためのSJISの2バイト目の1バイト (例: 紋 SJIS(0xE496)だと、0x96)
6バイト目が文字幅(次の文字を描くとき、このサイズだけ空ける cssでいうleft-paddingみたいな)
7バイト目は謎
8バイト目は謎
以下 64バイト(0x40)の4bit無圧縮ビットマップデータです。

//フォント構造について、Cで書くと、こういうリスト構造だと思われる.

struct fontlist
{
    fontlist* next;	//次のフォントポインタ。 終端の場合は 0x00 00 00 00 だと思う。
    BYTE SJIS2;	//紋 SJIS(0xE496)だと、2バイト目の 0x96 が入る.
    			//ここが不一致だと、文字が出ずに不明な文字としてハートになる
    BYTE WIDTH;	//文字幅(次の文字を描くとき、このサイズだけ空ける cssでいうpaddingみたいな)
    			//0x09だと、次の文字を 9ドット開けて描く。(多分)
    			//0x00だと、余白がなく次の文字とかぶさってしまう。
    BYTE dummy[2];	//意味不明(もしかしたら文字によって何か変わる可能性もあり、要検証)
    BYTE bitmap[64]; //無圧縮 4bit bitmap
    			//0(2進数:00) -> 透明
    			//1(2進数:01) -> 薄いグレー
    			//2(2進数:10) -> 白
    			//3(2進数:11) -> 黒
    			//4(2進数:0100) -> 1ドット目は透明で、その1ドット横に薄いグレー。
    			//...
    			//よって、0xFF で 4ドットの黒い線が引ける.
    			//64バイト 0xFFで埋めると、■な四角形。
    			//4バイトで1ラインっぽい。 つまり、4バイト*4ドット=16ドット描ける。
    			//64バイト/4=16 なので、 横 16ドット  縦 16ドットなはず・・・
    			//ただ、64バイト 0xFFで埋めると、正方形ではなく横長の長方形っぽい絵になるので、違うのかもしれない
};

擬似コード

//紋 SJIS(0xE496)
byte sjis1 = 0xE4;
byte sjis2 = 0x96;
dword topaddress = 57994c;

fontlist* p = topaddress + (sjis1 << 2) - 0x100;

while(*p)
{
	if ( p->check == sjis2 )
	{//探していたフォント
		//p->width  文字幅
		//p->bitmap フォント画像
		return p;
	}
	//次のリストへ
	p = p->next;
}