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

let unknownObj = ObjPrim_Create(OBJ_SPRITE_2D);
let unknownAlpha = 255;	
let nueUnknown = false;

let glowy = "script/thdcs/system/effects/glowymirror.png";
let cutKoga = "script/thdcs/system/face/kogasanorm.png";
let cutNue = "script/thdcs/system/face/nuenorm.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("bossBgType",21);
	SetCommonData("bossCircleType",0);
	SetCommonData("bossAttackType",2);
	renderBoss(23);
	renderBoss2(24);
	bossMagicCircle2;
	if(GetAreaCommonData("system","gameLang",0) == 0) { SetCommonData("cardName","|| uI.F.Gv"); } 
	if(GetAreaCommonData("system","gameLang",0) == 1) { SetCommonData("cardName","Scary uI.F.Gv"); } 	

	setInvulnerableTime(bossObj,120);
	
	setAura(bossObj,255,64,64);
	setAura(boss2Obj,64,64,255);
	
	ObjMove_SetPosition(bossObj,bossX,bossY);
	ObjMove_SetPosition(boss2Obj,GetCommonData("boss2X",boss2X),GetCommonData("boss2Y",boss2Y));
	
	cutin(NAZRIN,cutKoga,0,0,1024,1024,0.4);
	cutin2(DUET1,0,cutNue,0,0,1024,1024,0.4);
	
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { } 

task mainTask { 
	yield;
	scriptEnding;	
	kogasaMovement; 
	nueMovement;
} 

// Kogasa
task kogasaMovement { 
	ObjMove_SetDestAtWeight(boss2Obj,GetCenterX,GetCenterY-64,6,15);
	wait(60);
	while(!nueUnknown) { 
		kogasaFire;
		ObjMove_RandomPosWeight(boss2Obj,rand_int(15,25),rand_int(15,25),10,30,GetClipMinX+100,GetClipMinY+64,GetClipMaxX-100,GetCenterY-16);
		wait(60);
	}
}

// Nue
task nueMovement {
	let dir = 0;
	let r = 1;
	ObjMove_SetDestAtWeight(bossObj,GetCenterX,GetCenterY-128,6,15);
	wait(60);
	bossAttack = 1;
	nueFire;
	nueBowShot;	
	wait(240);
	bossAttack = 0;
	ObjMove_SetDestAtSpeed(boss2Obj,ObjMove_GetX(bossObj),ObjMove_GetY(bossObj),5);
	exploEffect(GetCenterX,GetCenterY-120,5,5.2);
	PlaySFX(SFX_CH02);	
	PlaySFX(SFX_FAULT);	
	wait(10);	
	ObjRender_SetAlpha(bossObj,0);
	ObjRender_SetAlpha(boss2Obj,0);
	unknownAlpha = 255;
	nueUnknown = true;
	loop(72) {
		ObjMove_SetPosition(bossObj,GetCenterX+r*cos(dir),GetCenterY-128-r+25*sin(dir));
		ObjMove_SetPosition(boss2Obj,GetCenterX+r*cos(dir),GetCenterY-128-r+25*sin(dir));
		r+=2;
		dir+=8;
		yield;
	}	
	while(!Obj_IsDeleted(bossObj)) {
		ObjMove_SetPosition(bossObj,GetClipMaxX+48,GetClipMinY-48);
		ObjMove_SetDestAtSpeed(bossObj,GetClipMinX-48,GetClipMaxY+48,8);
		ObjMove_SetPosition(boss2Obj,GetClipMaxX+48,GetClipMinY-48);
		ObjMove_SetDestAtSpeed(boss2Obj,GetClipMinX-48,GetClipMaxY+48,8);		
		nueFire2;
		wait(60);
		ObjMove_SetPosition(bossObj,GetClipMinX-48,GetClipMinY-48);			
		ObjMove_SetDestAtSpeed(bossObj,GetClipMaxX+48,GetClipMaxY+48,8);
		ObjMove_SetPosition(boss2Obj,GetClipMinX-48,GetClipMinY-48);			
		ObjMove_SetDestAtSpeed(boss2Obj,GetClipMaxX+48,GetClipMaxY+48,8);		
		nueFire2;				
		wait(60);
		ObjMove_SetPosition(bossObj,GetClipMaxX+48,GetClipMinY-48);
		ObjMove_SetPosition(boss2Obj,GetClipMaxX+48,GetClipMinY-48);		
		wait(30);
		ObjMove_SetDestAtWeight(bossObj,GetCenterX+rand_int(-128,128),100,6,15);
		ObjMove_SetDestAtWeight(boss2Obj,GetCenterX+rand_int(-64,64),GetCenterY-64,6,15);
		wait(30);
		ObjRender_SetAlpha(bossObj,255);
		ObjRender_SetAlpha(boss2Obj,255);
		nueUnknown = false;
		PlaySFX(SFX_POWER1);			
		exploEffect(GetCenterX,GetCenterY-120,5,5.2);		
		unknownAlpha = 0;	
		kogasaMovement;		
		wait(5);
		bossAttack = 1;	
		nueFire;
		nueBowShot;	
		wait(240);
		bossAttack = 0;
		exploEffect(GetCenterX,GetCenterY-120,5,5.2);		
		PlaySFX(SFX_CH02);	
		PlaySFX(SFX_FAULT);	
		wait(10);		
		ObjRender_SetAlpha(bossObj,0);
		ObjRender_SetAlpha(boss2Obj,0);
		unknownAlpha = 255;
		nueUnknown = true;
		r = 1; dir = 0;
		loop(72) {
			ObjMove_SetPosition(bossObj,GetCenterX+r*cos(dir),GetCenterY-128-r+25*sin(dir));
			ObjMove_SetPosition(boss2Obj,GetCenterX+r*cos(dir),GetCenterY-128-r+25*sin(dir));
			r+=2;
			dir+=8;
			yield;
		}
	}
}

