#e
#Title[juNCVXtAv]
#Text[]
#BGM[.\..\bgm\bgm.wav]
#BackGround[User]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main{
	
	@Initialize{
		imgBoss = imgBoss_Utsuho;
		InitializeData();
		InitializeAction();
		
		SetLife(1000);
		SetX( CenterX );
		SetY( MinY + 100 );
		SetDamageRate(22,15);
		SetCollisionEx(32,16,false,240 + 180);
		SetEnemyMarker(true);
		LastSpell();
		
		SetShotAutoDeleteClip(512,512,512,512);
		SetEffectForZeroLife(2,0,0);
		
		TMain();
	}
	
	@MainLoop{
		yield;
	}
	
	@DrawLoop{
		DrawBoss(imgBoss);
	}
	
	@Finalize{
		FinalizeData();
		SetShotAutoDeleteClip(64,64,64,64);
	}
	
	task TMain(){
		FWait(60);
		
		DeclareSpell();
		
		Atack();
	}
	
	function DeclareSpell(){
		SetScore(2600000);
		SetTimer(85);
		CutIn(KOUMA,"juNCVXtAv",NULL,0,0,0,0);
		Caution(imgEffect_Caution);
		CautionSE(se_warning);
		SetAction(ACT_SPELL,180);
		FWait(180);
	}
	
	task Atack(){
		let count = 0;
		
		loop{
			SetAction(ACT_SUN,180);
			FlareCharge();
			PlaySE(se_charge);
			FWait(180);
			
			FlareWave();
			Flare();
			
			FWait(240);
			
			count += 1;
			
			if(count % 3 == 0){
				SetMovePosition02(CenterX,MinY + 100 + rand(-10,10),50);
			}else{
				SetMovePosition02(GetPlayerX() + rand(-20,20),MinY + 100 + rand(-10,10),50);
			}
			SetAction(ACT_MOVE,50);
			FWait(60);
		}
	}
	
	task Flare(){
		let x = GetX();
		let y = GetY() - 300;
		let leng = 0;
		let count = 0;
		let scount = 0;
		let angle = 0;
		let angleseed = rand(0,360);
		let grazecount = 0;
		let imgSize = 512;
		let size = 512 * 2.3;
		let grazeRad = 0.8;
		let hitRad = 0.61;
		
		let obj = CreateObjEffect(imgEffect_NuclearR4,x,y,0,0,512,512,5,255,255,255,255);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,size / imgSize,size / imgSize);
		
		while( !Obj_BeDeleted(obj) ){
			y += 1;
			
			if(count % 30 == 0){
				ascent(i in 0..90){
					angle = (i + scount) * 360 / 90 + angleseed;
					if(i % 3 == 0 && y < MaxY - 264){
						CreateShot01(x + size * cos(angle) * 0.3,y + size * sin(angle) * 0.3,2.2,angle + 140 * (scount % 2 * 2 - 1),41,40);
					}else{
						GrowEffect(x + size * cos(angle) * 0.3,y + size * sin(angle) * 0.3,41,40,39);
					}
				}
				scount += 1;
			}
			
			leng = GetGapLength(x,y,GetPlayerX(),GetPlayerY());
			if( (hitRad * size / 2) > leng){
				ShootDownPlayer();
				Obj_Delete(obj);
				break;
			}else if( (grazeRad * size / 2) > leng){
				if(grazecount % 12 == 0){
					AddGraze(1);
					PlaySE(se_graze);
				}
				
				grazecount += 1;
			}
			
			Obj_SetPosition(obj,x,y);
			if(y > MaxY + 256 + 32 || OnPlayerMissed()){
				Obj_Delete(obj);
				break;
			}
			
			size -= 1.42;
			ObjEffect_SetScale(obj,size / imgSize,size / imgSize);
			
			count += 1;
			
			yield;
		}
	}
	
	task FlareCharge(){
		FlareChargeA();
		FlareChargeB();
		FlareChargeC();
	}
	
	task FlareChargeA(){
		let count = 0;
		let size = 3;
		let angle = rand(0,360);
		
		let obj = CreateObjEffect(imgEffect_NuclearR3,truncate( GetX() ),truncate( GetY() - 32 - 20 ),0,0,128,128,5,255,255,255,255);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,size,size);
		ObjEffect_SetAngle(obj,0,0,angle);
		
		while( !Obj_BeDeleted(obj) ){
			if(count > 180){
				Obj_Delete(obj);
				break;
			}
			
			size = 3 + rand(-0.1,0.1);
			angle += 3;
			
			ObjEffect_SetScale(obj,size,size);
			ObjEffect_SetAngle(obj,0,0,angle);
			
			count += 1;
			
			yield;
		}
	}
	
	task FlareChargeB(){
		let count = 0;
		let size = 3;
		let angle = rand(0,360);
		
		let obj = CreateObjEffect(imgEffect_NuclearR2,truncate( GetX() ),truncate( GetY() - 32 - 20 ),0,0,128,128,5,92,255,255,255);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,size,size);
		ObjEffect_SetAngle(obj,0,0,angle);
		
		while( !Obj_BeDeleted(obj) ){
			if(count > 180){
				Obj_Delete(obj);
				break;
			}
			
			size = 3 + rand(-0.1,0.1);
			angle += 3;
			
			ObjEffect_SetScale(obj,size,size);
			ObjEffect_SetAngle(obj,0,0,angle);
			
			count += 1;
			
			yield;
		}
	}
	
	task FlareChargeC(){
		let count = 0;
		let size = 0.4;
		let angle = rand(0,360);
		
		let obj = CreateObjEffect(imgEffect_NuclearS1,truncate( GetX() ),truncate( GetY() - 32 - 20 ),0,0,256,256,5,255,255,255,255);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,size,size);
		ObjEffect_SetAngle(obj,0,0,angle);
		
		while( !Obj_BeDeleted(obj) ){
			if(count > 180){
				Obj_Delete(obj);
				break;
			}
			
			size = 0.4 + rand(-0.06,0.06);
			angle += 7.3;
			
			ObjEffect_SetScale(obj,size,size);
			ObjEffect_SetAngle(obj,0,0,angle);
			
			count += 1;
			
			yield;
		}
	}
	
	task FlareWave(){
		let count = 0;
		let size = 0;
		let alpha = 192;
		
		let obj = CreateObjEffect(imgEffect_NuclearW2,truncate( GetX() ),truncate( GetY() - 300 ),0,0,256,256,5,255,255,255,255);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,size,size);
		ObjEffect_SetAngle(obj,0,0,rand(0,360));
		
		while( !Obj_BeDeleted(obj) ){
			if(count < 10){
				size += 0.5;
			}else if(count < 40){
				size += 0.08;
				alpha -= 0.5;
			}else{
				size += 0.003;
				alpha -= 1.6;
			}
			
			if(alpha < 0){
				Obj_Delete(obj);
				break;
			}
			
			ObjEffect_SetScale(obj,size,size);
			ObjEffect_SetVertexColor(obj,0,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,1,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,2,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,3,trunc(alpha),255,255,255);
			
			count += 1;
			
			yield;
		}
	}
	
	task Caution(imgCaution){
		CautionLine(CenterX,CenterY - 81 - 20 - 20);
		CautionMark(CenterX,CenterY);
		CautionLine(CenterX,CenterY + 81 + 20 + 20);
	}
	
	task CautionLine(x,y){
		let count = 0;
		let alpha = 0;
		
		let obj = CreateObjEffect(imgEffect_Caution,truncate(x),truncate(y),0,9,512,40,5,255,255,255,255);
		
		while( !Obj_BeDeleted(obj) ){
			if(count < 30){
				alpha += 255 / 30;
			}else if(count > 180){
				alpha -= 255 / 30;
			}
			
			if(count > 220){
				Obj_Delete(obj);
				break;
			}
			
			ObjEffect_SetVertexUV(obj,0,count      , 9);
			ObjEffect_SetVertexUV(obj,1,count      ,49);
			ObjEffect_SetVertexUV(obj,2,count + 512, 9);
			ObjEffect_SetVertexUV(obj,3,count + 512,49);
			ObjEffect_SetVertexColor(obj,0,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,1,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,2,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,3,trunc(alpha),255,255,255);
			
			count += 1;
			
			yield;
		}
	}
	
	task CautionMark(x,y){
		let count = 0;
		let alpha = 0;
		
		let obj = CreateObjEffect(imgEffect_Caution,truncate(x),truncate(y),0,50,512,162,5,255,255,255,255);
		
		while( !Obj_BeDeleted(obj) ){
			if(count < 30){
				alpha += 255 / 30;
			}else if(count > 180){
				alpha -= 255 / 30;
			}
			if(count > 220){
				Obj_Delete(obj);
				break;
			}
			
			ObjEffect_SetVertexUV(obj,0,-count      , 50);
			ObjEffect_SetVertexUV(obj,1,-count      ,212);
			ObjEffect_SetVertexUV(obj,2,-count + 512, 50);
			ObjEffect_SetVertexUV(obj,3,-count + 512,212);
			ObjEffect_SetVertexColor(obj,0,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,1,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,2,trunc(alpha),255,255,255);
			ObjEffect_SetVertexColor(obj,3,trunc(alpha),255,255,255);
			
			count += 1;
			
			yield;
		}
	}
	
	task CautionSE(seCaution){
		loop(3){
			PlaySE(seCaution);
			FWait(74);
			StopSE(seCaution);
		}
	}
	
	#include_function ".\initialize.txt"
	#include_function ".\..\lib\lib_anime_utsuho.txt"
	
	#include_function ".\..\lib\lib_obj.txt"
	#include_function ".\..\lib\lib_value.txt"
	#include_function ".\..\lib\lib_effect.txt"
}