//--------------------
//Xe[WVXe
//--------------------

let m_Stage_IsTitle = false;
let m_Stage_IsGameover = false;
let m_Stage_GameoverStep = 0;
let m_Stage_GameoverAlpha = 0;
let m_Stage_YLimitAddition = 300;//ŏ̉op

let m_Stage_CountString = "";
let m_Stage_TitleString = "";
let m_Stage_GameoverString = "";

let m_Stage_CountDrawX = 100;
let m_Stage_TitleDrawX = 100;

let m_Stage_FirstStage = 1;

//Q[JnV[NGX
function wait_Stage_MainSequence()
{

	func_Score_LoadScore();
	main_Title_MainRoutine();

	loop
	{
		if(!func_Stage_IsStatus(_STAGE_TITLE)){ break; }
		yield;
	}

	main_Stage_DrawLimitLines();
	main_Stage_PlayerYLimit();
	loop(60){yield;}

	main_Stage_MainRoutine();

}//

//Xe[Wis̃C[`
task main_Stage_MainRoutine()
{

	let stage = m_Stage_FirstStage;
	TestGameover();
	TestPlayerMiss();

	main_Stage_TestHitCombo();

	func_Enemy_Suspend();
	loop{
		while(OnPlayerMissed()){ yield; }
		func_Stage_SetStatus(_STAGE_LOADING);

		main_Stage_CreateWalls(); //Jx
		loop(30){ yield; }

		while(OnPlayerMissed()){ yield; }
		main_Stage_Initialize(stage);	//Xe[WAǍ

		//Xe[W^Cg
		wait_Stage_StageTitle();

		func_Stage_SetStatus(_STAGE_ONGAME);
		func_Enemy_Resume();//GJn
		loop(120){ yield; }

		WaitClear();//NA҂
		func_Enemy_Suspend();//G~

		loop(60){ yield; }

		//Ug
		if(stage >= 20){ func_Score_SetLastStage(); }
		wait_Score_ResultScene();

		loop(60){ yield; }

		stage++;
		loop(120){ yield; }

		if(stage > 20){ break; }
	}

	func_Stage_Ending();


	//vC[̃~X҂
	task TestPlayerMiss()
	{
		loop
		{
			yield;
			loop
			{
				loop(2){ yield; }
				if(OnPlayerMissed()){break;}
			}
			func_SpecialBeam_Equip(_SPECIALBEAM_NONE);
			while(OnPlayerMissed()) { loop(2){ yield; } }
		}
		
	}

	//NA҂
	function WaitClear()
	{

		loop
		{
			loop(2){yield;}
			if(GetCommonDataDefaultEx("INVADER","Stage.ClearFlag", false)){ break; }
		}
		//main_Effect_EraseShot(GetPlayerX(),GetPlayerY(), 200, 30);

		loop(20){yield;}

		func_Stage_SetStatus(_STAGE_CLEAR);
	}

	//Q[I[o[eXg
	task TestGameover()
	{

		loop
		{
			loop(2){yield;}
			if(GetPlayerLife() < const_PlayerLifeZero){ break; }
			if(GetCommonDataDefaultEx("INVADER","Enemy.OverDeadLine", false)){ 
				ShootDownPlayer();
				break;
			}
			
		}
		func_Enemy_Suspend();
		func_Stage_SetStatus(_STAGE_GAMEOVER);
		wait_Stage_GameOver();

		//main_Stage_TimeStop(600, false);
		loop(120){ yield; }
		
	}

}//end function


//Xe[W̏
function main_Stage_Initialize(let stage)
{
	ForbidBomb(true);

	func_Enemy_Reset();
	SetCommonDataEx("INVADER", "Stage.Count", stage);
	SetCommonDataEx("INVADER", "Stage.ClearFlag", false);
	func_Beam_ResetShotCount();
	func_Score_ResetBonus();
	SetCommonDataEx("INVADER","ScoreBonus.HitComboCount",0);
	SetCommonDataEx("INVADER","ScoreBonus.NagoyaCount",0);

	func_Score_SetContinueDataStart();

	//Xe[W̃[hBGɃXe[Wf[^ĂB
	//Xe[WXNvg疼O̓GĂׂȂ߁Cʂ̓GށB
	CreateEnemyFromFile(GetCommonDataEx("INVADER", "System.Directory.Subscript") ~ "script_stage_manager.txt", 0, 0, 0, 0, stage);

}//end function

