< 前回はこちら | 次回はこちら >
前回までは、ジウブが返ってきたところまで進んだ。
ゲーム内スクリプトのエンコード(トピックまで中国語になってた)を修正して、日本語版もしっかりスクリプト内のトピックを日本語にかえたことで、クエストがちゃんと進むようになった。
Morrowindの構造を理解すればするほど、英語以外の言語に対応させる気がさらさらないことがよくわかった。
フォント・エンジン戦争
文字が表示されない、消える

ゲームは起動した。日本語も出た。しかし、プレイしていると奇妙な現象に気づいた。
「立」「用」「方」などの常用漢字の一部が表示されず、空白になる。
ログにはエラーが出ていない。フォントファイルには文字が含まれている。
この問題は解決までに本当に時間がかかった。
原因は、OpenMWのGUIライブラリ(MyGUI)の仕様にあった。
MyGUIは、使用するフォントの全文字を1枚のテクスチャ(画像)に焼き込んでから描画する。
このテクスチャサイズの上限は16384px。
私が最初に選んだ「Noto Sans JP」(このブログでも採用でキレイ)は収録文字数が44,000以上あり、テクスチャに入り切らなかった文字が欠落していた。
解決策として、文字数をJIS第一・第二水準に絞った「Kosugi」フォント(約7,000グリフ)を採用することで、全文字の表示に成功した。
Daedricフォント問題
デイドラ文字の仕様も少しハマった。
巻物を開くと、本来はデイドラ文字(架空の文字)で書かれるべき部分が、普通の英語で表示されていた。
調べると、翻訳データ内で <FONT FACE="Daedric"> タグの中身まで日本語に翻訳してしまっていた。
Daedricフォントは英字(A-Z)しか持っていないため、日本語を表示しようとしてフォールバックが発生していたのだ。
ここは意図的に英語の原文に戻す処理を追加した。
魔法効果の語順問題
めちゃくちゃ分かりづらい効果説明。

このクソの原因はOpenMW(というよりMorrowindの仕様)にあった。
魔法の効果説明文は、エンジン側で以下のように「英単語のパーツ」を結合して生成されている。
String tooltip = EffectName + " " + Magnitude + " " + sPts + " " + sFor + " " + Duration + " " + sSecs + " " + sOn + " " + Target;エンジンは「英語の文法」に従って変数を並べているだけだ。
しかし、日本語は語順が違う。
「5秒間(Duration)」→「10ポイントの(Magnitude)」→「炎ダメージ(EffectName)」
という順序で表示したいが、エンジンの結合順序を変えるにはソースコードの大規模な改修が必要になる。
そこまでやるべきか? いや、もっと賢い方法があるはずだ。
解決策:GMST(Game Settings)の無効化
Morrowindには GMST (Game Setting) という、ゲーム内の定型文を定義するレコードがある。
ここに sFor(for)や sSeconds(secs)といった単語が定義されている。このクソが諸悪の根源である。
このGMSTは「翻訳」せず、単に無効化することにした。
- 接続詞を消す
- sFor (“for”) → “”(空文字)
- sOn (“on”) → “”(空文字)
- 日本語には “for” や “on” に相当するスペース区切りの前置詞は不要。邪魔なだけなので消してしまう。
- 単位を日本語の接尾辞にする
- sSeconds (“secs”) → “秒間”
- sPts (“pts”) → “pt”(または「ポイント」)
- sTo (“to”) → “~”
- 語順の違和感を「リスト形式」で誤魔化す
文章として読ませようとするからおかしくなる。情報を並列した「スペック表」みたいにしとけばおk
GMSTを書き換えたESPを適用すると、表示は劇的に変わった。

これなら読める! 解決!
「ビルドしたくない」から「ビルドするしかない」へ
基本的に、OpenMWのソースをいじくって日本語専用のフォーク版を作る予定はなかった。
フォーク版を作ると、まずバグが起きたときの対応が面倒だし、もうすでにFF14のプラグインのフォーク版をいくつか抱えているので、これ以上アップデート対応を細かくやっていくのは難しい。 ひとりじゃむり。
ただ、どうしてもいじらざるを得ない状況になった。
1. フォントサイズのハードコード限界
4K解像度のモニタでMorrowindを起動すると、会話ウィンドウの文字が豆粒のように小さい。
設定ファイル settings.cfg には font size という項目がある。
「これを30くらいにすれば解決だろ」と高をくくっていた。
しかし、数値をいくら上げても、文字はある一定の大きさ(体感18px程度)で頭打ちになる。
ソースコードを grep して、絶望的な行を見つけた。
// components/settings/categories/gui.hpp
SettingValue<int> mFontSize{ mIndex, "GUI", "font size", makeClampSanitizerInt(12, 18) };上限が 18 にハードコードされていた。
サニタイザー(入力値チェック)が、設定ファイルの数値を強制的に18に丸めていたのだ。
これを突破するには、バイナリをデコンパイルしてアセンブラを書き換えるか、ソースコードを修正してビルドし直すしかない。後者の方がマシだ。
2. 特殊フォント「Magic Cards」の挙動

ゲーム内には「Magic Cards」という、デイドラ文字や暗号文を表示するための特殊フォント指定がある。
しかし、日本語フォントを強制適用すると、この特殊フォントが表示されるべき箇所までゴシック体になってしまい、雰囲気が台無しになる。
中国語版では、シカトして中国語フォントのままだった。
それでもよかったのだが、一部の書籍では、タイトルをお洒落に見せるためにこのフォントが使われていた。
しかし、ここを「大空」と日本語に翻訳した場合、Magic Cardsフォント(英数字しか収録されていない)を適用すると、文字化けするか、豆腐(□□)になる。
→ でもせっかくなら、日本語環境では、タグを削除して通常の日本語フォントで表示させたい。
それに雰囲気のいい「読めないことに意味がある」テキストを台無しにしたくなかった。
fontloader.cppのロジックを確認すると、「フォント名が “Magic Cards” の場合のみ、別のTTFファイルを読み込む」という処理が必要だった。
これも設定ファイルでは制御不能な、ハードコードされたロジックだった。

3. CJKの禁則処理と改行

英語は単語と単語の間にスペースがあるため、エンジンはそこで改行すればいい。
しかし、日本語にはスペースがない。
既存のエンジンは日本語の文章を「超巨大な1つの単語」として認識してしまい、行末で強引に文字を切ったり、あるいは一行まるごと次の行に送ったりして、レイアウトが崩壊していた。
widgets.cpp に、日本語(CJK)文字の境界判定を行い、適切な箇所で改行を挿入するロジックを追加する必要があった。
わたしはC++をつかったことがないので、この辺の仕様変更は本当に苦労した。あとOpenMWの依存ライブラリでつまづきまくった。
Boost、Qt6、OpenSceneGraph (OSG)、SDL2、MyGUI、FFmpeg……。
私はただ、日本語でMorrowindを遊びたいだけなのに・・・

コメント