////////////////////////////////////////////////////////////////////////////////
//	ʒ[Ŕ˂e𔭎˂
//	x傫Aˈʒǔ덷傫Ȃ
//	
//	@param X		exW
//	@param Y		eyW
//	@param Speed		x
//	@param Angle		px
//	@param Graph		摜
//	@param Delay		xt[
//	@param RefFlag		EEEEŔ˂邩(zœB1Ŕ)
//	@param RefNumber	ˉ
//	
////////////////////////////////////////////////////////////////////////////////
task ReflectShot(X,Y,Speed,Angle,Graph,Delay,RefFlag,RefNumber){
	let refnum = RefNumber;
	
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,X,Y);
	Obj_SetSpeed(obj,Speed);
	Obj_SetAngle(obj,Angle);
	ObjShot_SetGraphic(obj,Graph);
	ObjShot_SetDelay(obj,Delay);
	
	while( !Obj_BeDeleted(obj) ){
		if( (Obj_GetX(obj) <= GetClipMinX() && RefFlag[0] == 1 && refnum > 0) || (Obj_GetX(obj) >= GetClipMaxX() && RefFlag[2] == 1 && refnum > 0) ){
			if(refnum > 1){
				Obj_SetAngle(obj, 180 - Obj_GetAngle(obj) );
				refnum -= 1;
			}else{
				CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,180 - Obj_GetAngle(obj),Graph,0 );
				Obj_Delete(obj);
			}
		}
		
		if( (Obj_GetY(obj) <= GetClipMinY() && RefFlag[1] == 1 && refnum > 0) || (Obj_GetY(obj) >= GetClipMaxY() && RefFlag[3] == 1 && refnum > 0)  ){
			if(refnum > 1){
				Obj_SetAngle(obj, -Obj_GetAngle(obj) );
				refnum -= 1;
			}else{
				CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,-Obj_GetAngle(obj),Graph,0 );
				Obj_Delete(obj);
			}
		}
		
		yield;
	}
}

////////////////////////////////////////////////////////////////////////////////
//	d͂ŉe𔭎˂
//	pxAd͊px͐Ίpxw(SetShotDirectionTypȅԂɂ͊֌WȂ)
//	
//	@param X	exW
//	@param Y	eyW
//	@param Speed	x
//	@param Angle	px
//	@param Graph	摜
//	@param Delay	xt[
//	@param GrvSpeed	d͉x
//	@param GrvAngle	d͊px
//	@param MaxSpeed	ő呬x
//	
////////////////////////////////////////////////////////////////////////////////
function GravityShot(X,Y,Speed,Angle,Graph,Delay,GrvSpeed,GrvAngle,MaxSpeed){
	let xSpeed = Speed * cos(Angle);
	let ySpeed = Speed * sin(Angle);
	let accXSpeed = GrvSpeed * cos(GrvAngle);
	let accYSpeed = GrvSpeed * sin(GrvAngle);
	let maxXSpeed = [MaxSpeed,-MaxSpeed][accXSpeed < 0];
	let maxYSpeed = [MaxSpeed,-MaxSpeed][accYSpeed < 0];
	
	CreateShot12(X,Y,xSpeed,ySpeed,accXSpeed,accYSpeed,maxXSpeed,maxYSpeed,Graph,Delay);
}

////////////////////////////////////////////////////////////////////////////////
//	d͂ŉe𔭎˂֐Obj
//	pxAd͊px͐Ίpxw(SetShotDirectionTypȅԂɂ͊֌WȂ)
//	
//	@param X	exW
//	@param Y	eyW
//	@param Speed	x
//	@param Angle	px
//	@param Graph	摜
//	@param Delay	xt[
//	@param GrvSpeed	d͉x
//	@param GrvAngle	d͊px
//	@param MaxSpeed	ő呬x
//	@return 쐬IuWFNgid
//	
////////////////////////////////////////////////////////////////////////////////
function GravityShotObj(x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed){
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,speed);
	Obj_SetAngle(obj,angle);
	ObjShot_SetGraphic(obj,graph);
	ObjShot_SetDelay(obj,delay);
	
	ObjShot_SetGravity(obj,x,y,speed,angle,delay,gspeed,gangle,maxspeed);
	
	return obj;
}

