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

	SpellID=73;

	let i=0;
	let frame=0;
	let movex;
	let movey;
	let movex2;
	let movey2;
	let timestoptime=0;
	let timestoptimem=0;

    @Initialize {
	StartFunctions(1,0,0);
	Randomize;
        SetLife(3000);
        SetTimer2(45);
	SetDamageRate(100,70);
	MagicCircle(false);
	SetEnemyMarker(true);
	YukariInit;
	SetBG(5);

	shotinit;

	CutIn2(5,"Warp [Road to Makai]");
	SpellCircle2(6,1,4,250);
	SetShotAutoDeleteClip(10,10,10,10);

	MainTask;
    }


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

function percentage{
	return upper(0,lower(GetTimer2/45,GetLife/3000)*135-35);
}

task MainTask{
	SetMovePosition03(GetCenterX,110,10,5);
	DelayBombTask;
	SetInvincibility(300);
	xx=GetCenterX+150;
	yy=GetCenterY+120+50;
	if(distance(GetPlayerX,GetPlayerY,xx,xx)<90*90){
		yy=GetCenterY;
		xx=GetCenterX;
	}
	objgap=Gap(GetPlayerX,GetPlayerY,xx,yy,40,40,70,[0,0]);
	PositionGap(objgap,79, xx,yy);
	Wait(80);
	timestoptime=40;
	timestoptimem=40;
	SE("warp");
	movex=xx;
	movey=yy;
	movex2=GetPlayerX-movex;
	movey2=GetPlayerY-movey;
	loop(60){
		SetPlayerX(movex);
		SetPlayerY(movey);
		yield;
	}
	Wait(40);
	let xsize=100;
	let dir=1;
	let yy;
	let xx;
	let time;
	let maxtime=460;
	let objgap;
	MainTask2;
	loop{

		yy=GetCenterY+120*dir+50;

		objgap=Gap(GetPlayerX,GetPlayerY,GetCenterX-xsize*dir,yy,40,40,70,[0,0]);
		PositionGap(objgap,79, GetCenterX-xsize*dir,yy);
		SetMovePositionNew(GetCenterX,60,120);
		Wait(60);
		ClearShots(GetCenterX-xsize*dir,yy,60,30);
		Wait(20);
		BulletPath(GetCenterX-192*dir,yy,GetCenterX+192*dir,yy, 30,10,180,220);
		movex=GetCenterX-xsize*dir;
		movey=yy;
		movex2=GetPlayerX-movex;
		movey2=GetPlayerY-movey;
		timestoptime=40;
		timestoptimem=40;
		SE("warp");
		loop(20){
			SetPlayerX(movex);
			SetPlayerY(movey);
			yield;
		}
		xsize=140;
		Arrow(GetCenterX+80*-dir,yy,-dir*90+90,50,15,7);
		loop(40){
			SetPlayerX(movex);
			SetPlayerY(movey);
			yield;
		}

		Wait(150);

		xx=GetCenterX+150*dir;

		objgap=Gap(GetPlayerX,GetPlayerY,xx,GetCenterY-150*dir,40,40,70,[0,0]);
		PositionGap(objgap,79,xx,GetCenterY-150*dir);
		Wait(60);
		ClearShots(xx,GetCenterY-150*dir,60,30);
		SetMovePositionNew(xx,30,120);
		Wait(20);
		BulletPath(xx,GetCenterY-224*dir,xx,GetCenterY+224*dir,30,10,180,220);
		movex=xx;
		movey=GetCenterY-150*dir;
		movex2=GetPlayerX-movex;
		movey2=GetPlayerY-movey;
		timestoptime=40;
		timestoptimem=40;
		SE("warp");
		loop(20){
			SetPlayerX(movex);
			SetPlayerY(movey);
			yield;
		}
		Arrow(xx,GetCenterY+80*-dir,dir*90,50,15,7);
		loop(40){
			SetPlayerX(movex);
			SetPlayerY(movey);
			yield;
		}
		Wait(150);

		dir=-dir;

	}
}
task PositionGap(obj,time,x,y){
	let frame=0;
	loop(time){
		Obj_SetPosition(obj[0],GetPlayerX,GetPlayerY);
		Obj_SetPosition(obj[2],GetPlayerX,GetPlayerY);
		frame++;
		if(frame>time/2){
			DeleteEnemyShotImmediatelyInCircle(SHOT,GetPlayerX,GetPlayerY,20);
		}
		yield;
	}
	yield;
	let obj2=InitEffect(0,0,imgWhite,4,ALPHA,7);
	Obj_SetColor(obj2,4,100,0,0,0);
	ObjEffect_SetXYRect(obj2,GetClipMinX,GetClipMinY,GetClipMaxX,GetClipMaxY);
	ObjEffect_SetUVRect(obj2,0,0,4,4);
	yield;
	Obj_Delete(obj2);
}
task MainTask2{
	let expsize=0;
	loop(3){
		Wait(16);
		HellExplosion(expsize);
		expsize+=0.7/14;
	}
	NewCharge_XY(GetCenterX,GetCenterY+50, 120*60,10,0.12,255,50,50);
	loop(3){
		Wait(16);
		HellExplosion(expsize);
		expsize+=0.7/14;
	}
	NewCharge_XY(GetCenterX,GetCenterY+50, 120*60,10,0.12,255,180,50);
	loop(4){
		Wait(16);
		HellExplosion(expsize);
		expsize+=0.7/14;
	}
	NewCharge_XY(GetCenterX,GetCenterY+50, 120*60,10,0.12,255,200,150);
	loop(4){
		Wait(16);
		HellExplosion(expsize);
		expsize+=0.7/14;
	}
	NewCharge_XY(GetCenterX,GetCenterY+50, 120*60,10,0.12,255,255,255);
	let angle=0;
	let k=0;
	let timer=0;
	loop{
		SE("shot1");
		k=0;
		loop(4){
			FadeInShot01Damage(GetCenterX,GetCenterY+50,0.8,angle+k*90,WHITE21,60);
			FadeInShot01Damage(GetCenterX,GetCenterY+50,0.8,-angle+k*90,WHITE21,60);
			FadeInShot01Damage(GetCenterX,GetCenterY+50,1,angle+k*90,PURPLE21,60);
			FadeInShot01Damage(GetCenterX,GetCenterY+50,1,-angle+k*90,PURPLE21,60);
			k++;
		}
		angle+=10.7;
		Wait(5+percentage/10);
		HellExplosion(0.7+(100-percentage)/170);
		Wait(5+percentage/10);
		HellExplosion(0.7+(100-percentage)/170);
	}
}
function HellExplosion(size){
	CreateExplosionEX(0,GetCenterX,GetCenterY+50,1,[255*size,rand(0,128)*size,rand(0,128)*size],rand(0.07,0.12)*size,60);
	CreateExplosionEX(0,GetCenterX,GetCenterY+50,1,[255*size,rand(0,128)*size,255*size],rand(0.10,0.17)*size,60);
}

