#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Afro spell 06 normal"]
#Text["Afro spell 06 normal"]

let famTex = "script/thdcs/system/enm02/mirrorfam.png";
let glowTex = "script/thdcs/system/enm02/mirrorglow.png";

// Mirror globe obj
let objMirror = ObjEnemy_Create(OBJ_ENEMY); 
	
#include "script/thdcs/system/shotlibrary.txt"
#include "script/thdcs/functions/function_common.txt"
#include "script/thdcs/functions/function_global.txt"
#include "script/thdcs/functions/function_bosseff.txt"
	
@Initialize {
	SetCommonData("spellScriptID",GetOwnScriptID);
	renderBoss(2);
	setAura(bossObj,64,64,255);
	SetCommonData("bossCircleType",2);
	SetCommonData("bossAttackType",2);
	SetCommonData("bossBgType",2);
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName"," u~[{[v"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Light Sign uGreat Mirror Ballv"); }
	
	concenEffect(bossObj,15,4,64,64,255);
	concenEffect(bossObj,15,4,255,64,64);
	concenEffect(bossObj,15,4,64,255,64);
	concenEffect(bossObj,15,4,255,255,64);

	concenEffect(bossObj,30,3,155,32,255);
	concenEffect(bossObj,30,3,255,255,255);
	concenEffect(bossObj,30,3,255,255,64);	

	ObjMove_SetDestAtSpeed(bossObj,GetCenterX,GetCenterY-120,10);
	SetShotAutoDeleteClip(64,64,64,64);
	SetAutoDeleteObject(true);
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(450);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(38);
	}
	case(EV_REQUEST_IS_DURABLE_SPELL) {
		SetScriptResult(true);
	}
	case(EV_REQUEST_SPELL_SCORE) {
	    let spellCardBonus = calculateAndGetSpellCardBonus();
		SetScriptResult(spellCardBonus);
	}	
	case(EV_USER+9999) {
		SetCommonData("spellcardID","tenji06norm"); 
	}
} 

@MainLoop { yield; } 
@Finalize { } 

task mainTask { 
	yield;
	scriptEnding;
	wait(60);
	control;
	wait(120);
	beweeg;
	sfxLoop;
} 

// Fam summon 
task control {
	PlaySFX(SFX_CH00);
	bossAttack = 2;
	mirrorFam(GetCenterX,GetClipMinY-64);
	wait(120);
	globeShot;
	wait(60);
	spotLaser;		
	wait(120);
	starRain;
}

task sfxLoop {
	while(!Obj_IsDeleted(bossObj)) { 
		if(GetTimer == 38) { 
			PlaySFX(SFX_POWER0);
			concenEffect(objMirror,30,4,64,64,255);
			concenEffect(objMirror,30,4,64,128,255);
			concenEffect(objMirror,30,4,64,255,255);
			concenEffect(objMirror,30,4,64,255,64);			
			concenEffect(objMirror,30,4,255,128,64);	
			concenEffect(objMirror,30,4,255,64,64);	
			concenEffect(objMirror,30,4,255,64,255);	
		}
		if(GetTimer == 25) { 
			PlaySFX(SFX_POWER0);
			concenEffect(objMirror,30,4,64,64,255);
			concenEffect(objMirror,30,4,64,128,255);
			concenEffect(objMirror,30,4,64,255,255);
			concenEffect(objMirror,30,4,64,255,64);			
			concenEffect(objMirror,30,4,255,128,64);	
			concenEffect(objMirror,30,4,255,64,64);	
			concenEffect(objMirror,30,4,255,64,255);					
		}	
		if(GetTimer == 15) { 
			PlaySFX(SFX_POWER0);
			concenEffect(objMirror,30,4,64,64,255);
			concenEffect(objMirror,30,4,64,128,255);
			concenEffect(objMirror,30,4,64,255,255);
			concenEffect(objMirror,30,4,64,255,64);			
			concenEffect(objMirror,30,4,255,128,64);	
			concenEffect(objMirror,30,4,255,64,64);	
			concenEffect(objMirror,30,4,255,64,255);					
		}	
		if(GetTimer == 5) { 
			PlaySFX(SFX_POWER0);
			PlaySFX(SFX_POWER0);
			concenEffect(objMirror,30,4,64,64,255);
			concenEffect(objMirror,30,4,64,128,255);
			concenEffect(objMirror,30,4,64,255,255);
			concenEffect(objMirror,30,4,64,255,64);			
			concenEffect(objMirror,30,4,255,128,64);	
			concenEffect(objMirror,30,4,255,64,64);	
			concenEffect(objMirror,30,4,255,64,255);					
		}	
		wait(120);
	} 
}

