#ScriptVersion[2]

script_enemy_main {

	//	独自の会話を使用した、単発スクリプトです
	//	エフェクトオブジェクトを多様してます

	let Current=GetCurrentScriptDirectory;

	let Chat_IMG = Current~"IMG\CHAT.png";				//	会話に表示する文字の画像
	let Chat_Back_IMG = Current ~ "IMG\front00.png";		//	会話部分の背景
	let IMG=Current~"Dot\dot_aya.png";				//	敵の画像
	let Spell_Name_IMG = Current ~ "IMG\Spell_Name.png";		//	スペルネームの画像
	let BG_IMG = Current ~ "IMG\bg_j_a.png";			//	スペル時の背景
	let BG_Add_X = 0;						//	スペル時の背景用
	let Shot_SE = Current ~ "..\SE\shot00.wav";			//	ショット時の音
	let Player_Face_IMG = "";					//	会話時のプレイヤー側の表情（画像）　必要な分だけ追加する
	let Enemy_Face_IMG = "";					//	会話時の敵側の表情（画像）　必要な分だけ追加する

	@Initialize {
		LoadGraphic(Chat_IMG);					//	会話文字画像の読み込み
		LoadGraphic(Chat_Back_IMG);				//	会話背景の読み込み
		LoadGraphic(IMG);					//	敵画像の読み込み
		LoadGraphic(Spell_Name_IMG);				//	スペルネーム画像の読み込み
		LoadGraphic(BG_IMG);					//	スペル時背景画像の読み込み
		LoadSE(Shot_SE);					//	ショット音の読み込み
		SetX(-100);						//	初期Ｘ位置
		SetY(-100);						//	初期Ｙ位置
		SetLife(1);						//	初期敵体力
		Draw_Aya(IMG,7,5,5,0);					//	東方試作品の人function（敵の描画用）
		LoadUserShotData(Current~"IMG\shot_All.txt");		//	弾画像の読み込み
		TMain;
	}

	@MainLoop {
		ForbidShot(IsForbidShot);				//	会話中/戦闘中でショットを禁止するか許可するか
		ForbidBomb(IsForbidBomb);				//	会話中/戦闘中でボムを禁止するか許可するか
		SetCollisionA(Draw_X, Draw_Y, 24);			//	当たり判定Ａ（東方試作品の人function）
		SetCollisionB(Draw_X, Draw_Y, 24);			//	当たり判定Ｂ（東方試作品の人function）
		yield;
	}

	@DrawLoop {
		DrawGraphic(Draw_X,Draw_Y);				//	東方試作品の人function（敵の描画）
	}

	@Finalize {
		SetCommonData("X",GetX);				//	東方試作品の人共通データ
		SetCommonData("Y",GetY);				//	東方試作品の人共通データ
		SetCommonData("SPELL_SCORE",Spell_Score);		//	東方試作品の人共通データ
	}

	task TMain {
		yield;
		SetInvincibility(400);					//	無敵時間
		Start_Chat;
	}

	task Start_Chat{
		Face_Work;						//	会話中のプレイヤー・敵の表情変更
		Chat_Work(Chat_IMG, 0, 22);				//	会話の表示処理
		
		SetInvincibility(400);					//	無敵時間
		SetBossLife(3000,E_TYPE,0,0,EM_SEIREN,0);		//	出てきた敵が雑魚なので、体力ゲージを表示してボスっぽく
		Draw_Name(NAME_IMG,Enemy_Aya,0);			//	敵の名前を表示
		loop(30){ yield; }					//	ちょっと間をおく
		Motion_Check = Attack_Motion_Spell;			//	東方試作品の人変数入れ替え
		Cut_In(TIREI, "", 0, 0, 0, 0);				//	カットイン表示（大事な事ですが、出てきてる敵は雑魚です）
		SetSpellScore(1500000, 45, "風神「風神木の葉隠れ」", 0, 0, NORMAL_SPELL);	//	スペルスコアの設定（何度も言いますけど、出てきてる敵は雑魚です）

		DrawSpellBack;						//	スペル中の背景描画
		Back_Effect;						//	スペル中の敵付近の背景うにょうにょ
		Back_Add_Work;						//	スペル中の背景が動く

		Start_Shot;						//	攻撃（弾幕）開始
	}


	//	プレイヤー・敵の表情を変化させます
	//	(表情パス, Left, Top, Right, Bottom);で変化します
	task Face_Work{
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);		//	プレイヤーの表情を変化させます　ついでに、文字の描画色も変わり、プレイヤー側の画像がでしゃばります
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);		//	敵の表情を変化させます　ついでに、文字の描画色も変わり、敵側の画像がでしゃばります
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Enemy_Move;						//	会話中に敵の移動等の他の処理を割り込ませます
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Player(Player_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
		Cange_Face_Enemy(Enemy_Face_IMG, 0, 0, 0, 0);
	}


	//	会話中の敵の行動
	task Enemy_Move{
		SetMovePosition03(GetCenterX,GetClipMinY+112,20,10);		//	敵が移動してきます
		while(GetSpeedX){ yield; }					//	移動が終了するまで待機します
		Draw_Boss_Circle(Current~"IMG\circle_m.png", 0, 0, 128, 128);	//	敵の後ろに魔方陣が発動します
	}


	//	攻撃開始
	task Start_Shot{
		loop(60){ yield; }
		Motion_Check = Default_Motion;
		loop(180){ yield; }
		let way=16;let angle=360/way;let base_angle=angle/2;
		loop{
			Motion_Check = Attack_Motion_A;
			loop(12){
				PlaySE(Shot_SE);
				ascent(j in 0..way){
					ascent(i in 0..2){
						Obj_Shot(GetX, GetY, 3, 2, angle * j + base_angle, [2, -2][i], [4, -4][i], 55, 57, [44, 45][i]);
					}
				}
				loop(5){ yield; }
			}
			Motion_Check = Default_Motion;
			loop(180){ yield; }
		}
	}

	task Obj_Shot(let Set_X, let Set_Y, let Set_Speed, let End_Speed, let Set_Angle, let Add_Angle_A, let Add_Angle_B, let Set_Frame_A, let SetFrame_B, let Color){
		CreateShotA(0, Set_X, Set_Y, 10);
		SetShotDataA(0, 0, Set_Speed, Set_Angle, Add_Angle_A, 0, 0, Color);
		SetShotDataA(0, Set_Frame_A, Set_Speed, NULL, Add_Angle_B, 0, 0, Color);
		SetShotDataA(0, Set_Frame_A + SetFrame_B, End_Speed, NULL, rand_int(-3, 3), 0, 0, Color);
		SetShotDataA(0, Set_Frame_A + SetFrame_B + 1, End_Speed, NULL, 0, 0, 0, Color);
		FireShot(0);
	}


	//	以下、スペル中の背景処理です
	task Back_Add_Work{
		loop{
			BG_Add_X += 2;
			if(BG_Add_X >= 390){ BG_Add_X -= 390; }
			yield;
		}
	}

	task DrawSpellBack{
		let obj=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetRenderState(obj,ALPHA);
		ObjEffect_SetTexture(obj,BG_IMG);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_CreateVertex(obj,4);
		Obj_SetSpeed(obj,0);
		Obj_SetAngle(obj,0);
		Obj_SetAlpha(obj,255);
		ObjEffect_SetLayer(obj,0);
		let wh=[0,0,384,448];
		let xy=Cal_XY(wh[0],wh[1],wh[2],wh[3]);
		let uv=Cal_UV(wh[0],wh[1],wh[2],wh[3]);
		ascent(vertex_number in 0..4){
			ObjEffect_SetVertexXY(obj,vertex_number,xy[vertex_number],xy[vertex_number+4]);
			ObjEffect_SetVertexUV(obj,vertex_number,uv[vertex_number],uv[vertex_number+4]);
		}
		Obj_SetPosition(obj,GetCenterX,GetCenterY);
		ascent(i in 1..31){
			ascent(vertex_number in 0..4){
				ObjEffect_SetVertexUV(obj,vertex_number,uv[vertex_number] + BG_Add_X,uv[vertex_number+4]);
				ObjEffect_SetVertexColor(obj,vertex_number,(255/30)*i,255,255,255);
			}
			yield;
		}
		loop{
			ascent(vertex_number in 0..4){
				ObjEffect_SetVertexUV(obj,vertex_number,uv[vertex_number] + BG_Add_X,uv[vertex_number+4]);
			}
			yield;
		}
	}

	task Back_Effect{
		let obj=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obj,BG_IMG);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,194);
		ObjEffect_SetLayer(obj,0);
		let Radius_A = [[0,30],[30,70],[70,110],[110,150]];
		let Radius_B = [[0,30],[30,70],[70,110],[110,150]];
		let Set_Radius_A;
		let Set_Radius_B;
		let Vertex_Angle=0;
		let Default_Vertex_Angle=360/47;
		let Set_Vertex_Angle=0;
		let Angle_A=0;
		let Angle_B=0;
		let Angle_C=0;
		let Pace_A=15;
		let Pace_B=10;
		let Pace_C=20;
		ascent(i in 1..31){
			ascent(Vertex in 0..194){
				if(Vertex < 48){
					Set_Radius_A = [Radius_A[0][0],Radius_A[0][1]];
					Set_Radius_B = [Radius_B[0][0],Radius_B[0][1]-Pace_A*cos(Angle_A)];
				}else if(Vertex >= 48 && Vertex < 96){
					Set_Radius_A = [Radius_A[1][0],Radius_A[1][1]];
					Set_Radius_B = [Radius_B[1][0]-Pace_A*cos(Angle_A),Radius_B[1][1]-Pace_B*cos(Angle_B)];
				}else if(Vertex >= 96 && Vertex < 144){
					Set_Radius_A = [Radius_A[2][0],Radius_A[2][1]];
					Set_Radius_B = [Radius_B[2][0]-Pace_B*cos(Angle_B),Radius_B[2][1]-Pace_C*cos(Angle_C)];
				}else{
					Set_Radius_A = [Radius_A[3][0],Radius_A[3][1]];
					Set_Radius_B = [Radius_B[3][0]-Pace_C*cos(Angle_C),Radius_B[3][1]];
				}
				Set_Vertex_Angle=Default_Vertex_Angle*Vertex+Vertex_Angle;
				ObjEffect_SetVertexXY(obj,Vertex,Draw_X+Set_Radius_A[Vertex%2]*cos(Set_Vertex_Angle),Draw_Y+Set_Radius_A[Vertex%2]*sin(Set_Vertex_Angle));
				ObjEffect_SetVertexUV(obj,Vertex,Draw_X+Set_Radius_B[Vertex%2]*cos(Set_Vertex_Angle)-GetClipMinX + BG_Add_X,Draw_Y+Set_Radius_B[Vertex%2]*sin(Set_Vertex_Angle)-GetClipMinY);
				ObjEffect_SetVertexColor(obj,Vertex,(255/30)*i,175,175,175);
			}
			Angle_A+=rand_int(3,7);
			if(Angle_A>=360){Angle_A-=360;}
			Angle_B+=rand_int(3,7);
			if(Angle_B>=360){Angle_B-=360;}
			Angle_C+=rand_int(3,7);
			if(Angle_C>=360){Angle_C-=360;}
			yield;
		}
		loop{
			ascent(Vertex in 0..194){
				if(Vertex < 48){
					Set_Radius_A = [Radius_A[0][0],Radius_A[0][1]];
					Set_Radius_B = [Radius_B[0][0],Radius_B[0][1]-Pace_A*cos(Angle_A)];
				}else if(Vertex >= 48 && Vertex < 96){
					Set_Radius_A = [Radius_A[1][0],Radius_A[1][1]];
					Set_Radius_B = [Radius_B[1][0]-Pace_A*cos(Angle_A),Radius_B[1][1]-Pace_B*cos(Angle_B)];
				}else if(Vertex >= 96 && Vertex < 144){
					Set_Radius_A = [Radius_A[2][0],Radius_A[2][1]];
					Set_Radius_B = [Radius_B[2][0]-Pace_B*cos(Angle_B),Radius_B[2][1]-Pace_C*cos(Angle_C)];
				}else{
					Set_Radius_A = [Radius_A[3][0],Radius_A[3][1]];
					Set_Radius_B = [Radius_B[3][0]-Pace_C*cos(Angle_C),Radius_B[3][1]];
				}
				Set_Vertex_Angle=Default_Vertex_Angle*Vertex+Vertex_Angle;
				ObjEffect_SetVertexXY(obj,Vertex,Draw_X+Set_Radius_A[Vertex%2]*cos(Set_Vertex_Angle),Draw_Y+Set_Radius_A[Vertex%2]*sin(Set_Vertex_Angle));
				ObjEffect_SetVertexUV(obj,Vertex,Draw_X+Set_Radius_B[Vertex%2]*cos(Set_Vertex_Angle)-GetClipMinX + BG_Add_X,Draw_Y+Set_Radius_B[Vertex%2]*sin(Set_Vertex_Angle)-GetClipMinY);
				ObjEffect_SetVertexColor(obj,Vertex,255,175,175,175);
			}
			Angle_A+=rand_int(3,7);
			if(Angle_A>=360){Angle_A-=360;}
			Angle_B+=rand_int(3,7);
			if(Angle_B>=360){Angle_B-=360;}
			Angle_C+=rand_int(3,7);
			if(Angle_C>=360){Angle_C-=360;}
			yield;
		}
	}

	#include_function".\INCLUDE\BOSS_INI.dms";
	#include_function".\DOT\Boss_Graphic.pad";

}