task ClearShots(x,y,radius,time){
	invincible=true;
	time*=1.8;
	let radiusadd=radius/time;
	radius=0;
	let alpha=255;
	loop(time){
		radius+=radiusadd;
		DeleteEnemyShotImmediatelyInCircle(SHOT,x,y,radius);
		DeleteEnemyShotImmediatelyInCircle(SHOT,GetPlayerX,GetPlayerY,10);
		ImageCircle(imgWhite,0,0,50,50,x,y,radius,10,48,0,2,alpha,ADD,255,0,255);
		alpha-=255/time;
		yield;
	}
	invincible=false;
}
let teleportobj=[];
let teleporttime=[];
let wcolor=[0,0,0];

    @MainLoop {
//	SetCollisionB(GetX, GetY, 20);

	HandleGaps;
	if(timestoptime>0){
		teleportobj=teleportobj~[InitEffect(movex+movex2*((1+timestoptime)/timestoptimem),movey+movey2*((1+timestoptime)/timestoptimem),imgYukari1,4,ADD,7)];
		i=length(teleportobj)-1;
		wcolor=[
			[rand(0,255),rand(0,255),rand(0,255)],
			[255,rand(0,255),255],
			[rand(0,255),255,rand(0,255)],
			[rand(0,255),255,255],
			[rand(0,255),rand(0,255),rand(0,255)],
			[rand(0,255),rand(0,255),rand(0,255)],
			[rand(0,255),rand(0,255),rand(0,255)],
			[255,rand(0,255),rand(0,128)]
		][GetPlayer+1];
		Obj_SetColor(teleportobj[i],4,180,wcolor[0],wcolor[1],wcolor[2]);
		ObjEffect_SetXYRect(teleportobj[i],-50,-50,50,50);
		ObjEffect_SetUVRect(teleportobj[i],81,186,144,249);
		ObjEffect_SetAngle(teleportobj[i],0,0,rand(0,360));
		Obj_SetSpeed(teleportobj[i],rand(-1,1));
		Obj_SetAngle(teleportobj[i],atan2(movey2,movex2)+90);
		teleporttime=teleporttime~[rand_int(30,30)];
		timestoptime--;
		TimeStop(2,1,1,1);
		FreezeTime(true);
	}else{
	        SetCollisionA(GetX, GetY, 40);
		YukariDrawLogic;
		FreezeTime(false);
		yield;
	}
	i=0;
	loop(length(teleportobj)){
		if(teleporttime[i]>=0){
			ObjEffect_SetScale(teleportobj[i],teleporttime[i]/30,teleporttime[i]/30);
			teleporttime[i]=teleporttime[i]-1;
			i++;
		}else{
			Obj_Delete(teleportobj[i]);
			teleportobj=erase(teleportobj,i);
			teleporttime=erase(teleporttime,i);
		}
	}
}
    @DrawLoop {
	YukariDrawLoop;
}

    @Finalize {
	FreezeTime(false);
	YukariFinalize;
	PointItems(GetX,GetY,3,1);
	EndingFunc(3);
    }

function ScreenX(x){
	return center(GetClipMinX+25,x,GetClipMaxX-25);
}
function ScreenY(y){
	return center(GetClipMinY+25,y,GetClipMaxY-25);
}
}