
会話文のデータもJSONファイル化して取り込めるようにしました。

今まではこうやってGM内のスクリプトファイルにハードコーディングしていたんですが、スキルやステータスのデータ等と同様に、Excelで管理できると非常に楽ですよね。

ということで、こんな感じの…互換性のある表を作ってみる。

この表を、別シートにIFS関数でムリヤリ成型して飛ばす。
で、このシート全体をコピーし、空のJSONファイルに手動で貼り付け。

JSONファイルができた。な、なんてアナログなんだ…。
Excelの書き出しファイル形式がJSONに対応してないのが悪い。(パワークエリを使えば~、Pythonを通せば~…といろいろやり方はあるようだが、めんどくさかったのでロクに調べていません)
GMにて、JSONファイルの読み込み&既存のダイアログ用ユーティリティ関数への値渡しを行う。
//JSONファイルを文字列として読み込み
function jsonToString(fileName)
{
var file=file_text_open_read(fileName);
if(file<0) return undefined;//開いたファイルが空なら未定義を返す
var jsonStr="";
//ファイルを開いて中のテキストを読み込む
while(!file_text_eof(file))
{
jsonStr+=file_text_read_string(file);
file_text_readln(file);
}
file_text_close(file);
return json_parse(jsonStr);
}
①できたJSONファイルを文字列として読み込む関数。
//JSONファイルからできた文字列を、各関数に飛ばせるようさらに成型する
function convertEntry(e)
{
switch(e.type) //引数のkey "type"は何か
{
case "speaker":
return SPEAKER
(
e.speaker_name,
asset_get_index(string(e.sprite)),
real(e.subimg),
string(e.side),
real(e.pitch)
);
case "text":
return TEXT(string_replace_all(e.text, "@", "\n"));
case "choice":
{
// 元の選択肢文字列 (例:「夏/冬」)を
// "/"で区切り、配列として格納 ※文字がないなら空の配列)
var labels=(string(e.option_label)=="")?
[]:
string_split(string(e.option_label),"/");
var gotos =(string(e.option_goto)=="")?
[]:
string_split(string(e.option_goto),"/");
//空白を取り除き、配列optionsArrに入れる
var optionsArr=[];
for (var k = 0; k < max(array_length(labels),
array_length(gotos)); ++k)
{
var lab = (k<array_length(labels))?
string_trim(labels[k]):
"";
var got = (k<array_length(gotos))?
string_trim(gotos[k]):
"";
array_push(optionsArr, OPTION(lab, got));
}
return CHOICE(string(e.text), optionsArr);
}
case "goto":
return GOTO(e.goto);
}
return undefined;
}
②受け取った文字列を、ダイアログの処理(会話文を表示、ポートレイトを表示、選択肢を表示、別の会話文に飛ぶ…)を司る諸関数の読み込める形に成型する関数。
function buildDialogue(_fileName)
{
var data=jsonToString(_fileName); //文字列は構造体として解釈される
global.topics={};
var topicNames= variable_struct_get_names(data); //data内の変数名を取得
for (var i = 0; i < array_length(topicNames); ++i)
{
var entries=data[$ topicNames[i]];
var list=[];
for (var j = 0; j < array_length(entries); ++j)
{
array_push(list, convertEntry(entries[j]));
}
global.topics[$ topicNames[i]]=list;
}
}
③扇の要となるユーティリティ関数。これが①②の関数を呼び出して、いよいよJSONファイルのデータを解体・出荷する。まな板の上のお魚のように…。
まず①を呼び出し、指定のJSONファイルの中身を文字列として読み込む。
文字列は構造体として解釈されるので、構造体内の変数名を取得。これがkeyとなる。
key名をアクセサとして、構造体の持つ値を全て読み込む。
これを配列の形で格納し、global.topics(=今読み込んでる会話はどれなのん?)に代入する。
サンプルテキスト:夏目漱石『坊っちゃん』
という感じで、実装完了です。できてしまえばシンプルなんですが…
これを作るだけで一週間もかかっちゃったぜ。なけるぜ