入れ替えて表示してみましょう

 $ σ_σ$  < 今回は結構地味かもしれないけど役立つわよ。
 Σ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セクションを使うと、文字がそのまま出力できる。

 シナリオが大きくなってくると、あちこちに同じ記述が現れて、無駄だと感じてくると思います。
 次回は、同じ要素をあちこちから呼び出して使う方法を解説します。