//--------------------------
//G̐
//--------------------------


//CommonData : "INVADER","Enemies.Status"	//G̃Xe[^XB
//CommonData : "INVADER","Enemies.Defeated"	//Ǧj
//CommonData : "INVADER","Enemies.PositionX"
//CommonData : "INVADER","Enemies.PositionY"
//CommonData : "INVADER","Enemies.ItemEnergy"

//ړ_
//CommonData : "INVADER","EnemyMovers.Status"	
//CommonData : "INVADER","EnemyMovers.CallBack"	//G炭R[obNVOi
//CommonData : "INVADER","EnemyMovers.PositionX"
//CommonData : "INVADER","EnemyMovers.PositionY"

//CommonData : "INVADER","EnemyMover.TickTime"	
//CommonData : "INVADER","EnemyMover.OnTick"	

let m_TickEnable = false;
let m_TickTime = 0;	//t[̃JE^B
let m_Enemy_StopAllCounter = 0;

task func_Enemy_NextStage()
{
	func_Enemy_Reset();
	
	//REMY_CommonDataArrayEx_Add("INVADER","EnemyMovers.Status", 0);
	//REMY_CommonDataArrayEx_Add("INVADER","EnemyMovers.CallBack", _ENEMYMOVERCALL_NONE);
	//REMY_CommonDataArrayEx_Add("INVADER","EnemyMovers.PositionX", 50);
	//REMY_CommonDataArrayEx_Add("INVADER","EnemyMovers.PositionY", 50);
	//CreateEnemyFromScript("EnemyMover01", 50, 50, 0, 0, 0, [0, 10,10]);
	//CreateEnemyFromFile(GetCommonDataEx("INVADER", "System.Directory.Subscript") ~ "script_stage_manager.txt", 0, 0, 0, 0, 1);

	//m_TickEnable = true;
	//main_Enemy_MainRoutine();

}



//-------------------------------
function func_Enemy_Reset()
{
	//
	SetCommonDataEx("INVADER","Enemy.Count",0);
	SetCommonDataEx("INVADER","Enemy.AliveCount",0);
	SetCommonDataEx("INVADER","EnemyMover.Count", 0);
	SetCommonDataEx("INVADER","Enemy.Defeated",[]);
	SetCommonDataEx("INVADER","Enemy.SpecialItem",[]);

	SetCommonDataEx("INVADER","Enemies.Status",[]);
	SetCommonDataEx("INVADER","Enemies.PositionX",[]);
	SetCommonDataEx("INVADER","Enemies.PositionY",[]);
	SetCommonDataEx("INVADER","Enemies.BeamHit",[]);
	SetCommonDataEx("INVADER","Enemies.ItemEnergy",[]);
	SetCommonDataEx("INVADER","Enemies.ItemType",[]);
	SetCommonDataEx("INVADER","Enemies.Score",[]);
	SetCommonDataEx("INVADER","Enemies.ScoreRate",[]);

	SetCommonDataEx("INVADER","EnemyMovers.Status",[]);
	SetCommonDataEx("INVADER","EnemyMovers.CallBack",[]);
	SetCommonDataEx("INVADER","EnemyMovers.PositionX",[]);
	SetCommonDataEx("INVADER","EnemyMovers.PositionY",[]);
	SetCommonDataEx("INVADER","EnemyMovers.MoveStatus",[]);

	SetCommonDataEx("INVADER","ScoreBonus.LastEnemyDistance",0);

	SetCommonDataEx("INVADER","Missiles.Status",[]);
	SetCommonDataEx("INVADER","Missiles.PositionX",[]);
	SetCommonDataEx("INVADER","Missiles.PositionY",[]);
	SetCommonDataEx("INVADER","Missiles.BeamHit",[]);
	SetCommonDataEx("INVADER","Missile.Count",0);

	SetCommonDataEx("INVADER","EnemyBoss.Score", []);
	m_TickTime = 0;
}


