#include_script".\Familier.txt"

function ThreadMain
{
	LockOnCursor(0);
	LockOnCursor(1);
	ShotThread;
}

task ShotThread
{
	Shot_Main;
	Shot_Sub;
//	Shot_Sub2;
	
	task Shot_Main
	{
		let shotwait=2;
		while(1)
		{
			if(!OnMissed&&!OnEvent&&player_flg[FLG_SHOT])
			{
				PlaySE("sePlayerShot01.wav");
				let sx=GetPlayerX;
				let sy=GetPlayerY-10;
				let atk=2;
				let speed=15;
				let angle=atan2(lockon_pos[1]-sy,lockon_pos[0]-sx);
				CreatePlayerShot01(sx,sy,speed,angle,atk,3,1);
				BorderShot(sx,sy,angle);
				
				let angle=atan2(lockon_pos[3]-sy,lockon_pos[2]-sx);
				CreatePlayerShot01(sx,sy,speed,angle,atk,3,1);
				BorderShot(sx,sy,angle);
			}
			loop(shotwait){yield;}
		}
		
		function BorderShot(let sx,let sy,let ag)
		{
			if(GetTimeOfSuperNaturalBorder<=0){return;}
			let atk=1;
			let speed=12;
			let way=3;
			let wide=8;
			
			let angle=ag-wide/2;
			while(angle<=ag+wide/2+1)
			{
				CreatePlayerShot01(sx,sy,speed,angle,atk,1,2);
				angle+=wide/(way-1);
			}
		}
	}
	task Shot_Sub
	{
		let shotwait=3;
		let rot=0;
		while(1)
		{
			if(!OnMissed&&!OnEvent&&player_flg[FLG_SHOT]&&GetTimeOfSuperNaturalBorder<=0)
			{
				let atk=2;
				let speed=12;
				let angle=-90;
				let leng=15;
				let ag=rot;
				while(ag<rot+360)
				{
					let sx=GetPlayerX+leng*cos(ag);
					CreatePlayerShot01(sx,GetPlayerY-10,speed,angle,atk,1,2);
					ag+=360/2;
				}
			}
			rot+=10;
			loop(shotwait){yield;}
		}
	}
	
	task Shot_Sub2
	{
		let totalcount=0;
		let delay=0;
		while(1)
		{
			if(!OnMissed&&!OnEvent)
			{
				if(GetKeyState(VK_SHOT)==KEY_PUSH)
				{
					if(delay<=0){delay=20;}
					else
					{
						if(GetPlayerBomb>0){Create;}
						if(totalcount%2){AddBomb(-1);}
						delay=0;
						totalcount++;
					}
				}
			}
			if(delay>0){delay--;}
			yield;
		}
		
		function Create
		{
			let vx=GetPlayerX;let vy=GetPlayerY;let v=10;
			if(GetKeyState(VK_UP)   ==KEY_HOLD){vy-=v;}
			if(GetKeyState(VK_DOWN) ==KEY_HOLD){vy+=v;}
			if(GetKeyState(VK_LEFT) ==KEY_HOLD){vx-=v;}
			if(GetKeyState(VK_RIGHT)==KEY_HOLD){vx+=v;}
			
			let angle=atan2(vy-GetPlayerY,vx-GetPlayerX);
			if(vx==GetPlayerX&&vy==GetPlayerY){angle=-90;}
			SetFamilier(GetPlayerX,GetPlayerY,angle);
		}
	}
}



