e
#Title[uV̐v]
#Text[]
#BackGround[DEFAULT]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main
{
	#include_function ".\init.txt"
	#include_function ".\lib\lib_anime_Range.txt"

	let ini_time = 150;
	let ini_time2 = ini_time - 20;

	function GetTimerRate()
	{
		if( GetTimer() < 100 ){
			return 1;
		}
		else if( GetTimer() >= ini_time2 ){
			return 0;
		}
		return ((ini_time2 - GetTimer()) / (ini_time2 - 100))
	}

	function GetInceRate()
	{
		if( GetTimer() < 20 ){
			return 1;
		}
		return 0;
	}

	@Initialize
	{
		SetLife(2200);
		StartSetting(ini_time, 2000000, "uV̐v");
		SetInvincibility(600);
		SetExMode();
		SetHitState(0);

		InitPosition(GetCenterX(), GetClipMinY() + 120);

		LoadGraphic(img_range);

		LoadUserShotData(shot_00);
		SetShotAutoDeleteClip(32, 32, 32, 32);

		InitializeAction();
		InitializeBG();
		DeleteEnemyShot(ALL);
		LoadSE(se_shot1);
		LoadSE(se_shot2);

		SetEffectForZeroLife(60, 210, 2);

		T_Main();
		T_DamageRate(20, 0, 1200, -1);
		T_HitTest(48);
	}

	@Finalize
	{
		DeleteGraphic(img_range);
		DeleteSE(se_shot1);
		DeleteSE(se_shot2);
		ClearBG();
	}

	@DrawLoop
	{
		SetAlpha([255, 128][IsExMode() && OnBomb()]);
		DrawBoss(img_range);
	}

	task T_Main()
	{
		yield;

		SetAction(ACT_SPELL, 60);

		Wait(150);
		SetColor(255, 255, 255);
		Concentration01(60);
		SetColor(255, 255, 255);
		Wait(60);
		SetHitState(1);

		T_ShotA();
		T_ShotB();

		loop{
			if( GetEnemyLife() <= 0 || GetTimer() <= -1 ){
				SetCommonData("Back7_State", 1);
				SetPlayerInvincibility(70);
				break;
			}
			yield;
		}
		PlaySE(se_destroy2);
		Wait(20);
		PlaySE(se_destroy2);
		Wait(20);
		PlaySE(se_destroy2);
		Wait(19);
		PlaySE(se_destroy);
	}

	task T_ShotA()
	{
		Wait(360);
		let k = 0;
		loop{
			if( GetTimer() < 20 || GetTimer() > 21 ){
				PlaySE(se_shot1);
				let angle = rand(0, 360);
				CreateRotateCircle(GetX(), GetY(), 1.0 + GetTimerRate() * 0.7 + GetInceRate() * 0.90, -0.10 - GetTimerRate() * 0.13, 16 + k);
				k = 1 - k;
			}
			Wait(55 - GetTimerRate() * 15 - GetInceRate() * 15);
		}
	}

	task T_ShotB()
	{
		SetAction(ACT_SHOT_B, 90);
		let angle = rand(0, 360);
		ascent( let i in 0..15 ){
			CreateCircleShotA(GetX(), GetY(), angle, 168);
			angle += 360 / 15;
		}
		Wait(360 + 180);
		loop{
			SetAction(ACT_SHOT_B, 60);
			let angle = rand(0, 360);
			ascent( let i in 0..15 ){
				CreateCircleShotA(GetX(), GetY(), angle, 168);
				angle += 360 / 15;
			}
			Wait(260 - GetTimerRate() * 160 - GetInceRate() * 30);
		}
	}

	task CreateRotateCircle(x, y, v, d_angle, type)
	{
		let n = 42;
		let obj_s = [];

		ascent( let i in 0..n ){
			obj_s = obj_s ~ [Obj_Create(OBJ_SHOT)];
			ObjShot_SetGraphic(obj_s[i], type);
			ObjShot_SetBombResist(obj_s[i], true);
			Obj_SetAutoDelete(obj_s[i], false);
		}

		let r = 0;
		let angle_s = rand(0, 360);

		while( r < 380 ){
			r += v;
			ascent( let i in 0..n ){
				let angle_st = angle_s + i * 360 / n;
				Obj_SetPosition(obj_s[i], x + r * cos(angle_st), y + r * sin(angle_st));
			}
			angle_s += d_angle;
			yield;
		}
		ascent( let i in 0..n ){
			Obj_Delete(obj_s[i]);
		}
	}

	task CreateCircleShotA(x, y, angle, type)
	{
		let obj = Obj_Create(OBJ_SHOT);

		Obj_SetPosition(obj, x, y);
		Obj_SetAngle(obj, angle);
		ObjShot_SetGraphic(obj, type);
		ObjShot_SetDelay(obj, 10);
		ObjShot_SetBombResist(obj, true);
		PlaySE(se_shot1);
		Wait(10);

		let v = 7.0;
		let a = -v / 30;
		loop(30){
			v += a;
			Obj_SetSpeed(obj, v);
			yield;
		}

		if( !Obj_BeDeleted(obj) ){
			x = Obj_GetX(obj);
			y = Obj_GetY(obj);
			ascent( let i in 0..13 ){
				CreateCircleShotB(x, y, angle + i * 360 / 13, 158);
			}
			Obj_Delete(obj);
		}
	}

	task CreateCircleShotB(x, y, angle, type)
	{
		let obj = Obj_Create(OBJ_SHOT);

		Obj_SetPosition(obj, x, y);
		Obj_SetAngle(obj, angle);
		ObjShot_SetGraphic(obj, type);
		ObjShot_SetDelay(obj, 10);
		ObjShot_SetBombResist(obj, true);
		PlaySE(se_shot2);
		Wait(10);

		let v = 3.0;
		let a = -v / 30;
		loop(30){
			v += a;
			Obj_SetSpeed(obj, v);
			yield;
		}
		Wait(30);
		a = (1.3 + GetTimerRate() * 0.9 + GetInceRate() * 0.9) / 60;
		loop(60){
			v += a;
			Obj_SetSpeed(obj, v);
			yield;
		}
		ObjShot_SetBombResist(obj, false);
	}

	#include_function ".\f_base.txt"
	#include_function ".\f_enemy.txt"
	#include_function ".\f_boss.txt"
	#include_function ".\f_bg_range.txt"
}
