mkxpの豆腐を除去して日本語を表示する。

#mkxpの豆腐を除去して日本語を表示する。
[mkxp](https://github.com/Ancurio/mkxp)というソフトウェアをご存知だろうか。

これはWindows以外の環境でRPGツクールXP・VX・VXAceで作られたゲームをプレイできる、オープンソース(GPLv2+)なソフトウェアだ。
だが、このソフトウェアは日本語のフォントが同梱されておらず、豆腐に化けてしまう。
![mkxp_bakebake.jpg](https://qiita-image-store.s3.amazonaws.com/0/133100/507fde9a-b17e-2b77-7123-0b07572a56dc.jpeg)

[cjkフォントをバンドルする案](https://github.com/Ancurio/mkxp/issues/135)や、[バンドルされているフォントの置き換えを簡単にする案](https://github.com/Ancurio/mkxp/pull/136)は既に出されているのだが、これらの案は採用されていないようである。
また、このソフトウェアはOSのフォントディレクトリには一切アクセスしない(これは[マルチプラットフォームの為](https://github.com/Ancurio/mkxp/issues/139)とされている)為、自分でフォントを追加する必要がある。
>Fonts
>
>In the RMXP version of RGSS, fonts are loaded directly from system specific search paths (meaning they must be installed to be available to games). Because this whole thing is a giant platform-dependent headache, I decided to implement the behavior Enterbrain thankfully added in VX Ace: loading fonts will automatically search a folder called "Fonts", which obeys the default searchpath behavior (ie. it can be located directly in the game folder, or an RTP).

>If a requested font is not found, no error is generated. Instead, a built-in font is used (currently "Liberation Sans").

と[README.md](https://github.com/Ancurio/mkxp/blob/master/README.md)にはあるのだが、2016年12月22日現在、VXやVXAceで作られたほぼデフォルトのゲームを起動してみた限りにおいては、読み込んでいる様子はみられない。
![Screenshot from 2016-12-22 23-45-23.png](https://qiita-image-store.s3.amazonaws.com/0/133100/4bbd0416-667d-6bae-bd85-79629e8132b6.png)
![Screenshot from 2016-12-22 23-45-46.png](https://qiita-image-store.s3.amazonaws.com/0/133100/5d9e1150-c665-4964-1b87-a23adc3edb4e.png)

(VX・VXAce共に最初からRTPにFontsというディレクトリにフォントが用意されているので、RTPにパスが通っていなければ画像や音声ファイルが見つからないためエラーに、通っていればFontsディレクトリに必ずたどり着くはずである。)

勿論ゲームフォルダに直接Fontsディレクトリを作っても効果は見られなかった。
このことからこのフォント置き換え機能は現状機能していないと思われる。

他に外部からフォントを追加する方法もわからなかったので、ソースコードを自分で改変してバンドルフォントを変更、ビルドすることで対応することにした。
##用意したもの

1. Windows10 Pro(64bit) (ホスト)
2. VMWare Player
3. Ubuntu 12.04(64bit) (ゲスト)
4. [mkxpのソースコード](https://github.com/Ancurio/mkxp)
5. mkxpのDependency kit ([README.md](https://github.com/Ancurio/mkxp/blob/master/README.md)にリンクあり)
6. [モナーフォント](http://monafont.sourceforge.net/)
7. [CMake](https://cmake.org/download/)
8. g++
9. libopenal-dev
10. zlib1g-dev 
11. ビルド済みmkxp ([README.md](https://github.com/Ancurio/mkxp/blob/master/README.md)にリンクあり)

Ubuntu 12.04(64bit)を選んだのはmkxpのDependency kitの動作がテストされた唯一の環境だからである。
実際筆者はLinux Mint 18で試したがビルドに失敗した。恐らくgccのバージョンが異なっているのだろう。
勿論一から必要なものを集め直すことも可能だが、面倒かつ容量を食うので筆者は試していない。
しかし、12.04ではapt-getで入るCMakeのバージョンが古いためビルドができない。CMakeは自分でビルド済みのものを手に入れてくるか、ビルドする必要がある。
筆者の場合は自分でビルドを行った。最初にg++が無いと怒られた以外は特に何もなかったので問題なくビルドできると思われる。
g++は当然apt-getで入れる必要がある。こちらは最新版だと色々問題があるのでしないように。
qmakeも対応しているらしいのだが、筆者は試していないのでわからない。
他、libopenal-devとzlib1g-dev がビルドする際に不足したのでapt-getで入れた。

置き換えに使うフォントとして[IPA](http://www.geocities.jp/ipa_mona/)**で無い方の**モナーフォントを使わせていただくことにした。
再配布を目的としているわけでもないのでIPAでない**理由は特に無い**。とりあえず表示できるようにするのが目的である。

最後のビルド済みmkxpが必要な理由だが、これはビルド済みのパッケージに含まれているlib及びlib64ディレクトリが必要なため。
ビルドしてもバイナリ一つしか生成されないため、ライブラリはビルド済みのパッケージから取り出す必要がある。
##改変が必要なファイルと検索ワード。
まず、Dependency kitを展開して出てきたmkxp-depkitディレクトリをmkxpのディレクトリ直下置く。
次にmona.ttfをassets/に置く。
で、このフォントを組み込むわけだが、ハードコーディングされているので複数箇所の書き換えが必要になる。
書き換えが必要なファイルは以下の３つだ。

1. CMakeLists.txt
2. src/bundledfont.cpp
3. src/font.cpp

書き換えは単純で、`liberation`を検索して`mona`に置き換えていけば良い。
他のフォントに置き換える場合は恐らくフォントの名前ではなく、フォントファイルの名前(`foobar.ttf`なら`foobar`)に置き換えれば良いと思われるが、試していないので確証はない。
##ビルドする。
すべての箇所を置き換えたらターミナルを開きmkxpのディレクトリ下に移動し、以下のコマンドを実行する。

```bash
$ mkxp-depkit/setup_depkit.sh
$ source mkxp-depkit/buildenv.sh
$ mkdir build
$ cd build
$ cmake -DBOOST_INCLUDEDIR=$BOOST_I -DBOOST_LIBRARYDIR=$BOOST_L ..
$ make
```

最初の二行はターミナルを起動するたびに実行する必要があるようだ。
実行権限がなかったらそれぞれ与えてからもう一度実行すればよい。
ちなみにqmakeの場合は

```bash
$ mkxp-depkit/setup_depkit.sh
$ source mkxp-depkit/buildenv.sh
$ qmake
$ make
```

で良いらしい。筆者は試していない。

これでバンドルフォントをモナーフォントに交換できたはずだ。実際に適当なゲームで試してみると良い。
![Screenshot from 2016-12-22 23-51-26.png](https://qiita-image-store.s3.amazonaws.com/0/133100/5ebf32bf-612b-7447-4015-e3ed5bfdc363.png)
![Screenshot from 2016-12-22 23-49-21.png](https://qiita-image-store.s3.amazonaws.com/0/133100/fa1231b9-d7d3-af10-26ab-c982283b507d.png)
![Screenshot from 2016-12-22 23-50-11.png](https://qiita-image-store.s3.amazonaws.com/0/133100/bf878b25-2d51-c912-260a-7a9026ddd570.png)

##付録:mkxp.conf
以下に筆者がテスト用に用意したmkxp.confを載せておく。
このファイルはmkxpのバイナリと同じディレクトリに置いておけば自動で読み込まれる。
元々wineでツクールを実行しており、RTPもwineでインストールしていた為そこにRTPのPATHも通している。
サウンドフォントは[README.md](https://github.com/Ancurio/mkxp/blob/master/README.md)にリンクがはられている`GMGSx.sf2`を書いておいた。
これは`gm.dls`（所謂MSGS）に非常に近い音バランスと音色を持つ。
他にこれに近いもの(というか殆ど変わらないといって良い)には`Scc1t2.sf2`や`msgs.sf2`等がある。どれもググればすぐに出てくるので好みで選択すると良い。

```mkxp.conf
## RTPのPATH
## VXとVXAceのRTPはファイル名が同じになっている為、両方入力していると先に入力した方のみ有効になる。
## VXAceのゲームをプレイするときはこのファイルの6行目の先頭に#を入れる必要がある。
RTP=/home/private/.wine/drive_c/Program Files/Common Files/Enterbrain/RGSS/Standard
RTP=/home/private/.wine/drive_c/Program Files/Common Files/Enterbrain/RGSS2/RPGVX
RTP=/home/private/.wine/drive_c/Program Files/Common Files/Enterbrain/RGSS3/RPGVXAce
## Fonts設定。効果は認められなかった。
# fontSub=MS PGothic>mona
# fonrSub=ＭＳ Ｐゴシック>mona
## Midi用のサウンドフォントへPATHを通す。Midiの再生にはfluidsynthのインストールが必要。
midi.soundFont=/home/private/SoundFonts/GMGSx.sf2
## MidiのDSPエフェクト。XP~VXAceで再生されるMidiはdsdmo.dllによるリバーブがかけられている。その再現をこれで行う。
## 片方のみ有効になっているが、両方有効にしても問題はない。
# midi.chorus=true
midi.reverb=true
```