//Xe[Wf[^XNvg02

//Xe[W11
script_enemy Stage11{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "RONDE");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;

	wait_StageStart();

	//G쐬
	CreateEnemies(0);

//	func_SetMoverStatus(0, _MOVESTATUS_VERTICAL);
	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

	wait_ScriptWait(120);

	SetCommonDataEx("INVADER","EnemyMover.TickTime", 30);
	SetCommonDataEx("INVADER","EnemyMover.Level", 0);

	wait_ScriptWait(320);
	CreateEnemies(1);

	wait_ScriptWait(320);
	CreateEnemies(2);

	wait_ScriptWait(320);
	CreateEnemies(3);

	func_SetLevel(1);
	changed = true;

	UFOSequence();

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}

	loop(120){yield;}
	VanishEnemy();
	return;

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

	function CreateEnemies(let idx)
	{
		ascent(j in 0..2){

			let m_id = func_CreateEnemyMover("EnemyMover01", [[GetClipMinX()-10, GetClipMaxX() + 10][j], [220, 160, 100, 40][idx]], [0, [12, -12][j], 17]);
			ascent(i in 0..7){
				let ang = 90 + 360 * (i / 7);
				let type = [_GRA_SHELL, _GRA_SHELL, _GRA_CRAB, _GRA_JELLY][idx];
				func_CreateEnemy(type, m_id, _MOVETYPE_ROUNDTICK, 40, [-20, 20][j], ang);
			}
		}

	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		//NA
		if(alive_enemies_count == 0){ func_ClearStage(); return; }

		if(func_IsLevelOver(1)){
			if(alive_enemies_count <= 1){ changed = func_TestLevelUp(7);}
			else if(alive_enemies_count <= 2){changed = func_TestLevelUp(6); }
			else if(alive_enemies_count <= 4){changed = func_TestLevelUp(5); }
			else if(alive_enemies_count <= 7){changed = func_TestLevelUp(4); }
			else if(alive_enemies_count <= 15){changed = func_TestLevelUp(3); }
			else if(alive_enemies_count <= 24){changed = func_TestLevelUp(2);}
		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [30, 24, 20, 16, 12, 6, 4, 3][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function


	task UFOSequence()
	{
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 240, [1, 0], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 140, [1, 180], [], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(1000);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1, 0], [], _ITEMTYPE_SPREAD);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}
		}

	}


}//end task



#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script

//#######################################################


//Xe[W12
script_enemy Stage12{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "MISSILE");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;

	wait_StageStart();

	//G쐬
	CreateEnemies();
	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);
	func_SetMoverStatus(0, _MOVESTATUS_VERTICAL);

	wait_ScriptWait(120);

	SetCommonDataEx("INVADER","EnemyMover.TickTime", 60);
	func_SetMoverStatus(0, _MOVESTATUS_STOP);

	wait_ScriptWait(120);

	SetCommonDataEx("INVADER","EnemyMover.Level", 0);
	func_SetMoverStatus(0, _MOVESTATUS_NORMAL);

	UFOSequence();
	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	function CreateEnemies()
	{
		//EnemyMover:id 0
		let m_id = func_CreateEnemyMover("EnemyMover01", [40, -195], [0, 10, 18]);

		ascent(i in 0..8){
			ascent(j in 0..4){
				let x = 40 * i;
				let y = 36 * j;
				let type = [_GRA_JELLY, _GRA_CRAB, _GRA_SHELL, _GRA_SHELL][j];
				func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, x, y, 0);
			}
		}


	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		if(alive_enemies_count == 0){ func_ClearStage(); return; }

		if(alive_enemies_count <= 1){ changed = func_TestLevelUp(7);}
		else if(alive_enemies_count <= 2){changed = func_TestLevelUp(6); }
		else if(alive_enemies_count <= 3){changed = func_TestLevelUp(5); }
		else if(alive_enemies_count <= 5){changed = func_TestLevelUp(4); }
		else if(alive_enemies_count <= 10){changed = func_TestLevelUp(3); }
		else if(alive_enemies_count <= 18){changed = func_TestLevelUp(2); }
		else if(alive_enemies_count <= 25){ changed = func_TestLevelUp(1); }

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [60, 48, 34, 20, 12, 6, 4, 2][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function


	task UFOSequence()
	{
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 140, [1, 0], [], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(800);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 160, [1, 180], [], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(800);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 180, [1, 0], [], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(800);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 200, [1, 180], [], _ITEMTYPE_5STAR);

		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}
}//end task


#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script



//#######################################################


