#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Ballerina spell 03 hard"]
#Text["Ballerina spell 03 hard"]

let globalObjectContainer = [];

let vleugel2 = "script/thdcs/system/enm01/vleugel2.png";
let famTex = "script/thdcs/system/enm01/antilope2.png";
let famCirc = "script/thdcs/system/effects/famcircle.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("bossCircleType",1);
	SetCommonData("bossAttackType",2);
	SetCommonData("bossBgType",1);
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","lǔ΁v"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Elegant being uSwan Lakev"); } 
	setInvulnerableTime(bossObj,120);
	
	concenEffect(bossObj,60,1,255,64,128);
	concenEffect(bossObj,60,2,255,255,255);	
	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { }  

task mainTask {
	yield;
	scriptEnding;
	fabulous;
	wait(90);
	beweeg;
	wings;
	featherDrops;
	featherDrops2;
}

task beweeg {
	while(!Obj_IsDeleted(bossObj)) {
		ObjMove_RandomPosWeight(bossObj,rand_int(10,20),rand_int(10,15),15,30,GetClipMinX+128,GetClipMinY+64,GetClipMaxX-128,GetClipMinY+120);
		wait(30);
		if(!Obj_IsDeleted(bossObj)) {
			balFam(GetClipMinX-16,GetClipMaxY,0);
			balFam(GetClipMaxX+16,GetClipMaxY,1);
		}
		elegance;
		wait(240);
	}
}

// spreading wings effect
task elegance {
	bossAttack = 1;
	vuur2;
	PlaySFX(SFX_POWER0);
	concenEffect(bossObj,45,2,255,255,255);
	concenEffect(bossObj,45,1,255,64,255);
	vuur;
	wait(60);
	PlaySFX(SFX_TAN01);
	bossAttack = 2;
	wait(20);
	bossAttack = 3;
	wait(60);
	bossAttack = 4;
	wait(20);
	PlaySFX(SFX_BOON01);
	bossAttack = 0;
}

// knife shot
task vuur {
	wait(20);
	let dir = GetAngleToPlayer(bossObj) - 90;
	let dir2 = GetAngleToPlayer(bossObj) + 90;

	ascent(i in 0..66) {
		CreateShotA1(GetEnemyX+60*cos(dir),GetEnemyY+60*sin(dir),2.0,dir,217,60);
		CreateShotA1(GetEnemyX+60*cos(dir2),GetEnemyY+60*sin(dir2),2.0,dir2,217,60);
		dir += 7;
		dir2 -= 7;
		yield;
	}
}

// wing shot
task vuur2 {
	wait(20);
	ascent(i in 0..18) { 
		PlaySFX(SFX_TAN00);
		CreateShotA1(GetEnemyX-80,GetEnemyY-40,8,GetAngleToPlayer(bossObj),216,5);
		CreateShotA1(GetEnemyX+80,GetEnemyY-40,8,GetAngleToPlayer(bossObj),216,5);
		CreateShotA1(GetEnemyX-80,GetEnemyY-40,8,GetAngleToPlayer(bossObj)+30,218,5);
		CreateShotA1(GetEnemyX+80,GetEnemyY-40,8,GetAngleToPlayer(bossObj)-30,218,5);
		CreateShotA1(GetEnemyX-80,GetEnemyY-40,8,GetAngleToPlayer(bossObj)+45,219,5);
		CreateShotA1(GetEnemyX+80,GetEnemyY-40,8,GetAngleToPlayer(bossObj)-45,219,5);
		wait(4);
	}
}