// Tenji dance
task beweeg { 
	let strikePose = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		strikePose = rand_int(0,5);	
		ObjMove_RandomPosWeight(bossObj,rand_int(100,300),rand_int(40,80),10,30,100,150,350,200);		
		bossAttack = strikePose;
		wait(150);
	}
}

// Sideway stars 
task starRain {
	while(!Obj_IsDeleted(bossObj)) { 
		if(GetTimer >= 25 && GetTimer <= 38){ wait(rand_int(40,60)); }
		if(GetTimer >= 15 && GetTimer < 25){ wait(rand_int(25,45)); }
		if(GetTimer >= 5 && GetTimer < 15){ wait(rand_int(20,25)); }
		if(GetTimer < 5){ wait(rand_int(15,20)); }

		// left wall spawn
		let stars = CreateShotA(GetClipMinX,rand(0,120),0);
		SetShotDataA(stars,0,1,rand(0,20),0,0,0,139);

		let stars2 = CreateShotA(GetClipMinX,rand(120,GetClipMaxY),0);
		SetShotDataA(stars2,0,1,rand(0,20),0,0,0,139);
		
		// right wall spawn
		let stars5 = CreateShotA(GetClipMaxX,rand(0,120),0);
		SetShotDataA(stars5,0,1,rand(180,160),0,0,0,147);

		let stars6 = CreateShotA(GetClipMaxX,rand(120,GetClipMaxY),0);
		SetShotDataA(stars6,0,1,rand(180,160),0,0,0,147);
	}
} 

// Spotlight lasers
task spotLaser {
	let dir = 90;
	let u = 0;
	let kleur = 2;
	let laserDir = [
		[90,90,90,90,90,90],
		[60,60,70,110,120,120],
		[75,110,90,90,70,105],
		[90,90,90,90,90,90],
		[100,95,90,75,70,65],
		[80,90,70,110,90,100],
	];
	let laserPicker = 0;
	
	while(!Obj_IsDeleted(bossObj)) { 
		PlaySFX(SFX_LAZER01);
		ascent(i in 0..6) { 
			wait(3);
			CreateStraightLaserA1(i*76,0,laserDir[laserPicker][i],700,20,130,kleur,70);
			spotGlow(i*76,0,kleur); 
			kleur++;
			if(kleur == 9){ kleur = 2; }
		}
		laserPicker++;
		if(laserPicker > 5) { laserPicker = 0; }
		wait(180);
	}
}

// Spotlight glows
task spotGlow(x,y,kleur) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let c = 0;
	let spin = 0;
	
	ObjPrim_SetTexture(obj,glowTex); 
	ObjRender_SetAlpha(obj,255);
	Obj_SetRenderPriorityI(obj,20);
	ObjRender_SetScaleXYZ(obj,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(obj,0,1,127,127); 
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);	

	if(kleur == 2) { ObjRender_SetColor(obj,255,128,64); }
	if(kleur == 3) { ObjRender_SetColor(obj,255,128,255); }
	if(kleur == 4) { ObjRender_SetColor(obj,64,64,255); }
	if(kleur == 5) { ObjRender_SetColor(obj,64,144,255); }
	if(kleur == 6) { ObjRender_SetColor(obj,64,255,144); }
	if(kleur == 7) { ObjRender_SetColor(obj,255,255,64); }
	if(kleur == 8) { ObjRender_SetColor(obj,255,255,64); }
	
	while(!Obj_IsDeleted(bossObj)) {
		ObjRender_SetAngleZ(obj,spin);	
		spin+=30;
		c++;
		if(c == 200) { Obj_Delete(obj); } 
		yield;
	}
	Obj_Delete(obj);
}