//Xe[W13
script_enemy Stage13{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "SHIELD");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;

	wait_StageStart();

	//G쐬
	CreateEnemies();
	CreateShields();

	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);
	func_SetMoverStatus(0, _MOVESTATUS_VERTICAL);

	wait_ScriptWait(115);

	SetCommonDataEx("INVADER","EnemyMover.TickTime", 60);
	func_SetMoverStatus(0, _MOVESTATUS_STOP);

	wait_ScriptWait(120);

	SetCommonDataEx("INVADER","EnemyMover.Level", 0);
	func_SetMoverStatus(0, _MOVESTATUS_NORMAL);

	UFOSequence();
	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	function CreateShields()
	{
		ascent(i in 0..2){
			let x = [GetClipMinX() -30, GetClipMaxX() + 30][i];
			let m_id = func_CreateEnemyMover("EnemyMover01", [x, [300, 280][i]], [1, [2, -1][i], 0]);
			func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
		}

	}//end function


	function CreateEnemies()
	{
		//EnemyMover:id 0
		let m_id = func_CreateEnemyMover("EnemyMover01", [50, -195], [0, 10, 18]);

		ascent(j in 0..6){
			ascent(i in 0..8){
				let x = 30 * (i + [0, 1][i>=4]);
				let y = 36 * j;
				let type = [_GRA_SHELL, _GRA_SHELL, _GRA_CRAB, _GRA_JELLY, _GRA_JELLY, _GRA_CRAB, _GRA_SHELL, _GRA_SHELL][i];
				func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, x, y, 0);
			}
		}


	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 2) - 2;
		if(alive_enemies_count == 0)
		{
			main_DestroyAllEnemy();
			loop(20){yield;}
			func_ClearStage();
			return;
		}

		if(alive_enemies_count <= 1){ changed = func_TestLevelUp(8)}
		else if(alive_enemies_count <= 2){changed = func_TestLevelUp(7) }
		else if(alive_enemies_count <= 4){changed = func_TestLevelUp(6) }
		else if(alive_enemies_count <= 7){changed = func_TestLevelUp(5) }
		else if(alive_enemies_count <= 10){changed = func_TestLevelUp(4) }
		else if(alive_enemies_count <= 18){changed = func_TestLevelUp(3) }
		else if(alive_enemies_count <= 25){changed = func_TestLevelUp(2) }
		else if(alive_enemies_count <= 32){ changed = func_TestLevelUp(1) }

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [54, 42, 30, 20, 16, 10, 6, 4, 2][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function

	task UFOSequence()
	{

		wait_ScriptWaitUFO(200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1.3, 00], [], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(1500);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 40, [1.0, 180], [], _ITEMTYPE_FREEZE);
		wait_ScriptWaitUFO(900);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [0.6, 00], [], _ITEMTYPE_RAPIER);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

}//end task


#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script


//#######################################################


//Xe[W14
script_enemy Stage14{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "RED PANIC");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;

	wait_StageStart();

	//G쐬
	CreateEnemies(0);
	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

	wait_ScriptWait(130);

	SetCommonDataEx("INVADER","EnemyMover.TickTime", 60);
	SetCommonDataEx("INVADER","EnemyMover.Level", 0);

	UFOSequence();
	CreateEnemies(1);

	wait_ScriptWait(320);

	CreateEnemies(2);

	wait_ScriptWait(320);
	func_SetLevel(1);
	changed = true;

	CreateEnemies(3);

	wait_ScriptWait(320);

	CreateEnemies(4);

	func_SetLevel(2);
	changed = true;

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	function CreateEnemies(let id)
	{
		//EnemyMover:id 0
		let y = 333 - 12 * [0, 2, 4, 6, 8][id];
		let m_id = func_CreateEnemyMover("EnemyMover01", [[GetClipMinX() - 40, GetClipMaxX() + 40][id%2], y], [0, 12, 12]);

		ascent(i in 0..9){
			let x = [-34, 34][id % 2] * i;
			let type = [ _GRA_SHELL, _GRA_SHELL, _GRA_CRAB, _GRA_CRAB, _GRA_JELLY][id];
			func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, x, 0, 0);
		}


	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		if(alive_enemies_count == 0){ func_ClearStage(); return; }

		if(func_IsLevelOver(2)){
			if(alive_enemies_count <= 1){ changed = func_TestLevelUp(9); }
			else if(alive_enemies_count <= 2){changed = func_TestLevelUp(8); }
			else if(alive_enemies_count <= 3){changed = func_TestLevelUp(7); }
			else if(alive_enemies_count <= 5){changed = func_TestLevelUp(6); }
			else if(alive_enemies_count <= 12){changed = func_TestLevelUp(5); }
			else if(alive_enemies_count <= 20){changed = func_TestLevelUp(4); }
			else if(alive_enemies_count <= 25){ changed = func_TestLevelUp(3); }
		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [50, 45, 40, 34, 28, 20, 12, 6, 4, 2][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function

	task UFOSequence()
	{

		wait_ScriptWaitUFO(500);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 400);
		CreateUFO(GetClipMaxX()+60, 390, [1, 160],  [60, 1, 160, 60, 1, 200, 60, 1, 160, 60, 1, 200, 60, 1, 160, 60, 1, 200, 60, 1, 160], _ITEMTYPE_FREEZE);
		wait_ScriptWaitUFO(1000);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 360);
		CreateUFO(GetClipMinX()-60, 350, [1, 20], [60, 1, -20, 60, 1, 20, 60, 1, -20, 60, 1, 20, 60, 1, -20, 60, 1, 20, 60, 1, -20], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(1000);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 380);
		CreateUFO(GetClipMaxX()+60, 370, [1, 160],  [60, 1, 160, 60, 1, 200, 60, 1, 160, 60, 1, 200, 60, 1, 160, 60, 1, 200, 60, 1, 160], _ITEMTYPE_FREEZE);
		wait_ScriptWaitUFO(1000);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 400);
		CreateUFO(GetClipMinX()-60, 390, [1, 20],  [60, 1, -20, 60, 1, 20, 60, 1, -20, 60, 1, 20, 60, 1, -20, 60, 1, 20, 60, 1, -20], _ITEMTYPE_5STAR);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}
}//end task


#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script

//#######################################################


