#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Ballerina non-spell 03 normal"]
#Text["Ballerina non-spell 03 normal"]

let killFam = false;

let famCirc = "script/thdcs/system/effects/famcircle.png";
let famTex = "script/thdcs/system/enm01/antilope2.png";

#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"

@Initialize {
	renderBoss(1);
	setAura(bossObj,255,64,255);
	SetCommonData("bossAttackType",1);
	SetCommonData("bossCircleType",0);
	setInvulnerableTime(bossObj,120);	
	
	SetShotAutoDeleteClip(16,16,16,16);	
	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetAutoDeleteObject(true);
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(400);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(47);
	}
} 

@MainLoop { yield; } 
@Finalize { } 

task mainTask { 
	yield;
	scriptEnding;	
	wait(60);
	move;
	effy;
	effy2;
} 

task move { 
	let dir = 270;	
	while(!Obj_IsDeleted(bossObj)) { 
		bossAttack = 1;
		ascent(i in 0..5) { 
			balFam(GetEnemyX,GetEnemyY,0,0,dir);
			dir+=360/5;
		}
		wait(180);
		bossAttack = 0;
		wait(40);
		bossAttack = 1;
		ascent(i in 0..5) { 
			balFam(GetEnemyX,GetEnemyY,0,1,dir);
			dir+=360/5;
		}
		wait(180);
		bossAttack = 0;
		wait(40);
	}
}

task effy { 
	let dir = 270;
	let r = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		if(bossAttack == 1) {
			ascent(i in 0..16) { 
				let effyShot = CreateShotA(GetEnemyX+r*cos(dir),GetEnemyY+r*sin(dir),20);
				SetShotDataA(effyShot,0,0,dir,0,0,0,17);
				DeleteShotA(effyShot,0);
				dir+=14;
			}
			r+=1.5;
			wait(2);
		}
	if(bossAttack == 0) { r = 0; }
	yield;
	}
}

task effy2 { 
	let dir = 0;
	let r = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		if(bossAttack == 1) {
			ascent(i in 0..3) { 
				let effyShot2 = CreateShotA(GetEnemyX+r*cos(dir),GetEnemyY+r*sin(dir),20);
				SetShotDataA(effyShot2,0,0,dir,0,0,0,12);
				DeleteShotA(effyShot2,0);

				let effyShot3 = CreateShotA(GetEnemyX+r*cos(dir+120),GetEnemyY+r*sin(dir+120),20);
				SetShotDataA(effyShot3,0,0,dir+120,0,0,0,12);
				DeleteShotA(effyShot3,0);
				
				let effyShot4 = CreateShotA(GetEnemyX+r*cos(dir+240),GetEnemyY+r*sin(dir+240),20);
				SetShotDataA(effyShot4,0,0,dir+240,0,0,0,12);
				DeleteShotA(effyShot4,0);

				dir-=10;
			}
			r++;
			wait(2);
		}
		if(bossAttack == 0) { r = 0; }
		yield;
	}
}

