#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Ballerina spell 01 normal"]
#Text["Ballerina spell 01 normal"]

let globalObjectContainer = [];

let killFam = false;
let famCirc = "script/thdcs/system/effects/famcircle.png";
let famTex = "script/thdcs/system/enm01/antilope2.png";
let snijEff = "script/thdcs/system/effects/circlebal.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 {
	SetCommonData("spellScriptID",GetOwnScriptID);
	
	renderBoss(1);	
	setAura(bossObj,255,64,255);
	SetCommonData("bossAttackType",2)   ;
	SetCommonData("bossCircleType",1);
	SetCommonData("bossBgType",1);
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","b\ uPEQER v"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Lesson u1-2-3 step by stepv"); } 	
	setInvulnerableTime(bossObj,120);	
	
	concenEffect(bossObj,60,2,255,64,128);
	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetShotAutoDeleteClip(16,16,16,16);
	
	SetAutoDeleteObject(true);
	mainTask;
	
} 

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

@MainLoop { yield; } 
@Finalize { }  

task mainTask {
	yield;
	scriptEnding;	
	wait(120);
	move;
	fire;
	control;
}

task move {
	let dir = ObjMove_GetAngle(bossObj);
	while(!Obj_IsDeleted(bossObj)) {
		ObjMove_SetDestAtWeight(bossObj,GetCenterX+120*cos(dir),100+20*sin(dir),5,10);
		dir+=0.5;
		yield;
	}
}

task fire { 
	while(!Obj_IsDeleted(bossObj)) {
		PlaySFX(SFX_KIRA00);
		CreateShotA2(bossX,bossY,0,GetAngleToPlayer(bossObj),0.025,2,234,30);
		wait(120);
	}
}

task control { 
	while(!Obj_IsDeleted(bossObj)) {
		balFam(GetClipMinX-64,GetClipMinY-64,1);
		balFam(GetClipMaxX+64,GetClipMinY-64,3);
		wait(300);
		balFam(GetClipMinX-64,GetClipMinY+32,4);
		balFam(GetClipMinX-64,GetClipMaxY-32,6);
		wait(300);
	}
} 

// summons balerina familiars with behaviour for this spell card
task balFam(x,y,pattern) { 

	let schietkant = 0;
	killFam = false; 
	
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,famTex); 
	ObjRender_SetScaleXYZ(obj,0.8,0.8,0);
	ObjSprite2D_SetSourceRect(obj,0,0,96,128); 
	ObjSprite2D_SetDestCenter(obj);
	ObjEnemy_SetLife(obj,200);
	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,1,1,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,64,64);
	ObjSprite2D_SetDestCenter(obj2);

	globalObjectContainer = globalObjectContainer ~ [obj];
	globalObjectContainer = globalObjectContainer ~ [obj2];

	// fam handler
	balFamAnim(obj,obj2);
	
	// movement pattern statements. 
	if(pattern == 1) { 
		schietkant = 55;
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)+128,ObjMove_GetY(obj)+100,10,60); 
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		PlaySFX(SFX_POWER0);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,GetClipMaxX-64,GetClipMaxY-64,10,120);
		wait(45);
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),GetCenterY-64,10,120);
		vuurFam2(obj,pattern,schietkant);
		wait(75);		
		killFam = true;			
	}
	if(pattern == 2) { 
		schietkant = 90;
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),ObjMove_GetY(obj)+100,10,60); 
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),GetClipMaxY-64,10,120);
		wait(45);
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),GetCenterY-64,10,120);
		vuurFam2(obj,pattern,schietkant);		
	}
	if(pattern == 3) { 
		schietkant = 125;
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)-128,ObjMove_GetY(obj)+100,10,60); 
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,GetClipMinX+64,GetClipMaxY-64,10,120);				
		wait(45);
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),GetCenterY-64,10,120);
		vuurFam2(obj,pattern,schietkant);		
	}
	if(pattern == 4) { 
		schietkant = 0;
		ObjMove_SetDestAtWeight(obj,GetClipMinX+64,ObjMove_GetY(obj),10,60);		
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		PlaySFX(SFX_POWER0);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,GetClipMaxX-64,ObjMove_GetY(obj),10,120);	
		wait(45);
		ObjMove_SetDestAtWeight(obj,GetCenterX,ObjMove_GetY(obj),10,120);
		vuurFam2(obj,pattern,schietkant);			
		wait(75);		
		killFam = true;			
	}
	if(pattern == 5) { 
		schietkant = 180;
		ObjMove_SetDestAtWeight(obj,GetClipMaxX-64,ObjMove_GetY(obj),10,60); 		
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,GetClipMinX+64,ObjMove_GetY(obj),10,120);		
		wait(45);
		ObjMove_SetDestAtWeight(obj,GetCenterX,ObjMove_GetY(obj),10,120);
		vuurFam2(obj,pattern,schietkant);			
	}
	if(pattern == 6) { 
		schietkant = 0;
		ObjMove_SetDestAtWeight(obj,GetClipMinX+64,ObjMove_GetY(obj),10,60); 
		wait(30);
		concenEffect(obj,20,1,128,255,128);
		wait(70);
		vuurFam(obj,pattern,schietkant);
		ObjMove_SetDestAtWeight(obj,GetClipMaxX-64,ObjMove_GetY(obj),10,120);		
		wait(45);
		ObjMove_SetDestAtWeight(obj,GetCenterX,ObjMove_GetY(obj),10,120);		
		vuurFam2(obj,pattern,schietkant);			
	}	
}

