/*ボススクリプトや雑魚敵にて使用するローカルな関数ライブラリ*/

/*	定型変数	*/
let cx		= GetCenterX;
let cy		= GetCenterY;
let minx	= GetClipMinX;
let miny	= GetClipMinY;
let maxx	= GetClipMaxX;
let maxy	= GetClipMaxY;
let csd		= GetCurrentScriptDirectory;
/*	ここまで	*/


/*　フレーム制御関数　ここから　*/
function wait(w)//指定した数値フレーム待機する
{
	loop(w)
	{
		yield;
	}
}
/*　フレーム制御関数　ここまで　*/

/*　値を返す関数　ここから　*/
function GetAngleToPoint(x,y)//自分の位置から　特定の位置 x,yに対する角度を求める。
{
	return atan2(y-GetY,x-GetX);
}
function GetAngleToAB(x1,y1,x2,y2)//特定の座標(x1,y1)から特定の座標(x2,y2)までの角度を求める。
{
	return atan2(y2-y1,x2-x1);
}
function GetLengthToPoint(x,y)//自分の位置から　特定の位置 x,yまでの距離を求める。
{
	return ((x-GetX)^2+(y-GetY)^2)^(1/2);
}
function GetLengthToAB(x1,y1,x2,y2)//特定の座標点１〜特定の座標点２までの距離を求める
{
	return ((x2-x1)^2+(y2-y1)^2)^(1/2);
}
function GetDouX(x,r,deg)//任意の座標から半径rの円を書いた時、指定された角度に直線を引いた時に円と交差するＸ座標を返す関数
{
	return x+r*cos(deg);
}
function GetDouY(y,r,deg)//任意の座標から半径rの円を書いた時、指定された角度に直線を引いた時に円と交差するＹ座標を返す関数
{
	return y+r*sin(deg);
}
/*　値を返す関数　ここまで　*/

