task enyDjTestFairy(x,y) {
	let obj = summonFairy(x,y,10,SMALL_AFRO_RED);
}

// Scrambling fairies 00
task enyDjFlightFairy00(beginX,beginY,type,travel,side) { 
	let obj = summonFairy(beginX,beginY,3,type);
	ObjMove_SetDestAtSpeed(obj,beginX,beginY+travel,4);
	fireDjFlightFairyShot00(obj);
	patternFlightFairy(obj,side);
}

// Scrambling fairies 01 (no laser)
task enyDjFlightFairy01(beginX,beginY,type,travel,side) { 
	let obj = summonFairy(beginX,beginY,3,type);
	ObjMove_SetDestAtSpeed(obj,beginX,beginY+travel,4);
	fireDjFlightFairyShot01(obj);
	fireDjFlightFairyBackshot00(obj);
	patternFlightFairy(obj,side);
}

// Scrambling fairies 02 (fires lasers)
task enyDjFlightFairy02(beginX,beginY,type,travel,side) { 
	let obj = summonFairy(beginX,beginY,3,type);
	ObjMove_SetDestAtSpeed(obj,beginX,beginY+travel,4);
	fireDjFlightFairyLaser00(obj);
	patternFlightFairy(obj,side);
}

// Scramble movement
task patternFlightFairy(obj,side) {
	ObjMove_AddPatternA2(obj,0,4,90,0,side,4);	
}

// Curving ball.
task enyTrainBall(beginX,beginY,side,type,startdir) {
	let obj = summonBalls(beginX,beginY,1,type);
	if(side == "right") { patternCurveRight(obj,beginX,beginY); }
	if(side == "left") { patternCurveLeft(obj,beginX,beginY); } 
	fireTrainBallShot00(obj,startdir,side);
}

// Appearing from right 
task patternCurveRight(obj,x,y) {
	let r = 256;
	let r2 = 128;
	let dir = 225;
	Obj_SetValue(obj,"isHidden",true);
	loop(60) {
		ObjMove_SetPosition(obj,GetClipMaxX-r*cos(dir+45),GetCenterY-96+r2*sin(dir+90));
		if(r < 256) { r+=2; } 
		dir+=1.5;
		yield;
	}
	Obj_SetValue(obj,"isHidden",false);
	ObjMove_SetSpeed(obj,3);
	ObjMove_SetAngle(obj,90); 
}

// Appearing from left 
task patternCurveLeft(obj,x,y) {
	let r = 256;
	let r2 = 128;
	let dir = 225;
	Obj_SetValue(obj,"isHidden",true);
	loop(60) {
		ObjMove_SetPosition(obj,GetClipMinX+r*cos(dir+45),GetCenterY-96+r2*sin(dir+90));
		if(r < 256) { r+=2; } 
		dir+=1.5;
		yield;
	}
	Obj_SetValue(obj,"isHidden",false);
	ObjMove_SetSpeed(obj,3);
	ObjMove_SetAngle(obj,90); 
}

// Appearing balls plain appear
task enyDjBallAppear00(beginX,beginY,type,side) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);
	wait(30);
	let obj = summonBalls(beginX,beginY,8,type);
	fireDjBallAppearShot00(obj);
	patternBallCity(obj,side);
}

// pattern which makes them spin around from the city 
task patternBallCity(obj,side) {
	let dir = 0;
	let r = 0;
	
	if(side == "left") {
		dir = atan2(ObjMove_GetY(obj)-ObjMove_GetY(obj)-32,ObjMove_GetX(obj)-ObjMove_GetX(obj));
		r = GetDistanceXY(ObjMove_GetX(obj),ObjMove_GetY(obj)-32,ObjMove_GetX(obj),ObjMove_GetY(obj));
		loop(128) { 
			ObjMove_SetDestAtSpeed(obj,GetCenterX+r*cos(dir),GetCenterY+r*sin(dir),3); 
			dir+=2; 
			r+=2;
			yield; 
		} 		
	} 
	if(side == "right") {
		dir = atan2(ObjMove_GetY(obj)-ObjMove_GetY(obj)+32,ObjMove_GetX(obj)-ObjMove_GetX(obj));
		r = GetDistanceXY(ObjMove_GetX(obj),ObjMove_GetY(obj)+32,ObjMove_GetX(obj),ObjMove_GetY(obj));
		loop(128) { 
			ObjMove_SetDestAtSpeed(obj,GetCenterX+r*cos(dir),GetCenterY+r*sin(dir),3); 
			dir+=2; 
			r+=2;
			yield; 
		} 		
		
	} 
	ObjMove_SetAngle(obj,dir); 
	ObjMove_SetSpeed(obj,3);
}

