2012年12月26日水曜日

The Walking Dead

日本語化リクエスト募集中でリクエストに上がっていた中でSyndicateは海外ゲーム日本語化実験所で、日本語化していたので、自分はThe Walking Deadを調べてみた。

オリジナルのEXEでは、フォントファイルを解析した感じで文字数は255文字固定みたいなので、そのままでは無理と判断。

適当に中文化MODを漁ってみた。中文化は3dmgameとali213のものがあるが、扱いやすそうなのは、ali213の方。一応、ちょっと怖いので、隔離環境でセットアップしたり、デバッグしたり、動作中の状態を軽くチェックした感じでは大丈夫ポイかな。。。

fmodex.dllをいじって独自のdll(ali213.dll)を読み込ませて画面上に文字表示する処理をゴニョゴニョしてるタイプ。

文字コードはEUC_CNで作成していて、少しテストしてみたところ、フォントをEUC-JP用に調整すれば、日本語化できそう。ただ、EUC-JPのフォントテクスチャの作成はかなり面倒くさい。。。。

一応、ちょっとだけ試したゲーム画面。



フォントの調整がまだ必要なのと、テキストもほとんど中国語のままなので、汚いが日本語になった。

2012年12月23日日曜日

tsxbinのシンボルファイルサンプル(upk)

自分がupkのフォーマット確認やupk用のツールの開発の確認用に使っているtsxbinのupkのシンボルファイルの紹介。

元々、公開する予定はなかったが、Adventar Calendarのネタの1つとして紹介することにした。upkのフォーマットに興味を持つ人がどれだけいるのかという疑問はあるが。。。

各ゲームへの対応は自分の気まぐれでやっているので、現状対応しているのは以下の通り。

Unreal Tournament 3
Mass Effect
Alice Madness Returns
Batman Arkham City
Transformers War for Cybertron
BulletStorm
BorderLands
Dishonored

あと、UDKのオリジナルフォーマットには対応しているので、UDKベースの最近のUE3ゲームはあまりカスタマイズもされていないので、そのまま、もしくは、ちょっと変更するだけで対応できると思う。


■使い方
上記ファイルをtsxbinのインストールフォルダにコピーすれば、tsxbinにてupkファイルを読み込めば自動的に適用される。upk自体が圧縮されている場合は、http://www.gildor.org/downloads にある Unreal Package Decompressorで一旦解凍すれば、詳細表示が可能になる。


ちゃんとupkの解説も付けようかと思ったが、あまりに面倒くさいので挫折。



tsxbinのマクロは、CライクではあるがCと全く同じには書けないので、ちょっと回りくどい書き方の部分もあるが、upkのフォーマットを理解したい人には少しは役に立つのかなと思うので、そういう人がいればどうぞ。

とりあえず、これで tsxbin の話はおしまい。

2012年12月21日金曜日

自分も1つやろうかな。

日本語化リクエスト募集

こんなことやってるのか。クリスマスに公開とは忙しそうだ。

最近時間に余裕がないので、クリスマスは無理だけど、選考落ちしたものから1つ選んで自分も日本語化してみようかな。目処は年末くらいで。

tsxbinのシンボルマクロのtips

tsxbinのシンボル用のマクロを作成する際につまづいたり、わかりづらい所を思いつく範囲で紹介。まだ、ありそうだが思い出せないので、また、思い出したら追加するかも。

■ シンボルファイルを編集しているとtsxbinでシンボルが適用されない。
シンボルファイルを編集しながら、tsxbinで確認する際、シンボルファイルをエディタ開きっぱなしにしているとtsxbin上ではマクロが適用されない。エラーも出ないので、わかりづらい。どうせ読込みしかしないので適用されてもいいのではと思うが。。

 ユーザ定義関数を使う場合
定義は一番最後に記述して、メイン処理の最後(関数定義の先頭直前)に必ず return; を書く。書かないと関数部分を実行してしまう。

 ユーザ定義関数の引数の宣言
プロトタイプ宣言や関数の宣言で、void型は必ず明記する必要あり。

■ サイズ0の配列はファイル記述変数では無視される。
サイズ0でファイル記述変数に配列を割り当ててもエラーは出ない(単純に無視される)。

$char text[0];

■ 可変長のデータを持つ構造体をファイル記述変数で扱えない。
構造体っぽく表示させたい場合は、関数でそれっぽく読み込ませて、表示させるしかない。

void ReadStruct(void)
{
   $char StructData.Type[4];
   $int  StructData.Length;
   $int  StructData.Header1;
   $int  StructData.header2;
  
   int textlen = GetCurrentDword();
   $int  StructData.TextLength;
   $char StructData.Text[textlen * 2];
}

