2017年10月29日日曜日

SteamWorld Dig 日本語化

*** 2022/01/16 追記 ***
Don't BE EVILの社是でおなじみのGoogle様が勝手に人様に迷惑がかかる形で仕様変更しやがってくださいましたファイルのダウンロード先リンクの更新に対応しました。
いつも利用していますありがとうございますGoogleさま!!

何かの間違いだと思うのですが、なんだかんだでパラパラと結構な数の権限要求リクエストを頂戴しましたために、今さらの対応の運びとなりましたことをお詫びするとともにお役に立てれば欣快と心得ます。
なお、繰り返しになりますが何かの間違いだと思うので敢えてことさらに申し上げますが、steam版などは公式で日本語化されているため、このファイルは必要がないということにご留意いただければ幸いです。
元記事にもございます通り、Originでの無料配布版でしか試していません。
以上、よろしくお願いいたします。
*** 追記ここまで ***

過日、Originさんから無料でいただいた表題のゲーム、貰うだけもらっといて放置しといたのですが、Hegemony Romeも単調すぎてもうやる気がしないので日本語化できないかやってみました。

例によって作業シートはこちらです。
フォント生成ツールはこちらです(作業シートのTSVファイルからBundlePC/Language/en.csvに変換するスクリプト、およびシートから変換してフォントを一括生成するバッチサンプルも同梱してあります)。
    導入手順
  1. (Windowsのみ)Windows Subsystem for Linuxを導入する(bashとperlのため)。
    (LinuxおよびMac)monoをインストールする(EXEのため)。
  2. BundlePC/Fontsの中身およびBundlePC/Language/en.csvバックアップする
  3. BundlePC/Fontsにフォント生成ツールをダウンロードする
  4. ダウンロードしたフォント生成ツールを書庫フォルダ名のディレクトリ中に展開する。
  5. BundlePC/Fonts/SteamworldDigFontBuilder/SteamworldDigFontBuilder/scripts/を開く
  6. 作業シートのen.csvシートTSV形式でダウンロードし、ja.tsvという名称でBundlePC/Fonts/SteamworldDigFontBuilder/SteamworldDigFontBuilder/scriptsに保存する。
  7. makefonts_example.batを起動する(フォント名やサイズは適宜変更のこと)
LinuxまたはMacOSで作業する場合、EXEが.netなのでMonoを導入してください。また、バッチ中のパス区切り文字を\から/へ修正し、環境変数定義をそれぞれご利用のシェルに合わせてください。
Windowsで作業する場合、宗教上の理由やエディションの関係等でWindows Subsystem for Linuxを導入しない場合、バッチmakefonts_example.batbash -c で始まる行を削除し、別途perlが動作する環境(たとえば、Git for Windowsとか、Cygwinとか、VMWareでCentOSとか)でbash -c 以下で定義されているperlスクリプトを実行して成果物を生成してからバッチを起動してください。生成されたen.csvはBundlePC/Languageに、code.listはBundlePC/Fonts/SteamworldDigFontBuilder/SteamworldDigFontBuilder/scripts/ ディレクトリにそれぞれ配置してください。

なお、生成するフォントのオリジナルがファイル名を.orgを付与してBundlePC/Fontsに存在する場合(speak.org.fnt, speak.org.pngなど)、そのオリジナルフォントを生成するフォントに取り込みます
    死んでもperlやバッチファイルを使いたくない人向け作業手順
  1. 作業シートのD列またはC列の内容をBundlePC/Language/en.csvファイルにコピー&ペーストする。バックアップを忘れずに。
  2. BundlePC/Fontsに書庫内のEXEを取り出して配置する
  3. EXEで各フォントを生成する。バックアップを忘れずに。
    例えばspeak.fntの場合:
    SteamworldDigFontBuilder.EXE /batch /title speak /fontname "Meiryo" /fontsize 20.0 /color1 0xFF321402 /color2 0xFFFFFFFF
    EXEをコマンドラインオプションをつけずに起動するとGUI画面から対話的にフォントを生成できます
  4. 3.をmainmenu.fntなど日本語表示が必要なフォント分繰り返す。(但しゲーム中未使用の文字もフォント化するので馬鹿でかくなります)
    フォントやサイズ、色は適宜変更してください。
スクリプトの詳しい使い方はスクリプトの頭のコメントを、EXEのそれはREADME.mdをそれぞれご覧ください。

とりあえず成果としては現状こんな感じです。

なんだ簡単そうじゃん、と言われちゃうとそうかもしれません。
確かにテキストデータはCSVファイルで編集は極楽。アクションゲームらしいので大した訳文もなし。ぶっちゃけ訳す必要すらなさげです。

