吉里吉里2/KAG3 で気をつける点 - 前半

吉里吉里2/KAG3 は同人をはじめ商業でもゲーム(特にノベル系統)でよく使われていますが、作品をプレイヤが自由に操作できる状態のものも多くみかけます。

吉里吉里2 は汎用エンジンですし、 KAG3 も元々ゲーム用のフレームワークとはいえ色々なことができ、ゲームに限らず Windows で何か処理させるツールを作るときに利用することもできます。そのためか、良くも悪くも自由にアクセスするための「穴」が存在します。( KAGEX はどうなのかよくしりません。)

それを塞ぐことの是非は置いといて、触らせたくないという方針の団体も多いでしょう。


逆に言えば、どうすればプレイヤは自由に弄ることができるでしょうか。


まず、デバッグ用のコンソール及びスクリプトエディタなどを利用する方法があります。これは吉里吉里に付いている機能で、開発時には大変重宝するものです。 Shift+F1 〜 F4 がデバッグ関係のウィンドウの表示に割り当てられています。特に Shift+F4 で表示できるコンソールを利用するのが基本中の基本です。

コンソールを利用することで、任意のタイミングで変数の操作やラベルへのジャンプが可能となります。また、シナリオファイル (*.ks) を別名で保存して閲覧できるようにすることなども可能です。


コンソールをはじめとしたデバッグ機能を表示させないためには、 Shift+F1 〜 F4 から表示させないようにすることと、 Debug.console.visible = true; などのスクリプトを実行させないようにする必要があります。

前者の対応を行っていても、後者のスクリプトの実行を利用されるとコンソールなどは表示できます。


まずは前者の Shift+F1 〜 F4 の対応ですが、コマンドラインオプションでコンソールなどのデバッグ支援ウィンドウを利用させないモード ( -debugwin=no ) で実行させるか、コンソールなどの表示に関わるキーを無効にする ( -hkconsole= ) ことです。
このコマンドラインオプションは、コマンドラインから実行する際に付加するほかに、吉里吉里設定で生成した設定ファイル (*.cf, *.cfu) から指定することができます。

  1. 吉里吉里本体 (krkr.eXe) に埋め込まれたもの
    • 基本的には埋め込まれることは稀
  2. 設定ファイル (*.cf)
  3. プレイヤ用の設定ファイル (*.cfu)
  4. コマンドラインで付加したもの
  5. スクリプトで指定したもの(後述)
    • ただしこれにより変更が反映されないオプションも存在する

コマンドラインオプションは上記の順に読み込まれ、後に読み込んだものほど優先されます。

設定ファイルは書き換えることが可能ですし、そもそも設定ファイルを削除されたら効きません。コマンドラインでのオプション付加もショートカットを利用することで簡単に扱えます。つまり、基本的に制作者サイドはコマンドラインオプションでデバッグ支援ウィンドウを抑制することは難しいわけです。


設定ファイルやコマンドラインからオプションを指定することでコンソール等の利用を防ぐのには限界があります。
そうではなく、起動したあとシナリオファイル (*.ks) やスクリプトファイル (*.tjs) 内でオプションの値を変更させることもできます。これだと基本的に制作側の意図通りに動作させることができます。

System.setArgument('-debugwin', 'no');

ただし、簡単に確認したところホットキー関係はスクリプトで指定しても変更されないタイプのオプションでした。もっとも -debugwin が効くので実質問題ないでしょう。


さて、 -debugwin=no で動作させていても Debug.console.visible = true; などのスクリプトが実行されると表示されます。スクリプトの実行を防ぐのは難しいので、これに対しては前置 & 演算子を使って visible プロパティを潰して、実行されても動作されないようにすることで対策できます。

// 元々の visible プロパティを別の変数に待避
// 待避させず、完全に機能を潰すという手もある
Debug.console.__visible = &Debug.console.visible;
// visible プロパティが入っている変数に、一般の値を代入する
&Debug.console.visible = 0;


コンソールなどデバッグ支援ウィンドウは、何か問題が起こってサポートを行うときなどにも有効です。完全に機能を潰すか否かはちゃんと考えた方がいいと思います。別の変数に待避させた場合は、パッチなどを用いて待避させたものに true を代入すると表示させることができます。待避させる先の名前は、予測されにくい名前にする方がよいでしょう。


もちろん、コンソールを中心に書きましたが、スクリプトエディタも任意タイミングでスクリプトを実行できるので同等の処理をする必要があります。コントローラはコンソールやスクリプトエディタを TJS の visible プロパティごしにではなく直接表示させることができるため、やはり同じことをしなければ不十分です。