#e[Player]
#ScriptVersion[2]
#Menu[얲@U]
#Text[
VbgFu}ChA~bgv
{FudEv
VbgЗ́F
Vbǵ͈F
{З́F@@
ړxF@@]
#ReplayName[reimu2]	
script_player_main
{
	let current = GetCurrentScriptDirectory();
	let player= current~"dot_reimu.png";
	let slow= current~"slow_effect.png";
	let angle=0;
	let alpha=0;
	let shotCount = -1;
	let bNextShot = false;
	let op=0;
	let opx=[0];
	let opy=[0];
	let ppower=100;
	let misscount=0;
	@Initialize
	{
		SetPlayerLifeImage(player,1,150,25,175);
		LoadGraphic(player);
		LoadGraphic(slow);
		SetSpeed(4, 1.6);
		LoadPlayerShotData(current~"reimuShotData.txt");
		SetItemCollectLine(160);
		SetAutoEffect(false);
		shottask;
		optask;
	}
	
	@MainLoop
	{
		SetIntersectionCircle(GetPlayerX,GetPlayerY,0);
		yield;
	}
	@Missed
	{
		misscount++;
		if(misscount==74)
		{
			ppower-=100;
			misscount=-1;
		}
	}
	@SpellCard
	{
		UseSpellCard("mugenkekkai",0);
	}
	
	@DrawLoop
	{
		let i=0;
		SetColor(255, 255, 255);
		SetRenderState(ALPHA);
		SetTexture(player);
		if(GetKeyState(VK_LEFT)==KEY_PUSH || GetKeyState(VK_LEFT)==KEY_HOLD)
		{
			SetGraphicRect(1,101,50,150);
		}
		else if(GetKeyState(VK_RIGHT)==KEY_PUSH || GetKeyState(VK_RIGHT)==KEY_HOLD)
		{
			SetGraphicRect(1,51,50,100);
		}
		else 
		{
			SetGraphicRect(1,1,50,50);
		}
		SetGraphicAngle(0,0,0);
		if(GetTimeOfPlayerInvincibility>0)
		{
			SetAlpha(96);
		}
		else
		{
			SetAlpha(255);
		}
		DrawGraphic(GetPlayerX,GetPlayerY);
		loop(op)
		{
			SetTexture(player);
			SetGraphicRect(1,151,25,175);
			SetGraphicAngle(0,0,angle);
			if(GetTimeOfPlayerInvincibility>0)
			{
				SetAlpha(96);
			}
			else
			{
				SetAlpha(255);
			}
			DrawGraphic(opx[i],opy[i]);
			i++;
		}
		SetTexture(slow);
		SetGraphicRect(0,0,61,61);
		SetGraphicAngle(0,0,angle);
		if(GetTimeOfPlayerInvincibility>0)
		{
			SetAlpha(alpha/3);
		}
		else
		{
			SetAlpha(alpha);
		}
		DrawGraphic(GetPlayerX,GetPlayerY);
		angle+=2;
		SetFontColor(255,255,255,255,255,128);
		DrawText(NumToString(ppower/100)~"/4.00",GetClipMinX,GetClipMaxY-64,18,255);
		DrawText("",GetClipMinX,GetClipMaxY-83,18,255);
		SetFontColor(255,255,255,255,255,255);
	}
	@Finalize
	{
		DeleteGraphic(player);
		DeleteGraphic(slow);
	}
	task shottask
	{
		loop(2)
		{
			yield;
		}
		loop
		{
			if((GetKeyState(VK_SHOT)==KEY_PUSH || GetKeyState(VK_SHOT)==KEY_HOLD || bNextShot==true)&&shotCount==-1)
			{
				shotCount=0;
				bNextShot=false;
			}
			if(GetKeyState(VK_SHOT)==KEY_HOLD&&shotCount>0)
			{
				bNextShot=true;
			}
			if(shotCount%5==0)
			{
				let i=0;
				CreatePlayerShot01(GetPlayerX-10,GetPlayerY,15,270,4,1,1);
				CreatePlayerShot01(GetPlayerX+10,GetPlayerY,15,270,4,1,1);
				loop(op)
				{
					HomingShot(opx[i],opy[i]);
					i++;
				}
			}
			if(shotCount >= 0)
			{
				shotCount++;
			}
			if(shotCount == 30)
			{
				shotCount=-1;
			}
			yield;
		}
	}
	task optask
	{
		let gp=0;
		let r=40;
		loop
		{
			ppower+=(GetPoint-gp)*5;
			op=trunc(ppower/100);
			if(op>4)
			{
				op=4;
			}
			if(op<1)
			{
				op=1;
			}
			if(ppower>400)
			{
				ppower=400;
			}
			if(ppower<100)
			{
				ppower=100;
			}
			if(op==1)
			{
				opx=[GetPlayerX+r*cos(90)];
				opy=[GetPlayerY+r*sin(90)];
			}
			if(op==2)
			{
				opx=[GetPlayerX+r*cos(0),GetPlayerX+r*cos(180)];
				opy=[GetPlayerY+r*sin(0),GetPlayerY+r*sin(180)];
			}
			if(op==3)
			{
				opx=[GetPlayerX+r*cos(0),GetPlayerX+r*cos(180),GetPlayerX+r*cos(90)];
				opy=[GetPlayerY+r*sin(0),GetPlayerY+r*sin(180),GetPlayerY+r*sin(90)];
			}
			if(op==4)
			{
				opx=[GetPlayerX+r*cos(0),GetPlayerX+r*cos(180),GetPlayerX+r*cos(60),GetPlayerX+r*cos(120)];
				opy=[GetPlayerY+r*sin(0),GetPlayerY+r*sin(180),GetPlayerY+r*sin(60),GetPlayerY+r*sin(120)];
			}
			if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD)
			{
				if(r>30)
				{
					r-=1;
				}
				if(alpha<255)
				{
					alpha+=15;
				}
			}
			else
			{
				if(r<40)
				{
					r+=1;
				}
				if(alpha>0)
				{
					alpha-=15;
				}
			}
			gp=GetPoint;
			yield;
		}
	}
	task HomingShot(x,y)
	{
		let target=0;
		let enemyr=400;
		let angle=270;
		let count=30;
		let obj = Obj_Create(OBJ_SHOT);
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,12);
		Obj_SetAngle(obj,angle);
		ObjShot_SetGraphic(obj, 2);
		ObjShot_SetDamage(obj, 1.5);
		ObjShot_SetPenetration(obj, 1);
		while(!Obj_BeDeleted(obj))
		{
			let enemy=TargetSet(Obj_GetX(obj),Obj_GetY(obj));
			if(GetEnemyNum>0&&GetEnemyInfo(enemy,ENEMY_Y)>GetClipMinY&&GetEnemyInfo(enemy,ENEMY_Y)<GetClipMaxY&&GetEnemyInfo(enemy,ENEMY_X)>GetClipMinX&&GetEnemyInfo(enemy,ENEMY_X)<GetClipMaxX)
			{
				angle=atan2(GetEnemyInfo(enemy,ENEMY_Y)-Obj_GetY(obj),GetEnemyInfo(enemy,ENEMY_X)-Obj_GetX(obj));
			}
			if(sin(angle - Obj_GetAngle(obj))>0)
			{
				Obj_SetAngle(obj, Obj_GetAngle(obj) + 5);
			}
			else if(sin(angle - Obj_GetAngle(obj))==0)
			{
				Obj_SetAngle(obj, Obj_GetAngle(obj));
			}
			else
			{
				Obj_SetAngle(obj, Obj_GetAngle(obj) - 5);
			}
			if(count==0)
			{
				break;
			}
			count--;
			yield;
		}
	}
	function TargetSet( x, y ){
		let TargetID=0;
		let MinDistance=1000*1000;
		ascent(enemy in EnumEnemyBegin..EnumEnemyEnd){
			let enemyID = EnumEnemyGetID(enemy);
			let enemyX=GetEnemyInfo(enemyID,ENEMY_X);
			let enemyY=GetEnemyInfo(enemyID,ENEMY_Y);
			let dx=x-enemyX;
			let dy=y-enemyY;
			let distance=dx*dx+dy*dy;
			if(enemyID==0){
				TargetID=0;
				break;
			}
			else if(MinDistance>distance){
				MinDistance=distance;
				TargetID=enemyID;
			}
		}
		return TargetID;
	}
	function NumToString(let num)
	{
		let leng = trunc(log10(num))+1;
		if(num==0){leng = 0}
		let string = ToString(num);
		let str = " ";
		let zero =ToString(0);
		times(1-leng)
		{
			string = str ~ string;
		}
		if(num==0)
		{
				string = zero~ string;
			loop(3)
			{
				string = str ~ string;
			}
		}
		return string[0..4];
	}
}

