// ******************************************************************** // ユーザによる吉里吉里上の不正な操作を禁止するスクリプト // ゲームリリース時に、data/startup.tjs などに追加する。 // // data/startup.tjs や Initialize.tjs に追記すると、このスクリプトが // パッチでは更新できなくなることに注意。従って、「ゲームリリース後に // 問題があった場合に、デバッグ情報がとれず解決できない」という悲しい // 事故を防ぐため、このスクリプトを事前によく読み、設定内容を正確に把握 // しておくこと。 // あまり厳しく考えないのであれば、このスクリプトをまるごと // data/scenario/Afterinit2.tjs として配置してもよい。ただし、その場合は // パッチで上書きされうることに注意。 // // 事前に krkrconf.exe で <実行ファイル名>.cf という設定ファイルを作成し、 // 以下の check_cmdline_option() でチェックされるオプションは、その中で // 全て明示的に指定しておくこと。 // ******************************************************************** // 2016/04/06 0.1 初期リリース // ******************************************************************** // 意図せぬスクリプトの実行を促すオプションが指定されていないかチェック // ******************************************************************** // コマンドラインオプション -startup が指定されていないことをチェックする // これは吉里吉里Z専用のコマンドラインオプションで、吉里吉里2では単純に // 無視される。"" ではないのは、吉里吉里Z(1.1.0.3?)で起動時にメディア // エラーになるのを防ぐため。 @if (kirikiriz) check_cmdline_option("-startup", "startup.tjs"); @endif // コマンドラインオプション -ovr が指定されていないことをチェックする // これは吉里吉里のオプションではなく、KAGのdata/system/Initialize.tjsの // 末尾で使用されている。"" ではなく "yes" なのは、吉里吉里Z(〜1.1.0.3?)で // 起動時にメディアエラーになるのを防ぐため。吉里吉里2では "" でもよい。 check_cmdline_option("-ovr" , "yes"); // ******************************************************************** // デバッグ関連の機能を無効化する // ******************************************************************** // コマンドラインオプション -debug が no であるかチェックする check_cmdline_option("-debug", "no"); // コマンドラインオプション -debugwin が no であるかチェックする check_cmdline_option("-debugwin", "no"); // デバッグコンソールを表示せず、加えて今後も表示させないようにする if (typeof(Debug) != 'undefined' && typeof(Debug.console) != 'undefined') { Debug.console.visible = 0; delete Debug.console.visible; } // デバッグコントロールを表示せず、加えて今後も表示させないようにする if (typeof(Debug) != 'undefined' && typeof(Debug.controller) != 'undefined') { Debug.controller.visible = 0; delete Debug.controller.visible; } // ログ情報がファイルに出力されなくなっていることを確認する check_cmdline_option("-forcelog" , "no"); // ******************************************************************** // ホットキーの無効化をチェックする // ******************************************************************** // ホットキーはスクリプトから無効化できない。そのため、krkrconf.exe を // 使って、この中で事前に krkr.exe を上書きしてホットキーの無効化を宣言 // すること。 // コントローラのホットキーが無効になっていることを確認する check_cmdline_option("-hkcontroller" , ""); // スクリプトエディタのホットキーが無効になっていることを確認する check_cmdline_option("-hkeditor" , ""); // 監視式のホットキーが無効になっていることを確認する check_cmdline_option("-hkwatch" , ""); // コンソールのホットキーが無効になっていることを確認する check_cmdline_option("-hkconsole" , ""); // 更新矩形情報のホットキーが無効になっていることを確認する check_cmdline_option("-hkupdaterect" , ""); // レイヤ構造ダンプのホットキーが無効になっていることを確認する check_cmdline_option("-hkdumplayer" , ""); // ******************************************************************** // パッドを無効化する // ******************************************************************** // これはお好みで。 System.setArgument("-joypad" , "no"); // ******************************************************************** // 画面上部メニューの「デバッグ」欄を非表示にする // Afterinit2.tjs あたりで実行するときのみ有効 // ******************************************************************** if (typeof(kag) != 'undefined' && typeof(kag.debugMenu) != 'undefined') { kag.debugMenu.visible = 0; delete kag.debugMenu.visible; } // ******************************************************************** // KAG のデバッグメッセージを抑制 // Afterinit2.tjs あたりで実行するときのみ有効 // ******************************************************************** // デバッグメッセージ抑制 if (typeof(kag) != 'undefined' && typeof(kag.mainConductor) != 'undefined') kag.mainConductor.debugLevel = 0; // 右クリックルーチンのデバッグメッセージ抑制 if (typeof(kag) != 'undefined' && typeof(kag.extraConductor) != 'undefined') kag.extraConductor.debugLevel = 0; // ******************************************************************** // 指定したプラグインだけが読み込まれているかどうかのチェック // このチェックまでに全てのプラグインを読み込んでおくこと。 // ******************************************************************** // 読み込みを許可する吉里吉里プラグイン配列を渡す。*.tpm を使用している // 場合はそれも追加すること。 // ただし、このスクリプトの後に Plugins.link() したものは検知できない。 // 今読み込まれているプラグインは、ゲーム起動中に Plugins.getList() を // 実行することで、「文字列の配列」として得られる。 check_loaded_plugins([ "ExtKAGParsera.dll", "layerExImage.dll", "layerExShimmer.dll", "windowEx.dll", "wuvorbis.dll", "extrans.dll", "KaichoTrans.dll" ]); // この他に考慮すべきこと // Initialize.tjs を編集して、以下を実装するか検討すること。ただし、 // Initialize.tjs はパッチによる変更が効かないので、リリース後に誤りを // 発見しても修正できないことに注意。ややリスキー。 // 1. 不要な Override.tjs/Override2.tjs/AfterInit.tjs/AfterInit2.tjs を無効に // する // 2. 不要な *.xp3 を自動検索パスからはずす // ここまできたらチェック完了 return; // ******************************************************************** // このスクリプト内で使用する関数群 // ******************************************************************** // エラー終了する function error_exit(message) { Debug.message(message); // System.exit()でないのは、TJS中での終了時エラーになるため System.terminate(); // ↑この行をコメントアウトすれば、エラー終了せず吉里吉里は起動する。 // 起動しない場合に何が悪かったかを調べるなら、起動してログを見ること。 } // コマンドラインオプションをチェックして、指定と違ったら強制終了する。 // オプションが指定されていなかった場合、getArgument()はvoidを返すので // voidの場合もチェックするかどうか指定可能。しかし、krkr.eXeバイナリを書き // 換えてデフォルト値を変更する輩のことを鑑み、通常は voidok=false とする。 function check_cmdline_option(optname, value, voidok=false) { var v = System.getArgument(optname); if (v === void) { if (!voidok) error_exit("invalid option: " + optname + "= (void)"); return; } if (v != value) error_exit("invalid option: " + optname + "=" + v); } // 許可されたプラグインだけが読み込まれているかチェックする。 // プラグインを配置するのは、/ と /plugin/ ディレクトリのみ許可する。 // 読み込まれたプラグインの読み込み元パスを得る方法がないため、現状では // チェックはイイカゲン。 // 本当はsignatureをチェックして改ざんも検出すべきだが、今はそうしていない。 function check_loaded_plugins(allowplugins) { var loadedplugins = Plugins.getList(); // 全てのプラグインがSystem.exePath以下にあるかどうかチェック var syspath = System.exePath; for (var i = 0; i < loadedplugins.count; i++) { var lp = loadedplugins[i]; if (!Storages.isExistentStorage(syspath + lp) && !Storages.isExistentStorage(syspath + 'plugin/' + lp)) error_exit("unlocated-plugin: "+loadplugins[i]); loadedplugins[i] = Storages.extractStorageName(lp); if (!allowplugins.find(loadedplugins[i])) error_exit("unpermitted-plugin: "+loadplugins[i]); } }