#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Dj non-spell 06 normal"]
#Text["Dj non-spell 06 normal"]

#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 {
	renderBoss(3);
	setAura(bossObj,64,255,128);
	SetCommonData("bossAttackType",1);
	SetCommonData("bossCircleType",0);
	setInvulnerableTime(bossObj,120);
	
	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetShotAutoDeleteClip(16,16,16,16);
	SetAutoDeleteObject(true);
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(320);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(55);
	}
} 

@MainLoop { yield; } 
@Finalize { } 


task mainTask { 
	yield;
	scriptEnding;	
	wait(120);
	effectDJ;
	effectDJ2;
	wait(120);
	fireLasers;
	fireLasers2;
	fireSalvo;
	fireConfetti;
} 

// Boss bullets during laser show.
task fireSalvo {
	wait(60);
	while(!Obj_IsDeleted(bossObj)) { 
		PlaySFX(SFX_GUN00);		
		ascent(i in 0..8) { 
			CreateShotA2(GetEnemyX,GetEnemyY,2,GetAngleToPlayer(bossObj),0.05,1+i/5,225,15); 
			CreateShotA2(GetEnemyX,GetEnemyY,2,GetAngleToPlayer(bossObj),0.05,1+i/5,109,15); 
		}
		wait(240);
	}
}

// Confetti
task fireConfetti {
	wait(30);
	while(!Obj_IsDeleted(bossObj)) { 
		CreateShotA1(rand_int(GetClipMinX,GetClipMaxX),GetClipMinY,rand(1.0,2.2),rand_int(70,110),rand_int(120,133),0); 
		CreateShotA1(rand_int(GetClipMinX,GetClipMaxX),GetClipMinY,rand(1.0,2.2),rand_int(70,110),rand_int(120,133),0); 
		CreateShotA1(rand_int(GetClipMinX,GetClipMaxX),GetClipMinY,rand(1.0,2.2),rand_int(70,110),rand_int(120,133),0); 
		wait(15);
	}
}

// Effy 2
task effectDJ2 {
	let dir = 180;
	let dir2 = 360;
	let r = 45;
	ascent(i in 0..24) {
		PlaySFX(SFX_LAZER01);
		CreateLooseLaserA1(GetEnemyX+r*cos(dir),GetEnemyY+r*sin(dir),5,dir,1000,10,5,60);
		CreateLooseLaserA1(GetEnemyX+r*cos(dir2),GetEnemyY+r*sin(dir2),5,dir2,1000,10,5,60);
		dir+=4; dir2-=4;
		wait(8);
	}
}

// Effy 1
task effectDJ {
	let dir = 0;
	let r = 70;
	while(!Obj_IsDeleted(bossObj)) { 
		ascent(i in 0..12) { 
			let effyShot = CreateShotA(GetEnemyX+r*cos(dir),GetEnemyY+r*sin(dir),15);
			SetShotDataA(effyShot,0,0,0,0,0,0,151);
			DeleteShotA(effyShot,0);
			
			let effyShot2 = CreateShotA(GetEnemyX+r*cos(dir+120),GetEnemyY+r*sin(dir+120),15);
			SetShotDataA(effyShot2,0,0,0,0,0,0,150);
			DeleteShotA(effyShot2,0);	
			
			let effyShot3 = CreateShotA(GetEnemyX+r*cos(dir+240),GetEnemyY+r*sin(dir+240),15);
			SetShotDataA(effyShot3,0,0,0,0,0,0,152);
			DeleteShotA(effyShot3,0);	
			
			let effyShot4 = CreateShotA(GetEnemyX+r*cos(-dir),GetEnemyY+r*sin(-dir),10);
			SetShotDataA(effyShot4,0,0,0,0,0,0,155);
			DeleteShotA(effyShot4,0);
			
			let effyShot5 = CreateShotA(GetEnemyX+r*cos(-dir+120),GetEnemyY+r*sin(dir+120),10);
			SetShotDataA(effyShot5,0,0,0,0,0,0,155);
			DeleteShotA(effyShot5,0);	
			
			let effyShot6 = CreateShotA(GetEnemyX+r*cos(-dir+240),GetEnemyY+r*sin(dir+240),10);
			SetShotDataA(effyShot6,0,0,0,0,0,0,155);
			DeleteShotA(effyShot6,0);					
			dir+=6;
			wait(1);
		}
		yield;
	}
}

