*register
//注册宏
@macro name="basic_dialogbox"
@macro name="select" text label se=void labelFile
@macro name="disable_dialogbox"
@macro name="enable_dialogbox"
@return

//用来禁用对话框事件的宏
*disable_dialogbox
@spriteopt index=9000 disable=true
@event name="mousewheelup" enable=false
@event name="mousewheeldown" enable=false
@return

//用来启用对话框事件的宏
*enable_dialogbox
@spriteopt index=9000 disable=false
@event name="mousewheelup" enable=true file="system_history" label="*enter" type="call" ignore=true condition="System.stable"
@event name="mousewheeldown" enable=true file="extend" label="*mouse" type="call" ignore=true
@return

//游戏过程中的滚轮事件
*mouse
//向下时等于点击
@sendsystemevent name="click"
@return

//texttag 事件
//当脚本中出现【文字】时，会call这个标签
//在本游戏中，用作创建并显示姓名框，和姓名文字精灵。
//当文字为"$"时，显示主角姓名
*texttag
##
//判断是否是第一行，如果是的话就将flag设为否，否则换行
if(f.firstline){
	f.firstline=false;
}else{
	History.reline();
}

//判断是不是要显示主角姓名。若为真，则将tag替换成姓名
if(tag=='$'){
	//判断是否在回想，若为真，只用临时变量，否则使用当前存档变量
	if(tf.isRecall){
		tag=tf.name;
	}
	else{
		tag=f.lastName+f.firstName;	
	}
}
##
//判断是否显示的是空字符，如果是就移除姓名框并返回
@if "tag==''"
	@remove index=sf.nameboxId cond="Sprite(sf.nameboxId).type"
	@return
@endif

//判断姓名框是否存在，如果不存在的话就创建
@if "Sprite(sf.nameboxID).type===void"
	@sprite index=sf.nameboxId file="system/messagebox/namebox" rect=[0,0,1280,493]
@endif

//设置文字精灵的间距
##
//间距和文字长度成反比
var interval=(150-30*tag.length)/(tag.length-1);
var indent;
//如果文字长度为2则减少间距并在前面加上一个空格
//如果文字长度为1则前面加上２个全角空格
if(tag.length==2){
	interval-=70;
	indent=' ';
}else if(tag.length==1){
	indent='　　';
}

//将"【姓名】" 添加到历史记录
History.add('【' +tag+'】',true);
##
//创建精灵
@textsprite index=sf.nametextId text=indent+tag xinterval=interval size=30 color=0 font='font/NotoSansCJKsc-Regular'

//将文字精灵添加到姓名框中
@addto index=sf.nametextId target=sf.nameboxId pos=[135,442]

//将姓名框添加到文字层上
@addto index=sf.nameboxId target=message_layer zorder=-14
@return

//设置对话框的宏
*basic_dialogbox
//设定文字层的位置, pos为文本层的锚点在基础层的坐标，rect为文字显示区域， xinterval为字与字之间的间距，yinterval为行距，opacity为文字层的透明度
[textwindow pos=[0,0] rect=[127,526,1030,133] xinterval=1 yinterval=7 opacity=255]
//将文字大小设为28,不粗体
[textstyle size=28 bold=false]

//创建文本框的背景精灵，并添加到文字层上
[sprite index=9000 file="system/messagebox/messagebox"]
[addto index=9000 target=message_layer zorder=-13 pos=[0,0] opacity=255]

//创建按钮
//储存，读取，回顾，自动，快进，系统

//按钮坐标数组
#var button_pos=[ [719,680],[795,680],[871,680],[947,680],[1023,680],[1099,680] ];

//按钮单击事件
#var onclicks=[ ["*save",'system_sl','call',,,%[condition: "!tf.isRecall", ignore:true]] , ["*load",'system_sl','call',,,%[condition: "!tf.isRecall", ignore:true]] ,["*enter",'system_history','call',,,%[ignore:true, condition:"System.stable"]], [ , ,"callback","System.autoMode=true"],[ , ,"callback","System.skipMode=true"], ["*main","system_option","call",,,%[ignore:true]]]

@for var=i range=range(1,7)//生成for循环。其中range(1,7)=[1,2,3,4,5,6]
	//在这个循环中会依次的将01到06号按钮生成并添加到底层上
	@button index=9000+i idle='system/messagebox/button/m_button_0'+i click='system/messagebox/button/m_button_on_0'+i hover='system/messagebox/button/m_button_on_0'+i threshold=0 onclick=onclicks[i-1]//创建按钮精灵
	//将按钮精灵添加到底层上
	@addto target=9000 index=9000+i pos=button_pos[i-1] zorder=0