//Xe[W15
script_enemy Stage15{


@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "SIDE ATTACK");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){


	wait_StageStart();

	let boss_break = false;
	let changed = false;

	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 600);

	loop(60){ yield; }

	func_SetEffect(_EFFECT_WARNING, 0, 0);

	loop(260){ yield; }

	//G쐬
	CreateBoss();

	wait_ScriptWait(60);
	
	func_SetEffect(_EFFECT_SPELL, 1, 0);
	wait_ScriptWait(120);

	CreateShields();

	SetCommonDataEx("INVADER","EnemyMover.TickTime", 40);
	SetCommonDataEx("INVADER","EnemyMover.Level", 0);

	//UFOSequence();
	EnemySequence();

	loop
	{
		TestEnemyLevel();
		if(boss_break){ break; }
		yield;
	}
	loop(60){ yield; }
	main_DestroyAllEnemy();
	loop(200){ yield; }
	func_ClearStage();
	VanishEnemy();
	return;

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

	task EnemySequence()
	{

		ascent(i in 1..51)
		{
			CreateEnemies(i);
			wait_ScriptWaitUFO(120);
			if(boss_break){ break; }
			if(i % 7 == 0){
				if(!func_IsLevelOver(trunc(i/7))){ func_SetLevel(trunc(i/7)); changed = true; } 
			}
		}

	}

	function CreateBoss()
	{
		let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX(), -20], [ 1, 2, 90, 100, 0, 0]);
		func_CreateEnemy(_GRA_BOSS2, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
		
	}
	function CreateShields()
	{
		ascent(i in 0..2){
			let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX(), 150], [1, 0, 90]);
			func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_ROUND, 100, 0.4, i * 180);
		}

	}//end function

	function CreateEnemies(let id)
	{
		if(func_IsStageCleared()){ return; }

		let m_id;

		local{
			let speed = 4;
			let x = 45 + [15, 345, 75, 285][id%4];
			m_id = func_CreateEnemyMover("EnemyMover01", [x, -10], [ 0, -10, speed]);
		}

		func_CreateEnemy([_GRA_JELLY, _GRA_JELLY, _GRA_CRAB, _GRA_CRAB][id%4], m_id, _MOVETYPE_SLAVE, 0, 0, 0);

		func_SetMoverStatus(m_id, _MOVESTATUS_VERTICAL);

	}//end function

	function TestEnemyLevel()
	{
		let boss_life = GetCommonDataEx("INVADER","EnemyBoss.Life");
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		if(boss_life <= 00){
			changed = func_TestLevelUp(9);
			boss_break = true;
		}

		if(!changed){
			if(boss_life <= 100){ changed = func_TestLevelUp(8);}
			else if(boss_life <= 200){changed = func_TestLevelUp(7); }
			else if(boss_life <= 300){changed = func_TestLevelUp(6); }
			else if(boss_life <= 500){changed = func_TestLevelUp(5); }
			else if(boss_life <= 700){changed = func_TestLevelUp(4); }
			else if(boss_life <= 900){changed = func_TestLevelUp(3); }
			else if(boss_life <= 1100){changed = func_TestLevelUp(2); }
			else if(boss_life <= 1300){ changed = func_TestLevelUp(1); }
		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [40, 36, 32, 28, 24, 20, 16, 12, 8, 100000][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			UFOSequence(func_GetLevel());
			changed = false;

		}

    }//end function

	task UFOSequence(let type)
	{
		if(func_IsStageCleared()){ return; }

		alternative(type)
		case(1){ CreateUFO(GetCenterX(), 150, [1.5, 25], [90, 0.2, 25, 60, 1.5, 180], _ITEMTYPE_5STAR); }
		case(2){ CreateUFO(GetCenterX(), 150, [1.5, 155], [90, 0.2, 155, 60, 1.5, 0], _ITEMTYPE_SPREAD); }
		case(3){ CreateUFO(GetCenterX(), 150, [1.5, 25], [90, 0.2, 25, 60, 1.5, 180], _ITEMTYPE_ERASE); }
		case(4){ CreateUFO(GetCenterX(), 150, [1.5, 155], [90, 0.2, 155, 60, 1.5, 0], _ITEMTYPE_RAPIER); }
		case(5){ CreateUFO(GetCenterX(), 150, [1.5, 25], [90, 0.2, 25, 60, 1.5, 180], _ITEMTYPE_FREEZE); }
		case(6){ CreateUFO(GetCenterX(), 150, [1.5, 155], [90, 0.2, 155, 60, 1.5, 0], _ITEMTYPE_5STAR); }
		case(7){ CreateUFO(GetCenterX(), 150, [1.5, 25], [90, 0.2, 25, 60, 1.5, 180], _ITEMTYPE_5STAR); }
		case(8){ CreateUFO(GetCenterX(), 150, [1.5, 155], [90, 0.2, 155, 60, 1.5, 0], _ITEMTYPE_RAPIER); }

		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}


}//end task


#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script



//#######################################################


