script_enemy_main {
	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.txt"
	#include_function ".\e_functions.txt"

	SpellID=17;

	let frame = 0;
	let shottimer=1;
	let x=0;
	let y=0;
	let i=0;
	let i2=0;
	let i3=0;
	let i4=0;
	let angle=0;
	let attacks=1;
	let xshift=0;
	let yshift=0;
	let side=130;
	let vside=90;

	let BGscrollx=0;
	let BGscrolly=0;
	let BGscrollx2=0;
	let BGscrolly2=0;
	let BGscrollx3=0;
	let BGscrolly3=0;
	let bgrot=0;


	let yoffset=200;
	let ymin=-50;

    @Initialize {
	SetCommonData("BGInit",0);
	StartFunctions(1,0,0);
	Randomize;
        SetLife(4000);
        SetTimer2(45);
	SetBG(1);
	SetInvincibility(60);
	SetDamageRate(100,100);
	MagicCircle(false);
	SetEnemyMarker(true);

	EnderInit;
	shotinit;

	CutIn2(0,"Deathbringer [Vorpal Blade]");
	SpellCircle2(0,1,4,170);

	MainTask;
    }

function Wait(frames){loop(frames){yield;}}

task MainTask{
	SetMovePosition03(GetCenterX,180,25,10);
	Wait(60);
	DelayBombTask;
	NewChargeShrink(150,8,0.5,255,200,100);
	NewChargeShrink(150,8,0.5,255,100,100);
	NewChargeShrink(150,8,0.5,255,255,255);
	Wait(40);
	let angle=0;
	let loops=0;
	loop{
		angle=prand(0,360);
		SE("shot1");
		SE("shot3");
		CreateLaser(30,0  +RandDir*90+angle,300,PURPLE54,PURPLE56,90);
		CreateLaser(30,45 +RandDir*90+angle,300,RED54,RED56,90);
		CreateLaser(30,90 +RandDir*90+angle,300,PURPLE54,PURPLE56,90);
		CreateLaser(30,135+RandDir*90+angle,300,RED54,RED56,90);
		Move(loops);
		loops++;
		Wait(90);
		SE("slash");
		Wait(10);
		loop(3){
			CreateExplosionEX(3,GetX,GetY+yoffset,1,[255,100,100],prand(0.15,0.35),prand(60,100));
			CreateExplosionEX(3,GetX,GetY+yoffset,1,[255,100,255],prand(0.15,0.35),prand(60,100));
			Wait(2);
		}
		Wait(50-6);
		NewChargeShrink(110,8,0.5,255,200,100);
		NewChargeShrink(110,8,0.5,255,100,100);
		NewChargeShrink(110,8,0.5,255,255,255);
		Wait(20);
		if(GetPlayerY<ymin+yoffset){	//punish the puny mortals who try to cheap out the move
			BringDeath;
		}
	}
}

task BringDeath{
	loop(20){
		CreateShot01(GetX,upper(GetY,-10),prand(1,3),GetAngleToPlayer+prand(-40,40),RED32,0);
		yield;
	}
}
    @MainLoop {
	EnderDrawLogic;
        SetCollisionA(GetX, GetY, 35);
	SetCollisionB(GetX, GetY, 25);

	yield;
}


	let EnderFrame=0;

	let aurarot=0;
	let aurascale=0;
	let scaler=prand(1.7,1.9);

    @DrawLoop {
	EnderDrawLoop;
}

    @Finalize {
	EndingFunc(1);
	EnderFinalize;
	PointItems(GetX,GetY,1,1);
    }

function Move(target){
	if(target==0){
		SetMovePosition03(GetCenterX,0,25,10);
	}else{
		SetMovePosition03(GetPlayerX,upper(GetPlayerY-yoffset,ymin),25,10);
	}
}
task CreateLaser(v,angle,offset,g1,g2,delay){

    let x=GetX;
    let y=GetY+yoffset;

    Indicator(x,y,angle,offset,delay,((offset/v)*2),WHITE01);
    Wait(delay);

    x=GetX;
    y=GetY+yoffset;

    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,140,120,WHITE56,((offset/v)*2)-6,6,false);
    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,180,90,YELLOW56,((offset/v)*2)-6,6,false);
    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,200,50,g2,((offset/v)*2)-6,6,true);

    let obj = Obj_Create(OBJ_LASER);
    let stimer=0;
    let shots=0;
    let length=0;


    // initial settings
    Obj_SetPosition   (obj, x-cos(angle)*offset,y-sin(angle)*offset);
    Obj_SetSpeed      (obj, 0);
    ObjShot_SetGraphic(obj, g1);
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAngle(obj, angle);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,0);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);

    while((stimer<(offset/v)*2)&&!Obj_BeDeleted(obj)){
	RandomWidth(obj,1);
	length+=v;
	ObjLaser_SetLength(obj,length);
//	Obj_SetX(obj,Obj_GetX(obj)-xchange);
	FadeShot(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),3,angle,prand(0,360),0);
	FadeShot(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),2,angle,prand(0,360),0);

	if(stimer%2==0){
		CreateShot02(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),0,angle+prand(30,150),0.01,1,g2,0);
		CreateShot02(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),0,angle-prand(30,150),0.01,1,g2,0);
	}

	stimer++;
	yield;
    }
    Obj_SetCollisionToPlayer(obj,false);
    let w=1;
    loop(60){
	RandomWidth(obj,w);
	w-=1/60;
	yield;
    }
    Obj_Delete(obj);

}

