ティラノスクリプトと私②変数を便利に使う時に知っておきたいこと・基礎編
※ノベルゲーム特化型ゲームエンジン「ティラノスクリプト」でそこそこ本格的なゲームを作るため、Javascriptなどの面倒くさいことを(嫌々)試行錯誤するおっさんの備忘録です。(※ティラノスクリプトVer 507bで動作確認)
変数の種類
ティラノスクリプトには以下の3種類の変数があります。
①ゲーム全体の進行度を管理する「システム変数(sf.)」
②セーブデータに保存される「ゲーム変数(f.)」
③その場で使い捨て&使い回しも可能な「一次変数(tf.)」
ティラノスクリプトの簡易制御ツール・ティラノビルダーからティラノスクリプトに移行した当初は「システム変数ってどうやって定義(初期設定)したらいいんだ!?」と非常に悩みましたが、ティラノビルダー制作テクニックWikiに「まだ何も準備していない変数には未定義を意味する”undefined”というパラメータが割り当てられている」と書かれ、その上で初期設定のしかたも書かれていたため事なきを得ました。具体的にはこんな感じで記述。
@if exp="sf.任意の変数名 == undefined"
@eval exp="sf.任意の変数名 = 0"
@endif
「もし存在していなかったら存在せよ!」って、神話かよ…。ティラノビルダーではこのあたり、他の変数と同じフォームで設定できたのですが、裏ではこういう処理をしていたんですね。
エンティティについて
これら変数にはいくつかのタイプ(型?)のパラメータを格納できます。数値、文字列、true/false(真/偽)、そして先ほどのundefined…などJavascriptで扱えるものは何でもいけるみたいです。
ティラノスクリプトで規模の大きめな作品を作るとなった場合、数値タイプと文字列タイプの変数をフレキシブルに活用することで、管理やプログラム内の処理がシンプルになります。
その際役に立ちそうなのが「エンティティ機能」。ティラノスクリプト公式サイトではこのように説明されていますが…
なるほど~。
って本当は全然わからないので、関連がありそうな内容のブログ記事を片っ端から調べ、「こういう処理をさせたい時は何も考えずこのように書け」というサンプルスクリプトをいくつか作成しました。えーと「&」はここに書いていいんだっけ…といちいち悩むのはもう御免です!
【用法①】配列変数に格納しているパラメータをセリフとして表示
たとえばf.serihuを、文字列を格納する配列変数としてこんな風に定義。
@iscript
f.serihu = ['おはよう','こんにちは','こんばんは']
@endscript
そして0か1か2を格納する変数tf.zikanで配列変数内の位置を指定しつつ…
ケース1:文字列をそのまま表示する場合
[ emb exp = "f.serihu[tf.zikan]" ][p]
パラメータ内の一部分として記述するはエンティティをしなくて平気です。何を当たり前なことを…と思われるかもしれませんが当たり前じゃない人もいるんです。
なおexpパラメータは両端の「"」を省略したらどのタグでも正常に動きません。
ケース2:共通文に単語として入れ込む場合
[emb exp = "'キミはいま、' + f.serihu[tf.zikan] + 'と言ったね。'" ][p]
変数以外のテキストは、分割されたパーツごとに「’」で囲みます。そして各要素を「+」で連結。「'」と「"」を間違いなく打てるかどうかが勝負?です。
ケース3:変数の中身が数値型の場合
@eval exp = "f.neta = f.suuzi[2] - f.suuzi[0]"
[ emb exp = "'キミは' + f.suuzi[0] + '時から' + f.suuzi[2] + '時までの、合計' + f.neta + '時間寝ていたのか!'" ][p]
f.serihuのかわりに f.suuzi = [7,12,19]という数値型の変数だったとしても、同様に表示できます。このへんがとても不思議な感じです。ともかく「数値の表示は半角」と「[emb]タグ内では数値の計算&その計算結果としての数値の表示はできない(あらかじめ計算結果格納用の変数を用意し、それを表示させる方法で対処)」だけは忘れません。
ちなみに各ケース末尾の「[p]」は改ページクリック待ちのタグ。こういうメッセージ表示の制御系タグをあらかじめ文字列の中に入れておけば便利じゃないの?と思い試してみたのですが…
だめでした![p]
もしもセリフとして使用する文字列データの中にあるタグ表記を自動的に判別して、表示時に実行してくれるプラグインがあったら最高ですね!
【用法②】文字列型or数値型が格納されている変数をファイル名やラベル名の一部として使用
たとえばこんな背景画像データがあって。
bg_gakkou_01.png ※朝の学校
bg_gakkou_02.png ※昼の学校
bg_gakkou_03.png ※夜の学校
物語上のシーンの時間帯によって、これらを使いわけたいとします。まあ、必要な時に必要なファイル名を([bg]タグのStorageパラメータに)ちゃんと書けばいいのですが、長いくせに違うのが1文字だけってのが癪に障ります。そこで「朝は1・昼は2・夜は3」を表す変数f.zikokuを作っておき、うまいことファイル名の数字部分に対応させてスクリプト表記&管理をラクにします。
@eval exp="f.gakkou = '*bg_gakkou_0'+ f.zikoku + '.png' "
@bg storage = &f.gakkou
文字が変わる部分にf.zikokuを当てはめた新たな変数f.gakkouを一度定義しておけば(1行目)、学校の背景画像はすべてこの表記(2行目)でまかなえます。
もちろん、シナリオ内の時間帯の変わり目ごとにf.zikokuの数値を代入し直す必要はあります。それはそれで面倒くさかったりもしますが、時間帯のバリエーションが同じようにある他の背景画像にも同様に適応できると考えれば、そんなに悪くない手間です。
ここで使う変数の中身は数値型である必要はありません。ただ数値型にしておくと、シーンの移動やら配列変数やらを数式で管理・制御できたりと何かと応用がききます。
なお、
タグの各パラメータを変数で直接設定する時には、必ずエンティティします。
文字列型だろうが数値型だろうが、します。
大事なことなのでクドめに書いておきました。
参考サイト
ティラノスクリプトの変数の仕組みを理解するのにお世話になったサイトです。いまでも理解できているかだいぶ怪しいですが…。
この記事が気に入ったらサポートをしてみませんか?