@if exp="typeof(global.optionButton_object) == 'undefined'" @iscript class OptionButtonLayer extends ButtonLayer // クリックされたときに実行する関数を指定できるボタンレイヤ { var onClickFunction; function OptionButtonLayer(window, parent, func) { super.ButtonLayer(window, parent); focusable = false; visible = true; onClickFunction = func; hint=""; } function finalize() { super.finalize(...); } function onClick() { super.onClick(...); } function onMouseUp(x, y, button, shift) { super.onMouseUp(...); if(enabled && button == mbLeft) onClickFunction(this); } } class OptionButtonPlugin extends KAGPlugin { var x =0 ; // 初期 x 位置 var y =600; // 初期 y 位置 var foreButtons = []; // 表画面のボタンの配列 var backButtons = []; // 裏画面のボタンの配列 var foreSeen = false; // 表画面のボタンが可視か var backSeen = false; // 裏画面のボタンが可視か var optionButtonState=false; var OptionBtnTimer; function OptionButtonPlugin() { // OptionButtonPlugin コンストラクタ createButtons(kag.fore.base, foreButtons); // 表画面のボタンを作成 createButtons(kag.back.base, backButtons); setObjProp(foreButtons, 'visible', foreSeen = false); setObjProp(backButtons, 'visible', backSeen = false); } function finalize() { // ボタンを無効化 for(var i = 0; i < foreButtons.count; i++) invalidate foreButtons[i]; for(var i = 0; i < backButtons.count; i++) invalidate backButtons[i]; super.finalize(...); } function createButtons(parent, array) { // parent を親レイヤとしてボタンを作成し、array に登録する。 // ボタンは表画面と裏画面の両方に対して作成されるので注意。 // ボタンを追加するには、これを参考にして いろいろ追加してください。 var obj; // ボタン 0 (履歴) array.add(obj = new OptionButtonLayer(kag, parent, onHistoryButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_history'); obj.setPos(411, 579); obj.hint="View previously read text"; // ボタン 1 (オート) array.add(obj = new OptionButtonLayer(kag, parent, onAutoButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_auto'); obj.setPos(438, 579); obj.hint="Activate Auto Reding Mode"; // ボタン 2 (スキップ) array.add(obj = new OptionButtonLayer(kag, parent, onSkipButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_skip'); obj.setPos(463, 579); obj.hint="Activate skipping"; // ボタン 3 (セーブ) array.add(obj = new OptionButtonLayer(kag, parent, onSaveButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_save'); obj.setPos(510, 573); obj.hint="Register save file"; // ボタン 4 (ロード) array.add(obj = new OptionButtonLayer(kag, parent, onLoadButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_load'); obj.setPos(560, 573); obj.hint="Load save file"; // ボタン 5 (コンフィグ) array.add(obj = new OptionButtonLayer(kag, parent, onConfigButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_config'); obj.setPos(603, 578); obj.hint="Pull up the configuration window"; // ボタン 6 (クイックセーブ) array.add(obj = new OptionButtonLayer(kag, parent, onQsaveButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_qsave'); obj.setPos(645, 583); obj.hint="Create a quick save"; // ボタン 7 (クイックロード) array.add(obj = new OptionButtonLayer(kag, parent, onQloadButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_qload'); obj.setPos(697, 583); obj.hint="Load the quick save file"; // ボタン 8 (メッセージを隠す) array.add(obj = new OptionButtonLayer(kag, parent, onHideButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_hide'); obj.setPos(755, 411); obj.hint="Eliminate this window temporarily"; // ボイス再生 array.add(obj = new OptionButtonLayer(kag, parent, onRepeatButtonClick)); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_voice'); obj.setPos(744, 579); obj.hint="Plays the most recent spoken dialogue"; array.add(obj = new ButtonCheckBox(kag, parent, onHoldButtonClick, "game_hold")); obj.setPos(355, 582); obj.absolute = 1002000+100; obj.hitType=htMask; obj.hitThreshold=0; obj.focusable=false; obj.visible=true; obj.check=sf.optionhold; obj.hint="Change the arrangement of these buttons"; // ベース1 array.add(obj = new Layer(kag, parent)); obj.absolute = 1002000+99; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_base1'); obj.setSizeToImageSize(); obj.setPos(348, 569); // ベース2 array.add(obj = new Layer(kag, parent)); obj.absolute = 1002000+99; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_base2'); obj.setSizeToImageSize(); obj.setPos(400, 576); // ベース3 array.add(obj = new Layer(kag, parent)); obj.absolute = 1002000+99; obj.hitType=htMask; obj.hitThreshold=0; obj.visible=true; obj.loadImages('game_base3'); obj.setSizeToImageSize(); obj.setPos(502, 572); } function onHoldButtonClick(obj) { sf.optionhold = !sf.optionhold; foreButtons[10].check = sf.optionhold; backButtons[10].check = sf.optionhold; if(!sf.optionhold){ setObjProp(foreButtons, 'opacity', 255); setObjProp(backButtons, 'opacity', 255); } } function setOptions(elm) { // オプションを設定 setObjProp(foreButtons, 'visible', foreSeen = +elm.forevisible) if elm.forevisible !== void; setObjProp(backButtons, 'visible', backSeen = +elm.backvisible) if elm.backvisible !== void; } function setObjProp(array, member, value) { // array の各メンバのプロパティの設定 for(var i = array.count - 1; i >= 0; i--) array[i][member] = value; } //--------------------- // 押したボタンに呼応する関数 //--------------------- function onHistoryButtonClick() { if(kag.historyLayer.visible) kag.hideHistory(); else kag.showHistory(); } function onAutoButtonClick() { if(kag.autoMode) kag.cancelAutoMode(); else kag.enterAutoMode(); } function onSkipButtonClick() { kag.clickSkipEnabled=true; if(sf.skipopt) kag.skipToNextStopMenuItem.click(); else kag.onSkipToNextStopMenuItemClick(); } function onSaveButtonClick() { if(tf.evcgmode)return; //f.optionmode=2; if(!f.view_h && !f.view_ed) kag.callExtraConductor('saveload.ks','*save'); } function onLoadButtonClick() { if(tf.evcgmode)return; //f.optionmode=1; if(!f.view_h && !f.view_ed) kag.callExtraConductor('saveload.ks','*load'); } function onConfigButtonClick() { kag.callExtraConductor('config.ks','*showconfig'); } function onQsaveButtonClick() { if(tf.evcgmode)return; if(askYesNo("Create Quick Save?",,"Overwrite?")){ kag.saveBookMark(108); } } function onQloadButtonClick() { if(tf.evcgmode)return; if(!Storages.isExistentStorage(kag.getBookMarkFileNameAtNum(108)))return; if(askYesNoForQLoad("Load QuickSave?",,"Are you sure?")){ kag.loadBookMark(108); } } function onHideButtonClick() { kag.switchMessageLayerHiddenByUser(); } function onRepeatButtonClick() { if(f.lastPlayVoice != ""){ kag.se[kag.se.count-1].play(%[ storage : f.lastPlayVoice ]); } } //------------------- // ここまで //------------------- function onStableStateChanged(stable) { // 「安定」( s l p の各タグで停止中 ) か、 // 「走行中」 ( それ以外 ) かの状態が変わったときに呼ばれる // 走行中は各ボタンを無効にする setObjProp(foreButtons, 'hitThreshold', stable ? 0 : 256); setObjProp(backButtons, 'hitThreshold', stable ? 0 : 256); } function onMessageHiddenStateChanged(hidden) { // メッセージレイヤがユーザの操作によって隠されるとき、現れるときに // 呼ばれる。メッセージレイヤとともに表示/非表示を切り替えたいときは // ここで設定する。 if(hidden) { setObjProp(foreButtons, 'visible', false); setObjProp(backButtons, 'visible', false); } else { setObjProp(foreButtons, 'visible', foreSeen); setObjProp(backButtons, 'visible', backSeen); } } function onStore(f, elm) { var dic = f.systemButtons = %[]; // f.systemButtons に辞書配列を作成 dic.foreVisible = foreSeen; dic.backVisible = backSeen; dic.left = x; dic.top = y; dic.hideButtonX = foreButtons[8].left; dic.hideButtonY = foreButtons[8].top; } function onRestore(f, clear, elm) { // 栞を読み出すとき var dic = f.systemButtons; if(dic === void) { // systemButtons の情報が栞に保存されていない setObjProp(foreButtons, 'visible', foreSeen = false); setObjProp(backButtons, 'visible', backSeen = false); } else { // systemButtons の情報が栞に保存されている setOptions(%[ forevisible : dic.foreVisible, backvisible : dic.backVisible, left : dic.left, top : dic.top]); // オプションを設定 // 隠すボタンの位置を覚えているのならそこに準じる if(dic.hideButtonX != void){ foreButtons[8].setPos(dic.hideButtonX, dic.hideButtonY); backButtons[8].setPos(dic.hideButtonX, dic.hideButtonY); } } } function onCopyLayer(toback) { // レイヤの表←→裏の情報のコピー // backlay タグやトランジションの終了時に呼ばれる // ここでレイヤに関してコピーすべきなのは // 表示/非表示の情報だけ if(toback) { // 表→裏 setObjProp(backButtons, 'visible', foreButtons[0].visible); backSeen = foreSeen; } else { // 裏→表 setObjProp(foreButtons, 'visible', backButtons[0].visible); foreSeen = backSeen; } } function onExchangeForeBack() { // 裏と表の管理情報を交換 // children = true のトランジションでは、トランジション終了時に // 表画面と裏画面のレイヤ構造がそっくり入れ替わるので、 // それまで 表画面だと思っていたものが裏画面に、裏画面だと思って // いたものが表画面になってしまう。ここのタイミングでその情報を // 入れ替えれば、矛盾は生じないで済む。 // ここで表画面、裏画面のレイヤに関して管理すべきなのは // foreButtons と backButton 、foreSeen と backSeen の変数だけ var tmp; tmp = backButtons; backButtons = foreButtons; foreButtons = tmp; tmp = backSeen; backSeen = foreSeen; foreSeen = tmp; } property visible { setter(v) { optionButtonState=v; foreLayer.visible=v; backLayer.visible=v; } getter { return foreLayer.visible; } } property left { setter(x) { foreLayer.left=x; backLayer.left=x; } getter { return foreLayer.left; } } property top { setter(y) { foreLayer.top=y; backLayer.top=y; } getter { return foreLayer.top; } } } kag.addPlugin(global.optionButton_object = new OptionButtonPlugin(kag)); // プラグインオブジェクトを作成し、登録する // このオブジェクトを作った時点でウィンドウのonMouseMove横取り! kag.onMouseMove = function(x, y){ if(!sf.optionhold){ if(y > 550 || x > 750){ with(optionButton_object){ .setObjProp(.foreButtons, 'opacity', 255); .setObjProp(.backButtons, 'opacity', 255); } }else{ with(optionButton_object){ .setObjProp(.foreButtons, 'opacity', 0); .setObjProp(.backButtons, 'opacity', 0); } } } }incontextof kag; @endscript @endif ; ; マクロの登録 @macro name="optionbtopt" @eval exp="optionButton_object.setOptions(mp)" ; mp がマクロに渡された属性を示す辞書配列オブジェクト @endmacro @macro name="optionbtForNovel" @eval exp="optionButton_object.foreButtons[8].setPos(755, 18);" @eval exp="optionButton_object.backButtons[8].setPos(755, 18);" @endmacro @macro name="optionbtForAvg" @eval exp="optionButton_object.foreButtons[8].setPos(755, 411);" @eval exp="optionButton_object.backButtons[8].setPos(755, 411);" @endmacro @return