■ Int64が使えない。
結構困るが、どうしようもないので、自分はtypedef.hにこんな感じで構造体を追加して使っている。$

struct int64 {
   int L;
   int H;
};


■ ファイル記述変数名にインデックス番号などを後から付与する。
ファイル記述変数の変数名は文字列を作成して実行時に割り当てられる。3行目のファイル記述変数の変数名がstring型の変数varnameになっているが、このような使い方をすると実際のシンボル表示では、var_name_sample_10と表示される。

int a = 10;
string varname = "var_name_sample_" + tostr(a);
$WORD length;
$char varname[length * 2];

■ 今から読み込む文字数を取得する。
文字数情報がデータに入っていないフォーマットでは、たいていNULLが区切りなので、FindByte()でNULLまでのバイト数を取得して文字数を算出する。

int len = FindByte(0);
$char str[len];

FindByte()では探すターゲットまでのデータ長を返すので、ターゲットとして指定したNULLを含める場合は+1する必要がある。

int len = FindByte(0);
$char str_with_null[len + 1];

■ ファイル終了位置の検出
GetFileSize()とGetCurrentOffset()を使う。

while(GetFileSize() > GetCurrentOffset()) {
    ....
}

■ 読み込んだ文字列でファイル判定や処理変更をするような場合
読み込んだ文字の比較を行うことができるFStrCmp()を使う。FStrCmp()では読込ポジションは変更されない。

if(0 == FStrCmp(0, 4, "FNFO"))
{
    ....
} else if(0 == FStrCmp(0, 4, "DLET"))
    ....
} else {
    ....
}

次は、upk用のシンボルファイルを紹介しようかと思う。

2012年12月19日水曜日

tsxbinのシンボル機能

今回は、tsxbinのシンボル機能を使うためのマクロの基本を紹介したい。tsxbinのマクロについては、ネットで探してもあんまり書かれていない。
特にマクロ言語の癖というか仕様的な部分のtipsは見た事ない。今回は基本的なところをまとめてみる。

1)シンボル記述のヘルプ
シンボル自体に関しての説明があまりないので、最初はシンボル≒マクロだとわからず、ヘルプも何を見ればいいのか自分はわからなかった。
実際にはシンボル表示に使用するのはマクロそのものなので、マクロのヘルプを見ればほぼわかる。ただし、マクロヘルプはtsxbinのメニューの「ヘルプ」にはなく、「マクロ」の中の「マクロヘルプ」を開く。
ヘルプを一通り読めば、Cを知っている人や実際に解析している人だったらすぐ使えるようになるだろう。

2)言語仕様概略
  • 演算子仕様、typedef、フロー制御文なんかは概ねC準拠。
  • 変数は、char、int、short、long、float、double、stringが利用できる。unsignedも利用可能。
  • 配列は1次元配列のみ。構造体も定義可能。
  • プリプロセッサでエンディアン指定ができる。
  • ループ処理は最大数が決まっていて、増やしたい場合はプリプロセッサで指定。
  • 関数はヘルプに記載されているものしか使えない。
  • ユーザ定義関数も利用可能。
詳しくはヘルプ参照のこと。

3)シンボルファイル
エディタ上でシンボル表示を可能にするシンボルファイルは、tsxbinインストールフォルダ内に、拡張子SYMというファイル名で作成する。
この時ファイル名に対象ファイルの拡張子をそのままつけると、対象ファイルを読み込んだ時に自動的に対象となるシンボルファイルを適用してくれる。
例えば、*.dat というファイルのシンボルを dat.sym というファイルでtsxbinのフォルダに作成しておけば、.datファイルを読み込むと毎回自動的にdat.symを適用してくれる。

4)ファイル記述変数
シンボルを利用する場合に一番利用するもの。このファイル記述変数をマクロに書くとその宣言部分で読み込んだデータを指定された型に従ってエディタの画面上で表示する。
記述の仕方は、通常の変数宣言文の型名に「$」をつけるだけ。例えば、次のようなint変数をファイル記述変数として宣言する。
$int Magic;
上記のように宣言すると、対象ファイルの現在の位置から型分のデータを読み込んでエディタ上で表示され、読み込んだ分ファイルの位置が進む。また、宣言後は、普通に読み出し専用変数のとしても利用できる。例えば以下のような感じ。

$int Magic;
if (Magic == 1) {
    $int Version;
} else {
    $int Unknown;
}
ただし、通常の変数宣言では、同じスコープ内で同名の変数を複数回宣言することはできないが、ファイル記述変数ではシンボル表示をしたいところで何回も同じ名前で宣言することが可能。変数として使用した場合は、最後のファイル記述変数の宣言時の値が使用される。