// summons balerina familiars with behaviour for this spell card
task balFam(x,y,v,pattern,dir) { 
	killFam = false; 
	let famdir = dir; 
	let r = 0;
	let draairichting = pattern;
	let deathframe = 0;
	let famFocusDelay = 0;
	let famScale = 0.6;
	let famHide = false;
	
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,famTex); 
	ObjRender_SetScaleXYZ(obj,0.6,0.6,0);
	ObjSprite2D_SetSourceRect(obj,0,0,96,128); 
	ObjSprite2D_SetDestCenter(obj);
	ObjEnemy_SetLife(obj,30);
	ObjMove_SetPosition(obj,x,y);
	
	PlaySFX(SFX_OPTION);
	
	// create the fam circle
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	
	ObjPrim_SetTexture(obj2,famCirc);
	ObjRender_SetBlendType(obj2,BLEND_ADD_RGB);
	Obj_SetRenderPriorityI(obj2,30);
	ObjRender_SetPosition(obj2,x,y,0);
	ObjMove_SetAngle(obj2,0);
	ObjRender_SetScaleXYZ(obj2,famScale,famScale,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,64,64);
	ObjSprite2D_SetDestCenter(obj2);
	
	// fam handler
	balFamAnim(obj,obj2);
	fire(obj,famdir);
	
	Obj_SetValue(obj,"isFamiliar",true); 

	while(!Obj_IsDeleted(obj)) {
		// If life is depleted, delete the familiar
		if(ObjEnemy_GetInfo(obj,INFO_LIFE) <= 0) {
			PlaySFX(SFX_ENEP00);
			famExplodeEffect(obj,2);
			Obj_Delete(obj); Obj_Delete(obj2); 
			break;
		}
		
		ObjRender_SetScaleXYZ(obj,famScale,famScale,0);
		ObjMove_SetDestAtWeight(obj,GetEnemyX+r*cos(famdir),GetEnemyY+r*sin(famdir),20,20);
		if(draairichting == 0) { famdir+=1; }
		if(draairichting == 1) { famdir-=1; }
		r+=cos(0.5);
		if(deathframe == 460) { PlaySFX(SFX_ENEP00); Obj_Delete(obj); Obj_Delete(obj2); }
		deathframe++;
		
		if(GetVirtualKeyState(VK_SLOWMOVE) == KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE) == KEY_HOLD) { 
			if(famFocusDelay < 15 && !famHide) { famFocusDelay++; }
			if(famFocusDelay == 14) { PlaySFX(SFX_OPHIDE); } 
			if(famFocusDelay == 15) { 
				famHide = true;
				if(famScale > 0.20) { famScale-=0.05; } 
				ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
				ObjRender_SetColor(obj2,32,128,255);  

			} 
		}
		else { 
			if(famFocusDelay > 0 && famHide) { famFocusDelay--; } 
			if(famFocusDelay == 14) { PlaySFX(SFX_OPSHOW); } 
			if(famFocusDelay == 0) { 
				famHide = false;
				if(famScale < 0.6) { famScale+=0.05; } 
				ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
				ObjEnemy_SetIntersectionCircleToShot(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),16);
				ObjEnemy_SetIntersectionCircleToPlayer(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),16);		
				ObjRender_SetColor(obj2,255,255,255);  				
			}
			famFocusDelay = 0;
		} 		
		yield;
	}
	Obj_DeleteValue(obj,"isFamiliar");
}

// animation handling task for familiars
task balFamAnim(obj,obj2) {
	let anmf = 0;
	let circscale = 1;
	let circdraai = 0;
	
	while(!Obj_IsDeleted(obj)) { 
		if(anmf < 15 ) { ObjSprite2D_SetSourceRect(obj,0,128,96,256); }
		if(anmf >= 15 && anmf < 30) { ObjSprite2D_SetSourceRect(obj,96,128,192,256); }
		if(anmf >= 30 && anmf < 45) { ObjSprite2D_SetSourceRect(obj,192,128,288,256); }
		if(anmf >= 45) { ObjSprite2D_SetSourceRect(obj,288,128,384,256); }
		
		if(cos(ObjMove_GetAngle(obj)) > 0) { ObjRender_SetAngleXYZ(bossObj,0,180,0); } 	
		if(cos(ObjMove_GetAngle(obj)) < 0) { ObjRender_SetAngleXYZ(bossObj,0,0,0); } 	
		anmf+=1.5;
	
		ObjRender_SetAngleZ(obj2,circdraai);
		ObjRender_SetScaleXYZ(obj2,circscale,circscale,0);
		ObjRender_SetPosition(obj2,ObjMove_GetX(obj),ObjMove_GetY(obj),0);
		
		circscale += sin(anmf*4)/220;
		circdraai-=3;		

		// if killFam is called. Delete object.
		if(killFam) { Obj_Delete(obj); Obj_Delete(obj2); break; } 
		yield;
	}
	Obj_IsDeleted(obj);
	Obj_IsDeleted(obj2);
}

task fire(obj,shotdir) {
	ascent(i in 0..90) {
		if(Obj_IsDeleted(obj)) { break; } 
		PlaySFX(SFX_TAN00);
		CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),0,shotdir,0.01,1.5,183,20);
		shotdir+=6;
		wait(4);
	}
}

task scriptEnding {
	while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0) {
		yield;
	}

	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	Obj_Delete(bossObj);

	CloseScript(GetOwnScriptID());
}
 