#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Last Word: Pierre"]
#Text["Last Word: Pierre"]
#System["script/thdcs/functions/function_system.txt"]

let objLeftWing = ObjPrim_Create(OBJ_SPRITE_2D);
let objRightWing = ObjPrim_Create(OBJ_SPRITE_2D);
let objLeftWingGlow = ObjPrim_Create(OBJ_SPRITE_2D);
let objRightWingGlow = ObjPrim_Create(OBJ_SPRITE_2D);

let wingAnimationType = 0;
let wingDrawLayer = 30;
let leftWingX = 60;
let rightWingX = 60;
let leftWingY = 0;
let rightWingY = 0;
let leftWingTilt = 0;
let rightWingTilt = 0;

let textureSwanWing = "script/thdcs/system/enm01/vleugel2.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(1);
	setAura(bossObj, 255, 64, 255);
	SetCommonData("bossAttackType", 2);
	SetCommonData("bossCircleType", 1);
	SetCommonData("bossBgType", 1);
	if(GetAreaCommonData("system", "gameLang", 0) == 0) { SetCommonData("cardName", "uPierrev"); }
	if(GetAreaCommonData("system", "gameLang", 0) == 1) { SetCommonData("cardName", " Pierre"); }
	setInvulnerableTime(bossObj, 240);

	ObjMove_SetDestAtSpeed(bossObj, 192, 120, 5);
	SetShotAutoDeleteClip(16, 16, 16, 16);
	
	SetAutoDeleteObject(true);
	mainTask;
} 

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

@MainLoop { yield; } 
@Finalize { }  

task mainTask {
	yield;
	initializeForBattle();
	scriptEnding;
}

task initializeForBattle() {
    wait(80);
    PlaySFX(SFX_POWER0);
	concenEffect(bossObj,90, 1, 255, 64, 128);
	concenEffect(bossObj,90, 1, 255, 0, 64);
	concenEffect(bossObj,60, 2, 255, 255, 255);
    quakeCam2D(5, 90);
    wait(60);
    PlaySFX(SFX_BOON01);
    fabulousAura();
    featherDrops();
    featherDrops2();
    summonWings();
    bossAttack = 0;
    wait(90);

    wingDrawLayer = 31;

    wingAnimationType = 1;
    setWingAngle("LEFT", -70);
    setWingAngle("RIGHT", -70);
}

task fabulousAura() {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let frameCounter = 0;
	let imageScale = 1;

	ObjPrim_SetTexture(obj, imgBossBal);
	ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(obj, 29);
	ObjRender_SetPosition(obj, bossX, bossY, 0);
	ObjRender_SetAlpha(obj, 255);
	ObjMove_SetSpeed(obj, 0);
	ObjMove_SetAngle(obj, 0);
	ObjRender_SetScaleXYZ(obj, 1, 1, 0);
	ObjSprite2D_SetSourceRect(obj, 0, 0, 96, 128);
	ObjSprite2D_SetDestCenter(obj);

	while(!Obj_IsDeleted(obj)) {
		ObjRender_SetPosition(obj, bossX, bossY, 0);
		ObjRender_SetScaleXYZ(obj, imageScale, imageScale, 0);
		ObjRender_SetColor(obj, rand_int(32, 255), rand_int(32, 255), rand_int(32, 255));
		imageScale += (4 * sin(frameCounter) / 300);
		frameCounter += 5;
		yield;
	}
	Obj_Delete(obj);
}

task featherDrops {
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) {
		ascent(i in 0..2) {
			if(Obj_IsDeleted(bossObj)) { break; }
			dir += rand_int(0,359);
			featherDropHandler(bossX+rand_int(80,120)*cos(dir),bossY,rand_int(45,125),2,255,255,255);
			yield;
		}
		wait(30);
	}
}

task featherDrops2 {
	let dir = 0;
	while(!Obj_IsDeleted(bossObj)) {
		ascent(i in 0..12) {
			if(Obj_IsDeleted(bossObj)) { break; }
			dir += rand_int(0,359);
			featherDropHandler(bossX+rand_int(80,120)*cos(dir),bossY+25,rand_int(45,125),1,255,255,255);
			yield;
		}
		wait(15);
	}
}

