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

    SpellID=519;

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

	CutIn2(7,"Forbidden Summon [Orochi and Ryujin]");
//	SpellCircle2(6,1,4,200);
	SetBG(21);
    }

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

let dragonx=[0,0];
let dragony=[0,0];

let dragonresetx=[NULL,NULL];
let dragonresety=[NULL,NULL];

let dragontailx=[NULL,NULL];
let dragontaily=[NULL,NULL];

task MainTask{
	SetMovePositionNew(GetCenterX,GetCenterY,60);
	DelayBombTaskNoShoot;
	EpicThings;
	ElementTask;
	
	Wait(100);
	FadeEnemyMarker(GetX,60);
	Wait(30);
	Dragon(0,GetCenterX,-90,SP01,SP03,GREEN11);
	Dragon(1,GetCenterX,-90,SP04,SP05,BLUE11);
	Wait(30);

	DragonMove(0,1);
	DragonMove(1,-1);

}
task ElementTask{
	yield;
	let obj1=PatchyElement(0,GetCenterX-120,GetCenterY,20,3, 255,2);
	FadePatchyElement(obj1,10,180);
	let obj2=PatchyElement(1,GetCenterX+120,GetCenterY,20,3, 255,2);
	FadePatchyElement(obj2,10,181);
	loop(190){
		Obj_SetX(obj1,GetCenterX-120+ScreenShakeX);
		Obj_SetY(obj1,GetCenterY+ScreenShakeY);
		Obj_SetX(obj2,GetCenterX+120+ScreenShakeX);
		Obj_SetY(obj2,GetCenterY+ScreenShakeY);
		yield;
	}
}
task EpicThings{
	ShakeScreenEX(5,120,59,0);
	SE("charge2");
	let frame=0;
	let color=[0,0,0];
	loop(40){
		color=RainbowArray(frame*10,128,128);
		NewCharge_XY(GetX,GetY,12,2+frame/40,2,color[0],color[1],color[2]);
		CreateExplosionEX(0,rand(GetClipMinX,GetClipMaxX),rand(GetClipMinY,GetClipMaxY),0.1,[40,0,0],0.2,rand(90,130));
		CreateExplosionEX(0,rand(GetClipMinX,GetClipMaxX),rand(GetClipMinY,GetClipMaxY),0.1,[0,0,40],0.2,rand(90,130));
		frame+=4;
		Wait(4);
	}
	SE("charge");
	frame=0;
	loop(7){
		color=RainbowArray(frame*(360/7),100,70);
		loop(2){
			CreateExplosionEX(3,rand(GetClipMinX,GetClipMaxX),rand(GetClipMinY,GetClipMaxY),0.1,color,0.2,rand(90,130));
		}
		CreateExplosionEX(rand_int(0,1)*3,GetX,GetY,3,color,rand(0.05,0.15),rand(90,130));
		frame++;
	}
	ShakeScreen(10,200);
	SE("smallnuke");
	SE("shot2");
	loop{
		color=RainbowArray(frame*(360/14),40,20);
		CreateExplosionEX(3,rand(GetClipMinX,GetClipMaxX),rand(GetClipMinY,GetClipMaxY),0.1,color,rand(0.1,0.2),rand(90,130));
		frame++;
		Wait(5);
	}
}
task DragonMove(k,dir){
	let waittime=(1-k)*182+1;
	let frame=0;
	let x=GetCenterX-120*dir;
	let extend=0;
	let exadd=0;
	let dragonangle=90;
	let xs=0;
	let ys=0;
	let exploded=false;

	loop{


		extend=0;
		xs=cos(dragonangle);
		ys=sin(dragonangle);

		dragonresetx[k]=x;
		dragonresety[k]=-50;
		exadd=2;
		while(exadd>0){
			dragontailx[k]=x;
			dragontaily[k]=-50;
			dragonx[k]=x+xs*extend;
			dragony[k]=-50+ys*extend;

			extend+=exadd;
			if(extend>230){
				exadd-=0.2;
			}
			yield;
		}

		frame=0;
		exadd=0;
		exploded=false;
		loop(240){
			if(waittime==0&&OnScreen(x+xs*extend,-50+ys*extend,10)){
				SE("shot1");
				DragonShot(x+xs*extend,-50+ys*extend,frame%2+0.5,dragonangle+frame*5+180,[RED01,BLUE01][k],PURPLE01,60);
				DragonShot(x+xs*extend,-50+ys*extend,frame%2+0.5,dragonangle-frame*5+180,[RED01,BLUE01][k],PURPLE01,60);

				if(frame%4==0&&OnScreen(x+xs*extend,-50+ys*extend,-35)){
					DragonShot2(x+xs*extend,-50+ys*extend,1+frame/4%2,dragonangle+90,[RED21,BLUE21][k],PURPLE21,WHITE21,60);
					DragonShot2(x+xs*extend,-50+ys*extend,1+frame/4%2,dragonangle-90,[RED21,BLUE21][k],PURPLE21,WHITE21,60);
				}
			}else if(waittime!=0&&OnScreen(x+xs*extend,-50+ys*extend,0)&&frame%2==0){
				SE("shot1");
				DragonShot(x+xs*extend,-50+ys*extend,(frame/2%2)*0.7+0.5,dragonangle+frame*5+180,[RED01,BLUE01][k],PURPLE01,60);
				DragonShot(x+xs*extend,-50+ys*extend,(frame/2%2)*0.7+0.5,dragonangle-frame*5+180,[RED01,BLUE01][k],PURPLE01,60);
				if(frame%8==0&&OnScreen(x+xs*extend,-50+ys*extend,-50)){
					DragonShot2(x+xs*extend,-50+ys*extend,1.3,dragonangle+90,[RED21,BLUE21][k],PURPLE21,WHITE21,60);
					DragonShot2(x+xs*extend,-50+ys*extend,1.3,dragonangle-90,[RED21,BLUE21][k],PURPLE21,WHITE21,60);
				}
			}
			if(ys*extend>GetClipMaxY+50&&!exploded){
				SE("shot3");
				SE("smallnuke");
				ShakeScreen(6,20);
				exploded=true;
			}
			dragonx[k]=x+xs*extend;
			dragony[k]=-50+ys*extend;
			dragontailx[k]=x+xs*(extend-240);
			dragontaily[k]=-50+ys*(extend-240);

			exadd=lower(exadd+0.05,4);
			extend+=exadd;
			frame++;
			yield;
		}
		Wait(waittime);
		waittime=0;
		x=GetCenterX+rand(-200,200);
		//dragonangle[k]=atan2(GetClipMaxY+50,rand(GetClipMinX,GetClipMaxX)-x[k]);
		dragonangle=atan2(GetPlayerY+50,center(GetClipMinX+20,GetPlayerX+rand(-20,20),GetClipMaxX-20)-x);
	}
}


