#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Afro spell 05 hard"]
#Text["Afro spell 05 hard"]

let famTex = "script/thdcs/system/effects/fammer.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","o[eZ uт炩v"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Bartender skill uShow offv"); } 		
	setInvulnerableTime(bossObj,360);
	
	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,48,5);
	SetShotAutoDeleteClip(64,64,64,64);
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { } 

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

task control { 
	bossAttack = 1;
	PlaySFX(SFX_CH00);
	concenEffect(bossObj,15,4,64,64,255);
	concenEffect(bossObj,15,4,255,64,64);
	concenEffect(bossObj,33,3,255,255,255);	
	bossAttack = 2;
	PlaySFX(SFX_OPTION); 	
	fam(GetEnemyX,GetEnemyY);
	bossAttack = 0;
	outerRing;
	sfxLoop;
	wait(60);	
	famPattern;	
	wait(60);
	sparkShot;	
}

task sfxLoop {
	while(!Obj_IsDeleted(bossObj)) { 
		PlaySFX(SFX_TAN00);
		wait(6);
	}
}

// Centre familiar
task fam(x,y) {
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let spin = 0;

	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,famTex); 
	ObjPrim_SetTexture(obj2,famTex); 
	ObjRender_SetAlpha(obj,205);
	ObjRender_SetAlpha(obj2,150);
	Obj_SetRenderPriorityI(obj,20);
	Obj_SetRenderPriorityI(obj2,21);
	ObjRender_SetScaleXYZ(obj,1,1,0);
	ObjRender_SetScaleXYZ(obj2,1,1,0);
	ObjSprite2D_SetSourceRect(obj,63,0,96,31); 
	ObjSprite2D_SetSourceRect(obj2,63,0,96,31); 
	ObjSprite2D_SetDestCenter(obj);
	ObjSprite2D_SetDestCenter(obj2);
	ObjEnemy_SetLife(obj,200);
	ObjRender_SetPosition(obj,x,y,0);	
	ObjMove_SetPosition(obj,x,y);
	Obj_SetValue(obj,"isFamiliar",true); 
	
	ObjMove_SetDestAtSpeed(obj,GetCenterX,GetCenterY,2);
	
	concenEffect(obj,45,1,64,64,255);
	concenEffect(obj,10,4,64,128,255);
	concenEffect(obj,45,1,255,255,255);	
	concenEffect(obj,15,3,255,64,255);	
	concenEffect(obj,15,3,64,255,255);	
	
	while(!Obj_IsDeleted(obj)) { 
		ObjRender_SetAngleZ(obj,-spin/4);	
		ObjRender_SetAngleZ(obj2,spin);	
		ObjRender_SetPosition(obj2,ObjMove_GetX(obj),ObjMove_GetY(obj),0);	
		spin+=10;
		yield;
	}
	Obj_DeleteValue(obj,"isFamiliar");		
}

task famPattern {
	let u = 250;
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		loop(1) { 
			ascent(i in 0..72) {
				wait(5);
				CreateShotA1(GetCenterX,GetCenterY,1,dir,240,10);
				CreateShotA1(GetCenterX,GetCenterY,1,dir-180,240,10);
				dir+=360/72;
			}
			dir++;
		}
		exploEffect(GetCenterX,GetCenterY,5.5,0.5);
		PlaySFX(SFX_POWER1);
		loop(1) { 
			ascent(i in 0..72) {
				wait(2);
				CreateShotA1(GetCenterX,GetCenterY,1,dir,239,10);
				CreateShotA1(GetCenterX,GetCenterY,1,dir-180,239,10);
				dir-=360/72;
			}
			dir++;
		}
		exploEffect(GetCenterX,GetCenterY,5.5,0.5);
		PlaySFX(SFX_POWER1);
		loop(1) { 
			ascent(i in 0..72) {
				wait(5);
				CreateShotA1(GetCenterX,GetCenterY,1,dir,241,10);
				CreateShotA1(GetCenterX,GetCenterY,1,dir-180,241,10);
				dir+=360/72;
			}
			dir++;
		}
		exploEffect(GetCenterX,GetCenterY,5.5,0.5);
		PlaySFX(SFX_POWER1);
		loop(1) { 
			ascent(i in 0..72) {
				wait(2);
				CreateShotA1(GetCenterX,GetCenterY,1,dir,242,10);
				CreateShotA1(GetCenterX,GetCenterY,1,dir-180,242,10);
				dir-=360/72;
			}
			dir++;
		}	
		exploEffect(GetCenterX,GetCenterY,5.5,0.5);
		PlaySFX(SFX_POWER1);
		yield;
	}
}

task sparkShot {
	let dir = 0;
	let kleur = 149; 
	while(!Obj_IsDeleted(bossObj)) { 
		CreateShotA1(GetCenterX,GetCenterY,0.5,dir,kleur,5);
		kleur++;
		dir = rand(0,359);
		if(kleur == 155){ kleur = 149; }
		wait(10);		
	}
}

task outerRing {
	let u = 250;
	let dir = 0;
	let kleur = 194;
	while(!Obj_IsDeleted(bossObj)) { 
		let ringFire = CreateShotA(GetCenterX-u*cos(dir),GetCenterY-u*sin(dir),40);
		SetShotDataA(ringFire,0,1,dir,0.6,0,0,kleur);
		SetShotDataA(ringFire,180,-3,dir,0,0,0,kleur);

		let ringFire2 = CreateShotA(GetCenterX-u*cos(dir),GetCenterY-u*sin(dir),40);
		SetShotDataA(ringFire2,0,1,dir,-0.6,0,0,kleur);
		SetShotDataA(ringFire2,180,-3,dir,0,0,0,kleur);
		dir+=360/36;
		kleur++;
		if(kleur == 201){ kleur = 194; }
		yield;
	}
}

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

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

	CloseScript(GetOwnScriptID());
}
 