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

	SpellID=19;

	let frame = 0;

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

	EnderInit;
	shotinit;


	MainTask;
    }

let waitminus=20;

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

let visible=0;
task MainTask{
	CutIn2(0,"Legendary Spear [Nevella]");
	SpellCircle2(9,2,4,255);
	SetY(GetCenterY-50);
	SetX(GetCenterX);
	LastSpellEffect;
	visible=1;
	SetMovePosition03(GetCenterX,100,25,10);
	yield;
	DelayBombTask;
	NewCharge(120,25,0.5,255,150,150);
	NewCharge(130,20,0.5,255,200,150);
	NewCharge(140,15,0.5,255,255,150);
	NewCharge(150,10,0.5,200,255,150);
	Wait(60);


	Wait(40);
	let i=rand_int(0,8)*45;

	CreateLaser(GetCenterX-150,GetCenterY,27,90,300,100,0);
	CreateLaser(GetCenterX+150,GetCenterY,27,-90,300,100,0);

	Wait(100);
	MainTask2;
	MainTask3;
	let i=0;
	let delay;
	loop{
		CreateLaser(GetPlayerX,GetPlayerY,27,i,300,GetDelay,0);
		i+=45;
		Wait(GetDelay);
	}
}
task MainTask2{
	let skips=rand_int(0,3);
	let random;
	loop{
		if(skips>0){skips--;}else{
			random=rand_int(0,1)*180;
			if(rand_int(0,1)==0){
				CreateLaser(GetCenterX-80,GetCenterY,27,70+random,300,GetDelay,0);
			}else{
				CreateLaser(GetCenterX+80,GetCenterY,27,290+random,300,GetDelay,0);
			}

			Wait(GetDelay);
			skips=rand_int(0,2);
		}

		if(skips>0){skips--;}else{
			random=rand_int(0,1)*180;
			if(rand_int(0,1)==0){
				CreateLaser(GetCenterX-80,GetCenterY,27,290+random,300,GetDelay,0);
			}else{
				CreateLaser(GetCenterX+80,GetCenterY,27,70+random,300,GetDelay,0);
			}

			Wait(GetDelay);
			skips=rand_int(0,2);
		}

		if(skips>0){skips--;}else{
			random=rand_int(0,1)*180;
			if(rand_int(0,1)==0){
				CreateLaser(GetCenterX,GetCenterY,27,45+random,300,GetDelay,0);
			}else{
				CreateLaser(GetCenterX,GetCenterY,27,135+random,300,GetDelay,0);
			}

			Wait(GetDelay);
			skips=rand_int(0,2);
		}

		if(skips>0){skips--;}else{
			random=rand_int(0,1)*180;
			if(rand_int(0,1)==0){
				CreateLaser(GetCenterX,GetCenterY-180,27,0+random,300,GetDelay,0);
			}else{
				CreateLaser(GetCenterX,GetCenterY+180,27,180+random,300,GetDelay,0);
			}

			Wait(GetDelay);
			skips=rand_int(0,2);
		}

		if(skips>0){skips--;}else{
			random=rand_int(0,1)*180;
			if(rand_int(0,1)==0){
				CreateLaser(GetCenterX-150,GetCenterY,27,90+random,300,GetDelay,0);
			}else{
				CreateLaser(GetCenterX+150,GetCenterY,27,-90+random,300,GetDelay,0);
			}

			Wait(GetDelay);
			skips=rand_int(0,2);
		}

	}
}
task MainTask3{
	let random;
	loop{
		loop(20){
			random=rand(0,50)+30;
			CreateExplosionEX(rand_int(0,1)*3,rand(GetClipMinX,GetClipMaxX),rand(GetClipMinY,GetClipMaxY),rand(1,2),[random,random,30],rand(0.1,0.4),rand(20,120));
		}
		SE("slash");
		SE("shot2");
		SE("shot3");
		SE("laser4");
		ShakeScreen(9,40);
		Wait(GetDelay);
	}
}

