見出し画像

GameMaker製のゲームを日本語化する方法 日本語フォント実装~前編~

はじめに

 本記事は、私がこれまでに有志翻訳を行ってきた「Risk of Rain」「Nuclear Throne」「Vault of the void」をはじめとした、数々の名作を生みだしてきたゲームエンジンである、Gamemaker:Studioを解析し、日本語化を行うまでの手法を書き記すものです。

 内容が多岐にわたるため、以下の4つのほどの記事に分けて紹介を行いたいと思います。絶賛執筆中につき、多少分量が前後すると思いますが、全部完成したら改めてまとめたいと思います。

①日本語フォントの実装
②ゲーム内テキストの翻訳
③日本化を確認したゲーム
④ゲームエンジンを特定する手法の紹介

 今回は ①日本語フォント導入編となります。ゲーム内のフォントの解析、フォントの導入、ゲーム内でのフォント変更までを行っていきます。

必要なもの

※日本語を実装し改造するために、ゲームエンジンそのものであるGamemaker:Studio2は必要ありません。

Gamemaker:studioで作成されたゲーム

例:Risk of Rain(無印)

 本記事を執筆するにあたり、日本語を実装する例としてGamemaker:studio製の「Risk of Rain」と呼ばれる作品を使用します。本作は、2020年に私を含めた有志翻訳の方々で日本語化パッチを作成した作品です。

解析ツール(UndertaleModTool)

 ゲームファイルの解析には、上記のUndertalemodtoolを用います。
※本記事ではVer0.4.0.4及びver0.3.4.2を使用しています。
 解析にあたり、まずは最新版をインストールしてください。(ver0.3.4.2は②の記事の時に説明します。)

コードエディター

例:atom. io

 ゲームを解析するにあたりコードを編集するエディタが必要になります。
特に指定はありませんが、私が使用しているコードエディターは上記のAtom.ioとなります。
 なお、本記事の説明においても、Atom.ioを使用する為ツール違いによる操作の違いにはご了承ください。


フォント作成ツール(Bitmap Font Generater)

 Gamemaker:studioのフォントはスプライトフォントと呼ばれる形式で導入されている場合があります。そのため同じ方式を採用できる方法として、上記のソフトを使用します。

日本語フォント

 フォントを導入する際はそのフォントの規約を必ず理解した上で使用しましょう。フリーフォントであっても有償利用はライセンス料が必要な場合があります。特に、最終的に完成した日本語化パッチでは再配布という形をとる場合があるので再配布が可能であるかの確認を行いましょう。

元のフォントを特定する

 フォントを特定することで、そのゲームが翻訳可能かを判断していきます。もし、ゲーム内で使用されているフォントが特定できない場合、翻訳の実装は険しい道のりとなります。ひとつづつ解析していきましょう。

ゲーム画面を確認

上部にロゴは画像データと思われる。 メニュー画面に英語のフォントが使用されていると推測。

 まずはこちらのメニュー画面の文字を変更することを目標とします。

コードをアンパック

 ゲームのローカルファイルを解析し、使用されているコードを特定します。

 Steamからローカルファイルを参照を行いましょう。私の場合は
C:\Program Files (x86)\Steam\steamapps\common\Risk of Rain ←(ゲーム名)
に格納されています。上記の説明がわからない場合、
[steam ローカルファイル 閲覧] などで検索してください。

data. winのファイルに大半のデータが格納されている。

 ローカルファイルが閲覧できたら、data. win という名前のファイルを探します。私の場合アイコンが青いハートマークになっているものに該当します。data. winは、Gamemaker:Studioでゲームを作成した場合に作成されるファイルで様々なデータが格納されています。

 こちらのdata .winをUndertalemodtoolで開きます。

Scripts/Unpack assets/ExportAllCode.csx  を選択

 開いた後は、左上のScriptsから Unpack assets/ExportAllCode.csxを選択してください。これでコードのアンパックが完了です。

ローカルファイルにExport_Code フォルダが作成される。

コードを解析

 先ほどアンパックしたコードから、メニュー画面のテキストを検索します。コードエディターにコードのフォルダをすべて読み込ませて検索を行います。Atom. ioの場合、Ctrl+Shift+H で読み込ませたファイルすべての検索が可能です。検索項目に 「Start Single Player」と入力を行いましょう。

初期画面に表示されているテキストを指定しているコード「gml_Object_oStartMenu_Create_0」

 ビンゴ。コードの中に一つだけ該当するファイルがありました。中身を見てみましょう。どうやら、スタートメニューに表示するテキストが配列としてmenu[]に格納されているようです。こちらのテキストの編集を行い、ゲームで表示が変わるか調査を行います。

 Undertalemodtoolに戻り、「gml_Object_oStartMenu_Create_0」を検索欄に入力。Codeから開きDecompileを行います。