// Fairy using a wave of familiars revolving
task enyDjFairyFamWave(beginX,beginY,type,typefam,spins,travelX) {
	let obj = summonFairy(beginX, beginY, 10, type);
	let dir = 180;

	setFairyInvulnerability(obj, 120);
	ObjMove_SetDestAtSpeed(obj,ObjMove_GetX(obj)+travelX,GetCenterY-64,1);
	wait(15);
	fireDjFairyFamShot00(obj);

	ascent(i in 0..5) {
		let objFam = summonFamiliar(10,typefam,obj);
		patternFamSpin(objFam,obj,dir,48,spins);
		fireDjFairyFamShot01(objFam);
		dir+=32;
	}
}

// Ace large fairy fighter
task enyDjAceFairy(beginX,beginY,travel,side) {
	let obj = summonFairy(beginX,beginY,15,LARGE_NORM);
	
	let objFam = summonFamiliar(8,FAM_RED,obj);
	let objFam2 = summonFamiliar(8,FAM_RED,obj);
	let objFam3 = summonFamiliar(8,FAM_RED,obj);
	let objFam4 = summonFamiliar(8,FAM_RED,obj);
	
	patternFireFamMis(obj,objFam,-16,-8,60);
	patternFireFamMis(obj,objFam2,-48,-16,90);
	patternFireFamMis(obj,objFam3,16,-8,60);
	patternFireFamMis(obj,objFam4,48,-16,90);
	
	fireDjAceLaser00(obj,objFam);
	fireDjAceLaser00(obj,objFam2);
	fireDjAceLaser00(obj,objFam3);
	fireDjAceLaser00(obj,objFam4);

	ObjMove_SetDestAtSpeed(obj,beginX,beginY+travel,4);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	wait(100);
	fireDjAceMachinegun00(obj);
	patternFlightFairy(obj,side);
}

// Moves along the ace fairy then launches itself at the player 
task patternFireFamMis(obj,obj2,offsetX,offsetY,waiter) {
	loop(waiter) {
		ObjMove_SetPosition(obj2,ObjMove_GetX(obj)+offsetX,ObjMove_GetY(obj)+offsetY);
		yield;
	}
	PlaySFX(SFX_MISSILE);
	fireDjAceFamShot(obj2);
	ObjMove_SetSpeed(obj2,0);
	ObjMove_SetAcceleration(obj2,0.1);
	ObjMove_SetMaxSpeed(obj2,6);
	ObjMove_SetAngle(obj2,GetAngleToPlayer(obj2));
}

// Large fairy shooting rapid
task enyDjGunnerLarge(beginX,beginY,side,speed,dir) {
	let obj = summonFairy(beginX,beginY,10,AURA_RED);	
	fireDjGunner00(obj);
	patternGunnerCurve(obj,beginX,beginY,side,speed,dir);
	let famDir = 0;
	wait(60);
	ascent(i in 0..5) {
		let objFam = summonFamiliar(10,FAM_BLUE,obj);
		patternFamSpin(objFam,obj,famDir,48,1);
		famDir+=360/5;
	}
}

// Bow curve movement
task patternGunnerCurve(obj,x,y,side,speed,dir) { 
	ObjMove_AddPatternA2(obj,0,speed,dir,0,side,speed);	
} 	

// Regular fairy with basic movement
task enyDjFairy00(beginX,beginY,travelX,type,side) {
	let obj = summonFairy(beginX,beginY,1,type);
	
	ObjMove_SetDestAtWeight(obj,beginX+travelX,beginY,15,60);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	wait(15);
	fireDjFairyShot00(obj);
	if(side == "left") { ObjMove_SetDestAtSpeed(obj,GetClipMaxX+32,60,2); } 
	if(side == "right") { ObjMove_SetDestAtSpeed(obj,GetClipMinX-32,60,2); } 
} 