task featherDropHandler(x,y,dir,type,red,green,blue) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let partc = 0;
	let parts = rand(1.0,1.4);
	let partspin = 0;
	let alphaValue = 55;
	let spritex = x;
	let spritey = y;
	let spindir = rand(1,2);
	let v = 0;

	if(type == 1) { ObjPrim_SetTexture(obj,circglit); v = 4; }
	if(type == 2) { ObjPrim_SetTexture(obj,veertje); v = 5; }
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,alphaValue);
	Obj_SetRenderPriorityI(obj,40);
	ObjRender_SetPosition(obj,x,y,0);
	ObjMove_SetAngle(obj,0);
	ObjRender_SetScaleXYZ(obj,parts,parts,0);
	ObjSprite2D_SetSourceRect(obj,0,0,64,64);
	ObjSprite2D_SetDestCenter(obj);

	featherAngleHandler(obj,x,y,v,dir);

	while(!Obj_IsDeleted(obj)) {
		ObjRender_SetColor(obj,red,green,blue);
		ObjRender_SetAlpha(obj,alphaValue);
		ObjRender_SetAngleZ(obj,partspin);
		ObjRender_SetScaleXYZ(obj,parts,parts,0);

		if(type == 1) {
			if(alphaValue < 155) { alphaValue+=10; }
			parts += ((125*sin(partc)/300) - 0.02);
			partc+=50;
			if(parts <= 0.4) { Obj_Delete(obj); }
		}
		if(type == 2) {
			if(alphaValue < 155) { alphaValue+=20; }
			if(spindir >= 1 && spindir <= 1.5) { partspin+=5; }
			if(spindir < 2 && spindir > 1.5) { partspin-=5; }
			parts -= 0.01;
			if(parts <= 0) { Obj_Delete(obj); }
		}
		yield;
	}
	Obj_Delete(obj);
}

task featherAngleHandler(obj,x,y,v,dir) {
	let vx = v * cos(dir);
	let vy = v * sin(dir);

	while(! Obj_IsDeleted(obj)) {
		ObjRender_SetPosition(obj,x,y,0);
		vx = v * cos(dir);
		vy = v * sin(dir);

		yield;
		x += vx/3;
		y += vy/3;
	}
	Obj_Delete(obj);
}

task setWingAngle(side, desiredAngle) {
    let isDesiredAngle = false;
    let obj;
    let objGlow;

    if(side == "LEFT") {
        obj = objLeftWing;
        objGlow = objLeftWingGlow;

        while(!isDesiredAngle) {
            if(leftWingTilt > desiredAngle) { leftWingTilt -= 2; }
            if(leftWingTilt < desiredAngle) { leftWingTilt += 2; }
            if(leftWingTilt == desiredAngle) { isDesiredAngle = true; }

            ObjRender_SetAngleZ(obj, leftWingTilt);
            ObjRender_SetAngleZ(objGlow, leftWingTilt);
            yield;
        }
    }
    if(side == "RIGHT") {
        obj = objRightWing;
        objGlow = objRightWingGlow;

        while(!isDesiredAngle) {
            if(rightWingTilt > desiredAngle) { rightWingTilt -= 2; }
            if(rightWingTilt < desiredAngle) { rightWingTilt += 2; }
            if(rightWingTilt == desiredAngle) { isDesiredAngle = true; }

            ObjRender_SetAngleZ(obj, rightWingTilt);
            ObjRender_SetAngleZ(objGlow, rightWingTilt);
            yield;
        }
    }
}

