最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
FE8でフォントがない文字を表示させると、ハートマークになります。
ハートマークではなく、好きな文字を出せるようにする方法について説明します。
武器名などを表示するフォントと、台詞をしゃべるためのフォントは別物です。
まずは、どちらのフォントを改造したいのか、確認する必要があります。
どちらのフォントにせよ、デザインが違うだけで、基本的にやり方は同じです。
FE8には、武器フォントで鉄というフォントがなぜありません。
鉄の剣とすると、♡の剣になります。
step_a00
FE8にはありませんが、FE7には、鉄の剣というアイテムが有り、鉄という武器フォントが存在します。
もし、貴方がFE7をもっているならば、そこからフォントを頂いてくることが出来ます。
とりあえず、FE FONTを一度終了して、再度立ち上げ直してください。
立ち上げたら、 Load ROM を選択して FE8を開いてください。
(もちろん、FE7を立ち上げぱなしにしたり、設定を変えて再利用してもいいです。)
新規にフォントを追加するので、ROMの末尾にポインタが移動されました。
この領域に鉄という武器文字フォントを差し込みます。
(フォントはどこの領域にでも設定できるので、ほかに割り当てたい領域があればアドレスを移動してください。)
位置を調整する時は、サンプル倍率で変更すると、
フォントを拡大してみることができるので便利です。
サンプルとなっているものは、フォントを設定しやすくするための便利機能です。
ここでどんな設定をしても、設定には影響しません。
サンプル倍率を変更すれば、フォントを拡大して見やすくなります。
サンプル背景を変えれば、さまざまな背景下でフォントがどう見えるのかわかります。
サンプル文字列では、フォントの前の文字と後ろの文字を出して、つながりを見ることが出来ます。
(「あ鉄うえ」 と表示されているのは、サンプル文字列で、「あ○うえ」としているためです。○が現在変更している文字になります。)
武器文字は、ステータス画面や、メニュー等で使われるので、
サンプル背景色を変えて、どう見えるのか確認しましょう。
これは明らかに矛盾しています。という時の「矛」という台詞フォントがFE8にはありません。
今度は、矛というフォントを作ってみましょう。
鉄という武器フォントは、FE7にありましたが、
今回は多分ないと思うので、自分で書かなければいけません。
いちから書いてもいいのですが、何か参考になる物があったほうがいいです。
矛という字に似ている字で、FE8にあるとすれば、予という字でしょう。
予という字を取り出して、それを元に矛という字にしてみましょう。
変更する前に、パレットの解説をします。
すべてのフォントは、4色の画像です。(4色無圧縮画像としてrom内に保存されています)
4色画像なので、4色を超える色で画像を書いてはいけません。
利用できるのは、左上の4つのパレットだけです。
そして、一番左上の0番パレットは背景色となります。
実質3色で書く必要があります。
また、フォントのパレットは予め決まっています。
パレットの色を変更してもフォントの色としては反映されません。
パレットは以下のようになります。
0番 | 透明色 |
1番 | 中間色 |
2番 | 白色 |
3番 | 黒色 |
漢字とひらがなだと高さがちょっと違うので、
漢字同士並べた時の動作を確認したいものです。
こういうときには、サンプル文字列を利用します。
「これは○盾してる」などといれると、○の部分が変更したいフォントになります。
サンプル倍率を変えれば、拡大もできます。
サンプルという名前の項目を変更しても、保存されるデータには一切関与しないので、見やすいように調整してください。
さっそくゲームを開始して、入れたフォントを確認してみましょう。
先ほど差し込んだフォントによって、矛盾と表示されていますね。
https://i.imgur.com/WVOPce2.png
以上で、武器とセリフのフォントの改造方法
移植する時と、似ているフォントから作成する方法についての解説を終わります。
これでどんな文字でも作れるようになりました。
面白い物語を作ってくださいね。
此処から先はフォント構造がどうやって作られているのかという解析資料です。
特に読む必要はありませんが、詳しく知りたい方はどうぞ。
フォントはハッシュとリスト形式で管理されています。
聖魔武器フォントリストスタート | 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; }