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

	SpellID=79;

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

	shotinit;

	CutIn2(5,"Dream Barrier [Hakurei Bounded Field]");
//	SpellCircle2(6,1,4,250);

	GapCircleLogic;

	MainTask;
    }


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

let colors=[3,5,6];
let speed=[1,1.1,1.2,1.1];

let x=GetX;
let y=GetY;
let yukarix=GetCenterX;

task MainTask{
	MainTask2;
	SetMovePositionNew(GetCenterX,170,60);
	DelayBombTask;
	Wait(45);
	CreateGapBG;
	Wait(45);


	let angle=0;
	let k=0;
	let angleadd=0;
	let frame=0;
	let anglemax=1.9;

	let vels=[2,1];
	let angles=[0,30];
	NewCharge(60,9,1,255,100,255);
	NewCharge(60,9,1,255,255,255);
	NewCharge(120,7,1,255,100,255);
	NewCharge(120,7,1,255,255,255);
	NewCharge(180,5,1,255,100,255);
	NewCharge(180,5,1,255,255,255);
	NewCharge(60*100,4,0.4,255,100,255);
	NewCharge(60*100,4,0.4,255,255,255);
	loop{
		k=0;
		loop(4){
			MainShot(GetX,GetY,1.5,angle+k+45,RED50,rand_int(0,5));
			MainShot(GetX,GetY,1.5,-angle+k+45,WHITE50,rand_int(0,5));
			k+=360/4;
		}
		angle+=angleadd;
		angleadd+=0.04;
		if(angleadd>anglemax){
			angleadd=anglemax;
		}
		frame++;
		Wait(5);
	}


}
task MainTask2{
	Wait(600);
	loop(6){
		CreateExplosionEX(3,GetX,GetY,1,[rand(100,255),100,rand(100,255)],rand(0.2,0.5),rand(30,60));
	}
	let angle=0;
	let k=0;
	let vs=[1.5,1];
	let frame=0;
	let colors=[[BLUE01,WHITE01],[PURPLE01,WHITE01]];
	loop{
		k=0;
		loop(6){
			SwitchShot(GetX,GetY,vs[frame%2],angle+k,colors[frame%2],3);
			k+=360/6;
		}
		frame++;
		angle+=8;
		Wait(15);
	}
}
task SwitchShot(x,y,v,a,g,switchframes){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,v);
	Obj_SetAngle(obj,a);
	let i=0;
	let len=length(g);
	while(!Obj_BeDeleted(obj)){
		ObjShot_SetGraphic(obj,g[i%len]);
		i++;
		Wait(switchframes);
	}
}

task MainShot(x,y,v,a,g,d){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,v);
	Obj_SetAngle(obj,a);
	ObjShot_SetGraphic(obj,SP00);
	ObjShot_SetBombResist(obj,true);
	let gapped=0;
	let frame=0;
	let gaptime=0;
	while(!Obj_BeDeleted(obj)){
		if(frame==d&&gapped==0){
			ObjShot_SetGraphic(obj,g);
			Obj_SetAlpha(obj,220);
		}
		if(frame>=gapradius1/v&&gapped==0){
			DelayEffect(Obj_GetX(obj),Obj_GetY(obj),g,10);
			Obj_SetPosition(obj,Obj_GetX(obj)+cos(a)*gapdifference,Obj_GetY(obj)+sin(a)*gapdifference);
			DelayEffect(Obj_GetX(obj),Obj_GetY(obj),g,10);
			Obj_SetAngle(obj,a+180);
			gapped=1;
			frame=0;
			gaptime=gapradius1;
		}
		if(frame>=(gapradius2-gaptime)/v&&gapped==1){
			DelayEffect(Obj_GetX(obj),Obj_GetY(obj),g,10);
			Obj_SetPosition(obj,Obj_GetX(obj)+cos(a)*gapdifference,Obj_GetY(obj)+sin(a)*gapdifference);
			DelayEffect(Obj_GetX(obj),Obj_GetY(obj),g,10);
			Obj_SetAngle(obj,a);
			gapped=2;
		}
		frame++;
		yield;
	}
}
let gapradius1=160;
let gapradius2=240;
let gapwidth=0;

