PC ゲーム Dishonored - Definitive Edition で Scaleform 日本語フォント、ビットマップ日本語フォントを追加する方法
ゲームエンジンに Unreal Engine 3 を採用している PC ゲーム Dishonored - Definitive Edition に日本語フォント(Scaleform フォント、ビットマップフォント)を追加する方法がわかりましたので、この記事ではそのやり方を説明します。
この方法で日本語フォントを追加することで、Dishonored 日本語化ファイル の日本語フォントに収録されていない日本語文字の 文字化け問題 を解決する見込みがあるので、DLC の未翻訳部分の翻訳や修正したい場合などによる文字化けの心配がなくなることが期待できます。
また、この日本語フォント追加方法で実績解除ができて、クリアまでクラッシュせず安定してプレイできるようであれば、Dishonored 日本語化ファイル に含まれる日本語フォントの配布問題を解決できる可能性があります。
PC ゲーム Dishonored - Definitive Edition 日本語化基本情報
今回、日本語フォントを追加するためにインストールした Steam 版 Dishonored - Definitive Edition と GOG 版 Dishonored - Definitive Edition です。
Steam 版 だけでなく GOG 版 でも日本語化可能なので、どちらのバージョンでも日本語フォントの追加は可能です。
Steam 版 Dishonored - Definitive Edition でインストール先フォルダを開きたい場合、Steam ライブラリからプロパティ画面を開き、ローカルファイルを閲覧をクリックすることでインストール先フォルダにすぐにアクセスできます。
または、Steam ライブラリでタイトルを右クリック → 管理 → ローカルファイルを閲覧、をクリックすることでインストール先フォルダを開くこともできます。
Steam 版・GOG 版 Dishonored - Definitive Edition 起動ロゴスキップ方法
日本語フォントとは関係ない内容ですが、ゲーム起動時に再生される企業ロゴをスキップする方法です。
Steam 版 の場合、Steam ライブラリで Dishonored - Definitive Edition プロパティ画面を開き、一般タブで 「起動オプションを設定...」 をクリックします。
起動オプション画面で 「-nostartupmovies
」 を入力します。ゲーム起動時に起動ロゴがスキップされて、ロード画面が表示されれば成功です。
GOG 版 の場合は、ゲームインストール時に自動的に作成または手動で作成したショートカットのプロパティ画面を開き、リンク先に 「 -nostartupmovies
」 を入力します。
ショートカットからゲームを起動、起動ロゴがスキップされて、ロード画面が表示されれば成功です。
PC ゲーム Dishonored - Definitive Edition upk フォントファイルアンパック
日本語フォントを追加するために、フォントデータを含む英語版 upk ファイルをアンパックする必要があります。
作業用フォルダを用意して、Dishonored\DishonoredGame\CookedPCConsole
フォルダにある英語版 DisFonts_SF.upk
と UI_Loading_SF_LOC_INT.upk
ファイルをコピーして配置します。
まずはコピーした DisFonts_SF.upk
と UI_Loading_SF_LOC_INT.upk
ファイルを Unreal Package Decompressor でデコンプレス(decompress.exe へ upk ファイルをドラッグアンドドロップ)します。
unpacked フォルダが生成されて、デコンプレスされた upk ファイルがフォルダに格納されます。
unpacked フォルダにある Unreal Package Decompressor でデコンプレスされた DisFonts_SF.upk
と UI_Loading_SF_LOC_INT.upk
ファイルです。デコンプレス前と比べてファイルサイズが増えているのが確認できます。
次にデコンプレスした DisFonts_SF.upk
と UI_Loading_SF_LOC_INT.upk
ファイルを、Dishonored 日本語化ファイルに含まれるアンパックツール か Unreal Package Extractor でアンパックします。
どちらのツールでもアンパックできますが、Dishonored 日本語化ファイルに含まれるアンパックツール では各ファイルのサイズとオフセットが記述されている ExportTable.Log
ファイルが出力されます。upk ファイルに日本語フォントバイナリデータを追加する際に、このサイズとオフセット値のバイナリデータを探して書き換える必要があります。
各ファイルのサイズとオフセットについては ExportTable.Log
がなくても自力で探すことも可能ですが、特に理由がない限りは Dishonored 日本語化ファイルに含まれるアンパックツール でアンパックした ExportTable.Log
から特定したほうが楽でしょう。
アンパックしたファイル から Scaleform フォントの場合は FFDec でフォントを追加、ビットマップフォントの場合は UDK で生成した upk フォントファイルのバイナリデータに入れ替え ます。これらのファイルを デコンプレスした upk ファイル にバイナリデータを追加して、一部のバイナリデータを修正することで日本語フォントを表示できるようになります。
ちなみに英語版 Dishonored - Definitive Edition では Scaleform フォントとビットマップフォントをそれぞれ 2種類用意して使用しています。(日本語化ファイルの Scaleform フォント、ビットマップフォントともに 1種類のみ)
Dishonored の Scaleform フォントは GFxUI.int ファイルで、ビットマップフォントは DishonoredGame.int ファイルで指定されています。Scaleform フォントやビットマップフォントに一つしか日本語フォントを使わないのであれば、もう一つのフォントの追加やバイナリデータを書き換える必要はなくなるので、その分ファイルサイズが軽くなり作業する手間が少なくて済みます。
この記事では用意されている 2種類のフォントに同じフォントを指定して、バイナリデータを書き換えて日本語フォントを追加という形で進めます。
Dishonored - Scaleform 日本語フォント追加方法(DisFonts_SF.upk へバイナリデータ追加・書き換え)
英語版 DisFonts_SF.upk
からアンパックしたファイル を、ツールやバイナリエディタで Scaleform フォントファイルを編集して日本語フォントを追加します。
この方法であれば Dishonored 日本語化ファイル に含まれる Scaleform フォントを使わないで、英語版 upk ファイルに日本語フォントを追加することができます。
gfxfontlib.SwfMovie バイナリデータ修正、gfxfontlib.gfx にファイル名変更
DisFonts_SF.upk ファイルアンパック 後、DisFonts_SF\DisFonts
フォルダにある gfxfontlib.SwfMovie
ファイルをバイナリエディタで開きます。
バイナリエディタで gfxfontlib.SwfMovie
ファイルヘッダー 92バイトを削除して、バイナリデータ先頭を GFX ~という形にします。
削除した 92バイトは後で元に戻すときに使うためメモするか、gfxfontlib.SwfMovie
ファイルを事前にバックアップしておきます。
続けて、gfxfontlib.SwfMovie
ファイルフッター 8バイトを削除して保存します。
削除した 8バイトは後で元に戻すときに使うため先ほどと同様にメモしておくか、gfxfontlib.SwfMovie
ファイルを事前にバックアップしておきます。
gfxfontlib.SwfMovie
ファイルのヘッダーとフッター削除後、gfxfontlib.gfx
に拡張子を変更します。(参考情報)
この時、画像では間違って拡張子を swf にしていますが、この後使用するツール FFDec(JPEXS Free Flash Decompiler) ではその違いを認識できるおかげなのかわかりませんが、以降の作業では特に問題ありませんでした。
FFDec で gfxfontlib.gfx に日本語フォント追加、ファイルヘッダーとフッターを元に戻して一部書き換え
FFDec を使って日本語フォントを追加します。
FFDec の基本的な使い方については こちら の記事を、フォントの追加方法は ここ か ここ の記事を参考にしてください。
gfxfontlib.SwfMovie
ファイルのヘッダーとフッター削除して拡張子を変更した gfxfontlib.gfx
ファイル を FFDec で開きます。
DefineFont3 に ChaletComprime-CologneEighty と Emerge BF があるので、どちらかまたは両方に表示したい日本語フォントを追加します。(追加したい日本語フォントが 1種類だけなら、どちらか片方に追加するだけ)
FFDec で日本語フォントを追加したら保存して閉じます。今回は両方ともフォントを UD デジタル教科書体 NK-B にしています。
FFDec で日本語フォントを追加した gfxfontlib.gfx
をバイナリエディタで開き、サイズ(16進数)をメモします。(今回の場合、0x8DF626
がサイズ、追加したフォントによってサイズが変わる)
このメモしたサイズ値はこのあと、削除したファイルヘッダー 92バイトを戻したときの一部バイナリデータ書き換え時に使用します。
日本語フォントを追加した gfxfontlib.gfx
ファイルの先頭に、gfxfontlib.SwfMovie
ファイルのヘッダーから削除した 92バイトのバイナリデータを挿入します。
続けて、日本語フォントを追加した gfxfontlib.gfx
ファイルの最後に、gfxfontlib.SwfMovie
ファイルのフッターから削除した 8バイトのバイナリデータを挿入します。
gfxfontlib.gfx
ファイルのヘッダーに追加した 92バイトバイナリデータ の一部を次のように書き換えます。(以下のバイナリデータ書き換えはサイズにより異なる)
アドレス 0x58
~ 0x5B
に ヘッダー・フッター追加前のサイズ(0x8DF626
) をリトルエンディアンで書き換えます。(今回の場合は、62 9B 01 00
→ 26 F6 8D 00
)
アドレス 0x50
~ 0x53
に ヘッダー・フッター追加前のサイズ(0x8DF626
) +4 をリトルエンディアンで書き換えます。(今回の場合は、66 9B 01 00
→ 2A F6 8D 00
)
ヘッダー・フッターバイナリデータを追加した日本語フォント gfxfontlib.gfx
ファイルのサイズをメモします。(今回は 0x8DF68A
)
このファイルサイズ情報は DisFonts_SF.upk
ファイルに gfxfontlib.gfx
バイナリデータを追加したときの gfxfontlib.SwfMovie
のサイズ情報を書き換える ときに使用します。
ヘッダー・フッターバイナリデータを追加した日本語フォント gfxfontlib.gfx
ファイルの完成です。
完成した日本語フォント gfxfontlib.gfx
ファイルのバイナリデータをもとに、DisFonts_SF.upk
ファイルへバイナリデータの追加と一部修正 します。
- PC ゲーム Creeper World: Anniversary Edition 日本語化と JPEXS Free Flash Decompiler を使ったファイル解析メモ
- PC ゲーム Middle-earth: Shadow of Mordor GOTY 日本語化とフォント変更方法と DLC The Bright Lord(明王)で日本語を表示する方法 → PC ゲーム Middle-earth: Shadow of Mordor GOTY 日本語フォント変更方法
- PC ゲーム Middle-earth: Shadow of War Definitive Edition 日本語編集方法とフォント変更方法とゲームプレイ最適化メモ → PC ゲーム Middle-earth: Shadow of War Definitive Edition 日本語フォント変更方法
DisFonts_SF.upk へ gfxfontlib.gfx バイナリデータ追加とサイズ・オフセット値修正
デコンプレスした DisFonts_SF.upk
ファイル をバイナリエディタで開き、データ終端のアドレスをメモします。(DisFonts_SF.upk
ファイルの場合 0x33B20
固定)
このアドレスはこの後の gfxfontlib.SwfMovie
のオフセット書き換え時に使用します。
デコンプレスした DisFonts_SF.upk
ファイル のデータ終端に、FFDec で日本語フォントを追加した gfxfontlib.gfx
ファイル のバイナリデータを丸ごと追加します。
DisFonts_SF.upk
ファイルのアドレス 0x40E
~ 0x415
にある gfxfontlib.SwfMovie
のサイズ・オフセット情報を、追加した gfxfontlib.gfx
バイナリデータの サイズ と オフセット 内容をリトルエンディアンに変換して更新します。(C6 9B 01 00 51 9F 01 00
→ 8A F6 8D 00 20 3B 03 00
)
gfxfontlib.SwfMovie
のサイズ・オフセット情報は Dishonored 日本語化ファイルに含まれるアンパックツールで DisFonts_SF.upk
をアンパックした時の出力される ExportTable.Log
ファイル から確認できます。
日本語フォント gfxfontlib.gfx
のバイナリデータを追加して、gfxfontlib.SwfMovie
のサイズ・オフセット値を修正した DisFonts_SF.upk
ファイルを、Dishonored\DishonoredGame\CookedPCConsole
フォルダにある同名ファイルと差し替えます。
日本語化ファイル GFxUI.int 修正
Dishonored\DishonoredGame\Localization\INT
フォルダにある GFxUI.int
をテキストエディタで開き、[FontLib] セクションと [Fonts] セクションを以下のように修正します。
GFxUI.int
修正内容
[FontLib]
;FontLib=DisFonts.fonts_jpn
;FontLib=DisFonts.gfxfontlib
;FontLib_PC=DisFonts.fonts_jpn
FontLib_PC=DisFonts.gfxfontlib
FontLib=DisFonts.fonts_efigs
[Fonts]
;TitleFont=Dishonored_Normal
;NormalFont=Dishonored_Normal
TitleFont=Emerge BF
NormalFont=ChaletComprime-CologneEighty
日本語化ファイルの GFxUI.int
であれば上記のように [FontLib] セクション 2~4行目の内容をコメントアウトにして 5行目をそのまま、6行目を追加します。
[Fonts] セクションは 9~10行目の内容をコメントアウトにして 11~12行目の内容(FFDec で日本語フォントを追加した DefineFont3 のフォント名を入力)を追加します。なお、11~12行目は英語版で指定していたものと同じです。
Scaleform フォント - UD デジタル教科書体 NK-B フォント - スクリーンショット
以下クリックすると UD デジタル教科書体 NK-B フォントを追加・変更した Scaleform フォントのスクリーンショットが開きます。(画像は 68枚あるため閲覧注意)
確認できた範囲ではロード画面中とゲーム内動画での字幕以外は、変更した Scaleform フォントに置き換わります。
Dishonored - ビットマップ日本語フォント追加方法(UI_Loading_SF_LOC_INT.upk へバイナリデータ追加・書き換え)
海外ゲーム日本語化実験所 さんのところですでに UDK(Unreal Development Kit) を使って作成したと思われる upk フォントファイルが公開(ファイル配布サイトアクセス不可のため 再配布、upk ファイルは UDK で閲覧可能)されていました。(スクリーンショットの内容からおそらく Scaleform フォント・ビットマップフォント両対応版)
ただ、Dishonored - Definitive Edition 以前に公開されたバージョンが古いフォントファイルのせいか、私の環境では文字の非表示や文字化けによる豆腐(□)フォントが表示されて、日本語を表示させることができませんでした。また、未確認ですが当時のネット情報では、実績解除ができないという情報もあったようです。
UDK や Unreal Editor によるフォント作成方法を参考にして自作のビットマップフォントを作成してみましたが、Dishonored - Definitive Edition においては(こちらのやり方が間違っている可能性がありますが)日本語を表示することはできませんでした。
なんとかして英語版ビットマップフォントに日本語フォントを追加して表示できないか試行錯誤したところ、英語版 upk ファイルと 中文化 upk ファイル(DGOTYCNv1.4.exe) からアンパックしたファイルのバイナリデータを比較・解析した内容から日本語フォントを追加する方法が判明。手間はかかりましたが、ビットマップフォントで日本語を表示することに成功しました。
この方法であれば Dishonored 日本語化ファイル に含まれるビットマップフォントを使わないで、英語版 upk ファイルに日本語フォントを追加することができます。
以下、アンパックした UI_Loading_SF_LOC_INT.upk
ファイル へ UDK(Unreal Development Kit) で作成したビットマップフォントのバイナリデータを追加・書き換えて日本語フォントを追加する方法を説明します。
UDK(Unreal Development Kit)(2011年12月版 Beta)日本語ビットマップフォントファイル作成
日本語ビットマップフォントを作成するため UDK(Unreal Development Kit) をインストールします。
なお、UDK は公式がサポート終了しておりダウンロードできません。Unreal Engine Forums にて個人の方がインストーラーをアーカイブとして公開 しているので、ここから UDKInstall-2011-12-BETA.exe
をダウンロードしてインストールします。
UDK(Unreal Development Kit)はいくつかバージョンがあり、バージョンが異なると同じフォントファイルを作成しても、ゲームによってはうまくいかない場合があります。今回は UDKInstall-2011-12-BETA.exe
をインストールしますが、前後のバージョンを使ってもうまく動作する可能性はあります。
過去に公開された UDK のバージョンは非常に多くあるため(2009年から2015年まで約 40バージョン)、すべてのバージョンで作成したフォントの動作確認は困難です。今回紹介するやり方はいくつか選んでインストールして動作確認できた UDK バージョンの一つとなっています。
UDK インストール後の Unreal Editor の起動方法は、スタートメニューから Unreal Development Kit → UDK-2011-12 → UDK Editor をクリックします。
別の Unreal Editor 起動方法として UDK\UDK-2011-12\Binaries
フォルダにある UnrealFrontend.exe
を実行します。
UnrealFrontend.exe
実行後 Unreal Frontend 画面が開くので、画面上部にある UnrealEd ボタンをクリックすることで Unreal Editor が起動します。
Unreal Editor 起動後、ビットマップフォント作成のためコンテンツブラウザ画面下にある新規ボタンをクリックします。
もし、コンテンツブラウザ画面が表示されなかったり閉じてしまった場合は、エディタ画面のメニュー 表示 → ブラウザ ウィンドウ → コンテンツブラウザをクリックすれば開きます。
ちなみに、Unreal Editor はデフォルトでリアルタイムレンダリングが有効になっているので、ビデオカードがフルロードの状態になります。
ビデオカードに余計な負荷をかけたくない場合は、画面上部左端の Modes の横にある ▼ ボタンをクリックして、リアルタイムのチェックマークを外します。
新規画面が開くので以下のような設定例でフォントを作成します。(参考情報)
- パッケージと名前は適当な名前を入力
- 作成したフォントのバイナリデータのみを流用するので、ここでは適当な名前で問題なし
- ファクトリは Font を選択
- 「フォントを選択」 ボタンをクリックして、表示したい日本語フォント選択とサイズ(Height)を設定(ここでは UD デジタル教科書体 NK-B とサイズ 36 に設定)
- ビットマップフォントの適正なサイズは実際にゲームで表示して確かめてみるしかない?
- ビットマップフォントのサイズは解像度関係なく固定?のため、ゲーム画面解像度によってフォントが大きい小さいという問題がある模様(フル HD ではちょうどよいフォントサイズでも、それ以下の解像度では大きすぎるなど)(Scaleform フォントでは解像度によってフォントサイズをスケールしている?)
- フォントによっては 「Enable Bold」 などに自動的にチェックマークがつく場合がある
- 「Chars File Path」 と 「Chars File Wildcard」 で文字指定
- 文字指定方法はいくつかあり、今回はテキストファイルの文字を指定する方法を採用。詳細については 洋ゲー MOD メモ さんのところの記事を参照
- 今回使用した文字は synctam さんが GitHub で公開しているゲーム制作用文字一覧表(UTF-8) を使ってテキストファイルで文字指定(約 7,200 文字)
- テキストファイルで文字を指定する場合、UTF-8 では失敗するため UTF-16(LE) 形式のテキストファイルにしておく(参考情報)
- 「Texture Page Width」 と 「Texture Page Max Height」 を 4,096 に設定
- フォントサイズ、文字数、「Texture Page Width」 と 「Texture Page Max Height」 のバランスによって UDK で作成される ~.Texture2D のファイル数が異なる(サイズ内に文字が収まりきらない場合、ファイル数が増える)
- アンパックした
UI_Loading_SF_LOC_INT.upk
の ~.Texture2D ファイル数(今回の場合は 1ファイル)で文字を収録するようにするため、フォントサイズ 36、文字数約 7,200文字の場合は 「Texture Page Width」 と 「Texture Page Max Height」 を 4,096 に設定 - ここで設定した Texture Page Width と Texture Page Max Height 数値は ~.Texture2D バイナリデータ書き換え 時に使用、ただし次の条件により設定した数値より実サイズが小さい場合は実サイズが優先
- 「Texture Page Width」 と 「Texture Page Max Height」 が大きすぎて、フォントサイズが小さかったり文字数が少ない場合は、指定したサイズ以下で作成される場合がある。その場合、~.Texture2D バイナリデータ書き換え 時の数値も異なるため、フォントのプロパティ画面 ですべてエクスポートで tga ファイルの縦横サイズをチェックするか、UE Viewer で画像ファイルをエクスポートして確認
OK ボタンをクリックすると画像のようにフォントプロパティ画面が表示されます。
ここでは Characters の文字数が 7,267文字となっており、この数値は ~.Font でのバイナリデータ書き換え時に確認できるので、必須ではないですが覚えておけばチェック用として使えます。
すべてエクスポートボタンをクリックしてフォルダを指定すると、tga ファイルがエクスポートされて文字を確認することができます。
フォントサイズや文字数とのバランスによって フォント作成時に設定した Texture Page Width と Texture Page Max Height の数値通りにならないことがあるので、ここで tga ファイルをエクスポートして縦横サイズを確認しておいたほうがよいでしょう。
フォントのプロパティ画面を閉じたらコンテンツブラウザ画面に戻るので、作成したパッケージ名を右クリックから保存をクリックするか、ショートカット Ctrl+S を押して任意の場所に upk ファイルとして保存します。
作成して保存した upk ファイルを Dishonored 日本語化ファイルに含まれるアンパックツール か Unreal Package Extractor で アンパック します。
UDK で作成した upk ファイルは Unreal Package Decompressor によるデコンプレスは不要です。
アンパック後、~.Font ファイルと ~.Texture2D ファイルのバイナリデータを使って、同じくアンパックした英語版 UI_Loading_SF_LOC_INT.upk
の ~.Font ファイルと ~.Texture2D ファイルのバイナリデータを書き換えます。
~.Font ファイルバイナリデータ書き換え
アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれる ~.Font ファイルのバイナリデータを、UDK で作成した upk ビットマップフォント に含まれる ~.Font ファイルのバイナリデータに書き換えます。
Unreal Engine 3 のビットマップフォント(~.Font)については情報がまったく見つからなく、日本語でそれらしいと思われる情報が 5ch からしか見つかりませんでした。
5ch の情報通りであれば、おそらく 「1. 文字コードテーブル」 と 「2. テクスチャテーブル」 が ~.Font ファイルで、「3. テクスチャの実データ(おそらくヘッダーなし DDS テクスチャデータ)」 が ~.Texture2D ファイルを指しているものだと思われます。
以下、該当する個所を 「文字コードテーブル」 や 「テクスチャテーブル」 として説明するところがあります。それぞれのバイナリデータの実態はわからなかったので、実際には間違っている可能性がありますが、便宜上その形式で説明を進めます。
アンパックした UI_Loading_SF_LOC_INT.upk
には ChaletComprime-CologneEighty.Font
と Emerge_BF.Font
ファイルがありますが、ここでは ChaletComprime-CologneEighty.Font
を例にバイナリデータ書き換え方法を説明します。
バイナリデータの書き換え箇所は一定の法則で決まっていることが解明することができたので、そのやり方さえわかれば Emerge_BF.Font
でも同様に書き換えられることができます。
以下、FavBinEdit の ウォッチデータ機能 を使い、アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれている ChaletComprime-CologneEighty.Font
を使って説明します。
私が調べた英語版 ChaletComprime-CologneEighty.Font
ファイルのウォッチデータは ここ からダウンロードできるように公開しておきます。(英語版 Emerge_BF.Font
ファイルのウォッチデータも ここ に公開します)
ウォッチデータの読み込み方法は FavBinEdit を起動したら ~.Font
ファイルを開き、メニューにあるウォッチ → ウォッチデータの読み込みからほぼ同じファイル名の FavBinEdit-W を開きます。
中文化版 UI_Loading_SF_LOC_INT.upk
を調べていた時の ChaletComprime-CologneEighty.Font ウォッチデータ
と Emerge_BF.Font ウォッチデータ
も公開しておきますので興味があればどうぞ。
アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれている ChaletComprime-CologneEighty.Font
を FavBinEdit で開き、ウォッチデータ機能を使って表示した画像です。
基本的にウォッチデータを追加(色がある箇所)したバイナリデータが書き換え対象(一部削除対象あり)となっており、色がない箇所は書き換え不要となっています。
各ウォッチデータに名称をつけてあるので、その部分を説明します。
まず、ウォッチデータは全部で 8か所マークしていますが、最初の Offset(Jump 0x1669) ~ 28Bytes までの 5か所が連続した一つのデータの塊となっています。
最初のウォッチデータ 4バイトの値からアドレス 0x1669
(0x1669
のリトルエンディアンが 69 16 00 00
) に移動、そこから 28バイトまでのバイナリデータの範囲が 文字コードテーブル に相当すると思われます。
そのため、アンパックした UDK で作成した upk フォント にある ~.Font ファイルを同様の方法で、文字コードテーブル 相当のバイナリデータの範囲を特定して書き換えるだけで、作成したフォントデータに丸ごと入れ替えることができます。
途中にある Word Count については次の画像で説明します。
ウォッチデータ Word Count は 2か所あり、これはビットマップフォントの文字数となっています。そのため、ここでの双方の Word Count の値は必ず一致していることになっています。
最初のウォッチデータ Word Count はひと塊となっているデータに含まれており、まとめてバイナリデータを書き換えられることになるのでこの辺は特に意識することはないですが、2番目の Word Count は離れたアドレス位置に単独で存在しています。
そのため、そのバイナリデータのアドレス個所を特定すると同時に、2番目の Word Count も書き換える必要があります。
新しい 文字コードテーブル に書き換えたら、忘れずに 2番目の Word Count を 1番目のウォッチデータ Word Count の値に書き換えます。
今回の UDK で作成した upk ビットマップフォント の場合だと、フォントのプロパティ画面 で 7,267文字となっているので、これを 16進数にすると 0x1C63
、リトルエンディアンで 63 1C 00 00
となり、これが今回の Word Count へ書き換えるバイナリデータとなります。
データ終端に印をつけたウォッチデータが テクスチャテーブル と思われます。
この テクスチャテーブル を特定する基準として、直前のバイナリデータが ~ FE 00 FE 00 FF 00 FF 00
と規則的なデータが並んでいるところを終点として次のアドレスが、テクスチャテーブル 開始位置の目安となります。
UDK で作成した upk ビットマップフォント でも同様な形式でバイナリデータがあるはずなので、その部分をコピーして丸ごと差し替えれば、作成したフォントデータに丸ごと入れ替えることになります。
ウォッチデータ Delete 56Bytes が今回の削除対象箇所です。書き換える必要はなく、そのまま削除します。
これは中文化ファイルと英語版ファイルを比較していた時に発見したもので、この部分だけ削除されて前後のバイナリデータが連続した形となっていました。
そのため、今回は中文化ファイルにあわせる形で、この 56バイトのバイナリデータを削除します。
~.Font のバイナリデータを書き換えたら、次に ~.Texture2D のバイナリデータも書き換えて、デコンプレスした UI_Loading_SF_LOC_INT.upk
ファイル に ~.Font と~.Texture2D バイナリデータを追加してファイルサイズ・オフセットを修正 するのが一連の流れになります。
~.Texture2D ファイルバイナリデータ書き換え
アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれる ~.Texture2D ファイルのバイナリデータを、UDK で作成してアンパックした upk フォント に含まれる ~.Texture2D ファイルのバイナリデータに書き換えます。
~.Texture2D のフォーマットはある程度決まっているようで、海外サイト(下記、参考サイト先参照)でもいくつか情報が掲載されています。
~.Texture2D ファイルは 5ch の情報を照らし合わせると、おそらく 「3. テクスチャの実データ」 に相当するファイルだと思われます。
アンパックした UI_Loading_SF_LOC_INT.upk
には ChaletComprime-CologneEighty_PageA.Texture2D
と Emerge_BF_PageA.Texture2D
ファイルがありますが、ここでは ChaletComprime-CologneEighty_PageA.Texture2D
を例にバイナリデータ書き換え方法を説明します。
バイナリデータの書き換え箇所の法則は決まっているので、それさえわかれば Emerge_BF_PageA.Texture2D
でも同様に書き換えることができます。
以下、FavBinEdit の ウォッチデータ機能 を使い、アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれている ChaletComprime-CologneEighty_PageA.Texture2D
を使って説明します。
私が調べた英語版 ChaletComprime-CologneEighty_PageA.Texture2D
ファイルのウォッチデータは ここ からダウンロードできるように公開しておきます。(英語版 Emerge_BF_PageA.Texture2D
ファイルのウォッチデータも ここ に公開します)
ウォッチデータの読み込み方法は FavBinEdit を起動したら ~.Font
ファイルを開き、メニューにあるウォッチ → ウォッチデータの読み込みから拡張子 FavBinEdit-W ファイルを開きます。
中文化版 UI_Loading_SF_LOC_INT.upk
を調べていた時の ChaletComprime-CologneEighty_PageA.Texture2D ウォッチデータ
と Emerge_BF_PageA.Texture2D ウォッチデータ
も公開しておきますので興味があればどうぞ。
アンパックした英語版 UI_Loading_SF_LOC_INT.upk
に含まれている ChaletComprime-CologneEighty_PageA.Texture2D
を FavBinEdit で開き、ウォッチデータ機能を使って表示した画像です。
基本的にウォッチデータを追加(色がある箇所)したバイナリデータが書き換え対象となっており、色がない箇所は書き換え不要となっています。
各ウォッチデータに名称をつけてあるので、その部分を説明します。
ウォッチデータ Texture Page Width 3か所と Texture Page Max Height 3か所が UDK でフォント作成時に設定した Texture Page Width と Texture Page Max Height の数値を、16進数に変換してリトルエンディアンにしたものになります。
ここではすべて 00 01 00 00
となっていますが、これは 0x100
のリトルエンディアンで、10進数に変換すると 256
となるので、英語版の ChaletComprime-CologneEighty_PageA.Texture2D
の Texture Page Width と Texture Page Max Height は 256
であることがわかります。
今回たまたま Texture Page Width と Texture Page Max Height が同じ数値のファイルでしたが、ゲームやファイルによってはこの数値がそれぞれ異なる(画像の縦横サイズが違う)場合もあります。
ウォッチデータ Texture Page Width × Height 2か所が上記 Texture Page Width と Texture Page Max Height を乗算した数値になります。
ここでは 00 00 01 00
となっていますが、これは上記数値 256×256 = 65,536、これを 16進数に変換すると 0x10000
、リトルエンディアンで 00 00 01 00
となって一致します。
このようにウォッチデータ Texture Page Width と Texture Page Max Height と Texture Page Width × Height の全 8か所は計算上一致するようになっています。
ウォッチデータ Offset1(.upk) と Offset2(.upk) は次の 1バイト目のアドレスをリトルエンディアンにしたものがバイナリデータとして格納されています。
ただし、これはアンパック前の upk ファイルに格納されている時のアドレスを指定しています。アンパック後の個々の ~.Texture2D ファイルのアドレスではない点に注意してください。(この時点では一致していません)
別の言い方をすれば Offset1(.upk) と Offset2(.upk) については、アンパックした ~.Texture2D ファイルの時点では書き換えるアドレスが不明なため、この 2か所以外のバイナリデータをすべて UDK で作成した upk フォント に書き換えた後、アンパックした UI_Loading_SF_LOC_INT.upk
ファイルにバイナリデータを追加 したときが書き換えるタイミングとなります。
よって、この時点ではウォッチデータ Offset1(.upk) と Offset2(.upk) は書き換えません。
ウォッチデータ Offset2(.upk) とデータ終端付近にある Texture Page Width の間にあるデータ(ウォッチデータ Texture Raw Data)の塊が テクスチャの実データ と思われます。
UDK で作成した upk ビットマップフォント でも同様な形式でバイナリデータがあるはずなので、その部分をコピーして丸ごと差し替えれば、作成したフォントデータに丸ごと入れ替えることになります。
UDK でビットマップフォントを作成 した場合、~.Texture2D ファイルに PNG バイナリデータが格納される仕様 のようです。
目的の テクスチャの実データ を探すには PNG バイナリデータ以降にあるので、PNG データの終端まで移動する必要があります。
バイナリエディタで検索から ASCII 文字列 「IEND」 で検索して移動します。
ちなみに必須ではありませんが、UDK でコンテンツをクッキングすることでビットマップフォントの PNG データを削除 することが可能で、ファイル容量を小さくすることができます。
PNG バイナリデータの終端 AE 42 60 82
まで移動後、以降のバイナリデータから テクスチャの実データ を特定できれば、これがコピー対象のバイナリデータとなります。
画像のウォッチデータの黄緑色の塊箇所が テクスチャの実データ になります。
ちなみに テクスチャの実データ の前後には、先のウォッチデータに相当する Texture Page Width × Height、Offset2(.upk)、Texture Page Width、Texture Page Max Height があります。
バイナリデータが連続しているのでまとめてバイナリデータをコピーすれば、上記ウォッチデータの個所を個別に書き換えずに済みますが、場合によってはどこを書き換えたのかわからなくなって余計に混乱する可能性がありますので、自信がなければ テクスチャの実データ のみをコピーして書き換える程度にとどめておいたほうがよいかもしれません。
~.Texture2D のバイナリデータを書き換えたら、デコンプレスした UI_Loading_SF_LOC_INT.upk
ファイル に ~.Font と~.Texture2D バイナリデータを追加してファイルサイズ・オフセットを修正 します。
UDK で作成した upk フォント の Texture Page Width および Texture Page Max Height の値が 4,096 の場合、~.Texture2D ファイルのバイナリデータは 16進数に変換で 0x1000
となり、リトルエンディアンで 00 10 00 00
となります。
Texture Page Width や Texture Page Max Height に入力する数値はほぼ決まっている ので、この数値を 16進数に変換してリトルエンディアンにしたものを以下リスト化しました。
16進数 - リトルエンディアンに変換するとデータ並びに規則性がみられるので、~.Texture2D ファイルのバイナリデータを確認するときにデータを探したり数値をチェックするのが多少楽になるかもしれません。
128
→0x80
→80 00 00 00
256
→0x100
→00 01 00 00
512
→0x200
→00 02 00 00
1,024
→0x400
→00 04 00 00
2,048
→0x800
→00 08 00 00
4,096
→0x1000
→00 10 00 00
UDK で作成した upk フォント の Texture Page Width および Texture Page Max Height の値が 4,096 の場合、Texture Page Width × Height は 4,096×4,096=16,777,216 となり、16進数に変換で 0x1000000
となり、リトルエンディアンで 00 00 00 01
となります。
Texture Page Width × Height についても同様に、16進数・リトルエンディアンに変換したものを以下リスト化しました。
128x128 = 16,384
→0x4000
→00 40 00 00
256x128 = 32,768
→0x8000
→00 80 00 00
256x256 = 65,536
→0x10000
→00 00 01 00
512x256 = 131,072
→0x20000
→00 00 02 00
512x512 = 262,144
→0x40000
→00 00 04 00
1024x512 = 524,288
→0x80000
→00 00 08 00
1024x1024 = 1,048,576
→0x100000
→00 00 10 00
2048x1024 = 2,097,152
→0x200000
→00 00 20 00
2048x2048 = 4,194,304
→0x400000
→00 00 40 00
4096x2048 = 8,388,608
→0x800000
→00 00 80 00
4096x4096 = 16,777,216
→0x1000000
→00 00 00 01
UI_Loading_SF_LOC_INT.upk へ ~.Font、~.Texture2D バイナリデータ追加とサイズ・オフセット値修正
~.Font ファイルと ~.Texture2D ファイルのバイナリデータを書き換えたら、デコンプレスした UI_Loading_SF_LOC_INT.upk
ファイル に ~.Font ファイルと ~.Texture2D ファイルのバイナリデータを追加して、各ファイルのファイルサイズ・オフセット値があるバイナリデータを修正します。
デコンプレスした UI_Loading_SF_LOC_INT.upk
ファイルをバイナリエディタで開き、データ終端に ~.Font ファイルと ~.Texture2D ファイルのバイナリデータをそのまま追加します。
各ファイルのバイナリデータを追加するときは開始位置のアドレスをメモしておきます。これはこのあとの各ファイルのサイズ・オフセット情報を管理しているバイナリデータを書き換えるときに、オフセットをこの開始位置のアドレスに書き換えるのに使うためです。(ここでアドレスをメモしておかないと後で探すの大変なため)
また、データ終端に ~.Font ファイルと ~.Texture2D ファイルのバイナリデータを追加するときは、UI_Loading_SF_LOC_INT.upk
ファイルをアンパック したときに出力される、ExportTable.Log
にあるファイルリストの順番通りにバイナリデータを追加します。
今回の場合だと、ChaletComprime-CologneEighty.Font
→ Emerge_BF.Font
→ ChaletComprime-CologneEighty_PageA.Texture2D
→ Emerge_BF_PageA.Texture2D
というような順番でバイナリデータを追加します。(追加するフォントが 1種類などで片方のファイルしかない場合は、そのファイル分は飛ばします)
これは確かなことは言えないのですが、バイナリデータを追加する順番を変えたところエラーでゲームがクラッシュして落ちたことがあったため、そのようにしています。手入力が多いためこちらで何らかのミスをしていた可能性がありますが、特に理由がなければ ExportTable.Log
の順番通りにバイナリデータを追加したほうが確実でしょう。
次に デコンプレスした UI_Loading_SF_LOC_INT.upk
ファイル のオリジナル ~.Font と ~.Texture2D ファイルのファイルサイズとオフセット情報があるバイナリデータに移動します。
FavBinEdit のウォッチデータを公開しますので、これを使えばファイルサイズ・オフセット情報のアドレス位置がわかります。ここ からダウンロードして ExportTable.Log
とあわせて確認してください。
ウォッチデータは 8バイトで一つのデータ塊で、前方 4バイトが 16進数ファイルサイズのリトルエンディアン、残り 4バイトが 16進数オフセット(アドレス)のリトルエンディアンとなっており、これが UI_Loading_SF_LOC_INT.upk
の場合このバイナリデータの塊が 4か所あります。上から順番に ChaletComprime-CologneEighty.Font
、Emerge_BF.Font
、ChaletComprime-CologneEighty_PageA.Texture2D
、Emerge_BF_PageA.Texture2D
となっています。
上記の各アドレスにあるバイナリデータを、新しく追加したバイナリデータのファイルサイズ・オフセット(アドレス)情報に書き換えます。
さらに、デコンプレスした UI_Loading_SF_LOC_INT.upk
に追加した ~.Texture2D バイナリデータ内にある オフセット情報(ウォッチデータ Offset1(.upk) と Offset2(.upk)) を書き換えます。
上の画像にある 4か所の 4バイトのウォッチデータが書き換え対象の ~.Texture2D バイナリデータのオフセット値で、次の 1バイト先のアドレス(ウォッチデータで 1か所だけマークしてあるところ)をリトルエンディアンにして書き換えます。
例えば最初のウォッチデータにある 92 D5 08 00
とありますが、これは次の 1バイトのウォッチデータのアドレス 0x8D592
をリトルエンディアンで 92 D5 08 00
となるので、これに書き換えていることになります。
~.Font ファイルと ~.Texture2D ファイルのバイナリデータを追加して、ファイルサイズ・オフセット値を修正した UI_Loading_SF_LOC_INT.upk
ファイルを、Dishonored\DishonoredGame\CookedPCConsole
フォルダにある同名ファイルと差し替えます。
日本語化ファイル DishonoredGame.int 修正
Dishonored\DishonoredGame\Localization\INT
フォルダにある DishonoredGame.int
をテキストエディタで開き、[DisBinkOverlayManager] セクションを以下のように修正します。
DishonoredGame.int
修正内容
[DisBinkOverlayManager]
m_ContentPackageName=UI_Loading
;m_NormalFontName=Dishonored_Normal
;m_TitleFontName=Dishonored_Normal
m_NormalFontName=ChaletComprime-CologneEighty
m_TitleFontName=Emerge_BF
m_LoadingText=Loading
m_PressToContinueText_PC=press key
m_PressToContinueText_Console=続行
日本語化ファイルの DishonoredGame.int
であれば上記のように [DisBinkOverlayManager] セクション 3~4行目の内容をコメントアウトにして 5~6行目を追加します。
[DisBinkOverlayManager] セクションに追加した m_NormalFontName=ChaletComprime-CologneEighty
と m_TitleFontName=Emerge_BF
は英語版で指定していたものと同じです。
もし日本語フォントを追加したビットマップフォントが 1つのみであれば、m_NormalFontName
と m_TitleFontName
のフォント名は両方とも同じ名前(ChaletComprime-CologneEighty か Emerge_BF のどちらか)にします。
ビットマップフォント - UD デジタル教科書体 NK-B フォント - スクリーンショット
以下クリックすると UD デジタル教科書体 NK-B フォントを追加・変更したビットマップフォントのスクリーンショットが開きます。
確認できた範囲ではロード画面中とゲーム内動画での字幕が、変更したビットマップフォントに置き換わります。フォントサイズが大きいのは UDK でフォントサイズを 36 に設定してフォントを作成したためです。
UDK コンテンツクッキング方法(ビットマップフォント PNG データ削除方法)
UDK で作成した upk ビットマップフォント は PNG 画像データが含まれており、その分ファイルサイズが大きくなります。
この PNG データは UDK でコンテンツをクッキングすることで upk ファイルから PNG データのみ削除 することができます。
自作した upk ビットマップフォントのファイル容量を少しでも小さくしたい場合などは、UDK でコンテンツをクッキングすることになります。
UDK でのコンテンツクッキング方法の大まかな流れは YouTube から確認できます。以下の具体的な設定方法については Steam コミュニティガイド を参考にしています。
UDKGame\Content
フォルダに UDK で作成した upk ビットマップフォント を配置します。
UDKGame\Config
フォルダにある DefaultEngine.ini
ファイルをテキストエディタで開きます。
DefaultEngine.ini
ファイルを開いたら、[Engine.PackagesToAlwaysCook] セクションに +SeekFreePackage=MyPackage
を追加します。(MyPackage は UDK のファクトリ Font 作成時のパッケージ名= upk ファイル名)
Binaries
フォルダにある UnrealFrontend.exe を起動 します。
Unreal Frontend 画面が開くので Maps to Cook にある DM-Deck.udk を選択して、Remove ボタンをクリックして削除しておきます。
Unreal Frontend 画面上部にある Cook Packages をクリックすると、コンテンツのクッキングを開始します。
しばらくして Unreal Frontend 画面下部にあるログ画面でグリーンの SUCCEEDED の文字が見えたらクッキング完了です。
UDKGame\CookedPC
フォルダに PNG データが削除された状態の MyPackage_SF_LOC_INT.upk
フォントファイルが生成されます。
UE Viewer を使った upk ファイルアンパック方法
UE Viewer を使うことで デコンプレスやアンパックツール を使わなくても、アンリアルエンジンシリーズの upk ファイルから目的のファイルを取り出せることができます。(ゲームによってはできない場合があります)
ただ、今回のようにデコンプレスした upk ファイルにバイナリデータを追加する方法だと、UE Viewer だけでは対応できない点に注意してください。
ここでは Dishonored 日本語化ファイル の upk フォントファイルをアンパックしてみます。
UE Viewer をダウンロードしたら umodel.exe
を起動します。
UE Viewer の UE Viewer Startup Options 画面です。
一番上の Path to game files に開きたい upk ファイルがあるパス名を入力します。
注意点としてすでにパス名以下に階層が深いフォルダが展開されているとエラーが起きることがあるので、エラーが発生するようであれば作業用フォルダにアンパックしたい upk ファイルをコピーして、そのパス名を指定したほうがいいでしょう。
UE Viewer Startup Options では基本的にあまり細かく設定をしなくてもデフォルト状態のまま問題ない場合もありますが、Dishonored 日本語化ファイル の upk フォントファイルについては次のような設定をしないとファイルを正しくアンパックできないことがあります。(詳しくチェックしていないので、不要な設定があるかもしれません)
- Override game detection
- Unreal engine 3 と Dishonored(ゲームエンジンのバージョンとゲームタイトルを指定)
- Common classes
- Textures(ビットマップフォント)
- Export-only classes
- ScaleForm(ScaleForm フォント)
- Platform
- PS3
UE Viewer Startup Options 画面で OK ボタンをクリック後、エラー表示がなければ画像のように Choose a package to open 画面が開きます。
目的の upk ファイルを選択して Export ボタンをクリックします。
ちなみに、Open ボタンをクリックするとプレビュー画面が開き、一部のファイルをプレビューできます。(プレビューで正しく表示されないこともあります)
Export ボタンをクリックすると Export options 画面が開きます。
Export to this folder に保存先パス名を入力します。未入力の場合は umodel.exe
と同じフォルダ内に UmodelExport フォルダが生成されてそこに保存されます。
Texture Export では 3種類の Texture format(TGA、TGA (uncompressed)、PNG)が選択できます。
OK ボタンをクリックすると upk ファイルから指定した形式のファイルをエクスポートします。
Export options 画面 で OK ボタンをクリックすると、指定したフォルダに UmodelExport フォルダを生成して upk ファイルに格納されているファイルをエクスポートします。
UE Viewer で DISFONTS_SF.upk
ファイルからエクスポートできた日本語 Scaleform フォント fonts_jpn.gfx
ファイルです。
FFDec で UE Viewer でエクスポートされた fonts_jpn.gfx
ファイルを開くことで、使用されているフォント内容が確認できます。
UE Viewer で UI_LOADING_SF_LOC_INT.upk
からエクスポートした Dishonored_Normal_PageA.tga
ファイルを Paint.NET で開いたところです。
上の画像では新規レイヤーを追加して黒で塗りつぶし、レイヤーを並び替えて文字を見やすくしています。
ファイル名が Dishonored_Normal であること、日本語化ファイル DishonoredGame.int で Dishonored_Normal が指定されていたことから、日本語化ファイルで使用されるビットマップフォントであると断定できます。
こちらの画像も同様の方法で、UI_LOADING_SF_LOC_INT.upk
からエクスポートした Dishonored_Title_PageA.tga
ファイルを Paint.NET で開き、レイヤーの追加と黒塗りで文字を見やすくしたものです。
英数字のほかひらがな・カタカナしかなく、日本語化ファイル DishonoredGame.int ではこのフォントを指定していないため、ゲームでは使われていない未使用のフォントだと思われます。
- PC ゲーム Dishonored - Definitive Edition で Scaleform 日本語フォント、ビットマップ日本語フォントを追加する方法(現在開いているページ)
- PC ゲーム Dishonored DLC - The Knife of Dunwall(ナイフ・オブ・ダンウォール)の字幕を日本語で表示する方法
- PC ゲーム Aliens: Colonial Marines Collection で日本語を表示する方法
- PC ゲーム Creeper World: Anniversary Edition 日本語化と JPEXS Free Flash Decompiler を使ったファイル解析メモ
- PC ゲーム Middle-earth: Shadow of Mordor GOTY 日本語化とフォント変更方法と DLC The Bright Lord(明王)で日本語を表示する方法
- PC ゲーム Middle-earth: Shadow of War Definitive Edition 日本語編集方法とフォント変更方法とゲームプレイ最適化メモ
- PC ゲーム Prey (2017年版) ゲームプレイ最適化メモ
- PC ゲーム Arx Fatalis 日本語化とゲームプレイ最適化メモ
- PC ゲーム Batman: Arkham Asylum GOTY Edition 日本語化とゲームプレイ最適化メモ
- Shadowrun: Dragonfall - Director's Cut 付属ツール Shadowrun Editor のクラッシュ対策と翻訳用データファイルを完全にエクスポートする方法
- PC ゲーム Shadowrun Returns (The Dead Man's Switch) 日本語化メモ
- PC ゲーム Pillars of Eternity - Definitive Edition 日本語化とゲームプレイ最適化メモ
- PC ゲーム Divinity: Original Sin - Enhanced Edition 日本語化とゲームプレイ最適化メモ
- PC ゲーム Divinity: Dragon Commander 日本語化メモ
- PC ゲーム Lords of Xulima 日本語化メモ
- PC ゲーム Hard West 日本語化メモ
- PC ゲーム Of Orcs And Men 日本語化メモ
- PC ゲームが起動しない・安定しない場合に確認と設定したほうがいいかもしれないリスト
有難う!!!