#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Dj spell 01 normal"]
#Text["Dj spell 01 normal"]

let seismic = 0; 
let boxTex = "script/thdcs/system/enm03/boxfam.png";

#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(3);
	setAura(bossObj,64,255,128);
	SetCommonData("bossCircleType",3);
	SetCommonData("bossAttackType",2);
	SetCommonData("bossBgType",3);
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","@unk̔qv"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Tuning uSeismic Beatv"); } 	
	setInvulnerableTime(bossObj,360);

	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetShotAutoDeleteClip(16,16,16,16);
	SetAutoDeleteObject(true);
	
	concenEffect(bossObj,30,5,64,128,64);
	concenEffect(bossObj,30,5,128,128,128);
	concenEffect(bossObj,60,1,64,64,255);
	concenEffect(bossObj,60,1,64,255,64);
		
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(350);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(65);
	}
	case(EV_REQUEST_SPELL_SCORE) {
	    let spellCardBonus = calculateAndGetSpellCardBonus();
		SetScriptResult(spellCardBonus);
	}	
	case(EV_USER+9999) {
		SetCommonData("spellcardID","dj01norm"); 
	}
} 

@MainLoop { yield; } 
@Finalize { } 


task mainTask { 
	yield;
	scriptEnding;
	wait(120);
	beat;
} 

task beat {
	PlaySFX(SFX_OPTION);
	speakerFam(GetEnemyX-80,GetEnemyY,0);
	speakerFam(GetEnemyX+80,GetEnemyY,1);
	vuur;
	beweeg;
	while(!Obj_IsDeleted(bossObj)) {  
		vuur2;
		beweeg;
		vuur3; 
		beweeg;
		vuur4; 
		beweeg;			
	}
}

sub vuur {
	recordBullet(GetCenterX-180,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX+180,GetClipMinY,4,90,251,0);		
} 

sub vuur2 {
	recordBullet(GetCenterX-180,GetClipMinY,5,90,251,0);
	recordBullet(GetCenterX-100,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX+100,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX+180,GetClipMinY,5,90,251,0);		
} 	

sub vuur3 {
	recordBullet(GetCenterX-180,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX-140,GetClipMinY,4,90,251,0);	
	recordBullet(GetCenterX-40,GetClipMinY,5,90,251,0);
	recordBullet(GetCenterX+40,GetClipMinY,5,90,251,0);
	recordBullet(GetCenterX+140,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX+180,GetClipMinY,4,90,251,0);	
}

sub vuur4 {
	recordBullet(GetCenterX-160,GetClipMinY,4,90,251,0);
	recordBullet(GetCenterX-80,GetClipMinY-20,4,90,251,0);	
	recordBullet(GetCenterX,GetClipMinY-40,5,90,251,0);
	recordBullet(GetCenterX+80,GetClipMinY-20,4,90,251,0);
	recordBullet(GetCenterX+160,GetClipMinY,4,90,251,0);	
}	

sub beweeg {
	PlaySFX(SFX_CH00);
		
	wait(120);		
	PlaySFX(SFX_BOXNOISE);
	seismic = 1;	
	quakeCam2D(5,120);
	ascent(i in 0..12) { 
		PlaySFX(SFX_BOXBEAT);
		exploEffect(GetEnemyX-88,GetEnemyY-10,15,0.9);
		exploEffect(GetEnemyX+88,GetEnemyY-10,15,0.9);
		wait(10);
	}
	PlaySFX(SFX_KIRA00);	
	seismic = 2;
	wait(1);
	seismic = 3; 
	wait(120);
	seismic = 0;
}	

task recordBullet(x,y,v,dir,kleur,delay) {
	let obj = ObjShot_Create(OBJ_SHOT);
	
	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetSpeed(obj,v);
	ObjMove_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,kleur);
	ObjShot_SetDelay(obj,delay);
	ObjShot_SetSpellResist(obj,true);
	gramVuur(obj);
	
	while(!Obj_IsDeleted(obj)) {
		if (ObjMove_GetY(obj) > GetClipMaxY+8) { Obj_Delete(obj); } 
		yield;
	}
}

