// Rushing balls which appear from side screen and rush fast forward at constant speed.
task enyAfroRushingBalls(beginX,beginY,endX,endY,type,speed,side) {
	let afroBall00 = summonBalls(beginX,beginY,1,type);
	patternRushingBalls(afroBall00,endX,endY,speed);
	fireAfroRushingBalls00(afroBall00,side);
}

// Rushing balls which appear from side screen and rush fast forward at constant speed.
task enyAfroRushingFairy00(beginX,beginY,endX,endY,type,speed,av) {
	let afroFairy00 = summonFairy(beginX,beginY,1,type);
	patternRushingBalls01(afroFairy00,endX,endY,speed,av);
	fireAfroRushingFairy01(afroFairy00);
}

// Train of rushing fairies with curving movement
task enyAfroRushingFairy01(beginX,beginY,endX,endY,type,speed,angle,av) {
	let afroFairy01 = summonFairy(beginX,beginY,1,type);
	patternRushingTrain(afroFairy01,endX,endY,speed,angle,av);
	fireAfroFastSlow(afroFairy01);
}

// Simple end destination X Y coordinates
task patternRushingBalls(obj,endX,endY,speed) {
	ObjMove_SetDestAtSpeed(obj,endX,endY,speed); 
} 

// Simple end destination X Y coordinates
task patternRushingBalls01(obj,endX,endY,speed,av) {
	ObjMove_SetDestAtSpeed(obj,endX,endY,speed);
	ObjMove_AddPatternA2(obj,15,speed,90,1.0,av,speed+1);	
} 

// Yin Yang balls going to the top to form a fake spotlight.
task enyAfroSpotBalls(beginX,beginY,endX,endY,type,side) {
	let afroBall01 = summonBalls(beginX,beginY,10,type);
	patternSpotLightPlacement(afroBall01,endX,endY,side);
	fireAfroSpotBall(afroBall01);
}

// Simple end destination X Y coordinates on weight
task patternSpotLightPlacement(obj,endX,endY,side) {
	ObjMove_SetDestAtWeight(obj,endX,endY,20,30);
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	wait(60);
	if(side == "left") { ObjMove_AddPatternA2(obj,0,0,90,0.5,1.0,4); }
	if(side == "right") { ObjMove_AddPatternA2(obj,0,0,90,0.5,-1.0,4); } 
} 

// Large afro fairy
task enyAfroSpotFairy(beginX,beginY,endX,endY,type,side) {
	let afroLarge00 = summonFairy(beginX,beginY,20,type);
	patternSpotLightPlacement(afroLarge00,endX,endY,side);
	wait(60);
	fireAfroSpotFairy00(afroLarge00);
	if(GetAreaCommonData("game","difficulty",0) > 0) { 
		let objFam = summonFamiliar(4,FAM_RED,afroLarge00);
		patternFamThrow(objFam,afroLarge00,0,3,GetAngleToPlayer(afroLarge00),0.05);	
		fireAfroSpotFairyFam(objFam);	
	}
}

// Rushing movement with curve
task patternRushingTrain(obj,endX,endY,speed,angle,av) {
	ObjMove_SetDestAtSpeed(obj,endX,endY,speed); 
	ObjMove_AddPatternA2(obj,60,speed,angle,1.0,av,speed+1);
}

// Appearing balls with swirling appearance
task enyAfroBallAppear(beginX,beginY,type) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);
	wait(30);
	let afroBall02 = summonBalls(beginX,beginY,5,type);
	patternBallSwirlAppear(afroBall02,beginX,beginY);
	fireAfroAppearingShot00(afroBall02);
}

// Appear ball movement with a small swirl
task patternBallSwirlAppear(obj,beginX,beginY) {
	ObjMove_AddPatternA2(obj,0,1.2,270,1,8,1.2);
	ObjMove_AddPatternA2(obj,45,0,270,0,0,0);
	ObjMove_AddPatternA2(obj,60,0,GetAngleToPlayer(obj),0.05,0,4);
}

// Appears from a side, briefly moves into the field > stops and then rapidly accelerates to leave
task enyAfroStopAndGoFairy(beginX,beginY,type,moveUnits,sideAngle) {
	let afroFairy02 = summonFairy(beginX,beginY,2,type);
	ObjMove_SetDestAtWeight(afroFairy02,ObjMove_GetX(afroFairy02)+moveUnits,ObjMove_GetY(afroFairy02),5,10); 
	while(ObjMove_GetSpeed(afroFairy02) > 0) { yield; } 
	fireAfroStopGoShot(afroFairy02);
	wait(20);
	ObjMove_SetSpeed(afroFairy02,0);
	ObjMove_SetAcceleration(afroFairy02,0.2);
	ObjMove_SetMaxSpeed(afroFairy02,4);
	ObjMove_SetAngle(afroFairy02,sideAngle);
}