function GetDelay{
	return lower(GetLife/4000,GetTimer2/60)*80+70;
}


    @MainLoop {
	EnderDrawLogic;
        SetCollisionA(GetX, GetY, 35);

	yield;
}


	let EnderFrame=0;

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

    @DrawLoop {
	if(visible==1){
		EnderDrawLoop;
	}
}
    @Finalize {
	EndingFunc(1);
	EnderFinalize;
	PointItems(GetX,GetY,1,2);
    }

task CreateLaser(x,y,v,angle,offset,delay,delay2){
	v*=0.9;
    let g1=SP02;
    let g2=REDI12;

    Wait(delay2);

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

//    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,200,50,SP01,((offset/v)*2)-6,6,false);
//    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,160,70,ORANGE56,((offset/v)*2)-6,6,true);

    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,160,70,YELLOW22,((offset/v)*2)-6,26,true, 0);
    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,180,30,YELLOW22,((offset/v)*2)-6,26,false, 20);
    NoDeleteLaser(x-cos(angle)*offset,y-sin(angle)*offset,v,angle,180,30,YELLOW22,((offset/v)*2)-6,26,false, -20);

    let obj = Obj_Create(OBJ_LASER);
    let obj2 = 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);
    Obj_SetCollisionToPlayer(obj,false);

    Obj_SetPosition   (obj2, x-cos(angle)*offset,y-sin(angle)*offset);
    Obj_SetSpeed      (obj2, 0);
    ObjShot_SetGraphic(obj2, WHITE01);
    ObjShot_SetDelay  (obj2, 0);
    Obj_SetAngle(obj2, angle);
    ObjShot_SetBombResist(obj2,true);
    ObjLaser_SetLength(obj2,0);
    ObjLaser_SetSource(obj2,false);
    Obj_SetAutoDelete(obj2,false);
    Obj_SetCollisionToPlayer(obj2,false);
//    Obj_SetAlpha(obj2,150);

    while((stimer<(offset/v)*2)&&!Obj_BeDeleted(obj)){
	RandomWidth(obj,1);
	RandomWidth(obj2,0.5);
	length+=v;
	ObjLaser_SetLength(obj,length);
	ObjLaser_SetLength(obj2,length);

	FadeShot(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),rand(3,5),angle,angle+180+rand(-20,20),rand_int(0,10));
	FadeShot(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),rand(0,2),angle,angle+180+rand(-20,20),rand_int(30,50));

	FireShot02(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),0,angle+90+180*(stimer%2),0.01,rand(0.5,0.5)*(trunc(stimer/2)%2+1),g2,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);
	RandomWidth(obj2,w/2);
	w-=1/60;
	yield;
    }
    Obj_Delete(obj);
    Obj_Delete(obj2);

}

let auracolors=[0,1,3,6];