// summons balerina familiars with behaviour for this spell card
task balFam(x,y,richting) { 
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	
	let c = 0;
	let circscale = 0.8;
	let circdraai = 0;
	let anmf = 0;
	
	ObjEnemy_Regist(obj);
	ObjEnemy_SetLife(obj,30);
	ObjPrim_SetTexture(obj,famTex); 
	ObjRender_SetScaleXYZ(obj,0.8,0.8,0);
	ObjSprite2D_SetSourceRect(obj,0,0,96,128); 
	ObjSprite2D_SetDestCenter(obj);
	ObjMove_SetPosition(obj,x,y);
	
	PlaySFX(SFX_OPTION);
	
	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,100,100,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,64,64);
	ObjSprite2D_SetDestCenter(obj2);
	
	famVuur(obj,richting);
	famVuur2(obj);	
	
	if(richting == 0) { ObjMove_SetDestAtSpeed(obj,GetClipMaxX,GetClipMinY,3); } 
	if(richting == 1) { ObjMove_SetDestAtSpeed(obj,GetClipMinX,GetClipMinY,3); }

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

	while(!Obj_IsDeleted(obj)) {
		ObjEnemy_SetIntersectionCircleToShot(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),16);
		ObjEnemy_SetIntersectionCircleToPlayer(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),16);
		if(ObjEnemy_GetInfo(obj,INFO_LIFE) <= 1) { enyExplodeEffect(obj,1); Obj_Delete(obj); Obj_Delete(obj2); break; }
		c++;
		if(c == 200) { Obj_Delete(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);
		
		circscale += sin(anmf*4)/220;
		circdraai-=3;			
		yield;
	}	
	Obj_Delete(obj); 
	Obj_Delete(obj2);
	PlaySFX(SFX_ENEP00);
}

// fire for familiars
task famVuur(obj,shotdir) {
	let x = 2;
	let dir = shotdir;
	if(shotdir == 0) {  dir = 55; }
	if(shotdir == 1) {  dir = 125; }
	let kleur = 0;
	
	while(!Obj_IsDeleted(obj)) { 
		ascent(i in 0..6) {
			PlaySFX(SFX_FEATHER);
			let famShot = CreateShotA(ObjMove_GetX(obj),ObjMove_GetY(obj),5);
			SetShotDataA(famShot,0,2,dir,0,0.50,(x/3),11);
			x++;
		}
		x = 2;
		wait(25);
	}
}

task famVuur2(obj) {
	wait(90);
	PlaySFX(SFX_CH02);		
	concenEffect(obj,45,1,255,255,255);
	concenEffect(obj,45,1,255,64,255);	
	wait(60);
	if(!Obj_IsDeleted(obj)) { 
		PlaySFX(SFX_KIRA00);	
		CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,GetAngleToPlayer(obj)+15,235,10);
		CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,GetAngleToPlayer(obj),235,10);
		CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,GetAngleToPlayer(obj)-15,235,10);
	}
}

// boss glowy aura
task fabulous {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);

	let fancyFrame = 0;
	let fancyScale = 1;
	
	ObjPrim_SetTexture(obj,imgBossBal);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj,30);
	ObjRender_SetPosition(obj,bossX,bossY,0);
	ObjRender_SetAlpha(obj,255);
	ObjMove_SetSpeed(obj,0);
	ObjMove_SetAngle(obj,0);
	ObjRender_SetScaleXYZ(obj,1,1,0);
	ObjSprite2D_SetSourceRect(obj,0,0,64,112);
	ObjSprite2D_SetDestCenter(obj);	

	while(!Obj_IsDeleted(obj)) {
		ObjRender_SetPosition(obj,bossX,bossY,0);
		ObjRender_SetScaleXYZ(obj,fancyScale,fancyScale,0);		
		ObjRender_SetColor(obj,rand_int(32,255),rand_int(32,255),rand_int(32,255));
		
		fancyScale += (4*sin(fancyFrame)/220);
		fancyFrame+=5;
		
		yield;
	}
	Obj_Delete(obj);
}	

