縦書きノベル制作日記 その8 変数管理
前回「分岐によるシーン数の拡散を防ぐ方策を考える」などと言っていましたが、どうあがこうと「分岐させたらシーンが増える」これは避けられません。では、ストーリーの大きな分岐は仕方ない、と諦めるとして、せめて小さな分岐ではシーン数を減らせるようなフラグ管理の導入を考えます。ここでいう小さな分岐というのは、会話の流れの本筋は変わらなくて、途中にある相槌をうつような選択肢によって、相手の反応がちょこっと変わるみたいな感じを想定しています。これを選択肢分だけ分岐させてしまうと、以下のような感じに……。
いまは、説明用にエクセルで図式化していて、まだ全体像を目で見れる分マシですが、現在想定しているのはテキストベースでのシナリオ管理です。長くなればなるほど無理が出てくるでしょう。そこでフラグ管理をできるようにすると以下のような形にまで、まとめられるようになります。
さらに選択肢によって好感度を上下させて、その値によって分岐させたりもできますし、どのルートを辿ってきたかの判別も可能になります。ただ、フラグを管理するといっても、お仕着せのものだと融通がきかない&視認性も悪くなる(間違いなく適当な自分では、なにをやってるかわからなくなる)ということで、ここはユーザーが自由に定義できる変数を用意します。スクリプト内では、この変数を利用することでシーン内で条件分岐をしたりすることができるようしていきたいので、新規コマンドの追加とMENUコマンドの変更を行います。
◆新規コマンド </VAR:変数名:値 変数の定義(定義と同時に初期化も行うため引数の省略は不可) </LET:変数名:値 値を変数へ代入 </IF:条件式 条件式が真(0)のときは、ENDIFまでの文章を生かし、条件式が偽(-1)のときは、ENDIFまでの文章を飛ばす </ENDIF IF文終了マーカー(なお、IFコマンドは入れ子にできない) ◆変更コマンド MENU:表示する選択肢の文字列:選択肢を表示する条件:次に移行するシーン名:設定する変数:設定する数値
変数の実装自体は、変数名と値を格納する構造体を用意し、変数が追加された時にはリストをガンガンaddしていくだけ。変数の読み出しは、頭から順に変数名を検索してヒットしたら取り出すだけ。大量の変数管理を想定することになると、検索性を上げるためにいろいろなことが必要になりますが、今回は数個〜せいぜい十数個も管理できれば問題ないないので、パパパ〜っと済ませます(詳しいやり方も知らないしね)。
// //変数格納用 //Variable.name = 変数名 //Variable.num = 値 // private struct VariableData { public string name; //変数名 public int num; //値 public VariableData(string p1,int p2) { name = p1; num = p2; } } //変数格納リスト private List<VariableData> variableArray = new List<VariableData>();</span>
で、次に問題となるのは変数に入れる値をどうするかです。単純に数値を入れるだけであれば、引数を変換してぶち込めばいいのですが、先程言ったような好感度を上下させるようなことをしたい場合は、直接、値を代入するだけでは実現できません。好感度+1や好感度+2ということをやるために、式の評価をすることに…さらに条件式の評価も必要になるので、四則演算だけでなく、比較演算子も考慮する必要になります。
めんどくさい…まぁ面倒とはいっても、先人たちの知恵を借りれば余裕っしょ、ということで「式の評価」とググって本日はおしまいっ。