- []
- [以前のリビジョン]
TJSを使う方法
KAGシステムについて
まず最初に。
KAGと通常呼んでいる、簡易にアドベンチャーゲームを製作できるようにしたシステムはTJS言語によって記述されています。吉里吉里はTJS言語を解析し、処理するエンジンですので直接KAGシナリオを解析できません。(正確には吉里吉里にはタグを(文法的に)解析できるように組み込まれています。)
KAGシステムは、/kag3/template/system/ に入っている各TJSファイルによって構成されています。KAGシステムを構成するTJSスクリプトに関しては吉里吉里 insideで解説しています。
KAGシステムに依らない方法
KAGを利用せずに、単純にTJSを実行させる方法です。
吉里吉里は、実行する対象としてフォルダを指定します。そのフォルダの中にある startup.tjs をTJSの文法に沿って実行します。KAGシステムもこの仕様にマッチするように作られています。
KAGシステムを利用せずに吉里吉里でTJSを実行する場合は、この startup.tjs にTJSスクリプトを記述していきます。なお、この方法は、この記事の方針とは相容れないため省略します。
吉里吉里 inside - 吉里吉里アプリ入門でこの方法を利用したツールについて触れています。
KAGシナリオを読み込む前に
startup.tjs によって、KAGシステムを構築するTJSファイル(プロジェクトフォルダ内のsystemフォルダ下にあるファイル群)が読み込まれたあと、first.ks がKAGシナリオファイルとして読み込まれます。
KAGシステムをちょっと改造したかったり、first.ks 以降で使うクラスとか関数とかを準備したりする際にTJSを実行したいことがあります。もちろんシステムを直接いじっても変更はできますが、KAGシステムのバージョンアップを行うときなどに面倒です。そのためKAGシステムには、ユーザ(ゲーム開発者)が記述するためのTJSファイルがあります。
初期状態では存在しませんが、Override.tjs と AfterInit.tjs というファイルが存在したら実行されるようになっています。
この方法は後半の方で扱う予定です。とはいえ、今の段階では聞き流していただいて結構です。
KAGシナリオ内に埋め込む方法
KAGシナリオファイル(*.ks)にTJSスクリプトを埋め込む方法として、iscript タグと endscript タグで囲む方法があります。その中では、TJSのコメントや制御構文なども使えます。
[iscript]
{
var sum = 0;
for(var i = 0; i < 200; i++){
sum += i;
}
// 一時変数の tf.sum に加算
global.tf.sum += sum;
}
[endscript]
いままでの合計は[emb exp="tf.sum"]です。
この方法は、クラスや関数の定義であったり、やや多めの量の演算を行うときなどに便利です。
タグに埋め込む方法
TJSの式を評価(実行)するためのタグとして eval タグがあります。
; 全シナリオをクリアしていたら *bonustrack に、そうでなければ *title にジャンプ
[eval exp="kag.process('', sf.allclear ? '*bonustrack' : '*title')"]
[s]
eval タグは exp 属性の値をTJSスクリプトの式(expression)として評価(evaluate)します。単純な四則計算や代入式のほか、関数の呼び出しなどが行えます。
その他、TJS式とみなされるタグ・属性
eval タグは式を評価しその結果何もしないタグ(評価するためだけのタグ)でしたが、他にも属性値がTJS式としてみなされるものがあります。以下で説明するもののほか、hact タグや onenter 属性などもあります。詳しくはリファレンスに載っていますので、探してみてください。
emb タグ
emb タグは exp 属性の値をTJS式として評価した結果を、テキストとして埋め込み(embed)ます。
ウィンドウは[emb exp="kag.scWidth"]×[emb exp="kag.scHeight"]です。[r] 変数名でなく、やや複雑な式でも可能 => [emb exp="getNumber() + 123"]
if タグ / elsif タグ / ignore タグ
これらのタグは、条件式をもとに分岐を行います。exp 属性の値をTJS式として評価した結果、真偽値にしたがって分岐されます。最終的な結果をもとに分岐されるため、ここで代入式を挿入することもできます。
; getNumber() はランダムな数を返す関数 ; tf.foo に数を代入するとともに、値で分岐 [if exp="(tf.foo = getNumber()) >= 0"] [emb exp="tf.foo"]は正数でした。 [endif]
cond 属性
macro, endmacro, if, else, elsif, endif, ignore, endignore, iscript, endscript 以外の各タグ、すなわちほとんどのタグには cond 属性が存在します。
cond 属性の値をTJS式として評価した結果、偽であったらそのタグは実行されません。このように、各タグごとに条件(condition)を付加することができます。
[jump target="*bonustrack" cond="sf.allclear"] [jump target="*title"] [s]
エンティティ
上記のような属性以外のところでも、TJS式として実行させたいことが多々あります。
属性値の最初に & をつけることでTJS式として評価し、その結果を値として採用する方法です。
[locate x="&f.margin" y="&f.margin + f.lineheight * 0"] 1行目 [locate x="&f.margin" y="&f.margin + f.lineheight * 1"] 2行目
& の記号はあくまでも属性値の頭につける記号であり、TJSの変数の前につける記号ではないことに注意してください。
また、エンティティはKAGのタグの機能ですから、TJSファイル(*.tjs)や iscript ブロック内では利用できません。たまにごっちゃになっている人がいるようです。

