開発関連の話題を書くところです。
メモとかソフトウェアとかとかぶっている部分もあるのでどちらに書くかは微妙ですが、なるべく開発関連をこちらに書くことで棲み分けすることにしてみます。
開発関連の話題を書くところです。
メモとかソフトウェアとかとかぶっている部分もあるのでどちらに書くかは微妙ですが、なるべく開発関連をこちらに書くことで棲み分けすることにしてみます。
観たい映画が何本も上映中なんだが、観ることが出来ない。
時間がないとかお小遣いがちょっととかじゃなくて、最寄りの映画館で上映されていないからだ。
最寄りの・・・というより、札幌の1映画館でしか、どれも上映されていないのだ。
他府県でなら、大都市圏なら県内に数軒、そうでなくても片道10時間近くかかるようなことはないだろうが、北海道に限って言えば、札幌に近くない地域では普通にそのくらいかかってしまう。
万人受けするベストセラーな作品を除くほとんどの作品が札幌でしか上映されない。このことへの問題意識は、前々から持っていたが、これはちょっとひどいんじゃないかと今回思った。
映画館はあるのに観たい作品が上映されていない、北海道の映画館事情はかなりお寒いものだ。
というわけで、ご多分に漏れず今回もまた、円盤が発売されるなり配信・レンタル開始されるなりするまで観ることが出来ないのだなあ。こういう面では本当に北海道ってだめだと思う。
吉里吉里Zのソースから必要なものをビルドして吉里吉里2用に作られたプロジェクトが動作できるようにするまでの手順が網羅されているサイトが見当たらなかったので、ここに紹介しておく。吉里吉里Zのビルドには、今最新の版である visual studio community 2017 を用いることにする。
実はこれが結構長い手順で作業は大変だが、吉里吉里2プロジェクトが動作するまで最後まで書いておく。
ステップ1 吉里吉里Z本体をビルドする
visual studio community 2017 をインストールしておく。こちらのページの中にある「コミュニティ 無償ダウンロード」をクリックする。
cmake をインストールしておく。(例) x64 の場合、現在の最新版3.13.4はここからダウンロードできる。
nasm のサイトから、 nasm をインストールしておく。 krkrz の HowToBuild.txt には「nasm 2.10.09 (最新版は未チェック)」と書かれているが、最新版で構わない。現在は 2.14.02 。x64 の場合は nasm-2.14.02-win64.zip をダウンロードする。
github からソース環境を clone する。(例) git clone –b master https://github.com/krkrz/krkrz
「コントロールパネル」の「システム」から「システムのプロパティ」を開き、「環境変数」から、システム環境変数(またはユーザー環境変数)の Path に、 nasm.exe をインストールしたディレクトリのパスを設定する。
コマンドプロンプト(cmd.exe)を開き、ローカルに clone した先の krkrz/krkrz/external/zlib/ に cd で移動する。((例) cd c:/users/*/source/repos/krkrz/krkrz/external/zlib )
移動した場所で、 cmake . を実行する。これによって、 プロジェクト zlib に欠けていた zconf.h が出来るのでビルドが通るようになる。
ローカルに clone した先の krkrz/krkrz/vcproj/ にある tvpwin32.sln を開く。
option_desc_ja.json を開き、 901 行目の
sound プロジェクトの WaveFormatConverter_SSE.cpp を開き、冒頭の #include 部分に '#include <intrin.h>' を追加する。そうしないと、34, 35 行目で _mm_cvtepi16_epi32 の undefined identifier のエラーが出る。
ソリューションエクスプローラーで turbojpeg-static の中の x32 をクリックし、 j*.asm という名前の NASM 形式のアセンブリのファイルの一覧を表示させる。複数選択で全て選択して右ボタンクリックし「プロパティ」を開き、「構成プロパティ」の「カスタムビルドツール」の「全般」を選択すると、「コマンドライン」に、
setlocal
nasm -fwin32 -DWIN32 -I../win/ -I../simd/ ../simd/%(Filename).asm -o./$(Platform)/$(Configuration)/%(Filename).obj
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
と表示されるが、2行目の nasm を、 nasm をインストールした場所の絶対パス(ファイル名込み)に変更する。(例) 'C:\Program Files(x86)\nasm-2.14.02\nasm' 。変更しないと、 nasm が見つからないというエラーが出るためだが、 nasm はシステム環境変数の PATH にパスを設定してあるので問題ないはずなのだが、何故かどうやっても Visual Studio Community 2017 はパスをたどって実行してくれないので、やむを得ずこのように絶対パスで指定することでビルドを通すことが出来た。 x64 はビルドしないならこれでいいが、 x64 もビルドするなら、 turbojpeg-static の x64 でも同様の修正を加える。 ソリューションエクスプローラーで tvpwin32 をクリックして選択し、メニューバーの下のアイコンから、 Debug Win32 を選択し、 evpwin32 を右クリックし、「リビルド」を選択し全体をビルドする。
ローカルに clone した先の krkrz/ に tvpwin32_d.exe が出来ているので、吉里吉里2用に作成したプロジェクトのルートディレクトリに tvpwin32_d.exe をコピーする。
ステップ2 吉里吉里Zの動作に必要な DLL をビルドする
github からソース環境を clone する。(例) git clone –b master https://github.com/krkrz/krkrz_dev
ローカルに clone した先の krkrz/krkrz_dev/src/plugins/win32/menu/vc2012/ にある menu.sln を開く。
ソリューションエクスプローラーで menu をクリックして選択し、メニューバーの下のアイコンから、 Debug Win32 を選択し、 menu を右クリックし、「リビルド」を選択し全体をビルドする。
ローカルに clone した先の krkrz/krkrz_dev/src/plugins/win32/menu/vc2012/ にある menu.sln を開く。
ソリューションエクスプローラーで menuをクリックして選択し、メニューバーの下のアイコンから、 Debug Win32 を選択し、 menuを右クリックし、「リビルド」を選択し全体をビルドする。
ローカルに clone した先の krkrz/krkrz_dev/bin/win32/plugin/ に menu.dll が出来るので、吉里吉里2用に作成したプロジェクトのルートディレクトリの下の plugin ディレクトリに menu.dll をコピーする。
ローカルに clone した先の krkrz/krkrz_dev/src/plugins/win32/KAGParser/vcproj/ にある KAGParser.sln を開く。
ソリューションエクスプローラーで KAGParser をクリックして選択し、メニューバーの下のアイコンから、 Debug Win32 を選択し、 KAGParser を右クリックし、「リビルド」を選択し全体をビルドする。
ローカルに clone した先の krkrz/krkrz_dev/bin/win32/plugin/ に KAGParser.dll が出来るので、吉里吉里2用に作成したプロジェクトのルートディレクトリの下の plugin ディレクトリに KAGParser.dll をコピーする。
github からソース環境を clone する。(例) git clone –b last_hedgepodge_repository https://github.com/krkrz/krkrz
ローカルに clone した先の krkrz/last_hodgepodge_repository/src/plugins/win32/win32dialog/vc9/ にある win32dialog.sln を開く。
ncbind.hpp の 532~536 行目を以下の様にコメントアウトする。コメントアウトしないと、「error C2668: : オーバーロード関数の呼び出しを解決することができません。」エラーが出る。
// for reference
// template <typename SRC>
// inline void operator ()(VarT &dst, SRC &src, ncbTypedefs::Tag<SRC&> const &tag) const {
// operator()<SRC&> (dst, src, tag);
// }
ソリューションエクスプローラーで win32dialog をクリックして選択し、メニューバーの下のアイコンから、 Debug Win32 を選択し、 win32dialog を右クリックし、「リビルド」を選択し全体をビルドする。
ローカルに clone した先の krkrz/last_hodgepodge_repository/bin/win32/plugin/ に win32dialog .dll が出来るので、吉里吉里2用に作成したプロジェクトのルートディレクトリの下の plugin ディレクトリに win32dialog .dll をコピーする。
ステップ3 吉里吉里2プロジェクトを修正する
ローカルに clone した先の krkrz/krkrz_dev/script/KAG3/data にある system ディレクトリの中にあるファイルを全て、動作させたい吉里吉里2プロジェクトの system ディレクトリにコピーする。
動作させたい吉里吉里2プロジェクトの scenario ディレクトリにある .ks ファイルの文字コードを shift-jis から utf8 に変更する。(エディタで開いて文字コードを変えるか、参考サイトの「2.文字コードを変更する」のように nkf で一括変換すると便利。)
動作させたい吉里吉里2プロジェクトのルートディレクトリの下の system ディレクトリにある config.tjs を開き、右ボタンクリック時の動作などを吉里吉里Zが用意したものを用いる場合は、以下の useHamExtention を true にする。逆に、私のように、自分の吉里吉里2環境で自前で右クリック時の動作などを記述しているので余計なことをしないで欲しい場合は false にする。
// ◆ Ham拡張の使用
// Ham Extention for KAG3を使用しない場合はfalseにしてください。
;global.useHamExtention = false;
動作させたい吉里吉里2プロジェクトのルートディレクトリにある startup.tjs をエディタで開き、冒頭部分に、以下のような if ブロックを追加する。
@if (kirikiriz)
property _dummyProp { getter {} setter (v) {} }
with(Window) {
&.innerSunken = &_dummyProp;
&.showScrollBars = &_dummyProp;
}
Plugins.link("plugin/menu.dll");
Plugins.link("plugin/KAGParser.dll");
Plugins.link("plugin/win32dialog.dll");
@endif
ローカルに clone した先の krkrz/krkrz_dev/script/Krkr2Cpmpat/data/ の中にある k2compat ディレクトリとその中身を全て、動作させたい吉里吉里2プロジェクトのルートディレクトリにコピーする。
ステップ4 吉里吉里2プロジェクトを修正する(吉里吉里Zが吉里吉里2非互換の部分について、 互換性を出来るだけ確保したい場合の追加作業)
動作させたい吉里吉里2プロジェクトのルートディレクトリにある startup.tjs をエディタで開き、冒頭部分の if ブロックに、 var base = “k2compat/”; からの3行を追加する。( 3つの Plugins.link については、この作業をした場合なくてもよくなるはずだが、あってもエラーにはならない。)
@if (kirikiriz)
property _dummyProp { getter {} setter (v) {} }
with(Window) {
&.innerSunken
= &_dummyProp;
&.showScrollBars = &_dummyProp;
}
Plugins.link("plugin/menu.dll");
Plugins.link("plugin/KAGParser.dll");
Plugins.link("plugin/win32dialog.dll");
var base = "k2compat/";
Scripts.execStorage(base+"k2compat.tjs");
Krkr2CompatUtils.scriptBase = base;
@endif
これで、吉里吉里2プロジェクトが動作するようになる。ただし、プロジェクトによっては、各部で吉里吉里2と吉里吉里Zの非互換部分でエラーが出る場合があるので、その都度修正が必要になる。
吉里吉里2は、展開するだけでそのまま開発を始められるアーカイブファイルが用意され、分かりやすいチュートリアルやリファレンスマニュアルが用意されていたから、多くの初心者が吉里吉里を使うことができたのだと思う。
吉里吉里Zにも公式サイトにリファレンス等があるので参照するとよいと思う。ただし、配布アーカイブは、本体と KAG (ノベルソフトを書くのに役立つスクリプトツール)が別々になっており、 KAG も機能別に「鱧入り KAG3 for 吉里吉里Z」と「 KAG3 for 吉里吉里Z」( github リポジトリは「鱧入り KAG3 for 吉里吉里Z」と「 KAG3 for 吉里吉里Z」)に分かれて配布されているので注意して欲しい。
この記事が少しでも新規に吉里吉里Zを用いてモノづくりをしたいと思う人と、吉里吉里2から吉里吉里Zに移行して吉里吉里を使い続けようと思う人の役に立てば幸いに思う。
昨年から PHP7で動作するよう rNote を修正して使用していたが、PHPマニュアルサイトの flock() の説明によると、 PHP 5.3.2 以降は、 flock($fp, LOCK_EX); などでロックしたファイルは、 fclose($fp); の直前で明示的に flock($fp, LOCK_UN); を呼んでアンロックしてやらないといけないことに気づいたので grep で検索してみたら、結構あちこちでアンロックを明示的に呼んでいなかった。
そこで、 flock($fp, LOCK_UN); を明示的に呼びだすように修正した。(修正しなくても特に問題なく動作していたが、 PHP の仕様上正しくロックしなくなっていたはず。)
特に気を付けたいのが rnote.php で下のように定義されている _fopen_wb() 。
function _fopen_wb($fname){
$fp = @fopen($fname, "wb");
if(! $fp) error("$fname : File write error");
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
rewind($fp);
return $fp;
}
この関数の中では $fp = fopen() が呼ばれ、開かれたファイルをロックしているのだが、アンロックしないまま fclose($fp); も呼ばず、そのまま $fp を返り値として返しているので、_fopen_wb() を呼び出した側で、受け取った $fp を使用した後に fclose($fp) する直前で明示的に flock($fp, LOCK_UN); を呼ばなければいけない。コードとしてはかなり見通しが悪くなり汚いコードになるが仕方がないのでそのように修正した。