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

    SpellID=529;

    @Initialize {
	Randomize;
        SetLife(2800);
        SetTimer2(70);
	SetDamageRate(110,40);
	MagicCircle(false);
	SetEnemyMarker(true);
	AliceInit;
	MainTask;
	shotinit;

	StartFunctions(1,0,0);
    }


let globaltimer=0;
let i=0;

let dollx=[];
let dolly=[];
let dollcounter=0;
let dolldelete=-1;

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

function Percentage{
	return (lower(GetLife/2800,GetTimer2/70));
}

task MainTask{
	DelayBombTask;

	MoveTask;
	Wait(240);

	ColorTask;
	SetBG(22);
	SpellCircle2(5,1,4,200);
	CutIn2(8,"Seven Colors [Tome of Gensokyo]");
	ShakeScreen(2,60);

	dollcounter=0;
	let x=GetX;
	let y=GetY;
	let x2=GetX;
	let y2=GetY;

	let num=0;
	let angle=0;
	let angle2=0;
	let k=0;
	let numshots=7;
	let color=[0,0,0];
	loop{
		dolldelete=-1;
		dollcounter=0;
		dollx=[];
		dolly=[];
		x2=GetX;
		y2=GetY;
		numshots=18-Percentage*12;
		numshots=lower(numshots,14);
		loop(numshots){
			while(distance(x,y,x2,y2)<150*150){
				x=rand(GetClipMinX,GetClipMaxX);
				y=rand(GetClipMinY,GetClipMaxY);
			}
			x2=x;
			y2=y;
			Doll(GetX+rand(-30,30),GetY+rand(-30,30),x,y,120);
			Wait(10);
		}
		Wait(100);
		if(num==1){Fire(120);}
		else if(num>1){Fire(220);}
		Wait(20);
		DollLaser(numshots);
		num++;
		Wait(Percentage*40);
	}
}
task ColorTask{
	let frame=0;
	let color;
	loop{
		color=RainbowArray(frame/2,cos(frame*5)*0.45+0.45,0);
		SetCommonData("AliceBGColor1",[color[0]/2,color[1]/2,color[2]/2]);
		SetCommonData("AliceBGColor2",color);
		frame++;
		yield;
	}
}

task Fire(len){
	let color=[0,0,0];
	let colorindex=rand(0,360);
	let k=0;
	loop(len){
		if(k%2==0){
			SE("shot3");
		}
		k++;
		loop(2){
			color=RainbowArray(colorindex,150,105);
			SetShotColor(color[0],color[1],color[2]);
			CreateShot01(GetX,GetY,rand(1.5,2.5),atan2(GetCenterY-GetY,GetCenterX-GetX)+rand(-15,15),SP01+rand_int(0,2),0);
		}
		SetShotColor(255,255,255);
		colorindex+=2;
		Wait(1);
	}
}

