#include"./../../system/Item.txt"
let RedFairy=GetCurrentScriptDirectory~"../../img/zako/faily_red.png";
let BlueFairy=GetCurrentScriptDirectory~"../../img/zako/faily_blue.png";
let GreenFairy=GetCurrentScriptDirectory~"../../img/zako/faily_green.png";
let YellowFairy=GetCurrentScriptDirectory~"../../img/zako/faily_yellow.png";
let Circle=GetCurrentScriptDirectory~"../../img/zako/Circle.png";

function EnemyAlive(objEnemy)
{
	return(Obj_GetValue(objEnemy,"Lived"));
}

function IsVanished(objEnemy)
{
	return(Obj_GetValue(objEnemy,"Vanished"));
}

function wait(w)
{
loop(w){yield;}
}
function SetLife(objEnemy,Life)
{
	ObjEnemy_SetLife(objEnemy,Life);
}
function SetDamageRate(objEnemy,Shot_Rate,Bomb_Rate)
{
	ObjEnemy_SetDamageRate(objEnemy,Shot_Rate,Bomb_Rate);
}
function SetCollisionA(objEnemy,x,y,radius)
{
	Obj_SetValue(objEnemy,"SetCollisionA",Obj_GetValueD(objEnemy,"SetCollisionA",[])~[[x,y,radius]]);
}
function SetCollisionB(objEnemy,x,y,radius)
{
	Obj_SetValue(objEnemy,"SetCollisionB",Obj_GetValueD(objEnemy,"SetCollisionB",[])~[[x,y,radius]]);
}

task EnemyResist(objEnemy,X,Y)
{
	ObjEnemy_Regist(objEnemy);
	ObjMove_SetX(objEnemy,X);
	ObjMove_SetY(objEnemy,Y);
	Obj_SetValue(objEnemy, "Lived",true);
	Obj_SetValue(objEnemy, "Vanished",false);
	T_Collision(objEnemy);
	TEnd(objEnemy);
}

task VanishClip(objEnemy,l,t,r,b)
{
	while(ObjRender_GetX(objEnemy)>l && ObjRender_GetX(objEnemy)<r && ObjRender_GetY(objEnemy)>t && ObjRender_GetY(objEnemy)<b){yield;}
	VanishEnemy(objEnemy);
}

task VanishTime(objEnemy,w)
{
	wait(w);
	VanishEnemy(objEnemy);
}

task VanishEnemy(objEnemy)
{
	Obj_SetValue(objEnemy, "Vanished",true);
}

task TEnd(objEnemy)
{
	while(ObjEnemy_GetInfo(objEnemy, INFO_LIFE) > 0 && Obj_GetValue(objEnemy, "Vanished")==false)
	{
		yield;
	}

	let ex = ObjMove_GetX(objEnemy);
	let ey = ObjMove_GetY(objEnemy);
	//TExplosionA(ex, ey, 10, 0.6);
	//DeleteShotAll(TYPE_ALL, TYPE_ITEM);//GeSč폜	
	Obj_SetValue(objEnemy, "Lived",false);
	wait(1);
	Obj_Delete(objEnemy);
}

task T_Collision(objEnemy)
{
	while(!Obj_IsDeleted(objEnemy))
	{
		if(Obj_IsValueExists(objEnemy, "SetCollisionA"))
		{
			let CA_Array=Obj_GetValue(objEnemy, "SetCollisionA");
			ascent(i in 0..length(CA_Array))
			{
			ObjEnemy_SetIntersectionCircleToShot(objEnemy, ObjMove_GetX(objEnemy)+CA_Array[i][0], ObjMove_GetY(objEnemy)+CA_Array[i][1],CA_Array[i][2]);
			}
		}
		if(Obj_IsValueExists(objEnemy, "SetCollisionB"))
		{
			let CB_Array=Obj_GetValue(objEnemy, "SetCollisionB");
			ascent(i in 0..length(CB_Array))
			{
			ObjEnemy_SetIntersectionCircleToPlayer(objEnemy, ObjMove_GetX(objEnemy)+CB_Array[i][0], ObjMove_GetY(objEnemy)+CB_Array[i][1],CB_Array[i][2]);
			}
		}
		yield;
	}
}