// Regular balls with zig-zag down movement
task enyDjBall00(beginX,beginY,gotoX,gotoY,type,side) {
	let obj = summonBalls(beginX,beginY,10,type);
	fireDjBallRevenge00(obj);
	fireDjBallRevenge00a(obj);
	ObjMove_SetDestAtWeight(obj,gotoX,gotoY,15,30);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	fireDjBallShot00(obj);
	while(!Obj_IsDeleted(obj)) { 
		if(side == "left") { 
			ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)+64,ObjMove_GetY(obj)+64,15,25);
			wait(60);
			ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)-64,ObjMove_GetY(obj)+64,15,25);
			wait(60);
			fireDjBallShot00(obj);		
		}
		if(side == "right") { 
			ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)-64,ObjMove_GetY(obj)+64,15,25);
			wait(60);
			ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)+64,ObjMove_GetY(obj)+64,15,25);
			wait(60);
			fireDjBallShot00(obj);			
		}
	}
}

// Regular fairy very speedy down then launching at player.
task enyDjFairy01(beginX,beginY,type) {
	let obj = summonFairy(beginX,beginY,10,type);
	fireDjSpeedTrail(obj);
	wait(45);
	ObjMove_SetDestAtWeight(obj,beginX,GetClipMaxY-16,15,60);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	fireDjFairyShot01(obj);
	wait(60);
	ObjMove_AddPatternA2(obj,0,0,GetAngleToPlayer(obj),0.12,0,5);
}

// Regular large fairy splitting lanes
task enyDjLargeFairy00(beginX,beginY,travelX) {
	let obj = summonFairy(beginX,beginY,35,LARGE_NORM);
	ObjMove_SetDestAtWeight(obj,beginX+travelX,GetCenterY-112,10,15);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	fireDjLaneSplit00(obj);
	fireDjLaneSplit01(obj);
	wait(90);
	ObjMove_SetDestAtSpeed(obj,ObjMove_GetX(obj)+travelX*10,ObjMove_GetY(obj)+112,2);	
}

// Stoplight fairy with familiars
task enyDjStopLightFairy(beginX,beginY,type) { 
	let obj = summonFairy(beginX,beginY,15,type);
	
	ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj),GetCenterY-112,15,30);
	wait(30);
	
	// left
	let objFam = summonFamiliar(15,FAM_RED,obj);
	let objFam2 = summonFamiliar(15,FAM_YELLOW,obj);
	let objFam3 = summonFamiliar(15,FAM_GREEN,obj);
		
	patternFamFreeStatic(objFam,obj,220,36);
	patternFamFreeStatic(objFam2,obj,180,28);
	patternFamFreeStatic(objFam3,obj,140,36);
	
	// right
	let objFam4 = summonFamiliar(15,FAM_RED,obj);
	let objFam5 = summonFamiliar(15,FAM_YELLOW,obj);
	let objFam6 = summonFamiliar(15,FAM_GREEN,obj);
		
	patternFamFreeStatic(objFam4,obj,320,36);
	patternFamFreeStatic(objFam5,obj,0,28);
	patternFamFreeStatic(objFam6,obj,40,36);	
	
	fireDjRedLightShot(objFam);
	fireDjRedLightShot(objFam4);
	
	fireDjYellowLightShot(objFam2);
	fireDjYellowLightShot(objFam5);
	
	fireDjGreenLightShot(objFam3,45);
	fireDjGreenLightShot(objFam6,135);
	
	wait(240);
	ObjMove_SetDestAtSpeed(obj,ObjMove_GetX(obj),ObjMove_GetY(obj)-512,2);
}

// Makes the familiars appear static and allows fixed setting.
task patternFamFreeStatic(obj,masterobj,dir,maxr) {
	let r = 0;
	while(!Obj_IsDeleted(obj)) { 
		ObjMove_SetPosition(obj,ObjMove_GetX(masterobj)+r*cos(dir),ObjMove_GetY(masterobj)+r*sin(dir));
		ObjMove_SetAngle(obj,dir);
		if(r < maxr) { r++; }
		yield;
	}	
} 