task MoveTask{
	SetMovePositionNew(GetCenterX,GetCenterY-120,60);
	SetInvincibility(240);
	let angle=0;
	let color=[0,0,0];
	let frame=0;
	SE("charge");
	loop(60){
		if(frame%2==0){
			CreateExplosionEX(3,GetCenterX-100,GetCenterY,1,RainbowArray(rand(0,360),150,105),rand(0.05,0.1),rand(10,30));
			CreateExplosionEX(3,GetCenterX+100,GetCenterY,1,RainbowArray(rand(0,360),150,105),rand(0.05,0.1),rand(10,30));
		}
		frame++;
		yield;
	}
	frame=0;
	BlockBulletsTask;
	loop(180){
		if(frame%2==0){
			SE("shot1");
			CreateExplosionEX(3,GetCenterX-100,GetCenterY,1,RainbowArray(rand(0,360),150,105),rand(0.05,0.1),rand(10,30));
			CreateExplosionEX(3,GetCenterX+100,GetCenterY,1,RainbowArray(rand(0,360),150,105),rand(0.05,0.1),rand(10,30));
		}
		frame++;
		color=RainbowArray(frame*(360/180)*4,150,105);
		SetShotColor(color[0],color[1],color[2]);
		CreateShot01(GetCenterX+100,GetCenterY,rand(2,3),angle+rand(-5,5),SP01+rand_int(0,2),0);
		CreateShot01(GetCenterX+100,GetCenterY,rand(2,3),-angle+rand(-5,5),SP01+rand_int(0,2),0);
		CreateShot01(GetCenterX-100,GetCenterY,rand(2,3),angle+180+rand(-5,5),SP01+rand_int(0,2),0);
		CreateShot01(GetCenterX-100,GetCenterY,rand(2,3),-angle+180+rand(-5,5),SP01+rand_int(0,2),0);
		if(frame<120){
			angle+=120/120;
		}
		SetShotColor(255,255,255);
		yield;
	}


	let angle=-90;
	let shottimer=0;
	let shottimer2=0;
	let rotangle=0;

	SetMovePositionNew(GetCenterX,GetCenterY-160,60);
	Wait(60);
	loop{
		shottimer++;
		shottimer2++;
		if(shottimer>80&&Percentage<0.35){
			Shoot2(GetX,GetY,GetAngleToPlayer);
			shottimer=0;
		}
		if(shottimer2>8-Percentage*3){
			SE("shot1");
			CreateShot01Delay(GetX,GetY,2,rand(0,360),WHITE54,20,40,20,40);
			shottimer2-=8-Percentage*3;
		}
		SetX(GetCenterX+cos(angle)*160);
		SetY(GetCenterY+sin(angle)*160);
		rotangle=lower(rotangle+0.01,0.3);
		angle-=rotangle;
		yield;
	}
}
task Shoot2(x,y,a){
	let k=0;
	loop(7){
		SE("shot3");
		CreateShot01Delay(x,y,1.5,a+20,RED11+k,20,40,20,40);
		CreateShot01Delay(x,y,1.5,a-20,RED11+k,20,40,20,40);
		k++;
		Wait(7);
	}
}
task BlockBulletsTask{
	Wait(60);
	let size=0;
	let shot;
	let k=0;
	loop{
		BlockLaser(GetClipMinX,GetClipMinY,0,  size,16,40,RED60+k%7);
		BlockLaser(GetClipMaxX,GetClipMinY,90, size,16,40,RED60+k%7);
		BlockLaser(GetClipMaxX,GetClipMaxY,180,size,16,40,RED60+k%7);
		BlockLaser(GetClipMinX,GetClipMaxY,270,size,16,40,RED60+k%7);

		k++;
		size=lower(size+1.5,70);
		Wait(16);
	}
}

task BlockLaser(x,y,a,size,time,time2,g){
	let xv=cos(a+90);
	let yv=sin(a+90);
	let obj=Obj_Create(OBJ_LASER);
	ObjLaser_SetSource(obj,false);
	ObjLaser_SetWidth(obj,10);
	ObjLaser_SetLength(obj,450);
	ObjShot_SetGraphic(obj,g);
	Obj_SetPosition(obj,x+xv*size,y+yv*size);
	Obj_SetAngle(obj,a);
	Obj_SetCollisionToPlayer(obj,false);
	Obj_SetAutoDelete(obj,false);

	let alpha=0;
	loop(time){
		alpha+=230/time;
		Obj_SetAlpha(obj,alpha);
		yield;
	}
	Obj_SetAlpha(obj,160);
	Obj_SetCollisionToPlayer(obj,true);
	let sizeadd=size/time2;
	loop(time2*2){
		size-=sizeadd;
		Obj_SetPosition(obj,x+xv*size,y+yv*size);
		yield;
	}
	Obj_Delete(obj);
}

