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

let rollerTex = "script/thdcs/system/enm02/skate.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(2);
	setAura(bossObj,64,64,255);
	SetCommonData("bossCircleType",2);
	SetCommonData("bossAttackType",2);
	SetCommonData("bossBgType",2);
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","tB[o[ uῂ̃[[XP[gv"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Fever uBlazing Roller Skatesv"); } 		
	setInvulnerableTime(bossObj,180);
	
	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,192,120,5);
	SetShotAutoDeleteClip(16,16,16,16);
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { } 

task mainTask { 
	yield;
	scriptEnding;
	wait(60);
	beweeg;
	control;
	vloerEffect;
	plafonEffect;
} 

// Movement 
task beweeg { 
	let dir = 0;
	wait(200);
	while(!Obj_IsDeleted(bossObj)) {
		ObjMove_RandomPosWeight(bossObj,rand_int(60,100),rand_int(40,80),5,10,GetClipMinX+96,64,GetClipMaxX-96,140);		
		wait(100);
		concenEffect(bossObj,10,4,155,32,255);
		concenEffect(bossObj,10,4,255,255,255);
		concenEffect(bossObj,10,4,255,255,64);			
		PlaySFX(SFX_POWER0);		
		wait(30);
		PlaySFX(SFX_LAZER01);
		ascent(i in 0..18) {
			CreateLooseLaserA1(GetEnemyX-25,GetEnemyY-50,2,dir,200,10,4,20);
			dir+=360/18;
		}
		wait(150);
	}
}

// Control
task control {
	while(!Obj_IsDeleted(bossObj)) {
		bossAttack = 3;
		skateFam(GetClipMinX,420,0);
		wait(60);
		bossAttack = 4;
		skateFam(GetClipMaxX,420,1);
		wait(30);
		bossAttack = 0;
		wait(60);
	}
}

// Floor effect
task vloerEffect {
	let kleur = 170;
	while(!Obj_IsDeleted(bossObj)) {
		let floorEff = CreateShotA(rand(0,80),rand(GetClipMaxY,GetClipMaxY-16),rand_int(20,25));
		let floorEff2 = CreateShotA(rand(80,160),rand(GetClipMaxY,GetClipMaxY-16),rand_int(20,25));
		let floorEff3 = CreateShotA(rand(160,240),rand(GetClipMaxY,GetClipMaxY-16),rand_int(20,25));
		let floorEff4 = CreateShotA(rand(240,340),rand(GetClipMaxY,GetClipMaxY-16),rand_int(20,25));
		let floorEff5 = CreateShotA(rand(340,450),rand(GetClipMaxY,GetClipMaxY-16),rand_int(20,25));

		SetShotDataA(floorEff,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff2,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff3,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff4,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff5,0,1,rand(260,280),0,0,0,kleur);	

		DeleteShotA(floorEff,0);
		DeleteShotA(floorEff2,0);
		DeleteShotA(floorEff3,0);
		DeleteShotA(floorEff4,0);
		DeleteShotA(floorEff5,0);

		kleur++;
		if(kleur==178){kleur=170;}
		yield;
	}
}

// Ceiling effect
task plafonEffect { 
	let kleur = 170;
	wait(100);
	while(!Obj_IsDeleted(bossObj)) {
		let floorEff6 = CreateShotA(rand(0,80),rand(GetClipMinY,GetClipMinY+16),rand_int(20,25));
		let floorEff7 = CreateShotA(rand(80,160),rand(GetClipMinY,GetClipMinY+16),rand_int(20,25));
		let floorEff8 = CreateShotA(rand(160,240),rand(GetClipMinY,GetClipMinY+16),rand_int(20,25));
		let floorEff9 = CreateShotA(rand(240,340),rand(GetClipMinY,GetClipMinY+16),rand_int(20,25));
		let floorEff10 = CreateShotA(rand(340,450),rand(GetClipMinY,GetClipMinY+16),rand_int(20,25));

		SetShotDataA(floorEff6,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff7,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff8,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff9,0,1,rand(260,280),0,0,0,kleur);
		SetShotDataA(floorEff10,0,1,rand(260,280),0,0,0,kleur);	

		DeleteShotA(floorEff6,0);
		DeleteShotA(floorEff7,0);
		DeleteShotA(floorEff8,0);
		DeleteShotA(floorEff9,0);
		DeleteShotA(floorEff10,0);

		kleur++;
		if(kleur==178){kleur=170;}
		yield;
	}
}

// Skate familiar
task skateFam(x,y,move) {
	PlaySFX(SFX_OPTION);
	let type = rand_int(1,5); 
	let dir = 0;
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	let rollerDir = 0;
	
	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,rollerTex);
	ObjRender_SetScaleXYZ(obj,0.7,0.7,0);	
	ObjSprite2D_SetSourceRect(obj,0,0,80,80); 
	ObjSprite2D_SetDestCenter(obj);
	if(move == 1){ ObjRender_SetAngleY(obj,180); }
	ObjMove_SetPosition(obj,x,y);	
	ObjMove_SetAngle(obj,rollerDir);
	Obj_SetValue(obj,"isFamiliar",true); 
	
	// handlers
	skateShot(obj,move);
	skateSparks(obj);
	skateLifeTime(obj);
	
	if(move == 0) { 
		ObjMove_SetDestAtWeight(obj,450,ObjMove_GetY(obj),10,1);
		wait(50);
		ObjMove_SetDestAtWeight(obj,360,ObjMove_GetY(obj),5,5);
		wait(70);
		loop(30) {
			ObjRender_SetAngleZ(obj,rollerDir);
			ObjMove_SetAngle(obj,rollerDir);			
			rollerDir-=3;
			wait(1);
		}	
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),5,10,5);
		wait(80);
		loop(30) {
			ObjRender_SetAngleZ(obj,rollerDir);
			ObjMove_SetAngle(obj,rollerDir);			
			rollerDir-=3;
			wait(1);
		}
		ObjMove_SetDestAtSpeed(obj,-45,ObjMove_GetY(obj),5);
		wait(80);
		Obj_DeleteValue(obj,"isFamiliar");
		Obj_Delete(obj);
	}
	if(move == 1) { 
		ObjMove_SetDestAtWeight(obj,50,ObjMove_GetY(obj),10,1);
		wait(50);
		ObjMove_SetDestAtWeight(obj,25,ObjMove_GetY(obj),5,5);
		wait(70);
		loop(30) {
			ObjRender_SetAngleZ(obj,rollerDir);
			ObjMove_SetAngle(obj,rollerDir);			
			rollerDir-=3;
			wait(1);
		}	
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),5,10,5);
		wait(80);
		loop(30) {
			ObjRender_SetAngleZ(obj,rollerDir);
			ObjMove_SetAngle(obj,rollerDir);			
			rollerDir-=3;
			wait(1);
		}
		ObjMove_SetDestAtSpeed(obj,480,ObjMove_GetY(obj),5);
		wait(80);
		Obj_DeleteValue(obj,"isFamiliar");
		Obj_Delete(obj);
	}	
}