task DrawEnemy(objEnemy,imgEnemy,Type)
{
	#include"./../../img/zako/lib_anime_fairy.txt"
	ObjPrim_SetTexture(objEnemy, imgEnemy);
	Initialize_Fairy(objEnemy,Type);
	while(!Obj_IsDeleted(objEnemy))
	{
		DrawFairy(objEnemy);
		yield;
	}
}

task DrawCircle(objEnemy,scale,R,G,B)
{
	ObjPrim_SetTexture(objEnemy, Circle);
	ObjRender_SetScaleXYZ(objEnemy,scale,scale,scale);
	let AngleZ=0;
	ObjRender_SetColor(objEnemy,R,G,B);
	while(!Obj_IsDeleted(objEnemy))
	{
		ObjSprite2D_SetSourceRect(objEnemy,0,0,256,256);
		ObjSprite2D_SetDestCenter(objEnemy);
		ObjRender_SetAngleZ(objEnemy,AngleZ);
		AngleZ+=3;
		yield;
	}
}

task EnemyExplosion(x,y,ScaleRate,R,G,B)
{
/*
LoadSound(GetCurrentScriptDirectory ~ "../../se/defeat.wav");
PlaySE(GetCurrentScriptDirectory ~ "../../se/defeat.wav");
*/
E;

loop(15)
{
E_Dust;
}
	let MS=7.5*ScaleRate;
	loop(15)
	{
		E_Effect(MS);
		MS-=7.5/15*ScaleRate;
		yield;
	}


	task E_Effect(MaxScale)
	{
		let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
		ObjPrim_SetTexture(obj, GetCurrentScriptDirectory~"../../img/effect/Marisa_shots.png");
		ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
		ObjPrim_SetVertexCount(obj, 4);
		ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
		Obj_SetRenderPriorityI(obj,30);
		ObjRender_SetAngleZ(obj,0);

		ObjPrim_SetVertexPosition(obj, 0, -64, -64, -0);
		ObjPrim_SetVertexPosition(obj, 1, 64, -64, -0);
		ObjPrim_SetVertexPosition(obj, 2, 64, 64, 0);
		ObjPrim_SetVertexPosition(obj, 3, -64, 64, 0);

		ObjPrim_SetVertexUVT(obj, 0, 0, 256);
		ObjPrim_SetVertexUVT(obj, 1, 128, 256);
		ObjPrim_SetVertexUVT(obj, 2, 128, 384);
		ObjPrim_SetVertexUVT(obj, 3, 0, 384);

		ObjRender_SetPosition(obj,x,y,0);

		let Alpha=0.2;
		let Scale=0;

		let Xangle=rand(0,360);
		let Yangle=rand(0,360);
		let Zangle=rand(0,360);

		loop(10)
		{
			Alpha-=0.2/10;
			Scale+=MaxScale/10;
			ObjRender_SetScaleXYZ(obj,Scale,Scale,1);
			ObjRender_SetColor(obj,R*Alpha,G*Alpha,B*Alpha);
			ObjRender_SetAngleXYZ(obj,Xangle,Yangle,Zangle);
			yield;
		}
		Obj_Delete(obj);
	}

task E
{
	let obj=ObjPrim_Create(OBJ_PRIMITIVE_2D);
	ObjPrim_SetTexture(obj, GetCurrentScriptDirectory~"../../img/effect/Marisa_shots.png");
	ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
	ObjPrim_SetVertexCount(obj, 4);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);

	ObjPrim_SetVertexPosition(obj, 0, -80, -80, -0);
	ObjPrim_SetVertexPosition(obj, 1, 80, -80, -0);
	ObjPrim_SetVertexPosition(obj, 2, 80, 80, 0);
	ObjPrim_SetVertexPosition(obj, 3, -80, 80, 0);

	ObjPrim_SetVertexUVT(obj, 0, 352, 0);
	ObjPrim_SetVertexUVT(obj, 1, 512, 0);
	ObjPrim_SetVertexUVT(obj, 2, 512, 160);
	ObjPrim_SetVertexUVT(obj, 3, 352, 160);

	ObjRender_SetPosition(obj,x,y,0);
	let Scale=0;
	let ScaleP=0.08;
	let Alpha=0.2;
	let AX=rand(0,360)*0;
	let AY=rand(0,360)*0;
	let AZ=rand(0,360)*0;
	ObjRender_SetAngleXYZ(obj,AX,AY,AZ);
	loop(15)
	{
		ObjRender_SetScaleXYZ(obj,Scale,Scale,Scale);
		ObjRender_SetColor(obj,R*Alpha,G*Alpha,B*Alpha);
		Scale+=ScaleP*ScaleRate;
		ScaleP-=0.08/15;
		Alpha-=0.2/15;
		yield;
	}
	Obj_Delete(obj);
}

	task E_Dust
	{
		let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
		ObjPrim_SetTexture(obj, GetCurrentScriptDirectory~"../../img/effect/Marisa_shots.png");
		ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
		ObjPrim_SetVertexCount(obj, 4);
		ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
		Obj_SetRenderPriorityI(obj,30);
		ObjRender_SetAngleZ(obj,0);

		ObjPrim_SetVertexPosition(obj, 0, -64, -64, -0);
		ObjPrim_SetVertexPosition(obj, 1, 64, -64, -0);
		ObjPrim_SetVertexPosition(obj, 2, 64, 64, 0);
		ObjPrim_SetVertexPosition(obj, 3, -64, 64, 0);

		ObjPrim_SetVertexUVT(obj, 0, 0, 256);
		ObjPrim_SetVertexUVT(obj, 1, 128, 256);
		ObjPrim_SetVertexUVT(obj, 2, 128, 384);
		ObjPrim_SetVertexUVT(obj, 3, 0, 384);

		ObjRender_SetPosition(obj,x,y,0);

		let speed=(rand(1,8));
		let Angle=rand(0,360);
		let Alpha=0.3;
		let Scale=0.3*ScaleRate;
		let Zangle=0;
		let ZangleRotate=rand(-10,10);
		let time=floor(rand(20,45));
		loop(time)
		{
			ObjRender_SetPosition(obj,ObjRender_GetX(obj)+speed*cos(Angle),ObjRender_GetY(obj)+speed*sin(Angle),0);
			ObjRender_SetScaleXYZ(obj,Scale,Scale,1);
			ObjRender_SetColor(obj,R*Alpha,G*Alpha,B*Alpha);
			ObjRender_SetAngleZ(obj,Zangle);
			Alpha-=0.3/time;
			Scale-=0.3/time*ScaleRate;
			Zangle+=ZangleRotate;
			yield;
		}
		Obj_Delete(obj);
	}

}

task ObjRender_SetMovePositionBezier(obj,ControlX,ControlY,EndX,EndY,frame)
{
	let X=[ObjRender_GetX(obj)]~ControlX~[EndX];
	let Y=[ObjRender_GetY(obj)]~ControlY~[EndY];

	let num=length(X);

	let C=[];
	ascent(i in 0..num)
	{
		C=C~[factorial(num-1)/(factorial(num-1-i)*factorial(i))];
	}

	let x=0;
	let y=0;
	let k;
	let count=0;

	loop(frame)
	{
		k=count/frame;
		ascent(i in 0..num)
		{
			x+=C[i]*(1-k)^(num-1-i)*k^i*X[i];
			y+=C[i]*(1-k)^(num-1-i)*k^i*Y[i];
		}
		ObjRender_SetX(obj,x);
		ObjRender_SetY(obj,y);
		x=0;
		y=0;
		count+=1;
		yield;
    	}
}

function factorial(num)
{
	num=absolute(num);
	if(num==0){num=1;}
	let answer=num;
	while(num>1)
	{
		num-=1;
		answer*=num;
	}
	return(answer);
}