task NoDeleteLaser(x,y,v,angle,l,w,g,timer,fade,interact){

    let obj = Obj_Create(OBJ_LASER);
    let stimer=0;
    let curlen=0;
    let state=0;
    let difference=0;

    // initial settings
    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, 0);
    ObjShot_SetGraphic(obj, g);
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAngle(obj, angle);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,0);
    ObjLaser_SetWidth(obj,w);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);
    Obj_SetCollisionToPlayer(obj,interact);

    while(stimer<timer+fade&&!Obj_BeDeleted(obj)){
	if(stimer>=timer){
		Obj_SetCollisionToPlayer(obj,false);
		Obj_SetAlpha(obj,(1-(stimer-timer)/fade)*255);
	}
	if(state==0){
		curlen+=v;
		if(curlen>=l){
			state=1;
			difference=curlen-l;
			x+=cos(angle)*difference;
			y+=sin(angle)*difference;
			Obj_SetPosition(obj,x,y);
			curlen=l;
		}
		ObjLaser_SetLength(obj,curlen);
	}else{
		x+=cos(angle)*v;
		y+=sin(angle)*v;
		Obj_SetPosition(obj,x,y);
	}
	stimer++;
	yield;
    }
    Obj_Delete(obj);
}

task Indicator(x,y,angle,offset,delay1,delay2,g1){

    let obj = Obj_Create(OBJ_LASER);

    Obj_SetSpeed      (obj, 0);
    ObjShot_SetGraphic(obj, g1);
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAngle(obj, angle);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,offset*2);
    ObjLaser_SetWidth(obj,3);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);
    Obj_SetCollisionToPlayer(obj,false);

    loop(delay1){
	x=GetX;
	y=GetY+yoffset;
	Obj_SetPosition   (obj, x-cos(angle)*offset,y-sin(angle)*offset);
	if(!Obj_BeDeleted(obj)){yield;}
    }
    loop(delay2){if(!Obj_BeDeleted(obj)){yield;}}

    Obj_Delete(obj);

}

function RandomWidth(obj,mult){
	ObjLaser_SetWidth(obj,prand(20,40)*mult);

}


let cshot2=[WHITE50,RED50,ORANGE50,YELLOW50];

task FadeShot(x,y,v,a2,a,d){
    let obj = Obj_Create(OBJ_SHOT);

    v=v*(absolute(cos(a-a2)));

    // initial settings
    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, v);
    ObjShot_SetGraphic(obj, cshot2[prand_int(0,3)]);
    ObjShot_SetDelay  (obj, d);
    Obj_SetAngle(obj, a);
    ObjShot_SetBombResist(obj,true);
    Obj_SetAutoDelete(obj,false);
    ObjShot_FadeDelete(obj);
}

}