//==============================================================================
//	★ 東方弾幕風 定型弾幕関数
//	このファイルをinclude_functionで取り込むか、必要な部分をコピペして使用する
//==============================================================================
//	扇状（nWay）にShot01を発射する
//------------------------------------------------------------------------------
function WideShot01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 0;
	if( way > 1 ){
		wayAngle = wideAngle / ( way - 1 );
		angle -= wideAngle / 2;
	}
	loop( way ){
		CreateShot01( x, y, speed, angle, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	扇状（nWay）にShot02を発射する
//------------------------------------------------------------------------------
function WideShot02(
	let x,			// 弾源x座標 
	let y,			// 弾源y座標
	let speed,		// 速度
	let accSpeed,	// 加速度
	let maxSpeed,	// 最高速度（最低速度）
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 0;
	if( way > 1 ){
		wayAngle = wideAngle / ( way - 1 );
		angle -= wideAngle / 2;
	}
	loop( way ){
		CreateShot02( x, y, speed, angle, accSpeed, maxSpeed, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	扇状（nWay）にLaser01を発射する
//------------------------------------------------------------------------------
function WideLaser01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let Length,		// 長さ
	let width,		// 幅
	let wideAngle,	// 扇の角度
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 0;
	if( way > 1 ){
		wayAngle = wideAngle / ( way - 1 );
		angle -= wideAngle / 2;
	}
	loop( way ){
		CreateLaser01( x, y, speed, angle, Length, width, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にShot01を発射する
//------------------------------------------------------------------------------
function RoundShot01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 360 / way;
	loop( way ){
		CreateShot01( x, y, speed, angle, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にShot02を発射する
//------------------------------------------------------------------------------
function RoundShot02(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let accSpeed,	// 加速度
	let maxSpeed,	// 最高速度（最低速度）
	let angle,		// 角度
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 360 / way;
	loop( way ){
		CreateShot02( x, y, speed, angle, accSpeed, maxSpeed, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にLaser01を発射する
//------------------------------------------------------------------------------
function RoundLaser01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let Length,		// 長さ
	let width,		// 幅
	let way,		// Way数
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let wayAngle = 360 / way;
	loop( way ){
		CreateLaser01( x, y, speed, angle, Length, width, graphic, delay );
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にWideShot01を発射する
//------------------------------------------------------------------------------
function RoundWideShot01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let wideWay,	// 扇Way数（扇1つを構成するWay数）
	let roundWay,	// 全方向Way数（扇の数）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let roundWayAngle = 360 / roundWay;
	let wideWayAngle = 0;
	if( wideWay > 1 ){ wideWayAngle = wideAngle / ( wideWay - 1 ); }
	loop( roundWay ){
		let _angle = angle;
		if( wideWay > 1 ){ _angle -= wideAngle / 2; }
		loop( wideWay ){
			CreateShot01( x, y, speed, _angle, graphic, delay );
			_angle += wideWayAngle;
		}
		angle += roundWayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にWideShot02を発射する
//------------------------------------------------------------------------------
function RoundWideShot02(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let accSpeed,	// 加速度
	let maxSpeed,	// 最高速度（最低速度）
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let wideWay,	// 扇Way数（扇1つを構成するWay数）
	let roundWay,	// 全方向Way数（扇の数）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let roundWayAngle = 360 / roundWay;
	let wideWayAngle = 0;
	if( wideWay > 1 ){ wideWayAngle = wideAngle / ( wideWay - 1 ); }
	loop( roundWay ){
		let _angle = angle;
		if( wideWay > 1 ){ _angle -= wideAngle / 2; }
		loop( wideWay ){
			CreateShot02( x, y, speed, _angle, accSpeed, maxSpeed, graphic, delay );
			_angle += wideWayAngle;
		}
		angle += roundWayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にWideLaser01を発射する
//------------------------------------------------------------------------------
function RoundWideLaser01(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let Length,		// 長さ
	let width,		// 幅
	let wideAngle,	// 扇の角度
	let wideWay,	// 扇Way数（扇1つを構成するWay数）
	let roundWay,	// 全方向Way数（扇の数）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let roundWayAngle = 360 / roundWay;
	let wideWayAngle = 0;
	if( wideWay > 1 ){ wideWayAngle = wideAngle / ( wideWay - 1 ); }
	loop( roundWay ){
		let _angle = angle;
		if( wideWay > 1 ){ _angle -= wideAngle / 2; }
		loop( wideWay ){
			CreateLaser01( x, y, speed, _angle, Length, width, graphic, delay );
			_angle += wideWayAngle;
		}
		angle += roundWayAngle;
	}
}

//------------------------------------------------------------------------------
//	直線上に等間隔速度の弾を発射する
//------------------------------------------------------------------------------
function LineShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 基本速度
	let maxSpeed,	// 最高速度
	let angle,		// 角度
	let num,		// 直線上の弾数（1の場合は基本速度の弾1発のみ）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let numSpeed = 0;
	if( num > 1 ){ numSpeed = ( maxSpeed - speed ) / ( num - 1 ); }
	loop( num ){
		CreateShot01( x, y, speed, angle, graphic, delay );
		speed += numSpeed;
	}
}

//------------------------------------------------------------------------------
//	扇状（nWay）にLineShotを発射する
//------------------------------------------------------------------------------
function WideLineShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 基本速度
	let maxSpeed,	// 最高速度
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let way,		// Way数
	let num,		// 直線上の弾数（1の場合は基本速度の弾1発のみ）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let numSpeed = 0;
	if( num > 1 ){ numSpeed = ( maxSpeed - speed ) / ( num - 1 ); }
	let wayAngle = 0;
	if( way > 1 ){
		wayAngle = wideAngle / ( way - 1 );
		angle -= wideAngle / 2;
	}
	loop( way ){
		let _speed = speed;
		loop( num ){
			CreateShot01( x, y, _speed, angle, graphic, delay );
			_speed += numSpeed;
		}
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にLineShotを発射する
//------------------------------------------------------------------------------
function RoundLineShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 基本速度
	let maxSpeed,	// 最高速度
	let angle,		// 角度
	let way,		// Way数
	let num,		// 直線上の弾数（1の場合は基本速度の弾1発のみ）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let numSpeed = 0;
	if( num > 1 ){ numSpeed = ( maxSpeed - speed ) / ( num - 1 ); }
	let wayAngle = 360 / way;
	loop( way ){
		let _speed = speed;
		loop( num ){
			CreateShot01( x, y, _speed, angle, graphic, delay );
			_speed += numSpeed;
		}
		angle += wayAngle;
	}
}

//------------------------------------------------------------------------------
//	全方向にWideLineShotを発射する
//------------------------------------------------------------------------------
function RoundWideLineShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 基本速度
	let maxSpeed,	// 最高速度
	let angle,		// 角度
	let wideAngle,	// 扇の角度
	let wideWay,	// 扇Way数（扇1つを構成するWay数）
	let roundWay,	// 全方向Way数（扇の数）
	let num,		// 直線上の弾数（1の場合は基本速度の弾1発のみ）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let numSpeed = 0;
	if( num > 1 ){ numSpeed = ( maxSpeed - speed ) / ( num - 1 ); }
	let roundWayAngle = 360 / roundWay;
	let wideWayAngle = 0;
	if( wideWay > 1 ){ wideWayAngle = wideAngle / ( wideWay - 1 ); }
	loop( roundWay ){
		let _angle = angle;
		if( wideWay > 1 ){ _angle -= wideAngle / 2; }
		loop( wideWay ){
			let _speed = speed;
			loop( num ){
				CreateShot01( x, y, _speed, _angle, graphic, delay );
				_speed += numSpeed;
			}
			_angle += wideWayAngle;
		}
		angle += roundWayAngle;
	}
}

//------------------------------------------------------------------------------
//	画面端で反射する弾を発射する
//	※ SetShotDirectionType は ABSOLUTE にしておく必要がある
//	※ 速度が大きい程、反射位置の誤差が大きくなる
//------------------------------------------------------------------------------
function ReflectShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度
	let reflectNum,	// 反射回数
	let reflectL,	// 画面左端で反射 true/false
	let reflectU,	// 画面上端で反射 true/false
	let reflectR,	// 画面右端で反射 true/false
	let reflectD,	// 画面下端で反射 true/false
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let minX = GetClipMinX();
	let maxX = GetClipMaxX();
	let minY = GetClipMinY();
	let maxY = GetClipMaxY();
	let totalFrame = 0;
	CreateShotA( 0, x, y, delay );
	SetShotDataA( 0, 0, speed, angle, 0, 0, 0, graphic );
	while( reflectNum >= 1 ){
		while( angle < 0 ){ angle += 360; }
		if( angle >= 360 ){ angle %= 360; }
		let angleLU = atan2( y - minY, x - minX ) + 180;
		let angleRU = atan2( y - minY, x - maxX ) + 180;
		let angleLD = atan2( y - maxY, x - minX ) + 180;
		let angleRD = atan2( y - maxY, x - maxX ) + 180;
		if( angleRU == 0 ){ angleRU = 360; }
		if( angleRD == 360 ){ angleRD = 0; }
		let reflectLength = 0;
		let reflectX = 0;
		let reflectY = 0;
		let reflectAngle = 0;
		let reflect = false;
		if( angle >= angleRU || angle < angleRD ){
			reflectLength = ( maxX - x ) / cos( angle );
			reflectX = maxX;
			reflectY = y + reflectLength * sin( angle );
			reflectAngle = 180 - angle;
			reflect = reflectR;
		}
		else if( angle >= angleLD && angle < angleLU ){
			reflectLength = ( minX - x ) / cos( angle );
			reflectX = minX;
			reflectY = y + reflectLength * sin( angle );
			reflectAngle = 180 - angle;
			reflect = reflectL;
		}
		else if( angle >= angleLU && angle < angleRU ){
			reflectLength = ( minY - y ) / sin( angle );
			reflectX = x + reflectLength * cos( angle );
			reflectY = minY;
			reflectAngle = - angle;
			reflect = reflectU;
		}
		else{
			reflectLength = ( maxY - y ) / sin( angle );
			reflectX = x + reflectLength * cos( angle );
			reflectY = maxY;
			reflectAngle = - angle;
			reflect = reflectD;
		}
		if( !reflect ){ break; }
		x = reflectX;
		y = reflectY;
		angle = reflectAngle;
		totalFrame += reflectLength / speed;
		SetShotDataA( 0, totalFrame, NULL, angle, 0, 0, 0, graphic );
		reflectNum --;
	}
	FireShot( 0 );
}

//------------------------------------------------------------------------------
//	重力で加速する弾を発射する
//	※ 角度、重力角度は絶対角度指定（SetShotDirectionTypeの状態には関係しない）
//------------------------------------------------------------------------------
function GravityShot(
	let x,			// 弾源x座標
	let y,			// 弾源y座標
	let speed,		// 速度
	let angle,		// 角度（絶対角度）
	let grvSpeed,	// 重力加速度
	let grvAngle,	// 重力角度（絶対角度）
	let graphic,	// 画像
	let delay		// 遅延フレーム数
){
	let xSpeed = speed * cos( angle );
	let ySpeed = speed * sin( angle );
	let accXSpeed = grvSpeed * cos( grvAngle );
	let accYSpeed = grvSpeed * sin( grvAngle );
	let maxXSpeed = [ 99, - 99 ][ accXSpeed < 0 ];
	let maxYSpeed = [ 99, - 99 ][ accYSpeed < 0 ];
	CreateShot12( x, y, xSpeed, ySpeed, accXSpeed, accYSpeed, maxXSpeed, maxYSpeed, graphic, delay );
}