// elegant wings
task wings {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj3 = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj4 = ObjPrim_Create(OBJ_SPRITE_2D);
	let wingalpha = 240;
	let wingtilt = 0;
	let wingscale = 0.7;
	let spread = 0;
	let spread2 = 0;
	let tilt = 0;
	let c = 0;
	let wingframe = 0;
	let vleugelframe = 0;
	let leftWingX = 60;
	let rightWingX = 60;
	
	// wings
	ObjPrim_SetTexture(obj,vleugel2);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj,20);
	ObjRender_SetPosition(obj,bossX,bossY,0);
	ObjRender_SetAlpha(obj,240);
	ObjMove_SetSpeed(obj,0);
	ObjMove_SetAngle(obj,0);
	ObjRender_SetScaleXYZ(obj,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(obj,0,0,500,250);
	ObjSprite2D_SetDestCenter(obj);	
	ObjRender_SetAngleY(obj,180);
	ObjRender_SetAngleX(obj,180);
	
	ObjPrim_SetTexture(obj2,vleugel2);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj2,20);
	ObjRender_SetPosition(obj2,bossX,bossY,0);
	ObjRender_SetAlpha(obj2,240);
	ObjMove_SetSpeed(obj2,0);
	ObjMove_SetAngle(obj2,0);
	ObjRender_SetScaleXYZ(obj2,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,500,250);
	ObjSprite2D_SetDestCenter(obj2);		
	ObjRender_SetAngleX(obj2,180);
	
	// glowing wings
	ObjPrim_SetTexture(obj3,vleugel2);
	ObjRender_SetBlendType(obj3,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj3,20);
	ObjRender_SetPosition(obj3,bossX,bossY,0);
	ObjRender_SetAlpha(obj3,240);
	ObjMove_SetSpeed(obj3,0);
	ObjMove_SetAngle(obj3,0);
	ObjRender_SetScaleXYZ(obj3,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(obj3,0,0,500,250);
	ObjSprite2D_SetDestCenter(obj3);	
	ObjRender_SetAngleY(obj3,180);
	ObjRender_SetAngleX(obj3,180);
	
	ObjPrim_SetTexture(obj4,vleugel2);
	ObjRender_SetBlendType(obj4,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj4,20);
	ObjRender_SetPosition(obj4,bossX,bossY,0);
	ObjRender_SetAlpha(obj4,240);
	ObjMove_SetSpeed(obj4,0);
	ObjMove_SetAngle(obj4,0);
	ObjRender_SetScaleXYZ(obj4,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(obj4,0,0,500,250);
	ObjSprite2D_SetDestCenter(obj4);	
	ObjRender_SetAngleX(obj4,180);
		
	while(!Obj_IsDeleted(obj)) {
		ObjRender_SetPosition(obj,bossX-leftWingX,bossY,0);
		ObjRender_SetPosition(obj2,bossX+rightWingX,bossY,0);
		ObjRender_SetPosition(obj3,bossX-leftWingX,bossY,0);
		ObjRender_SetPosition(obj4,bossX+rightWingX,bossY,0);
		
		// idle anim
		if(bossAttack == 0) {
			if(wingalpha < 240) { wingalpha+=10; } 
			if(leftWingX > 0) { leftWingX-=4; rightWingX-=4; } 
			wingtilt += 120*cos(wingframe)/180;
			wingframe+=2;
		}
		// tilt wings
		if(bossAttack == 1) {
			if(wingtilt < 60) { wingtilt+=4; }
		}
		// attack anim
		if(bossAttack == 2) {
			if(wingtilt > -40) { wingtilt-=10; }
		}
		// fade anim
		if(bossAttack == 3) {
			if(wingalpha > 0) { wingalpha-=20; }
		}
		// reset (while faded)
		if(bossAttack == 4) {
			//wingalpha = 255;
			leftWingX = 60;
			rightWingX = 60;
			wingtilt = 0;
			spread2 = 90;
			spread = 0;
		}
		ObjRender_SetAngleZ(obj,wingtilt); ObjRender_SetAlpha(obj,wingalpha);
		ObjRender_SetAngleZ(obj2,wingtilt); ObjRender_SetAlpha(obj2,wingalpha);
		ObjRender_SetAngleZ(obj3,wingtilt); ObjRender_SetAlpha(obj3,wingalpha);
		ObjRender_SetAngleZ(obj4,wingtilt); ObjRender_SetAlpha(obj4,wingalpha);
		
		ObjRender_SetScaleXYZ(obj3,wingscale,wingscale,0);
		ObjRender_SetScaleXYZ(obj4,wingscale,wingscale,0);
		
		ObjRender_SetColor(obj3,rand_int(32,255),rand_int(32,255),rand_int(32,255));
		ObjRender_SetColor(obj4,rand_int(32,255),rand_int(32,255),rand_int(32,255));
		
		wingscale += (1*sin(vleugelframe)/220);
		vleugelframe+=5;
	
		yield;
	}
	Obj_Delete(obj); Obj_Delete(obj2); Obj_Delete(obj3); Obj_Delete(obj4);
} 

task featherDrops {
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		ascent(i in 0..2) {  
			if(Obj_IsDeleted(bossObj)) { break; }
			dir += rand_int(0,359);
			featherDropHandler(bossX+rand_int(80,120)*cos(dir),bossY,rand_int(45,125),2,255,255,255);
			yield;
		}
		wait(30);
	}
}