task Doll(x1,y1,x2,y2,time){
	SE("exattack");
	let id=dollcounter;
	dollx=dollx~[0];
	dolly=dolly~[0];
	dollcounter++;
	CreateExplosionEX(3,x1,y1,0.3,RainbowArray(id*(360/7),100,155),0.1,32);
	let frame=0;
	let angle=atan2(y2-y1,x2-x1);
	let dist=distance(x1,y1,x2,y2)^0.5;
	loop(time){
		frame++;
		dollx[id]=x1+sin(frame*(90/time))*dist*cos(angle);
		dolly[id]=y1+sin(frame*(90/time))*dist*sin(angle);
		yield;
	}
	while(dolldelete!=id){
		yield;
	}
	dollx[id]=-50;
	dolly[id]=0;
	loop(3){
		CreateExplosionEX(0,x2,y2,1,RainbowArray(id*(360/7),100,155),rand(0.05,0.15),rand(20,40));
	}
}
function DollLaser(num){
	let id=0;
	let x=GetX;
	let y=GetY;
	loop(num){
		DollLaser2(x,y,dollx[id],dolly[id],id);
		x=dollx[id];
		y=dolly[id];
		id++;
		Wait(10);
	}
	Wait(140);
}
task DollLaser2(x,y,x2,y2,id){
	if(id==0){
		DollLaser2(x,y,x,y,-1);
	}
	let xv=(x2-x);
	let yv=(y2-y);
	let color=RainbowArray((id-1)*(360/7),150,105);
	if(id<=0){
		color=[255,255,255];
	}
	let color2=RainbowArray((id)*(360/7),150,105);
	let dist=distance(x,y,x2,y2)^0.5;
	let angle=atan2(y2-y,x2-x);
	let angleadd=0;
	let alpha=0;
	let obj=InitEffect(x,y,imgWhite,4,ADD,4);
	ObjEffect_SetAngle(obj,0,0,angle);
	ObjEffect_SetXYRect(obj,0,-3,dist,3);
	ObjEffect_SetUVRect(obj,0,0,5,5);
	let frame=0;
	loop(120){
		alpha=upper(sin(frame*(360/60))*255,0);
		ObjEffect_SetVertexColor(obj,0,alpha,color[0],color[1],color[2]);
		ObjEffect_SetVertexColor(obj,3,alpha,color[0],color[1],color[2]);

		alpha=upper(sin(frame*(360/60)-90)*255,0);
		ObjEffect_SetVertexColor(obj,1,alpha,color2[0],color2[1],color2[2]);
		ObjEffect_SetVertexColor(obj,2,alpha,color2[0],color2[1],color2[2]);
		frame++;
		yield;
	}
	Obj_Delete(obj);

	let obj2=Obj_Create(OBJ_LASER);
	ObjLaser_SetSource(obj2,false);
	ObjLaser_SetWidth(obj2,40);
	ObjLaser_SetLength(obj2,40);
	if(id==-1){
		ObjShot_SetGraphic(obj2,WHITE50);
	}else{
		ObjShot_SetGraphic(obj2,RED50+id%7);
	}
	Obj_SetCollisionToPlayer(obj2,false);
	ObjShot_SetBombResist(obj2,true);
	ObjShot_ToItem(obj2,false);

	obj=Obj_Create(OBJ_LASER);
	ObjLaser_SetSource(obj,false);
	ObjLaser_SetWidth(obj,20);
	ObjShot_SetGraphic(obj,RED60+id%7);
	Obj_SetPosition(obj,x,y);
	Obj_SetAngle(obj,angle);
	let len=0;
	let angle=0;
	frame=0;
	HandleWidth(obj,80,20);
	SE("laser3");
	loop(10){
		len+=dist/10;
		ObjLaser_SetLength(obj,len);
		frame+=1/10;
		Obj_SetAngle(obj2,angle);
		Obj_SetPosition(obj2,x+xv*frame-cos(angle)*20,y+yv*frame-sin(angle)*20);
		angle+=20;
		yield;
	}
	if(Percentage<0.7&&id>=0){
		SE("shot2");
		len=90;
		loop(2){
			CreateShot02(x,y,0,len,1.5/120,1.5,RED56+id%7,0);
			len+=180;
		}
		len-=45;
		loop(4){
			CreateShot02(x,y,0,len,0.7/120,0.7,RED56+id%7,0);
			len+=90;
		}
	}
	dolldelete=id;
	loop(80){
		Obj_SetAngle(obj2,angle);
		Obj_SetPosition(obj2,x+xv*frame-cos(angle)*20,y+yv*frame-sin(angle)*20);
		angle+=20;
		yield;
	}
	ObjShot_FadeDelete(obj2);
	len=dist;
	x2=x;
	y2=y;
	loop(10){
		len-=dist/10;
		ObjLaser_SetLength(obj,len);
		x+=xv/10;
		y+=yv/10;
		Obj_SetPosition(obj,x,y);
		Obj_SetAngle(obj2,angle);
		Obj_SetPosition(obj2,x2+xv*frame-cos(angle)*20,y2+yv*frame-sin(angle)*20);
		angle+=20;
		yield;
	}
	Obj_Delete(obj);
	loop(60){
		Obj_SetAngle(obj2,angle);
		Obj_SetPosition(obj2,x2+xv*frame-cos(angle)*20,y2+yv*frame-sin(angle)*20);
		angle+=20;
	}
	
}
task HandleWidth(obj,time,time2){
	loop(time/2){
		ObjLaser_SetWidth(obj,rand(10,20));
		Wait(2);
	}
	let maxwidth=1;
	Obj_SetCollisionToPlayer(obj,false);
	loop(time2/2){
		ObjLaser_SetWidth(obj,rand(10,20)*maxwidth);
		maxwidth-=1/(time2/2);
		Wait(2);
	}

}

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

	AliceDrawLogic;

	globaltimer++;

	yield;
}

@DrawLoop {
	i=0;
	loop(length(dollx)){
		DrawDoll(dollx[i],dolly[i],globaltimer,0.6);
		i++;
	}
	AliceDrawLoop;
}

@Finalize {
	DeleteCommonData("ExplosionX");
	DeleteCommonData("ExplosionY");
	EndingFunc(6);
	AliceFinalize;
	PointItems(GetX,GetY,7,1);
}

}