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 ブロック内では利用できません。たまにごっちゃになっている人がいるようです。

 
tjs/execute.txt · 最終更新: 2008/09/15 05:27 by tohka