//Jx
task main_Stage_CreateWalls()
{

	SetCommonDataEx("INVADER","ScoreBonus.ShieldCount",0);
	local{
		Wall(GetCenterX() - 135);
		Wall(GetCenterX() - 45);
		Wall(GetCenterX() + 45);
		Wall(GetCenterX() + 135);
	}
	return;

	//---------------------------

	function Wall(let base_X){

		ascent(i in 0..4){

			let x = base_X + [-12, -4, 4, 12][i];
			let base_Y = [326, 323, 323, 326][i];

			ascent(j in 0..4){
				let y = base_Y + (j * 8);
				CreateEnemyFromFile(GetCurrentScriptDirectory ~ "subscript\script_barrier.txt", x, y, 0, 0, [true, true, false, false][i]);
			}
			loop(5){yield;}
		}

	}//end function

}//end task

function wait_Stage_StageTitle()
{
	m_Stage_IsTitle = true;
	m_Stage_CountString = "";
	m_Stage_TitleString = "";
	let stage = GetCommonDataDefaultEx("INVADER", "Stage.Count", 1);
	let str_stage = "STAGE " ~ REMY_Math_IntToString(stage, 2);
	let str_title = GetCommonDataDefaultEx("INVADER", "Stage.Name", "NONE");
	m_Stage_CountDrawX = GetCenterX() - (length(str_stage)-1) * 10;
	m_Stage_TitleDrawX = GetCenterX() - (length(str_title)-1) * 10;

	Count();
	Title();

	m_Stage_IsTitle = false;

	function Wait(let wait)
	{
		loop(wait){ yield; }
	}
	
	function Count()
	{
		ascent(i in 0..length(str_stage))
		{
			Wait(12);
			m_Stage_CountString =  slice(str_stage, 0, i + 1);
		}
		Wait(40);
	}
	function Title()
	{
		ascent(i in 0..length(str_title))
		{
			Wait(12);
			m_Stage_TitleString =  slice(str_title, 0, i + 1);
		}
		Wait(40);
	}

}//end function


//Xe[W^Cg̕`
function draw_Stage_StageTitle()
{
	if(!m_Stage_IsTitle){ return; }

	SetGraphicScale(2,2);

	draw_DrawString(m_Stage_CountDrawX, 200, m_Stage_CountString, 20, [255, 255, 255, 255]);
	draw_DrawString(m_Stage_TitleDrawX, 300, m_Stage_TitleString, 20, [255, 255, 255, 255]);

}//end draw

//Q[I[o[
function wait_Stage_GameOver()
{
	let str = "GAME OVER";
	m_Stage_GameoverString = "";
	m_Stage_GameoverStep = 1;
	m_Stage_IsGameover = true;

	func_Score_ResetContinueData();

	main_Stage_TimeStop(330, false);
	loop(60){ yield; }

	change_color();
	ascent(i in 0..length(str))
	{
		m_Stage_GameoverString = slice(str, 0 ,i + 1);
		loop(20){ yield }
	}

	loop(90){ yield; }

	func_Score_ResetContinueData();
	SetClearFrameEffectEnable(false);
	ClearStage();

	//ExtendPlayer(0 - GetPlayerLife());
	//ShootDownPlayer();

	loop(60){ yield; }
	//main_Stage_TimeStop(300, false);


	loop(300){ yield; }

	//-------
	task change_color()
	{
		ascent(i in 1..121)
		{
			m_Stage_GameoverAlpha =  (i / 120);
			yield;
		}
	}

}//end function

//Q[I[o[̕`
function draw_Stage_GameOver()
{
	if(!m_Stage_IsGameover){ return; }

	local
	{
		SetTexture(img_System);

		let col = [55, 255, 255];
		SetAlpha(m_Stage_GameoverAlpha);
		SetRenderState(SUBTRACT);
		SetColor(col[0]* (m_Stage_GameoverAlpha), col[1]* (m_Stage_GameoverAlpha), col[2]* (m_Stage_GameoverAlpha));
		SetGraphicRect(48,0,64,16);
		SetGraphicScale(30, 30);
		DrawGraphic(GetCenterX(), GetCenterY());
	}

	SetRenderState(ALPHA);
	SetGraphicScale(3,3);
	draw_DrawString(100, 200, m_Stage_GameoverString, 30, [255, 255, 55, 55]);


}//end draw

