#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Tenji & Iku spell 07 normal"]
#Text["Tenji & Iku spell 07 normal"]

let cut2 = "script/thdcs/system/face/ikunorm.png";

let glowy = "script/thdcs/system/effects/glowymirror.png";
let boltTex = "script/thdcs/system/effects/lightningbolt.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"
#include "script/thdcs/functions/function_cutin.txt"

@Initialize {
	SetCommonData("spellScriptID",GetOwnScriptID);

	SetCommonData("isDuet", true);
    SetCommonData("bossCircleType",2);
    SetCommonData("bossAttackType",2);
    SetCommonData("bossBgType",2);
	renderBoss(2);
	renderBoss2(20);
    bossMagicCircle2;
	setAura(bossObj,64,64,255);
	setAura(boss2Obj,255,255,64);

	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","uŏI肾I ddtv"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","uThis is it! Electric duov"); }
	
	concenEffect(bossObj,10,4,64,64,255);
	concenEffect(bossObj,10,4,255,64,64);
	concenEffect(bossObj,10,4,64,255,64);

	concenEffect(boss2Obj,10,4,64,64,255);
	concenEffect(boss2Obj,10,4,255,64,64);
	concenEffect(boss2Obj,10,4,64,255,64);

	ObjMove_SetPosition(bossObj,bossX,bossY);
	ObjMove_SetPosition(boss2Obj,GetCommonData("boss2X",boss2X),GetCommonData("boss2Y",boss2Y));
	
	ObjMove_SetDestAtSpeed(bossObj,GetCenterX-96,GetCenterY-64,10);
	ObjMove_SetDestAtSpeed(boss2Obj,GetCenterX+96,GetCenterY-64,10);
	
	cutin2(DUET2,0,cut2,0,0,1024,1024,0.45);
	
	SetShotAutoDeleteClip(64,64,64,64);
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { } 


task mainTask { 
	yield;
	scriptEnding;
	PlaySFX(SFX_CH00);
	PlaySFX(SFX_CAT00);		
	control; 
} 

// initial control
task control {
	boss2Attack = 0;	
	ObjMove_SetDestAtWeight(boss2Obj,GetCenterX,GetCenterY-120,5,30);
	ObjMove_SetDestAtWeight(bossObj,GetCenterX,GetCenterY,10,20);
	wait(60);
	duet;
}

task duet {
	while(!Obj_IsDeleted(bossObj)) {
		concenEffect(bossObj,10,1,255,64,255);
		concenEffect(bossObj,10,1,255,64,64);
		concenEffect(bossObj,10,1,64,255,64);
		concenEffect(bossObj,10,1,64,255,255);
		PlaySFX(SFX_POWER0);
		wait(30);	
		ascent(i in 0..2) {
			tenjiLaser;
			wait(90);
			ikuLightning; 
			wait(420);
		}
		ObjMove_SetDestAtWeight(bossObj,GetCenterX+24,GetCenterY-64,5,20);		
		ObjMove_SetDestAtWeight(boss2Obj,GetCenterX-24,GetCenterY-64,5,20);		
		boss2Attack = 1;
		bossAttack = 0;
		wait(30);
		concenEffect(bossObj,10,4,255,64,255);
		concenEffect(bossObj,10,4,255,64,64);
		concenEffect(boss2Obj,10,4,255,255,64);
		concenEffect(boss2Obj,10,4,255,64,64);
		
		PlaySFX(SFX_POWER0);
		PlaySFX(SFX_CH02);
		wait(60);
		dualFeverShot;
		wait(180);
		ObjMove_SetDestAtWeight(boss2Obj,GetCenterX,GetCenterY-120,5,30);
		ObjMove_SetDestAtWeight(bossObj,GetCenterX,GetCenterY,10,20);		
		wait(90);
	}
}

// Fever duet shot 
task dualFeverShot { 
	boss2Attack = 2;
	bossAttack = 0;
	let dir = 0;
	ascent(i in 0..72) {
		PlaySFX(SFX_LAZER01);
		CreateLooseLaserA1(bossX-32+16*cos(dir),bossY-64+16*sin(dir),4,dir,128,8,5,30);
		dir = rand(0,360);		
		CreateShotA2(bossX-32+32*cos(dir),bossY-64+32*sin(dir),0,dir,0.4,rand(1,4),rand_int(194,201),5);
		dir = rand(0,360);
		CreateShotA2(bossX-32+32*cos(dir),bossY-64+32*sin(dir),0,dir,0.4,rand(1,4),rand_int(194,201),5);
		dir = rand(0,360);			
		wait(2);
	}
}

