[20160708追記ここから]
ここに書いてあることは5_0_7_rcブランチに限った話ですので忘れて下さい。
本来のビルドはREADMEに書いてある通りCMakeを使いましょう。
[20160708追記ここまで]
遊ぼうって言ってもプログラマー的な意味でな!
記事タイトルの通り今回は音ゲーマーにはお馴染み、
StepMania5をソースからビルドしてみたいと思います。
なんか速攻で終わりそうな内容だなぁ…
まずStepMania公式(http://www.stepmania.com/)から
ソースコードをダウンロード。(俺がDLしたバージョンは5.0.7でした)
んで解凍。
今回はVisual Studio 2013でビルドしたいのでsrcフォルダの中の
sm5-net2013.slnを開きます。
そして構成を「Debug」から「Release」に変えて、ビルド→ソリューションのビルド。
これだけです。あら簡単。早くもこの記事は終わりそうです。
あれ、ビルドエラーが出ました。なんでだ…
エラーが出てる箇所は
こんな感じで、見慣れない文字が書かれています。
github(https://github.com/stepmania/stepmania)のmasterをダウンロードして
ビルドしても結果は同じでした。
ググってみると、
PseudoLocalize compilation errors · Issue #76 · stepmania/stepmania
https://github.com/stepmania/stepmania/issues/76
同じ問題に遭遇してる人が。
この問題のが発生する原因は、
alright, it looks like Microsoft Visual C++ likes to read files that are UTF-8 without BOM as Shift-JIS files when the locale is set to Japanese,
らしいです。日本語に直すと
「日本語環境のWindows上でVisual StudioがUTF-8(BOMなし)のファイルを読むとShift-JISとして認識してしまう」
…あってるのかな。英語はさっぱりです。
この関数、StepManiaの設定(Preferences.ini)の
PseudoLocalizeを1にしないとこの関数は通らないし、
日本人には関係ない処理だし、
しかもこの関数通すとデフォルトテーマのluaがエラーを吐いてしまう、
と、あまり意味ない関数(独断と偏見)なので、
1 2 3 4 |
static RString PseudoLocalize( RString s ) { return s; } |
もうこうしてしまってもいいんじゃないかと思いましたが
さすがに自称プログラマーのプライドが許さなかったので
なんとかビルドできるようにこの関数の処理を変えてみました。
以下糞コード注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
static RString PseudoLocalize( RString s ) { //Ugly: スペースは文字化け回避のおまじない RString a = "àá "; Trim(a); RString A = "ÀÀ "; Trim(A); RString e = "éé "; Trim(e); RString E = "ÉÉ "; Trim(E); RString i = "íí "; Trim(i); RString I = "ÍÍ "; Trim(I); RString o = "óó "; Trim(o); RString O = "ÓÓ "; Trim(O); RString u = "üü "; Trim(u); RString U = "ÜÜ "; Trim(U); RString n = "ñ "; Trim(n); RString N = "Ñ "; Trim(N); RString c = "ç "; Trim(c); RString C = "Ç "; Trim(C); s.Replace( "a", a ); s.Replace( "A", A ); s.Replace( "e", e ); s.Replace( "E", E ); s.Replace( "i", i ); s.Replace( "I", I ); s.Replace( "o", o ); s.Replace( "O", O ); s.Replace( "u", u ); s.Replace( "U", U ); s.Replace( "n", n ); s.Replace( "N", N ); s.Replace( "c", c ); s.Replace( "C", C ); // transformations that help expose punctuation assumptions //s.Replace( ":", " :" ); // this messes up "::" help text tip separator markers s.Replace( "?", " ?" ); s.Replace( "!", " !" ); return s; } |
「おまじない」とか目も当てられない文字が書かれていますが、
こう書き換えることでとりあえずビルドは通ります。
この関数が通った時の処理もうまくいってるようです。
相変わらずデフォルトテーマのluaはエラー出しますが。
しかし、ビルド編とか書いてるけど続くのかなこれは…
余談
PseudoLocalize関数の中でずらっと変数を追加してますが、
最初は構造体を使って書いてました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
struct PseudoChar { public: RString a, A, e, E, i, I, o, O, u, U, n, N, c, C; PseudoChar() { //Ugly: スペースは文字化け回避のおまじない a = "àá "; Trim(a); A = "ÀÀ "; Trim(A); e = "éé "; Trim(e); E = "ÉÉ "; Trim(E); i = "íí "; Trim(i); I = "ÍÍ "; Trim(I); o = "óó "; Trim(o); O = "ÓÓ "; Trim(O); u = "üü "; Trim(u); U = "ÜÜ "; Trim(U); n = "ñ "; Trim(n); N = "Ñ "; Trim(N); c = "ç "; Trim(c); C = "Ç "; Trim(C); } }; PseudoChar *p = new PseudoChar(); |
しかしこの構造体をインスタンス化すると、なぜかコンストラクタが呼ばれないのです。
でもVisual Studioの新規プロジェクトや、Ideoneで似たようなコードを書くと
ちゃんとコンストラクタは呼ばれます。
ここで物凄い悩みましたが、上にも書かれてる
「日本語環境のWindows上でVisual StudioがUTF-8(BOMなし)のファイルを読むとShift-JISとして認識してしまう」
という問題のせいにしておきます。