task FireShot02(x,y,v,a,accel,maxspeed,g,d){
	Wait(d);
	let color=rand_int(0,3);
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,v);
	Obj_SetAngle(obj,a);
	//ObjShot_SetGraphic(obj,g);
	ObjShot_SetGraphic(obj,RED11+auracolors[color]);

	let obj2=Obj_Create(OBJ_LASER);
	Obj_SetAutoDelete(obj2,false);
	Obj_SetPosition(obj2,x,y);
	Obj_SetAngle(obj2,a);
	ObjShot_SetGraphic(obj2,RED50+auracolors[color]);
	Obj_SetCollisionToPlayer(obj2,false);
	ObjLaser_SetSource(obj2,false);
	Obj_SetAlpha(obj2,200);

	let frame=0;

	let xo=-cos(a);
	let yo=-sin(a);
	let scale;
	let alpha=0;
	while(!Obj_BeDeleted(obj)){
		if(alpha<1){
			alpha+=0.05;
			Obj_SetAlpha(obj,alpha*255);
		}
		if(frame%3==0){
			Obj_SetAlpha(obj2,rand_int(50,255));
		}
		scale=sin(frame*11)*3+30;
		ObjLaser_SetWidth(obj2,scale*0.8);
		ObjLaser_SetLength(obj2,scale);
		Obj_SetPosition(obj2,Obj_GetX(obj)+xo*scale*0.5,Obj_GetY(obj)+yo*scale*0.5);
		if(v<maxspeed){
			Obj_SetSpeed(obj,v);
			v+=accel;
			if(v>maxspeed){v=maxspeed;}
		}
		frame++;
		yield;
	}
	ObjShot_FadeDelete(obj2);
}

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

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

    x=x+cos(angle)*l;
    y=y+sin(angle)*l;
    x-=cos(anglediff+angle)*l;
    y-=sin(anglediff+angle)*l;

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

    while(stimer<timer+fade&&!Obj_BeDeleted(obj)){
	if(stimer>=timer){
		Obj_SetCollisionToPlayer(obj,false);
		Obj_SetAlpha(obj,(1-(stimer-timer)/fade)*220);
	}
	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 xo=cos(angle+90);
	let yo=sin(angle+90);
	let random;
	loop(delay1/6){
		random=rand(-15,15);
		Indicator2(x+xo*random,y+yo*random,angle,-xo*random,-yo*random,offset,delay2*2,g1);
		random=rand(-15,15);
		Indicator3(x+xo*random,y+yo*random,angle,-xo*random,-yo*random,offset,delay2*2,g1);
		Wait(6);
	}
}

task Indicator2(x,y,angle,xs,ys,offset,delay,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,5);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);
    Obj_SetCollisionToPlayer(obj,false);
    ObjShot_ToItem(obj,false);
    x-=cos(angle)*offset;
    y-=sin(angle)*offset;

    let alpha=255;
    loop(delay){
	Obj_SetPosition   (obj, x+ScreenShakeX,y+ScreenShakeY);
	x+=xs/delay*2;
	y+=ys/delay*2;
	Obj_SetAlpha(obj,alpha*0.75);
	alpha-=255/delay;
	yield;
    }

    Obj_Delete(obj);

}

task Indicator3(x,y,angle,xs,ys,offset,delay,g1){

    let obj = Obj_Create(OBJ_LASER);

    let newangle=10*RandDir+angle;

    x=x+cos(angle)*offset*0.5;
    y=y+sin(angle)*offset*0.5;
    x-=cos(newangle)*offset*0.5;
    y-=sin(newangle)*offset*0.5;


    Obj_SetSpeed      (obj, 0);
    ObjShot_SetGraphic(obj, g1);
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAngle(obj, newangle);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,offset*0.5);
    ObjLaser_SetWidth(obj,8);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);
    Obj_SetCollisionToPlayer(obj,false);
    ObjShot_ToItem(obj,false);

    let cosa=cos(angle);
    let sina=sin(angle);

    x-=cos(angle)*offset;
    y-=sin(angle)*offset;

    let alpha=255;
    loop(delay){
	Obj_SetPosition   (obj, x+ScreenShakeX,y+ScreenShakeY);
//	x+=xs/delay*2;
//	y+=ys/delay*2;
	x+=cosa*(offset*2)/delay;
	y+=sina*(offset*2)/delay;
	Obj_SetAlpha(obj,alpha*0.75);
	alpha-=255/delay;
	yield;
    }

    Obj_Delete(obj);

}

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

}


let cshot2=[WHITE50,RED50,ORANGE50,GREEN50,PURPLE50];

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,4)]);
    Obj_SetAngle(obj, a);
    ObjShot_SetBombResist(obj,true);
    Obj_SetAutoDelete(obj,false);
    ObjShot_ToItem(obj,false);
    Obj_SetCollisionToPlayer(obj,false);
    Wait(d);
    ObjShot_FadeDelete(obj);
}

}