/**
 * 指定したフレーム数処理を止める
 * 
 * @param {Integer} time 待つフレーム数
 */
function FWait( time ){
	loop( time ){
		yield;
	}
}

/**
 * 指定したフレーム数処理を止める
 * ミス時は復活まで自動待機します
 * 
 * @param {Integer} time 待つフレーム数
 */
function PWait( time ){
	while( time > 0 ){
		if( !OnMissed() ){
			time -= 1;
		}
		
		yield;
	}
}

/**
 * OBJ_SHOT生成関数
 * CreatePlayerShot01と同じ役割を果たす
 * 
 * @param {Integer} x           弾源x座標
 * @param {Integer} y           弾源y座標
 * @param {Integer} speed       速度
 * @param {Integer} angle       角度
 * @param {Integer} pow         威力
 * @param {Integer} penetration 貫通力
 * @param {Integer} graph       画像
 * @param {Integer} alpha       α値
 * @return {Object} 作成したオブジェクトのid
 */
function CreateObjPlayerShot( x, y, speed, angle, pow, penetration, graph, alpha ){
	let obj = Obj_Create( OBJ_SHOT );
	Obj_SetPosition( obj, x, y );
	Obj_SetSpeed( obj, speed );
	Obj_SetAngle( obj, angle );
	ObjShot_SetGraphic( obj, graph );
	ObjShot_SetDamage( obj, pow );
	ObjShot_SetPenetration( obj, penetration );
	Obj_SetAlpha( obj, alpha );
	
	return obj;
}


/**
 * キーステートを格納する変数
 */
let Key_Left     = 0;
let Key_Right    = 0;
let Key_Up       = 0;
let Key_Down     = 0;
let Key_Shot     = 0;
let Key_Bomb     = 0;
let Key_SlowMove = 0;
let Key_Skip     = 0;
let Key_User     = 0;

/**
 * キーステートを一括で格納する変数
 */
function GetKeyStateAll(){
	Key_Left     = GetKeyState( VK_LEFT );
	Key_Right    = GetKeyState( VK_RIGHT );
	Key_Up       = GetKeyState( VK_UP );
	Key_Down     = GetKeyState( VK_DOWN );
	Key_Shot     = GetKeyState( VK_SHOT );
	Key_Bomb     = GetKeyState( VK_BOMB );
	Key_SlowMove = GetKeyState( VK_SLOWMOVE );
	Key_Skip     = GetKeyState( VK_SKIP );
	Key_User     = GetKeyState( VK_USER );
}

/**
 * 指定した点から最も近い敵のXY座標を取得する
 * 
 * @param {Integer} x       基点x座標
 * @param {Integer} y       基点y座標
 * @return {Array(Integer)} xy座標の配列 見つからなかった場合は画面の中央が返る
 */
function GetNearestEnemyXY( x, y ){
	let tx = GetCenterX();
	let ty = GetCenterY();
	let mindist = 1000 * 1000;
	let eid = 0;
	let ex = 0;
	let ey = 0;
	let dx = 0;
	let dy = 0;
	let dist = 0;
	
	ascent( enemy in EnumEnemyBegin()..EnumEnemyEnd() ){
		eid = EnumEnemyGetID( enemy );
		ex = GetEnemyInfo( eid, ENEMY_X );
		ey = GetEnemyInfo( eid, ENEMY_Y );
		dx = x - ex;
		dy = y - ey;
		dist = dx ^ 2 + dy ^ 2;
		
		if( mindist > dist ){
			mindist = dist;
			tx = ex;
			ty = ey;
		}
	}
	
	return [ tx, ty ];
}

/**
 * 指定した点の前方に存在し、最も近い敵のXY座標を取得する
 * 
 * @param {Integer} x       基点x座標
 * @param {Integer} y       基点y座標
 * @param {Integer} wid     許容する横幅
 * @return {Array(Integer)} xy座標の配列 見つからなかった場合はNULLが返る
 */
function GetFrontEnemyXY( x, y, wid ){
	let tx = NULL;
	let ty = NULL;
	let mindist = 1000 * 1000;
	let eid = 0;
	let ex = 0;
	let ey = 0;
	let dx = 0;
	let dy = 0;
	let dist = 0;
	let wdist = 0;
	
	ascent( enemy in EnumEnemyBegin()..EnumEnemyEnd() ){
		eid = EnumEnemyGetID( enemy );
		ex = GetEnemyInfo( eid, ENEMY_X );
		ey = GetEnemyInfo( eid, ENEMY_Y );
		dx = x - ex;
		dy = y - ey;
		dist = dx ^ 2 + dy ^ 2;
		wdist = absolute( ex - x );
		
		if( mindist > dist && wdist < wid && dy > 0 ){
			mindist = dist;
			tx = ex;
			ty = ey;
		}
	}
	
	return [ tx, ty ];
}