//Xe[W16
script_enemy Stage16{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "TOWERS");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;

	wait_StageStart();

	//G쐬
	EnemySequence();
	UFOSequence();

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	task EnemySequence()
	{

		SetCommonDataEx("INVADER","EnemyMover.Level", -1);
		SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

		CreateEnemies(0);

		wait_ScriptWait(160);

		SetCommonDataEx("INVADER","EnemyMover.Level", 0);
		SetCommonDataEx("INVADER","EnemyMover.TickTime", 56);

		wait_ScriptWait(100);

		CreateEnemies(1);

		wait_ScriptWait(150);

		CreateEnemies(2);

		wait_ScriptWait(150);
		func_SetLevel(1);
		changed = true;
		CreateEnemies(3);

		wait_ScriptWait(100);
		CreateEnemies(4);

		wait_ScriptWait(100);

		CreateEnemies(5);

		wait_ScriptWait(100);

		CreateEnemies(6);

		wait_ScriptWait(100);
		func_SetLevel(2);
		changed = true;
		CreateEnemies(7);


	}//end task


	task CreateEnemies(let id)
	{
		let m_id;
		local{
			//EnemyMover:id 0
			let y = 41 + trunc(id/2) * 32;
			let x = [GetClipMaxX() + 30, GetClipMinX() - 30][id % 2];
			m_id = func_CreateEnemyMover("EnemyMover01", [x, y], [0, [-10, 10][id % 2], 16]);
		}

		ascent(i in 0..5){
			let y = i * 32;
			let type = [_GRA_SHELL, _GRA_SHELL, _GRA_CRAB,_GRA_JELLY ][id % 4];
			func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, 0, y, 0);
		}

		func_SetMoverStatus(m_id, _MOVESTATUS_NORMAL);


	}//end task

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);

		if(!changed && func_IsLevelOver(2)){
			if(alive_enemies_count == 0){ func_ClearStage(); return; }

			if(alive_enemies_count <= 1){ changed = func_TestLevelUp(8); }
			else if(alive_enemies_count <= 2){changed = func_TestLevelUp(7); }
			else if(alive_enemies_count <= 5){changed = func_TestLevelUp(6); }
			else if(alive_enemies_count <= 10){changed = func_TestLevelUp(5); }
			else if(alive_enemies_count <= 18){changed = func_TestLevelUp(4); }
			else if(alive_enemies_count <= 25){changed = func_TestLevelUp(3); }

		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [56, 48, 34, 26, 18, 13, 8, 4, 2][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function

	task UFOSequence()
	{

		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()+90, -40, [1, 45], [60,1,135,60,1,45,60,1,135,60,1,45,60,1,135,60,1,45,60,1,135,60,1,45], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()-90, -50, [1, 135], [60,1,45,60,1,135,60,1,45,60,1,135,60,1,45,60,1,135,60,1,45,60,1,135], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetCenterX()+60, -60, [1, 45], [60,1,135,60,1,45,60,1,135,60,1,45,60,1,135,60,1,45,60,1,135,60,1,45], _ITEMTYPE_FREEZE);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

}//end task

#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script



//#######################################################


//Xe[W17
script_enemy Stage17{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "GATE KEEPER");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;
	let vacula_count = 0;

	wait_StageStart();

	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 300);


	//G쐬
	//CreateEnemies();
	CreateShields();
	EnemySequence();
	UFOSequence();

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	function CreateShields()
	{
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 420);
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 380);
		loop(60){ yield; }

		ascent(i in 0..2){
			let x = [GetClipMinX() - 30, GetClipMaxX() + 30][i];
			let m_id = func_CreateEnemyMover("EnemyMover01", [x, [420, 380][i]], [1, [0.5, -0.5][i], 0]);
			func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
		}

	}//end function

	task EnemySequence()
	{

		SetCommonDataEx("INVADER","EnemyMover.Level", -1);
		SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

		CreateEnemies(0, GetCenterX() - 40, 250);

		wait_ScriptWait(100);

		SetCommonDataEx("INVADER","EnemyMover.TickTime", 40);
		SetCommonDataEx("INVADER","EnemyMover.Level", 0);

		wait_ScriptWait(120);
		CreateEnemies(0, GetCenterX() - 60, 220);
		CreateEnemies(0, GetCenterX() + 60, 250);

		wait_ScriptWait(200);

		func_SetLevel(1);
		changed = true;
		CreateEnemies(0, GetCenterX() + 0, 160);
		CreateEnemies(0, GetCenterX() - 80, 190);

		wait_ScriptWait(200);
		CreateEnemies(1, GetCenterX() + 60, 220);
		func_SetLevel(2);
		changed = true;

		wait_ScriptWait(250);
		CreateEnemies(1, GetCenterX() - 140, 160);
		CreateEnemies(1, GetCenterX() + 100, 160);
		CreateEnemies(0, GetCenterX() - 10, 190);

		wait_ScriptWait(250);
		func_SetLevel(3);
		changed = true;
		CreateEnemies(1, GetCenterX() + 000, 130);
		CreateEnemies(0, GetCenterX() - 120, 220);
		CreateEnemies(0, GetCenterX() + 120, 190);

		wait_ScriptWait(450);
		func_SetLevel(4);
		changed = true;
		CreateEnemies(2, GetCenterX() + 000, 100);
		CreateEnemies(1, GetCenterX() + 80, 130);
		CreateEnemies(0, GetCenterX() - 40, 190);
		CreateEnemies(0, GetCenterX() - 120, 220);

		wait_ScriptWait(450);
		func_SetLevel(5);
		changed = true;
		CreateEnemies(2, GetCenterX() + 020, 100);
		CreateEnemies(2, GetCenterX() - 020, 70);
		CreateEnemies(1, GetCenterX() - 60, 190);
		CreateEnemies(1, GetCenterX() + 40, 190);
		CreateEnemies(0, GetCenterX(), 210);

	}//end task


	task CreateEnemies(let id, let basex, let basey)
	{
		let vaculas = [];
		let gatekeepers = [];
		let enemies = 1;//id + 1;

		let m_id;
		//EnemyMover:id 0
		m_id = func_CreateEnemyMover("EnemyMover01", [basex, -40], [ 0, [-10, 10][basex > GetCenterX()], 30]);

		let x = - (enemies + 2) * 18 ;
		vaculas = vaculas ~ [func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_SLAVE, x+10, 10, 0)];
		ascent(i in 0..enemies){
			x += 36;
			let type = [_GRA_SHELL, _GRA_CRAB, _GRA_JELLY, _GRA_JELLY ][id % 6];
			gatekeepers = gatekeepers ~ [func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, x, 0, 0)];
		}
		x += 36;
		vaculas = vaculas ~ [func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_SLAVE, x-10, 10, 0)];

		testVaculas();
		testVerticalMove();

		task testVerticalMove()
		{
			func_SetMoverStatus(m_id, _MOVESTATUS_VERTICAL);
			loop
			{
				loop(2){ yield; }
				if(REMY_CommonDataArrayEx_Get("INVADER", "EnemyMovers.PositionY", m_id) > basey)
				{
					break;
				}
			}
			func_SetMoverStatus(m_id, _MOVESTATUS_NORMAL);
		}

		//Q[gL[p[̔j`FbN
		task testVaculas()
		{
			vacula_count +=2;
			loop
			{
				let alive = false;
				ascent(i in 0..length(gatekeepers)){
					alive = alive || (REMY_CommonDataArrayEx_Get("INVADER", "Enemies.Status", gatekeepers[i]) == _ENEMY_ALIVE);
				}
				if(!alive)
				{
					ascent(i in 0..length(vaculas))
					{
						REMY_CommonDataArrayEx_Set("INVADER", "Enemies.Status", vaculas[i], _ENEMY_DEAD);
					}
					break;
				}
				loop(5){ yield; }
			}
			vacula_count -=2;

		}

	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0)- vacula_count - 2;

		if(!changed && func_IsLevelOver(5)){
			if(alive_enemies_count == 0){
				main_DestroyAllEnemy();
				loop(20){yield;}
				func_ClearStage();
				return;
			}

			if(alive_enemies_count <= 1){ changed = func_TestLevelUp(8); }
			else if(alive_enemies_count <= 2){changed = func_TestLevelUp(7); }
			else if(alive_enemies_count <= 5){changed = func_TestLevelUp(7); }

		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [40, 35, 30, 26, 20, 14, 10, 7, 3][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function


	task UFOSequence()
	{

		wait_ScriptWaitUFO(300);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetCenterX()+60, -60, [1, 120], [], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(900);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetCenterX()-60, -60, [1, 60], [], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(900);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX() + 40, -60, [1, 90], [490, 0.2, 90, 60, 1, 0], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX() - 40, -60, [1, 90], [470, 0.2, 90, 60, 1, 180], _ITEMTYPE_5STAR);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

}//end task


#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script


//#######################################################


//Xe[W18
script_enemy Stage18{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "VENTRA VENTRA");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;
	let base_tick = 60;
	let tick_count = -1;

	wait_StageStart();

	//G쐬
	EnemySequence();
	UFOSequence();

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	task EnemySequence()
	{

		SetCommonDataEx("INVADER","EnemyMover.Level", -1);
		SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

		CreateEnemies();
		func_SetMoverStatus(0, _MOVESTATUS_VERTICAL);

		wait_ScriptWait(200);

		SetCommonDataEx("INVADER","EnemyMover.TickTime", 60);
		SetCommonDataEx("INVADER","EnemyMover.Level", 0);

		func_SetMoverStatus(0, _MOVESTATUS_STOP);

		wait_ScriptWait(50);

		func_SetMoverStatus(0, _MOVESTATUS_NORMAL);

	}//end task


	function CreateEnemies()
	{

		//EnemyMover:id 0
		let m_id = func_CreateEnemyMover("EnemyMover01", [200, -180], [0, 10, 13]);

		ascent(i in 0..4){
			let enemy_num = [5, 9, 13, 19][i];
			ascent(j in 0..enemy_num){
				let rad = 32 + 26 * i;
				let vang = [14, 12, 10, 8][i] * [1, -1][i % 2];
				let fang = 360 * (j/ enemy_num) + vang * i;
				let type = [_GRA_JELLY, _GRA_CRAB, _GRA_SHELL, _GRA_SHELL][i];
				func_CreateEnemy(type, m_id, _MOVETYPE_ROUNDTICK, rad, vang, fang);
			}
		}


	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		if(alive_enemies_count == 0){ func_ClearStage(); return; }

		if(alive_enemies_count <= 1){changed = func_TestLevelUp(7);}
		else if(alive_enemies_count <= 2){changed = func_TestLevelUp(6); }
		else if(alive_enemies_count <= 6){changed = func_TestLevelUp(5); }
		else if(alive_enemies_count <= 10){changed = func_TestLevelUp(4); }
		else if(alive_enemies_count <= 20){changed = func_TestLevelUp(3); }
		else if(alive_enemies_count <= 32){changed = func_TestLevelUp(2); }
		else if(alive_enemies_count <= 43){changed = func_TestLevelUp(1); }

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [60, 55, 42, 34, 28, 16, 10, 5][func_GetLevel()] );
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel()) ;
			changed = false;
		}

    }//end function

	//
	task UFOSequence()
	{

		wait_ScriptWaitUFO(500);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-10, 260, [1, 0], [], _ITEMTYPE_FREEZE);
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 380);
		CreateUFO(GetClipMaxX()+10, 370, [1, 180], [], _ITEMTYPE_FREEZE);

		wait_ScriptWaitUFO(500);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1, 0], [350, 0.2, 00, 60, 1.5, 90], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 40, [1, 180], [350, 0.2, 180, 60, 1.5, 90], _ITEMTYPE_RAPIER);

		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()+190, -40, [2, 70], [235, 0.2, 70, 60, 1.5, 180], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()-190, -40, [2, 110], [215, 0.2, 110, 60, 1.5, 0], _ITEMTYPE_ERASE);
		wait_ScriptWaitUFO(400);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()-190, -40, [2, 110], [210, 0.2, 110, 60, 1.5, 0], _ITEMTYPE_SPREAD);
		wait_ScriptWaitUFO(200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()+190, -40, [2, 70], [225, 0.2, 70, 60, 1.5, 180], _ITEMTYPE_SPREAD);

		wait_ScriptWaitUFO(500);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 370);
		CreateUFO(GetClipMinX()-60, 360, [1.0, 0], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 390);
		CreateUFO(GetClipMinX()-60, 380, [1.2, 0], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 410);
		CreateUFO(GetClipMinX()-60, 400, [1.4, 0], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMinX() + 20, 430);
		CreateUFO(GetClipMinX()-60, 420, [1.4, 0], [], _ITEMTYPE_5STAR);

		wait_ScriptWaitUFO(300);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 430);
		CreateUFO(GetClipMaxX()+60, 420, [1.0, 180], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 370);
		CreateUFO(GetClipMaxX()+60, 360, [1.2, 180], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 410);
		CreateUFO(GetClipMaxX()+60, 400, [1.4, 180], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(10);
		if(func_IsStageCleared()){ return; }
		func_SetEffect(_EFFECT_CAUTION, GetClipMaxX() - 20, 390);
		CreateUFO(GetClipMaxX()+60, 380, [1.4, 180], [], _ITEMTYPE_5STAR);
		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

}//end task



