cond属性とは? すべてのタグにあるのに目立たない属性【ティラノスクリプト】

ティラノスクリプト

この記事を見ている人で、cond属性を使ったことのある人は少ないと思います。(記事タイトル的に)

cond属性を使うと、ときにはif文を使うよりも簡単に分岐ができるようになります。
[iscript]を使うより[eval]を使ったほうが短くなるのと同じようなイメージです。

cond属性は便利であるはずの機能ですが、ティラノスクリプトのチュートリアルではおろか、実践テクニックでも紹介されていません。
(テクニックサンプルでは使われています)

ネット上にある記事では、ティラノスクリプト非公式wikiくらいでしか解説を取り扱っていませんでした。
参考 基礎制御構文関係

スポンサーリンク

cond属性とは

すべてのタグにcond属性があります。JS式を記述して、その結果が真の場合のみタグが実行されます

タグリファレンスの「基本」より引用

「結果が真のときの場合のみタグが実行されます。」

プログラミングに慣れている人ならこの一言で理解できると思うのですが、一般的に「結果が真のとき」なんて言われてもピンとこないはずです。

ここでいう真とは、プログラミングにおける「真偽値(しんぎち)」のことを指します。

たとえばタグリファレンスの[if][else][elsif][endif]のサンプルコードを見てみると、以下のようなコードが記載されています。

; 例1
[if exp="false"]
ここは表示されない
[else]
ここは表示される
[endif]

; 例2
[if exp="false"]
ここは表示されない
[elsif exp="false"]
ここは表示されない
[else]
ここは表示される
[endif]

; 例3
[if exp="false"]
ここは表示されない
[elsif exp="true"]
ここは表示される
[else]
ここは表示されない
[endif]

; 例4
[if exp="true"]
ここは表示される
[elsif exp="true"]
ここは表示されない
[else]
ここは表示されない
[endif]

このtrue(トゥルー)とfalse(フォルス)が真偽値です。
真偽値には真と偽の値しか存在せず、真の値といったらtrueのことを指し、偽の値といったらfalseのことを指します。

「visible=”true”」みたいな形でティラノスクリプトのパラメータにもよく出てきますね。

上記if文の例で表示されたりされなかったりする理由は、if文でその値がtrueかfalseかが評価されているためです。

※式の評価については後述します。

(上記サンプルコードはtrueとfalseでの分岐しかしていないため正直非常にわかりづらく不親切だと思うのですが、今回はcond属性の解説のためif文の説明は割愛します)

真偽値は2つしかないため、よく電気などのスイッチに例えられます。
スイッチにがONの状態がtrue、スイッチがOFFの状態がfalseといった感じです。

式の評価でtrueとfalseを受け取る

突然ですが、この計算式を見てあなたはどう感じるでしょうか。
プログラミングにおける「等しい」は「=」ではなく「==」なので、便宜上「==」で表記しています。

1 + 1 == 5

1たす1は5。
非常に不思議な式です。明らかに間違っています。

この間違っている」という感覚こそが式の評価での「false」です。

では次。

1 + 9 == 10

1たす9は10。
今回の式は合っています。なので式の評価での「true」です。

人間は式を計算するとき、1+1がいくつになるのかを計算します。
しかしプログラムはすべての式の答えを知っているも同然なので、人間のような式の計算は普通しません。

プログラムが式に対しておこなうのはその式が合っているかのみです。
いわば答え合わせをしてくれる存在です。この答え合わせこそが「式の評価」ということになります。
その答えがあっていればtrueを結果として返してくれますし、間違っていればfalseを返してくれます。

cond属性を実際に使う

cond属性は以下のように使用します。

根底を理解する

;1つ目のjumpタグ
[jump storage="scene1.ks" cond="1 + 1 == 5"]
;2つ目のjumpタグ
[jump storage="scene2.ks" cond="1 + 9 == 10"]

上記の例では、1つ目のjumpタグの評価結果はfalseで、2つ目の式の評価結果はtrueです。
ここで基本に立ち返ります。

すべてのタグにcond属性があります。JS式を記述して、その結果が真の場合のみタグが実行されます

とのことなので、cond属性の評価結果が偽(false)である1つ目のタグは実行されず、結果が真(true)である2つ目のタグが実行されます。

つまり今回のようにjumpタグが2つ書かれていても、実際に実行されるのは一つだけということです。
(今回の場合、scene2.ksにジャンプします)

cond属性を使った実践

1+1が5になることは天地がひっくり返ってもありえませんし、1+9が10であることは覆しようのない事実です。
よって上記のようなcond属性の使い方では、全く役に立ちません。

cond属性を扱う手段として、以下の3つが挙げられます。

実践その1 変数をcond属性の中に書く
[chara_show name="akane" ]
#あかね
ねえ、1+1っていくつだっけ?[p]

[glink text="2に決まってるだろ。" target="common" x="300" y="200" exp="f.boolean = true"]
[glink text="実はこれ5なんだよ。" target="common" x="300" y="300" exp="f.boolean = false"]
[s]

*common
;とくに変化なく進行していくが、f.booleanには選択肢によって異なる値が入る

#あかね
[chara_mod name="akane" face="happy" cond="f.boolean" ]
教えてくれてありがとう。[p]



これで「2に決まってるだろ。」と答えた場合はf.booleanにtrueが代入され、あかねの表情が変更されるタグが実行されます。
しかし「実はこれ5なんだよ。」と答えた場合はf.booleanにfalseが代入されるため、あかねの表情を変更するタグが実行されずにシナリオが進行します。
(あまりわかりやすい例が浮かびませんでした。すみません)

実践その2 比較式をcond属性の中に書く

[eval exp="f.koukando = 1"]

[chara_show name="akane" ]
#あかね
あれ? まだ教室に残ってるなんて意外。[p]

[glink text="逃げだす" storage="nige.ks" x="300" y="100"]
[glink text="何気ない会話をする" storage="kaiwa.ks" x="300" y="200" cond="f.koukando >= 1"]
[glink text="デートに誘う" storage="date.ks" x="300" y="300" cond="f.koukando >= 20"]
[glink text="告白する" storage="koku.ks" x="300" y="400" cond="f.koukando >= 50"]
[s]

上は「一定の好感度に達していないと選択肢を表示しない」というスクリプトです。

今回の場合は1が代入してあるため、上二つの選択肢が表示されます。

好感度がまったく溜まっていない場合は、選択肢が出るにもかかわらず逃げ出すことしかできないという悲惨な状況に陥ります。これはこれで面白いですよね。

軽い解説
f.koukando に30が代入されている状態の場合
f.koukando > 50 はプログラムには 30 > 50とみなされます。
30 > 50を日本語であらわすと「30は50より大きい」という意味になるので、当然ながら真偽値はfalseです。
実践その3 一度しか実行しないタグに使う
;「!f.ep1」は「f.ep1が○○ではない」という意味です。真偽値は頭にビックリマークをつけると否定になります。
[ptext text="エピソードその2が開放されました。" layer="0" x="300" y="200" cond="!f.ep1"]
[eval exp="f.ep1 = true"]

何度も同じエピソードを周回できるようなゲームの場合、かつ閲覧を条件として次のエピソードが開放されるシステムの場合に使う手法です。

cond属性を使わないとエピソードその1を閲覧するたびに毎回「エピソードその2が開放されました。」と表示されてしまいますが、cond属性を利用することでそれを回避しています。

ちなみにf.ep1にははじめは何も入っていません。undefined(未定義という意味)という特別な値が入っています。
ティラノスクリプト(javascript)ではundefinedはfalseとみなされるため、このような使い方ができます。

コメント