//G̃C[`B
task main_Enemy_MainRoutine()
{
	main_Enemy_TestDefeat();
	main_Enemy_TestBossScore();
	main_Enemy_TestItemAppear();

	let miss_stop = false;
	let bgm_counter =0;
	let tick = false;

	Stop();
	loop{
		OutputDebugString(0, "G̐", GetEnemyNum());

		if(TickTime())
		{
			tick = true;
			Move();
		}
		else if(tick)
		{
			tick = false;
			Stop();
			MissStop();
		}
		
		yield;
	}

	//Ԍo
	function TickTime()
	{
		let t = GetCommonDataDefaultEx("INVADER","EnemyMover.TickTime",60);

		if(m_TickEnable){ m_TickTime++; }
		if(m_TickTime >= t)
		{
			m_TickTime = 0;
			return true;
		}

		return false;

	}//end func

	//삷
	function Move()
	{
		//S~ԂȂJEg炷
		if(m_Enemy_StopAllCounter > 0)
		{
			m_Enemy_StopAllCounter--;
			SetCommonDataEx("INVADER","EnemyMover.StopAll",(m_Enemy_StopAllCounter > 0));
			PlaySE(se_TimeStop);
			return;
		}


		SetCommonDataEx("INVADER","EnemyMover.OnTick", true);

		if(!GetCommonDataDefaultEx("INVADER", "EnemyMover.PlaySE", true)){return;}
		alternative(bgm_counter%4)
		case(0){ PlaySE(se_Bgm01);}
		case(1){ PlaySE(se_Bgm02);}
		case(2){ PlaySE(se_Bgm03);}
		case(3){ PlaySE(se_Bgm04);}
		bgm_counter++;
	}

	//~XɎ~߂
	function MissStop()
	{
		if(!miss_stop && OnPlayerMissed())
		{
			miss_stop = true;
			loop(60){ yield; }
		}
		else
		{
			miss_stop = false;
		}
	}

	//~
	function Stop()
	{
		SetCommonDataEx("INVADER","EnemyMover.OnTick", false);
	}


}//end task

//j`FbN
task main_Enemy_TestDefeat()
{

	loop{

		while(!m_TickEnable){ yield; }
		loop(10){ yield; }
		let changed = false;
		loop{
			let defeat = GetCommonDataDefaultEx("INVADER","Enemy.Defeated", []);

			if(length(defeat) > 0){
				ascent(i in 0..length(defeat))
				{
					PlaySE(se_Defeat);
					func_Enemy_AddScore(defeat[i]);
				}
				SetCommonDataEx("INVADER","Enemy.Defeated", []);
			}

			loop(2){ yield; }
			if(!m_TickEnable){ break; }
		}
	}

}//end task


//{XXRA{[iX`FbN
task main_Enemy_TestBossScore()
{
	loop{
		loop(10){ yield; }
		let score_data = GetCommonDataEx("INVADER","EnemyBoss.Score");
		if(length(score_data) > 0 )
		{
			let x = score_data[0];
			let y = score_data[1];
			let score = score_data[2];
			let scoreRate = score_data[3];
			func_Score_Add(score * scoreRate);
			main_Effect_Score(x, y, score, scoreRate);
			SetCommonDataEx("INVADER","EnemyBoss.Score", []);
		}
	}

}//end task

task main_Enemy_TestItemAppear()
{
	loop{
		loop(10){ yield; }
		let item_data = GetCommonDataEx("INVADER","Enemy.SpecialItem");
		if(length(item_data) > 0 )
		{
			let x = item_data[0];
			let y = item_data[1];
			let type = item_data[2];
			main_Item_CreateSpecial(x, y, type);
			SetCommonDataEx("INVADER","Enemy.SpecialItem", []);
		}
	}

}//end task

//_ǉ
function func_Enemy_AddScore(let enemyID)
{
	let score = REMY_CommonDataArrayEx_Get("INVADER","Enemies.Score", enemyID);
	let scoreRate = REMY_CommonDataArrayEx_Get("INVADER","Enemies.ScoreRate", enemyID);
	REMY_CommonDataArrayEx_Set("INVADER","Enemies.ScoreRate", enemyID, 1);

	let x = REMY_CommonDataArrayEx_Get("INVADER","Enemies.PositionX", enemyID);
	let y = REMY_CommonDataArrayEx_Get("INVADER","Enemies.PositionY", enemyID);

	func_Score_Add(score * scoreRate);
	main_Effect_Score(x, y, score, scoreRate);

	main_Effect_Burst(x, y, [220, 220, 220, 220]);
}//end function


function func_Enemy_StopAll(let val)
{
	m_Enemy_StopAllCounter = val;
}

function func_Enemy_GetStopAllCounter()
{
	return m_Enemy_StopAllCounter;
}

function func_Enemy_Suspend()
{
	m_TickEnable = false;
}

function func_Enemy_Resume()
{
	m_TickEnable = true;
}