// Multi familiar user fairy
task enyAfroMultiFamFairy(beginX,beginY,endX,endY,fams,typefam) { 
	let objEny = summonFairy(beginX,beginY,10,AURA_BLUE);
	let dir = 0;

	ascent(i in 0..fams) { 
		if(Obj_IsDeleted(objEny)) { break; } 
		let famFairy00a = summonFamiliar(5,typefam,objEny);
		patternFamSpin(famFairy00a,objEny,dir,32,3);				// Code for revolving fams is inside movementFairyStage01
		dir+=360/fams;
	}
	ObjMove_SetDestAtWeight(objEny,endX,endY,10,30);	
	while(ObjMove_GetSpeed(objEny) > 0) { yield; } 
	fireAfroMultiFamFairyShot(objEny);
	wait(240); 
	ObjMove_SetDestAtSpeed(objEny,GetCenterX,GetClipMinY-64,2);	
} 

// Appearing balls plain appear
task enyAfroBallAppear01(beginX,beginY,type) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);
	wait(30);
	let afroBall03 = summonBalls(beginX,beginY,2,type);
	patternLaunchAtPlayer(afroBall03);
	fireAfroBallsOutShot01(afroBall03);
	fireAfroRevengeBallShot(afroBall03);
}

// Launches at the player after 60 frames
task patternLaunchAtPlayer(obj) {
	wait(60);
	ObjMove_AddPatternA2(obj,0,0,GetAngleToPlayer(obj),0.1,0,4);
}

// Large fairy using circle of familiars. 
task enyAfroFeverLargeFairy(beginX,beginY,endX,endY,type,typefam,fams,side) {
	let afroLargeFairy00 = summonFairy(beginX,beginY,25,type);
	let dir = 270;
	ObjMove_SetDestAtWeight(afroLargeFairy00,endX,endY,10,30);	
	fireAfroLaserWheelShot(afroLargeFairy00,side);
	while(ObjMove_GetSpeed(afroLargeFairy00) > 0) { yield; } 
	ascent(i in 0..fams) { 
		if(Obj_IsDeleted(afroLargeFairy00)) { break; } 
		let famFairy01 = summonFamiliar(5,typefam,afroLargeFairy00);
		fireAfroLaserFamShot(famFairy01,side);
		patternFamStatic(famFairy01,afroLargeFairy00,dir,48);				// Code for revolving fams is inside movementFairyStage01
		dir+=360/fams;
	}
	wait(240);
	ObjMove_SetDestAtSpeed(afroLargeFairy00,ObjMove_GetX(afroLargeFairy00),ObjMove_GetY(afroLargeFairy00)-180,3);	
}

// Makes the familiars appear static around the fairy user, allows to specify starting angle
task patternFamStatic(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;
	}
} 

// Appearing balls plain appear 02
task enyAfroBallAppear02(beginX,beginY,type) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);
	wait(30);
	let afroBall03 = summonBalls(beginX,beginY,10,type);
	patternLaunchAtPlayer(afroBall03);
	fireAfroBallsOutShot00(afroBall03);
}

// Pattern for just moving up (no idea why even, it was some other code before. 
task patternMoveUp(obj) { 
	ObjMove_SetSpeed(obj,1);
	ObjMove_SetAngle(obj,270);
}

// Rocket fairy which moves in a straight path. 
task enyAfroRocketFairy00(beginX,beginY,endX,endY,type,speed) {
	let obj = summonFairy(beginX,beginY,5,type);

	ObjMove_SetDestAtSpeed(obj,endX,endY,speed);	
	fireAfroRocketTrail(obj);
	fireAfroRocketTrail(obj);
	fireAfroRocketSpray00(obj);
} 

// Rocket fairy which moves in a straight path. 
task enyAfroRocketFairy01(beginX,beginY,endX,endY,type,speed) {
	let obj = summonFairy(beginX,beginY,10,type);

	ObjMove_SetDestAtSpeed(obj,endX,endY,speed);	
	fireAfroRocketTrail(obj);
	fireAfroRocketTrail(obj);
	fireAfroRocketSpray01(obj);
} 