// Laser show.
task fireLasers { 
	let dir = 250;
	let dir2 = 290;
	let kleur = 3;
	while(!Obj_IsDeleted(bossObj)) { 
		warningShot;		
		ascent(j in 0..2) { 
			ascent(i in 0..24) { 
				djLaser(GetEnemyX+64*cos(dir),GetEnemyY+64*sin(dir),dir,512,15,90,kleur,15);
				djLaser(GetEnemyX+64*cos(dir2),GetEnemyY+64*sin(dir2),dir2,512,15,90,kleur,15);
				dir -= 8; dir2 += 8;
				kleur++;
				if(kleur == 5) { kleur = 3; } 
				wait(10);
				PlaySFX(SFX_LAZER01);
			} 	
			wait(30);
			dir = 250; dir2 = 290;	
		}
		dir = 90; dir2 = 90;		
		wait(200);	
		ascent(j in 0..2) { 
			ascent(i in 0..24) { 
				djLaser(GetEnemyX+64*cos(dir),GetEnemyY+64*sin(dir),dir,512,15,90,kleur,15);
				djLaser(GetEnemyX+64*cos(dir2),GetEnemyY+64*sin(dir2),dir2,512,15,90,kleur,15);
				dir += 8; dir2 -= 8;
				kleur++;
				if(kleur == 5) { kleur = 3; } 
				wait(10);
				PlaySFX(SFX_LAZER01);
			} 	
			dir = 90; dir2 = 90;	
		}		
		dir = 250; dir2 = 290;	
		wait(180);
	}
}

// Laser show secondary colours. 
task fireLasers2 { 
	let dir = 250;
	let dir2 = 290;
	let kleur = 6;
	wait(180);
	while(!Obj_IsDeleted(bossObj)) { 
		ascent(j in 0..2) { 
			ascent(i in 0..24) { 	
				djLaser(GetEnemyX+64*cos(dir),GetEnemyY+64*sin(dir),dir,512,15,120,kleur,15);
				djLaser(GetEnemyX+64*cos(dir2),GetEnemyY+64*sin(dir2),dir2,512,15,120,kleur,15);
				dir -= 8; dir2 += 8;
				kleur++;
				if(kleur == 8) { kleur = 6; } 
				wait(10);
				PlaySFX(SFX_LAZER01);
			} 	
			wait(30);
			dir = 250; dir2 = 290;	
		}
		dir = 90; dir2 = 90;	
		wait(200);		
		ascent(j in 0..2) { 
			ascent(i in 0..24) { 
				djLaser(GetEnemyX+64*cos(dir),GetEnemyY+64*sin(dir),dir,512,15,120,kleur,15);
				djLaser(GetEnemyX+64*cos(dir2),GetEnemyY+64*sin(dir2),dir2,512,15,120,kleur,15);
				dir += 8; dir2 -= 8;
				kleur++;
				if(kleur == 8) { kleur = 6; } 
				wait(10);
				PlaySFX(SFX_LAZER01);
			} 	
			dir = 90; dir2 = 90;	
		}		
		dir = 250; dir2 = 290;	
		wait(180);
	}
}

// Warning shot laser to warn for changing pattern of lasers
task warningShot {
	wait(860);
	concenEffect(bossObj,20,5,64,128,64);
	concenEffect(bossObj,20,5,128,128,128);
	concenEffect(bossObj,60,1,64,64,255);
	concenEffect(bossObj,60,1,64,255,64);		
}

// Dj lasers
function djLaser(x,y,dir,length,width,lifetime,graphic,delay) {
	let obj = ObjShot_Create(OBJ_STRAIGHT_LASER);

	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetAngle(obj,dir);
	ObjStLaser_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,graphic);
	ObjShot_SetDelay(obj,delay);
	ObjShot_SetDeleteFrame(obj,lifetime);
	ObjLaser_SetRenderWidth(obj,width);
	ObjLaser_SetIntersectionWidth(obj,width-4);
	ObjLaser_SetLength(obj,length);
	ObjLaser_SetInvalidLength(obj,0,0);
}

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

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

	CloseScript(GetOwnScriptID());
}
 