//------------------------------------------------------------------------------
//	画面端で反射する弾を発射する
//	※速度が大きい程、反射位置の誤差が大きくなる
//	@X		弾源x座標
//	@Y		弾源y座標
//	@Speed		速度
//	@Angle		角度
//	@Graph		画像
//	@Delay		遅延フレーム数
//	@RefFlag	左・上・右・下で反射するか(配列で入れる。1で反射)
//	@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) == false) {
		if(Obj_GetX(obj) <= GetClipMinX() && RefFlag[0] == 1  && refnum >= 1){
			Obj_SetAngle(obj, 180 - Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetY(obj) <= GetClipMinY() && RefFlag[1] == 1  && refnum >= 1){
			Obj_SetAngle(obj, -Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetX(obj) >= GetClipMaxX() && RefFlag[2] == 1  && refnum >= 1){
			Obj_SetAngle(obj, 180 - Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetY(obj) >= GetClipMaxY() && RefFlag[3] == 1  && refnum >= 1){
			Obj_SetAngle(obj, -Obj_GetAngle(obj));
			refnum -= 1;
		}
		yield;
	}
}

//------------------------------------------------------------------------------
//	画面端で反射する弾を発射する(1回のみの軽量化版、途中で普通の弾に変わる)
//	※速度が大きい程、反射位置の誤差が大きくなる
//	@X		弾源x座標
//	@Y		弾源y座標
//	@Speed		速度
//	@Angle		角度
//	@Graph		画像
//	@Delay		遅延フレーム数
//	@RefFlag	左・上・右・下で反射するか(配列で入れる。1で反射)
//------------------------------------------------------------------------------
task ReflectShot2(X,Y,Speed,Angle,Graph,Delay,RefFlag){
	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){
			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){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,-Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		if(Obj_GetX(obj) >= GetClipMaxX() && RefFlag[2] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,180 - Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		if(Obj_GetY(obj) >= GetClipMaxY() && RefFlag[3] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,-Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		yield;
	}
}

//------------------------------------------------------------------------------
//	重力で加速する弾を発射する
//	※角度、重力角度は絶対角度指定(SetShotDirectionTypeの状態には関係しない)
//	@X		弾源x座標
//	@Y		弾源y座標
//	@Speed		速度
//	@Angle		角度
//	@Graph		画像
//	@Delay		遅延フレーム数
//	@GrvSpeed	重力加速度
//	@GrvAngle	重力角度
//	@MaxSpeed	最大速度
//------------------------------------------------------------------------------
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);
}

//------------------------------------------------------------------------------
//	重力で加速する弾を発射する関数Obj版
//	※角度、重力角度は絶対角度指定(SetShotDirectionTypeの状態には関係しない)
//	@X		弾源x座標
//	@Y		弾源y座標
//	@Speed		速度
//	@Angle		角度
//	@Graph		画像
//	@Delay		遅延フレーム数
//	@GrvSpeed	重力加速度
//	@GrvAngle	重力角度
//	@MaxSpeed	最大速度
//------------------------------------------------------------------------------
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,0);
	Obj_SetAngle(obj,angle);
	ObjShot_SetGraphic(obj,graph);
	ObjShot_SetDelay(obj,delay);
	
	ObjShot_SetGravity(obj,x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed);
	
	return obj;
}

task ObjShot_SetGravity(obj,x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed){
	let vx = speed * cos(angle);
	let vy = speed * sin(angle);
	
	if(delay > 0){
		loop(delay){
			yield;
		}
	}
	
	while( !Obj_BeDeleted(obj) ){
		vx += gspeed * cos(gangle);
		vy += gspeed * sin(gangle);
		Obj_SetPosition(obj, Obj_GetX(obj) + vx, Obj_GetY(obj) + vy);
		Obj_SetAngle(obj, atan2(vy,vx) );
		
		yield;
	}
}

//------------------------------------------------------------------------------
//	画面端で反射するレーザーを発射する
//	※速度が大きい程、反射位置の誤差が大きくなる
//	@X		弾源x座標
//	@Y		弾源y座標
//	@Speed		速度
//	@Angle		角度
//	@Lng		レーザーの長さ
//	@Wid		レーザーの幅
//	@Graph		画像
//	@Delay		遅延フレーム数
//	@RefFlag	左・上・右・下で反射するか(配列で入れる。1で反射)
//	@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 >= 1){
			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 >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,-Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		if(ObjLaser_GetEndX(obj) >= GetClipMaxX() && RefFlag[2] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,180 - Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		if(ObjLaser_GetEndY(obj) >= GetClipMaxY() && RefFlag[3] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,-Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		
		yield;
	}
}