#Title[test9]
#Text[XsOt]
#PlayLevel[PHANTASM]
#Player[FREE]
#ScriptVersion[2]

script_enemy_main {
	#include_function ".\lib\Common.dnh"
	#include_function ".\lib\lib_anime_Yukari.dnh"
	
	let bossImg = CSD ~ "img\dot_yukari.png";
	let back = CSD ~ "img\back2.png";
	let circle = CSD ~ "img\circle.png";
	let name = "u傫ȎԂƏȎԂɒyzv";
	
	let xIni = cx;
	let yIni = cy - 64;
	let wIni = 180;
	
	@Initialize {
		SetLife(10);
		SetDamageRate(0, 0);
		SetTimer(58);
		SetDurableSpellCard;
		SetScore(1000000);
		LastSpell;
		SetEffectForZeroLife(90, 128, 1);
		
		CutIn(YOUMU, name, "", 0, 0, 0, 0);
		
		InitializeAction;
		
		LoadUserShotData(CSD ~ "img\shot_all.dnh");
		LoadGraphic(bossImg);
		LoadGraphic(back);
		LoadGraphic(circle);
		
		TMain;
	}

	@MainLoop {
		yield;
	}

	@DrawLoop {
		DrawBoss(bossImg);
	}

	@Finalize {
		DeleteGraphic(bossImg);
		DeleteGraphic(back);
	}

	@BackGround {
		SetColor(108, 64, 108);
		SetTexture(back);
		SetGraphicRect(0, 0, 384, 448);
		DrawGraphic(cx, cy);
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////////
	
	task TMain {
		getReady(wIni);
		
		TCircle;
		shot(cx, cy, 96, 5, 2, 0, 90, 2, 230, BLUE+SMALL, WHITE+GRAIN, RED+SMALL);
		SetAction(ACT_SPELL, 180);
		wait(330);
		SetAction(ACT_SHOT_B, 200);
		wait(150);
		Concentration01(60);
		wait(60);
		Explosion01(GetX, GetY, 5, 0.3, 40);
		wait(60);
		
		TCircle;
		shot(cx, cy - 96, 80, 7, 3, 0, 90, 2, 250, BLUE+SMALL, WHITE+GRAIN, RED+SMALL);
		shot(cx + 64, cy + 16, 48, 7, 1, 0, GetAngleToPlayer, 2.5, 250, RED+SMALL, WHITE+GRAIN, BLUE+SMALL);
		shot(cx - 64, cy + 16, 48, 7, 1, 0, GetAngleToPlayer, 2.5, 250, RED+SMALL, WHITE+GRAIN, BLUE+SMALL);
		SetAction(ACT_SPELL, 180);
		wait(330);
		SetAction(ACT_SHOT_B, 200);
		wait(170);
		Concentration01(60);
		wait(60);
		Explosion01(GetX, GetY, 5, 0.3, 40);
		wait(60);
		
		TCircle;
		shot(cx, cy - 48, 64, 8, 3, 0, 90, 1.8, 270, BLUE+SMALL, WHITE+GRAIN, RED+RICE);
		shot(cx + 64, cy + 32, 48, 9, 2, 0, GetAngleToPlayer, 2.3, 270, RED+SMALL, RED+GRAIN, BLUE+RICE);
		shot(cx - 64, cy + 32, 48, 9, 2, 0, GetAngleToPlayer, 2.3, 270, RED+SMALL, RED+GRAIN, BLUE+RICE);
		SetAction(ACT_SPELL, 180);
		wait(330);
		SetAction(ACT_SHOT_B, 200);
		wait(190);
		Concentration01(60);
		wait(60);
		Explosion01(GetX, GetY, 5, 0.3, 40);
		wait(60);
		
		TCircle;
		shot(cx, cy + 32, 96, 7, 2, 0, 90, 2, 290, BLUE+SMALL, WHITE+GRAIN, RED+WEDGE);
		shot(cx, cy + 32, 96, 7, 2, 0,-90, 2, 290, BLUE+SMALL, WHITE+GRAIN, RED+WEDGE);
		shot(cx + 108, cy - 96, 64, 10, 3, 0, GetAngleToPlayer, 2, 290, RED+SMALL, RED+GRAIN, BLUE+RICE);
		shot(cx - 108, cy - 96, 64, 10, 3, 0, GetAngleToPlayer, 2, 290, RED+SMALL, RED+GRAIN, BLUE+RICE);
		SetAction(ACT_SPELL, 180);
		wait(330);
		SetAction(ACT_SHOT_B, 200);
		wait(210);
		Concentration01(60);
		wait(60);
		Explosion01(GetX, GetY, 5, 0.3, 40);
		wait(60);
		
		TCircle;
		shot(cx, cy, 128, 5, 2, 0, 90, 1.5, 320, BLUE+SMALL, WHITE+GRAIN, RED+RICE);
		shot(cx, cy, 128, 5, 2, 0,-90, 1.5, 320, BLUE+SMALL, WHITE+GRAIN, RED+RICE);
		shot(cx, cy, 128, 7, 2, 0,  0, 1.8, 320, BLUE+SMALL, WHITE+GRAIN, BLUE+WEDGE);
		shot(cx, cy, 128, 7, 2, 0,180, 1.8, 320, BLUE+SMALL, WHITE+GRAIN, BLUE+WEDGE);
		SetAction(ACT_SPELL, 180);
		wait(330);
		SetAction(ACT_SHOT_B, 200);
		wait(250);
		Concentration01(60);
		wait(60);
		Explosion01(GetX, GetY, 5, 0.3, 40);
		wait(60);
	}
	
	// vԁF(330 + _w)F
	task shot(_x,			// ~̒ŜW
			 _y, 			// ~̒ŜW
			 _r, 			// ~̔a
			 _vertex,		// _
			 _spin,			// ]
			 _distance,		// ~̔a1ƂƂ̒e̔Ɠ~Ƃ̋@_distance=0ŉ~A0<_distance<2ŉ~̓A_distance<0,2<_distanceŉ~̊Owł
			 _baseAngle, 	// ǂ̊px`n߂邩
			 _omega, 		// px
			 _w,			// TCNCh}``n߂Ăeo܂ł̎
			 _type1,		// ~̒ẽfUC
			 _type2,		// ~̒ẽfUC
			 _type3			// `}`̒ẽfUC
			 ) {
		let cx1 = _x;	// ~̒ŜW
		let cy1 = _y;	// ~̒ŜW
		let r1 = _r;	// ~̔a
		let r2 = _r * (_spin / _vertex);			// ~̔a@~̔a(]/_){΂łĂ܂B@(]/_)0`1͈̔͂ɂȂΊOTCNCh̐}`悵܂
		let dist = r2 * _distance;					// e̔Ɠ~̉~Ƃ̋B
													// 1.05ƂlɈӖ͂ȂłBs̏㒚xǂ̗płB
		
		let angle2 = _baseAngle;					// ~̒S猩Ƃ̓~̒S̊px
		let angle3 = _baseAngle;					// ~̒S猩Ƃ̒e̔̊px
		
		let delay1 = 10;
		let delay2 = 10;
		let delay3 = 20;
		
		let omega = _omega * _spin;		// pẍ̂܂܎gƒx̂ŁAKɕ␳@ɂAǂȈ^Ă(360/_omega)frameŕ`IB
		
		let cx2 = cx1 + cos(angle2) * (r1 - r2);	// ~̒ŜW
		let cy2 = cy1 + sin(angle2) * (r1 - r2);	// ~̒ŜW
		
		let x;							// e̔̂W@
		let y;							// e̔̂W@
		
		let id = 0;						// CreateShotAp̃JE^ϐI
		let w = _w;						// ̃^XNĂ΂Ăen߂܂ł̎
										// _omega𗍂܂Ă悢̂AIɕ̂̃^XNĂԒiɂȂāA_omegaɈႤlnꂽꍇȂȂ̂Œ
		
		yield;
		
		let spanAngle = 12 * 360 / (r1 * 2 * Pi);
		let i = 0;
		let angle = 0;
		
		while(angle <= 360) {
			CreateShotA(i, GetX, GetY, delay1);
			SetShotDataA(i, 0, distance(GetX, GetY, cx1 + cos(angle) * r1, cy1 + sin(angle) * r1) / 180, 
						direction(GetX, GetY, cx1 + cos(angle) * r1, cy1 + sin(angle) * r1), 0, 0, 10, _type1);
			SetShotDataA(i, 180, 0, NULL, 0, 0, 0, NULL);
			SetShotDataA(i, 180 + delay2 + 150 + w, 0.5, angle, 0, 0.01, 1.5, NULL);
			FireShot(i);
			
			i++;
			angle += spanAngle;
		}
		
		wait(180);
		
		spanAngle = 8 * 360 / (r2 * 2 * Pi);
		i = 0;
		angle = 0;
		let obj2 = [];
		while(angle <= 360) {
			obj2 = obj2 ~ [Obj_Create(OBJ_SHOT)];
			Obj_SetPosition(obj2[i], cx1, cy1);
			Obj_SetSpeed(obj2[i], distance(cx1, cy1, cx2 + cos(angle + angle2) * r2, cy2 + sin(angle + angle2) * r2) / 120);
			Obj_SetAngle(obj2[i], direction(cx1, cy1, cx2 + cos(angle + angle2) * r2, cy2 + sin(angle + angle2) * r2));
			ObjShot_SetDelay(obj2[i], delay2);
			ObjShot_SetGraphic(obj2[i], [_type2, _type3][i == 0]);
			
			i++;
			angle += spanAngle;
		}
		
		wait(122);
		
		ascent(i in 0..length(obj2)) {
			Obj_SetSpeed(obj2[i], 0);
		}
		
		let objL;
		if(dist != 0) {
			objL = Obj_Create(OBJ_LASER);
			Obj_SetPosition(objL, Obj_GetX(obj2[0]), Obj_GetY(obj2[0]));
			Obj_SetSpeed(objL, 0);
			Obj_SetAngle(objL, direction(cx1, cy1, cx2, cy2) * [-1, 1][dist < 0]);
			ObjShot_SetDelay(objL, 28);
			ObjShot_SetGraphic(objL, _type3);
			ObjLaser_SetWidth(objL, 8);
			ObjLaser_SetLength(objL, dist);
			ObjLaser_SetSource(objL, false);
		}
		
		wait(28);
		
		loop {
			cx2 = cx1 + cos(angle2) * (r1 - r2);
			cy2 = cy1 + sin(angle2) * (r1 - r2);
			
			x = cx2 + cos(angle3) * (r2 * 0.8 - dist);
			y = cy2 + sin(angle3) * (r2 * 0.8 - dist);
			
			CreateShotA(id, x, y, 5);
			SetShotDataA(id, 0, 0, angle3 + 93, 0, 0, 0, _type3);
			SetShotDataA(id, w - (id / 2), 0.3, angle3 + 45, 0, 0.005, 1.2, _type3);
			FireShot(id);
			
			angle = 0;
			ascent(i in 0..length(obj2)) {
				Obj_SetPosition(obj2[i], cx2 + cos(angle + angle3) * r2, cy2 + sin(angle + angle3) * r2);
				angle += spanAngle;
			}
			
			if(dist != 0) {
				Obj_SetPosition(objL, Obj_GetX(obj2[0]), Obj_GetY(obj2[0]));
				Obj_SetAngle(objL, direction(Obj_GetX(obj2[0]), Obj_GetY(obj2[0]), x, y));
			}
			
			angle2 += omega;
			angle3 -= omega * (_vertex/_spin - 1);
			id += 2;
			yield;
			
			if(angle2 > (360 * _spin) + _baseAngle || angle2 < -(360 * _spin) + _baseAngle) {	// (spin)疳[v痣E
				break;
			}
		}
		
		ascent(i in 0..length(obj2)) {
			ObjShot_FadeDelete(obj2[i]);
		}
		
		if(dist != 0) {
			ObjShot_FadeDelete(objL);
		}
	}
	
	task TCircle {
		loop {
			circle_;
			wait(80);
		}
		
		task circle_ {
			let obj = Obj_Create(OBJ_EFFECT);
			let center = [384, 384];
			let vertex = 16;
			let r = 128 * sec(360 / (vertex * 2));
			let r_ = [0];
			let alpha = [208];
			let color = [rand(196, 255), rand(136, 196), rand(196, 255)];
			let angle = rand(0, 360);
			let angleX = rand(0, 360);
			let angleY = rand(0, 360);
			
			Obj_SetPosition(obj, GetX + 16, GetY + 8);
			Obj_SetSpeed(obj, rand(2, 1.5));
			Obj_SetAngle(obj, rand(0, 360));
			ObjEffect_SetTexture(obj, circle);
			ObjEffect_SetRenderState(obj, ALPHA);
			ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
			ObjEffect_SetScale(obj, 0, 0);
			ObjEffect_SetAngle(obj, angleX, angleY, angle);
			ObjEffect_CreateVertex(obj, vertex + 2);
			
			ObjEffect_SetVertexColor(obj, 0, 128, color[0], color[1], color[2]);
			ObjEffect_SetVertexXY(obj, 0, 0, 0);
			ObjEffect_SetVertexUV(obj, 0, center[0], center[1]);
			ascent(let i in 1..vertex + 2) {
				ObjEffect_SetVertexColor(obj, i, alpha[0], color[0], color[1], color[2]);
				ObjEffect_SetVertexXY(obj, i, cos((360 / vertex) * i + 360 / (vertex * 2)) * r, sin((360 / vertex) * i + 360 / (vertex * 2)) * r);
				ObjEffect_SetVertexUV(obj, i, center[0] + cos((360 / vertex) * i + 360 / (vertex * 2)) * r, center[1] + sin((360 / vertex) * i + 360 / (vertex * 2)) * r);
				r_ = r_ ~ [r * rand(1, 0.95)];
				alpha = alpha ~ [alpha[0]];
			}
			
			yield;
			
			let scale = 0.5;
			let dAngle = rand(-5, 5);
			let out = 0;
			let j = 0;
			
			loop {
				ascent(let i in 1..vertex + 2) {
					ObjEffect_SetVertexColor(obj, i, alpha[i], color[0], color[1], color[2]);
					ObjEffect_SetVertexXY(obj, i, cos((360 / vertex) * i + 360 / (vertex * 2)) * r_[i], sin((360 / vertex) * i + 360 / (vertex * 2)) * r_[i]);
					
					alpha[i] = max(min(96, alpha[i] * rand(1.05, 0.95)), 196);
					r_[i] = min(r / 5, r_[i] * rand(1.001, 0.965));
				}
				
				ObjEffect_SetAngle(obj, angleX, angleY, angle);
				if(j >= 2) {
					ObjEffect_SetScale(obj, scale, scale);
				}
				
				angle += dAngle;
				scale = min(130, scale * 1.025);
				j++;
				alpha[vertex+1] = alpha[1];
				r_[vertex+1] = r_[1];
				yield;
				
				if(!isInScreen(Obj_GetX(obj), Obj_GetY(obj))) {
					out++;
					if(out >= 240) {
						break;
					}
				}
			}
		}
	}
}