task featherDrops2 {
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		ascent(i in 0..12) {
			if(Obj_IsDeleted(bossObj)) { break; }
			dir += rand_int(0,359);
			featherDropHandler(bossX+rand_int(80,120)*cos(dir),bossY+25,rand_int(45,125),1,255,255,255);
			yield;
		}
		wait(15);
	}
}		

task featherDropHandler(x,y,dir,type,red,green,blue) {

	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let partc = 0;
	let parts = rand(1.0,1.4);
	let partspin = 0;
	let alphaValue = 55;
	let spritex = x;
	let spritey = y;
	let spindir = rand(1,2);
	let v = 0;
	
	if(type == 1) { ObjPrim_SetTexture(obj,circglit); v = 4; }
	if(type == 2) { ObjPrim_SetTexture(obj,veertje); v = 5; }
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,alphaValue);
	Obj_SetRenderPriorityI(obj,40);
	ObjRender_SetPosition(obj,x,y,0);
	ObjMove_SetAngle(obj,0);
	ObjRender_SetScaleXYZ(obj,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj,0,0,64,64);
	ObjSprite2D_SetDestCenter(obj);

	featherAngleHandler(obj,x,y,v,dir);

	while(!Obj_IsDeleted(obj)) {
		ObjRender_SetColor(obj,red,green,blue); 
		ObjRender_SetAlpha(obj,alphaValue);
		ObjRender_SetAngleZ(obj,partspin);
		ObjRender_SetScaleXYZ(obj,parts,parts,0);

		if(type == 1) { 
			if(alphaValue < 155) { alphaValue+=10; } 
			parts += ((125*sin(partc)/300) - 0.02); 
			partc+=50; 
			if(parts <= 0.4) { Obj_Delete(obj); }  
		}
		if(type == 2) { 
			if(alphaValue < 155) { alphaValue+=20; } 
			if(spindir >= 1 && spindir <= 1.5) { partspin+=5; }
			if(spindir < 2 && spindir > 1.5) { partspin-=5; }
			parts -= 0.01; 
			if(parts <= 0) { Obj_Delete(obj); } 
		}
		yield;
	}
	Obj_Delete(obj); 
}

task featherAngleHandler(obj,x,y,v,dir) {
	let vx = v * cos(dir);
	let vy = v * sin(dir);

	while(! Obj_IsDeleted(obj)) {
		ObjRender_SetPosition(obj,x,y,0);
		vx = v * cos(dir);
		vy = v * sin(dir);

		yield;
		x += vx/3;
		y += vy/3;
	}
	Obj_Delete(obj); 
}

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

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

	CloseScript(GetOwnScriptID());
}



