//話す機能
class MyBaseEvent{
	constructor(){
		this.eventList = [];	//イベントデータリスト
		this.eventIndex = -1;	//実行インデックス
		this.waitIndex = -1;	//実行次実行待ちインデックス
		//データ構造イデックス
		var index = 0;
		this.ID = index++;
		this.JudgePos = index++;
		this.Before = index++;
		this.Message = index++;
		this.ImageGo = 1;
		this.Excute = index++;
		this.After = index++;
		this.End = index++;
		//保存データ
		this.Flg = [];
		this.EndFlg = [];
		this.LoadFunction = null;
		this.LastEventNo = null;
		this.EventSkip = false;
	}
	
	//データ構造取得
	getEventDataStruct(){
		var evData = [
			//イベント番号
			-1,
			//判定場所
			-1,
			//イベント実行判定&前処理
			function(){return true;},
			//イベントメッセージ
			[""],
			//イベント中処理
			function(){return true;},
			//イベント後処理
			function(){return true;},
			//イベント終了
			false,
		];
		
		return evData;
	}
	
	//イベント追加
	addBaseEvent(evData){
		myBE.EndFlg[evData[myBE.ID]] = evData[myBE.End];
		myBE.eventList.push(evData);
	}
	
	//イベントNoからイベント取得
	getBaseEvent(evNo){
		for(var loop in myBE.eventList){
			var myNo = myBE.eventList[loop][myBE.ID];
			if(evNo == myNo)return myBE.eventList[loop];
		}
		return false;
	}
	
	//実行可能イベント検索
	serchExecuteEvent(){
		myProc.LoadFlg = false;
		for(var loop in myBE.eventList){
			var pos = myBE.eventList[loop][myBE.JudgePos];
			var exeFlg = myBE.eventList[loop][myBE.Before](pos);
			var endFlg = myBE.eventList[loop][myBE.End];
			if(exeFlg&&(!endFlg))return loop;
		}
		return false;
	}
	
	//イベント実行
	excuteEvent(exeNo){
		//実行中なら待つ
		if(myBE.eventIndex!==-1){
			_self.setTimer(myBE.excuteEvent,100,exeNo);
			if(myBE.waitIndex==-1)myBE.waitIndex = exeNo;
			return;
		}
		//イベント実行判定
		if(myBE.waitIndex == exeNo)myBE.waitIndex = -1;
		var event = myBE.getBaseEvent(exeNo);
		var pos = event[myBE.JudgePos];
		if(!event)return;
		if(event[myBE.Before](pos)){//実行条件を満たしていれば
			if(myProc.talkLock){
				_self.setTimer(myBE.excuteEvent,100,exeNo);
				return;
			}
			myBE.eventIndex = event[myBE.ID];
			myBT.setMessage(event[myBE.Message]);//メッセージ設定
			event[myBE.Excute]();//イベント実行中処理
		}
	}
	
	//イベント終了
	eventEnd(){
		myBE.EventSkip = false;
		if(myBE.eventIndex!==-1){
			var event = myBE.getBaseEvent(myBE.eventIndex);
			if(event[myBE.After]()){
				myBE.eventIndex = -1;
			}
			myBE.EndFlg[event[myBE.ID]] = event[myBE.End];
			this.LastEventNo = event[myBE.ID];
		}else{
			_self.setTimer(eventEnd,100);
		}
	}
	
	//イベントフラグ
	setEventFlg(key,value){
		myBE.Flg[key] = value;
	}
	getEventFlg(key){
		return myBE.Flg[key];
	}
}
myBE = new MyBaseEvent();