task Dragon(id,x,y,graphic,graphic2,graphic3){
	let neckobj=[];
	let neckxpos=[];
	let neckypos=[];

	let numobj=19;


	let obj;
	let angle;
	let k=0;
	loop(numobj){
		neckobj=neckobj~[DragonPart(-100,-100,90,60-k*2,60-k*2,graphic)];
		neckxpos=neckxpos~[x];
		neckypos=neckypos~[y];
		yield;
		yield;
		yield;
		k++;
	}
	Obj_SetAlpha(neckobj[0],0);

	let tailobj1=DragonPart(-100,-100,90,40,20,graphic2);
	let tailobj2=DragonPart(-100,-100,90,40,20,graphic2);
	let tailobj3=DragonPart(-100,-100,90,60,15,graphic2);

	let head1=DragonPart(-100,-100,-70, 90,30,graphic2);
	let head2=DragonPart(-100,-100,-110, 90,30,graphic2);
	let head3=DragonPart(-100,-100,-70, 50,40,graphic2);
//	Obj_SetAlpha(head1,180);
//	Obj_SetAlpha(head2,180);
//	Obj_SetAlpha(head3,140);

	let eye1=DragonEye;
	let eye2=DragonEye;

	let frame=rand_int(1000,2000);

	let tailx;
	let taily;

	let headx;
	let heady;
	let headangle=361;

	let percentage;

	let tailxarray=[];
	let tailyarray=[];

	let len=60;

	loop(len){
		tailxarray=tailxarray~[dragonx[id]];
		tailyarray=tailyarray~[dragony[id]];
	}
	let arrayindex=0;

	let lastx=0;
	let lasty=0;

	let firesegment=0;
	let markeralpha=0;
	loop{
		markeralpha=lower(markeralpha+0.02,1);
		if(dragonresetx[id]!=NULL){
			k=0;
			loop(numobj){
				//tailxarray[k]=dragonresetx[id];
				//tailyarray[k]=dragonresety[id];
				neckxpos[k]=dragonresetx[id];
				neckypos[k]=dragonresety[id];
				k++;
			}
			markeralpha=0;
			dragonresetx[id]=NULL;
			dragonresety[id]=NULL;
		}

		headx=dragonx[id]+cos(frame*(4+id/2))*20;
		heady=dragony[id]+sin(frame*(3.5-id/2))*20;
		if(dragontailx[id]==NULL){
			tailx=tailxarray[arrayindex]+sin(frame*4)*20;
			taily=tailyarray[arrayindex]+cos(frame*4)*20;
			tailxarray[arrayindex]=headx;
			tailyarray[arrayindex]=heady;
		}else{
			tailx=dragontailx[id];
			taily=dragontaily[id];
			tailxarray[arrayindex]=tailx;
			tailyarray[arrayindex]=taily;
		}
		arrayindex++;
		if(arrayindex>=len){
			arrayindex=0;
		}

		firesegment=rand_int(0,numobj-2);

		k=0;
		loop(numobj){
			percentage=(k/(numobj));
			if(k==1){
				lastx=x;
				lasty=y;
			}
			x=headx*(1-percentage)+tailx*percentage;
			y=heady*(1-percentage)+taily*percentage;

			if(frame%1==0&&firesegment+1==k&&OnScreen(x,y,10)){
				angle=atan2(y-Obj_GetY(neckobj[k-1])+(30-(k-1)),x-Obj_GetX(neckobj[k-1]));
				PatchyFire(x,y,rand(-4,-2),0,angle+(rand(5,25)*RandDir),20,10, 0,0,70, [graphic,graphic2][rand_int(0,1)]);
			}

			neckxpos[k]=neckxpos[k]+(x-neckxpos[k])/(k*1.5);
			neckypos[k]=neckypos[k]+(y-neckypos[k])/(k*1.5);
			Obj_SetPosition(neckobj[k],neckxpos[k]+sin(frame*5+k*30)*6,neckypos[k]-(30-k)+sin(frame*5-k*30)*6);
			k++;
		}

		angle=atan2(neckypos[k-1]-neckypos[k-2],neckxpos[k-1]-neckxpos[k-2]);
		Obj_SetPosition(tailobj1,Obj_GetX(neckobj[k-1]),Obj_GetY(neckobj[k-1])+(30-(k-1)));
		Obj_SetAngle(tailobj1,angle-20);
		Obj_SetPosition(tailobj2,Obj_GetX(neckobj[k-1]),Obj_GetY(neckobj[k-1])+(30-(k-1)));
		Obj_SetAngle(tailobj2,angle+20);
		Obj_SetPosition(tailobj3,Obj_GetX(neckobj[k-1]),Obj_GetY(neckobj[k-1])+(30-(k-1)));
		Obj_SetAngle(tailobj3,angle);


		headangle=atan2(lasty-y,lastx-x);

		//headangle=atan2(heady-taily,headx-tailx);

		x=cos(headangle)*40;
		y=sin(headangle)*40;

		SetCollisionA(headx+x,heady+y,30);
		SetEnemyMarkerManual(id,headx+x/3,upper(0,lower(markeralpha,(GetClipMaxY-heady+150)/250)));

		Obj_SetPosition(head1,headx+x,heady+y);
		Obj_SetPosition(head2,headx+x,heady+y);
		Obj_SetPosition(head3,headx+x,heady+y);
		Obj_SetAngle(head1,headangle+160);
		Obj_SetAngle(head2,headangle-160);
		Obj_SetAngle(head3,headangle-180);

		x=cos(headangle+40)*18;
		y=sin(headangle+40)*18;
		Obj_SetPosition(eye1,headx+x,heady+y);
		x=cos(headangle-40)*18;
		y=sin(headangle-40)*18;
		Obj_SetPosition(eye2,headx+x,heady+y);
		Obj_SetAngle(eye1,headangle-20);
		Obj_SetAngle(eye2,headangle+20);

		frame++;
		yield;
	}


	function DragonPart(x,y,a,l,w,graphic){
		let obj=Obj_Create(OBJ_LASER);
		Obj_SetPosition(obj,x,y);
		Obj_SetAngle(obj,a);
		ObjShot_SetGraphic(obj,graphic);
		ObjLaser_SetSource(obj,false);
		ObjLaser_SetWidth(obj,w);
		ObjLaser_SetLength(obj,l);
		Obj_SetAutoDelete(obj,false);
		ObjShot_ToItem(obj,false);
		ObjShot_SetBombResist(obj,true);
		return obj;
	}
	function DragonEye{
		let obj=Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj,graphic3);
		Obj_SetAutoDelete(obj,false);
		ObjShot_ToItem(obj,false);
		ObjShot_SetBombResist(obj,true);
		return obj;
	}
}
task DragonShot(x,y,v,a,g,g2,d){
	let obj=Obj_Create(OBJ_SHOT);Obj_SetPosition(obj,x,y);Obj_SetSpeed(obj,v);Obj_SetAngle(obj,a);
	Obj_SetCollisionToPlayer(obj,false);
	let alpha=0;
	DragonColorChange(obj,g,g2,cos(a)*v,sin(a)*v);
	loop(d){
		alpha+=255/d;
		Obj_SetAlpha(obj,alpha);
		yield;
	}
	Obj_SetAlpha(obj,255);
	Obj_SetCollisionToPlayer(obj,true);
}
task DragonShot2(x,y,v,a,g,g2,g3,d){
	let obj=Obj_Create(OBJ_SHOT);Obj_SetPosition(obj,x,y);Obj_SetSpeed(obj,v);Obj_SetAngle(obj,a);ObjShot_SetGraphic(obj,g3);
	Obj_SetCollisionToPlayer(obj,false);
	let alpha=0;
	let frame=0;
	let vadd=v/60;
	loop(60){
		v-=vadd;
		Obj_SetSpeed(obj,v);
		yield;
	}
	DelayEffect(Obj_GetX(obj),Obj_GetY(obj),g,10);
	DragonColorChange(obj,g,g2,cos(a)*v,sin(a)*v);
	Obj_SetAngle(obj,atan2(GetPlayerY-Obj_GetY(obj),GetPlayerX-Obj_GetX(obj)));
	loop(60){
		v+=vadd;
		Obj_SetSpeed(obj,v);
		yield;
	}
}
task DragonColorChange(obj,g,g2,xs,ys){
	let frame=0;
	while(!Obj_BeDeleted(obj)){
		if(frame%30==0){
			ObjShot_SetGraphic(obj,g);
		}else if(frame%30==20){
			ObjShot_SetGraphic(obj,g2);
			DelayEffect(Obj_GetX(obj)+xs,Obj_GetY(obj)+ys,g2,4);
		}
		frame++;
		yield;
	}
}

let currentpos=0;

@MainLoop {
	if(dragontailx[0]!=NULL){
		if(absolute(dragonx[0]-GetPlayerX)<absolute(dragonx[1]-GetPlayerX)){
			currentpos=0;
		}else{currentpos=1;}
		SetX(dragonx[currentpos]);
		SetY(dragony[currentpos]);
	}

	PatchyDrawLogic;

	yield;
}

@DrawLoop {
	if(dragontailx[0]==NULL){
		PatchyDrawLoop;
	}
}

@Finalize {
	EndingFunc(6);
	PatchyFinalize;
	SetCommonData("ExplosionX",dragonx[0]);
	SetCommonData("ExplosionY",dragony[0]);
	SetCommonData("ExplosionX2",dragonx[1]);
	SetCommonData("ExplosionY2",dragony[1]);
	PointItems(GetX,GetY,7,1);
}

}