//共通で使うファイルとか
let imgCircle	= GetCurrentScriptDirectory() ~ "\img\mcircle.png";
let userShot = GetCurrentScriptDirectory() ~ ".\lib\data_usershot.txt";

//サウンドデータの在処
#include_function ".\lib\lib_se.txt"

//キャラ画像用フラグ
let ATTACK_FLAG	= 0;	//攻撃中

sub finish_bakuhatu
{
//	PlaySE(SE_BOMB2);
//	PlaySE(SE_BOMB);
}

// ダメージレートの変更
task TRate {
	loop(D_WAIT) { yield; }
	SetDamageRate(D_RATE, D_RATE);
}


function moveBoss(minX, maxX, minY, maxY, weight, speed, gamen_side, gamen_top, gamen_bottom)
{
	moveToPlayer(rand(minX, maxX), rand(minY, maxY), weight, speed,
		GetClipMinX + gamen_side, GetClipMinY + gamen_top,
		GetClipMaxX - gamen_side, GetClipMinY + gamen_bottom);
}

// なるべくプレイヤーの方向に移動
function moveToPlayer(xMove, yAdd, weight, max_speed, left, top, right, bottom) {
	let x;
	let y;

	if(GetPlayerX < GetX) {
		// プレイヤーより右に敵がいれば、敵は左に動きます。
		x = GetX - xMove;

		// 但し、敵が可動領域の左端よりも左にいくようなら、右に動きます。
		if(x < left) {
			x = GetX + xMove;
		}
	} else {
		// さもなくば、敵は右に動きます。
		x = GetX + xMove;

		// 但し、敵が可動領域の右端よりも右にいくようなら、左に動きます。
		if(right < x) {
			x = GetX - xMove;
		}
	}

	// 可動領域の外に行く場合は、端っこで止めます。
	let flag = rand_int(0, 1);
	if (!(GetY+yAdd < top && GetY-yAdd > bottom))
	{
		if (GetY+yAdd < top) { flag = 0; }
		else if (GetY-yAdd > bottom) { flag = 1; }
	}

	if (flag == 1) { y = GetY + yAdd; }
	else { y = GetY - yAdd; }

	if(y < top) {
		y = top;
	} else if(bottom < y) {
		y = bottom;
	}

	SetMovePosition03(x, y, weight, max_speed);
}

// ===========================================================
// 星蓮船風スペカ用エフェクト
// 魔方陣ぐるぐる
// ===========================================================

task effect_circle(c_alpha, c_red, c_green, c_blue)
{
	//初期設定
	let obj = Obj_Create(OBJ_EFFECT);
	ObjEffect_SetTexture(obj, imgCircle);
	ObjEffect_SetRenderState(obj, ADD);
	ObjEffect_SetLayer(obj, 2);
	ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
	ObjEffect_CreateVertex(obj, 4);
	ObjEffect_SetVertexUV(obj, 0,   0,   0);
	ObjEffect_SetVertexUV(obj, 1, 256,   0);
	ObjEffect_SetVertexUV(obj, 2, 256, 256);
	ObjEffect_SetVertexUV(obj, 3,   0, 256);
	ObjEffect_SetVertexXY(obj, 0,-85,-85);
	ObjEffect_SetVertexXY(obj, 1, 85,-85);
	ObjEffect_SetVertexXY(obj, 2, 85, 85);
	ObjEffect_SetVertexXY(obj, 3,-85, 85);
	ascent (let n in 0 .. 4)
	{
		ObjEffect_SetVertexColor(obj, n, c_alpha, c_red, c_green, c_blue);
	}

	
	//ずっとループのターン
	let t = 0;
	let angle = 0; let scale = 0;
	
	loop(20)
	{
		scale += 0.05;
		ObjEffect_SetScale(obj, scale, scale);
		Obj_SetPosition(obj, GetX, GetY);
		
		yield;
	}
	loop
	{
		ObjEffect_SetScale(obj, scale, scale);
		ObjEffect_SetAngle(obj, 0, 0, angle);
		Obj_SetPosition(obj, GetX, GetY);
		
		let c = sin(t);
		scale += c/60;
		angle -= (5+c*2);
		
		t+=3; angle %= 360;
		
		yield;
	}

	Obj_Delete(obj);
}

// 初期位置へ移動し、攻撃開始
sub standBy {
	let wIni = 120;

	SetMovePosition02(xIni, yIni, wIni);
	setGraphicMove;

	SetInvincibility(wIni);
	wait(wIni-20);
	if (CC_RED > 0) { effect_circle(128, CC_RED, CC_GREEN, CC_BLUE); }
	wait(20);

	setGraphicStop;
	timeCountDown;
}

sub Ini_Graphic
{
	LoadGraphic(imgCircle);

	LoadGraphic(imgBoss);
	SetTexture(imgBoss);
	LoadUserShotData(userShot);

	setGraphicStop;
}