////////////////////////////////////////////////////////////////////////////////
//	Ώۂ̃IuWFNgeɏd͉
//	
//	@param obj	Ώۂ̃IuWFNge
//	@param X	exW
//	@param Y	eyW
//	@param Speed	x
//	@param Angle	px
//	@param Delay	xt[
//	@param GrvSpeed	d͉x
//	@param GrvAngle	d͊px
//	@param MaxSpeed	ő呬x
//	
////////////////////////////////////////////////////////////////////////////////
task ObjShot_SetGravity(obj,x,y,speed,angle,delay,gspeed,gangle,maxspeed){
	let ox = speed * cos(angle);
	let oy = speed * sin(angle);
	let vx = gspeed * cos(gangle);
	let vy = gspeed * sin(gangle);
	
	loop(delay){
		yield;
	}
	
	while( !Obj_BeDeleted(obj) ){
		ox += vx;
		oy += vy;
		
		speed = (ox ^ 2 + oy ^ 2) ^ 0.5;
		
		if( speed > maxspeed ){
			speed = maxspeed;
		}
		
		angle = atan2(oy,ox);
		
		Obj_SetSpeed(obj,speed);
		Obj_SetAngle(obj,angle);
		
		yield;
	}
}

////////////////////////////////////////////////////////////////////////////////
//	ʒ[Ŕ˂郌[U[𔭎˂
//	x傫Aˈʒǔ덷傫Ȃ
//	
//	@param X		exW
//	@param Y		eyW
//	@param Speed		x
//	@param Angle		px
//	@param Lng		[U[̒
//	@param Wid		[U[̕
//	@param Graph		摜
//	@param Delay		xt[
//	@param RefFlag		EEEEŔ˂邩(zœB1Ŕ)
//	@param RefNumber	ˉ
//	
////////////////////////////////////////////////////////////////////////////////
task RefrectLaser(X,Y,Speed,Angle,Lng,Wid,Graph,Delay,RefFlag,RefNumber){
	let refnum = RefNumber;
	
	let vLng = 0;
	
	let mx = Speed * cos(Angle);
	let my = Speed * sin(Angle);
	
	let vx = X;
	let vy = Y;
	
	let obj = Obj_Create(OBJ_LASER);
	Obj_SetPosition(obj,X,Y);
	Obj_SetSpeed(obj,Speed);
	Obj_SetAngle(obj,Angle);
	ObjShot_SetGraphic(obj,Graph);
	ObjShot_SetDelay(obj,Delay);
	
	ObjLaser_SetLength(obj,0);
	ObjLaser_SetWidth(obj,Wid);
	ObjLaser_SetSource(obj,false);
	
	while( !Obj_BeDeleted(obj) ){
		if( vLng < Lng ){
			vLng += Speed;
			ObjLaser_SetLength(obj,vLng);
		}else{
			vx += mx;
			vy += my;
		}
		
		Obj_SetPosition(obj,vx,vy);
		
		if( (ObjLaser_GetEndX(obj) <= GetClipMinX() && RefFlag[0] == 1 && refnum > 0) || (ObjLaser_GetEndX(obj) >= GetClipMaxX() && RefFlag[2] == 1 && refnum > 0) ){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,180 - Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		
		if( (ObjLaser_GetEndY(obj) <= GetClipMinY() && RefFlag[1] == 1 && refnum > 0) || (ObjLaser_GetEndY(obj) >= GetClipMaxY() && RefFlag[3] == 1  && refnum > 0) ){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,-Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		
		yield;
	}
}