let dirCurrent = GetCurrentScriptDirectory();
let typeEnd = 0;
let END_FAILED = 1;
let END_SUCCESS = 2;


@Initialize
{
	MagicCircle(0, 160, 0.25);
	MagicCircle(1, 192, -0.125);
}

@MainLoop
{
	yield;
}

@Event
{
	alternative(GetEventType())
	case(EV_END_BOSS_STEP)
	{
		//次の敵動作へ
		if(typeEnd == 0)
		{
			//スペルカード取得失敗
			typeEnd = END_FAILED;
		}
	}
	case(EV_GAIN_SPELL)
	{
		//スペルカード取得
		typeEnd = END_SUCCESS;
	}
}

task MagicCircle(gr, maxRadius, m)
{
	//頂点奇数：偶数：円の外側、円の内側
	let countVertex = 64;
	let listRadius = [];
	loop(countVertex)
	{
		listRadius = listRadius ~ [0];
	}

	let path = dirCurrent ~ "img/magiccircle_0" ~ IntToString(gr) ~ ".png";
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj, countVertex);
	ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
	Obj_SetRenderPriority(obj, 0.3);
	ObjPrim_SetTexture(obj, path);
	ascent(iVert in 0..countVertex / 2)
	{
		let left = iVert * 32;
		let indexVert = iVert * 2;
		ObjPrim_SetVertexUVT(obj, indexVert + 0, left, 0);
		ObjPrim_SetVertexUVT(obj, indexVert + 1, left, 16);		
	}

	let objScene = GetEnemyBossSceneObjectID();
	let objBoss = GetEnemyBossObjectID()[0];
	let timerOrg = ObjEnemyBossScene_GetInfo(objScene, INFO_ORGTIMERF);
	let bLastSpell = ObjEnemyBossScene_GetInfo(objScene, INFO_IS_LAST_SPELL);

	let cx = 0;
	let cy = 0;
	let alpha = 0;
	let frame = 0;
	let angleRender = 0;

	function GetPlayerX()
	{
		let objPlayer = GetPlayerObjectID();
		return ObjRender_GetX(objPlayer);
	}

	function GetPlayerY()
	{
		let objPlayer = GetPlayerObjectID();
		return ObjRender_GetY(objPlayer);
	}

	function UpdateVertex()
	{
		if(bLastSpell)
		{
			ObjRender_SetColor(obj, 255 * alpha, 192 * alpha, 192 * alpha);
		}
		else
		{
			ObjRender_SetColor(obj, 192 * alpha, 192 * alpha, 255 * alpha);
		}
		if(GetAreaCommonData("System", "HideBoss", false)){
			ObjRender_SetColor(obj, 0, 0, 0);
		}

		ObjRender_SetPosition(obj, cx, cy, 0);
		ObjRender_SetAngleXYZ(obj, angleRender * m, angleRender * m, angleRender);
	}

	while(typeEnd == 0)
	{
		if(!Obj_IsDeleted(objBoss))
		{
			cx = ObjRender_GetX(objBoss);
			cy = ObjRender_GetY(objBoss);
		}

		alpha += 1 / 120;
		alpha = min(alpha, 1);
		angleRender += 360 / countVertex / 4;

		let timer = ObjEnemyBossScene_GetInfo(objScene, INFO_TIMERF);
		let rRate = 1;
		let bMiss = ObjEnemyBossScene_GetInfo(objScene, INFO_PLAYER_SHOOTDOWN_COUNT) > 0 ||
					 ObjEnemyBossScene_GetInfo(objScene, INFO_PLAYER_SPELL_COUNT) > 0 ;

		ascent(iVert in 0..countVertex / 2)
		{
			let indexVert = iVert * 2;
			let angle = 360 / (countVertex / 2 - 1) * iVert;

			let vx1 = listRadius[indexVert] * cos(angle);
			let vy1 = listRadius[indexVert] * sin(angle);
			ObjPrim_SetVertexPosition(obj, indexVert + 0, vx1, vy1, 0);

			let vx2 = listRadius[indexVert+1] * cos(angle)/1.1;
			let vy2 = listRadius[indexVert+1] * sin(angle)/1.1;
			ObjPrim_SetVertexPosition(obj, indexVert + 1, vx2, vy2, 0);

			//魔方陣拡大
			if(frame >= 0)
			{//外側
				let dr = (maxRadius * rRate - listRadius[indexVert]) / 16;
				listRadius[indexVert] = listRadius[indexVert] + dr;
			}
			if(frame > 45)
			{//内側
				let rRateIn = rRate - 0.08;
				if(bMiss)
				{
					rRateIn = rRate - 0.04;
				}
				if(rRateIn < 0){rRateIn=0;}
				let dr= (maxRadius * rRateIn - listRadius[indexVert + 1]) / 64;
				listRadius[indexVert + 1] = listRadius[indexVert + 1] + dr;
			}

		}

		UpdateVertex();
		frame++;

		yield;
	}

	//スペルカード取得失敗
	if(typeEnd == END_FAILED)
	{
		Obj_Delete(obj);
		CloseScript(GetOwnScriptID());
		return;
	}

	let rRate = 1.0;
	frame = 0;
	alpha = 1;
	//スペルカード取得成功
	loop(105)
	{
		angleRender += 360 / countVertex / 4;
		let dx = (GetPlayerX() - cx) / 16;
		let dy = (GetPlayerY() - cy) / 16;
		cx += dx;
		cy += dy;
		if(frame >= 45)
		{
			alpha -= 1 / 45;
			alpha = max(alpha, 0);
		}

		ascent(iVert in 0..countVertex / 2)
		{
			let indexVert = iVert * 2;
			let angle = 360 / (countVertex / 2 - 1) * iVert;

			let vx1 = listRadius[indexVert] * cos(angle);
			let vy1 = listRadius[indexVert] * sin(angle);
			ObjPrim_SetVertexPosition(obj, indexVert + 0, vx1, vy1, 0);

			let vx2 = listRadius[indexVert+1] * cos(angle);
			let vy2 = listRadius[indexVert+1] * sin(angle);
			ObjPrim_SetVertexPosition(obj, indexVert + 1, vx2, vy2, 0);

			let drOut = 0;
			let drIn = 0;
			if(frame <= 45)
			{
				//魔方陣拡大
				let rRateOut = 1.0;
				drOut = (maxRadius * rRateOut - listRadius[indexVert]) / 8;

				let rRateIn = rRateOut - 0.08;
				if(rRateIn<0){rRateIn=0;}
				drIn = (maxRadius * rRateIn - listRadius[indexVert+1]) / 8;
			}
			else
			{
				cx = GetPlayerX();
				cy = GetPlayerY();

				rRate -= 1.0 / 60.0;
				let rRateOut = rRate * sin(angle % 60);
				drOut = (maxRadius * rRateOut - listRadius[indexVert]) / 16;

				let rRateIn = rRate * sin(angle % 60)-0.08;
				if(rRateIn<0){rRateIn=0;}
				drIn=(maxRadius * rRateIn - listRadius[indexVert+1])/16;
			}
			listRadius[indexVert] = listRadius[indexVert] + drOut;
			listRadius[indexVert + 1] = listRadius[indexVert + 1] + drIn;
		}

		UpdateVertex();
		frame++;
		yield;
	}

	Obj_Delete(obj);
	CloseScript(GetOwnScriptID());
	
}


