#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Dj non-spell 01 normal"]
#Text["Dj non-spell 01 normal"]

let globalObjectContainer = [];

let famTex = "script/thdcs/system/effects/fammer.png";
let lightTex = "script/thdcs/system/effects/circledj.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 {
	renderBoss(3);
	setAura(bossObj,64,255,128);
	SetCommonData("bossAttackType",1);
	SetCommonData("bossCircleType",0);
	setInvulnerableTime(bossObj,120);
	
	ObjMove_SetDestAtSpeed(bossObj,192,120,5);
	SetAutoDeleteObject(true);
	mainTask;
} 

@Event { 
	alternative(GetEventType()) 
	case(EV_REQUEST_LIFE) { 
		SetScriptResult(300);
	}
	case(EV_REQUEST_TIMER) { 
		SetScriptResult(58);
	}
} 

@MainLoop { yield; } 
@Finalize { } 


task mainTask { 
	yield;
	scriptEnding;	
	wait(120);
	movement; 
} 

// movement task
task movement { 
	let beginPosY = 0;
	while(!Obj_IsDeleted(bossObj)) { 
		bossAttack = 1;
		beginPosY = rand_int(GetClipMinY,40);
		ascent(i in 0..7) { 	
			if(!Obj_IsDeleted(bossObj)) { fam(GetEnemyX,GetEnemyY,beginPosY,0,i); }
			wait(3);
		}
		vuur;
		wait(45);
		ascent(i in 0..7) { 
			if(!Obj_IsDeleted(bossObj)) { fam(GetEnemyX,GetEnemyY,beginPosY,1,i); }
			wait(3);
		}
		vuur;
		wait(45);
		bossAttack = 0;
		ObjMove_RandomPosWeight(bossObj,rand(30,60),rand(30,60),15,30,200,150,250,200);
		wait(60);
	} 
}

// fire shot
function vuur { 
	let dir = 0;
    ascent(i in 0..20) {
        let djShot = CreateShotA(GetEnemyX+30*cos(dir),GetEnemyY+30*sin(dir),15);
        SetShotDataA(djShot,0,2.0,dir,0.4,0,0,32);
        let djShot2 = CreateShotA(GetEnemyX+30*cos(dir),GetEnemyY+30*sin(dir),15);
        SetShotDataA(djShot2,0,2.0,dir,-0.4,0,0,32);
        dir+=360/20;
    }
}

// fammer
task fam(x,y,begin,move,row) {
	let obj = ObjEnemy_Create(OBJ_ENEMY); 
	let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
	let spin = 0;
	let c = 0;
	let hitWall = false; 
	let ypos = begin + row * rand_int(66,70);

	ObjEnemy_Regist(obj);
	ObjPrim_SetTexture(obj,famTex); 
	ObjPrim_SetTexture(obj2,famTex); 
	ObjRender_SetAlpha(obj,205);
	ObjRender_SetAlpha(obj2,150);
	Obj_SetRenderPriorityI(obj,30);
	Obj_SetRenderPriorityI(obj2,31);
	ObjRender_SetScaleXYZ(obj,1,1,0);
	ObjRender_SetScaleXYZ(obj2,1,1,0);
	ObjSprite2D_SetSourceRect(obj,31,0,64,31); 
	ObjSprite2D_SetSourceRect(obj2,31,0,64,31); 
	ObjSprite2D_SetDestCenter(obj);
	ObjSprite2D_SetDestCenter(obj2);
	ObjRender_SetPosition(obj,x,y,0);	
	ObjMove_SetPosition(obj,x,y);
	
	Obj_SetValue(obj,"isFamiliar",true); 
	
	PlaySFX(SFX_OPTION);
	if(move == 0) {
		ObjMove_SetDestAtSpeed(obj,GetClipMinX-2,ypos,6);
	}
	if(move == 1) { 
		ObjMove_SetDestAtSpeed(obj,GetClipMaxX+2,ypos,6);
	}

	globalObjectContainer = globalObjectContainer ~ [obj];
	globalObjectContainer = globalObjectContainer ~ [obj2];

	while(!Obj_IsDeleted(obj)) { 
		ObjRender_SetPosition(obj2,ObjMove_GetX(obj),ObjMove_GetY(obj),0);		
		if(ObjMove_GetX(obj) <= GetClipMinX+4 && hitWall == false) { 
			hitWall = true; 
			PlaySFX(SFX_LAZER01); 
			famGlitter(obj);			
			//yield;
			famLightning(GetCenterX,ObjMove_GetY(obj),0);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),22,0,1200,15,6,45); 
		} 
		if(ObjMove_GetX(obj) >= GetClipMaxX-4 && hitWall == false) { 
			hitWall = true; 		
			PlaySFX(SFX_LAZER01); 
			famGlitter(obj);			
			//yield;
			famLightning(GetCenterX,ObjMove_GetY(obj),0);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),22,180,1200,15,6,45); 
		} 
		ObjRender_SetAngleZ(obj,-spin/4);	
		ObjRender_SetAngleZ(obj2,spin);	
		spin+=10;
		c++;
		if(c > 120) { Obj_Delete(obj); Obj_Delete(obj2); break; } 
		yield;
	}
	Obj_Delete(obj); Obj_Delete(obj2); Obj_DeleteValue(obj,"isFamiliar");
}