@next
//在这里建立鼠标滚轮事件，向上滚进入历史界面
@enable_dialogbox
[return]

//选择宏
//修改自教程extend文件下的select宏
*select
//@savepoint

//用来确认输入的格式正确，如果错误就会在命令行中报错并结束这个宏
@if "typeof(text)!='array'"
	#log("select：text参数需要一个数组");
	@return false
@elseif "typeof(label)!='array'"
	#log("select：label参数需要一个数组");
	@return false
@elseif "text.size!=label.size"
	#log("select：text和label元素数目应该相同");
	@return false
@elseif "labelFile.size!=label.size"
	#log("select：labelFile和label元素数目应该相同");
	@return false
@endif
#var size = label.size;
@if "size < 2"
#log("select：选择支数量应该不小于2");
	@return false
@endif

//选项创建从这里开始
//获取 选项数*5 个空编号
#var indexes = [];
@idlesp get=indexes num=size*5

#var success = true;
#var info1 = %[];
//获取文件的信息，并检查文件是否存在
@info file='selbutton' get=info1
@if "!info1.size"
	#log("select：file文件不存在：" + file);
	@return false
@endif

#var zorder;
@zorder index=message_layer get=zorder
#tf.curi=0;

//创建动作队列，当每一个按钮被创建后，他的显示动作会被添加到这个队列中
@action mode="queue"
@for var=i range=range(size)
	//创建idle 和 hover 状态的底层
	@sprite index=indexes[i*5] file='selbutton'
	@sprite index=indexes[i*5+1] file='selbutton_on'
	
	//创建文字精灵并调整他们的锚点
	//因为同一个文字精灵只能加到一个底层上，所以这里直接创建了2个文子精灵
	@textsprite index=indexes[i*5+2] text=text[i] color=0x0
	@anchor index=indexes[i*5+2] set="center"
	@textsprite index=indexes[i*5+3] text=text[i] color=0x0
	@anchor index=indexes[i*5+3] set="center"
	
	//将文字精灵添加到按钮底层上
	@addto index=indexes[i*5+2] target=indexes[i*5] pos=[info1.width/2, info1.height/2]
	@addto index=indexes[i*5+3] target=indexes[i*5+1] pos=[info1.width/2, info1.height/2+2] 
	
	//用两个按钮底层生成按钮。
	//这里的事件流程如下：
	//在按钮被按下时，保存哪个按钮被选择，然后跳转到选择结束标签
	@buttonex index=indexes[i*5+4] idle=indexes[i*5] hover=indexes[i*5+1] onclick=["*_selectend",'extend','jump',"tf.curi=curi",%[curi:i],%[ignore:true]]
	
	//获取这个新按钮的信息
	#var info2 = %[]
	@infoex index=indexes[i*5+4] get=info2
	//计算这个按钮的新坐标，并以透明的状态添加到底层上
	#var winsize = System.resolutionSize;
	#var w = ( winsize[0] - info2.width ) / 2;
	#var h = ( winsize[1] - info2.height * size - ( size-1 ) * 50 ) / 2;
	@addto index=indexes[i*5+4] target=basic_layer zorder=zorder pos=[w, h + i * ( 50 + info2.height )] opacity=0
	
	//将显示这一动作添加到动作列表中，此处的动作作用是将按钮的透明度从0变到255
	@action mode="fadeto" opacity=255 time=400 target=indexes[i*5+4]
//进行下一次循环
@next

//当一切动作添加完毕后开始执行动作队列
@action mode="start" target=basic_layer

//等待用户点击
@waitbutton
//返回
@return true

//选择结束标签
*_selectend
//如果有音效则播放音效
@if "se!=void"
@se file=se channel=0
@endif

//让按钮消失
@for var=i range=range(size)
	@action mode="fadeto" opacity=0 target=indexes[i*5+4] time=500
@next
//等待其中一个动作解释（因为每个动作都是一样长的，所以理论上来说应该同时结束）
@waitaction index=indexes[4]
//清除工作
@for var=i range=range(size)
	@remove index=indexes[i*5+4] delete=true
@next


//跳转到按钮对应的标签
//因为是call进来的，所以要用returnto 而不是 jump
@returnto label=label[tf.curi] file=labelFile[tf.curi]