script_enemy_main {
    let GCSD=GetCurrentScriptDirectory;
    #include_function ".\..\ShotSheet\shot_replace.dnh"
    #include_function ".\..\functions.txt"
    #include_function ".\patchy_functions.txt"

    SpellID=513;

    @Initialize {
        SetLife(4000);
        SetTimer2(60);
	SetDamageRate(80,40);
	MagicCircle(false);
	SetEnemyMarker(true);
	PatchyInit;
	MainTask;
	shotinit;

	CutIn2(7,"Wood and Metal [Alchemic Reaction]");
	SpellCircle2(6,1,4,200);
	SetBG(21);
    }

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

task MainTask{
	DelayBombTask;
	let obj=PatchyElement(2,GetCenterX-60,150,20,7, 170,120);
	let obj=PatchyElement(3,GetCenterX+60,150,20,7, 170,120);

	SetMovePositionNew(GetCenterX,150,60);
	Wait(70);
	MainTask2;
	let angle=45;
	let v=1.5;
	let color=0;
	let sounds=false;
	loop{
		sounds=false;
		loop(4){
			Laser(GetX,GetY,angle+90,cos(angle)*v,sin(angle)*v,0,v*2,color%3,sounds);
			sounds=true;
			angle+=90;
		}
		angle=rand(0,360);
		color++;
		Wait(210);
	}
}

task MainTask2{
	Wait(200);
	let angle=0;
	let k=0;
	loop{
		loop(2){
			CreateExplosionEX(3,GetX,GetY,1,[200,200,200],rand(0.1,0.2),50);
		}
		k=0;
		loop(2){
			MainShot(GetX,GetY,2,2,angle+k+45, 5,3,true);
			MainShot(GetX,GetY,2,2,angle+k+45, 5,-3,false);
			MainShot(GetX,GetY,3,1.5,angle+k-45, 4,5,true);
			MainShot(GetX,GetY,3,1.5,angle+k-45, 4,-5,false);
			k+=180;
		}
		if(angle%90!=0){
			loop(2){
				MainShot(GetX,GetY,2,2,-angle+k+45, 5,3,true);
				MainShot(GetX,GetY,2,2,-angle+k+45, 5,-3,false);
				MainShot(GetX,GetY,3,1,-angle+k-45, 4,5,true);
				MainShot(GetX,GetY,3,1,-angle+k-45, 4,-5,false);
				k+=180;
			}
		}
		angle+=(90/4);
		loop(5){
			SE("shot1");
			Wait(3);
		}
		Wait(40);
	}
}
//let colors=[RED12,WHITE12,GREEN12,WHITE12];
let colors=[0,7,5,7];

task MainShot(x,y,v1,v2,a, num,spacing,firstshot){
	if(num>0){
		MainShot(x,y,v1,v2,a, num-1,spacing,firstshot)
	}
	if(firstshot||num!=0){
		Wait(absolute(spacing*num));
		x+=cos(a+90)*spacing*v2*num;
		y+=sin(a+90)*spacing*v2*num;
		let obj=Obj_Create(OBJ_SHOT);
		Obj_SetPosition(obj,x,y);
		Obj_SetAngle(obj,a);
		let frame=0;
		let vadd=(v2-v1)/50;

		let obj2=Obj_Create(OBJ_SHOT);
		Obj_SetPosition(obj2,x,y);
		Obj_SetAngle(obj2,a);
		LinkShot(obj,obj2);
		ObjShot_SetGraphic(obj2,WHITE01);

		let alpha=0;
		let alphaadd=1;

		while(!Obj_BeDeleted(obj)){
			alpha+=alphaadd/20;
			if(alpha>=1){alphaadd=-1;}
			if(alpha<=0){alphaadd=1;}
			Obj_SetAlpha(obj,lower(alpha*512,255));
			Obj_SetAlpha(obj2,lower(300-alpha*300,255));
			if(frame<50){
				v1+=vadd;
				Obj_SetSpeed(obj,v1);
				Obj_SetSpeed(obj2,v1);
			}
			if(frame%6==0){
				ObjShot_SetGraphic(obj,colors[frame/6%4]+RED56);
				ObjShot_SetGraphic(obj2,colors[frame/6%4]+RED12);
			}
			frame++;
			yield;
		}
	}

}

task Laser(x,y,angle,xv,yv,len,expandrate,color,sounds){
	if(sounds){
		SE("laser4");
		SE("shot2");
	}
	let lightningv=-distance(0,0,xv,yv)^0.5;
	let startx=x;
	let starty=y;
	let obj=Obj_Create(OBJ_LASER);
	Obj_SetAutoDelete(obj,false);
	ObjShot_SetGraphic(obj,WHITE60);
	Obj_SetAlpha(obj,0);
	ObjLaser_SetSource(obj,false);
	ObjLaser_SetWidth(obj,20);
	Obj_SetAngle(obj,angle);
	let xo=cos(angle);
	let yo=sin(angle);
	let len=0;
	let frame=0;
	let x2=x;
	let y2=y;
	let k=0;
	let num;
	let colorarray;
	let keeplooping=true;
	while(keeplooping){
		if(frame==59){
			keeplooping=LineInBox(x,y,x2,y2,GetClipMinX-60,GetClipMinY-60,GetClipMaxX+60,GetClipMaxY+60);
		}
		if(frame==60){
			if(LineInBox(x,y,x2,y2,GetClipMinX,GetClipMinY,GetClipMaxX,GetClipMaxY)){
				SE("shot2");
				SE("shot3");
			}
			Obj_SetCollisionToPlayer(obj,false);
			x2=x-xo*len*0.5;
			y2=y-yo*len*0.5;
			k=0;
			num=round( (len/10) /4)*4;
			loop(num){
				if(OnScreen(x2,y2,20)){
					LaserBullet(x2,y2,atan2(y2-starty,x2-startx)+(k*180),len,120,color);
				}
				x2+=cos(angle)*len*(1/num);
				y2+=sin(angle)*len*(1/num);
				k++;
			}
			frame=-120;
		}
		if(frame==0){
			Obj_SetCollisionToPlayer(obj,true);
		}
		if(frame>=0){
			if(frame%4==0){
				colorarray=[rand_int(0,255),rand_int(0,255),rand_int(0,255)];
				colorarray[color]=255;
				PatchyLightningColor(x-xo*len*0.75,y-yo*len*0.75,rand(-3,3),lightningv+rand(0,1),angle,len*1.5,20, 2,20,10, 3, colorarray);
			}
			x+=xv;
			y+=yv;
			Obj_SetPosition(obj,x-xo*len*0.5,y-yo*len*0.5);
			ObjLaser_SetLength(obj,len);
			len+=expandrate;
		}
		frame++;
		yield;
	}
	Obj_Delete(obj);
}
task LaserBullet(x,y,angle,len,time,color){
	let graphics=[[0,0,0,1,6,7],[2,3,3,3,4,7],[4,5,5,5,6,7]][color];

	DelayEffect(x,y,RED50+graphics[rand_int(0,5)],rand_int(3,10));
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetAutoDelete(obj,false);
	let frame=0;
	let xo=cos(angle);
	let yo=sin(angle);
	let size=rand(0,50);
	let offset=0;
	loop(time+1){
		if(frame%4==0){
			ObjShot_SetGraphic(obj,RED50+graphics[rand_int(0,5)]);
		}
		offset=sin(frame*(180/time))*size;
		Obj_SetPosition(obj,x+xo*offset,y+yo*offset);
		frame++;
		yield;
	}
	let alpha=255;
	let fade=rand_int(5,15);
	loop(fade){
		Obj_SetAlpha(obj,alpha);
		alpha-=255/fade;
		yield;
	}
	Obj_Delete(obj);
	//DelayEffect(x,y,RED50+graphics[rand_int(0,5)],5);
}

@MainLoop {
        SetCollisionA(GetX, GetY, 40);
	SetCollisionB(GetX, GetY, 20);


	PatchyDrawLogic;

	yield;
}

@DrawLoop {
	PatchyDrawLoop;
}

@Finalize {
	EndingFunc(6);
	PatchyFinalize;
	PointItems(GetX,GetY,7,1);
}

}