// Globe fam pattern
task globeShot {
	let dir = 0;
	let kleur = 195;
	let timerSwitch = 0;
	while(!Obj_IsDeleted(bossObj)) { 	
		PlaySFX(SFX_KIRA00);
		ascent(i in 0..24) {
			let globe = CreateShotA(GetCenterX+50*cos(dir),(GetClipMinY+32)+50*sin(dir),10);
			SetShotDataA(globe,0,2,dir,0.1,0,0,kleur);
			dir+=360/24;	
		}
		dir+=8;
		kleur++;
		if(kleur == 201){ kleur = 195; } 
		if(GetTimer <= 38 && GetTimer > 25){ wait(80); }
		if(GetTimer <= 25 && GetTimer > 15){ wait(60); }
		if(GetTimer <= 15 && GetTimer > 5){ wait(45); }		
		if(GetTimer <= 5){ wait(25); }				
	} 
}

// The great mirror globe
task mirrorFam(x,y) {
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let mirrorf = 0;
	let spin = 0;
	
	ObjEnemy_Regist(objMirror);
	ObjPrim_SetTexture(objMirror,famTex); 
	ObjPrim_SetTexture(obj2,glowTex); 
	ObjRender_SetAlpha(objMirror,255);
	ObjRender_SetAlpha(obj2,185);
	Obj_SetRenderPriorityI(objMirror,21);
	Obj_SetRenderPriorityI(obj2,20);
	ObjRender_SetScaleXYZ(objMirror,2.5,2.5,0);
	ObjRender_SetScaleXYZ(obj2,2,2,0);
	ObjSprite2D_SetSourceRect(objMirror,0,0,48,48); 
	ObjSprite2D_SetSourceRect(obj2,0,0,128,128); 
	ObjSprite2D_SetDestCenter(objMirror);
	ObjSprite2D_SetDestCenter(obj2);
	ObjMove_SetPosition(objMirror,x,y);
	ObjMove_SetPosition(obj2,x,y);	
	ObjRender_SetPosition(obj2,ObjMove_GetX(objMirror),ObjMove_GetY(objMirror),0);	
	
	ObjMove_SetDestAtSpeed(objMirror,GetCenterX,GetClipMinY+32,1);
	
	concenEffect(objMirror,30,4,64,64,255);
	concenEffect(objMirror,30,4,64,128,255);
	concenEffect(objMirror,30,4,255,255,255);	
	concenEffect(objMirror,45,3,255,64,255);	
	concenEffect(objMirror,45,3,64,255,255);	
	
	while(!Obj_IsDeleted(bossObj)) { 
		ObjRender_SetAngleZ(obj2,spin);	
		ObjRender_SetPosition(obj2,ObjMove_GetX(objMirror),ObjMove_GetY(objMirror),0);	
		ObjMove_SetPosition(obj2,ObjMove_GetX(objMirror),ObjMove_GetY(objMirror));	
		if(mirrorf < 10) { ObjSprite2D_SetSourceRect(objMirror,0,0,48,48); }
		if(mirrorf >= 10 && mirrorf < 20) { ObjSprite2D_SetSourceRect(objMirror,48,0,96,48); }
		if(mirrorf >= 20 && mirrorf < 30) { ObjSprite2D_SetSourceRect(objMirror,96,0,144,48); }
		if(mirrorf > 30) { ObjSprite2D_SetSourceRect(objMirror,144,0,192,48); }
		mirrorf++;
		spin++;
		if(mirrorf == 40) { mirrorf = 0; } 
		
		ObjEnemy_SetIntersectionCircleToShot(objMirror,ObjMove_GetX(objMirror),ObjMove_GetY(objMirror),0);
		ObjEnemy_SetIntersectionCircleToPlayer(objMirror,ObjMove_GetX(objMirror),ObjMove_GetY(objMirror),0);
	
		yield;
	}
	Obj_Delete(objMirror);
}

task scriptEnding {
	while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0) {
		yield;
	}

	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	Obj_Delete(bossObj);

	CloseScript(GetOwnScriptID());
}
 