
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//基本関数
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

//２数の大きい方を返す関数
function max(a, b){ if( a > b ){ return a; } return b; }

//２数の小さい方を返す関数
function min(a, b){ if( a > b ){ return b; } return a; }

//２数の大きい方を返す関数（絶対値比較）
function max_abs(a, b){ if( (|a|) > (|b|) ){ return a; } return b; }

//２数の小さい方を返す関数（絶対値比較）
function min_abs(a, b){ if( (|a|) > (|b|) ){ return b; } return a; }

//３数の中間値を返す関数
function mid(a, b, c){ if( a > b ){ if( a > c ){ if( b > c ){ return b; } return c; } return a; } if( b > c ){ if( a > c ){ return a; } return c; } return b; }

//与えられた数の絶対値を返す関数
function abs(x){ if( x > 0 ){ return x; } return -x; }

//与えられた数の符号を返す関数（ただし0なら1を返す）
function sign(x){ if( x >= 0 ){ return 1; } return -1; }

//三角形の斜辺の長さを求める関数
function hypot(x, y){ return ((x ^ 2 + y ^ 2) ^ 0.5); }

//正方形の領域が画面外にあるかどうかを判定する関数
function IsOutOfClipRange(x, y, r)
{
	if( x <= GetClipMinX() - r || x >= GetClipMaxX() + r || y <= GetClipMinY() - r || y >= GetClipMaxY() + r ){
		return 1;
	}
	return 0;
}

//角度を-180〜180の間に標準化する関数
function NormalizeAngle(angle)
{
	if( angle >= -180 && angle <= 180 ){
		return angle;
	}
	if( angle > 0 ){
		angle = (angle + 180) % 360 - 180;
	}
	else{
		angle = -((-angle + 180) % 360 - 180);
	}
	return angle;
}

//指定位置から自機への狙撃角度を取得する関数
function GetSnipeAngle(x, y)
{
	return atan2(GetPlayerY() - y, GetPlayerX() - x);
}

//ホーミング弾の角度を取得する関数
function GetHomingAngle(x, y, current_angle, max_d_angle)
{
	let d_ang = (GetSnipeAngle(x, y) - NormalizeAngle(current_angle) + 540) % 360 - 180;

	if( d_ang > 0 ){
		return NormalizeAngle(current_angle + min(d_ang,  max_d_angle));
	}
	else if( d_ang < 0 ){
		return NormalizeAngle(current_angle + max(d_ang, -max_d_angle));
	}
	return current_angle;
}

//指定の座標を(0, 0)を基準に回転させた座標を取得
function GetRotateX(x, y, angle){ return (x * cos(angle) - y * sin(angle)); }
function GetRotateY(x, y, angle){ return (x * sin(angle) + y * cos(angle)); }

//指定の座標を(0, 0, 0)を基準に三次元回転させた座標を取得（回転順はyz, zx, xy）
function GetRotate3D(x, y, z, ayz, azx, axy)
{
	let x1 = x;
	let y1 = GetRotateX(y, z, ayz);
	let z1 = GetRotateY(y, z, ayz);
	let x2 = GetRotateY(z1, x1, azx);
	let y2 = y1;
	let z2 = GetRotateX(z1, x1, azx);
	let ret = [GetRotateX(x2, y2, axy), GetRotateY(x2, y2, axy), z2];

	return ret;
}

//タスク内で一定時間停止する関数
function Wait(wait)
{
	loop( wait ){
		yield;
	}
}