Undertalemodtoolを用いることで、ゲーム内のコードを書き替えることができる。


 「Start Single Player」を任意のテキストに書き換えます。この時調査したい内容として2つ。

・テキストが英語から英語に置き換わるか
・テキストが英語から日本語に置き換わるか

 そのため、「Start シングル Play」 と書き換えてdata.winを保存します。この時、保存を行う前にdata.winのオリジナルバックアップを取っておくことを忘れないでください。もし上書きしてしまっても、Steamからデータを再インストールすることは可能です。

「Start シングル Play」

 では、ゲームを起動してみましょう。

「Start␣Single␣Player」→「Start␣␣Play」

 「Player」 → 「Play」に書き換わり、「シングル」は表示されず空白␣が連続して続いていることがわかります。
 つまり、このテキストを変更すればテキストが差し変わるが、フォントに日本語は含まれていないということがわかりました。他にも、日本語のテキストが■(豆腐)にならず表示されないことから、TrueTypeフォントではなくスプライトフォントが使用されていることが推測されます。
 <訂正>スプライトフォントが用いられていることは変わりませんが、古いバージョンのgamemakerではTruetypeであろうとスプライトフォントであろうとゲーム内で用いられていないフォントを指定した場合は■豆腐とならずに何も存在しないように表記されていたようです。<訂正終了>
※スプライトフォントとは、Gamemaker:studioでフォントを表示する仕組みの一種です。詳しくはこちら↓


フォントを特定

 では、次にタイトル画面に使用されているフォントの特定を行いましょう。表示されるテキストを指定しているコードは「gml_Object_oStartMenu_Create_0.gml」でした。
 基礎的な話を語れるほどGamemaker:studioには詳しくはないのですが、gmlはCreate、Step、Drawの様に、ゲーム中での動作を複数のObject Eventsに分けることで処理を行っています。

Gamemaker:studioで用いられるObject Events

 Object_oStartMenu」という一つのルームの中で、複数のイベントに分かれて処理を行っており、「gml_Object_oStartMenu_Create_0.gml」はその中の一つというわけです。
 つまり、フォントを指定しているコードを特定するには、Draw eventを探せばよいということです。
 Atom .io でCtrl+P を押すと、ファイル名を検索することができます。
「Object_oStartMenu」で検索をおこなうと、Createのほかに、Drawをはじめとし他のイベントが存在していることが分かります。

Atom .ioはctrl+pでファイル名の検索が行える。

 では、「gml_Object_oStartMenu_Draw_0.gml」を開いてみましょう。

「gml_Object_oStartMenu_Draw_0.gml」

 このようになっています。では、この中からフォントを指定している関数を探します。gml(GameMakeLanguage)でのフォントを表示する方法として、頻出する組み込み関数を以下に記述します。

フォント実装
・font_add
・font_add_sprite
・font_add_sprite_ext


 フォントリソースを作成し、インデックス番号を返す関数です。
 1番目のfont_addは、font_add(Arial.ttf) のようにTrueTypeフォントから直接ゲームのフォントリソースを作成する為に用いられる場合があります。
 2番目、3番目はスプライトフォントを作成する為に用いられます。その為、本作では  font_add_sprite または font_add_sprite_ext が用いられている可能性が高いです。

フォント指定
・draw_set_font

 作成されたフォントリソースを指定する関数です。こちらはフォントがロゴ等の画像データとして作成されていない限り、ほぼ確実に使われている関数です。

テキスト指定
・draw_text
・draw_text_ext

・etc…

 こちらは表示するテキストを指定する関数です。様々な種類があります。

 まとめると、
1.フォントをゲームに登録する
2.登録したフォントを呼び出す
3.記述するテキストを指定する

 こうした一連の流れでテキストが記述されています。この時に、メニュー画面に使用されているフォントを特定する為に2を使用します。
コードエディタに戻り、Ctrl+Fでdraw_set_fontを検索しましょう。

「gml_Object_oStartMenu_Draw_0.gml」でdraw_set_fontを検索

 一つだけ該当するものが存在しました。どうやら、(global.fntTinyAlt)と名前が付けれたグローバル関数を、メニュー画面では使用しているようです。つまり、このグローバル変数に格納されているフォントを特定し、日本語のフォントに差し替えればよいということです。


編集後記

 さて、、、、ここまで書いておいてなんですが、今回の記事はここまでです。内容全てを全部描き切るにはこの5倍くらいの分量を網羅しないといけない為、一区切りを入れたいと思います。続きは後編の執筆をお待ちください。
 本記事ではかききれない内容や、個別に内容を聞きたい場合は、直接ご連絡いただければ幸いです。
・Noteのコメント欄
・Twitter @ibushi_maru
・Discord 燻丸#4633
までご連絡ください。

この記事が気に入ったらサポートをしてみませんか?