glinkでconfig.ksを開きたい【ティラノスクリプト】
ティラノスクリプトティラノスクリプトでシナリオ実行中config.ksへジャンプするには、必ずsleepgameする必要があります。 buttonタグの場合、roleを使うことでsleepgameを実行してからconfig.ksにジャンプすることができます。 しかし、glinkにはroleというパラメータがありません。
僕はなぜか画像を使ったbuttonタグを使うことなくconfigを開きたいと思ってしまったので、いろいろ試してみました。
expパラメータを利用する
expにはボタンがクリックされた時に実行されるJSを指定できます。
そしてありがたいことにdata\system\KeyConfig.jsにヒントがあります。
"67":function(){ // c ボタン
//config呼び出し例 コメント化
/*
if (TYRANO.kag.tmp.sleep_game != null) {
return false;
}
TYRANO.kag.ftag.startTag("sleepgame", {storage:"config.ks"});
*/
}
「cを押されたとき、sleepgameしてconfig.ksにジャンプする」という意味になります。
これを一部コピーして使います。
[glink text="コンフィグ" exp="if (TYRANO.kag.tmp.sleep_game != null) {return false;}TYRANO.kag.ftag.startTag("sleepgame", {storage:"config.ks"});"]
はい。これで僕のやりたかったことは完了です。
記述をもっと短くしたい
しかしこれだと長すぎて邪魔です。 ですがexpパラメータの中で改行をしてしまうとエラーになるため、別の方法を考えなければいけません。
今回使うのはユーザ定義関数です。 ユーザ定義関数は自分で処理をまとめて一つの塊にし、名前をつけてあとで呼び出せるようにするためのものです。
やり方はいくつかあると思います。 今回は2つ紹介します。
iscript内で定義
[iscript]
//関数を定義
//消えたら困るのでシステム変数を使用
sf.config = function(){
if (TYRANO.kag.tmp.sleep_game != null) {
return false;
}
TYRANO.kag.ftag.startTag("sleepgame", {storage:"config.ks"});
};
//これでsf.configにコンフィグ呼び出し用jsが定義されました
[endscript]
;使うときはsf.config()と記載すればOK
[glink text="コンフィグ" exp="sf.config();"]
しかし、この場合はティラノスクリプト内で定義したものしか使うことができません。
追記 どうやらこの方法は好ましくないようです。ティラノ変数で関数を定義すると保存時に文字列に置換されてしまうため、ロード時の挙動が変わってしまうとのこと。 tyrano.bbs.fc2.com/reply/6151304/233/
外部jsで定義してloadjsで読み込む
data\others\myscript.jsを作成し、そこに定義したいと思います。 外部ファイルであるがゆえティラノスクリプトの干渉を一切受けることなく安全に定義できますが、少し書き方に工夫が必要です。
//オブジェクトを生成
var myobj = {
//関数を定義
//ティラノスクリプトの外部なのでシステム変数などの概念はない
config:function(){
if (tyrano.plugin.kag.tmp.sleep_game != null) {
return false;
}
tyrano.plugin.kag.ftag.startTag("sleepgame", {storage:"config.ks"});
},
};
まずオブジェクトというものを生成する必要があります。 ここではmyobjという名前のオブジェクトを生成しています。 名前は何でも構いません。
そして上記の場合、myobj.configがこの変数の名前となり、実行する際は「myobj.config();」となります。
;loadjsで外部jsを読み込む(first.ksなどで読み込むのがいいと思います)
[loadjs storage="myscript.js"]
;使うときはmyobj.config()と記載すればOK
[glink text="コンフィグ" exp="myobj.config();"]
ちなみにTYRANOをtyrano.pluginへと変更しているのは、ティラノスクリプトの外部だからです。
実はシナリオファイルのiscript内やexpやevalで定義・実行されるjsは「tyrano.plugin.kag.embScript」というオブジェクトの中で定義・実行されています。 tyrano.pluginオブジェクト内(=ティラノスクリプト内)ではvar TYRANO = tyrano.plugin という変数が定義されており、TYRANOという文字列をtyrano.pluginとして使えるようになっています。
応用
応用としてこのようなことも可能です。
【myscript.js】
var myobj = {
//関数を定義
//ティラノスクリプトの外部なのでシステム変数などの概念はない
config:function(){
if (tyrano.plugin.kag.tmp.sleep_game != null) {
return false;
}
tyrano.plugin.kag.ftag.startTag("sleepgame", {storage:"config.ks"});
},
//オブジェクト内に二つ以上変数をもたせたい場合はカンマ(,)でつないでいく
website:function($url){
tyrano.plugin.kag.ftag.startTag('web',{url:$url});
},
};
【シナリオファイル】
[loadjs storage="myscript.js"]
*glink
[glink target="*glink" text="このサイトのトップへ飛びます" exp="myobj.website('https://rimane.net');"]
[glink target="*glink" text="ティラノスクリプト公式サイトへ飛びます" exp="myobj.website('https://tyrano.jp');"]
これでクリックすると公式ページに飛ぶglinkを作ることもできました。 (glinkをクリックするとボタン類が消去されてシナリオの先頭に戻ってしまうので、シナリオの先頭に戻らないようにtarget=”*glink”を指定しています)
expではjsを実行できるので、使いこなすことができれば何でもできるようになるのではないでしょうか。
広告