この章も未完に終わっていますので、わかる範囲で加筆しておきます。
ケースとスイッチ
あなたが勝つためにユニットを座標14,30に動かすことによって、プレイヤーが花を選ぶ必要があるシナリオがあるとします。 しかしそれですべてではありません、10ターン終了後から20ターンの間にのみ花を拾うことができます(したがって、花はターン11から20の間でのみ拾うことができます)。 プレイヤーが11ターンの前に花を選んだ場合、ゲームは花がまだ開花しておらず、もう少し待つ必要があることを伝えます。 プレイヤーが20ターン後に花を選んだ場合、ゲームには、あまりにも長く待っていたことを伝えるメッセージが表示され、今度は花が枯れています。 WMLでこれを実装するにはどうしたらいいでしょう?
さて、あなたは次のように書くことができます。
[event] name=moveto first_time_only=no [filter] side=1 [/filter] [if] [variable] name=turn_number less_than_equal_to=10 [/variable] [then] [message] speaker=narrator message= _ "The flower hasn't bloomed yet. Try coming back later." [/message] [/then] [/if]
[if] [variable] name=turn_number greater_than=20 [/variable] [then] [message] speaker=narrator message= _ "You waited too long: the flower is dead now." [/message] [/then] [/if]
[if] [variable] name=turn_number greater_than=10 [/variable] [and] [variable] name=turn_count less_than_equal_to=20 [/variable] [/and] [then] [message] speaker=narrator message= _ "You pick the flower." [/message] [/then] [/if] [/event]
これは非常に時間がかかり、書いて保守するのが面倒です。 条件ごとに[if]コードブロック全体を作成しなくても、複数の条件をテストする簡単な方法があるならすばらしいと思うでしょう?
実は、[if]コードブロックの泥沼を歩かずに、複数の条件をテストする簡単な方法があります。 これは、複数の条件の変数の値をテストし、その評価の結果として実行されるアクションを決定するswitch / caseコードブロックを介して行われます。 switch / caseコードブロックのシンタックスは次のようになります。
[switch] variable=variable_name [case] value=first_value #do something [/case] [case] value=second_value #do something [/case] [case] value=third_value #do something [/case] [else] #do something [/else] [/switch]
このコードはかなり単純に見えます。先程の[if]コードブロックをこれに置き換えてみましょう。変数turn_numberはシナリオが始まると自動的に作成される変数で値にはその時のターン数が入っています。
というわけで、単純に書くとこうなります。
[switch] variable=turn_number [case] value=1,2,3,4,5,6,7,8,9,10 [message] speaker=narrator message= _ "The flower hasn't bloomed yet. Try coming back later." [/message] [/case] [case] value=11,12,13,14,15,16,17,18,19,20 [message] speaker=narrator message= _ "You pick the flower." [/message] [/case] [else] [message] speaker=narrator message= _ "You waited too long: the flower is dead now." [/message] [/else] [/switch]
うん、コードの構造は実に単純になりました。ここで注目、caseのvalueキーにはコンマ区切りを使って複数の値を指定することが出来ます。このおかげでcaseを1ターンごとに用意する必要が無くなるわけです。
選択肢が多い場合は[switch]を使うのが便利という、お話でした。
ループ
私は非常に大雑把な子供だった。母親の苦しみの大部分は清潔さであり彼女の人生のために、どうやってそんな幼児の私を育てることができたのか分からなかった。時には彼女は自分の部屋だった混乱の地に挑戦するのに十分な勇気を取り戻すことがありました。そして彼女は私の部屋が片付くまで私の部屋を離れないようにと言いました。
親密な家族の類推を除いて、私の母が私の部屋をきれいにするように言ったことに注意を払う、私はそれがきれいになるまで私の部屋を去ることはなかった。部屋がきれいだったかどうかは、私の部屋を出る許可が出される条件でした。だから、私は何かを置くたびに(ベッドの下に物を詰め込んで)、私はその条件が満たされているかどうかチェックしなければならないでしょう。部屋がきれいでない場合、私の母の要求は満たされず、私は清掃を続けなければならなかった。部屋がきれいだったら、私の母親の条件が満たされ、私は自由に部屋を出ることが出来ました。
このストレスフルな子供の状況をWML的に表現すると、このようになります。
[while] (母親が部屋をチェックし掃除を続けさせるかを判断する、ゴミがある間は[do]を実行させる) [do] (子供は嫌々ながら部屋のゴミを減らし、その後に母親のチェックを受ける) [/do] [/while] (母親の厳しいチェックをクリアしお掃除地獄から解放される)
うーむ、なんと言う憂鬱なループ! ここに出てきた[while]は、ある条件が満たされている間は[do]で指定された動作を繰り返すというタグです。
この場合、部屋にゴミが存在する限り子供はお掃除を続けなければならないわけです。では、もうちょっと手を加えてWMLコードを動くものにしてみましょう。
[set_variable] name=trash value=20 [/set_variable] [while] [variable] name=trash not_equals=0 [/variable] [do] [message] speaker=Kid message= _ "Okay Mom!! I will start cleaning." [/message] [set_variable] name=trash add=-1 [/set_variable] [/do] [/while] [message] speaker=Kid message= _ "I'm free! free! freeeeeeeee!!! Yes! Yes!" [/message]
trashという変数に20が値として入っています。まあ、ガラクタが20個部屋の中に散らばっている訳ですね。で、これが「not_equals=0」の間は掃除を続けると。
一度に一つしかゴミを片付けないのも如何なものかと思いますが、とにかく彼は20回の掃除を強要された後、めでたく釈放される訳です。
I'm freeeeeeeee!!!