task LockOnCursor(let type)
{
	type=type%2;
	
	let obj=SetObject;
	ObjEffect_SetRenderState(obj,ALPHA);
	ObjEffect_SetLayer(obj,3);
	SetRect(obj,64,64,128,128);
	let rot=0;
	let r=1;
	let alpha=255;
	if(type)
	{
		SetRect(obj,64,0,128,64);
		r=-r;
	}
	while(1)
	{
		let tx=0+type*2;let ty=1+type*2;
		let flg=player_flg[FLG_SLOW];
		let cursor_speed=7.5;
		if(type)
		{
			flg=player_flg[FLG_SHOT]&&!player_flg[FLG_SLOW];
			cursor_speed=5.5;
		}
		if(flg)
		{
			if(player_flg[FLG_SWITCH]){cursor_speed=-cursor_speed;}
			let vx=0;let vy=0;
			if(GetKeyState(VK_UP)   ==KEY_HOLD){vy= cursor_speed;}
			if(GetKeyState(VK_DOWN) ==KEY_HOLD){vy=-cursor_speed;}
			if(GetKeyState(VK_LEFT) ==KEY_HOLD){vx= cursor_speed;}
			if(GetKeyState(VK_RIGHT)==KEY_HOLD){vx=-cursor_speed;}
			
			if(vx!=0&&vy!=0){vx/=1.4;vy/=1.4;}
			
			lockon_pos[tx]=lockon_pos[tx]+vx;
			lockon_pos[ty]=lockon_pos[ty]+vy;
			
			
			if(lockon_pos[tx]<minX){lockon_pos[tx]=minX;}
			if(lockon_pos[tx]>maxX){lockon_pos[tx]=maxX;}
			if(lockon_pos[ty]<minY){lockon_pos[ty]=minY;}
			if(lockon_pos[ty]>maxY){lockon_pos[ty]=maxY;}
		}
		
		
		ObjEffect_SetAngle(obj,0,0,rot);
		Obj_SetPosition(obj,lockon_pos[tx],lockon_pos[ty]);
		ascent(a in 0..4){ObjEffect_SetVertexColor(obj,a,alpha,255,255,255);}
		if(!lightmode){Aura(lockon_pos[tx],lockon_pos[ty],rot);}
		
		rot+=3*r;
		yield;
	}
	
	task Aura(let x,let y,let angle)
	{
		let obj=SetObject;
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_SetLayer(obj,1);
		SetRect(obj,64,64,128,128);
		if(type){SetRect(obj,64,0,128,64);}
		let alpha=128;
		let scale=1;
		let count=0;
		while(alpha>4)
		{
			Obj_SetPosition(obj,x,y);
			ObjEffect_SetAngle(obj,0,0,angle);
			ObjEffect_SetScale(obj,scale,scale);
			ascent(a in 0..4)
			{
				ObjEffect_SetVertexColor(obj,a,alpha,128,128,128);
			}
			alpha-=12;
			scale+=0.08;
			count++;
			yield;
		}
		Obj_Delete(obj);
	}
	
	
	function SetObject
	{
		let obj=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obj,tex[TEX_SHOT]);
		Obj_SetPosition(obj,lockon_pos[0],lockon_pos[1]);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		return obj;
	}
	
	function SetRect(let obj,let reft,let up,let right,let down)
	{
		let texture_rect=[reft+1,up+1,right-1,down-1];
		let leng_h=texture_rect[2]-texture_rect[0];
		let leng_v=texture_rect[3]-texture_rect[1];
		
		ObjEffect_SetVertexXY(obj,0,-leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,1,-leng_h/2, leng_v/2);
		ObjEffect_SetVertexXY(obj,2, leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,3, leng_h/2, leng_v/2);
		
		ObjEffect_SetVertexUV(obj,0,texture_rect[0],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,1,texture_rect[0],texture_rect[3]);
		ObjEffect_SetVertexUV(obj,2,texture_rect[2],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,3,texture_rect[2],texture_rect[3]);
	}
}


task SwitchEffect
{
	player_flg[FLG_SWITCH]=!player_flg[FLG_SWITCH];
	let obj=SetObject;
	ObjEffect_SetRenderState(obj,ADD);
	ObjEffect_SetLayer(obj,3);
	SetRect(obj,0,64,64,128);
	let scalebase=4;let scale=scalebase;
	let alpha=0;
	let rot=0;
	let limit=20;
	while(scale>0)
	{
		ObjEffect_SetAngle(obj,0,0,rot);
		ObjEffect_SetScale(obj,scale,scale);
		Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
		ascent(a in 0..4){ObjEffect_SetVertexColor(obj,a,alpha,255,255,255);}
		
		alpha+=250/limit;
		scale-=scalebase/limit;
		rot+=9;
		yield;
	}
	Obj_Delete(obj);
	function SetObject
	{
		let obj=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obj,tex[TEX_SHOT]);
		Obj_SetPosition(obj,lockon_pos[0],lockon_pos[1]);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		return obj;
	}
	
	function SetRect(let obj,let reft,let up,let right,let down)
	{
		let texture_rect=[reft+1,up+1,right-1,down-1];
		let leng_h=texture_rect[2]-texture_rect[0];
		let leng_v=texture_rect[3]-texture_rect[1];
		
		ObjEffect_SetVertexXY(obj,0,-leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,1,-leng_h/2, leng_v/2);
		ObjEffect_SetVertexXY(obj,2, leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,3, leng_h/2, leng_v/2);
		
		ObjEffect_SetVertexUV(obj,0,texture_rect[0],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,1,texture_rect[0],texture_rect[3]);
		ObjEffect_SetVertexUV(obj,2,texture_rect[2],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,3,texture_rect[2],texture_rect[3]);
	}
}