#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script



//#######################################################


//Xe[W19
script_enemy Stage19{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "FORTRESS");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;
	let base_tick = 60;
	let tick_count = -1;

	wait_StageStart();

	//G쐬
	EnemySequence();
	UFOSequence();

	loop
	{
		TestEnemyLevel();
		if(func_TestStageClear()){ break; }
		yield;
	}
	loop(120){yield;}
	VanishEnemy();
	return;

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

	task EnemySequence()
	{

		SetCommonDataEx("INVADER","EnemyMover.Level", -1);
		SetCommonDataEx("INVADER","EnemyMover.TickTime", 8);

		CreateEnemies();
		func_SetMoverStatus(0, _MOVESTATUS_VERTICAL);

		wait_ScriptWait(140);

		SetCommonDataEx("INVADER","EnemyMover.TickTime", 60);
		SetCommonDataEx("INVADER","EnemyMover.Level", 0);
		func_SetMoverStatus(0, _MOVESTATUS_STOP);
		wait_ScriptWait(60);

		func_SetMoverStatus(0, _MOVESTATUS_NORMAL);


	}//end task


	function CreateEnemies()
	{
		//EnemyMover:id 0
		let m_id = func_CreateEnemyMover("EnemyMover01", [70, -175], [0, 10, 14]);

		ascent(i in 0..11){
			ascent(j in 0..5){
				let x = 28 * i;
				let y = 28 * j;
				let type = [_GRA_JELLY, _GRA_CRAB, _GRA_CRAB, _GRA_SHELL, _GRA_SHELL][j];
				func_CreateEnemy(type, m_id, _MOVETYPE_SLAVE, x, y, 0);
			}
		}

	}//end function

	function TestEnemyLevel()
	{
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);

		if(alive_enemies_count == 0){ func_ClearStage(); return; }

		if(alive_enemies_count <= 1){ changed = func_TestLevelUp(8);}
		else if(alive_enemies_count <= 2){ changed = func_TestLevelUp(7); }
		else if(alive_enemies_count <= 4){ changed = func_TestLevelUp(6); }
		else if(alive_enemies_count <= 6){ changed = func_TestLevelUp(5); }
		else if(alive_enemies_count <= 12){ changed = func_TestLevelUp(4); }
		else if(alive_enemies_count <= 24){ changed = func_TestLevelUp(3); }
		else if(alive_enemies_count <= 36){ changed = func_TestLevelUp(2); }
		else if(alive_enemies_count <= 48){ changed = func_TestLevelUp(1); }

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [ 56, 48, 40, 30, 20, 10, 6, 4, 2][func_GetLevel()] );
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel()) ;
			changed = false;
		}

    }//end function

	task UFOSequence()
	{

		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1, 0], [], _ITEMTYPE_5STAR);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 40, [1, 180], [], _ITEMTYPE_FREEZE);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1, 0], [], _ITEMTYPE_SPREAD);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMaxX()+60, 40, [1, 180], [], _ITEMTYPE_RAPIER);
		wait_ScriptWaitUFO(1200);
		if(func_IsStageCleared()){ return; }
		CreateUFO(GetClipMinX()-60, 40, [1, 0], [], _ITEMTYPE_ERASE);

		//----------------
		function CreateUFO(let x, let y, let move_param, let move_seq, let item)
		{
			func_SetEffect(_EFFECT_UFO, 0, 0);
			wait_ScriptWaitUFO(100);
			if(func_IsStageCleared()){ return; }

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

}//end task