/*　描画関係の関数　ここから　*/
function GraphicDefault//グラフィックの設定を初期に戻す関数
{
	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetAlpha(255);
	SetColor(255,255,255);
	SetRenderState(ALPHA);
}
let SwitchPosition=0;//画像切り替えのタイミングを取る内部変数
function Drawsenemy(img)//妖精の自動描画関数　@Drawloop内で宣言するだけで、自動的に絵の切り替えを行う
{//imgで画像を指定する
	GraphicDefault;
	LoadGraphic(img);
	SetTexture(img);
	if(SwitchPosition<8)
	{
		SetGraphicRect(0,0,31,31);
	}
	else if(SwitchPosition<14)
	{
		SetGraphicRect(32,0,63,31);
	}
	else
	{
		SetGraphicRect(64,0,95,31);
	}
	if(SwitchPosition==20)
	{
		SwitchPosition=0;
	}
	DrawGraphic(GetX,GetY);
	SwitchPosition++;
}
let TEXT_X=0;	let TEXT_Y=0;//DrawMusic専用外部変数
function DrawMusic(name)//汎用　曲名描画関数  ステージなら@DrawTopObjectで使用を推奨
{
	SetFontColor(200,200,200,100,100,100);
	TEXT_X+=5;
	if(TEXT_X<=maxx-64)
	{
		DrawText("♪"~name,maxx-TEXT_X,maxy-32,17,255);
	}
	else if(TEXT_X<=maxx+300)
	{
		DrawText("♪"~name,maxx-(maxx-64),maxy-32,17,255);
	}
	else
	{
		if(TEXT_Y<=32)
		{
			DrawText("♪"~name,maxx-(maxx-64),maxy-32+TEXT_Y,17,255);
			TEXT_Y+=0.5;
		}
	}
}
let COUNT_B=0;//DrawBackGraphic用内部変数
function DrawBackGraphic(name,x1,y1,x2,y2,rollx,rolly)//背景画像を表示する自動スクロール対応関数
{
	SetGraphicRect(x1,y1,x2,y2);
	SetTexture(name);
	let by=cy-y2+(COUNT_B*rolly)%y2;
	while(by<=cy+y2)
	{
		let bx=cx-x2+(COUNT_B*rollx)%x2;
		while(bx<=cx+x2)
		{
			DrawGraphic(bx,by);
			bx+=x2;
		}
		by+=y2;
	}
	COUNT_B++;
}
/*上の関数はHAL900のぺぇじ 様のところで公開されている物を改造した上で関数化した物です*/
let FADE_TIME=0;//フレームカウント数を取得するDrawCrossFadeText関数専用外部変数
let FADE_TEXTX=0;//描画位置をスライドするDrawCrossFadeText関数専用外部変数
function DrawCrossFadeText(name1,name2,textx1,texty1,textx2,texty2)//任意の文字列１を黄色い文字で表示、その下にクロスフェードのデフォルトカラーで文字列２を表示する関数
{

/*	お好み設定		*/
	let FontSize1=17;//	第１文字列の文字サイズ		初期は１７
	let FontSize2=17;//	第２文字列の文字サイズ		初期は１７
	let FadeStart=30;//	第２文字列の描画の開始時間	初期は３０フレーム
	let FadeIn=60;//	フェードインにかける時間	初期は６０フレーム
	let Draw=100;//		実体化状態の描画時間		初期は１２０フレーム
	let FadeOut=60;//	フェードアウトにかける時間	初期は６０フレーム
	let Shift=8;//		文字をスライドさせる量		初期は８　３未満だと正常な動作を保障しません
	let DrawEnd=0;//	全ての描画を終了する時間	初期は自動判定（フェードアウト終了と同時に全て消えます）
/*	お好み設定ここまで	*/

	if(DrawEnd<=FadeStart+FadeIn+Draw+FadeOut)//DrawEndが他の合計よりも少ない場合の処理
	{
		DrawEnd=FadeStart+FadeIn+Draw+FadeOut;
	}
	if(FADE_TIME<DrawEnd)//描画時間中
	{
		SetFontColor(240,240,0,255,255,255);//黄色っぽい文字に設定
		DrawText(name1,textx1,texty1,FontSize1,255);
		SetFontColor(255,255,255,255,255,255);//原色に設定する
		if(FADE_TIME<FadeStart)
		{
			;
		}
		else if(FADE_TIME<FadeStart+FadeIn)//フェードイン中の処理
		{
			FADE_TEXTX=(FadeStart+FadeIn)*Shift-FADE_TIME*Shift;
			DrawText(name2,textx2+FADE_TEXTX,texty2,FontSize2,128);//半透明で描画　右からスライド
			DrawText(name2,textx2-FADE_TEXTX,texty2,FontSize2,128);//半透明で描画　左からスライド
		}
		else if(FADE_TIME<FadeStart+FadeIn+Draw)//実体化処理　約2秒
		{
			DrawText(name2,textx2,texty2,FontSize2,255);//実体化描画
		}
		else if(FADE_TIME<FadeStart+FadeIn+Draw+FadeOut)//フェードアウト中の処理　約2秒
		{
			FADE_TEXTX=(FADE_TIME-FadeStart-FadeIn-Draw)*Shift;//初期値0　１フレーム毎に４増加　300引くのは最初を0にするため
			DrawText(name2,textx2+FADE_TEXTX,texty2,FontSize2,128);//半透明で描画　右からスライド
			DrawText(name2,textx2-FADE_TEXTX,texty2,FontSize2,128);//半透明で描画　左からスライド
		}
	}
	FADE_TIME++;//カウントを増やす
}
let SWITCH_POSITION_B=0;//フレームカウントを格納するDrawfaily関数用外部変数
let MOVE_B=0;//0=正面向き 1=右向き 2=左向きを判定・格納するDrawfaily関数用外部変数
let CHANG_B=0;//正面・横向きの１〜３枚目のどれかを検出するDrawfaily関数用外部変数
let HEANDHE_B=0;//中間画像処理専用フレームカウントを格納するDrawfaily関数用外部変数
let POSX_B=GetX;//１フレーム前の自分のX座標を格納するDrawfaily関数専用外部変数
function Drawfaily(img,no)//妖精の自動描画関数part2
{
/*	[お好み設定]	以下の変数の値を変える事でお好みの設定ができます	*/

	let img1=10;	//１枚目を描画するフレーム数			初期設定１０フレーム	１〜３枚目は同じ時間が吉
	let img2=10;	//２枚目を描画するフレーム数			初期設定１０フレーム	もちろんバラバラでも大丈夫
	let img3=10;	//３枚目を描画するフレーム数			初期設定１０フレーム	これで安心魔界神
	let img4=7;	//中間画像を描画するフレーム数　		初期設定７フレーム	１〜３枚目より数字が大きいと違和感があります
	let scope_L=1.2;//移動時に正面向きとして許容する左移動座標量	初期設定１．２		値が小さいほど　遅い速度でも横向き判定にします（０で垂直以外全部横判定）
	let scope_R=1.2;//移動時に正面向きとして許容する右移動座標量	初期設定１．２		scope_Lとscope_Rは同じ値を推奨します。左右のバランスが崩れる恐れがあります

/*		ここから先の部分は特にいじらなくて問題ありません		*/

//	HEANDHE_Bは -img4〜+img4の間で変動　-だと右向きに変えてる最中　+だと左向きに変えてる最中

	let imgrect=[];//一番最初の短形画像の切り出し範囲を格納する箱
	let imgshift=0;//最初の画像から次の画像に切り替えるx軸方向の増加分を格納する変数
	if(no==1){imgrect=[0,0,31,31];imgshift=32;}else if(no==2){imgrect=[224,0,255,31];imgshift=32;}else if(no==3){imgrect=[0,32,47,79];imgshift=48;}else if(no==4){imgrect=[0,80,47,127];imgshift=48;}
	else if(no==5){imgrect=[0,128,47,175];imgshift=48;}else if(no==6){imgrect=[0,176,47,223];imgshift=48;}else if(no==7){imgrect=[0,224,63,287];imgshift=64;}else if(no==8){imgrect=[0,288,63,351];imgshift=64;}
	LoadGraphic(img);
	SetTexture(img);
	if(GetX<=POSX_B+scope_R && GetX>=POSX_B-scope_L)//正面向き処理
	{
		SetGraphicRect(imgrect[0]+imgshift*3,imgrect[1],imgrect[2]+imgshift*3,imgrect[3]);
		if(MOVE_B==1)//右向きから移行したかを調べる
		{
			SWITCH_POSITION_B=img1+img2+img3+10;//中間処理の時のカウントを代入			
		}
		if(MOVE_B==2)//左向きから移行したかを調べる
		{
			SetGraphicAngle(180,0,0);//画像を⇔反転にする
			SWITCH_POSITION_B=img1+img2+img3+10;//中間処理の時のカウントを代入
		}
		if(SWITCH_POSITION_B>=img1+img2+img3+10)
		{
			if(HEANDHE_B<=img4)//中間画像描画フレーム
			{
				HEANDHE_B++;
			}
			else
			{
				HEANDHE_B=0;
			}
			if(CHANG_B==1 && HEANDHE_B==0)//CHANG_Bの状態から本来のフレームカウントを大体割り出す
			{
				SWITCH_POSITION_B=img1;//現在の画像の次の画像を指定する
				MOVE_B=0;//正面向き状態
			}
			if(CHANG_B==2 && HEANDHE_B==0)
			{
				SWITCH_POSITION_B=img1+img2;
				MOVE_B=0;//正面向き状態
			}
			if(HEANDHE_B==0)
			{
				SWITCH_POSITION_B=0;
				MOVE_B=0;//正面向き状態
			}
		}
		else if(SWITCH_POSITION_B<=img1)
		{
			SetGraphicRect(imgrect[0],imgrect[1],imgrect[2],imgrect[3]);
			CHANG_B=1;
		}
		else if(SWITCH_POSITION_B<=img1+img2)
		{
			SetGraphicRect(imgrect[0]+imgshift,imgrect[1],imgrect[2]+imgshift,imgrect[3]);
			CHANG_B=2;
		}
		else
		{
			SetGraphicRect(imgrect[0]+imgshift*2,imgrect[1],imgrect[2]+imgshift*2,imgrect[3]);
			CHANG_B=3;
		}
		if(SWITCH_POSITION_B>img1+img2+img3 && SWITCH_POSITION_B<img1+img2+img3+10 || SWITCH_POSITION_B>=img1+img2+img3+img4+10)
		{
			SWITCH_POSITION_B=0;
		}
	}
	else if(GetX>POSX_B)//右向き処理
	{
		SetGraphicRect(imgrect[0]+imgshift*3,imgrect[1],imgrect[2]+imgshift*3,imgrect[3]);
		if(MOVE_B==0)//正面から右向きに移行したかを調べる
		{
			SWITCH_POSITION_B=img1+img2+img3+10;//中間処理の時のカウントを代入
		}
		if(MOVE_B==2)//左向きから正面向きに変更している　もしくはその処理を行なう前に右向きに変更しているか調べる
		{
			HEANDHE_B--;
		}
		if(SWITCH_POSITION_B>=img1+img2+img3+10)//中間処理かどうかを判断する
		{
			if(HEANDHE_B>=img4)
			{
				HEANDHE_B--;
			}
			else
			{
				HEANDHE_B=0;
			}
			if(CHANG_B==1 && HEANDHE_B==0)//CHANG_Bの状態から移行した時のフレームカウントを大体割り出す
			{
				SWITCH_POSITION_B=img1;//現在の画像の次の画像を指定する
				MOVE_B=1;//右向き状態
			}
			if(CHANG_B==2 && HEANDHE_B==0)
			{
				SWITCH_POSITION_B=img1+img2;
				MOVE_B=1;//右向き状態
			}
			if(HEANDHE_B==0)
			{
				SWITCH_POSITION_B=0;
				MOVE_B=1;//右向き状態
			}
		}
		else if(SWITCH_POSITION_B<=img1)
		{
			SetGraphicRect(imgrect[0]+imgshift*4,imgrect[1],imgrect[2]+imgshift*4,imgrect[3]);
			CHANG_B=1;
		}
		else if(SWITCH_POSITION_B<=img1+img2)
		{
			SetGraphicRect(imgrect[0]+imgshift*5,imgrect[1],imgrect[2]+imgshift*5,imgrect[3]);
			CHANG_B=2;
		}
		else
		{
			SetGraphicRect(imgrect[0]+imgshift*6,imgrect[1],imgrect[2]+imgshift*6,imgrect[3]);
			CHANG_B=3;
		}
		if(SWITCH_POSITION_B>img1+img2+img3 && SWITCH_POSITION_B<img1+img2+img3+10 || SWITCH_POSITION_B>=img1+img2+img3+img4+10)
		{
			SWITCH_POSITION_B=0;
		}
	}
	else if(GetX<POSX_B)//左向き処理
	{
		SetGraphicRect(imgrect[0]+imgshift*3,imgrect[1],imgrect[2]+imgshift*3,imgrect[3]);
		SetGraphicAngle(180,0,0);//画像を⇔反転にする
		if(MOVE_B==0)//正面から左向きに移行したかを調べる
		{
			SWITCH_POSITION_B=img1+img2+img3+10;//中間処理の時のカウントを代入
		}
		if(MOVE_B==1)//左向きから正面向きに変更している　もしくはその処理の前に右向きに変更しているかを調べる
		{
			HEANDHE_B++;
		}
		if(SWITCH_POSITION_B>=img1+img2+img3+10)//中間処理かどうかを判断する
		{
			if(HEANDHE_B<=img4)
			{
				HEANDHE_B++;
			}
			else
			{
				HEANDHE_B=0;
			}
			if(CHANG_B==1 && HEANDHE_B==0)//CHANG_Bの状態から本来のフレームカウントを大体割り出す
			{
				SWITCH_POSITION_B=img1;//現在の画像の次の画像を指定する
				MOVE_B=2;//左向き状態
			}
			if(CHANG_B==2 && HEANDHE_B==0)
			{
				SWITCH_POSITION_B=img1+img2;
				MOVE_B=2;//左向き状態
			}
			if(HEANDHE_B==0)
			{
				SWITCH_POSITION_B=0;
				MOVE_B=2;//左向き状態
			}
		}
		else if(SWITCH_POSITION_B<=img1)
		{
			SetGraphicRect(imgrect[0]+imgshift*4,imgrect[1],imgrect[2]+imgshift*4,imgrect[3]);
			CHANG_B=1;
		}
		else if(SWITCH_POSITION_B<=img1+img2)
		{
			SetGraphicRect(imgrect[0]+imgshift*5,imgrect[1],imgrect[2]+imgshift*5,imgrect[3]);
			CHANG_B=2;
		}
		else
		{
			SetGraphicRect(imgrect[0]+imgshift*6,imgrect[1],imgrect[2]+imgshift*6,imgrect[3]);
			CHANG_B=3;
		}
		if(SWITCH_POSITION_B>img1+img2+img3 && SWITCH_POSITION_B<img1+img2+img3+10 || SWITCH_POSITION_B==img1+img2+img3+img4+10)
		{
			SWITCH_POSITION_B=0;
		}
	}
	DrawGraphic(GetX,GetY);//画像描画　やっとだよ！
	SWITCH_POSITION_B++;//フレームカウントを増やす
	POSX_B=GetX;//１周終了時のＸ座標を格納　新たな周回になった時の比較に使う。
	SetGraphicAngle(0,0,0);//画像を元の角度に戻す
}
let CIRCLE_U=0;//描画角度管理兼フレーム管理変数
let POW_U=0;//描画倍率管理変数
let MAGIC_COUNT_U=0;//増減切り替え管理変数
function DrawMagicCircle(img,part)//地霊殿のような魔法陣を描画する関数
{//imgには使用する画像　partには0 1 2 3 4のいずれかの数値を指定する

/*	お好み設定	ここから	*/

	let START_FREAME=60;				//画像を描画しない初期フレーム			初期：60
	let SPEED_FREAME=40;				//画像を高速拡大させるフレーム			初期：40
	let SPEED_POW=0.045;				//高速拡大時の1フレームに拡大する倍率量	初期：0.045
	let MAX_POW=2.0;					//画像の基準最大倍率					初期：2.0
	let MIN_POW=1.3;					//画像の基準最少倍率					初期：1.3
	let ADD_PUSH_POW=rand(0.008,0.012);	//画像の１フレームに拡大する倍率量		初期：rand(0.008,0.012)
	let SUB_PUSH_POW=rand(0.008,0.012);	//画像の１フレームに縮小する倍率量		初期：rand(0.008,0.012)

//注意事項
//MAX_POW<MIN_POWが成立すると描画がおかしくなります
//START_FREAMEに0を指定すると呼び出し直後から拡大描画に移行します
//SPEED_FREAMEに0を指定すると、拡大量0からスタートします
//拡大描画はSTART_FREAMEが経過してからSPEED_FREAMEの数値分だけ行われます
//SPEED_FREAME*SPEED_POWがMAX_POWを超えると、最初だけ大きくなります

//禁則事項
//全変数　マイナス禁止
//小数点が使われていない変数に小数点を含む数値禁止

/*	お好み設定　ここまで	*/

	let no=0;//描画パターンを指定する変数
	let L_rect=[1, 33,64, 96, 2, 25,166,318, 22,164,308];//画像の左側短形を格納
	let U_rect=[1,  1, 0,  0,34, 94, 97, 94,244,244,238];//画像の上側短形を格納
	let R_rect=[30,62,95,127,45,126,283,430,127,284,441];//画像の右側短形を格納
	let D_rect=[30,30,31, 31,77,215,214,204,365,365,371];//画像の下側短形を格納
	LoadGraphic(img);
	SetTexture(img);
	GraphicDefault;
	if(part==0)//素材元　サンプル魔法陣とほぼ同じ形状
	{
		SetGraphicAngle(0,0,CIRCLE_U*3);
		SetGraphicScale(POW_U,POW_U);
		SetAlpha(210);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2);
		SetGraphicScale(POW_U/1.5,POW_U/1.5);
		SetAlpha(170);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2);
		SetGraphicScale(POW_U,POW_U);
		SetGraphicRect(L_rect[6],U_rect[6],R_rect[6],D_rect[6]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2+45);
		SetGraphicScale(POW_U,POW_U);
		SetGraphicRect(L_rect[6],U_rect[6],R_rect[6],D_rect[6]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*2+45);
		SetGraphicScale(POW_U,POW_U);
		SetGraphicRect(L_rect[6],U_rect[6],R_rect[6],D_rect[6]);
		DrawGraphic(GetX,GetY);
	}
	else if(part==1)//円形画像だけの魔法陣　計算式は地味に複雑怪奇
	{
		SetGraphicAngle(0,0,CIRCLE_U*3);
		SetGraphicScale(POW_U*1.1,POW_U*1.1);
		SetAlpha(210);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2);
		SetGraphicScale(POW_U*0.8,POW_U*0.8);
		SetAlpha(170);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U);
		SetGraphicScale(POW_U/2,POW_U/2);
		SetAlpha(130);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		let deg=30;
		while(deg<=360)
		{
			SetGraphicAngle(0,0,CIRCLE_U*-2.5);
			SetGraphicScale(POW_U/2,POW_U/2);
			SetAlpha(128);
			SetGraphicRect(L_rect[3],U_rect[3],R_rect[3],D_rect[3]);
			DrawGraphic(GetDouX(GetX,POW_U*57.5,deg-CIRCLE_U*2.5),GetDouY(GetY,POW_U*57.5,deg-CIRCLE_U*2.5));
			GraphicDefault;
			deg+=30;
		}
		let deg=45;
		while(deg<=360)
		{
			SetGraphicAngle(0,0,CIRCLE_U*1.5);
			SetGraphicScale(POW_U/2,POW_U/2);
			SetAlpha(128);
			SetGraphicRect(L_rect[2],U_rect[2],R_rect[2],D_rect[2]);
			DrawGraphic(GetDouX(GetX,POW_U*40,deg+CIRCLE_U*1.5),GetDouY(GetY,POW_U*40,deg+CIRCLE_U*1.5));
			GraphicDefault;
			deg+=45;
		}
		let deg=90;
		while(deg<=360)
		{
			SetGraphicAngle(0,0,CIRCLE_U*-0.5);
			SetGraphicScale(POW_U/2,POW_U/2);
			SetAlpha(128);
			SetGraphicRect(L_rect[3],U_rect[3],R_rect[3],D_rect[3]);
			DrawGraphic(GetDouX(GetX,POW_U*20,deg-CIRCLE_U*0.5),GetDouY(GetY,POW_U*20,deg-CIRCLE_U*0.5));
			deg+=90;
		}
	}
	else if(part==2)//枠円＋8角形＋枠円＋ダブル3角形＊２　な魔法陣
	{
		SetGraphicAngle(0,0,CIRCLE_U*3);
		SetGraphicScale(POW_U,POW_U);
		SetAlpha(210);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2.5);
		SetGraphicScale(POW_U*0.8,POW_U*0.8);
		SetAlpha(170);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*2);
		SetGraphicScale(POW_U,POW_U);
		SetGraphicRect(L_rect[9],U_rect[9],R_rect[9],D_rect[9]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*-2.5);
		SetGraphicScale(POW_U*0.8,POW_U*0.8);
		SetGraphicRect(L_rect[5],U_rect[5],R_rect[5],D_rect[5]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		SetGraphicAngle(0,0,CIRCLE_U*2.5+90);
		SetGraphicScale(POW_U*0.8,POW_U*0.8);
		SetGraphicRect(L_rect[5],U_rect[5],R_rect[5],D_rect[5]);
		DrawGraphic(GetX,GetY);
	}
	else if(part==3)//回転する円陣の中に逆回転円５個を描画し、その円の周りに正回転する魔法陣５＊４個描画
	{
		SetGraphicAngle(0,0,CIRCLE_U*3);
		SetGraphicScale(POW_U,POW_U);
		SetAlpha(210);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
		GraphicDefault;
		let deg=72;
		while(deg<=360)
		{
			SetGraphicAngle(0,0,CIRCLE_U*-4);
			SetGraphicScale(POW_U/2,POW_U/2);
			SetAlpha(180);
			SetGraphicRect(L_rect[4],U_rect[4],R_rect[4],D_rect[4]);
			DrawGraphic(GetDouX(GetX,POW_U*35,deg-CIRCLE_U*3),GetDouY(GetY,POW_U*35,deg-CIRCLE_U*3));
			GraphicDefault;
			deg+=72;
		}
		let angle=0;
		loop(5)
		{
			let deg=90;
			while(deg<=360)
			{
				SetGraphicAngle(0,0,CIRCLE_U*5);
				SetGraphicScale(POW_U/2.0,POW_U/2.0);
				SetAlpha(150);
				SetGraphicRect(L_rect[1],U_rect[1],R_rect[1],D_rect[1]);
				DrawGraphic(GetDouX(GetDouX(GetX,POW_U*35,angle-CIRCLE_U*3),POW_U*18,deg-CIRCLE_U*5),GetDouY(GetDouY(GetY,POW_U*35,angle-CIRCLE_U*3),POW_U*18,deg-CIRCLE_U*5));
				GraphicDefault;
				deg+=90;
			}
			angle+=72;
		}
		SetGraphicAngle(0,0,CIRCLE_U*-4);
		SetGraphicScale(POW_U/5,POW_U/5);
		SetAlpha(210);
		SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
		DrawGraphic(GetX,GetY);
	}
	else if(part==4)//説明不能ｗｗｗｗｗｗｗｗ
	{
			SetGraphicAngle(0,0,CIRCLE_U*3);
			SetGraphicScale(POW_U,POW_U);
			SetAlpha(210);
			SetGraphicRect(L_rect[10],U_rect[10],R_rect[10],D_rect[10]);
			DrawGraphic(GetX,GetY);
			GraphicDefault;
		let yyy=0;
		loop(15)
		{
			SetGraphicAngle(CIRCLE_U*2+yyy,CIRCLE_U*3+yyy,CIRCLE_U*3);
			SetGraphicScale(POW_U,POW_U);
			SetAlpha(210);
			SetGraphicRect(L_rect[8],U_rect[8],R_rect[8],D_rect[8]);
			DrawGraphic(GetX,GetY);
			yyy+=10;
		}
		GraphicDefault;
	}
	else//規定数値以外が指定されているか調べる
	{//指定されていた
		RaiseError("引数には0~4の整数を指定してください","DrawMagicCircle定義エラー");
	}//エラーを出して終了
	GraphicDefault;
	CIRCLE_U++;//カウント増加