task gramVuur(obj) { 
	let kleurteller = 10;
	while(!Obj_IsDeleted(obj)) { 
		PlaySFX(SFX_TAN00);
		if (kleurteller == 15) { CreateQuakeShotDJ(ObjMove_GetX(obj),ObjMove_GetY(obj),0,90,232,0); kleurteller = 0; } 
		else { CreateQuakeShotDJ(ObjMove_GetX(obj),ObjMove_GetY(obj),0,90,112,0); } 
		kleurteller++;
		let effShot = CreateShotA(ObjMove_GetX(obj),ObjMove_GetY(obj),40);
		SetShotDataA(effShot,0,0,0,0,0,0,205);
		DeleteShotA(effShot,0);		
		wait(5);
	}
}

task CreateQuakeShotDJ(x,y,v,dir,kleur,delay) {
	let obj = ObjShot_Create(OBJ_SHOT);
	
	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetSpeed(obj,v);
	ObjMove_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,kleur);
	ObjShot_SetDelay(obj,delay);
	ObjShot_SetSpellResist(obj,true);
	
	while(!Obj_IsDeleted(obj)) {
		if(seismic == 1) { 
			ObjMove_SetAngle(obj,rand_int(0,359));
			ObjMove_SetSpeed(obj,0); 
		}
		if(seismic == 2) { 
			ObjMove_SetAngle(obj,atan2(GetPlayerY-ObjMove_GetY(obj),GetPlayerX-ObjMove_GetX(obj)));
			ObjMove_SetSpeed(obj,rand(0.2,2.0)); 
		}
				
		if(seismic == 3) { 
			if(kleur == 112) { CreateQuakeShotDJ2(ObjMove_GetX(obj),ObjMove_GetY(obj),rand(0.4,1.5),ObjMove_GetAngle(obj),110,0); }
			if(kleur == 232) { CreateQuakeShotDJ2(ObjMove_GetX(obj),ObjMove_GetY(obj),rand(0.4,1.5),ObjMove_GetAngle(obj),231,0); }
			Obj_Delete(obj);
		} 
		yield;
	}
}

task CreateQuakeShotDJ2(x,y,v,dir,kleur,delay) {
	let obj = ObjShot_Create(OBJ_SHOT);
	
	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetSpeed(obj,v);
	ObjMove_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,kleur);
	ObjShot_SetDelay(obj,delay);
	ObjShot_SetSpellResist(obj,true);
	
	ObjMove_SetAngle(obj,atan2(GetPlayerY-ObjMove_GetY(obj),GetPlayerX-ObjMove_GetX(obj)));	
}

task speakerFam(x,y,type) {	
	let obj = ObjEnemy_Create(OBJ_ENEMY); 	
    let f = 0;
    let opneer = y;
	
	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,boxTex);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(obj,30);
	ObjMove_SetPosition(obj,x,y);	
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetScaleXYZ(obj,0.5,0.5,0);
	ObjSprite2D_SetSourceRect(obj,0,0,111,204);
	if(type == 0) { ObjRender_SetAngleXYZ(obj,0,180,0); } 
	if(type == 1) { ObjRender_SetAngleXYZ(obj,0,0,0); } 
	ObjSprite2D_SetDestCenter(obj);
	Obj_SetValue(obj,"isFamiliar",true); 
	concenEffect(obj,15,3,64,128,64);
	concenEffect(obj,15,3,128,128,128);
	concenEffect(obj,60,1,64,64,255);
	concenEffect(obj,60,1,64,255,64);	
	
	while(! Obj_IsDeleted(obj)) {
		opneer += (60*cos(f)/180);	
		ObjRender_SetPosition(obj,x,opneer,0);		
		f+=2;
		yield;
	}
	Obj_DeleteValue(obj,"isFamiliar");
}

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

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

	CloseScript(GetOwnScriptID());
}
 