今回は吉里吉里Z/KAGで
ノベルゲーム・恋愛ゲームを作る時に
キャラの好感度によって
ストーリー・エンディングを
分岐させるのはどうしたらいいまん?
俗に言う
「フラグ立った!折れた!」
ってどうやるの?
という疑問にお答えしたいと思います!
こちらは選択肢の「応用編」になりますので
前回の「基礎編」を見ていらっしゃない方は
先にこちらを読んでみてくださいね(^^)
キャラの好感度によってシナリオ・エンディングを分岐
キャラの好感度を設定する
まずキャラの好感度を設定します。
今回も前回登場頂いた
銀髪男子シグマくんに登場して頂きます。
まず最初は、
好感度が「0」の状態から始めたいので
「0」を代入しておきます。
コードで書くと下記の通りです。
;シグマの好感度を設定 [eval exp="f.sigma_love = 0"]
上記をシナリオファイル(1.ksなど)冒頭に
定義しておきましょう。
補足ですが、
変数の頭についている
「f」は「ゲーム変数」であることを指しています。
KAGでは3種類の変数があります。
<KAGの変数の種類>
①環境変数:セーブデータ関係なしに値を保持できる
②ゲーム変数:セーブデータごとに値を保持できる
③一時変数:一時的に値を保持できる
キャラの好感度は
セーブデータごとに別々で管理するのが一般的なので
「ゲーム変数」となるわけです。
セーブデータごとに管理?
どう使い分けるかイメージつかないまん
という方は
後日それぞれの変数について解説予定ですので
一旦ここでは
「キャラ好感度はゲーム変数という変数を使うんだ」
とだけ覚えておいて頂けたらと思います。
選んだ選択肢で好感度をアップ・ダウンさせる
次に、どの選択肢を選んだかで
キャラの好感度を変化させていきます。
例えば
のような選択肢があったとして
「公園に行く」を選択 → 好感度アップ
「家に帰る」を選択 → 好感度変化なし
としたいとします。
コードは下記の通りになります。
どこへ行く?
[blink text="公園" graphic="buttonlink_bg" left=120 top=189 target=*park exp="f.sigma_love = f.sigma_love +1"]
[blink text="家に帰る" graphic="buttonlink_bg" left=120 top=276 target=*home]
[s]
基礎編との違いは、
blinkタグに
exp="f.sigma_love = f.sigma_love+1"
を追加している点です。
ここで好感度を「1」足すことで
好感度をアップさせています。
もし好感度をダウンさせたい場合は
exp="f.sigma_love = f.sigma_love-1"
のように引き算にすればOKです(^^)
その後の選択肢も同じような感じで
blinkタグ内に「exp = “~~”」を指定してあげることで
好感度をアップ、ダウンが可能です!
念の為、コンソールを立ち上げて
値が変化したか確認してみましょう。
「Krkr2Compat」が設定済みの方は
Shift+F4でコンソールを立ち上げてみましょう。
※設定をしていない方は、一旦こちらの手順はスキップしてください
選択肢を選ぶ前に
好感度がいくつになっているか確認します。
この段階ではまだ好感度が初期値0のはずなので
「0」が表示されればよいわけですね!
コンソールの入力欄に
f.sigma_love
と入力してみましょう。
↑見にくいですが、ちゃんと「0」と表示されています
次に選択肢を選んだ後に
好感度が想定通り変化したか確認してみます。
好感度がアップする
「公園へ行く」を選択してから
またコンソール上で好感度の値を確かめてみます。
↑今度は好感度が「1」となっています。
これにて好感度のアップダウンも
問題なく行えていることが確認できました。
吉里吉里2と同じように、
吉里吉里を立ち上げながらコンソールも表示できて便利です。
設定していない方はこちらで解説していますので
併せて確認してみてくださいね。
選択肢に分岐命令を入れる
最後にキャラの好感度によって
ストーリーやエンディングを分岐させるための
命令文を入れてみましょう。
今回は
・好感度5以上→イベントシナリオ1へ飛ぶ
・好感度5未満→共通シナリオへ飛ぶ
としてみます。
つまり今回は
①条件判定を行い = (ifタグ)
②その結果によって飛ぶシナリオを変える (jumpタグ)
以上、2つの操作が必要になります。
コードで書くと
;もし好感度が5以上だったら、イベントシナリオ1へ飛ぶ [if exp="f.sigma_love >= 5"] [jump target=*イベントシナリオ1] ;上記以外(好感度が5未満)だったら、共通シナリオへ飛ぶ [else] [jump target=*共通シナリオ] [endif]
となります。
1行目に出てくる「>=」ってなんだまん?
◯◯以上だったら、という意味だよ。
つまり数学の不等号「≧」のことだね。
条件式で使用できる不等号は
下記の通りです。
■条件式で使用できる不等号一覧
A > B | AがBより大きい |
A < B | AはB未満 |
A <= B | AがB以上 |
A >= B | AはB以下 |
A == B | AはBと等しい |
ちなみに「A > B」の「AはBより大きい」というのは
AはB以上という意味ではないので注意してね。
わかったまん。
ところで最初のifタグでは条件指定しているけど
次のelseタグでは「5未満だったら」っていう条件指定は
いらないのかまん?
うん、elseタグは
「それ以外だったら」という意味なので条件は不要。
そして今回は分岐条件が2つだけなので、
使うのはifとelseの2つだけでOK
もし分岐条件が3つ以上ある場合は
さらに条件判定が必要になるので
その場合はelsifタグを使って条件指定をするよ
例えば、下記のような場合はelsifタグを使います。
・好感度5以上 → イベントシナリオ1へ飛ぶ
・好感度3以上~5未満 → イベントシナリオ2へ飛ぶ
・好感度3未満 → 共通シナリオへ飛ぶ
コード全体だと下記の通りです。
;もし好感度が5以上だったら、イベントシナリオ1へ飛ぶ [if exp="f.sigma_love >= 5"] [jump target=*イベントシナリオ1] ;もし好感度が3以上5未満だったら、イベントシナリオ2へ飛ぶ [elsif exp="f.sigma_love >= 3 && f.sigma_love < 5"] [jump target=*イベントシナリオ2] ;上記2つとも当てはまらない場合(好感度3未満)共通シナリオへ飛ぶ [else] [jump target=*共通シナリオ] [endif]
となります。
条件分岐は、条件指定する箇所でのミスが多い部分なので
どういう条件で、どういう分岐させたいのか
先に紙などにまとめてから、コードを書くとよいかと思います◎
(私は不等号を逆向きに書いちゃったりとかあります… ^^;)
【ちょっと応用】フラグを立てる/折るやり方
次は「フラグ」の立て方を教えてほしいまん
そうだね!
フラグも同じく
フラグ用に変数を作ってあげればOKだよ
ストーリー・エンディングを分岐させる条件で
好感度以外の条件も指定したい時って
ありませんか?
例えば、
あるキャラとのイベントストーリー中に
仮に好感度がMAXでも
この選択肢を選ぶと、その後攻略不可になる(=フラグを折る)
とかしたいこと、ありませんか?笑
画像引用元:イチゴ仁丹様より
↑フラグを折るというと
真っ先に金色のコルダの王崎先輩フラグが折れる
「パリーン」という演出を思い出します 笑
こちらはやり方がざっくり2通りありますので
それぞれ紹介していきます!
やり方1:フラグ用の変数を作る方法
もし
そのキャラとの攻略が不可の場合でも
(=フラグが折れていても)
好感度の値は保持しておきたい!
という場合。
具体的には、
ゲーム内でキャラごとの好感度が
確認できる画面があったとして、
攻略不可になったとしても
好感度の値はそのまま表示しておきたい…
というような時でしょうか。
そのような時は
フラグ用の変数を作ってあげましょう。
コードで書くと、下記。
#シグマ用攻略不可フラグ f.is_sigma_disable=0;
さて、フラグを折る場合は
フラグが折れてしまう選択肢で
f.is_sigma_disable=1;
とフラグを書き換えてあげればOKです。
今回は「家に帰る」を選ぶと
攻略不可フラグを立てるようにしています。
コード全体で書いてみます。
どこへ行く?
[blink text="公園" graphic="buttonlink_bg" left=120 top=189 target=*park exp="f.sigma_love = f.sigma_love +1"]
[blink text="家に帰る" graphic="buttonlink_bg" left=120 top=276 target=*home exp="f.is_sigma_disable=1"] [s]
こうしておくことで
フラグが折れている状態だったら
その後、一切シグマのイベントストーリーを
発生させない(=攻略不可にする)ことができます。
やり方2:好感度の変数のみで対応する方法
もし
「好感度の値を保持しておかなくていい」
ということでしたら、
フラグ用の変数を用意する必要はありません。
例えば、フラグが折れる選択肢を選んだら
好感度の値に
;シグマ攻略不可 [eval exp="f.sigma_love = -9999"]
とありえない数字を入れておいて
シナリオ分岐部分で
;もし攻略不可だったらイベントシナリオ1を起こさず、共通シナリオへ行く [if exp ="f.sigma_love == -9999"] [jump target=*共通シナリオ] [endif] *イベントシナリオ1 イベントシナリオ1です。 *共通シナリオ 共通シナリオです。
としてあげればOKです。
ただ単にフラグを折りたいだけなら
この方がシンプルでよいかと思います。
(コードはなるべく簡潔にした方がミスが減るため)
今回はフラグを折る時を例に解説しましたが、
逆パターンの「フラグを立てる」も
同じやり方で実現することが可能です。
こんな時どうしたらいいの?
ストーリー分岐条件を複数指定したい場合は?
elsifタグの部分で少しさらっと登場しましたが
複数条件指定したい場合は
「&&(AND条件)」や「||(OR条件)」で
つなげればOKです。
例えば、エンディングAにいく条件として
・好感度は10以上
・攻略不可フラグが立っていない
の2つが満たされていないと
「ベストエンドに行けない」としたい場合は
AND条件なので「&&」で指定します。
コードで書くと下記になります。
;好感度10以上で攻略不可フラグが立っていなければベストエンドへ
[if exp ="f.sigma_love => 10 && f.is_sigma_disable == 0"]
[jump target=*ベストエンド]
;上記以外だったらノーマルエンドへ
[else]
[jump target=*ノーマルエンド]
[endif]
*ベストエンド
シグマのベストエンドです。
*ノーマルエンド
ノーマルエンドです。
逆に、
どっちか一つが満たされていれば
「エンディングAに行ける」
としたい場合は
OR条件の「||」で繋げてあげます。
;好感度10以上、または攻略不可フラグが立っていなければベストエンドへ
[if exp ="f.sigma_love => 10 || f.is_sigma_disable == 0"]
[jump target=*ベストエンド]
;上記以外だったらノーマルエンドへ
[else]
[jump target=*ノーマルエンド]
[endif]
*ベストエンド
シグマのベストエンドです。
*ノーマルエンド
ノーマルエンドです。
AND条件やOR条件は
よく出てくる概念なので
覚えておくのがおすすめです。
ストーリー分岐時に同じ好感度のキャラが複数いた場合は?
ここで、初心者の方がミスしやすいかも?
な例をご紹介します。
もしシグマの好感度が「10」で
他にも好感度が「10」のキャラ
(仮に太郎とします)がいたら、
下記はどう分岐すると思いますか?
;もしシグマの好感度が10以上だったら、シグマルートへ [if exp="f.sigma_love >= 10"] [jump target=*ルート] ;もし太郎の好感度が10以上だったら、太郎ルートへ [elsif exp="f.taro_love>=10] [jump target=*太郎ルート] ;上記2つとも当てはまらない場合は共通ルートへ飛ぶ [else] [jump target=*共通ルート] [endif]
わかったまん。
シグマルートへいくまんね?
そうだね!
プログラムは前から順番に処理されていくから
この場合はシグマルートが優先されることになるよ
ちなみに、もし太郎ルートへいくのを
優先にしたい場合は
;もしシグマの好感度が10以上だったら、太郎ルートへ [if exp="f.taro_love >= 10"] [jump target=*太郎ルート] ;もし太郎の好感度が10以上だったら、シグマルートへ [elsif exp="f.sigma_love>=10] [jump target=*シグマルート] ;上記2つとも当てはまらない場合は共通ルートへ飛ぶ [else] [jump target=*共通ルート] [endif]
と条件式を書く順番を
入れ替えてあげるだけでOKです。
今回のように条件分岐させる場合は
プログラムは前から順に処理されていくことを
覚えておくとよいかと思います。
そうしておくと
あれ、太郎の好感度が10なのに
シグマルートへ行っちゃうまん…
といった
「想定している分岐をしない!なぜ!」
ということが防げます。
まとめ:条件判定を取り入れてシナリオに変化を!
今回は
「好感度によってシナリオを分岐させるには?」
について解説しましたが、
いかがでしたでしょうか?
選択肢と条件判定文を併用すると
ストーリーに様々な変化をもたらすことができ
ゲームのやりこみ度やおもしろさを
アップさせることもできますよ!
ぜひ上手く取り入れて
あなたのゲームをよりおもしろいゲームに
してみてくださいね!
<ノベルゲーム、恋愛ゲームをつくる人必見!>
個人ゲーム開発歴6年&
元大手ゲーム会社プランナーの
かがやの知識を詰め込んだ
ゲーム開発の攻略本
『ノベル&恋愛ゲーム開発スタートBOOK』
期間限定無料プレゼント中!
「ゲーム開発って何をしていけばいいの?」
「ゲーム開発をかんたん・効率的に進めるためには?」
「今から開発を始めたらいつ頃完成できる?」
etc…
そんな疑問がこれ一冊で丸わかり✧