//GfBO
function func_Stage_Ending()
{
	//SetPlayerInvincibility(60);
	main_Ending_MainRoutine();
	//ClearStage();
}//end function



//vC[Y
task main_Stage_PlayerYLimit()
{

	ascent(i in 1..61){

		m_Stage_YLimitAddition = -300 * (1- sin(i / 60 * 90));

		if(GetPlayerY() < const_PlayerYLimit + m_Stage_YLimitAddition)
		{
			SetPlayerY(const_PlayerYLimit + m_Stage_YLimitAddition);
		}
		yield;
	}
	m_Stage_YLimitAddition = 0;

	loop{
		if(GetPlayerY() < const_PlayerYLimit)
		{
			SetPlayerY(const_PlayerYLimit);
		}
		yield;
	}
}//end task


//~bgC
task main_Stage_DrawLimitLines()
{

	LineMovable( [250, 50, 250, 50]);
	Line(const_DefenceLimit, [250, 250, 50, 50]);


	//---------

	function Line(let y, let col){

		let l = GetClipMaxX() - GetClipMinX();
		let obj = REMY_Effect_CreateObject(img_Line, 4, 1);
		ascent(i in 0..4)
		{
			ObjEffect_SetVertexXY(obj, i, [0, l, 0, l][i], [-4, -4, 4, 4][i] );
			ObjEffect_SetVertexUV(obj, i, [0, l, 0, l][i], [0, 0, 8, 8][i] );
			ObjEffect_SetVertexColor(obj,i, col[0], col[1], col[2], col[3]);
		}
		Obj_SetPosition(obj, GetClipMinX(), y);
		ObjEffect_SetScale(obj, 1.0, 1.0);
	}//
	function LineMovable(let col){

		let l = GetClipMaxX() - GetClipMinX();
		let obj = REMY_Effect_CreateObject(img_Line, 4, 1);
		ascent(i in 0..4)
		{
			ObjEffect_SetVertexXY(obj, i, [0, l, 0, l][i], [-4, -4, 4, 4][i] );
			ObjEffect_SetVertexUV(obj, i, [0, l, 0, l][i], [0, 0, 8, 8][i] );
			ObjEffect_SetVertexColor(obj,i, col[0], col[1], col[2], col[3]);
		}
		ObjEffect_SetScale(obj, 1.0, 1.0);

		loop{
			let lineY = const_PlayerYLimit + m_Stage_YLimitAddition;
			Obj_SetPosition(obj, GetClipMinX(), lineY);
			if(m_Stage_YLimitAddition == 0 ){ break; }
			yield;
		}

	}//

}//end task

//qbgR{
task main_Stage_TestHitCombo()
{
	loop{
		loop(5){ yield; }
		func_Score_TestHitCombo();
	}

}//end task

//Xe[^XύXvpeB
function func_Stage_SetStatus(let status)
{
	//ɃQ[I[o[ȂXe[^XςȂ
	if(func_Stage_IsGameover()){ return; }

	SetCommonDataEx("INVADER", "Stage.Status", status);
}

//X^[gXe[W
function func_Stage_SetFirstStage(let stg)
{
	m_Stage_FirstStage = stg;
}//end function

//Q[I[o[ǂ擾
function func_Stage_IsGameover()
{
	return (GetCommonDataDefaultEx("INVADER", "Stage.Status", -1) == _STAGE_GAMEOVER);

}//end function

//Xe[^X`FbN
function func_Stage_IsStatus(let status)
{
	return (GetCommonDataDefaultEx("INVADER", "Stage.Status", -1) == status);
}//return


//Ԓ~
task main_Stage_TimeStop(let time, let wait_input){

	SetCommonDataEx("INVADER", "Stage.TimeStop", true);
	CreateEnemyFromFile(GetCurrentScriptDirectory() ~ "subscript\script_time.txt", 0, 0, 0, 0, time);
	loop(time){ yield; }
	SetCommonDataEx("INVADER", "Stage.TimeStop", false);

}//end function