// Rocket fairy which moves in a straight path. 
task enyAfroRocketFairy02(beginX,beginY,type,offset,side) {
	let obj = summonFairy(beginX,beginY,2,type);

	patternAfroRocketBoost00(obj,offset,side);
	fireAfroRocketTrail(obj);
	fireAfroRocketTrail(obj);
	fireAfroRocketSpray02(obj,side);
} 

// Large afro fever fairy
task enyAfroFeverFairy00(beginX,beginY,endX,endY,type,side) {
	let obj = summonFairy(beginX,beginY,20,type);
	patternSpotLightPlacement(obj,endX,endY,side);
	wait(45);
	fireAfroFeverStars00(obj,side);
}

// Rocket fairy movement, slow entrance then boosting away
task patternAfroRocketBoost00(obj,offset,side) { 
	if(side == "right") { 
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)+72+offset,ObjMove_GetY(obj),15,20);	
		ObjMove_AddPatternA2(obj,60,1,GetAngleToPlayer(obj),0.2,0.2,2);
		ObjMove_AddPatternA2(obj,90,1,10,0.2,0.2,4);
	}
	if(side == "left") { 
		ObjMove_SetDestAtWeight(obj,ObjMove_GetX(obj)-72-offset,ObjMove_GetY(obj),15,20);	
		ObjMove_AddPatternA2(obj,60,1,GetAngleToPlayer(obj),0.2,0.2,2);
		ObjMove_AddPatternA2(obj,90,1,170,0.2,-0.2,4);
	}	
}

// Curving ball.
task enyAfroCurveBall(beginX,beginY,side,type) {
	let afroBall04 = summonBalls(beginX,beginY,1,type);
	if(side == "right") { patternCurveFastRight(afroBall04,beginX,beginY); }
	if(side == "left") { patternCurveFastLeft(afroBall04,beginX,beginY); } 
	fireCurveBallShot00(afroBall04);
}

// Appearing from right 
task patternCurveFastRight(obj,x,y) {
	let r = 256;
	let r2 = 128;
	let dir = 225;

	while(!Obj_IsDeleted(obj)) {
		ObjMove_SetPosition(obj,GetClipMaxX-r*cos(dir+45),GetCenterY-96+r2*sin(dir+90));
		if(r < 256) { r+=2; } 
		dir+=1.5;
		yield;
	}
}

// Appearing from left 
task patternCurveFastLeft(obj,x,y) {
	let r = 256;
	let r2 = 128;
	let dir = 225;

	while(!Obj_IsDeleted(obj)) {
		ObjMove_SetPosition(obj,GetClipMinX+r*cos(dir+45),GetCenterY-96+r2*sin(dir+90));
		if(r < 256) { r+=2; } 
		dir+=1.5;
		yield;
	}
}

// Appearing balls plain appear
task enyAfroBallAppear03(beginX,beginY,type) {
	enySummonEffect(beginX,beginY,0.01,0.01,type);
	wait(30);
	let afroBall04 = summonBalls(beginX,beginY,1,type);
	patternLaunchAtPlayer01(afroBall04);
	fireAfroAppearingShot00(afroBall04);
	fireAfroRevengeBallShot(afroBall04);
}

// Launches at the player after 60 frames
task patternLaunchAtPlayer01(obj) {
	ObjMove_AddPatternA2(obj,0,0,GetAngleToPlayer(obj),0.12,0,5);
}

// Large afro fam fairy with revolving fams
task enyAfroFeverLargeFairy01(beginX,beginY,endX,endY,type,typefam,fams,typefam2,fams2,side) {
	let afroLargeFairy01 = summonFairy(beginX,beginY,30,type);
	let dir = 270;
	
	ascent(i in 0..fams) { 
		if(Obj_IsDeleted(afroLargeFairy01)) { break; } 
		let famFairy02a = summonFamiliar(10,typefam,afroLargeFairy01);
		if(side == "left") { patternFamSpin(famFairy02a,afroLargeFairy01,dir,60,-5);	}
		if(side == "right") { patternFamSpin(famFairy02a,afroLargeFairy01,dir,60,5);	}
		fireAfroFeverFamShot00(famFairy02a);
		dir+=360/fams;
	}
	ascent(i in 0..fams2) { 
		if(Obj_IsDeleted(afroLargeFairy01)) { break; } 
		let famFairy02b = summonFamiliar(10,typefam2,afroLargeFairy01);
		if(side == "left") { patternFamSpin(famFairy02b,afroLargeFairy01,dir,32,5); } 
		if(side == "right") { patternFamSpin(famFairy02b,afroLargeFairy01,dir,32,-5); }
		dir+=360/fams2;
		fireAfroFeverShot00(famFairy02b);
	}	
	ObjMove_SetDestAtWeight(afroLargeFairy01,endX,endY,10,10);	
	wait(30);	
	if(side == "left") { ObjMove_SetDestAtSpeed(afroLargeFairy01,ObjMove_GetX(afroLargeFairy01)+640,ObjMove_GetY(afroLargeFairy01)+96,1); }
	if(side == "right") { ObjMove_SetDestAtSpeed(afroLargeFairy01,ObjMove_GetX(afroLargeFairy01)-640,ObjMove_GetY(afroLargeFairy01)+96,1); }
}

