//==============================================================================
//	★ 東方弾幕風 特定の値を取得する関数
//	このファイルをinclude_functionで取り込むか、必要な部分をコピペして使用する
//==============================================================================
//	異なる位置にある2つの点AB間の距離を取得する
//------------------------------------------------------------------------------
function GetGapLength(
	let xA,		// 点Aのx座標
	let yA,		// 点Aのy座標
	let xB,		// 点Bのx座標
	let yB		// 点Bのy座標
){
	return ( ( xB - xA ) ^ 2 + ( yB - yA ) ^ 2 ) ^ 0.5;
}

//------------------------------------------------------------------------------
//	点Aから異なる位置にある点Bへの絶対角度を取得する
//------------------------------------------------------------------------------
function GetGapAngle(
	let xA,		// 点Aのx座標
	let yA,		// 点Aのy座標
	let xB,		// 点Bのx座標
	let yB		// 点Bのy座標
){
	return atan2( yB - yA, xB - xA );
}

//------------------------------------------------------------------------------
//	点Aからある距離、絶対角度にある点Bのx座標を取得する
//------------------------------------------------------------------------------
function GetGapX(
	let xA,			// 点Aのx座標
	let gapLength,	// 点Bまでの距離
	let gapAngle	// 点Bへの絶対角度
){
	return xA + gapLength * cos( gapAngle );
}

//------------------------------------------------------------------------------
//	点Aからある距離、絶対角度にある点Bのy座標を取得する
//------------------------------------------------------------------------------
function GetGapY(
	let yA,			// 点Aのy座標
	let gapLength,	// 点Bまでの距離
	let gapAngle	// 点Bへの絶対角度
){
	return yA + gapLength * sin( gapAngle );
}


////////////////////////////////////////////////////////////////////////////////
// 以下、独自の追加関数
////////////////////////////////////////////////////////////////////////////////

//最小値を返す
function Min( let a, let b ) {
	if ( a < b ) {
		return a;
	}
	return b;
}

//最大値を返す
function Max( let a, let b ) {
	if ( a > b ) {
		return a;
	}
	return b;
}

function MinMax( let a, let min, let max ) {
	if ( min > max ) {
		let swap = min;
		min = max;
		max = swap;
	}
	if ( a > max ) {
		return max;
	}
	else if ( a < min ) {
		return min;
	}
	else {
		return a;
	}
}

//numだけyieldする
function __Wait( let num ) {
	if ( num > 0 ) {
		loop ( num ) { yield; }
	}
}

/**
*	等速変化する内分カウンタです。
*
*	@param nStart 現在時間==0の時の初期値
*	@param nEnd 最終値
*	@param nNow 現在時間
*	@param nLimit 最終値に到達する時間
*	@return 初期値〜最終値に対し0〜到達時間の現在時間に相当する値
*/
function Smooth( let nStart, let nEnd, let nNow, let nLimit ){
	if( nNow >= nLimit || nStart == nEnd || nLimit <= 0 ){ return nEnd; }
	if( nNow <= 0 ){ return nStart; }
	return nStart + ( nEnd - nStart ) * nNow / nLimit;
}

/**
*	加速変化する内分カウンタです。
*
*	@param nStart 現在時間==0の時の初期値
*	@param nEnd 最終値
*	@param nNow 現在時間
*	@param nLimit 最終値に到達する時間
*	@return 初期値〜最終値に対し0〜到達時間の現在時間に相当する値
*/
function Accelerate( let nStart, let nEnd, let nNow, let nLimit ){
	if( nNow >= nLimit || nStart == nEnd || nLimit <= 0 ){ return nEnd; }
	if( nNow <= 0 ){ return nStart; }
	return nStart + ( ( nNow / nLimit ) ^ 2 * ( nEnd - nStart ) );
}

/**
*	減速変化する内分カウンタです。
*
*	@param nStart 現在時間==0の時の初期値
*	@param nEnd 最終値
*	@param nNow 現在時間
*	@param nLimit 最終値に到達する時間
*	@return 初期値〜最終値に対し0〜到達時間の現在時間に相当する値
*/
function SlowDown( let nStart, let nEnd, let nNow, let nLimit ){
	if( nNow >= nLimit || nStart == nEnd || nLimit <= 0 ){ return nEnd; }
	if( nNow <= 0 ){ return nStart; }
	return nStart + ( ( 1 - ( 1 - nNow / nLimit ) ^ 2 ) * ( nEnd - nStart ) );
}
