空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

吉里吉里/KAG:変数と条件式を使ったシナリオ分岐  

2013-04-13[Sat]
cm0
tb0

吉里吉里/KAGちょいネタシリーズ初心者向け。

特定の条件に応じてシナリオを分岐させるにはどうすればいいか

条件式の基本的な使いかたを覚えたい人向けの内容です。
難しいことは何一つやっていません。

これさえ覚えておけばマルチエンディングのゲームも余裕で作れます。
シナリオは頑張って書いてください(´ε`)b< 私は書けません!



たとえば次のような会話が繰り広げられたとします。

探偵っぽい人
「皆さん、どこに殺人者が潜んでいるか分かりません。
 朝が来るまで応接間に待機していてください」


ヤサ・グレオ
「はっ、バカバカしい!
 シロートタンテーの言うことなんざ聞いてられっかよ。
 俺は自分の部屋に戻らせてもらうぜ」
←死亡フラグ

探偵っぽい人
「そ、そんなお決まりのセリフを言うなんて……。
 殺してくれと言っているようなものですよ!」

次の被害者は100%ヤサ・グレオです(´・ω・`)< なんという三文芝居
では、この会話をスクリプトに直していくことにします。



選択肢によるシナリオ分岐


「お決まりのセリフ」を変数「f.死亡フラグ発言」とします。
発言したなら1を代入、発言していなければ void(何も入っていない)のままです。
グレオが発言したか否かによってシナリオを分岐させます。

*選択肢
; ヤサ・グレオによる選択
探偵っぽい人に何て言う?[ r ][ r ]
[ link target=*チェック ]
彼の言葉に従う[ endlink ][ r ]
[ link target=*チェック exp="f.死亡フラグ発言=1" ]
彼の言葉に逆らう[ endlink ]
[ s ]


*チェック
; お決まりのセリフを言っていたら次の被害者決定
[ if exp="f.死亡フラグ発言==1" ]
[ jump target=*次の被害者決定 ]


; 言ってなければ回避
[ else ]
[ jump target=*死亡フラグ回避 ]
[ endif ]

※以下略

このくらい単純な分岐であれば変数を使う必要はありません。
target の値をそれぞれのシナリオに指定すればOKです。

でも、これじゃあんまり面白くないよなぁと。
行動の積み重ねでシナリオが分岐する方が楽しいなぁと。

ということで条件を少し複雑にしてみます。



シナリオ分岐の条件が複数ある場合


先の条件に《探偵との友情度》による分岐を付け加えてみました。
死亡フラグ発言の有無と、探偵との友情度によって4つのシナリオに分岐します。

分岐その1
 死亡フラグ発言をしていて探偵との友情度が80以上あれば
 すんでのところで探偵っぽい人が助けに来てくれる

分岐その2
 死亡フラグ発言をしていて探偵との友情度が50未満(49以下)なら
 探偵っぽい人が「真の殺人者」となって追いかけてくる

分岐その3
 死亡フラグ発言をしていて探偵っぽい人との友情度が50以上79以下なら
 次の被害者になってしまう

分岐その4
 死亡フラグ発言をしていなければ友情度に拘わらず死亡回避

では、これをスクリプトに直していきます。探偵との友情度は変数「f.友情度」です。

*選択肢
[ cm ]
; お決まりのセリフを選ぶと f.死亡フラグ発言に1が代入される
[ link target=*シナリオ分岐 exp="f.死亡フラグ発言=1" ]俺はこの部屋を出るぜ![ endlink ][ r ]
[ link target=*シナリオ分岐 ]
探偵の言うことをきくぜ![ endlnk ]
[ s ]


*シナリオ分岐
[ cm ]

; 死亡フラグ発言をしていなければ回避シナリオへ
[ if exp="f.死亡フラグ発言!=1" ]
[ jump target=*回避シナリオ ]


; 死亡フラグ発言した+友情度80以上なら救出シナリオへ
[ elsif exp="f.友情度>=80" ]
[ jump target=*救出シナリオ ]


; 死亡フラグ発言した+友情度50未満なら探偵殺人者シナリオへ
[ elsif exp="f.友情度< 50" ]
[ jump target=*探偵殺人者シナリオ ]