// firing function #1 for the familiars (crossing)
function vuurFam(obj,pattern,schietkant) {
	PlaySFX(SFX_TAN00);
	if(pattern == 1 || pattern == 3) { 
		effect(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),27,schietkant);	
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,schietkant,1200,10,0);
		snijBullet(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),16,schietkant); 
	}
	if(pattern == 2) { 
		effect(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),24,schietkant);		
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,schietkant,1200,10,0); 
		snijBullet(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),12,schietkant); 
	}
	if(pattern == 4 || pattern == 5 || pattern == 6) {
		effect(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),18,schietkant);	
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,schietkant,1200,10,0); 
		snijBullet(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),12,schietkant);
	}
}

// firing function #2 for the familiars (horizontal)
function vuurFam2(obj,pattern,schietkant) {
	PlaySFX(SFX_TAN00);
	if(pattern == 1 || pattern == 2 || pattern == 3) { 
		schietkant = 270; 
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,270,1200,10,0); 
	}
	if(pattern == 5) { 
		schietkant = 0; 
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,0,1200,10,0); 
	}
	if(pattern == 4 || pattern == 6 ) { 
		schietkant = 180; 
		snijLaser(ObjMove_GetX(obj),ObjMove_GetY(obj),0,180,1200,10,0); 
	}
	effect(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),13,schietkant);
	daggers(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),schietkant);
}