// 力を溜める的なエフェクト
sub powerSave {
	PlaySE(SE_POWER);
	Concentration01(50);
	wait(90);
}

// wフレームだけ待つ
function wait(w) {
	loop(w) { yield; }
}


// プレイヤーへの角度を取得する
function getAngleToPlayer(x, y) {
	return atan2(GetPlayerY - y, GetPlayerX - x);
}

//タイマー
task timeCountDown {
	LoadSE(SE_TIMER);
	while (GetTimer > 9) { yield; }
	loop(10) {
		PlaySE(SE_TIMER);
		loop(60) { yield; }
	}
	DeleteSE(SE_TIMER);
}

// angleを0〜360度の範囲に揃える
function getAngle360(angle)
{
	let tmp = angle % 360;
	while (tmp < 0) { tmp += 360; }
	return (tmp);
}

// 任意の点(x,y),(angle)から壁までの距離を返す
function getKyoriToKabe(x, y, angle)
{
	let chk_angle = getAngle360(angle);
	if (chk_angle < 90)
	{
		if (x > GetClipMaxX || y > GetClipMaxY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMaxX-x);
		if (chk_y >= GetClipMaxY)
			{ return ( ( (cos(chk_angle)*(GetClipMaxY-y))^2 + (GetClipMaxY-y)^2 )^0.5); }
		else
			{ return ( ( (GetClipMaxX-x)^2 + (tan(chk_angle)*(GetClipMaxX-x))^2 )^0.5); }
	}
	else if (chk_angle < 180)
	{
		if (x < GetClipMinX || y > GetClipMaxY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMinX-x);
		if (chk_y >= GetClipMaxY)
			{ return ( ( (cos(chk_angle)*(GetClipMaxY-y))^2 + (GetClipMaxY-y)^2 )^0.5); }
		else
			{ return ( ( (x-GetClipMinX)^2 + (tan(chk_angle)*(x-GetClipMinX))^2 )^0.5); }
	}
	else if (chk_angle < 270)
	{
		if (x < GetClipMinX || y < GetClipMinY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMinX-x);
		if (chk_y <= GetClipMinY)
			{ return ( ( (cos(chk_angle)*(y-GetClipMinY))^2 + (y-GetClipMinY)^2 )^0.5); }
		else
			{ return ( ( (x-GetClipMinX)^2 + (tan(chk_angle)*(x-GetClipMinX))^2 )^0.5); }
	}
	else
	{
		if (x > GetClipMaxX || y < GetClipMinY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMaxX-x);
		if (chk_y <= GetClipMinY)
			{ return ( ( (cos(chk_angle)*(y-GetClipMinY))^2 + (y-GetClipMinY)^2 )^0.5); }
		else
			{ return ( ( (GetClipMaxX-x)^2 + (tan(chk_angle)*(GetClipMaxX-x))^2 )^0.5); }
	}
	
	return (-1);	//謎のエラー
}

// 任意の点(x,y),(angle)から弾を発射し、当たる壁の位置を返す
// 0 = 左, 1 = 右, 2 = 上, 3 = 下
// -1 = エラー
function getItiToKabe(x, y, angle)
{
	let chk_angle = getAngle360(angle);
	if (chk_angle < 90)
	{
		if (x > GetClipMaxX || y > GetClipMaxY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMaxX-x);
		if (chk_y >= GetClipMaxY)
			{ return ( 3 ); }
		else
			{ return ( 1 ); }
	}
	else if (chk_angle < 180)
	{
		if (x < GetClipMinX || y > GetClipMaxY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMinX-x);
		if (chk_y >= GetClipMaxY)
			{ return ( 3 ); }
		else
			{ return ( 0 ); }
	}
	else if (chk_angle < 270)
	{
		if (x < GetClipMinX || y < GetClipMinY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMinX-x);
		if (chk_y <= GetClipMinY)
			{ return ( 2 ); }
		else
			{ return ( 0 ); }
	}
	else
	{
		if (x > GetClipMaxX || y < GetClipMinY) { return (-1); }

		let chk_y = y+tan(chk_angle)*(GetClipMaxX-x);
		if (chk_y <= GetClipMinY)
			{ return ( 2 ); }
		else
			{ return ( 1 ); }
	}
	
	return (-1);	//謎のエラー
}

// 任意の点(x,y),(angle)から弾を発射し、その弾が反射した後の角度を返す(0~360, -1=ERROR)
function getReflectAngle(x, y, angle)
{
	let kabe = getItiToKabe(x, y, angle);
	if (kabe < 0) { return (-1) }
	
	let tmp = getAngle360(angle);
	if (kabe == 0 || kabe == 1)
		{ tmp = (180-angle+360)%360; }
	else
		{ tmp = 360-angle; }
	
	return (tmp);
}

function makeTokutenItem(count)
{
	loop(count)
	{
		let r = rand(0, 32^2)^0.5;
		let a = rand(0, 360);
		CreateItem(ITEM_SCORE, GetX+r*cos(a), GetY+r*sin(a));
	}
}