// glitter effect
task famGlitter(obj) { 
	let dir2 = 0;
	ascent(i in 0..8) {
		if(!Obj_IsDeleted(obj)) { 
			breakEffectGlitter(ObjMove_GetX(obj)+10*cos(dir2),ObjMove_GetY(obj)+10*sin(dir2),0.2,dir2,rand(0.5,2.0),255,5,255,5);  
			dir2+=360/8; 
		}
	}
}

// lightning effect 
task famLightning(x,y,dir) {
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	let snijl = 1024 / 2;
	let snijd = 4;
	let glide = 0;
	let c = 0;
	let alphaValue = 0;
	let snijswitch = 0;

	ObjPrim_SetTexture(obj,lightTex);	
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,alphaValue);
	Obj_SetRenderPriorityI(obj,30);	
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetAngleZ(obj,dir-90);
	
	ObjPrim_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj,4);

    globalObjectContainer = globalObjectContainer ~ [obj];

	while(! Obj_IsDeleted(obj)) {
		ObjPrim_SetVertexPosition(obj, 0, -snijd-rand_int(-8,8), -snijl,0);
		ObjPrim_SetVertexUVT(obj, 0, 22, 0+glide);
		ObjPrim_SetVertexPosition(obj, 1, snijd+rand_int(-8,8), -snijl,0);
		ObjPrim_SetVertexUVT(obj, 1, 36, 0+glide);
		ObjPrim_SetVertexPosition(obj, 2, -snijd-rand_int(-8,8), snijl,0);
		ObjPrim_SetVertexUVT(obj, 2, 22, 128+glide);
		ObjPrim_SetVertexPosition(obj, 3, snijd+rand_int(-8,8), snijl,0);
		ObjPrim_SetVertexUVT(obj, 3, 36, 128+glide);
		
		ObjRender_SetColor(obj,64,255,32);
		ObjRender_SetAlpha(obj,alphaValue);
		if(alphaValue < 240) { alphaValue+=10; } 
		glide-=5;
		
		c++;
		if(c == 90) { Obj_Delete(obj); break; } 
		yield;
	}
	Obj_Delete(obj);	
}

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

    ascent(i in 0..length(globalObjectContainer)) {
        Obj_Delete(globalObjectContainer[i]);
    }
	DeleteShotAll(TYPE_ALL, TYPE_ITEM);
	Obj_Delete(bossObj);

	CloseScript(GetOwnScriptID());
}
 