FE7J FE8J用に作られた改造ROMの翻訳が容易になります。
逆に、FE7U FE8U用に作られた改造ROMの翻訳が容易になります。
今のところ、英語(アスキーコード)と、日本語(SJIS)ですが、理屈の上では何語でも行けるはずです。
(さすがに、アラビア語みたいに、右から左に書くような言語は無理かもしれませんが・・・)
TBLと比べると、以下のメリットがあります。
・マルチバイトとシングルバイトが同居が共存可能である。
・修正が容易である。
A-2. ツール→パッチで、 Anti-Haffman と、 DrawMultiByte の2つのパッチを適用します。

A-3. 文字列を翻訳します。
ツール→ROM翻訳ツール で、テキストのエクスポート/インポートができます。
個別に翻訳してもいいです。
とりあえず、わかりやすいアイテムの名前だけを変えてみましょう。


A-4. フォントをインポートします.
ツール→ROM翻訳ツール から、FE8J FE7J ROMを指定して、表示に利用するフォントをインポートします。
足りないフォントだけをインポートするので何度インポートしても安全です。
A-2. ツール→パッチで、 Anti-Haffman と、 DrawSingleByte の2つのパッチを適用します。

A-3. 文字列を翻訳します。
ツール→ROM翻訳ツール で、テキストのエクスポート/インポートができます。
個別に翻訳してもいいです。
とりあえず、わかりやすいアイテムの名前だけを変えてみましょう。


A-4. フォントをインポートします。
ツール→ROM翻訳ツール から、FE8U FE7U ROMを指定して、表示に利用するフォントをインポートします。
足りないフォントだけをインポートするので何度インポートしても安全です。

A-5. F5キーでエミュレータを起動して、動作を確認します。

注意点:
ただし、FE8J FE7Jには、“文字列”を経由しない直接Shift-JIS指定があるので、そこも忘れずに翻訳しないといけません。
地形とか、メニューとか、FE7Jだとサウンドルームとか。ともに、FEBuilderGBAから簡単に変更できます。
Anti-Haffman と、 DrawMultiByte / DrawSyngleByte の 2つのパッチによって実現します。
Anti-Haffmanにより、符号テーブルを無視して文字を格納します。
DrawMultiByte / DrawSyngleByteにより、表示するときに、マルチバイトとシングルバイト用のフォントを表示します。
フォントは、既存のROMからインポートします。
共に、FEBuilderGBAに含まれています。
ソースコードも patchディレクトリの下に付属しています。
マルチバイト環境でシングルバイトを出すために、シングルバイトフォントは、0x40 XX にマッピングしています。
FontForm.cs を読むのが一番わかりやすい。
FEでは主に2つのフォントがあります。
ItemFont アイテム表示で使われる、白く枠抜きされたフォント。 SerifFont セリフの吹き出しで利用されるフォント。
これ以外にもいくつかありますが、それらは数が少ないので対象外です。
マルチバイトでは、以下のように演算が行われます。
struct FONT{
FONT* next;
byte sjis2_hash;
byte width;
byte nazo1; //unknown
byte nazo2; //unknown
byte[64] bitmap4color;
};
SJIS1 = ((moji_char >> 8) & 0xFF)
SJIS2 = (moji_char 0xFF)
if (SJIS1 < 0x1f)
{
return NOT_FOUND;
}
font = ItemFont + (SJIS1 << 2) - 0x100;
font = SerifFont + (SJIS1 << 2) - 0x100;
while(font != NULL)
{
if ( font->sjis2_hash == SJIS2 )
{//found!
return font;
}
font = font->next;
}
return NOT_FOUND;
日本語版では、シングルバイトをフォントとして組み込むために、 シングルバイトを0x40のリストにマップしました。
例. 'A' == 0x41 + (0x40 << 8) 0x40 0x41 としてフォントにマップします。 'Z' == 0x5A + (0x40 << 8) 0x40 0x5A としてフォントにマップします。
英語版では、以下のように演算が行われます。
struct FONT{
FONT* next;
byte sjis2_hash;
byte width;
byte nazo1; //unknown
byte nazo2; //unknown
byte[64] bitmap4color;
};
SJIS1 = ((moji_char >> 8) & 0xFF) //Always Zero
SJIS2 = (moji_char 0xFF)
font = ItemFont + (SJIS2 << 2) ;
font = SerifFont + (SJIS2 << 2) ;
//探索する必要がないのでそのまま採用.
return font;
/*
while(font != NULL)
{
if ( font->sjis2_hash == SJIS2 )
{//found!
return font;
}
font = font->next;
}
return NOT_FOUND;
*/
英語版での、リスト探索を復活させました。
マルチバイトであれば、リストを探索します。