簡単にゲーム開発するための書籍、無料プレゼント中!!

【吉里吉里Z/KAG】好感度でストーリー分岐。どうやればできるの?

[temp id=2]

 

今回は吉里吉里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」となっています。

 

これにて好感度のアップダウンも

問題なく行えていることが確認できました。

 

「Krkr2Compat」を導入しておくと
吉里吉里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』
期間限定無料プレゼント中!

ノベル・恋愛ゲーム開発スタートBOOK

「ゲーム開発って何をしていけばいいの?」
「ゲーム開発をかんたん・効率的に進めるためには?」
「今から開発を始めたらいつ頃完成できる?」

etc…

そんな疑問がこれ一冊で丸わかり