#include "./PlayerAnimation.dnh"
#include "./PlayerEffect.dnh"

let GetCenterX = GetStgFrameWidth()/2;
let GetCenterY = GetStgFrameHeight()/2;
let GetClipMinX = 0;
let GetClipMinY = 0;
let GetClipMaxX = GetStgFrameWidth();
let GetClipMaxY = GetStgFrameHeight();

let Texture = current ~ "./img/marisa_shots.png";
let SE_GRAZE = current ~ "./se/graze.wav";
let SE_PDOWN = current ~ "./se/playerdown.wav";
let SE_PSHOT = current ~ "./se/playershot.wav";
let SE_EPLAYER = current ~ "./se/extend1.wav";
let SE_ESPELL = current ~ "./se/extend2.wav";


function LoadPlayerData{
	let path = current ~ "./lib/MarisaShotData.dnh";
	LoadPlayerShotData(path); //自弾画像ロード
	LoadTextureInLoadThread(Texture);
	LoadSound(SE_GRAZE);
	LoadSound(SE_PDOWN);
	LoadSound(SE_PSHOT);
	LoadSound(SE_EPLAYER);
	LoadSound(SE_ESPELL);
}

function init_system{
	SetPlayerLife(2);
	SetPlayerSpell(2);
	SetPlayerPower(100);
}

function event_system{
	alternative(GetEventType())
	case(EV_REQUEST_SPELL){
		//スペルカード要求
		let spell = GetPlayerSpell();//残りスペル数
		if(spell >= 1){

			SetScriptResult(true);//スペル発動可能
			SetPlayerSpell(spell-1);//スペル数を1減らす
			TSpell();//スペルタスク起動	
		}
		else{
			SetScriptResult(false);//スペル発動不可
		}
	}
	case(EV_HIT){
		//被弾
		PlaySE(SE_PDOWN);
		TExplosion();
	}
	case(EV_PLAYER_SHOOTDOWN){
		//撃墜されたらpowerが100なくなる。
		//これをコメントアウトすると撃墜されてもパワーが減らなくなる
		SetPlayerPower(GetPlayerPower-100);
	}
	case(EV_PLAYER_REBIRTH){
		//復帰

		//残スペルが２未満なら補充
		if(GetPlayerSpell() < 2){
			SetPlayerSpell(2);
		}
		//パワーが100以下だったら復帰時に100に戻す
		//撃墜時にオプションを消すために入れてる処理
		if(GetPlayerPower < 100){
			SetPlayerPower(100);
		}
		//復帰後4秒は無敵
		SetPlayerInvincibilityFrame(240);
	}
	case(EV_GRAZE){
		//グレイズ通知
		PlaySE(SE_GRAZE);
	}
	case(EV_GET_ITEM)
	{
		//アイテム取得通知
		let itemType = GetEventArgument(0);
		alternative(itemType)
		case(ITEM_1UP){
			PlaySE(SE_EPLAYER);
			SetPlayerLife(GetPlayerLife()+1);
		}
		case(ITEM_1UP_S){
			//残機の欠片などを出したい場合はその処理をここに書くこと。
		}
		case(ITEM_SPELL){
			PlaySE(SE_ESPELL);
			SetPlayerSpell(GetPlayerSpell()+1);
		}
		case(ITEM_SPELL_S){
			//ボムの欠片などを出したい場合はその処理をここに書くこと。
		}
		case(ITEM_POWER){
			//大Pを習得するとpowarが100上昇
			SetPlayerPower(min(400, GetPlayerPower+100));
		}
		case(ITEM_POWER_S){
			//Pを習得する度にpowarが1上昇
			SetPlayerPower(min(400, GetPlayerPower+1));
		}
	}
}

//ホーミング弾に使う処理（今回は使っていない）
//RAINS3から引用させていただいてます
function Horming(toAngle, angle, dAngle){
	toAngle %= 360;
	angle %= 360;

	let ret = toAngle-angle;
	if(ret >= 180){ret -= 360;}//180°以上なら-180〜180内に補正
	if(ret < -180){ret += 360;}//-180°未満なら-180〜180内に補正

	if((|ret|) < dAngle){
		angle = toAngle;
	}else{
		if(sin(ret) > 0){
			angle += dAngle;
		}else{
			angle -= dAngle;
		}
	}
	if(angle >= 360){angle -= 360;}
	if(angle < 0){angle += 360;}

	return angle;
}

//指定位置が画面外から距離ｄ離れているかを調べる関数(boorean型)
function IsOut(x, y, d){
	if(absolute(GetCenterX-x) < (GetCenterX+d) &&
		absolute(GetCenterY-y) < (GetCenterY+d)){
		return false;
	}else{return true;}
}

//指定位置が自機から距離ｄ内かを調べる関数(boorean型)
function InCurcleToPlayer(x, y, d){
	if((GetPlayerX-x)^2 + (GetPlayerY-y)^2 < d^2){
		return true;
	}else{return false;}
}

//指定位置から自機までの距離を返す関数(real型)
function GetDistanceToPlayer(x, y){
	let d = ((GetPlayerX-x)^2 + (GetPlayerY-y)^2)^0.5;
	return d;
}

//指定位置から自機までの距離の２乗を返す関数(real型)
function GetDistanceToPlayer2(x, y){
	let d = (GetPlayerX-x)^2 + (GetPlayerY-y)^2;
	return d;
}