// animation handling task for familiars
task balFamAnim(obj,obj2) {
	let anmf = 0;
	let circscale = 1;
	let circdraai = 0;
	let famFocusDelay = 0;
	let famScale = 0.6;
	let famHide = false;
	
	Obj_SetValue(obj,"isFamiliar",true); 
	
	while(!Obj_IsDeleted(obj)) { 
		if(anmf < 15 ) { ObjSprite2D_SetSourceRect(obj,0,0,96,128); }
		if(anmf >= 15 && anmf < 30) { ObjSprite2D_SetSourceRect(obj,96,0,192,128); }
		if(anmf >= 30 && anmf < 45) { ObjSprite2D_SetSourceRect(obj,192,0,288,128); }
		if(anmf >= 45 && anmf < 60) { ObjSprite2D_SetSourceRect(obj,288,0,384,128); }
		if(anmf == 60){ anmf = 0; }		
		anmf+=1.5;
	
		ObjRender_SetAngleZ(obj2,circdraai);
		ObjRender_SetScaleXYZ(obj2,circscale,circscale,0);
		ObjRender_SetPosition(obj2,ObjMove_GetX(obj),ObjMove_GetY(obj),0);
		ObjRender_SetScaleXYZ(obj,famScale,famScale,0);
		
		circscale += sin(anmf)/320;
		circdraai+=3;	

		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;
		}		

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

// Ballerina butterfly
task snijBullet(obj,x,y,t,dir) {
	let i = 0;
	let xpos = ObjMove_GetX(obj);
	let ypos = ObjMove_GetY(obj);
	wait(60);
	while(i < t) {
		xpos = xpos+28*cos(dir);
		ypos = ypos+28*sin(dir);		
		
		let vlinderBullet1 = CreateShotA(xpos,ypos,20);
		SetShotDataA(vlinderBullet1,0,0,dir,0,0,0,210);
		SetShotDataA(vlinderBullet1,40+i,0,rand_int(0,359),0.5,0.025,2,213);
		i++;
	}
}

// Daggers being tossed by the rushing ballerinas
task daggers(obj,x,y,schietkant) {
	let i = 0;
	let kleur = 70;
	let dir = 225;
	let xpos = ObjMove_GetX(obj);
	let ypos = ObjMove_GetY(obj);
		
	wait(60);
	PlaySFX(SFX_POWER1);

	while(i < 6) {
		xpos = xpos+40*cos(schietkant);
		ypos = ypos+40*sin(schietkant);

		loop(3) {
			let daggerBullet1 = CreateShotA(xpos,ypos,10);
			SetShotDataA(daggerBullet1,0,1,dir,0,0,2,70);
			
			let daggerBullet2 = CreateShotA(xpos,ypos,10);
			SetShotDataA(daggerBullet2,0,1,dir-180,0,0,2,72);
			dir-=45;
		}
		dir = 225;
		i++;
	}
}

// Pseudo effect 
task effect(obj,x,y,t,dir) {
	let i = 0;
	let xpos = ObjMove_GetX(obj);
	let ypos = ObjMove_GetY(obj);

	wait(40);
	while(i < t) {
		wait(1);
		xpos = xpos+15*cos(dir);
		ypos = ypos+15*sin(dir);		

		let effectBullet1 = CreateShotA(xpos,ypos,30);
		SetShotDataA(effectBullet1,0,0,dir,0,0,0,27);
		DeleteShotA(effectBullet1,0);
		i++;
	}
}

// Effect for the rushing ballerinas
task snijLaser(x,y,v,dir,lengte,dikte,delay) {
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	let snijl = lengte / 2;
	let snijd = dikte;
	let glide = 0;
	let c = 0;
	let alphaValue = 0;
	let snijswitch = 0;
	
	ObjPrim_SetTexture(obj,snijEff);	
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	Obj_SetRenderPriority(obj,0.3);	
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetAngleZ(obj,dir-90);
	
	ObjPrim_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj,4);

    globalObjectContainer = globalObjectContainer ~ [obj];

	while(! Obj_IsDeleted(obj)) {
		ObjPrim_SetVertexPosition(obj, 0, -snijd, -snijl,0);
		ObjPrim_SetVertexUVT(obj, 0, 38, 0+glide);
		ObjPrim_SetVertexPosition(obj, 1, snijd, -snijl,0);
		ObjPrim_SetVertexUVT(obj, 1, 54, 0+glide);
		ObjPrim_SetVertexPosition(obj, 2, -snijd, snijl,0);
		ObjPrim_SetVertexUVT(obj, 2, 38, 128+glide);
		ObjPrim_SetVertexPosition(obj, 3, snijd, snijl,0);
		ObjPrim_SetVertexUVT(obj, 3, 54, 128+glide);
		
		ObjRender_SetAlpha(obj,alphaValue);

		if(snijswitch == 0) { alphaValue+=20; if(alphaValue > 250) { snijswitch = 1; } }
		if(snijswitch == 1) { c++; if(c == 60) { snijswitch = 2; } }
		if(snijswitch == 2) { alphaValue-=20; if(alphaValue == 0) { Obj_Delete(obj); } }

		glide-=2;
		yield;
	}
	Obj_Delete(obj);
}

task scriptEnding {
	let allEnemyIDs = []; 
	while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0) {
		yield;
	}

    ascent(i in 0..length(globalObjectContainer)) {
        Obj_Delete(globalObjectContainer[i]);
    }
	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	allEnemyIDs = GetAllEnemyID;
	ascent(i in 0..length(GetAllEnemyID)) {
		Obj_Delete(allEnemyIDs[i]);
	}
	Obj_Delete(bossObj);
	CloseScript(GetOwnScriptID());
}