task enyAfroFeverLargeFairy02(beginX,beginY,endX,endY,type,typefam,fams,typefam2,fams2,side) {
	let afroLargeFairy01 = summonFairy(beginX,beginY,30,type);
	Obj_SetValue(afroLargeFairy01,"dropID","spell"); 
	
	let dir = 270;
	
	ascent(i in 0..fams) { 
		if(Obj_IsDeleted(afroLargeFairy01)) { break; } 
		let famFairy02a = summonFamiliar(10,typefam,afroLargeFairy01);
		if(side == "left") { patternFamSpin(famFairy02a,afroLargeFairy01,dir,60,-5);	}
		if(side == "right") { patternFamSpin(famFairy02a,afroLargeFairy01,dir,60,5);	}
		fireAfroFeverFamShot00(famFairy02a);
		dir+=360/fams;
	}
	ascent(i in 0..fams2) { 
		if(Obj_IsDeleted(afroLargeFairy01)) { break; } 
		let famFairy02b = summonFamiliar(10,typefam2,afroLargeFairy01);
		if(side == "left") { patternFamSpin(famFairy02b,afroLargeFairy01,dir,32,5); } 
		if(side == "right") { patternFamSpin(famFairy02b,afroLargeFairy01,dir,32,-5); } 
		dir+=360/fams2;
		fireAfroFeverShot00(famFairy02b);
	}	
	ObjMove_SetDestAtWeight(afroLargeFairy01,endX,endY,10,10);	
	wait(30);	
	if(side == "left") { ObjMove_SetDestAtSpeed(afroLargeFairy01,ObjMove_GetX(afroLargeFairy01)+640,ObjMove_GetY(afroLargeFairy01)+96,1); }
	if(side == "right") { ObjMove_SetDestAtSpeed(afroLargeFairy01,ObjMove_GetX(afroLargeFairy01)-640,ObjMove_GetY(afroLargeFairy01)+96,1); }
}

// Left U train
task enyAfroLeftU {
	ascent(i in 0..8) {
		let balFairy03a = summonFairy(GetCenterX-160,GetClipMinX-16,1,SMALL_AFRO_RED);
		patternUTurn(balFairy03a,"left");
		fireAfroFastSlow(balFairy03a);
		wait(15);
	}
}

// Right U turn
task enyAfroRightU { 
	ascent(i in 0..8) {
		let balFairy03a = summonFairy(GetCenterX+160,GetClipMinX-16,1,SMALL_AFRO_BLUE);
		patternUTurn(balFairy03a,"right");
		fireAfroFastSlow(balFairy03a);
		wait(15);
	}
} 

// Makes the fairies perform a turn, using the center as pivot point.
task patternUTurn(obj,side) {
	let r = 0; 
	let dir = 0;
	if(side == "left") { ObjMove_SetDestAtSpeed(obj,GetCenterX-160,GetCenterY,4); }
	if(side == "right") { ObjMove_SetDestAtSpeed(obj,GetCenterX+160,GetCenterY,4); }
	while(ObjMove_GetSpeed(obj) > 0) { yield; } 
	dir = atan2(ObjMove_GetY(obj)-GetCenterY,ObjMove_GetX(obj)-GetCenterX);
	r = GetDistanceXY(ObjMove_GetX(obj),ObjMove_GetY(obj),GetCenterX,GetCenterY);
	loop(200) { 
		ObjMove_SetDestAtSpeed(obj,GetCenterX+r*cos(dir),GetCenterY+r*sin(dir),4); 
		if(side == "left") { dir-=2; }
		if(side == "right") { dir+=2; } 
		yield; 
	} 
	ObjMove_SetAngle(obj,90); 
	ObjMove_SetSpeed(obj,3);
} 
