#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Ballerina spell 04 lunatic"]
#Text["Ballerina spell 04 lunatic"]

let cut2 = "script/thdcs/system/face/hinanorm.png";

let battleFase = 0;

#include "script/thdcs/system/shotlibrary.txt"
#include "script/thdcs/functions/function_common.txt"
#include "script/thdcs/functions/function_global.txt"
#include "script/thdcs/functions/function_bosseff.txt"
#include "script/thdcs/functions/function_cutin.txt"
	
@Initialize {
	SetCommonData("spellScriptID",GetOwnScriptID);

	SetCommonData("isDuet", true);
	SetCommonData("bossCircleType",1);
	SetCommonData("bossAttackType",2);
	SetCommonData("bossBgType",1);

	renderBoss(1);
	renderBoss2(10);
	bossMagicCircle2;	
	setAura(bossObj,255,64,255);
	setAura(boss2Obj,128,64,255);
	setInvulnerableTime(bossObj,120);
	setInvulnerableTime(boss2Obj,120);

	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","lu̕v"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Elegant being uMirror Dancev"); } 	

	ObjMove_SetPosition(bossObj,bossX,bossY);
	ObjMove_SetPosition(boss2Obj,GetCommonData("boss2X",boss2X),GetCommonData("boss2Y",boss2Y));
	
	ObjMove_SetDestAtSpeed(bossObj,GetCenterX,GetCenterY,5);
	ObjMove_SetDestAtSpeed(boss2Obj,GetCenterX,GetCenterY-100,5);
	
	cutin2(DUET1,0,cut2,0,0,1024,1024,0.4);
	
	SetAutoDeleteObject(true);
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(340);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(70);
	}
	case(EV_REQUEST_SPELL_SCORE) {
	    let spellCardBonus = calculateAndGetSpellCardBonus();
		SetScriptResult(spellCardBonus);
	}
	case(EV_USER+9999) {
		SetCommonData("spellcardID","pierre04runa"); 
	}
}

@MainLoop { 
	yield; 
	if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) < 250 && ObjEnemy_GetInfo(bossObj, INFO_LIFE) >= 100) { battleFase = 1; }
	if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) < 100) { battleFase = 2; } 
} 

@Finalize { }  

task mainTask {
	yield;
	scriptEnding;
	wait(30);
	PlaySFX(SFX_CH00);
	PlaySFX(SFX_CAT00);	
	wait(30);
	PlaySFX(SFX_POWER0);
	concenEffect(bossObj,30,1,255,64,128);
	concenEffect(bossObj,30,2,255,255,255);	
	concenEffect(boss2Obj,30,1,64,255,128);
	concenEffect(boss2Obj,30,1,255,64,64);		
	wait(60);
	vuur;
	piereBeweeg;
	piereVuur;	
	hinaBeweeg;
	hinaVuur;
}

////////////////////////////////////////////
// General
////////////////////////////////////////////

task control {
	while(!Obj_IsDeleted(bossObj)) {
		vuur2;
		wait(240);
	}
}

// closing in butterflies based on spell time.
task vuur {
	let u = 270;
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) {
		wait(1);
		let butterflyBullet = CreateShotA(GetCenterX+u*cos(dir),GetCenterY+u*sin(dir),50);
		SetShotDataA(butterflyBullet,0,1,dir,0,0,0,209);

		let butterflyBullet2 = CreateShotA(GetCenterX+u*cos(dir+120),GetCenterY+u*sin(dir+120),50);
		SetShotDataA(butterflyBullet2,0,1,dir+120,0,0,0,210);

		let butterflyBullet3 = CreateShotA(GetCenterX+u*cos(dir+240),GetCenterY+u*sin(dir+240),50);
		SetShotDataA(butterflyBullet3,0,1,dir+240,0,0,0,214);
		dir+=33.5;
		u = (270-160)*GetTimer/70+140;
	}
	dir++;
}

