//******************************************************************************
// 切换/沟通通用核心（带幽灵名的函数调用）
// 参数说明：
// _argv[0]	函数名前缀
// _argv[1]	幽灵名（自动进行系统字符转义）
//			幽灵名为空时，尝试调用_argv[2]指定的函数
//			“前缀+幽灵名”函数不存在时，尝试调用“前缀Other”函数
// _argv[2]	上述函数均不存在时， fallback 函数名（可选）
//******************************************************************************
AYATEMPLATE.ExecuteGhostNameFunc
{
	_ghostname = SHIORI3FW.TranslateSystemChar(_argv[1]) // 幽灵名系统字符转义
	if _ghostname != '' {
		_funcname = "%(_argv[0])_%(_ghostname)" // 拼接“前缀+幽灵名”函数名
		if ISFUNC(_funcname) { // 判断拼接后的函数是否存在
			_script = EVAL(_funcname) // 执行函数并获取返回值
			if STRLEN(_script) != 0 { // 函数有返回内容时
				_script // 返回函数结果
				return
			}
		}
		_funcname = "%(_argv[0])Other" // 拼接“前缀Other”函数名
		if ISFUNC(_funcname) { // 判断通用函数是否存在
			_script = EVAL(_funcname) // 执行通用函数并获取返回值
			if STRLEN(_script) != 0 { // 函数有返回内容时
				_script // 返回通用函数结果
				return
			}
		}
	}
	if _argc >= 2 { // 存在fallback函数名时
		_funcname = _argv[2]
		if (STRLEN(_funcname) > 0) && ISFUNC(_funcname) { // 判断fallback函数是否存在
			_script = EVAL(_argv[2]) // 执行fallback函数并获取返回值
			if STRLEN(_script) != 0 { // 函数有返回内容时
				REPLACE(_script,"\-","") // 移除换行标记后返回
				return
			}
		}
	}
}
//******************************************************************************
// 沟通相关
//******************************************************************************
// 主动向其他幽灵搭话
AYATEMPLATE.ExecuteTalkToTalk
{
	// 第一步：随机确定搭话对象
	_ghostname=AYATEMPLATE.GetRandomSakuraName()
	res_reference0=_ghostname // 缓存搭话对象名称
	DUMPVAR() // 变量 Dump（调试用）
	// 调用通用核心，执行搭话函数（无对象时调用TalkToNobody）
	AYATEMPLATE.ExecuteGhostNameFunc('TalkTo',_ghostname,'TalkToNobody')
}
// 响应其他幽灵的搭话
AYATEMPLATE.ExecuteReplyToTalk
{
	// 调用通用核心，执行响应函数
	AYATEMPLATE.ExecuteGhostNameFunc('ReplyTo',_argv[0])
}
// 随机确定搭话对象（从已启动幽灵中选择）
AYATEMPLATE.GetRandomSakuraName
{
	_ghostlist=IARRAY // 幽灵列表缓存
	// 若支持FMO，则从FMO读取幽灵列表
	if ISFUNC('SHIORI3FW.RefreshFMOTable') {
		SHIORI3FW.RefreshFMOTable // 刷新FMO幽灵列表
		_ghostlist=SHIORI3FW.SakuraNameList // 获取FMO中的幽灵名称列表
	}else{
		_ghostlist=ghostexlist // 从备用列表获取已启动幽灵名称
	}
	if ARRAYSIZE(_ghostlist)>0 {
		ANY(_ghostlist) // 随机返回一个幽灵名称
	}else{
		'' // 无已启动幽灵时返回空
	}
}
// 获取已启动幽灵列表
On_otherghostname
{
	// 生成当前已启动的幽灵列表
	ghostexlist = reference
	ghostexcount = ARRAYSIZE(ghostexlist) // 统计已启动幽灵数量
	SHIORI3FW.RegisterTempVar('ghostexlist', 'ghostexcount') // 注册临时变量
}