// Tenji laser show off
task tenjiLaser { 
	let dir = 350;
	bossAttack = 4;
	boss2Attack = 2;
	ascent(i in 0..18) {
		PlaySFX(SFX_LAZER01);
		let funkyLaser00 = CreateLooseLaserA1(bossX+60*cos(dir),bossY+60*sin(dir),4,dir,300,10,4,0); 
		funkyLaserHandle(funkyLaser00,152,4,0); 
		let effb = CreateShotA1(bossX+60*cos(dir),bossY+60*sin(dir),0,0,152,0); 
		ObjShot_SetDeleteFrame(effb,60);			
		dir+=200/17;

		if(i > 10) { bossAttack = 3; }
		wait(3);
	}
	bossAttack = 1;
	boss2Attack = 2;	
}

// Iku lightning attack flow
task ikuLightning {
	boss2Attack = 1;
	ikuCharge;
	wait(60);
	PlaySFX(SFX_THUNDER00);
	ballEffect2(boss2X-24,boss2Y-48);
	ballEffect2(boss2X+24,boss2Y-48);
	lightningbolt(boss2X,boss2Y,boss2X-24,boss2Y-24,250);
	lightningbolt(boss2X,boss2Y,boss2X+24,boss2Y-24,290);
	wait(30);
	bossAttack = 2;
	ascent(i in 0..3) { 
		ballEffect(GetPlayerX,GetClipMaxY);
		wait(30);
	}
	wait(60);
	boss2Attack = 0;
}

// Iku animation charge
task ikuCharge {
	PlaySFX(SFX_BZZ1);
	concenEffect(boss2Obj,15,3,64,64,255);
	concenEffect(boss2Obj,5,4,255,64,64);
	concenEffect(boss2Obj,5,4,64,255,64);		
	ascent(i in 0..5) { 
		exploEffect(boss2X,boss2Y,15,0.5);
		wait(15);
	}
}

// Lightning bolt
task lightningbolt(mx,my,x,y,forcedir) {

	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let c = 0;
	let slide = 0;
	let dir = 0;
	let dir2 = 0;
	let offset = 0;
	
	ObjPrim_SetTexture(obj,boltTex);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj,50);
	ObjRender_SetPosition(obj,x,y-32,0);
	ObjRender_SetScaleXYZ(obj,0.65,1.2,0);
	ObjSprite2D_SetSourceRect(obj,0,0,128,512);
	ObjSprite2D_SetDestRect(obj,-64,0,64,512);		
	
	ObjPrim_SetTexture(obj2,boltTex);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj2,50);
	ObjRender_SetPosition(obj2,x,y-32,0);
	ObjRender_SetScaleXYZ(obj2,1,1.2,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,128,512);
	ObjSprite2D_SetDestRect(obj2,-64,0,64,512);		

	colorMixer(obj2,255,255,255,0);
	
	// if no forced dir, don't apply atancalculation or sfx from thunder00
	if(forcedir == 0) { 
		PlaySFX(SFX_THUNDER01);
		
		dir = GetPointToPointAngle(mx,my,ObjRender_GetX(obj),ObjRender_GetY(obj)); 

		let minX = min(mx,x);
		let minY = min(my,y);
		let dX = absolute(mx-x);	
		let dY = absolute(my-y);
	
		let s = 1/24;
		ascent(i in 0..24) {
			CreateShotA2(x+i*s*512*cos(dir),y-32+i*s*512*sin(dir),0,dir-i*24,0.01,1.5,rand_int(135,148),10);
			CreateShotA2(x+i*s*512*cos(dir), y-32+i*s*512*sin(dir),0,dir+i*24,0.01,1.5,rand_int(135,148),10);
		}
		dir2=rand_int(0,360);
		ascent(i in 0..16) {
			CreateShotA2(mx+1*cos(dir2),my+1*sin(dir2),0,dir2,0.02,2,rand_int(194,200),10);
			dir2+=360/16;
		
		}
	}
	if(forcedir > 0) { 
		dir = forcedir;
	}
	
	// set angle
	ObjRender_SetAngleZ(obj,dir-90);
	ObjRender_SetAngleZ(obj2,dir-90);	
	
	// invisible laser to hurt the player
	let ikuBolt = CreateStraightLaserA1(ObjRender_GetX(obj),ObjRender_GetY(obj),dir,1024,16,90,267,0);
	ObjRender_SetAlpha(ikuBolt,0);
	quakeCam2D(5,15);
	
	while(!Obj_IsDeleted(obj)) {
		ObjSprite2D_SetSourceRect(obj,0,0-slide,128,512-slide);
		ObjSprite2D_SetSourceRect(obj2,0,0-slide,128,512-slide);
		slide+=24;
		
		if(c == 90) { Obj_Delete(obj); Obj_Delete(obj2); } 
		c++;
		yield;
	}
	Obj_Delete(obj); Obj_Delete(obj2);
}