// Regular fairy 02 with sideway speedy movement
task enyDjFairy02(beginX,beginY,type,travelX,travelY) {
	let obj = summonFairy(beginX,beginY,1,type);
	ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)+travelX,ObjMove_GetY(obj),15,60);
	fireDjFairyShot02(obj);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	ObjMove_SetDestAtSpeed(obj,ObjMove_GetX(obj)+travelX*100,ObjMove_GetY(obj)+travelY,4);	
	wait(90);
}

// Appearing balls plain appear 02
task enyDjBall02(beginX,beginY,type) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);	
	wait(30);
	let obj = summonBalls(beginX,beginY,20,type);
	ObjMove_SetDestAtSpeed(obj,ObjMove_GetX(obj),ObjMove_GetY(obj),0);	
	fireDjBallShot02(obj);
	fireDjBallLaser02(obj);
	ObjMove_AddPatternA2(obj,0,0,270,0.01,0,5);
}

// Scramble movement
task patternTrainSwitch(obj,dir,side,speed) {
	ObjMove_AddPatternA2(obj,0,speed,dir,0,side,speed);	
}


// Fairy train
task enyDjFairyTrain00(beginX,beginY,type,dir,side,speed,turn) {
	let obj = summonFairy(beginX,beginY,1,type);
	ObjMove_SetAngle(obj,dir);
	ObjMove_SetSpeed(obj,speed);
	if(turn) {
		fireDjFairyTrainShot00(obj);
		wait(90);
		if(side == "left") { loop(18) { ObjMove_SetAngle(obj,ObjMove_GetAngle(obj)+5); yield; } }
		if(side == "right") { loop(18) { ObjMove_SetAngle(obj,ObjMove_GetAngle(obj)+5); yield; } }
	}
}

// Fairy car
task enyDjCarFairy00(beginX,beginY,dir,speed) {
	let obj = summonFairy(beginX,beginY,15,LARGE_NORM);
	ObjMove_SetAngle(obj,dir);
	ObjMove_SetSpeed(obj,speed);

	fireDjCarShot00(obj);
	wait(60);
	PlaySFX(SFX_POWER1);
	// left
	let objFam = summonFamiliar(15,FAM_RED,obj);
	let objFam3 = summonFamiliar(15,FAM_RED,obj);
	
	fireDjTireTrail(objFam); 
	fireDjTireTrail(objFam3); 
	
	patternFamFreeStatic(objFam,obj,220,36);
	patternFamFreeStatic(objFam3,obj,140,36);
	
	// right
	let objFam4 = summonFamiliar(15,FAM_RED,obj);
	let objFam6 = summonFamiliar(15,FAM_RED,obj);

	fireDjTireTrail(objFam4);
	fireDjTireTrail(objFam6); 
	
	patternFamFreeStatic(objFam4,obj,320,36); 
	patternFamFreeStatic(objFam6,obj,40,36);	

	ObjMove_SetMaxSpeed(obj,7);
	ObjMove_SetAcceleration(obj,0.04);
}

// Fairy car
task enyDjCarFairy01(beginX,beginY,dir,speed) {
	let obj = summonFairy(beginX,beginY,10,AURA_BLUE);
	ObjMove_SetAngle(obj,dir);
	ObjMove_SetSpeed(obj,speed);
	
	wait(30);
	// left
	let objFam = summonFamiliar(15,FAM_RED,obj);
	let objFam3 = summonFamiliar(15,FAM_RED,obj);
	
	fireDjTireTrail(objFam); fireDjCarFamShot00(objFam);
	fireDjTireTrail(objFam3); fireDjCarFamShot00(objFam3);
	
	patternFamFreeStatic(objFam,obj,220,36);
	patternFamFreeStatic(objFam3,obj,140,36);
	
	// right
	let objFam4 = summonFamiliar(15,FAM_RED,obj);
	let objFam6 = summonFamiliar(15,FAM_RED,obj);

	fireDjTireTrail(objFam4); fireDjCarFamShot00(objFam4);	
	fireDjTireTrail(objFam6); fireDjCarFamShot00(objFam6);	
	
	patternFamFreeStatic(objFam4,obj,320,36); 
	patternFamFreeStatic(objFam6,obj,40,36);	

	ObjMove_SetMaxSpeed(obj,7);
	ObjMove_SetAcceleration(obj,0.05);
}