// If the skate fammer is dead, remove.
task skateLifeTime(obj) {
	while(!Obj_IsDeleted(obj)) {
		yield;
	}
	Obj_DeleteValue(obj,"isFamiliar");
	Obj_Delete(obj);
}

// Skate shots
task skateShot(obj,move) {
	let kleur = 135;
	wait(45);
	let rollerDir = ObjMove_GetAngle(obj);
	while(!Obj_IsDeleted(obj)) {
		ascent(i in 0..6) {
			PlaySFX(SFX_TAN01);
			if(move == 0) { 
				CreateShotA1(ObjMove_GetX(obj)-25*cos(80-rollerDir),ObjMove_GetY(obj)+20*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-35*cos(80-rollerDir),ObjMove_GetY(obj)+22*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-45*cos(80-rollerDir),ObjMove_GetY(obj)+24*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);	
				CreateShotA1(ObjMove_GetX(obj)-55*cos(80-rollerDir),ObjMove_GetY(obj)+26*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-65*cos(80-rollerDir),ObjMove_GetY(obj)+28*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-75*cos(80-rollerDir),ObjMove_GetY(obj)+30*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-85*cos(80-rollerDir),ObjMove_GetY(obj)+32*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-95*cos(80-rollerDir),ObjMove_GetY(obj)+34*sin(80-rollerDir),1,ObjMove_GetAngle(obj)-115,kleur,5);
			}
			if(move == 1) { 
				CreateShotA1(ObjMove_GetX(obj)-25*cos(80+rollerDir),ObjMove_GetY(obj)+20*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-35*cos(80+rollerDir),ObjMove_GetY(obj)+22*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-45*cos(80+rollerDir),ObjMove_GetY(obj)+24*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);	
				CreateShotA1(ObjMove_GetX(obj)-55*cos(80+rollerDir),ObjMove_GetY(obj)+26*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-65*cos(80+rollerDir),ObjMove_GetY(obj)+28*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-75*cos(80+rollerDir),ObjMove_GetY(obj)+30*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-85*cos(80+rollerDir),ObjMove_GetY(obj)+32*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
				CreateShotA1(ObjMove_GetX(obj)-95*cos(80+rollerDir),ObjMove_GetY(obj)+34*sin(80+rollerDir),1,ObjMove_GetAngle(obj)+115,kleur,5);
			}			
			kleur++;
			if(kleur == 148){ kleur = 135; }
			wait(15);
		}
		wait(140);
	}
}

// Sparks 
task skateSparks(obj) {
	let kleur = 170;
	wait(10);
	let rollerDir = ObjMove_GetAngle(obj);	
	while(!Obj_IsDeleted(obj)) {
		wait(2);
		let sparks = CreateShotA(ObjMove_GetX(obj)-20*cos(80-rollerDir*2),ObjMove_GetY(obj)+10*sin(80-rollerDir),8);
		let sparks2 = CreateShotA(ObjMove_GetX(obj)+20*cos(70+rollerDir*2),ObjMove_GetY(obj)+10*sin(70-rollerDir),8);
		SetShotDataA(sparks,0,1,ObjMove_GetAngle(obj)-rand(80,180),0,0,0,kleur);
		SetShotDataA(sparks2,0,1,ObjMove_GetAngle(obj)-rand(80,180),0,0,0,kleur);
		DeleteShotA(sparks,20);
		DeleteShotA(sparks2,20);
		kleur++;
		if(kleur == 178){ kleur = 170; }
    }
}

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

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

	CloseScript(GetOwnScriptID());
}
 