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

	SpellID=49;

	let i=0;
	let frame=0;
	let position=-1;
	let moving=1;

    @Initialize {
	StartFunctions(1,0,0);
	Randomize;
        SetLife(5000);
        SetTimer2(50);
	SetDamageRate(100,100);
	SetBG(3);
	MagicCircle(false);
	SetEnemyMarker(true);
	OverInit;
	SetInvincibility(120);
	SpellCircle2(9,2,10,200);

	shotinit;

	CutIn2(2,"Energy [High-Power Circuit]");

	MainTask;
	HandleShots(10);
    }


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

	let armangle=0;
	let visible=0;

task MainTask{
	SetX(GetCenterX);
	SetY(GetCenterY);
	if(GetPlayerY<300){
		SetPlayerY(400);
	}
	LastSpellEffect;
	visible=1;
	DelayBombTask;
	let i=0;
	let angle=0;
	Wait(100);
	MainTask2;
	loop{
		LaserGrid(GetCenterX,GetCenterY,angle,15,90,4,60,220);
		angle+=rand(20,55);
		Wait(160);
	}
}

task MainTask2{
	let shots=[WHITE52,AQUA52,BLUE52];
	let angle=0;
	let k=0;
	loop{
		angle=rand(0,360);
		k=0;
		loop(4){
			MainShot(GetX,GetY,0.7,angle+k,-0.3,shots[rand_int(0,2)]);
			k+=90;
		}
		Wait(6);
	}
}

task MainShot(x,y,v,a,orbitspeed,g){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,0);
	ObjShot_SetGraphic(obj,g);
	let offset=0;
	let displayangle=rand(0,360);
	let angvel=rand(-4,4);
	while(!Obj_BeDeleted(obj)){
		Obj_SetAngle(obj,displayangle);
		displayangle+=angvel;
		Obj_SetPosition(obj,x+cos(a)*offset,y+sin(a)*offset);
		offset+=v;
		a+=orbitspeed;
		yield;
	}
	
}


task LaserGrid(x,y,angle,width,spacing,number,delay,time){
	let basex;
	let basey;
	let k=0;
	loop(number){
		LaserGrid2(x+cos(angle+90)*spacing*k,y+sin(angle+90)*spacing*k,angle,width,spacing,delay,time);
		if(k>0){
			LaserGrid2(x+cos(angle-90)*spacing*k,y+sin(angle-90)*spacing*k,angle+rand(-5,5),width,spacing,delay,time);
		}
		Wait(6);
		k++;
	}
}
task LaserGrid2(x,y,angle,width,spacing,delay,time){
	let length=600;
	let obj=Obj_Create(OBJ_LASER);
	Obj_SetPosition(obj,x-cos(angle)*length*0.5,y-sin(angle)*length*0.5);
	Obj_SetAngle(obj,angle);
	Obj_SetAutoDelete(obj,false);
	ObjLaser_SetLength(obj,length);
	ObjLaser_SetSource(obj,false);
	Obj_SetCollisionToPlayer(obj,false);

	let obj2=Obj_Create(OBJ_LASER);	//invisible laser for the hitbox
	Obj_SetPosition(obj2,x-cos(angle)*length*0.5,y-sin(angle)*length*0.5);
	Obj_SetAngle(obj2,angle);
	Obj_SetAutoDelete(obj2,false);
	ObjShot_SetGraphic(obj2,SP00);
	ObjLaser_SetLength(obj2,length);
	ObjLaser_SetWidth(obj2,width*0.8);
	ObjLaser_SetSource(obj2,false);
	Obj_SetCollisionToPlayer(obj2,false);

	let frame=0;
	loop(delay){
		HandleLaser(obj,5,frame);
		frame++;
		yield;
	}
	let widthadd=(width-5)/5;
	width=5;
	loop(5){
		width+=widthadd;
		HandleLaser(obj,width,frame);
		frame++;
		yield;
	}
	let var=YOnLineFromX(x,y,x+cos(angle),y+sin(angle),GetClipMinX,-100);

	if(center(GetClipMinY-10,var,GetClipMaxY+10)==var){
		LaserEnd(obj2,GetClipMinX,var);
	}
	var=YOnLineFromX(x,y,x+cos(angle),y+sin(angle),GetClipMaxX, -100);

	if(center(GetClipMinY-10,var,GetClipMaxY+10)==var){
		LaserEnd(obj2,GetClipMaxX,var);
	}

	var=XOnLineFromY(x,y,x+cos(angle),y+sin(angle),GetClipMinY, -100);

	if(center(GetClipMinX-10,var,GetClipMaxX+10)==var){
		LaserEnd(obj2,var,GetClipMinY);
	}
	var=XOnLineFromY(x,y,x+cos(angle),y+sin(angle),GetClipMaxY, -100);

	if(center(GetClipMinX-10,var,GetClipMaxX+10)==var){
		LaserEnd(obj2,var,GetClipMaxY);
	}


	SE("laser3");
	Obj_SetCollisionToPlayer(obj2,true);
	ObjLaser_SetWidth(obj,width);
	loop(time-6){
		HandleLaser(obj,width,frame);
		frame++;
		yield;
	}
	Obj_Delete(obj2);
	loop(6){
		HandleLaser(obj,width,frame);
		frame++;
		yield;
	}
	widthadd=width/30;
	loop(30){
		width-=widthadd;
		HandleLaser(obj,width,frame);
		frame++;
		yield;
	}
	Obj_Delete(obj);
}
function HandleLaser(obj,width,frame){
	ObjLaser_SetWidth(obj,width*rand(0.3,1.2));
	if(frame%2==0){
		ObjShot_SetGraphic(obj,RED60+(frame/2)%4);
	}
}

task LaserEnd(objfollow,x,y){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,0);
	ObjShot_SetGraphic(obj,SP04);
	while(!Obj_BeDeleted(objfollow)){
		yield;
	}
	ObjShot_FadeDelete(obj);
}

    let speed=1.8;
    let framef=0;

    @MainLoop {
        SetCollisionA(GetX, GetY, 80);
	if(visible==1){
		SetCollisionB(GetX, GetY, 20);
	}

	OverloadDrawLogic;
	yield;
}
    @DrawLoop {
	if(visible==1){
		OverloadDrawLoop;
	}
}

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

task NormalShotDelay(x,y,v,a,g,d,d2,vulnerability){
	DelayEffect(x,y,g,d);
	Wait(d-d2);
	NormalShot(x,y,v,a,g,vulnerability);
}
}