//~TCp̓G

script_enemy Missile{

//{`̓Ǎ
#include_function".\enemy_define.txt"

let se_Missile;

let missileID = 0;
let way = 8;
let burst = false;
let posX;
let posY;

@Initialize{

	se_Missile = GetCommonDataEx("INVADER", "System.Directory.System") ~ "se\byoro03.wav";

	SetScore(0);
	SetLife(const_EnemyLifeZero + 100);
	SetDamageRate(10, 0);
	posX = GetX();
	posY = GetY();
	way = GetArgument();

	func_MissileAdd();
	main_MissileShot();
	main_MainRoutine();
}


@MainLoop{
	SetCollisionA(GetX,GetY,10);
	yield;
}

@DrawLoop{

}


@Finalize{

	REMY_CommonDataArrayEx_Set("INVADER", "Missiles.Status", missileID, _ENEMY_DEAD);
	if(!burst)
	{
		func_MissileDefeated(posX, posY); 
	}
}


task main_MissileShot()
{
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj, GetX(),GetY());
	Obj_SetAlpha(obj, 255);
	Obj_SetAngle(obj, 90);
	ObjShot_SetGraphic(obj, _SHOT_MISSILE);

	loop{
		yield;
		if(Obj_BeDeleted(obj)){ break; }

		posX = GetX();
		posY = GetY();
		Obj_SetPosition(obj, posX,posY);
		REMY_CommonDataArrayEx_Set("INVADER", "Missiles.PositionX", missileID, posX);
		REMY_CommonDataArrayEx_Set("INVADER", "Missiles.PositionY", missileID, posY);

		if(GetLife() <= const_EnemyLifeZero)
		{
			func_MissileDefeated(posX, posY);
			Obj_Delete(obj);
			break;
		}
		else if(GetY() > const_DeadLine)
		{
			func_MissileBurst(posX, posY); 
			Obj_Delete(obj);
			break;
		}

	}
	VanishEnemy();

}//


task main_MainRoutine(){

	ShotDamage();
	BombDamage();
	TestClear();

	loop{
		
		if(GetLife() <= const_EnemyLifeZero)
		{
			PlaySE(se_Missile);
			REMY_CommonDataArrayEx_Set("INVADER", "Missiles.Status", missileID, _ENEMY_DEAD);
			break;
		}
		yield;
	}

	task ShotDamage()
	{
		loop{
			yield;
			//if(REMY_CommonDataArrayEx_Get("INVADER", "Missiles.BeamHit", missileID))
			//{
			if(GetEnemyShotCountEx(GetX(), GetY(), 8, WHITE05) > 1){
				AddLife(-100);
				break;
			}
		}
	}

	task BombDamage()
	{

		loop{
			yield;
			if(OnBomb()){
				AddLife(-100);
				if(GetLife() <= const_EnemyLifeZero){ break; }
				while(OnBomb()){ yield; }
			}
		}
	}

	task TestClear()
	{

		loop{
			loop(10){yield;}
			if(GetCommonDataDefaultEx("INVADER", "Stage.Status", -1) == _STAGE_CLEAR)
			{
				AddLife(-100);
				break;
			}
		}

	}



}//end task

function func_MissileDefeated(let x, let y)
{
	if(burst){ return; }
	DeleteEnemyShotImmediatelyInCircle(SHOT, GetX(), GetY(), 15);

	burst = true;
	let speed = 0.35;
	ascent(i in 0..22)
	{
		let rad = 5 * (i % 3) + (i % 5);
		let ang = -90 + 360 * ((i * 8 + 0.5) / 11);
		
		let id = 0;
		CreateShotA(id, x + (rad * cos(ang)), y + (rad * sin(ang)), trunc(i/3));
		SetShotDataA(id, 0, speed, ang, 0, -0.3/30, 0, _SHOT06);
		SetShotKillTime(id, 30);
		FireShot(id);
	}


}//end function

function func_MissileBurst(let x, let y)
{
	if(burst){ return; }
	DeleteEnemyShotImmediatelyInCircle(SHOT, GetX(), GetY(), 9);
	PlaySE(se_Missile);

	burst = true;
	let speed = 1.0;
	ascent(i in 0..way)
	{
		let ang = -90 + 360 * ((i + 0.5) / way);
		CreateShot01(x, y, speed, ang, _SHOT05, 0);
	}


}//end function


function func_MissileAdd()
{

	missileID = GetCommonDataDefaultEx("INVADER","Missile.Count", 0);
	REMY_CommonDataArrayEx_Add("INVADER", "Missiles.Status", _ENEMY_ALIVE);
	REMY_CommonDataArrayEx_Add("INVADER", "Missiles.PositionX", 0);
	REMY_CommonDataArrayEx_Add("INVADER", "Missiles.PositionY", 0);
	REMY_CommonDataArrayEx_Add("INVADER", "Missiles.BeamHit", false);

	SetCommonDataEx("INVADER","Missile.Count", missileID + 1);

}//end function

#include_function"..\lib_REMY\include_tool.txt"

}//end script