が、それでも敢えて日本語化したいといったときに問題が一つ。

フォントが、PNGファイルと、そのPNGファイルに描画されている文字を管理するファイル(拡張子:.fnt)でペアになっているというめんどくさーいパターンなのです。

しかも管理ファイルが独自のバイナリ形式だったりします。
まず日本語化にはこの管理ファイルの構造から解析をしなくちゃなりませんでした。
しかし、フォント画像がpng中にあるわけですから、管理ファイルの構造さえわかってしまえば自家薬籠中の物となるわけです。

金曜から始めてfntファイルをバイナリエディタで眺めたり、cでfread()を並べてすったもんだの挙句、fntファイルの構造がだいたいわかり、上記の動画を製作するまでにはなりました。

1文字あたり30バイトの固定長レコードで構成されている構造で、かつリトルエンディアンだということはすぐにわかったのですが、その30バイト中にどういう情報が格納されているのかわからないのでバイトの区切りが分からず、そのあたりは苦労しましたが、結局単精度浮動小数のバイナリ表現だと気づけた段階でほぼ解析終了となりました。気づくまでが長くて己の無能さをかみしめていますが。

fntファイルのフォーマットをまとめるとこんな感じです。
    A)ヘッダ(可変長)
  1. magicword 4bytes ( bfmt ) 
  2. 16bit整数 収録文字中の最大高?
  3. 32bit整数 0x20 全ファイルに収録されるホワイトスペースの文字コードか?
    (最小の文字コードでもあるので開始文字コードかもしれない)
  4. 16bit整数 対応するpngファイル名長
  5. 4)で定義された長さのpngファイル名
  6. 16bit整数 fntファイルに格納されているフォント情報レコード数
    B)フォント情報レコード(固定長32bytes)
  1. 32bit整数 文字コード
  2. 単精度浮動小数 png画像中の文字画像の左上隅X座標
  3. 単精度浮動小数 png画像中の文字画像の左上隅Y座標
  4. 単精度浮動小数 png画像中の文字画像の幅
  5. 単精度浮動小数 png画像中の文字画像の高さ
  6. 単精度浮動小数 png画像中の文字画像のXベアリング
  7. 単精度浮動小数 png画像中の文字画像のYベアリング
  8. 32bit整数 png画像中の文字画像のアドバンス幅
    C)謎(4bytes)
  1. (all 0)
    末尾に00 00 00 00がつくのですが、これは何かの個数を表している気がしますが、日本語は固定ピッチなのでなんかカーニングやら合字とかの情報だったとしても何の役にも立たないのでほっといていいと思います。
ここまでわかってしまえば、あとはpng画像を生成するだけ・・・
といっても、日本語の場合、JIS第一第二水準の漢字にひらカナ、記号、全角数字があり、さらに半角文字やゲーム中にもともと用意されているLatin系の文字を加えてリスト化してみると7000文字を超えました。
超えましたが、まあ、リストを作る作業自体はさらっと(でもないけど)スクリプトを書いてしまえばおしまいなので数時間で終わりましたのでいいとして、この数はどうかと。
png生成処理も最初はImageMagickでやっちゃおうと思っていましたが、ImageTragickがらみでpolicyをいじったり正確なフォントのレンダリング後のサイズが把握しづらいなどもあって、結局C++でGDIゴリゴリより楽で、かつある程度バイナリも扱いやすい(?)C#で書いてしまいました。
本来は翻訳済みファイルに使用されている文字だけ抽出すりゃいいのでしょうが(※2017/11/01 必要文字のみフォント化に対応しました)、翻訳より先にフォントファイル解析および作成作業に入ってしまったこともあり、C#を採用したせいでコーディングもあっけなく終わったので、しゃらくさいのでこいつら全部をフォントファイルとして生成してしまいました。

そのため、生成されたfnt+pngのペアを配布できません。
7000文字を超えるすべての文字を網羅するフリーのフォントを知らないからです。

ですから、もしやる気があるなら、fnt+pngのペアを生成するプログラムを公開しますから、手動で生成していただくことになります。

プログラムの使い方は、見ればわかります。
わからない場合はソースも添付しますので、そちらをご覧ください。SteamworldDigFontBuilderクラス以外は枝葉末節で、SteamworldDigFontBuilderクラスの長さはコメントを抜くと100行ちょいで大変簡単なプログラムなので万が一読む気になっても特に面倒くさいところはないと思います。

以上です。

0 件のコメント:

コメントを投稿