/*	以下拡大・縮小処理等	*/
	if(CIRCLE_U<=START_FREAME)
	{
		;//何もしない
	}
	else if(CIRCLE_U<=START_FREAME+SPEED_FREAME)//指定されたフレームだけは高速で拡大描画
	{
		POW_U+=SPEED_POW;
	}
	else if(POW_U<=MIN_POW && MAGIC_COUNT_U==0)//縮小→拡大に切り替え
	{
		MAGIC_COUNT_U=1;//減少中→増加中にフラグ切り替え
	}
	else if(POW_U>=MAX_POW && MAGIC_COUNT_U==1)//拡大→縮小に切り替え
	{
		MAGIC_COUNT_U=0;//増加中→減少中にフラグ切り替え
	}
	else if(MAGIC_COUNT_U==0)
	{
		POW_U-=ADD_PUSH_POW;
	}
	else if(MAGIC_COUNT_U==1)
	{
		POW_U+=SUB_PUSH_POW;
	}
}
function ReverseText(text)//指定された文字列を逆にして返す関数
{//textには文字列を指定
	let w;
	let size=length(text)-1;
	ascent(i in 0..size/2)
	{
		w=text[i];
		text[i]=text[size-i];
		text[size-i]=w;
	}
	return text;
}
function DrawTextEx(text,x,y,size,alpha,type)//DrawTextに追加オプションを指定できるタイプ
{//typeには文字列で色々なタイプを指定できる　他はDrawTextと同じ
	let long=length(text);//文字数を求める
	let revtext=ReverseText(text);//逆文字を格納
	if(type=="REVERSE")//リバース機能を指定しているか
	{//リバース機能を指定していた
		DrawText(revtext,x,y,size,alpha);
	}
	else
	{
		ascent(line in 0..long)
		{
			if(type=="COLUMNAR")//縦書き指定か
			{
				DrawText(text[line],x,y+size*line,size,alpha);
			}
			else if(type=="REVERSE_COLUMNAR")//逆縦書き指定か
			{
				DrawText(revtext[line],x,y+size*line,size,alpha);
			}
			else if(type=="UP_LEFT")//左上書き指定か
			{
				DrawText(text[line],x-size*line,y-size*line,size,alpha);
			}
			else if(type=="UP_RIGHT")//右上書き指定か
			{
				DrawText(text[line],x+size*line,y-size*line,size,alpha);
			}
			else if(type=="DOWN_LEFT")//左下書き指定か
			{
				DrawText(text[line],x-size*line,y+size*line,size,alpha);
			}
			else if(type=="DOWN_RIGHT")//右下書き指定か
			{
				DrawText(text[line],x+size*line,y+size*line,size,alpha);
			}
			else if(type=="REVERSE_UP_LEFT")//左上書き指定か
			{
				DrawText(revtext[line],x-size*line,y-size*line,size,alpha);
			}
			else if(type=="REVERSE_UP_RIGHT")//右上書き指定か
			{
				DrawText(revtext[line],x+size*line,y-size*line,size,alpha);
			}
			else if(type=="REVERSE_DOWN_LEFT")//左下書き指定か
			{
				DrawText(revtext[line],x-size*line,y+size*line,size,alpha);
			}
			else if(type=="REVERSE_DOWN_RIGHT")//右下書き指定か
			{
				DrawText(revtext[line],x+size*line,y+size*line,size,alpha);
			}
		}
	}
}
/*　描画関係の関数　ここまで　*/