; 死亡フラグ発言した+友情度50以上79以下なら次の被害者シナリオへ
[ else ]
[ jump target=*次の被害者シナリオ ]

[ endif ]


ひとつずつ説明していきます。

1つ目の条件式:死亡フラグ発言をしたか? → していない(真)/した(偽)

これが《偽》であれば、必然的にf.死亡フラグ発言=1 となるので
2つ目以降の条件式に死亡フラグ発言の有無をつける必要がなくなります。
[ elsif exp="f.友情度 < 50 && f.死亡フラグ発言==1" ]
なんて書かなくていいです。無駄なスクリプトは極力省きましょう。

2つ目の条件式:友情度は80以上か? → 80以上(真)/79以下(偽)
3つ目の条件式:友情度は50未満か? → 49以下(真)/50以上(偽)

[ elsif ]は「前の条件式が《偽》で、なおかつ条件式を満たしているときに実行する」条件式です。

2つ目の条件式が《偽》⇒「死亡フラグ発言した+友情度が79以下」が《真》
3つ目の条件式が《偽》⇒「死亡フラグ発言した+友情度が50以上79以下」が《真》

つまり、条件式が4つ目まできた時点で分岐その3の条件を満たしているので
4つ目の条件式は [else](それまでの条件式が《偽》のときに実行)と書くだけで充分です。

なるべく簡単な書き方で済む順番を考えるクセをつけておきましょう。
そうすれば、もっと複雑な条件分岐も余裕で作ることができます。

また、探偵との友情度を隠しパラメータとしてプレイヤーに見せないようにすれば
同じ選択肢なのに違うシナリオに分岐する」といった謎と面白さが出てきます。

しかし、それだと不親切なシステムになってしまうので友情度に応じてセリフや表情が変化するなどのヒントを提示するといいかもしれません。これも条件式で分岐させればOKです。

*ものすごく適当な例
[ link target=*同意した exp="f.友情度 += 10" ]同意する[ endlink ][ r ]
[ link target=*否定した exp="f.友情度 -= 10" ]
否定する[ endlink ][ s ]

*同意した
[ if exp="f.友情度 < 50" ]
[ image storage=探偵不機嫌 layer=0 visible=true ]

【探偵っぽい人】[ r ]
「ふうん……珍しいこともあるもんだね」
[ else ]
[ image storage=探偵笑顔 layer=0 visible=true ]

【探偵っぽい人】[ r ]
「うんうん、君とは気が合いそうだね」
[ endif ]
[ p ]


※否定した場合のシナリオも大体同じなので省略

セリフを二通り考えるのが面倒だと思うけど、そこは頑張れ。

余談ですが、昔のADVゲームにコマンド総当りタイプが多かったのは
限られたプログラム容量でなるべく長時間遊んでもらうための工夫でした。
そのため、なかなかクリアできないゲームもあったかと思います。

現在は容量を気にすることなく詰め込みたいだけ詰め込められますが
その分、やり込みたいと思わせる要素がなければ途中で飽きられますし
ヒントが少なすぎるゲームは「自己満足ゲー」として批判されることもあります。
難易度のバランスを取るのって難しいよね(´ω`)



他のジャンルで考えてみよう


突然ですが問題です。次の場合、どのような変数と条件式が必要か考えてみましょう。

・一度クリアすると別のシナリオが追加される
・証拠品が3つ揃っていれば通行人Aがタレコミにくる
・全ての攻略対象をクリアしないと専用ルートに入れないキャラがいる
・勇者が民家を漁って薬草を盗んでいたら逮捕されるイベントが発生する
・回復アイテムを1つも持っていないときは【回復】ボタンが押せない
・戦闘でダメージを受けたときに体力が0以下にならないよう処理する
・店で所持金が足りない場合『おととい来やがれクズ』と店員に言わせる
・ビームを発射したとき射程範囲内に敵がいればダメージを与える

「あれ、これって全部同じじゃね?」と思った人は天才。
どんなゲームも《真》《偽》で判断しているだけです。
極論ですが、条件式を理解しておけば大抵のことはできます(*´∀`)b

ということで、今回はこれにて終了。


関連記事

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://kopacurve.blog33.fc2.com/tb.php/288-ef5875ef
この記事にトラックバックする(FC2ブログユーザー)

現在のページ

Category

Link

Comment

Mailform

Author

Twitter