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

    SpellID=511;

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

	CutIn2(7,"Fire and Water [Melting Ice]");
	SpellCircle2(6,1,4,200);
	SetBG(21);
    }

let laserangles=[-1,-1];
let laserson=false;
let laserlength=0;
let fadeout=false;

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

task MainTask{
	DelayBombTask;
	SetMovePositionNew(GetCenterX,150,60);
	SetInvincibility(120);

	let i=0;
	let color=0;
	let dir=1;
	let obj;
	Wait(40);
	loop{
		obj=PatchyElement(1,GetCenterX-50,150,20,9, 255,1);
		FadePatchyElement(obj,20,150);
		Wait(20);
		laserson=false;
		i=rand(0,360);
		loop(80){
			loop(4){
				WaterShot(GetX,GetY,(-cos(i/39)+1)*1.8+0.5,i, color%2);
				i+=90*dir;
			}
			i+=8*dir;
			color++;
			yield;
		}
		Wait(50);
		obj=PatchyElement(0,GetCenterX+50,150,20,9, 255,1);
		Wait(20);
		laserson=true;
		laserlength=0;
		FireLaser(GetX,GetY,0,dir,0);
		FireLaser(GetX,GetY,90,dir,1);

		loop(250){
			laserlength+=2;
			yield;
		}
		Wait(200-lower(GetLife/4000,GetTimer2/60)*40);
		FadePatchyElement(obj,20,0);
		dir=-dir;
	}
}

task WaterShot(x,y,v,a,color){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetAngle(obj,a);
	ObjShot_SetGraphic(obj,SP04-color);
	let decel=v/180;
	let i=0;
	let dist=0;
	loop(180){
		v-=decel;
		Obj_SetSpeed(obj,v);
		yield;
	}
	let dist=distance(Obj_GetX(obj),Obj_GetY(obj),GetX,GetY)^0.5;
	let stoplooping=false;
	while(!Obj_BeDeleted(obj)){
		if(laserson){
			i=0;
			if(dist<laserlength){
				loop(length(laserangles)){
					if(laserangles[i]!=-1&&stoplooping==false){
						dist=GetPointToLine(Obj_GetX(obj), Obj_GetY(obj), GetX, GetY, GetX+cos(laserangles[i]), GetY+sin(laserangles[i]));
						if(absolute(dist)<=20){
							//ObjShot_FadeDelete(obj);
							let k=laserangles[i]-45;
							let vel=rand(1,1);
							loop(2){
								CreateShot01(Obj_GetX(obj), Obj_GetY(obj), vel,k,WHITE05,0);
								k+=90;
							}
							CreateExplosionFlatEX(0,Obj_GetX(obj),Obj_GetY(obj), 1,[[150,255,255],[255,150,255]][color],0.05,20);
							Obj_Delete(obj);
							stoplooping=true;
						}
					}
					i++;
				}
			}
		}
		if(fadeout){
			ObjShot_FadeDelete(obj);
		}
		yield;
	}
}
task FireLaser(x,y,a,dir,id){
	let obj=[0,0];
	let i=0;
	loop(2){
		obj[i]=Obj_Create(OBJ_LASER);
		Obj_SetPosition(obj[i],x,y);
		ObjShot_SetGraphic(obj[i],SP01);
		ObjLaser_SetSource(obj[i],false);
		ObjLaser_SetWidth(obj[i],20);
		i++;
	}
	let frame=0;
	loop(400){
		laserangles[id]=a;
		if(frame<180*2){
			i=0;
			loop(2){
				ObjLaser_SetLength(obj[i],laserlength);
				Obj_SetAngle(obj[i],a+i*180);
				if(rand(0,1)<=(laserlength/(240*2))){
					FireLaserPrettyThing(a+i*180,rand(0,laserlength));
				}
				i++;
			}
		}
		a+=dir*sin(frame*(180/400))/2;
		frame++;
		if(frame==400){
			i=0;
			fadeout=true;
			loop(2){
				ObjShot_FadeDelete(obj[i]);
				i++;
				yield;
			}
		}
		yield;
	}
	fadeout=false;
}
task FireLaserPrettyThing(angle,offset){
	let angle2=angle+rand_int(0,1)*180;
	let obj=Obj_Create(OBJ_LASER);
	let x=GetX+cos(angle)*offset;
	let y=GetY+sin(angle)*offset;
	ObjShot_SetGraphic(obj,SP01);
	Obj_SetAngle(obj,angle+180);
	ObjLaser_SetSource(obj,false);
	ObjLaser_SetWidth(obj,20);
	Obj_SetCollisionToPlayer(obj,false);
	ObjLaser_SetLength(obj,150);
	ObjShot_ToItem(obj,false);
	let alpha=255;
	let cosa=cos(angle2);
	let sina=sin(angle2);
	let len=0;
	loop(60){
		Obj_SetPosition(obj,x,y);
		x+=cosa*2;
		y+=sina*2;
		alpha-=255/60;
		Obj_SetAlpha(obj,alpha);
		yield;
	}
	Obj_Delete(obj);
}
@MainLoop {
        SetCollisionA(GetX, GetY, 40);
	SetCollisionB(GetX, GetY, 20);


	PatchyDrawLogic;

	yield;
}

@DrawLoop {
	PatchyDrawLoop;
}

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

}