task summonWings() {
	let wingAlpha = 240;
	let wingTilt = 0;
	let wingScale = 0.7;
	let wingFrame = 0;
	let frameCounter = 0;

	// wings
	ObjPrim_SetTexture(objLeftWing,textureSwanWing);
	ObjRender_SetBlendType(objLeftWing,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(objLeftWing,30);
	ObjRender_SetPosition(objLeftWing,bossX,bossY,0);
	ObjRender_SetAlpha(objLeftWing,240);
	ObjMove_SetSpeed(objLeftWing,0);
	ObjMove_SetAngle(objLeftWing,0);
	ObjRender_SetScaleXYZ(objLeftWing,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(objLeftWing,0,0,500,250);
	ObjSprite2D_SetDestCenter(objLeftWing);
	ObjRender_SetAngleY(objLeftWing,180);
	ObjRender_SetAngleX(objLeftWing,180);

	ObjPrim_SetTexture(objRightWing,textureSwanWing);
	ObjRender_SetBlendType(objRightWing,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(objRightWing,30);
	ObjRender_SetPosition(objRightWing,bossX,bossY,0);
	ObjRender_SetAlpha(objRightWing,240);
	ObjMove_SetSpeed(objRightWing,0);
	ObjMove_SetAngle(objRightWing,0);
	ObjRender_SetScaleXYZ(objRightWing,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(objRightWing,0,0,500,250);
	ObjSprite2D_SetDestCenter(objRightWing);
	ObjRender_SetAngleX(objRightWing,180);

	// glowing wings
	ObjPrim_SetTexture(objLeftWingGlow,textureSwanWing);
	ObjRender_SetBlendType(objLeftWingGlow,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(objLeftWingGlow,30);
	ObjRender_SetPosition(objLeftWingGlow,bossX,bossY,0);
	ObjRender_SetAlpha(objLeftWingGlow,240);
	ObjMove_SetSpeed(objLeftWingGlow,0);
	ObjMove_SetAngle(objLeftWingGlow,0);
	ObjRender_SetScaleXYZ(objLeftWingGlow,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(objLeftWingGlow,0,0,500,250);
	ObjSprite2D_SetDestCenter(objLeftWingGlow);
	ObjRender_SetAngleY(objLeftWingGlow,180);
	ObjRender_SetAngleX(objLeftWingGlow,180);

	ObjPrim_SetTexture(objRightWingGlow,textureSwanWing);
	ObjRender_SetBlendType(objRightWingGlow,BLEND_ADD_ARGB);
	Obj_SetRenderPriorityI(objRightWingGlow,30);
	ObjRender_SetPosition(objRightWingGlow,bossX,bossY,0);
	ObjRender_SetAlpha(objRightWingGlow,240);
	ObjMove_SetSpeed(objRightWingGlow,0);
	ObjMove_SetAngle(objRightWingGlow,0);
	ObjRender_SetScaleXYZ(objRightWingGlow,0.7,0.7,0);
	ObjSprite2D_SetSourceRect(objRightWingGlow,0,0,500,250);
	ObjSprite2D_SetDestCenter(objRightWingGlow);
	ObjRender_SetAngleX(objRightWingGlow,180);

	while(!Obj_IsDeleted(objLeftWing)) {
        ObjRender_SetPosition(objLeftWing, bossX - leftWingX, bossY - leftWingY, 0);
        ObjRender_SetPosition(objRightWing, bossX + rightWingX, bossY - rightWingY, 0);
        ObjRender_SetPosition(objLeftWingGlow, bossX - leftWingX, bossY - leftWingY, 0);
        ObjRender_SetPosition(objRightWingGlow, bossX + rightWingX, bossY - rightWingY, 0);

		// idle anim
		if(wingAnimationType == 0) {
			if(wingAlpha < 240) { wingAlpha+=10; }
			if(leftWingX > 0) { leftWingX-=4; rightWingX-=4; }
			leftWingTilt += 120 * cos(wingFrame) / 180;
			rightWingTilt += 120 * cos(wingFrame) / 180;
			wingFrame+=2;
		}
		if(wingAnimationType == 1) {
            if(leftWingY < 50) {
                leftWingY += 5;
                rightWingY += 5;
            }
		}

		Obj_SetRenderPriorityI(objLeftWing,wingDrawLayer);
		Obj_SetRenderPriorityI(objRightWing,wingDrawLayer);
		Obj_SetRenderPriorityI(objLeftWingGlow,wingDrawLayer);
		Obj_SetRenderPriorityI(objRightWingGlow,wingDrawLayer);

		ObjRender_SetAngleZ(objLeftWing, leftWingTilt); ObjRender_SetAlpha(objLeftWing, wingAlpha);
		ObjRender_SetAngleZ(objRightWing, rightWingTilt); ObjRender_SetAlpha(objRightWing, wingAlpha);
		ObjRender_SetAngleZ(objLeftWingGlow, leftWingTilt); ObjRender_SetAlpha(objLeftWingGlow, wingAlpha);
		ObjRender_SetAngleZ(objRightWingGlow, rightWingTilt); ObjRender_SetAlpha(objRightWingGlow, wingAlpha);

		ObjRender_SetScaleXYZ(objLeftWingGlow,wingScale,wingScale,0);
		ObjRender_SetScaleXYZ(objRightWingGlow,wingScale,wingScale,0);

		ObjRender_SetColor(objLeftWingGlow,rand_int(32,255),rand_int(32,255),rand_int(32,255));
		ObjRender_SetColor(objRightWingGlow,rand_int(32,255),rand_int(32,255),rand_int(32,255));

		wingScale += (1*sin(frameCounter)/220);
		frameCounter+=5;

		yield;
	}
	Obj_Delete(objLeftWing); Obj_Delete(objRightWing); Obj_Delete(objLeftWingGlow); Obj_Delete(objRightWingGlow);
}

task scriptEnding {
	let allEnemyIDs = []; 
	while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0) {
		yield;
	}
	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	allEnemyIDs = GetAllEnemyID;
	ascent(i in 0..length(GetAllEnemyID)) {
		Obj_Delete(allEnemyIDs[i]);
	}
	Obj_Delete(bossObj);
	CloseScript(GetOwnScriptID());
}