// ball Effect
task ballEffect(x,y) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);

	let parts = 0.01;
	let partspin = 0;
	let c = 0;

	ObjPrim_SetTexture(obj,glowy);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,255);
	Obj_SetRenderPriorityI(obj,40);
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetScaleXYZ(obj,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj);
	
	ObjPrim_SetTexture(obj2,glowy);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj2,255);
	Obj_SetRenderPriorityI(obj2,41);
	ObjRender_SetPosition(obj2,x,y,0);
	ObjRender_SetScaleXYZ(obj2,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj2);	

	colorMixer(obj2,255,255,255,0);

	while(! Obj_IsDeleted(obj)) {
		ObjRender_SetAngleZ(obj,partspin);
		ObjRender_SetAngleZ(obj2,-partspin);
		partspin+=20;

		if(c < 30) { 
			ObjRender_SetScaleXYZ(obj2,parts,parts,0);
			ObjRender_SetScaleXYZ(obj,parts,parts,0);		
			parts+= 0.99/30; 
		}
		if(c >= 30) { 		
			ObjRender_SetScaleXYZ(obj2,parts,parts,0);
			ObjRender_SetScaleXYZ(obj,parts-0.5,parts-0.5,0);
			parts = rand(0.9,1.1);
		}
		if(c == 30) { lightningbolt(ObjRender_GetX(obj),ObjRender_GetY(obj),rand_int(GetClipMinX,GetClipMaxX),GetClipMinY,0); }
		if(c == 120) { Obj_Delete(obj); Obj_Delete(obj2); } 
		c++;
		
		yield;
	}
}

// ball effect 2
task ballEffect2(x,y) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	
	let parts = 0;
	let partspin = 0;
	let c = 0;

	ObjPrim_SetTexture(obj,glowy);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,255);
	Obj_SetRenderPriorityI(obj,40);
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetScaleXYZ(obj,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj);
	
	ObjPrim_SetTexture(obj2,glowy);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj2,255);
	Obj_SetRenderPriorityI(obj2,41);
	ObjRender_SetPosition(obj2,x,y,0);
	ObjRender_SetScaleXYZ(obj2,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj2,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj2);	

	colorMixer(obj2,255,255,255,0);

	while(! Obj_IsDeleted(obj)) {

		ObjRender_SetAngleZ(obj,partspin);
		ObjRender_SetAngleZ(obj2,-partspin);
		partspin+=20;
	
		ObjRender_SetScaleXYZ(obj2,parts,parts,0);
		ObjRender_SetScaleXYZ(obj,0.3,0.3,0);
		parts = rand(0.3,0.4);
	
		if(c == 120) { Obj_Delete(obj); Obj_Delete(obj2); } 
		c++;

		yield;
	}
}

// Reflecting laser
task funkyLaserHandle(obj,delsource,graphic,bounce) {
	let x = 0;
	let y = 0;
	let dir = 0;
	let NotYetBounced = true;
	ObjStLaser_SetSource(obj,true);
	
	while(!Obj_IsDeleted(obj)) {
		x = ObjMove_GetX(obj);
		y = ObjMove_GetY(obj);
		dir = ObjMove_GetAngle(obj);
		
		// bounce code
		if(bounce < 1) {
			
			// ceiling reflection
			if(y <= GetClipMinY || y >= GetClipMaxY) {
				CreateLooseLaserA1(x,y,4,-ObjMove_GetAngle(obj),300,10,graphic,0); 
				let effb = CreateShotA1(x,y,0,0,delsource,0); 
				ObjShot_SetDeleteFrame(effb,60);
				PlaySFX(SFX_KIRA00);
				bounce++;
				break;
			} 
			
			// wall reflection
			if(((dir < -90 || 90 < dir) && x < GetClipMinX)) {
				CreateLooseLaserA1(x,y,4,180 - ObjMove_GetAngle(obj),300,10,graphic,0); 
				PlaySFX(SFX_KIRA00);
				let effb = CreateShotA1(x,y,0,0,delsource,0); 
				ObjShot_SetDeleteFrame(effb,60);				
				bounce++;
				break;
			}
			
			if(((dir < -90 || 90 < dir) && x > GetClipMaxX)) {
				CreateLooseLaserA1(x,y,4,180 - ObjMove_GetAngle(obj),300,10,graphic,0); 
				PlaySFX(SFX_KIRA00);
				let effb = CreateShotA1(x,y,0,0,delsource,0); 
				ObjShot_SetDeleteFrame(effb,60);				
				bounce++;
				break;
			}
		}	
		yield;
	}
}

task scriptEnding {
	if(GetAreaCommonData("game","fightIku",false) || GetAreaCommonData("game","menuFlow",0) == 4) { 
		while(ObjEnemy_GetInfo(bossObj,INFO_LIFE) > 0) { 
			yield;
		}	
	}
	ObjEnemy_SetLife(bossObj,-1);
	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	Obj_Delete(bossObj);			
	CloseScript(GetOwnScriptID());
}
 