#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script



//#######################################################


//Xe[W20
//{XR
script_enemy Stage20{

@Initialize{
	SetCommonDataEx("INVADER","Stage.Name", "EVERLASTING INVADER");
	SetLife(100000);
	main_MainRoutine();
}

@MainLoop
{
	SetLife(100000);
	yield;
}
@DrawLoop{}
@Finalize{}

task main_MainRoutine(){

	let changed = false;
	let lastboss = false;
	let lastboss_defeated = false;
	let base_tick = 60;

	let ufo_count = 0;

	let bgm00 = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\chi.wav";
	let bgm01 = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\bgm1_boss3.wav";
	let bgm02 = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\bgm2_boss3.wav";
	let bgm03 = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\bgm3_boss3.wav";
	let bgm04 = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\bgm4_boss3.wav";

	wait_StageStart();

	//G쐬
	SetCommonDataEx("INVADER","EnemyMover.Level", -1);
	SetCommonDataEx("INVADER","EnemyMover.TickTime", 600);
	loop(60){ yield; }

	func_SetEffect(_EFFECT_WARNING, 0, 0);

	loop(260){ yield; }

	EnemySequence();

	loop(260){ yield; }
	loop
	{
		TestEnemyLevel();
		if(lastboss){ break; }
		yield;
	}
	EnemyBurst();

	main_DestroyAllEnemy();

	SetCommonDataEx("INVADER", "EnemyMover.PlaySE", false);

	wait_ScriptWait(210);

	SetCommonDataEx("INVADER","Enemy.SpecialItem", [GetCenterX(), 150, _ITEMTYPE_1UP]);

	wait_ScriptWait(100);

	func_SetEffect(_EFFECT_WARNING, 0, 0);
	wait_ScriptWait(300);

	wait_ScriptWait(60);
	
	func_SetEffect(_EFFECT_SPELL, 3, 0);
	wait_ScriptWait(120);

	CreateBoss2();
	func_SetLevel(0);;
	changed = true;

	TickSequence();

	loop(120){ yield; }
	CreateBattery();

	loop
	{
		TestEnemyLevel2();
		if(func_IsStageCleared()){ break; }
		yield;
	}
	Slow(1);
	EnemyBurst();

	main_DestroyAllEnemy();
	wait_ScriptWait(120);

	Slow(0);
	loop(120){yield;}
	VanishEnemy();
	return;

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

	task EnemySequence()
	{

		CreateBoss();
		wait_ScriptWait(60);
		
		func_SetEffect(_EFFECT_SPELL, 2, 0);
		wait_ScriptWait(120);
		

		CreateShields();
		CreateEnemies();

		wait_ScriptWait(120);

		SetCommonDataEx("INVADER","EnemyMover.TickTime", 40);
		SetCommonDataEx("INVADER","EnemyMover.Level", 0);

		wait_ScriptWait(120);
		func_SetLevel(1);
		changed = true;

	}//end task

	function CreateBoss()
	{
		let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX(), -20], [ 1, 2, 90, 100, 0, 0]);
		func_CreateEnemy(_GRA_BOSS3, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
		
	}

	function CreateBoss2()
	{
		let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX(), -20], [ 1, 2, 90, 100, 0, 0]);
		func_CreateEnemy(_GRA_BOSS4, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
		
	}

	function CreateBattery()
	{
		let battery_num = 18;
		ascent(i in 0..battery_num){
			let baseX = GetClipMinX() + (i / battery_num) * (GetClipMaxX() - GetClipMinX());
			let baseY = -100 + 20 * (i % 5 + i % 3);
			let m_id = func_CreateEnemyMover("EnemyMover02", [baseX, baseY], [ 1, 2, 90, 100, 0, 0]);
			func_CreateEnemy(_GRA_BATTERY, m_id, _MOVETYPE_SLAVE, baseX, baseY, i);
		}

	}//end function

	function CreateShields()
	{
		ascent(i in 0..2){
			let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX() + 80, 200], [1, 0, 90]);
			func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_ROUND, 80, 1.2, 45 + i * 180);
		}
		ascent(i in 0..2){
			let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX() - 80, 200], [1, 0, 90]);
			func_CreateEnemy(_GRA_VACULA, m_id, _MOVETYPE_ROUND, 80, -1.2, -45 + i * 180);
		}

	}//end function

	function CreateEnemies()
	{
		local{
			let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX() + 80, 200], [ 1, 0, 90]);
			ascent(i in 0..9){
				let ang = 360 * i/9;
				let type = [ _GRA_SHELL, _GRA_CRAB, _GRA_JELLY][i % 3];
				func_CreateEnemy(type, m_id, _MOVETYPE_ROUNDTICK, 60, 5, ang);
			}
		}
		local{
			let m_id = func_CreateEnemyMover("EnemyMover02", [GetCenterX() - 80, 200], [ 1, 0, 90]);
			ascent(i in 0..9){
				let ang = 360 * i/9;
				let type = [ _GRA_SHELL, _GRA_CRAB, _GRA_JELLY][i % 3];
				func_CreateEnemy(type, m_id, _MOVETYPE_ROUNDTICK, 60, -5, ang);
			}
		}


	}//end function

	function TestEnemyLevel()
	{
		let boss_life = GetCommonDataEx("INVADER","EnemyBoss.Life");
		let alive_enemies_count = GetCommonDataDefaultEx("INVADER", "Enemy.AliveCount", 0);
		if(boss_life <= 0){
			lastboss = true;
			SetCommonDataEx("INVADER","EnemyMover.TickTime", 1000);
			SetCommonDataEx("INVADER","EnemyMover.Level", 0);
			return;
		 }

		if(!changed){
			if(boss_life <= 100 || alive_enemies_count <= 5){ changed = func_TestLevelUp(6);}
			else if(boss_life <= 200 || alive_enemies_count <= 9){changed = func_TestLevelUp(5); }
			else if(boss_life <= 400 || alive_enemies_count <= 15){changed = func_TestLevelUp(4); }
			else if(boss_life <= 600 || alive_enemies_count <= 18){changed = func_TestLevelUp(3); }
			else if(boss_life <= 800 || alive_enemies_count <= 22){changed = func_TestLevelUp(2); }
		}

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [40, 36, 30, 24, 18, 12, 8, 100000][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			UFOSequence(func_GetLevel() - 1);
			changed = false;
			ufo_count++;

		}

    }//end function

	function TestEnemyLevel2()
	{
		let boss_life = GetCommonDataEx("INVADER","EnemyBoss.Life");
		if(boss_life <= 0){
			SetCommonDataEx("INVADER","EnemyMover.TickTime", 1000);
			SetCommonDataEx("INVADER","EnemyMover.Level", 0);
			func_ClearStage();
			return;
		 }

		if(boss_life <= 100){ changed = func_TestLevelUp(9);}
		else if(boss_life <= 200){changed = func_TestLevelUp(8); }
		else if(boss_life <= 300){changed = func_TestLevelUp(7); }
		else if(boss_life <= 400){changed = func_TestLevelUp(6); }
		else if(boss_life <= 500){changed = func_TestLevelUp(5); }
		else if(boss_life <= 600){changed = func_TestLevelUp(4); }
		else if(boss_life <= 700){changed = func_TestLevelUp(3); }
		else if(boss_life <= 800){changed = func_TestLevelUp(2); }
		else if(boss_life <= 900){changed = func_TestLevelUp(1); }

		if(changed)
		{
			SetCommonDataEx("INVADER","EnemyMover.TickTime", [72, 60, 48, 42, 36, 30, 24, 18, 12, 6][func_GetLevel()]);
			SetCommonDataEx("INVADER","EnemyMover.Level", func_GetLevel());
			changed = false;
		}
    }//end function


	task UFOSequence(let counter)
	{

		func_SetEffect(_EFFECT_UFO, 0, 0);
		wait_ScriptWaitUFO(100);
		if(func_IsStageCleared()){ return; }

		CreateUFO(GetCenterX(), 140, counter % 6, counter % 2);
		CreateUFO(GetCenterX(), 140, (counter + 3) % 6, counter % 2);

		//----------------
		task CreateUFO(let x, let y, let id, let type)
		{
			let base_angle = id * 30;
			let move_param = [1.3] ~ [ base_angle ];
			let move_seq = [];
			move_seq = move_seq ~ [70, 1.5, base_angle + [90, -90][type]];
			move_seq = move_seq ~ [90, 1.6, base_angle + [180, -180][type]];
			move_seq = move_seq ~ [110, 1.8, base_angle + [270, -270][type]];
			let item = [_ITEMTYPE_5STAR,_ITEMTYPE_RAPIER, _ITEMTYPE_SPREAD, _ITEMTYPE_5STAR,_ITEMTYPE_ERASE, _ITEMTYPE_FREEZE][(id)%6];

			let m_id = func_CreateEnemyMover("EnemyMover02", [x, y], [1] ~ move_param ~ move_seq);
			let id = func_CreateEnemy(_GRA_UFO, m_id, _MOVETYPE_SLAVE, 0, 0, 0);
			REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemType", id, item);
			if(item == _ITEMTYPE_5STAR){REMY_CommonDataArrayEx_Set("INVADER", "Enemies.ItemEnergy", id, 15);}

		}

	}

	task TickSequence()
	{
		let bgm_counter = 0;
		let chi_interval = 0;
		rhythm();

		loop{
			if(GetCommonDataEx("INVADER","EnemyMover.OnTick"))
			{
				chi_interval = 0;
				alternative(bgm_counter%4)
				case(0){ PlaySE(bgm01);}
				case(1){ PlaySE(bgm02);}
				case(2){ PlaySE(bgm03);}
				case(3){ PlaySE(bgm04);}
				bgm_counter++;
			}
			yield;
		}

		task rhythm()
		{
			loop{
				chi_interval--;
				if(chi_interval <= 0)
				{
					PlaySE(bgm00);
					chi_interval = 12;
				}
				yield;
			}
		}

	}

	task EnemyBurst()
	{
		let angle = 0;
		ascent(i in 0..8)
		{
			let rad = 30 + 20 * i;
			ascent(j in 0..5)
			{
				let ang = angle + 360 * (j/5);
				func_SetEffect(_EFFECT_BURST, GetCenterX() + rad * cos(ang), 140 + rad * sin(ang));
			}
			loop(10){ yield; }
			angle += 35
		}
		
		
	}

}//end task



#include_function".\lib_REMY\include_tool.txt"
#include_function".\script_stagedata_func.txt"
#include_function".\script_stagedata_define.txt"
}//end script

