//******************************************************************
//	Script: Spell Circle 
//	Author: Helepolis & Drake
//	version 1.1	
//	Library:
//		funkyCircle - handles the inner spell card circle
//		funkyCircle2 - handles the outer spell card circle
//******************************************************************/

#include "script/thdcs/functions/function_loaddata.txt"	

let bossObj; 
let bossX = 0;
let bossY = 0;
SetCommonData("circFinalSize",0);

@Initialize { 
	bossObj = GetEnemyBossObjectID()[0];
	bossX = ObjMove_GetX(bossObj);
	bossY = ObjMove_GetY(bossObj);
	funkyCircle; 
	funkyCircle2; 
}

@MainLoop { 
	bossX = ObjMove_GetX(bossObj);
	bossY = ObjMove_GetY(bossObj);
	yield; 
}

task funkyCircle {
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	let counter = -5;
	let innerSize = 40;
	let outerSize = 0;
	let diameter = 0;
	let vertexNumber = 0;
	let spinVelocity = 0;
	let circswitch = 0;
	let spellcardTimer = ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID, INFO_TIMER);
	
	ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj, 80 * 2 + 2);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 0.3);
	ObjPrim_SetTexture(obj, funkCircTex);
	
	while(vertexNumber < 81) { 
		ObjPrim_SetVertexUVT(obj, vertexNumber*2, 54, diameter*2/80);
		ObjPrim_SetVertexUVT(obj, vertexNumber*2+1, 68, diameter*2/80);
		diameter+=-128;
		vertexNumber++;
	}

	while(!Obj_IsDeleted(bossObj)) {

		spellcardTimer = ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID, INFO_TIMER);
		
		while(vertexNumber < 81) { 
			ObjPrim_SetVertexPosition(obj,vertexNumber*2,innerSize*cos(vertexNumber*360/80),innerSize*sin(vertexNumber*360/80),0);
			ObjPrim_SetVertexPosition(obj,vertexNumber*2+1,(outerSize)*cos(vertexNumber*360/80),(outerSize)*sin(vertexNumber*360/80),0);
			ObjPrim_SetVertexColor(obj,vertexNumber*2+1,50,50,50);
			vertexNumber++;
		}
		
		// switching animation to animate the inner circle, not beautiful but effective. At switch 4 it starts to shrink to the timer.
		if(circswitch == 0) { spinVelocity-=4; innerSize += (-cos(counter))*3.1; if(counter == 45){ circswitch = 1; } }
		if(circswitch == 1) { spinVelocity-=4; innerSize += (-cos(counter))*3.2; outerSize += (-cos(counter))*8.2; if(counter == 90){ circswitch = 2; } }
		if(circswitch == 2) { innerSize -= innerSize/((spellcardTimer+4)*60*((spellcardTimer+4)/10)); outerSize -= outerSize/((spellcardTimer+4)*60*((spellcardTimer+4)/10)); }
		counter++;		
		
		ObjRender_SetPosition(obj, bossX, bossY, 0);
		ObjRender_SetAngleZ(obj, spinVelocity);
		spinVelocity -= 5;
		vertexNumber = 0;
		yield;
	}
	// when spell card is over. Remove obj and shatter anim it. 
	Obj_Delete(obj);	
}

task funkyCircle2 {
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	let innerSize = 85;
	let diameter = 0;
	let vertexNumber = 0;
	let spinVelocity = 0;
	let circswitch = 0;
	let counter = 17;
	let anglebosscircle = 0;
	let xx = bossX;
	let yy = bossY;
	let spellcardTimer = ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID,INFO_TIMER);
	let textureType = GetCommonData("bossCircleType",NULL);
	
	ObjPrim_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj,80*2+2);
	ObjRender_SetBlendType(obj,BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj,0.3);
	if(textureType == 0) { ObjPrim_SetTexture(obj, funkCircTex0); }
	if(textureType == 1) { ObjPrim_SetTexture(obj, funkCircTex); }
	if(textureType == 2) { ObjPrim_SetTexture(obj, funkCircTex2); }
	if(textureType == 3) { ObjPrim_SetTexture(obj, funkCircTex3); }
	
	while(vertexNumber < 81) { 
		ObjPrim_SetVertexUVT(obj,vertexNumber*2,88,diameter*3/80);
		ObjPrim_SetVertexUVT(obj,vertexNumber*2+1,72,diameter*3/80);
		diameter+=-256;
		vertexNumber++;
	}	
	
	while(!Obj_IsDeleted(bossObj)) {
		spellcardTimer = ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID,INFO_TIMER);
		
		while(vertexNumber < 81) { 
			ObjPrim_SetVertexPosition(obj, vertexNumber*2, innerSize*cos(vertexNumber*360/80), innerSize*sin(vertexNumber*360/80),0);
			ObjPrim_SetVertexPosition(obj, vertexNumber*2+1, (innerSize+20)*cos(vertexNumber*360/80), (innerSize+20)*sin(vertexNumber*360/80),0);
			ObjPrim_SetVertexColor(obj,vertexNumber*2+1,180,180,180);
			vertexNumber++;
		}

		// switching animation to animate the outer circle. It gives that 'slingshot' effect. Again not the most beautiful method.
		if(counter > 0 && circswitch == 0) { innerSize += counter*cos(360/innerSize); counter-=0.5; if(counter == 0) { circswitch = 1; } } 
		if(counter < 9.6 && circswitch == 1) { innerSize -= counter*cos(360/innerSize); counter+=0.2; if(counter >= 9.6 ){ circswitch = 2; } } 
		if(circswitch == 2){innerSize -= innerSize/((spellcardTimer+4)*60*((spellcardTimer+4)/10)); SetCommonData("circFinalSize",innerSize); }
		
		// lag the spell circle slightly behind the boss when moving
		xx = (|bossX - xx|)/4; 
		ObjRender_SetPosition(obj,bossX,bossY,0);
		
		ObjRender_SetAngleZ(obj,spinVelocity);
		spinVelocity += 3;
		vertexNumber = 0;	
		yield;
	}
	
	// when spell card is over. Remove obj and shatter anim it + end script.
	Obj_Delete(obj);
	CloseScript(GetOwnScriptID());
}