script_spell mugenkekkai
{
	let current=GetCurrentScriptDirectory();
	let bomb=current~"reimu_bomb.png";

	@Initialize
	{
		LoadGraphic(bomb);
		SetPlayerInvincibility(420);
		run();
	}
	@MainLoop
	{
		yield;
	}
	@Finalize
	{
		DeleteGraphic(bomb);
	}
	task run()
	{
			kekkai(3,32);
			kekkai(-3,16);
		loop(360){;yield;}
		End();
	}
	task kekkai(angle2,BandG)
	{
		let enemy=TargetSet(GetPlayerX,GetPlayerY);
		let x=GetEnemyInfo(enemy,ENEMY_X);
		let y=GetEnemyInfo(enemy,ENEMY_Y);
		let count=0;
		let angle=0;
		let scale=10;
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
		Obj_SetSpeed(obj,0);
		ObjEffect_SetTexture(obj,bomb);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetScale(obj,scale,scale);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexXY(obj,0,-15,-15);
		ObjEffect_SetVertexXY(obj,1,-15,15);
		ObjEffect_SetVertexXY(obj,2,15,-15);
		ObjEffect_SetVertexXY(obj,3,15,15);
		ObjEffect_SetVertexUV(obj,0,0,0);
		ObjEffect_SetVertexUV(obj,1,0,303);
		ObjEffect_SetVertexUV(obj,2,303,0);
		ObjEffect_SetVertexUV(obj,3,303,303);
		if(GetEnemyNum>0&&GetEnemyInfo(enemy,ENEMY_Y)>GetClipMinY&&GetEnemyInfo(enemy,ENEMY_Y)<GetClipMaxY&&GetEnemyInfo(enemy,ENEMY_X)>GetClipMinX&&GetEnemyInfo(enemy,ENEMY_X)<GetClipMaxX)
		{
			Obj_SetPosition(obj,x,y);
		}
		else
		{
			Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
		}
		while(!Obj_BeDeleted(obj))
		{
			SetIntersectionCircle(Obj_GetX(obj),Obj_GetY(obj),20*scale,1.5,true);
			ObjEffect_SetScale(obj,scale,scale);
			ObjEffect_SetAngle(obj,0,0,angle);
			angle+=angle2;
			if(count<360)
			{
				scale-=0.01;
			}
			if(count>360)
			{
				break;
			}
			ObjEffect_SetVertexColor(obj,0,128+127*cos(count+180),255,BandG,BandG);
			ObjEffect_SetVertexColor(obj,1,128+127*cos(count+180),255,BandG,BandG);
			ObjEffect_SetVertexColor(obj,2,128+127*cos(count+180),255,BandG,BandG);
			ObjEffect_SetVertexColor(obj,3,128+127*cos(count+180),255,BandG,BandG);
			count++;
			yield;
		}
	}
	function TargetSet( x, y ){
		let TargetID=0;
		let MinDistance=1000*1000;
		ascent(enemy in EnumEnemyBegin..EnumEnemyEnd){
			let enemyID = EnumEnemyGetID(enemy);
			let enemyX=GetEnemyInfo(enemyID,ENEMY_X);
			let enemyY=GetEnemyInfo(enemyID,ENEMY_Y);
			let dx=x-enemyX;
			let dy=y-enemyY;
			let distance=dx*dx+dy*dy;
			if(enemyID==0){
				TargetID=0;
				break;
			}
			else if(MinDistance>distance){
				MinDistance=distance;
				TargetID=enemyID;
			}
		}
		return TargetID;
	}
}