5)関数
関数は、ファイル記述変数として読み出すポジションを必要としたり、読み出す文字数を先に確認するなどのためにファイルアクセス系の関数を比較的よく使う。関数で読み出した場合は、ファイルの読み出しポジションは変わらないので関数を使用してもその後のファイル記述変数には影響しない。

6)サンプル
Baldur's Gateのtlkファイルのフォーマットをシンボルファイルで作成するとこんな感じ。(以前BGEEの二有志翻訳の人がツールを探してたときに作成したもの)

// tlk file for Baldur's Gate
#maxloop 100000

struct Entry
{
 short Type;
 char  Resource[8];
 int   Volume;
 int   Pitch;
 int   Offset;
 int   Length;
};

$char magic[4];
$char version[4];

$short LangID;
$int Count;
$int Offset;

$Entry entry[Count];

for(int i = 0; i < Count; i++)
{
 if(entry[i].Length > 0)
  $char String[entry[i].Length];
}

短いけど、構造体やループなどが入っているので分かりやすいかなと思う。tsxbinで実際にdialog.tlkに適用するとこうなる。



次は、マクロ作成時のtips的なことを書くかも。

2012年12月17日月曜日

tsxbinの紹介

ゲーム日本語化 Advent Calendar 2012に参加してみたので、なんか書こうという事で日頃解析に使っているツールを紹介する。

自分は、リソースファイルを解析のツールとして、tsxbinというバイナリエディタを活用している。
tsxbinは、こちら(http://www.net3-tv.net/~m-tsuchy/tsuchy/index.htm)で公開されているバイナリエディタ。

最大の特徴は、Cライクなマクロ言語を実装し、マクロでシンボルファイルを作成することによって、エディタ上のデータ表示をシンボルで定義された形式に変更することができる。
最近自分が作成したツールのPrototype2のp3dファイルのシンボルを例に挙げると、普通のバイナリエディタではこんな感じだが、


シンボルファイルを定義するとこんな感じになる。



マクロを組みながら、少しずつフォーマット確認を行うことができるので、バイナリエディタ上でフォーマット確認&ツール作成なんかに比べると、段違いに効率的になる。
また、自作ツールをrepackしたものをtsxbinでフォーマット確認するなど、デバッグツールとしても使える。

それ以外にもバイトオーダー、型表示(BIT,HEX,SIGN,UNSIGN)、バイナリレベルでの差分比較なんかの機能も便利だ。マクロと組み合わせて使いこなせば解析がぐっと楽になる。
ただ、ちょっと不便なところもある。

  • マクロファイルをテキストエディタで開いているとtsxbinでシンボルが適用されない。エラーも出ない。
  • 文字コードがSJISとUNICODEしか対応してない。
  • Int64に対応していない。
  • 複雑なマクロを組むとちょっと遅くなる。
  • バイナリ差分比較が大きなファイルだと遅い。。

更新が行われなくなってずいぶん経っているが、上記あたりが改善されるととてもうれしいなあ。。。

次は、tsxbinのシンボルの作成について気が向いたら書くかも。

Prototype2 ゲーム中字幕unpack/repackツール

Prototype2の日本語化で、ゲーム中の字幕が既存ツールでは書き換えられないとのことだったのでツールを作成。使い方は同梱のreadme見てください。


対象となるファイルは、audio_german.rcfに含まれているが、1ファイル1文という形式で、字幕文が空のものを除いても、3000ファイル以上ある。ツールでは、空文ファイルは処理から除外している。

repackしたものを配布すると膨大な数&それなりのサイズになるので、ゲームフォルダにてrepackを実行して利用者が各自書き換えを行う方がよさそう。一応、そういう想定でツールも作成してみた。

2012/12/31更新: ツールに一部のファイルで問題があったので修正。

2012年12月4日火曜日

Prototype2

2chのprototypeスレで日本語化が完成していた。現状のフォントでは不足文字があるようなので、製作者殿に感謝しつつ、フォントを作成してみた。
prototype2は、フォントファイルのサイズに制限があり、1044KB以内に抑えないとゲームが正常に起動しない。
元々のIPAゴシックだと不足文字を追加するとどうやっても1044KBを超えるため、いくつかフォントを試した結果、MigMixのレギュラーとボールドに変更することでサイズ問題を回避。

prototype2_jpfont_1.1.zip

12/5更新 文字追加で新しいフォントを作成するための手順とファイルを追加。
2/24更新 新しいフォントをこっちで公開。