function gapdifference{
	return gapradius2-gapradius1;
}
task GapCircleLogic{
	CreateRenderTarget("circlegap",256,128);
	let scroll=0;
	let gapadd;
	loop{
		gapadd=upper(64*gapwidth-12.5,0);
		ClearRenderTarget("circlegap");
		SetRenderTarget("circlegap");
		SetTexture(imgGap);
		SetGraphicAngle(0,0,0);
		SetGraphicScale(1,1);

		SetGraphicRect(0+scroll*3,-gapadd+scroll*2,256+scroll*3,gapadd+scroll*2);
		SetAlpha(255);
		DrawGraphic(128,64);

		SetTexture(imgGap2);
		SetGraphicRect(0-scroll*3,150,256-scroll*3,200);
		SetAlpha(255);
		SetGraphicScale(1,0.3);
		DrawGraphic(128,gapadd+64+7);
		SetGraphicScale(1,-0.3);
		DrawGraphic(128,-gapadd+64-7);

		SetRenderState(ADD);
		SetColor(0,0,0);
		SetTexture(imgWhite);
		SetAlpha(255);
		SetGraphicScale(1,1);
		SetGraphicRect(0,0,256,gapadd*2);
		DrawGraphic(128,64);


		SetRenderState(ALPHA);
		SetColor(255,255,255);

		SetRenderTarget("DEFAULT");
		scroll++;
		yield;
	}
}
task CreateGapBG{

	let segments=22;

	let obj=InitEffect(GetX,GetY,"circlegap",segments*2+2,ALPHA,1);
	ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);

	let k=0;
	let angle=0;
	let scroll=0;
	FluctuateGap(obj,segments,4);
	FadeInCircleGap(obj,segments,50);
	loop{
		k=0;
		loop(segments+1){
			ObjEffect_SetVertexUV(obj,k,  k*(512/segments)-scroll,0);
			ObjEffect_SetVertexUV(obj,k+1,k*(512/segments)-scroll,128);
			k+=2;
		}
		scroll++;
		Obj_SetPosition(obj,GetX,GetY);
		ObjEffect_SetAngle(obj,0,0,scroll);
		yield;
	}
}
task FluctuateGap(obj,segments,max){
	let cosangle=[];
	let sinangle=[];
	let angle=0;
	loop(segments+1){
		cosangle=cosangle~[cos(angle)];
		sinangle=sinangle~[sin(angle)];
		angle+=360/segments;
	}
	let k=0;
	loop(segments+1){
		ObjEffect_SetVertexXY(obj,k,cosangle[k/2]*(gapradius1-12),sinangle[k/2]*(gapradius1-12));
		ObjEffect_SetVertexXY(obj,k+1,cosangle[k/2]*(gapradius2+12),sinangle[k/2]*(gapradius2+12));
		k+=2;
	}
}
task FadeInCircleGap(obj,segments,time){
	Obj_SetColor(obj,segments*2+2,220,205,255,255);
	let frame=0;
	let gapinit=0;
	loop(time){
		frame+=90/time;
		gapinit=cos(frame+270);
		ObjEffect_SetScale(obj,gapinit,gapinit);
		yield;
	}
	ObjEffect_SetScale(obj,1,1);

	frame=0;
	loop(time){
		frame+=90/time;
		gapwidth=cos(frame+270);
		yield;
	}
	gapwidth=1;
}
    @MainLoop {
        SetCollisionA(GetX, GetY, 80);
	SetCollisionB(GetX, GetY, 20);

//	HandleGaps;	//gaps are never deleted, so no reason to run this every frame
	YukariDrawLogic;
	yield;
}
    @DrawLoop {
	YukariDrawLoop;
}

    @Finalize {
	YukariFinalize;
	DeleteGraphic("circlegap");
	PointItems(GetX,GetY,3,1);
	EndingFunc(3);
    }

task DelayGap(x1,y1,xo2,yo2,xw,yw,time,target,delay){
	Wait(delay);
	Gap(x1,y1,ScreenX(xo2+GetPlayerX),ScreenY(yo2+GetPlayerY),xw,yw,time,target);
}
function ScreenX(x){
	return center(GetClipMinX+25,x,GetClipMaxX-25);
}
function ScreenY(y){
	return center(GetClipMinY+25,y,GetClipMaxY-25);
}
}