// chara_v.iet - 話者とボイス定義スクリプト
// Copyright (C)2012, TriaL3 and m-kz
// URL : http://kzkz.jp/  Mail : ok@kzkz.jp
//////////////////////////////////////////////////
// DreamProject and s_e_beat and Suginami
// 2013.10.06 カスタマイズ
//////////////////////////////////////////////////
// 2013.11.07  s_e_beat BGV実装につき仕様変更
// sound.ietマクロ組込　バックログ専用タグ埋込
// 2013.12.12  s_e_beat ボイスパン対応
// 2014.06.06 s_e_beat 口パク対応(chara_fg.iet連動)
//////////////////////////////////////////////////////////////////////
//
//
//
//
//
//////////////////////////////////////////////////////////////////////
*get_voice_id
// id にキャラ名を入れる
// voice_id にチャンネルの数字を返す
// all はallのまま

// all
[if estimate="$id == "all"]
	[var name = "voice_name" data = "all"]
	[var name = "voice_id" data = "all"]
// 佳枝
[elseif estimate = "$id == '佳枝'"]
	[var name = "voice_name" data = "佳枝"]
	[var name = "voice_id" data = "100"]
// 大吾
[elseif estimate = "$id == '大吾'"]
	[var name = "voice_name" data = "大吾"]
	[var name = "voice_id" data = "101"]
// 翔子
[elseif estimate = "$id == '翔子'"]
	[var name = "voice_name" data = "翔子"]
	[var name = "voice_id" data = "103"]
// さやか
[elseif estimate = "$id == 'さやか'"]
	[var name = "voice_name" data = "さやか"]
	[var name = "voice_id" data = "103"]
// 六実
[elseif estimate = "$id == '六実'"]
	[var name = "voice_name" data = "六実"]
	[var name = "voice_id" data = "103"]
// 春子
[elseif estimate = "$id == '春子'"]
	[var name = "voice_name" data = "春子"]
	[var name = "voice_id" data = "103"]
// 平井
[elseif estimate = "$id == '平井'"]
	[var name = "voice_name" data = "平井"]
	[var name = "voice_id" data = "102"]
// 受付嬢
[elseif estimate = "$id == '受付嬢'"]
	[var name = "voice_name" data = "受付嬢"]
	[var name = "voice_id" data = "103"]
// 女
[elseif estimate = "$id == '女'"]
	[var name = "voice_name" data = "女"]
	[var name = "voice_id" data = "103"]
// 紀子
[elseif estimate = "$id == '紀子'"]
	[var name = "voice_name" data = "紀子"]
	[var name = "voice_id" data = "103"]
// 隆
[elseif estimate = "$id == '隆'"]
	[var name = "voice_name" data = "隆"]
	[var name = "voice_id" data = "102"]
// 久恵
[elseif estimate = "$id == '久恵'"]
	[var name = "voice_name" data = "久恵"]
	[var name = "voice_id" data = "103"]
// 檜山
[elseif estimate = "$id == '檜山'"]
	[var name = "voice_name" data = "檜山"]
	[var name = "voice_id" data = "102"]
// 内山
[elseif estimate = "$id == '内山'"]
	[var name = "voice_name" data = "内山"]
	[var name = "voice_id" data = "102"]
// 恵理子
[elseif estimate = "$id == '恵理子'"]
	[var name = "voice_name" data = "恵理子"]
	[var name = "voice_id" data = "103"]
// マリー
[elseif estimate = "$id == 'マリー'"]
	[var name = "voice_name" data = "マリー"]
	[var name = "voice_id" data = "103"]
// ナンシー
[elseif estimate = "$id == 'ナンシー'"]
	[var name = "voice_name" data = "ナンシー"]
	[var name = "voice_id" data = "102"]
// アンナ
[elseif estimate = "$id == 'アンナ'"]
	[var name = "voice_name" data = "アンナ"]
	[var name = "voice_id" data = "102"]
// 光江
[elseif estimate = "$id == '光江'"]
	[var name = "voice_name" data = "光江"]
	[var name = "voice_id" data = "103"]
// 弘一
[elseif estimate = "$id == '弘一'"]
	[var name = "voice_name" data = "弘一"]
	[var name = "voice_id" data = "102"]
// 警察官
[elseif estimate = "$id == '警察官'"]
	[var name = "voice_name" data = "警察官"]
	[var name = "voice_id" data = "102"]
// 中山
[elseif estimate = "$id == '中山'"]
	[var name = "voice_name" data = "中山"]
	[var name = "voice_id" data = "102"]
// 安藤
[elseif estimate = "$id == '安藤'"]
	[var name = "voice_name" data = "安藤"]
	[var name = "voice_id" data = "102"]
// 子供
[elseif estimate = "$id == '子供'"]
	[var name = "voice_name" data = "子供"]
	[var name = "voice_id" data = "102"]
// 母
[elseif estimate = "$id == '母'"]
	[var name = "voice_name" data = "母"]
	[var name = "voice_id" data = "103"]
// 父
[elseif estimate = "$id == '父'"]
	[var name = "voice_name" data = "父"]
	[var name = "voice_id" data = "102"]

// 立ち絵パン同期機能(chara_fg.iet)より呼び出された場合
[elseif estimate = "$t.v_pan_sync != 0"]
	// エラーダイアログを出さない
		[var name = "t.v_pan_sync" data = "none"]
[elseif estimate = "$id == mouth_st"]
	// 口パクを止めるための逆算を行ったときに、セリフキャラが居なかった
	// 場合は、id に0を返す	[var name = "id" data = "0"]
[else]
	[dialog title = "voice_id エラー" message = "$'id(' + id + ')が正しく設定されていません
よくあるのは、ボイスの設定が悪いか、口パク用の立ち絵の設定が悪いです'"]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*voice_stop_calc
// ボイスストップ計算マクロ
// voice_idにデータが入っているかどうかを確認
[if estimate="$voice_id == 'all'"]
	// 入ってなければ、全員ストップ
	[se_stop id = "$'100.' + i" time = "$time"]
	[se_stop id = "$'101.' + i" time = "$time"]
	[se_stop id = "$'102.' + i" time = "$time"]
	[se_stop id = "$'103.' + i" time = "$time"]
[else]
	// 個別キャラストップ
	[se_stop id = "$voice_id + '.' + i" time = "$time"]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*voice_init
// ボイスパン・ボイスやBGV再生中のBGM音量などの初期化

// ボイス再生中フラグを強制off
[sound_flag_off]

// BGMフラグダウン(snd.flag.bgm = 0)
[sound_flag_off]

// BGMが再生中かどうか
[bgm_sound_info name = "t.si"]
[if estimate = "$t.si.playing != 0 && t.si.stopping == 0"]
	// ゲインをあげる
	[bgm_fade time = "120" gain = "1000"]
[/if]

// ボイスチャンネルを全検索
[var name = "t.i" data = "100"]
[loop estimate = "$t.i =< 104"]
	// ボイスパンデータを強制ゼロ
	[var name = "$'voice_pan.' + t.i" data = "0"]

	// ボイスが再生中かどうかをチェックする
	[var name = "t.si" system = "get_sound_info" id = "$t.i + '.0'"]
	[if estimate = "$t.si.playing != 0"]
		// ボイス強制ストップ
		[se_stop id="$t.i + '.0'" time="30"]
	[/if]

	// バックグラウンドボイスが再生中かどうかをチェックする
	[var name = "t.si" system = "get_sound_info" id = "$t.i + '.1'"]
	[if estimate = "$t.si.playing != 0"]
		// ボイス強制ストップ
		[se_stop id="$t.i + '.1'" time="30"]
	[/if]

	// カウンタをインクリメント
	[var name = "t.i" data = "$t.i + 1"]
[/loop]

// 強制的に全画像の口パク終了
[var name = "mouth_st" data = "all"]
//[call file = "system/chara_fg.iet" label = "mouth_out"]

[return]
//////////////////////////////////////////////////////////////////////
//------------------------
*アーティスト
//------------------------
[chgmsg_name]
[calllua function = "voicePrint" jp = "$game_artist" en = "$game_artist"]
[/chgmsg_name]
[return]
//------------------------
*アーティスト名
//------------------------
[font color = "0xFFFF00"][print data = "$'【' + game_artist + '】'"][/font]@
[return]
//------------------------

//------------------------
*佳枝
//------------------------
[chgmsg_name color = "0xF8F3C9"]
	[calllua function = "voicePrint" jp = "佳枝" en = "Kae"]
[/chgmsg_name]
[var name="id" data="佳枝"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*大吾
//------------------------
[chgmsg_name color = "0x569CBE"]
	[calllua function = "voicePrint" jp = "大吾" en = "Daigo"]
[/chgmsg_name]
[var name="id" data="大吾"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*さやか
//------------------------
[chgmsg_name color = "0xF8D2C5"]
	[calllua function = "voicePrint" jp = "彩佳" en = "Sayaka"]
[/chgmsg_name]
[var name="id" data="さやか"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*六実
//------------------------
[chgmsg_name color = "0xF8D2C5"]
	[calllua function = "voicePrint" jp = "六实" en = "mutumi"]
[/chgmsg_name]
[var name="id" data="六実"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*春子
//------------------------
[chgmsg_name color = "0xF8D2C5"]
	[calllua function = "voicePrint" jp = "春子" en = "Haruko"]
[/chgmsg_name]
[var name="id" data="春子"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*翔子
//------------------------
[chgmsg_name color = "0xF8D2C5"]
	[calllua function = "voicePrint" jp = "翔子" en = "Syouko"]
[/chgmsg_name]
[var name="id" data="翔子"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*平井
//------------------------
[chgmsg_name color = "0x7DA123"]
	[calllua function = "voicePrint" jp = "平井" en = "Hirai"]
[/chgmsg_name]
[var name="id" data="平井"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*受付嬢
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "前台小姐" en = "Receptionist"]
[/chgmsg_name]
[var name="id" data="受付嬢"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*女
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "女人" en = "Lady"]
[/chgmsg_name]
[var name="id" data="女"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*紀子
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "纪子" en = "Noriko"]
[/chgmsg_name]
[var name="id" data="紀子"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*隆
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "隆" en = "Takasi"]
[/chgmsg_name]
[var name="id" data="隆"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*久恵
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "久惠" en = "Hisae"]
[/chgmsg_name]
[var name="id" data="久恵"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*檜山
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "桧山" en = "Hiyama"]
[/chgmsg_name]
[var name="id" data="檜山"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*内山
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "内山" en = "Uchiyama"]
[/chgmsg_name]
[var name="id" data="内山"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*恵理子
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "惠理子" en = "Eriko"]
[/chgmsg_name]
[var name="id" data="恵理子"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*マリー
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "玛丽" en = "Marie"]
[/chgmsg_name]
[var name="id" data="マリー"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*ナンシー
//------------------------
[chgmsg_name color = "0xFF8F67"]
[calllua function = "voicePrint" jp = "南希" en = "Nancy"]
[/chgmsg_name]
[var name="id" data="ナンシー"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*アンナ
//------------------------
[chgmsg_name color = "0xFFBDC3"]
[calllua function = "voicePrint" jp = "安娜" en = "Anna"]
[/chgmsg_name]
[var name="id" data="アンナ"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*光江
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "光江" en = "Mitsue"]
[/chgmsg_name]
[var name="id" data="光江"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*弘一
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "弘一" en = "Kouichi"]
[/chgmsg_name]
[var name="id" data="弘一"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*警察官
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "警察" en = "Police"]
[/chgmsg_name]
[var name="id" data="警察官"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*中山
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "中山" en = "Nakayama"]
[/chgmsg_name]
[var name="id" data="中山"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*安藤
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "安藤" en = "Andou"]
[/chgmsg_name]
[var name="id" data="安藤"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*子供
//------------------------
[chgmsg_name color = "0xDBA90D"]
[calllua function = "voicePrint" jp = "孩子" en = "Child"]
[/chgmsg_name]
[var name="id" data="子供"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*母
//------------------------
[chgmsg_name color = "0xF8D2C5"]
[calllua function = "voicePrint" jp = "母亲" en = "Mother"]
[/chgmsg_name]
[var name="id" data="母"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
*父
//------------------------
[chgmsg_name color = "0x7DA123"]
[calllua function = "voicePrint" jp = "父亲" en = "father"]
[/chgmsg_name]
[var name="id" data="父"]
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------
//------------------------
*追加名
//------------------------
//[target_face st = "FACE登録名"] // face画像登録を最初に
[chgmsg_name color = "0x00BBBB"]
[calllua function = "voicePrint" jp = "名前" en = "NAMAE"]
[/chgmsg_name]
[var name="id" data="ボイスのキャラ名"]
//[mouth_in mouth = "$mouth" st = "口パク画像名（立ち絵と同期）"]
//[var name = "mouse_st" data = "all"]	// 複数人対応時
//------------------------
// ボイス再生ルーチン
[calllua function = "voiceSet"]
[return]
//------------------------

//////////////////////////////////////////////////
//////////////////////////////////////////////////
// ボイスのパン設定（マクロ化）
// ex. [set_voice_pan varname = "t.voice_pan"]
*set_voice_pan
[lua]
function setVoicePan(e, param)
	local pan = e:var(param.varname)
	if pan == 'llout' then
		e:tag{"var", name = param.varname, data = -950}
	elseif pan == 'lout' then
		e:tag{"var", name = param.varname, data = -800}
	elseif pan == 'll' then
		e:tag{"var", name = param.varname, data = -700}
	elseif pan == 'l' then
		e:tag{"var", name = param.varname, data = -550}
	elseif pan == 'llc' then
		e:tag{"var", name = param.varname, data = -400}
	elseif pan == 'lc' then
		e:tag{"var", name = param.varname, data = -300}
	elseif pan == 'lcc' then
		e:tag{"var", name = param.varname, data = -200}
	elseif pan == 'c' then
		e:tag{"var", name = param.varname, data = 0}
	elseif pan == 'rcc' then
		e:tag{"var", name = param.varname, data = 200}
	elseif pan == 'rc' then
		e:tag{"var", name = param.varname, data = 300}
	elseif pan == 'rrc' then
		e:tag{"var", name = param.varname, data = 400}
	elseif pan == 'r' then
		e:tag{"var", name = param.varname, data = 550}
	elseif pan == 'rr' then
		e:tag{"var", name = param.varname, data = 700}
	elseif pan == 'rout' then
		e:tag{"var", name = param.varname, data = 800}
	elseif pan == 'rrout' then
		e:tag{"var", name = param.varname, data = 950}
	elseif pan == '0' then
		e:tag{"var", name = param.varname, data = "none"}
	elseif pan == 'now' then
		e:tag{"var", name = param.varname, data = "none"}
	else
		e:tag{"dialog", title = "エラー", message = "voice_pan設定値がおかしいです" .. pan}
		e:tag{"var", name = param.varname, data = 0}
	end
end
[/lua]
[calllua function = "setVoicePan" varname = "$varname"]

[return]
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// textmodeがnovelかadvかで制御
// バックログで名前追跡のために、font にダミー情報を仕込む
// バックログが優秀で、そんな命令無いのにダミーの引数を覚えてくれる
// 感謝。

// advモード用の a_name = "advname"
// novelモード用の b_name = "novelname"
// を仕込む

// お気に入りボイスと連動させるために、
// r_voice.nameに描画名を、
// r_voice.colorに描画カラーを覚える

*chgmsg_name

// 名前描画で使うLuaルーチンをここで登録する
[lua]
-- 名前描画ルーチン
-- $nameが指定されてなかったら、デフォルトで描画する。
-- 名前描画と一緒に、描画するものをr_voice.name変数に覚える。
-- ex.[calllua function = "voicePrint" jp = "くるむ" en = "Kurumu"]
function voicePrint(e, param)
	e:tag{"var", name = "t.exist", system = "var_exist", target = "name", ['local'] = 1}
	if e:var("t.exist") == '1' then
		-- 名前指定があった
		e:tag{"print", data = e:var("name")}
		e:tag{"var", name = "r_voice.name", data = e:var("name")}
	else
		-- 名前指定がなかった
		if e:var("g.language") == '0' then
			-- ランゲージ指定なし
			e:tag{"print", data = param.jp}
			e:tag{"var", name = "r_voice.name", data = param.jp}
		else
			-- ランゲージ指定あり
			e:tag{"print", data = param[e:var("g.language")]}
			e:tag{"var", name = "r_voice.name", data = param[e:var("g.language")]}
		end
	end

	-- ボイス再生用のフラグ確認もここで行っておく
	-- ボイス再生ファイルがあるかどうか
	e:tag{"var", name = "t.exist", system = "var_exist", target = "file", ['local'] = 1}
	if e:var("t.exist") == '1' then
		-- ボイスを再生
		if e:var("file") == '0' then
			e:enqueueTag{"dialog", title = "エラー", message = "ボイスファイル名取得に失敗しています。"}
		else
			e:tag{"var", name = "voice_file", data = e:var("file")}
		end

		e:tag{"var", name = "t.exist", system = "var_exist", target = "pan", ['local'] = 1}
		-- パン指定があるかどうか
		if e:var("t.exist") == '1' then
			-- 指定あり
			e:tag{"var", name = "t.voice_pan", data = e:var("pan")}
		else
			-- 指定なし
			e:tag{"var", name = "t.voice_pan", data = 0}
		end
	else
		-- ボイスを再生しない
		e:tag{"var", name = "voice_file", data = 0}
		e:tag{"var", name = "t.voice_pan", data = 0}
	end
end



-- ボイス再生のための必要な素材をセット
function voiceSet(e)
	-- ボイス再生ファイルがあるかどうか
	if e:var("voice_file") ~= '0' then
		-- キューにボイスを再生させるためのルーチンを積む
		e:enqueueTag{"call", label = "get_voice_id"}
		e:enqueueTag{"call", label = "voice_start"}
	end
end
[/lua]

// adv mode
[if estimate = "$textmode == 'adv'"]
	[chgmsg id="name"]
	[rp backlog = "0"]

	// 色の指定
	[var name="t.exist" system="var_exist" target="color" local="1"]
	[if estimate="$t.exist == 0"]
		// 指定なし
		[font a_name = "advname"]
		[var name = "r_voice.color" data = "0"]
	[else]
		[font a_name = "advname" color = "$color"]
		[var name = "r_voice.color" data = "$color"]
	[/if]
	// 名前の下にラインを描画
	[adv_namebar draw = "1"]
// novel mode
[else]
	// 色の指定
	[var name="t.exist" system="var_exist" target="color" local="1"]
	[if estimate="$t.exist == 0"]
		// 指定なし
		[font b_name = "novelname"]
		[var name = "r_voice.color" data = "0"]
	[else]
		[font b_name = "novelname" color = "$color"]
		[var name = "r_voice.color" data = "$color"]
	[/if]

	[print data = "【"]
[/if]
[return]
*/chgmsg_name
[if estimate = "$textmode == 'adv'"]
	[/font a_name = "advname"]
//	[wait time = "0"]	// wait = 0 で名前描画の開始
	[if estimate = "$s.current_message_layer == 'name'"]
		[/chgmsg]
	[/if]
[else]
[wait0]
	[print data = "】"]
//	[rt]
	[/font b_name = "novelname"]
[/if]
[return]
//////////////////////////////////////////////////
//////////////////////////////////////////////////
*voice_start
[/voice]

// ファイルが0だったら終了
[if estimate = "$voice_file == 0"]
	[return]
[/if]

// ファイルが存在しなくても終了
[var name="t.file_exist_wav" data="0"]
[var name="t.file_exist_ogg" data="0"]
[var name="t.file_exist_mp3" data="0"]
[var name="t.file_exist_wav" system="file_exists" file="$os_snd_path + 'voice/' + voice_file + '.wav'" save="0"]
[var name="t.file_exist_ogg" system="file_exists" file="$os_snd_path + 'voice/' + voice_file + '.ogg'" save="0"]
[var name="t.file_exist_mp3" system="file_exists" file="$os_snd_path + 'voice/' + voice_file + '.mp3'" save="0"]
[if estimate="$t.file_exist_wav == 0 && t.file_exist_ogg == 0 && t.file_exist_mp3 == 0"]
	[return]
[/if]

// 前のボイスを止める
[call label = "prevoice_out"]

// スキップ中かどうかを考慮
[if estimate = "$s.status.commandskip != 1 && s.status.controlskip != 1"]
	// スキップ中じゃない場合
	// ボイス再生時にBGM音量を下げる
	[call label = "bgm_fade_down"]

	// 同時再生ボイスが来たときは、無条件でBGVを全ミュートする
	[if estimate = "$voice_id == g.multichannel"]
		[bgv_fade_all time="30" gain="0"]
	[else]
		// BGVの再生状態を取得
		[var name = "t.si" system = "get_sound_info" id = "$voice_id + '.1'"]
		[if estimate = "$t.si.playing != 0"]
			// 再生されていればBGVミュート
			[se_fade id="$voice_id + '.1'" time="30" gain="0"]
		[/if]
	[/if]
[/if]

// パンを設定
[set_voice_pan varname = "t.voice_pan"]
[if estimate = "$t.voice_pan != 'none'"]
	[var name = "$'voice_pan.' + voice_id" data = "$t.voice_pan"]
[/if]

// ボイスを流す
// ファイル位置は _sound/voice/voice_name/voice_file.ogg を想定
[var name = "t.voicefile_path" data = "$os_snd_path + 'voice/' +  voice_file"]

[var name="t.file_exist1" data="0"]//wav
[var name="t.file_exist2" data="0"]//ogg
[var name="t.file_exist1" system="file_exists" file="$t.voicefile_path + '.wav'" save="0"]
[var name="t.file_exist2" system="file_exists" file="$t.voicefile_path + '.ogg'" save="0"]

[if estimate = "$t.file_exist1 == 1 || t.file_exist2 == 1"]
	[voice_play id="$voice_id + '.0'" file="$t.voicefile_path" loop="0" pan = "$voice_pan.(voice_id)" skippable="1"]

	// ボイスリプレイ用に覚える
	[var name = "r_voice.id" data = "$voice_id + '.0'"]
	[var name = "r_voice.file" data = "$t.voicefile_path"]
	[var name = "r_voice.pan" data = "$voice_pan.(voice_id)"]

	// 吉里吉里のループチューナー設定を保存しておく
	[if estimate = "$t.file_exist1 == 1"]
		// wavの場合
		[read_kirikir_sli path = "$t.voicefile_path + '.wav.sli'" varname = "voice_sli"]
	[else]
		// oggの場合
		[read_kirikir_sli file = "$t.voicefile_path + '.ogg.sli'" varname = "voice_sli"]
	[/if]
[/if]

// ボイスパンdebug用
//[caption data = "$id + voice_pan.(voice_id)"]

// ボイス停止用id変数
[var name="t.voice_id" data="$voice_id"]


// BGVの再生状態を取得
// スキップ中かどうかを考慮
[if estimate = "$s.status.commandskip != 1 && s.status.controlskip != 1"]
	[if estimate = "$voice_id == g.multichannel"]
		// 再生されていれば全員のBGV登録 & BGM音量の復帰
		[setonsoundfinish id = "$voice_id + '.0'" handler="bgv_fade_in_all" bgv_id = "$voice_id"]
	[else]
		[var name = "t.si" system = "get_sound_info" id = "$voice_id + '.1'"]
		[if estimate = "$t.si.playing != 0"]
			// 再生されていればBGV登録 & BGM音量の復帰
			[setonsoundfinish id = "$voice_id + '.0'" handler="bgv_fade_in" bgv_id = "$voice_id"]
		[else]
			// 再生されていればBGM音量の復帰
			[setonsoundfinish id = "$voice_id + '.0'" handler="bgm_fade_up_backlog"]
		[/if]
	[/if]
[/if]
[wait time = "0" input = "0"]
[return]
//////////////////////////////////////////////////////////////////////
*prevoice_out
// 前のボイスを止める
// ボイスチャンネルは100番以降を想定
[if estimate = "$t.voice_id >= 100"]
	// 前のボイスの再生状態を取得
	[se_sound_info varname = "t.si" id = "$t.voice_id + '.0'"]
	[if estimate = "$t.si.playing != 0"]
		// 再生されていれば止める
		[se_stop id="$t.voice_id + '.0'" time="30"]

		// 止めたBGVの再生状態を取得
		[se_sound_info varname = "t.si" id = "$t.voice_id + '.1'"]

		// 止めたボイスがこれから発声する人と違う人で、
		// かつBGVが再生中の場合は、復活してあげる
		[if estimate = "$t.si.playing != 0 && t.si.stopping == 0 && t.si.gain != 1000 && t.voice_id != voice_id"]
			// BGVを再生する
			[se_fade id = "$t.voice_id + '.1'" time="90" gain="1000"]
		// 複数音声かどうか
		[elseif estimate = "$t.voice_id == g.multichannel"]
			// 再生されていれば全BGV復帰
			[bgv_fade_all time="90" gain="1000"]
		[/if]
		// ボイス消去分ウェイト
		[wait time = "30" input = "2"]
	[/if]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// 通常ボイスの停止マクロ
*voice_stop
// ex. [voice_stop id == "chihaya" time = "30"]
//id   : all　または無指定で全員ストップ
//time : フェードタイム。無指定でもOK



// time値によるフェードがあるかどうかをチェック
[var name="t.exist" system="var_exist" target="time" local="1"]
[if estimate="$t.exist == 0"]
	// １フレームで消音
	[var name = "time" data = "30"]
[else]
	// スキップ中だったら高速停止
	[if estimate="$s.status.commandskip != 1 && s.status.controlskip != 1"]
		// time値でフェード
		[var name = "time" data = "$time"]
	[elseif estimate = "$time <= 100"]
		// time値でフェード
		[var name = "time" data = "$time"]
	[else]
		// time値 / 2 でフェード
		[var name = "time" data = "$time / 2"]
	[/if]
[/if]
[var name = "t.exist" system = "var_exist" target = "id" local = "1"]
[if estimate="$t.exist == 0"]
	// 入ってなければ、全員ストップ
	[var name = "id" data = "all"]
[/if]

// キャラid 取得
[call label = "get_voice_id"]

// i = 0 は、通常ボイスチャンネル
[var name = "i" data = "0"]
[call label = "voice_stop_calc"]

// ボイス再生時に下げていたBGM音量を戻す
// バックログ考慮
[call label = "bgm_fade_up_backlog"]
[return]
//////////////////////////////////////////////////////////////////////
// バックグラウンドボイスの停止マクロ
*bgv_stop
*bgv_out
// ex. [bgv_out id = "chihaya" time = "30"]
//id   : all　または無指定で全員ストップ
//time : フェードタイム。無指定でもOK


[var name = "t.exist" system = "var_exist" target = "id" local = "1"]
[if estimate="$t.exist == 0"]
	// 入ってなければ、全員ストップ
	[var name = "id" data = "all"]
[else]
	[var name = "id" data = "$id"]
[/if]

// キャラid 取得
[call label = "get_voice_id"]

// BGVサウンド登録解除
// サウンド依存動作
[if estimate = "$voice_id == 'all'"]
	[delonsoundfinish id = "100.0"]
	[delonsoundfinish id = "101.0"]
	[delonsoundfinish id = "102.0"]
	[delonsoundfinish id = "103.0"]
	[delonsoundfinish id = "104.0"]
	[delonsoundfinish id = "105.0"]
	[delonsoundfinish id = "106.0"]
	[delonsoundfinish id = "107.0"]
	[delonsoundfinish id = "108.0"]
	[delonsoundfinish id = "109.0"]
	[delonsoundfinish id = "110.0"]
	[delonsoundfinish id = "111.0"]
	[delonsoundfinish id = "112.0"]
[else]
	[delonsoundfinish id = "$voice_id + '.0'"]
[/if]

// エラー回避
[wait time = "30" input = "0"]


// time値によるフェードがあるかどうかをチェック
[var name="t.exist" system="var_exist" target="time" local="1"]
[if estimate="$t.exist == 0"]
	[var name = "time" data = "30"]
[else]
	// スキップ中だったら高速停止
	[if estimate="$s.status.commandskip != 1 && s.status.controlskip != 1"]
		// time値でフェード
		[var name = "time" data = "$time"]
	[elseif estimate = "$time <= 100"]
		// time値でフェード
		[var name = "time" data = "$time"]
	[else]
		// time値 / 2 でフェード
		[var name = "time" data = "$time / 2"]
	[/if]
[/if]


// i = 1 は、BGVボイスチャンネル
[var name = "i" data = "1"]
[call label = "voice_stop_calc"]

// エラー回避
[wait time = "1" input = "0"]
[return]
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
*bgv_in
// バックグラウンドボイス再生マクロ
// ex. [bgv_in id = "chihaya" file = "hoge"]
// all は指定不可

// 通常再生が.0 BGVは.1 のチャンネル仕様
// .1再生のために、.0 のボリューム値を参照する

// キャラid 取得
[var name="id" data="$id"]
[call label = "get_voice_id"]

// パンを取得
[var name="t.si.exist" system="var_exist" target="pan" local="1"]
[if estimate = "$t.si.exist == 0"]
[else]
	[var name = "t.voice_pan" data = "$pan"]
	[set_voice_pan varname = "t.voice_pan"]
	[var name = "$'voice_pan.' + voice_id" data = "$t.voice_pan"]
[/if]


// BGVボイスの再生状態を取得
[var name = "t.si" system = "delete"]
[var name = "t.si" system = "get_sound_info" id = "$voice_id + '.1'"]
[if estimate = "$t.si.playing != 0"]
	// 再生されている場合は　とめる
	[delonsoundfinish id = "$voice_id + '.0'"]
	[se_stop id="$voice_id + '.1'" time="30"]
	[wait time = "30" input = "0"]
[/if]

// ボイス再生
// A-Bループ用の音源があるかどうかの判定
// wav
[var name="t.file_exist1" data="0"]
[var name="t.file_exist2" data="0"]
[var name="t.file_exist1" system="file_exists" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '_a.wav'" save="0"]
[var name="t.file_exist2" system="file_exists" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '.wav'" save="0"]
[if estimate = "$t.file_exist1 == 1"]
	[se_play id="$voice_id + '.1'" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '_a.wav'" loop="1" skippable="0" pan = "$voice_pan.(voice_id)"]
[elseif estimate = "$t.file_exist2 == 1"]
	[se_play id="$voice_id + '.1'" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '.wav'" loop="1" skippable="0" pan = "$voice_pan.(voice_id)"]
[/if]

// ogg
[var name="t.file_exist1" data="0"]
[var name="t.file_exist2" data="0"]
[var name="t.file_exist1" system="file_exists" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '_a.ogg'" save="0"]
[var name="t.file_exist2" system="file_exists" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '.ogg'" save="0"]
[if estimate = "$t.file_exist1 == 1"]
	[se_play id="$voice_id + '.1'" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '_a.ogg'" loop="1" skippable="0" pan = "$voice_pan.(voice_id)"]
[elseif estimate = "$t.file_exist2 == 1"]
	[se_play id="$voice_id + '.1'" file="$os_snd_path + 'voice/' + voice_name + '/' + file + '.ogg'" loop="1" skippable="0" pan = "$voice_pan.(voice_id)"]
[/if]



// 通常ボイスの再生状態を取得
[var name = "t.si" system = "delete"]
[se_sound_info varname = "t.si" id = "$voice_id + '.0'"]
[if estimate = "$(t.si.playing != 0) && (t.si.stopping == 0)"]
	[if estimate = "$voice_id == g.multichannel"]
		// 複数音声時は無条件で音量を0に
		[bgv_fade_all time="30" gain="0"]
		// BGV登録
		// サウンド動作依存
		[setonsoundfinish id = "$voice_id + '.0'" handler="bgv_fade_in_all" bgv_id = "$voice_id"]
	[else]
		// 再生されている場合は　音量を0に
		[se_fade id="$voice_id + '.1'" time="30" gain="0"]
		// BGV登録
		// サウンド動作依存
		[setonsoundfinish id = "$voice_id + '.0'" handler="bgv_fade_in" bgv_id = "$voice_id"]
	[/if]
[/if]



// エラー回避
[wait time = "1" input = "0"]
[return]
//////////////////////////////////////////////////////////////////////
*bgv_fade_in
// bgv_id.0のボリューム値 に bgv_id.1のボリューム値　を揃える
// →gain = "1000" でOK　s.segainとは独立で動作

// 90msec でフェードイン
//[se_fade id = "$bgv_id + '.1'" time="90" gain="$$'s.segain.' + bgv_id + '.0'"]
// 複数音声時は、無条件で複数音声処理へ
[if estimate = "$bgv_id == g.multichannel"]
	[jump label = "bgv_fade_in_all"]
[/if]

[se_fade id = "$bgv_id + '.1'" time="90" gain="1000"]

// 口パクの終了
//[call file = "system/chara_fg.iet" label = "mouth_out"]

// ボイス再生時に下げていたBGM音量を戻す
// バックログ動作を考慮
[call label = "bgm_fade_up_backlog"]
[return]
//////////////////////////////////////////////////////////////////////
*bgv_fade_in_all
// 90msec でフェードイン
//[se_fade id = "$bgv_id + '.1'" time="90" gain="$$'s.segain.' + bgv_id + '.0'"]
[bgv_fade_all time="90" gain="1000"]

// 全員の口パクの終了
//[var name = "mouth_st" data = "all"]
//[call file = "system/chara_fg.iet" label = "mouth_out"]

// ボイス再生時に下げていたBGM音量を戻す
// バックログ動作を考慮
[call label = "bgm_fade_up_backlog"]
[return]
//////////////////////////////////////////////////////////////////////
*bgv_fade_all
[lua]
-- 音が鳴ってるチャンネルを無条件でgain操作する
function bgvFadeAll(e,param)
	-- 検索チャンネルの幅を設定
	local channel_start = 100
	local channel_end = 120

	for i = channel_start, channel_end do
		-- チャンネルの状態を調べる
		e:tag{"var", name = "t.si", system = "delete"}
		e:tag{"var", name = "t.si", system = "get_sound_info", id = i .. ".1"}
		-- もし再生していたら
		if e:var("t.si.playing") == '1' then
			-- キューにse_fadeマクロを積んでいく
			e:enqueueTag{"se_fade", time = param.time, gain = param.gain}
		end
	end
end
[/lua]
[calllua function = "bgvFadeAll" gain = "$gain" time = "$time"]
[return]
//////////////////////////////////////////////////////////////////////
// バックログを考慮したbgm_fade_up
*bgm_fade_up_backlog
// ユーザーがバックログボイスをクリック再生できるので、何がどれだけ
// 再生されてるか不明であるため、通常ボイスチャンネルを全検索し、
// 再生中があった場合は、BGM音量を元に戻さない。

// 音量を下げているフラグが立ってる場合のみ処理
[if estimate = "$snd.flag.bgm == 1"]
	// BGMを戻すかどうかのフラグ初期化
	[var name = "t.cv_i" data = "0"]

	[var name = "t.bgv_id" data = "100"]
	[loop estimate = "$t.bgv_id <= 120"]

		// 通常ボイスの再生状態を取得
		[se_sound_info varname = "t.si" id = "$t.bgv_id + '.0'"]
		// 通常ボイスが再生中(止まる気配が無い)の場合
		[if estimate = "$t.si.playing != 0 && t.si.stopping == 0"]
			// フラグアップ
			[var name = "t.cv_i" data = "1"]
		[/if]
		[var name = "t.bgv_id" data = "$t.bgv_id + 1"]
	[/loop]

	// BGMが全部止まっている場合
	[if estimate = "$t.cv_i == 0"]
		// BGM音量を戻す
		[call label = "bgm_fade_up"]
	[/if]
[/if]

[return]
//////////////////////////////////////////////////////////////////////
*bgm_fade_up

// ボイス再生時に下げていたBGM音量を戻す(%)
[bgm_fade time = "120" gain = "1000"]
// フラグダウン(snd.flag.bgm = 0)
[sound_flag_off]

// このとき誰も喋ってる人は居ないので、口パクリセットする
// 口パクの終了
[if estimate = "$mouth_st != 0"]
	[var name = "mouth_st" data = "all"]
//	[call file = "system/chara_fg.iet" label = "mouth_out"]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*bgm_fade_down
// スキップ中のときは音量を下げない
[if estimate = "$s.status.commandskip != 1 && s.status.controlskip != 1"]
	// ボイス再生時にBGM音量を下げる(%)
	[bgm_fade time = "30" gain = "$g.voice_bgmgain"]
	// フラグアップ(snd.flag.bgm = 1)
	[sound_flag_on]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*bgm_in_flag
// bgm_in マクロ時にコールされるルーチン
// ボイスクリック用のフラグを制御する

// ボイスクリック時のフェード中フラグが立っていた場合、音量をセットする。
[if estimate = "$snd.flag.bgm == 1"]

	[bgm_fade time = "time2" gain = "$g.voice_bgmgain"]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*bgm_out_flag
// bgm_out マクロ時にコールされるルーチン
// 現状やることなし


[return]
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
*snd_check_blankline
// シナリオが新しく進んだときにボイスの状態をチェック。
// シナリオの空行に自動追加される処理


[return]
//////////////////////////////////////////////////////////////////////
*snd_check_linehead
// シナリオが新しく進んだときにボイスの状態をチェック。
// シナリオ行頭毎 に自動追加される処理。
// スキップ中かどうか
[if estimate = "$s.status.commandskip != 1 && s.status.controlskip != 1"]
// スキップ中ではない場合

// スキップ中の場合
[else]
	[call label = "voice_skip_calc"]
[/if]

[return]
//////////////////////////////////////////////////////////////////////
*snd_check_lineend
// シナリオが新しく進んだときにボイスの状態をチェック。
// シナリオ行末毎 に自動追加される処理。

// 現状やることなし

[return]
//////////////////////////////////////////////////////////////////////
*snd_check_textelace
// シナリオテキストクリックされてが消える瞬間にボイスの状態をチェック。
// シナリオ行末後の@ウェイト通過後に自動追加される処理。

// ボイスクリックの処理
// ボイスクリックが実行されている場合は、通常ボイスをoffにし、
// BGVを再生し、BGMボリュームを下げる

// t.voice_id に前回再生されたボイスidが入っているので、
// その１点のみに絞り、停止処理とBGVについて計算する。

// スキップ中かどうか
[if estimate = "$s.status.commandskip != 1 && s.status.controlskip != 1"]
// スキップ中ではない場合
	[if estimate = "$g.voiceclick == 1"]
		// 通常ボイスの再生状態を取得
		[se_sound_info varname = "t.si" id = "$t.voice_id + '.0'"]
		// 通常ボイスが再生中の場合
		[if estimate = "$t.si.playing != 0"]
			// シナリオが新しくなるたびにボイスストップする
			[se_stop id="$t.voice_id + '.0'" time="60"]

			// ボイス再生時に下げていたBGM音量を戻す
			// バックログ考慮
			[call label = "bgm_fade_up_backlog"]

			// さらに t.voice_id に対応するBGVの再生状態を取得
			[se_sound_info varname = "t.si" id = "$t.voice_id + '.1'"]
			// BGV再生中の場合
			[if estimate = "$t.si.playing != 0"]
				// フェードイン
				[se_fade id = "$t.voice_id + '.1'" time="90" gain="1000"]
			[/if]
		// 通常ボイスが再生中でない場合
		[else]
			// ボイス再生時に下げていたBGM音量を戻す
			// バックログ考慮
			[call label = "bgm_fade_up_backlog"]
		[/if]
	[/if]
	// シナリオが進めば口パクは確認する
//	[call label = "snd_check_mouthstop"]
[else]
	// スキップしたら、口パクは強制ストップする
//	[call file = "system/chara_fg.iet" label = "mouth_out"]
	// ボイスの再生状態を取得
	[se_sound_info varname = "t.si" id = "$t.voice_id + '.0'"]
	[if estimate = "$t.si.playing != 0 && t.si.stopping == 0"]
		// ボイスが再生されていたら強制ストップ
		[call label = "prevoice_out"]
		[call label = "bgm_fade_up"]
		// さらに t.voice_id に対応するBGVの再生状態を取得
		[se_sound_info varname = "t.si" id = "$t.voice_id + '.1'"]
		// BGV再生中の場合
		[if estimate = "$t.si.playing != 0 && t.si.fading != 1 && t.si.gain != 1000"]
			// フェードイン
			[se_fade id = "$t.voice_id + '.1'" time="90" gain="1000"]
		[/if]
	[/if]
[/if]



[return]
//////////////////////////////////////////////////////////////////////
*snd_check_mouthstop
// シナリオがクリックストップする際にボイスの状態をチェック。
// シナリオが止まる直前に自動追加される処理。
//[dialog message = "$mouth_st"]

// ボイス再生なしで口パクしている場合を想定してチェック
[var name = "id" data = "$mouth_st"]
[call label = "get_voice_id"]
// id に 0 が入っている場合は、無ボイス時での口パク
[if estimate = "$id == 0"]
	// 強制口パクストップ
//	[call file = "system/chara_fg.iet" label = "mouth_out"]
[else]
	// 通常ボイスチャンネルチェック、喋ってなければ終了
	[var name = "t.si" system = "get_sound_info" id = "$voice_id + '.0'"]
	// 通常ボイスが再生中でない場合
	[if estimate = "$t.si.playing == 0"]
		// 口パクストップ
//		[call file = "system/chara_fg.iet" label = "mouth_out"]
	[/if]
[/if]

[return]
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
*voice_skip_calc

//[dialog]
// ボイス再生時に下げていたBGM音量を戻す
[if estimate = "$snd.flag.bgm == 1"]
	[call label= "bgm_fade_up"]
	// BGVを戻しておくべきかどうかを計算する
	[call label = "bgv_fade_in_allcheck"]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*bgv_fade_in_allcheck
// 全ボイスチャンネルに対して、BGVの再生が必要かどうかをチェックする
//


[var name = "t.bgv_id" data = "100"]
[loop estimate = "$t.bgv_id <= 120"]

	// BGVボイスの再生状態を取得
	[se_sound_info varname = "t.si" id = "$t.bgv_id + '.1'"]
	// BGV再生中、かつgain音量が1000でなく、フェードインもしてない場合
	[if estimate = "$t.si.playing != 0 && t.si.gain != 1000 && t.si.fading != 1"]
		// 通常ボイスの再生状態を取得
		[se_sound_info varname = "t.si" id = "$t.bgv_id + '.0'"]
		[if estimate = "$t.si.playing == 0 || t.si.stopping == 1"]
			// 再生されていなければフェードイン
			[se_fade id = "$t.bgv_id + '.1'" time="90" gain="1000"]
		[/if]
	[/if]

	[var name = "t.bgv_id" data = "$t.bgv_id + 1"]
[/loop]
[return]
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// バックログ用のse_play
// 実会話中が終わらないうちにログの話者セリフをクリックで再生した
// 場合にBGV再生を忘れるので、マクロで処理する。
// せっかくマクロでコントロールするので、音声再生中は
// その子のBGVをミュートする。
// BGM音量もさげる。

*se_play_backlog

// 喋っているキャラクタの上書き再生が生じた場合に
// 口パクを終了させる
//[if estimate = "$id == voice_id + '.0'"]
//	[call file = "system/chara_fg.iet" label = "mouth_out"]
//[/if]

// ボイスIDが100.0のように格納されているので、
// 100 の部分を $t.id.0 に取得する。
[var name = "t.id" system = "explode" source = "$id" delimiter="."]

// 前のボイスを止める
[var name = "t.voice_id" data = "$voice_id"]
[var name = "voice_id" data = "$t.id.0"]
[call label = "prevoice_out"]


// ボイス再生時にBGM音量を下げる
[call label = "bgm_fade_down"]


// 複数音声かどうか
[if estimate = "$t.id.0 == g.multichannel"]
	// 再生されていれば全BGVミュート
	[bgv_fade_all time="30" gain="0"]
[else]
	// BGVの再生状態を取得
	[var name = "t.si" system = "get_sound_info" id = "$t.id.0 + '.1'"]
	[if estimate = "$t.si.playing != 0"]
		// 再生されていればBGVミュート
		[se_fade id="$t.id.0 + '.1'" time="30" gain="0"]
	[/if]
[/if]

// 再生する
[se_play id = "$id" file = "$file" pan = "$pan"]

// 複数音声時は無条件で全BGVの復帰
[if estimate = "$t.id.0 == g.multichannel"]
	// 再生されていれば全BGV登録 & BGM音量の復帰
	[setonsoundfinish id = "$id" handler="bgv_fade_in_all"]
[else]
	// BGVの再生状態を取得
	[var name = "t.si" system = "get_sound_info" id = "$t.id.0 + '.1'"]
	[if estimate = "$t.si.playing != 0"]
		// 再生されていればBGV登録 & BGM音量の復帰
		[setonsoundfinish id = "$id" handler="bgv_fade_in" bgv_id = "$t.id.0"]
	[else]
		// 再生されていれなければ BGM音量の復帰
		[setonsoundfinish id = "$id" handler="bgm_fade_up_backlog"]
	[/if]
[/if]
[return]

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// kirikiri loop tunerによる.sliファイル読み込みに対応
//////////////////////////////////////////////////////////////////////
*read_kirikir_sli
// ex. [read_kirikiri_sli file = "hoge.sli" varname = "t.time"]
//
// → t.time = 1	// ←ファイルがあったときのフラグ
// → t.time.0 = 10000
// → t.time.1 = 20000
// といった感じで、sliのラベルに応じたお返事が返ってくる

[lua]
function kirikiriLoopTuner(e,param)

	-- ■ split関数
	function split(str, delim)
	    -- Eliminate bad cases...
	    if string.find(str, delim) == nil then
	        return { str }
	    end

	    local result = {}
	    local pat = "(.-)" .. delim .. "()"
	    local lastPos
	    for part, pos in string.gfind(str, pat) do
	        table.insert(result, part)
	        lastPos = pos
	    end
	    table.insert(result, string.sub(str, lastPos))
	    return result
	end


	-- カウンタを初期化
	local i = 0

	-- 音声周波数を指定
	local khz = 48
	--local khz = 44.1

	-- sliファイルを読み込む
	if e:isFileExists(param.path) == false then
		-- なかったので、フラグを立てない
		e:tag{"var", name = param.varname, system = "delete"}
		e:tag{"var", name = param.varname, system = "delete"}
--		e:debug("「" .. path .. "」が見つかりませんでした")

	else
		-- sliファイルがあったので読み込む
		local data = e:file(param.path)

		-- UTF-8システム化により、以下のコードは不要になりました
		-- S-JISに変換
--[[
		e:tag{"var", name = param.varname .. ".text", system ="convert_encoding", source = data, from = "utf8", to = "sjis"}
		data = e:var(param.varname .. ".text")
		e:tag{"var", name = param.varname .. ".text", system ="delete"}
--]]

		-- 必要な情報を取得する
		for i, line in pairs(split(data, "\n")) do
			if string.sub(line, 0, 5) == "Label" then
				-- ゴミデータを除去する
				line = string.gsub(line, "=", ";")
				line = string.gsub(line, " ", "")
				-- 必要な情報を取り出す
				local t = split(line, ";")
				t[2] = math.floor(t[2] / khz)
				-- ラベル番号
				t[4] = string.gsub(t[4], "'", "")
				t[4] = string.gsub(t[4], "ラベル", "")
				-- 値をアルテミス変数に登録する
				e:tag{"var", name = param.varname .. "." .. t[4], data = t[2]}
				-- 親関数にフラグもセットしておく
				e:tag{"var", name = param.varname, data = 1}
				-- 積極的にメモリ開放
				t = {}
			end
		end
	end
end
[/lua]
[calllua function = "kirikiriLoopTuner" path = "$file" varname = "$varname"]
[return]
//////////////////////////////////////////////////////////////////////
*clear_kirikiri_sli
	// 吉里吉里用ボイスフラグをリセット
	[var name = "voice_sli" system = "delete"]
	[var name = "voice_sli" system = "delete"]
[return]
//////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////
*voice_move_pan
// ex. [voice_move_pan id = ""



[return]
//////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////
// ボイスリプレイ
//////////////////////////////////////////////////////////////////////
*replay_voice
// リプレイidに何かしらの値が入っていたら、それは再生するものが
// あるということ
[if estimate = "$r_voice.id != 0"]
	// 再生する
	[se_play_backlog id = "$r_voice.id" file = "$r_voice.file" pan = "$r_voice.pan"]
[else]
	// 何も無かったので、小キャンセル音
	[lycaution message = "ボイス再生シーンではありません"]
	[se_play id = "0" file = "$os_snd_path + 'se/se0004'"]
	[wait time = "0"][flip]
[/if]
[return]
//////////////////////////////////////////////////////////////////////
*backlog_r_voice
// バックログにボイスを登録

// advのときは、
// backlog.voice.file.xx
// backlog.voice.pan.xx
// backlog.voice.id.xx
// backlog.voice.name.xx
// backlog.voice.color.xx に値が入る

// ノベルのときは、
// backlog.voice.file.xx.yy
// backlog.voice.pan.xx.yy
// backlog.voice.id.xx.yy
// backlog.voice.name.xx.yy
// backlog.voice.color.xx.yy に値が入る


[lua]
function backlogRVoice(e)
	local no = ""
	no = e:var("backlog.num")

	-- 無条件でテキストモードは代入
	e:tag{"var", name = "backlog.textmode." .. no, data = e:var("textmode")} 

	if e:var("textmode") == 'novel' then
		-- novelのときは子カウンタか0のとき、二度中身を初期化する
		if e:var("backlog.novel." .. no) == '0' then
			for i = 1, 2 do
				e:tag{"var", name = "backlog.voice.name." .. no, system = "delete"}
				e:tag{"var", name = "backlog.voice.color." .. no, system = "delete"}
				e:tag{"var", name = "backlog.voice.id." .. no, system = "delete"}
				e:tag{"var", name = "backlog.voice.file." .. no, system = "delete"}
				e:tag{"var", name = "backlog.voice.pan." .. no, system = "delete"}
			end
		end

		-- ナンバーにnovelを加味
		no = no .. "." .. e:var("backlog.novel." .. no)

	else

		-- advのときは一度中身を初期化する
		e:tag{"var", name = "backlog.voice.name." .. no, system = "delete"}
		e:tag{"var", name = "backlog.voice.color." .. no, system = "delete"}
		e:tag{"var", name = "backlog.voice.id." .. no, system = "delete"}
		e:tag{"var", name = "backlog.voice.file." .. no, system = "delete"}
		e:tag{"var", name = "backlog.voice.pan." .. no, system = "delete"}
	end


	-- 値を代入
	e:tag{"var", name = "backlog.voice.name." .. no, data = e:var("r_voice.name")}
	e:tag{"var", name = "backlog.voice.color." .. no, data = e:var("r_voice.color")}
	e:tag{"var", name = "backlog.voice.id." .. no, data = e:var("r_voice.id")}
	e:tag{"var", name = "backlog.voice.file." .. no, data = e:var("r_voice.file")}
	e:tag{"var", name = "backlog.voice.pan." .. no, data = e:var("r_voice.pan")}

end
[/lua]

[calllua function = "backlogRVoice"]

[return]
//////////////////////////////////////////////////////////////////////
*replay_voice_clear
[var name = "r_voice" system = "delete"]
[var name = "r_voice" system = "delete"]
[return]
//////////////////////////////////////////////////////////////////////
*last
[return]
