EU4のパッチの技術情報です。
もくてき
いままで解析してきたゲームを日本語化します。
さくせん その1
まず2バイト以上の文字が?(0x3F)になってしまう箇所を修正します。
なんとかして2バイトのコードポイントをその後の処理に渡して上げる必要があります。
ただし単純にUCS2に変換させると、バイト列に0x00バイトが出てきてしまい、失敗します。なぜならば0x00がnull文字だと勘違いされるからです。
そこでSHIFT_JISコード(実際にはCP932)を使います。これだとバイト列に0x00が出てきません。すべて1バイト文字だと錯覚させます。
でもまだ問題があります。このままだと後ろの処理で2バイト文字と1バイト文字との区別がつけられなくなってしまいます。
そこで適当な文字をエスケープ記号として使います。実験では0x10(伝送制御拡張)を使いました。他に使われてなさそうだからです。この後の文字は2バイト文字というオレオレルールにします。つまり下のような感じになります。
[ABあC] → [0x41][0x42][0x10][0x82][0xA0][0x43]
※もしくはUCS2に変換する方式をとって、バイト列に00があったときは0x01に置き換えて、さらにエスケープ文字を0x11にして、あとで1を引くというルールでも良いかもしれません。
さくせん その2
上記の理由でフォントデータのコードポイントはSHIFT_JISコードで作る必要があります。
BMFontのSVNにGeneratorのコードがあるので、これを改造してShiftJISのコードポイントになったフォントを吐き出すようにします。
それと、フォントのマッピング時にこんなことをしているので、ヒープを少し大きくして上げる必要があります。
後は1バイトづつ取り出して、対応する文字データを読み出している箇所で、エスケープ記号にした0x10が来た場合には、その後の2バイトをコードポイントとするように修正します。
次回はプログラムを改造する(2)です。