// 5 aimed flowers (bubbles)
task vuur2 { 
	let dir = rand_int(0,359);
	PlaySFX(SFX_KIRA01);
	ascent(i in 0..3) { 
		homingFlower(GetCenterX+180*cos(dir),GetCenterY+180*sin(dir),0,0,234,60);
		dir+=360/3;			
	}
}

// flower handler 
task homingFlower(x,y,v,dir,kleur,delay) {
	let obj = ObjShot_Create(OBJ_SHOT);

	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetSpeed(obj,v);
	ObjMove_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,kleur);
	ObjShot_SetDelay(obj,delay);

	loop(120) {
		ObjMove_SetSpeed(obj,0);
		yield;
	} 
	ObjMove_SetAngle(obj, atan2(GetPlayerY-ObjMove_GetY(obj),GetPlayerX-ObjMove_GetX(obj)));
	ObjMove_SetSpeed(obj,1.5);
	PlaySFX(SFX_KIRA00);
}

////////////////////////////////////////////
// PIERE
////////////////////////////////////////////

task piereBeweeg {
	let dir = 0;
	let r = 200; 
	let rr = 0;
	while(!Obj_IsDeleted(bossObj)) {
		ascent(i in 0..360) {
			ObjMove_SetDestAtWeight(bossObj,GetCenterX+r*cos(dir+180),GetCenterY+r*sin(dir+180),5,10);
			dir++;
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		rr = r;
		concenEffect(bossObj,30,2,255,255,255);	
		concenEffect(boss2Obj,30,2,64,255,128);	
		PlaySFX(SFX_CH02);		
		PlaySFX(SFX_WIND);
	
		while(rr > 32) { 
			ObjMove_SetDestAtWeight(bossObj,GetCenterX+rr*cos(dir+180),GetCenterY+rr*sin(dir+180),5,10);
			dir+=0.5;		
			rr--; 
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		concenEffect(bossObj,30,2,255,64,255);	
		concenEffect(boss2Obj,30,2,255,64,128);			
		PlaySFX(SFX_CH00);	
		PlaySFX(SFX_POWER1);	
		ascent(i in 0..180) {
			ObjMove_SetDestAtWeight(bossObj,GetCenterX+rr*cos(dir+180),GetCenterY+rr*sin(dir+180),5,10);
			dir+=4;
			r = (200-128)*GetTimer/70+128;			
			yield;
		}	
		while(rr < r) { 
			ObjMove_SetDestAtWeight(bossObj,GetCenterX+rr*cos(dir+180),GetCenterY+rr*sin(dir+180),5,10);
			dir++;		
			rr++; 
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		yield;
	}
}

task piereVuur {
	wait(60);
	let dir = 120; 
	let dir2 = 120;
	while(!Obj_IsDeleted(bossObj)) {
		if(battleFase == 0) { 
			let piereShot = CreateShotA(GetEnemyX+25*cos(dir),GetEnemyY+25*sin(dir),10);
			SetShotDataA(piereShot,0,0,dir,0,0,0,18);	
			SetShotDataA(piereShot,180,0,dir,0,0.05,1.2,11);	
			dir-=360/18;
			wait(2);
		}
		if(battleFase == 1) { 
			let piereShot2 = CreateShotA(GetEnemyX+25*cos(dir),GetEnemyY+25*sin(dir),10);
			SetShotDataA(piereShot2,0,0,dir,0,0,0,18);	
			SetShotDataA(piereShot2,180,0,dir,0,0.05,1.2,11);	
			dir+=360/18;
			wait(2);
		}
		if(battleFase == 2) { 
			let piereShot3 = CreateShotA(GetEnemyX+25*cos(dir),GetEnemyY+25*sin(dir),10);
			SetShotDataA(piereShot3,0,0,dir,0,0,0,18);	
			SetShotDataA(piereShot3,180,0,dir,0,0.05,1.2,11);	
			dir-=360/18;

			let piereShot4 = CreateShotA(GetEnemyX+25*cos(dir2),GetEnemyY+25*sin(dir2),10);
			SetShotDataA(piereShot4,0,0,dir2,0,0,0,18);	
			SetShotDataA(piereShot4,180,0,dir2,0,0.05,1.2,22);	
			dir2+=360/18;
			wait(2);
		}
		yield;
	}
}

////////////////////////////////////////////
// HINA
////////////////////////////////////////////

task hinaBeweeg {
	boss2Attack = 1;
	let dir = 0;
	let r = 200; 
	let rr = 0;
	while(!Obj_IsDeleted(boss2Obj)) {
		ascent(i in 0..360) {
			ObjMove_SetDestAtWeight(boss2Obj,GetCenterX+r*cos(dir),GetCenterY+r*sin(dir),5,10);
			dir++;
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		rr = r;
		while(rr > 32) { 
			ObjMove_SetDestAtWeight(boss2Obj,GetCenterX+rr*cos(dir),GetCenterY+rr*sin(dir),5,10);
			dir+=0.5;		
			rr--; 
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		ascent(i in 0..180) {
			ObjMove_SetDestAtWeight(boss2Obj,GetCenterX+rr*cos(dir),GetCenterY+rr*sin(dir),5,10);
			dir+=4;
			r = (200-128)*GetTimer/70+128;			
			yield;
		}	
		while(rr < r) { 
			ObjMove_SetDestAtWeight(boss2Obj,GetCenterX+rr*cos(dir),GetCenterY+rr*sin(dir),5,10);
			dir++;		
			rr++; 
			r = (200-128)*GetTimer/70+128;
			yield;
		}
		yield;
	}
}

task hinaVuur { 
	wait(60);
	let dir = 120; 
	let dir2 = 120;
	while(!Obj_IsDeleted(boss2Obj)) {
		if(battleFase == 0) { 
			let hinaShot = CreateShotA(ObjMove_GetX(boss2Obj)+25*cos(dir),ObjMove_GetY(boss2Obj)+25*sin(dir),10);
			SetShotDataA(hinaShot,0,0,dir,0,0,0,18);	
			SetShotDataA(hinaShot,180,0,dir,0,0.05,1.2,11);	
			dir-=360/18;
			wait(2);
		}
		if(battleFase == 1) { 
			let hinaShot2 = CreateShotA(ObjMove_GetX(boss2Obj)+25*cos(dir),ObjMove_GetY(boss2Obj)+25*sin(dir),10);
			SetShotDataA(hinaShot2,0,0,dir,0,0,0,18);	
			SetShotDataA(hinaShot2,180,0,dir,0,0.05,1.2,11);	
			dir+=360/18;
			wait(2);
		}
		if(battleFase == 2) { 
			let hinaShot3 = CreateShotA(ObjMove_GetX(boss2Obj)+25*cos(dir),ObjMove_GetY(boss2Obj)+25*sin(dir),10);
			SetShotDataA(hinaShot3,0,0,dir,0,0,0,18);	
			SetShotDataA(hinaShot3,180,0,dir,0,0.05,1.2,11);	
			dir-=360/18;

			let hinaShot4 = CreateShotA(ObjMove_GetX(boss2Obj)+25*cos(dir2),ObjMove_GetY(boss2Obj)+25*sin(dir2),10);
			SetShotDataA(hinaShot4,0,0,dir2,0,0,0,18);	
			SetShotDataA(hinaShot4,180,0,dir2,0,0.05,1.2,22);	
			dir2+=360/18;
			wait(2);
		}
		yield;
	}
}

task scriptEnding {
	if(GetAreaCommonData("game","fightHina",false) || GetAreaCommonData("game","menuFlow",0) == 4) {
		while(ObjEnemy_GetInfo(bossObj,INFO_LIFE) > 0) { 
			yield;
		}	
	}
	ObjEnemy_SetLife(bossObj,-1);
	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	Obj_Delete(bossObj);			
	CloseScript(GetOwnScriptID());
}