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

    SpellID=505;

    @Initialize {
	Randomize;
        SetLife(2200);
        SetTimer2(55);
	SetDamageRate(80,40);
	MagicCircle(false);
	SetEnemyMarker(true);
	IddyeaInit;
	MainTask;
	shotinit;

	StartFunctions(1,0,0);
	SetBG(20);

	SpellCircle2(6,1,4,200);
    }


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

let moveiddyea=0;

task MainTask{
	DelayBombTask;
	CutIn2(3,"Swirling Fantasy [Waking Dream]");

	SetMovePositionNew(GetCenterX,100,60);
	Wait(80);
	let angle=rand(0,120);

	MultiLaser(GetX,GetY,angle+0,  0,0,0,0,0.2,100,10,5,100,20, 0 ,180);
	MultiLaser(GetX,GetY,angle+20, 0,0,0,0,0.2,90,10,5, 90,20, 1 ,180);
	MultiLaser(GetX,GetY,angle+40, 0,0,0,0,0.2,80,10,5,80,20, 2 ,180);
	MultiLaser(GetX,GetY,angle+60, 0,0,0,0,0.2,95,10,5, 95,20, 3 ,180);
	MultiLaser(GetX,GetY,angle+80, 0,0,0,0,0.2,105,10,5,105,20, 4 ,180);
	MultiLaser(GetX,GetY,angle+100,0,0,0,0,0.2,85,10,5, 85,20, 5 ,180);

	SE("shot2");
	Wait(50);
	LaserSound;

	moveiddyea=1;
	Wait(190);
	MainTask2;
	let angle=0;
	let distance=0;
	let shots=0;
	loop{
		Ring(GetX,GetY,2,GetAngleToPlayer+sin(shots*90)*20);
		shots++;
		Wait(82);
	}
}
task MainTask2{
	let angle=0;
	loop{
		MainShot(GetX,GetY,3,1,angle);
		angle+=94;
		Wait(4);
	}
}
task MainShot(x,y,v1,v2,angle){
	x+=cos(angle+130)*80;
	y+=sin(angle+130)*80;
	DelayNew(x,y,angle,70,20,PURPLE21,30,50);
	Wait(30);
	CreateShot02(x,y,v1,angle,(v2-v1)/60,v2,PURPLE21,0);
}
task Ring(x,y,v,angle){
	WarningLaser(x,y,angle,500,70,PURPLE60,50,120,60);
	LaserSound2;
	let shotangle=0;
	loop(30){
		CreateShotA(0,x,y,0);
		SetShotDataA(0,0,1.8,shotangle,0,-1.8/60,0,SP05);
		SetShotDataA(0,60,0,angle+rand(-1,1),0,v/60,rand(v*0.85,v),SP05);
		if(rand_int(0,1)==0){
			SetShotDataA(0,rand(100,200),v,angle+rand(-3,3),0,-v/120,-v,SP04);
		}
		FireShot(0);
		shotangle+=360/30;
	}
}

function MultiLaser(x,y,a, xaccel,xv2,yaccel,yv2,spin, l,w,num,spacing,spawntime,graphic,acceltime){
	let colors=[0,1,2,4,5,6];
	spin*=0.55;
	loop(3){
		MainLaser(x,y,a,     xaccel,xv2,yaccel,yv2,spin*0.8,l-5,w,num,spacing,spawntime,RED23+colors[graphic],acceltime);
		MainLaser(x,y,a+190, xaccel,xv2,yaccel,yv2,spin*1.5,l-5,w,num,spacing+5,spawntime,RED23+colors[(graphic+3)%6],acceltime*1.2);
		a+=120;
	}
}

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

	if(moveiddyea==1){
		SetX(GetX+(GetPlayerX-GetX)/300);
	}

	IddyeaDrawLogic;

	yield;

}

@DrawLoop {
	IddyeaDrawLoop;
}

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


task MainLaser(x,y,a, xaccel,xv2,yaccel,yv2,spin, l,w,num,spacing,spawntime,graphic,acceltime){
    WarningLaser(x,y,a,500,10,WHITE60,190,50,num*spawntime);

    Wait(50);


    let addspacing=0.2;
    spacing+=spacing*addspacing;

    let obj = [];
    let frame=0;
    let size=100;
    let kk=0;

    loop(num){
	obj=obj~[InitLaser(x,y,a,l,w,spacing,spawntime,graphic,kk)];
	kk++;
    }
    let frame=0;
    let xv=0;
    let yv=0;
    let xa=xv2/xaccel;
    let ya=yv2/yaccel;
    let angleaccel=spin/acceltime;
    let anglespeed=0;
    loop{
	kk=0;
	loop(num){
		if(frame>=kk*((l/spacing)*spawntime)){
			MoveLaser(obj[kk],trunc(x),trunc(y),a,spacing,kk);
		}
		kk++;
	}
	if((xv<xv2&&xv2>0) || (xv>xv2&&xv2<0)){xv+=xa;}
	if((yv<yv2&&yv2>0) || (yv>yv2&&yv2<0)){yv+=ya;}
	x+=xv;
	y+=yv;
	
	a+=anglespeed;
	if(frame>num*spawntime){
		anglespeed+=angleaccel;
	}
	if(anglespeed>spin){
		anglespeed=spin;
	}

	frame++;
	yield;
    }
}

function InitLaser(x,y,a,l,w,spacing,spawntime,graphic,index){
	let obj=Obj_Create(OBJ_LASER);
	InitLaser2(obj,x,y,a,l,w,spacing,spawntime,graphic,index);
	return obj;
}
task InitLaser2(obj,x,y,a,l,w,spacing,spawntime,graphic,index){
	let spawntime2=(l/spacing)*spawntime;
	ObjLaser_SetSource(obj,false);
	Obj_SetAutoDelete(obj,false);
	Obj_SetSpeed(obj, 0);
	ObjShot_SetGraphic(obj, graphic);
	ObjShot_SetDelay(obj, 0);
	Obj_SetAngle(obj, a);
	ObjShot_SetBombResist(obj,true);
	ObjLaser_SetWidth(obj,w);
	ObjLaser_SetLength(obj,l);
	Obj_SetPosition(obj,-100,-100);
	Wait(spawntime2*index);
	Obj_SetPosition(obj, x+cos(a)*spacing*index,y+sin(a)*spacing*index);
	let lengthadd=l/spawntime2;
	let l2=0;
	let loops=0;
	loop(spawntime){
		if(loops<spawntime2){
			ObjLaser_SetLength(obj,l2);
			l2+=lengthadd;
		}
		yield;
		if(loops%2==0){
			AppearEffect(Obj_GetX(obj)+cos(Obj_GetAngle(obj))* (loops*(spacing/spawntime)) ,Obj_GetY(obj)+sin(Obj_GetAngle(obj))* (loops*(spacing/spawntime)) ,10);
		}
		loops++;
	}
	ObjLaser_SetLength(obj,l);
}
function MoveLaser(obj,x,y,a,spacing,index){
	x-=cos(a)*(100-spacing)*0.5; //center the lazer
	y-=sin(a)*(100-spacing)*0.5;
	Obj_SetPosition   (obj, x+cos(a)*spacing*index,y+sin(a)*spacing*index);
	Obj_SetAngle(obj,a);
}
}