トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

解説/FEBuilderGBA/ROM翻訳_JP のバックアップ差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#author("2017-10-07T01:18:11+09:00","","")
*ROM翻訳 [#ybeaf730]

FE7U FE8U に、マルチバイト表示ルーチンを追加します。~
FE7J FE8J に、シングルバイト表示ルーチンを追加します。~
(FE6Jはまだ未対応)~


*何が嬉しいか? [#zde365af]
FE7J FE8J用に作られた改造ROMの翻訳が容易になります。~
逆に、FE7U FE8U用に作られた改造ROMの翻訳が容易になります。~

今のところ、英語(アスキーコード)と、日本語(SJIS)ですが、理屈の上では何語でも行けるはずです。~
(さすがに、アラビア語みたいに、右から左に書くような言語は無理かもしれませんが・・・)~

*既存手法との比較 [#vb6ac488]
TBLと比べると、以下のメリットがあります。~

・マルチバイトとシングルバイトが同居が共存可能である。~
・修正が容易である。~


*遊び方 [#k8410ca1]
**FE8U FE7Uの場合 [#pbf2a23d]
A-1. FEBuilderGBAで ROMを開きます。~
A-2. ツール->パッチで、 Anti-Haffman と、 DrawMultiByte の2つのパッチを適用します。~
A-3. 文字列を翻訳します。~
ツール->ROM翻訳ツール で、テキストのエクスポート/インポートができます。~
個別に翻訳してもいいです。~
~
A-4. フォントをインポートします.~
ツール->ROM翻訳ツール から、FE8J FE7J ROMを指定して、表示に利用するフォントをインポートします。~
足りないフォントだけをインポートするので何度インポートしても安全です。~
A-5. F5キーでエミュレータを起動して、動作を確認します。~
~

**FE8J FE7Jの場合 [#n15fb146]
A-1. FEBuilderGBAで 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から簡単に変更できます。~


*技術情報 [#c629c977]
Anti-Haffman と、 DrawMultiByte / DrawSyngleByte の 2つのパッチによって実現します。~
~
Anti-Haffmanにより、符号テーブルを無視して文字を格納します。~
DrawMultiByte / DrawSyngleByteにより、表示するときに、マルチバイトとシングルバイト用のフォントを表示します。~
フォントは、既存のROMからインポートします。~
~
共に、FEBuilderGBAに含まれています。~
ソースコードも patchディレクトリの下に付属しています。~
~
マルチバイト環境でシングルバイトを出すために、シングルバイトフォントは、0x40 XX にマッピングしています。~
~

*文字コードについて [#l742036e]
FontForm.cs を読むのが一番わかりやすい。~
~
FEでは主に2つのフォントがあります。
 ItemFont	アイテム表示で使われる、白く枠抜きされたフォント。
 SerifFont	セリフの吹き出しで利用されるフォント。
~
これ以外にもいくつかありますが、それらは数が少ないので対象外です。~
~
**マルチバイト [#i54f1b55]
マルチバイトでは、以下のように演算が行われます。~
 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 としてフォントにマップします。



**シングルバイト [#ra88b418]
英語版では、以下のように演算が行われます。~
 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;
 */
~
英語版での、リスト探索を復活させました。~
マルチバイトであれば、リストを探索します。~