// Nue bow shot initial
function nueFire {
	let dir = 270;
	ascent(i in 0..36) { 
		PlaySFX(SFX_LAZER01);
		CreateLooseLaserA1(bossX+48*cos(dir),bossY+48*sin(dir),6,dir,100,8,6,5);
		dir = rand_int(210,330);
		wait(2);
	}
}

// Nue bow shot 2
task nueBowShot {
	let dir = 90;
	ascent(p in 0..2) { 
		ascent(i in 0..10) { 
			let bowArrow00 = CreateLooseLaserA1(GetClipMinX+8+(i*18),GetClipMinY-64,6,dir,190,8,6,5);
			ObjShot_SetAutoDelete(bowArrow00,false);
			bowArrowHandle(bowArrow00,dir);
			dir-=4;
			wait(2);
		}
		wait(45);
		dir = 90;
		ascent(i in 0..10) { 
			let bowArrow01 = CreateLooseLaserA1(GetClipMaxX-8-(i*18),GetClipMinY-64,6,dir,190,8,6,5);
			ObjShot_SetAutoDelete(bowArrow01,false);
			bowArrowHandle(bowArrow01,dir);
			dir+=4;
			wait(2);
		}	
		wait(45);
		dir = 90;		
	}
}

// Bow shot handler
task bowArrowHandle(obj,dir) {
	wait(45);
	PlaySFX(SFX_LAZER01);
	ascent(i in 0..4) { 
		CreateShotA1(ObjMove_GetX(obj)+1*cos(dir),ObjMove_GetY(obj)+1*sin(dir)-(i*24),rand(1,2),dir+rand_int(-3,3),67,10);
	}
	Obj_Delete(obj);
}

// Nue amulets
function nueFire2 { 
	wait(5);
	ascent(i in 0..5) { 
		PlaySFX(SFX_TAN01);
		ascent(j in 0..4) { 
			CreateShotA1(bossX,bossY,2+(j/4),GetAngleToPlayer(bossObj),96,5);
		}
		wait(10);
	}
}

// Kogasa shot
function kogasaFire {
	let dir = 270;
	boss2Attack = 1;
	ascent(i in 0..36) {
		PlaySFX(SFX_TAN00);
		CreateShotA2(boss2X+32*cos(dir),boss2Y+32*sin(dir),4,dir,-0.08,2,185,10);
		CreateShotA2(boss2X+32*cos(dir),boss2Y+32*sin(dir),4,dir+25,-0.08,2,185,10);
		CreateShotA2(boss2X+32*cos(dir),boss2Y+32*sin(dir),4,dir+50,-0.08,2,185,10);
		dir-=16;
		wait(2);
	}
	boss2Attack = 0;	
} 

// glowy mirror
task unknownBall(x,y) {
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	
	let partc = 0;
	let parts = 0;
	let partspin = 0;
	
	ObjPrim_SetTexture(unknownObj,glowy);
	ObjRender_SetBlendType(unknownObj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(unknownObj,unknownAlpha);
	Obj_SetRenderPriorityI(unknownObj,30);
	ObjRender_SetPosition(unknownObj,x,y,0);
	ObjRender_SetScaleXYZ(unknownObj,parts,parts,0);
	ObjSprite2D_SetSourceRect(unknownObj,0,0,128,128);
	ObjSprite2D_SetDestCenter(unknownObj);
	
	ObjPrim_SetTexture(obj2,glowy);
	ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj2,unknownAlpha);
	Obj_SetRenderPriorityI(obj2,30);
	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,255);
	
	while(! Obj_IsDeleted(unknownObj)) {
		
		if(nueUnknown) { 
			ObjRender_SetPosition(unknownObj,ObjRender_GetX(bossObj),ObjRender_GetY(bossObj),0); 
			ObjRender_SetPosition(obj2,ObjRender_GetX(bossObj),ObjRender_GetY(bossObj),0); 
		}
		if(!nueUnknown) { 
			ObjRender_SetPosition(obj2,ObjRender_GetX(unknownObj),ObjRender_GetY(unknownObj),0);
		}
		ObjRender_SetAlpha(unknownObj,unknownAlpha);
		ObjRender_SetAlpha(obj2,unknownAlpha);		
		ObjRender_SetScaleXYZ(unknownObj,0.5,0.5,0);
		ObjRender_SetAngleZ(unknownObj,partspin);
		ObjRender_SetScaleXYZ(obj2,parts,parts,0);
		ObjRender_SetAngleZ(obj2,-partspin);
		
		partspin+=20;
		parts = rand(0.9,1.1);
		yield;
	}
}


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

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

	CloseScript(GetOwnScriptID());
}
 