/*　移動系の関数　ここから　*/
let DEG_C=0;//CircleMove01専用外部変数
function CircleMove01(x,y,r,deg,degup)//特定の座標x,yを軸として初期角度deg半径rの長さの地点から毎フレームdegup角度移動する円周軌道移動処理関数
{
	DEG_C+=degup;
	SetX(x+r*cos(deg+DEG_C));
	SetY(y+r*sin(deg+DEG_C));
}
let DEG_C_A=0;//CircleMoveA専用外部変数
task CircleMoveA(x,y,r,rup,deg,degup)//特定の座標x,yを軸として初期角度deg半径rの長さの地点から毎フレームdegup角度移動する円周軌道移動処理関数
{
	let long=r;
	loop
	{
		DEG_C_A+=degup;
		long+=rup;
		SetX(x+long*cos(deg+DEG_C_A));
		SetY(y+long*sin(deg+DEG_C_A));
		yield;
	}
}
/*　移動系の関数　ここまで　*/

/*　ショット系の関数　ここから　*/
task CreateReflectShot01(x,y,speed,angle,graphic,delay,ref_box)//簡易的に１回だけ反射する弾を放つ
{//ref_boxの４要素の1 0配列を指定する　なお各要素は画像短形と同じ並び
	if(length(ref_box)!=4)
	{
		RaiseError("第７引数には４要素の数値型配列を指定してください","CreateReflectShot01宣言エラー");
	}
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,speed);
	Obj_SetAngle(obj,angle);
	ObjShot_SetGraphic(obj,graphic);
	ObjShot_SetDelay(obj,delay);
	while(Obj_BeDeleted(obj)==false)
	{
		speed=Obj_GetSpeed(obj);
		angle=Obj_GetAngle(obj);
		if(ref_box[0]==1 && Obj_GetX(obj)<=minx)//左方向反射
		{
			CreateShot01(minx+(minx-Obj_GetX(obj)),Obj_GetY(obj),speed,180-angle,graphic,0);
			Obj_Delete(obj);
		}
		if(ref_box[1]==1 && Obj_GetY(obj)<=miny)//上方向反射
		{
			CreateShot01(Obj_GetX(obj),miny+(miny-Obj_GetY(obj)),speed,0-angle,graphic,0);
			Obj_Delete(obj);
		}
		if(ref_box[2]==1 && Obj_GetX(obj)>=maxx)//右方向反射
		{
			CreateShot01(maxx-(Obj_GetX(obj)-maxx),Obj_GetY(obj),speed,180-angle,graphic,0);
			Obj_Delete(obj);
		}
		if(ref_box[3]==1 && Obj_GetY(obj)>=maxy)//下方向反射
		{
			CreateShot01(Obj_GetX(obj),maxy-(Obj_GetY(obj)-maxy),speed,0-angle,graphic,0);
			Obj_Delete(obj);
		}
		yield;
	}
}
task CreateReflectShot02(x,y,speed,angle,graphic,delay,ref_box)//簡易的に任意の回数だけ指定された壁で反射する弾を発射
{//ref_boxには各壁での反射回数を記述する　それ以外は01と同じ
	if(length(ref_box)!=4)
	{
		RaiseError("第７引数には４要素の数値型配列を指定してください","CreateReflectShot02宣言エラー");
	}
	let left=ref_box[0];
	let top=ref_box[1];
	let right=ref_box[2];
	let down=ref_box[3];
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,speed);
	Obj_SetAngle(obj,angle);
	ObjShot_SetGraphic(obj,graphic);
	ObjShot_SetDelay(obj,delay);
	while(Obj_BeDeleted(obj)==false)
	{
		speed=Obj_GetSpeed(obj);
		angle=Obj_GetAngle(obj);
		if(right>0 && Obj_GetX(obj)>=maxx)//右方向反射
		{
			if(right==1)
			{
				CreateShot01(maxx-(Obj_GetX(obj)-maxx),Obj_GetY(obj),speed,180-angle,graphic,0);
				Obj_Delete(obj);
			}
			else
			{
				Obj_SetAngle(obj,180-angle);
				Obj_SetX(obj,maxx-(Obj_GetX(obj)-maxx));
			}
			right--;
		}
		if(down>0 && Obj_GetY(obj)>=maxy)//下方向反射
		{
			if(down==1)
			{
				CreateShot01(Obj_GetX(obj),maxy-(Obj_GetY(obj)-maxy),speed,0-angle,graphic,0);
				Obj_Delete(obj);
			}
			else
			{
				Obj_SetAngle(obj,0-angle);
				Obj_SetY(obj,maxy-(Obj_GetY(obj)-maxy));
			}
			down--;
		}
		if(left>0 && Obj_GetX(obj)<=minx)//左方向反射
		{
			if(left==1)
			{
				CreateShot01(minx+(minx-Obj_GetX(obj)),Obj_GetY(obj),speed,180-angle,graphic,0);
				Obj_Delete(obj);
			}
			else
			{
				Obj_SetAngle(obj,180-angle);
				Obj_SetX(obj,minx+(minx-Obj_GetX(obj)));
			}
			left--;
		}
		if(top>0 && Obj_GetY(obj)<=miny)//上方向反射
		{
			if(top==1)
			{
				CreateShot01(Obj_GetX(obj),miny+(miny-Obj_GetY(obj)),speed,0-angle,graphic,0);
				Obj_Delete(obj);
			}
			else
			{
				Obj_SetAngle(obj,0-angle);
				Obj_SetY(obj,miny+(miny-Obj_GetY(obj)));
			}
			top--;
		}
		yield;
	}
}
function CreateRingShot01(x,y,r,deg,speed,angle,color,delay)//任意の座標から指定された角度deg方向の長さrの場所に弾を配置し、決められた速度と角度で発射する関数
{
	CreateShot01(GetDouX(x,r,deg),GetDouY(y,r,deg),speed,angle,color,delay);
}
/*　ショット形の関数　ここまで　*/

/*　敵を制御する関数　ここから　*/
function MainEraseLoop(rect_L,rect_U,rect_R,rect_D)//画面外に出た時に自動的に敵を削除する関数 @MainLoopで宣言する
{//rectは敵を自動削除する境界を指定する
	if(GetX<=rect_L || GetX>=rect_R)
	{
		VanishEnemy;
	}
	if(GetY<=rect_U || GetY>=rect_D)
	{
		VanishEnemy;
	}
}
function SetCollisionEx(r1,r2)//敵の当たり判定と体当たり判定を登録する関数
{//r1は当たり径　r2は体当たり径　をそれぞれ指定
	SetCollisionA(GetX,GetY,r1);
	SetCollisionB(GetX,GetY,r2);
}
/*　敵を制御する関数　ここまで　*/