ゲ製報告 -20260211

やりましたわー!
ついにJSONファイルの実装方法がわかりましてよ!

いや…実装方法は割とすぐわかったんだけど…それを理想の形に反映するのが難しかったという…お話。


◆何に使ったんですか?
戦闘画面で出るナレーションに使いました。

上に出ている○○はどうする?」というナレーションを、お試しがてら実装しました。

JSONファイルはこんな感じ~。
キーは文字列、値は構造体です。

文字の色を変えるために、一文のために二つの構造体を呼んでいます。
“urge1″が黄色い文字のキー、中身のテキストは{user}。※キャラの名前に置換される値
“urge2″が白い文字のキー、中身のテキストはstring「はどうする?」で固定。

文字列、それも値の代入が必要な動的なStringの管理には外部ファイルが超★便利!
知識もないわググっても有力情報が少ないわで、バグの山の中からまともな部分を掘り起こして何とかつなぎ合わせるようなさもしい実装となり、大変でしたがやってよかったです。

今までshow_debug_message()で仮実装してたナレーションを
これから全部新システムに差し替…え…ます!めんどくせ~

///@desc JSONテンプレを使って色付きナレを生成
//前提チェック用。
//配列global.narrationDataを走査して_keyが持つ要素を返す (見つからなければ undefined)
function checkKey(_key)
{
	if(is_undefined(global.narrationData))
	return undefined;
		
	for (var i = 0; i < array_length(global.narrationData); ++i)
	{
		//global.narrationDataの中に、_keyで指定されたキー値があるか確認
		if(!is_undefined(global.narrationData[i][$ _key]))
		{
			return global.narrationData[i][$ _key];
		}
	}
	return undefined;
}

///setNarration(_key, _vars)本編。_varsは必ずundefinedか構造体
function setNarration(_key, _vars)
{
	
	var parts=[];
	var textData=checkKey(_key);
	if(is_undefined(textData)) return;
	
	var varKeys=[];
	if(!is_undefined(_vars))
	{
		//構造体のキー名を取得
		//_varsの(user: xxx, damage: yyy)とかのuser、damageの部分だけをすべて取得
		varKeys=struct_get_names(_vars);
	}
	
	//textData(イコールglobal.narrationData[i][$ _key])が配列なら
	if(typeof(textData)=="array")
	{
		for (var i = 0; i < array_length(textData); ++i) 
		{
			var txt=textData[i].text;
			for (var k = 0; k < array_length(varKeys); ++k)
			{
				//keys[k]内の{}で囲まれた検索文字列_vars(置換対象文字列)内の値に置き換え
				var word=variable_struct_get(_vars, varKeys[k]);	//キー名を走査
				var val=is_undefined(word)? "" : word;
				txt=string_replace_all(txt, "{" +varKeys[k] + "}", val);	//置換
			}
		array_push(parts, {text: txt, color: jsonToColor(textData[i].color)})
		}
	}
	else
	{
		//単一オブジェクトなら({ "text":"...", "color":"..." })
		var txt2=textData.text;
		for (var k2 = 0; k2 < array_length(varKeys); ++k2)
		{
			//keys[k]内の{}で囲まれた検索文字列_vars(置換対象文字列)内の値に置き換え
			var word2=variable_struct_get(_vars, varKeys[k2]);	//キー名を走査
			var val2=is_undefined(word2)? "" : word2;
			txt2=string_replace_all(txt2, "{" + varKeys[k2] + "}", val2);	//置換
		}

		array_push(parts, {text: txt2, color: jsonToColor(textData.color)})
	}
	
	if(instance_exists(oBattle))
	{
		with(oBattle)
		{
			for (var i = 0; i < array_length(parts); ++i) 
			{
			    array_push(oBattle.curNaraParts, parts[i]);
			}
		}
	}
}

…今回に限ってはCopilotくんが全然役に立ちませんでした。アイツ困るとすぐ例外処理に走りやがる!
よく見たら単にバケツリレーのごとく渡されてる値の型がおかしいってだけだったのに…。
それ以外にもいろいろありましたがね、うん、私の腰の痛みと引き換えに実装できたんだ、まあよかろうじゃん。

存在しない組み込み関数を使って怒られ、指摘(2度目)をガン無視して
いつものガバガバ例外処理に逃げるMicrosoft謹製AIの図
Copilotくんはごめんなさいと学習を覚えてください。何回大嘘つけば気が済むんじゃい


エネミーアピアランスを作りました。
フィールド上で歩くたびに敵とのエンカウントが近づいている事を知らせてくれる、お馴染みのアレ。青→緑→オレンジ→赤、と変わっていきます。赤になってから暫く歩くとエンカ。

コード。き…黄色っ
内部ではomen(予兆)と呼んでいます。エネミーアピアランスって長いじゃん?
RGB値は配列にしておくとラクですね?


エンカウント演出も作りました。
現状すげー簡素ですね。これから盛ります…。