//============================================
//スクリプト用ライブラリ REMY
//基本関数ライブラリ
//ライブラリの他の関数からも呼び出すので読み込み必須
//============================================



//ライブラリバージョン取得=======================================
function REMY_GetLibVersion(){

	return _VERSION;
}//end functoin


//エラー表示===========================================
//タスク二重起動エラー
//ライブラリ内部からのみ参照
function private_REMY_ErrorDouble(let name){
	RaiseError( name ~ " の二重起動です","ERROR");
}//end function



//範囲外判定=================================

//簡易版
//x,y:判定する数値
//dist:画面枠からの距離
//distの数値分小さくなった四角の中にx、yが存在するかを返す
function REMY_IsOutOfClip(let x, let y, let dist){

	return REMY_IsOutOfClipEx(x, y, GetClipMinX()+dist, GetClipMinY()+dist, GetClipMaxX()-dist, GetClipMaxY()-dist);

}//end function

//x,y:判定する数値
//min_x,min_y,max_x,max_y:判定枠
//(min_x,min_y,max_x,max_y)の四角内にx、yが存在するかを返す
function REMY_IsOutOfClipEx(let x, let y, let min_x, let min_y, let max_x, let max_y){

	return (x < min_x || x > max_x || y < min_y || y > max_y);

}//end function





//符号取得------------------------------
//val:判定する数値
//正なら1、負なら-1、ゼロなら0を返す
function REMY_GetSign(let val){

	if(val > 0){ return 1;}
	else if(val < 0){ return -1;}
	return 0;

}//end function


//値の閾値チェック------------------------------


//補正
//val:判定する数値
//min,max:最大値、最小値
//is_loop:値をループさせるか（trueだと最大最小でループ、falseだと最大、最小で止まります）
//値を範囲内に補正して返す
function REMY_GetNumLimited(let val, let min, let max, let is_loop){

	if( !is_loop ){
		if(val < min){ return min; }
		else if(val > max){ return max; }
	}else{
		if(val < min){ return (min-val)%(max-min)+min; }
		else if(val > max){ return (val-max)%(max-min)+min; }		
	}
	return val; 

}//end function

//最大値を返す
function REMY_GetNumMax(let val, let max){

	if(val < max){ return max; }
	return val; 

}//end function

//最小値を返す
function REMY_GetNumMin(let val, let min){

	if(val > min){ return min; }
	return val; 

}//end function

//補正せず真偽値だけ返す
function REMY_IsNumLimited(let val, let min, let max){
	return (val >= min && val <= max );
}//end function




//角度チェック------------------------------

//angle:角度
//-360から720までの角度を0-360に補正して返す
function REMY_GetAngleLimited(let angle){

	if (angle>=360)		{ return (angle - 360); }
	else if (angle<0)	{ return ( angle + 360); }
	return angle;

}//end function


//遅延SEタスク------------------------------

//se:鳴らすSE
//delay:遅らせるフレーム数
task REMY_TaskDelaySE(let se, let delay){

	loop(delay){yield;}
	PlaySE(se);
	return;

}//end task


//エフェクトオブジェクトの初期化----------------------------------


//texture:使用するテクスチャ
//vert_num:作成頂点数
//layer:描画レイヤ
//エフェクトオブジェクトを作成し、オブジェクトIDを返す
function REMY_CreateEffectObject(let texture, let vert_num, let layer){

	let obj = Obj_Create(OBJ_EFFECT);
	ObjEffect_SetTexture(obj, texture);
	ObjEffect_SetRenderState(obj, ADD);
	ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
	ObjEffect_CreateVertex(obj, vert_num);
	ObjEffect_SetLayer(obj, layer);
	Obj_SetAutoDelete(obj,false);
	Obj_SetSpeed(obj,0);

	return obj;

}//end function



//四角のエフェクトオブジェクトの頂点パラメータ設定

//obj:操作オブジェクトID
//rect:UV値の配列 [x1,y1,x2,y2] 
//x_cent,y_cent:XY中心を、画像の中心からどれだけずらすか
//              (例:x_cent=-10,y_cent=10だと画像の中心より左下がXY(0,0)になる)
//alpha,red,green,blue:アルファ、RGB値
//REMY_CreateEffectObject()で作成したエフェクトオブジェクトの頂点設定用
//PRIMITIVE_TRIANGLESTRIP以外のオブジェクトには使えません
function REMY_SetObjectVertexSquare(let obj, let rect, let x_cent, let y_cent, let alpha, let red ,let green, let blue){

	let x_size = (rect[2]-rect[0])/2;
	let y_size = (rect[3]-rect[1])/2;

	ascent(i in 0..4){
		ObjEffect_SetVertexXY(obj, i, [ -(x_size + x_cent), (x_size - x_cent)  ][trunc(i/2)], [ -(y_size + y_cent), (y_size - y_cent) ][i%2]);
		ObjEffect_SetVertexUV(obj, i, [ rect[0], rect[2] ][trunc(i/2)],[ rect[1], rect[3] ][i%2]);
		ObjEffect_SetVertexColor(obj, i, alpha, red , green, blue);
	}
	return;

}//end function


//四角のエフェクトオブジェクトの頂点ARGB変更
//obj:操作オブジェクトID
//alpha,red,green,blue:アルファ、RGB値
function REMY_SetObjectColorSquare(let obj, let alpha, let red ,let green, let blue){

	ascent(i in 0..4){
		ObjEffect_SetVertexColor(obj, i, alpha, red , green, blue);
	}
	return;

}//end function


//エフェクトオブジェクトの頂点ARGB変更。こちらは四角に限りません
//obj:操作オブジェクトID
//vert_num:頂点数
//alpha,red,green,blue:アルファ、RGB値

function REMY_SetObjectColorMultiple(let obj, let vert_num, let alpha, let red ,let green, let blue){

	ascent(i in 0..vert_num){
		ObjEffect_SetVertexColor(obj, i, alpha, red , green, blue);
	}
	return;

}//end function
