入れ替えて表示してみましょう
$ σ_σ$ < 今回は結構地味かもしれないけど役立つわよ。 Σc ' _' ) < そもそも、iF自体が地味だけどな。
デバッグとか
数値を入れる変数が出てきて、かなり複雑なシナリオも書けるようになってきました。
複雑なシナリオを書くと発生するのがバグです。
今回は、バグ退治の方法を絡めて、メッセージの一部を書き換える方法を解説します。
<?xml version="1.0" encoding="UTF-8"?> <textio><act> <i id="主人公">俺</i> <var id="counter">+1</var> <select> <option verb="ミル;"> <option noun="ヘヤ;アタリ;マワリ;" atto=""><p item="ピストル"> 特になにもない。<else/> ピストルが落ちている。</p></option> <option noun="ピストル"><p> 鈍色に光る危険な代物だ。</p></option> </option> <option verb="ウツ"> <p> <i id="主人公"/>は<i item="ピストル">拳銃<else/>拳</i>で <i item="ピストル">撃った<else/>打った</i>。</p> </option> <option verb="ヒロウ;ヒロイアゲル;トル;トリアゲル" item="!ピストル"><option noun="ピストル"> <p> ピストルを拾った。</p><item id="ピストル"/> </option></option> <option verb="ステル" item="ピストル"><option noun="ピストル"> <p> ピストルを捨てた。</p><item id="ピストル">false</item> </option></option> </select> <!-- デバッグ用出力 --> <p>counter :<var id="counter"/><![CDATA[ ]]>ピストル :<item id="ピストル"/></p> </act></textio>
各要素の説明
i要素
<i id="主人公">俺</i>
i要素が登場しました、久しぶりに新要素です。
var要素は真偽値と数値を設定できましたが、i要素は真偽値と文字列を設定できます。
var要素と同様にフラグとしても使えますが、i要素はp要素の中で、メッセージの一部だけ表示を変えたい場合に使うと便利な要素です。
最初に設定したid="主人公"の内容が、以下で使われています。
<p> <i id="主人公"/>は<i item="ピストル">拳銃<else/>拳</i>で <i item="ピストル">撃った<else/>打った</i>。</p>
また、id属性なしの状態でp要素の中で使い、条件によって表示を変えることもできます。
i要素に限りませんが、p要素の中の要素の前後の空白文字(半角スペース・改行・タブ)は無視されます。
ここでは、二行目の行頭にi要素があるので、前にあるタブと改行が無視され1行のメッセージとして出力されます。
この仕様は、既に<else/>
で体験済かもしれませんが、改行などでシナリオを読みやすくできて便利です。
$ σ_σ$ < 条件が入ったりすると、一行が長くなりすぎるから、適当に改行入れないとね。 Σc ' _' ) < この仕様、若干余計なお世話な気もする…。
コメント
<!-- デバッグ用出力 -->
XMLでは、<!--
と-->
で括った部分は処理上は存在しないものと判断されます。
記述が長くなってくると、それぞれどのような意図があるのかコメントを書いておかないと、理解できなくなってきます。
そこで、このようなコメント文を書くための仕様が存在しているのです。
XMLの仕様なので、詳細はXMLの仕様Extensible Markup Language (XML) 1.0 (Fourth Edition)にあります。
と言っても、さほど注意する部分もないかと思います。
詳しく知りたい場合は、XMLを解説しているサイトは沢山あるので、探して勉強してみるのもいいでしょう。
テクスティオのシナリオは、そもそも沢山の文章が書かれるので、かなり読みやすく、何をやっているか分かりやすいので、そう沢山のコメントは必要ありません。
actの前に舞台設定やそこをクリアするための条件などを書いておく、といった使い方をすると良いでしょう。
var要素、item要素
<p>counter :<var id="counter"/><![CDATA[ ]]>ピストル :<item id="ピストル"/></p>
実はi要素の他にvar要素やitem要素もp要素の中に置けます。
置けるのはid要素付きの空要素のみで、機能としてはid属性で指定した内容がメッセージに出力されます。
varがフラグの場合はその確認も<p var="f">立ってる<else/>倒れてる</p>
みたいに書けば良かったのですが、数値となると確認も大変です。
そこで、この書式が役に立つというわけです。
itemの場合は、inventory要素を使った方がまとめて出力されて便利なので、そんなに必要でもないですが、一応ここで紹介しておきます。
CDATAセクション
<p>counter :<var id="counter"/><![CDATA[ ]]>ピストル :<item id="ピストル"/></p>
先ほどから<![CDATA[
とか]]>
ってなんだろうと思っているんじゃないでしょうか。
この記号で囲まれた部分は改行や&<>"'なども含め、書いたそのままで解釈されるという意味です。
ここでは行末と行頭に置いて、item要素の前後は改行が無視されるという仕様に対処しています。
このCDATAセクションは、コメントと同様にXMLに共通の書式で、詳細はExtensible Markup Language (XML) 1.0 (Fourth Edition)にあります。
とはいえ、これもそんなに注意することもないかと思います。
$ σ_σ$ < 格好わるいわ…。 Σc ' _' ) < ごちゃごちゃしてるよな。
<p>counter :<var id="counter"/> ピストル :<item id="ピストル"/></p>
要素の前後の空白文字が無視されるわけなので、ここでは全角スペースを末尾に置いて、改行を要素の前後ではなくしています。
特に、p要素の頭に改行を入れたい場合に使うと便利です。
$ σ_σ$ < 全角スペース見えないわ。 Σc ' _' ) < 見えねーとわかんねーよ!
あれも駄目、これも駄目、好き勝手言うガキンチョどもですね。
今回の内容を活用することで、シナリオが複雑化しても対応しやすくなったかと思います。
今まで作ったシナリオも、コメントを付けるなどして、整理してみてはどうでしょうか。
まとめ
- i要素を使うとp要素の中に条件を書ける。
- varとitem空要素もp要素の中に書ける。
- 要素の前後は空白文字が無視される。
- コメントを使うと、シナリオの中に説明を書ける。
- CDATAセクションを使うと、文字がそのまま出力できる。
シナリオが大きくなってくると、あちこちに同じ記述が現れて、無駄だと感じてくると思います。
次回は、同じ要素をあちこちから呼び出して使う方法を解説します。