// --------------------- Notes -----------------------------------
// Difficulty reminder > 0 = Normal, 1 = Hard, 2 = Lunatic
//

// Laser shots for the spot balls
task fireAfroSpotBall(obj) {
	wait(60);
	let dir = 90;
	let dir2 = 270;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..8) { 
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_LAZER01);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir+90),ObjMove_GetY(obj)+16*sin(dir+90),3,dir,128,8,3,5,1,0,false,true);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir-90),ObjMove_GetY(obj)+16*sin(dir-90),3,dir+180,128,8,4,5,1,0,false,true);
			dir+=360/8;
		}
		loop(60) { if(Obj_IsDeleted(obj)) { break; } yield; }
		ascent(i in 0..12) { 
			if(Obj_IsDeleted(obj)) { break; }
			ascent(j in 0..3) { 
				let glowBullet00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir2,240,10);
				ObjMove_AddPatternA2(glowBullet00,0,2,dir2,0,0.2,2);
				dir2+=360/3;
			}	
			wait(30);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..12) { 
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_LAZER01);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir+90),ObjMove_GetY(obj)+16*sin(dir+90),3,dir,128,8,3,5,1,0,false,true);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir-90),ObjMove_GetY(obj)+16*sin(dir-90),3,dir+180,128,8,4,5,1,0,false,true);
			dir+=22;
			wait(3);
		}
		loop(60) { if(Obj_IsDeleted(obj)) { break; } yield; }
		ascent(i in 0..12) { 
			if(Obj_IsDeleted(obj)) { break; }
			ascent(j in 0..5) { 
				let glowBullet00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir2,240,10);
				ObjMove_AddPatternA2(glowBullet00,0,2,dir2,0,0.2,2);
				dir2+=360/5;
			}	
			wait(30);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..18) { 
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_LAZER01);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir+90),ObjMove_GetY(obj)+16*sin(dir+90),3,dir,128,8,3,5,1,0,false,true);
			CreateSpecialLaser01(ObjMove_GetX(obj)+16*cos(dir-90),ObjMove_GetY(obj)+16*sin(dir-90),3,dir+180,128,8,4,5,1,0,false,true);
			dir+=22;
			wait(3);
		}
		loop(60) { if(Obj_IsDeleted(obj)) { break; } yield; }
		ascent(i in 0..18) { 
			if(Obj_IsDeleted(obj)) { break; }
			ascent(j in 0..6) { 
				let glowBullet00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir2,240,10);
				ObjMove_AddPatternA2(glowBullet00,0,2,dir2,0,0.2,2);
				dir2+=360/6;
			}	
			wait(30);
		}	
	}
}

// Star shot for the spot large fairy
task fireAfroSpotFairy00(obj) {
	let dir = 270;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(j in 0..2) { 
			if(Obj_IsDeleted(obj)) { break; } 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot00,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot00,45-i,0,dir,4.5,0.5,3,136);
				SetShotDataA(SpotFairyShot00,90-i,0,dir,0.5,0.5,3,136);
				
				let SpotFairyShot01 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot01,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot01,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot01,45-i,0,dir,-4.5,0.5,3,136);	
				SetShotDataA(SpotFairyShot01,90-i,0,dir,-0.5,0.5,3,136);				
				dir+=360/24;
				wait(1);
			}
			wait(5);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(j in 0..3) { 
			if(Obj_IsDeleted(obj)) { break; } 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot00,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot00,45-i,0,dir,4.5,0.5,3,136);
				SetShotDataA(SpotFairyShot00,90-i,0,dir,0.5,0.5,3,136);
				
				let SpotFairyShot01 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot01,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot01,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot01,45-i,0,dir,-4.5,0.5,3,136);	
				SetShotDataA(SpotFairyShot01,90-i,0,dir,-0.5,0.5,3,136);				
				dir+=360/24;
				wait(1);
			}
			wait(5);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(j in 0..3) { 
			if(Obj_IsDeleted(obj)) { break; } 
			ascent(i in 0..36) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot00,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot00,45-i,0,dir,4.5,0.5,3,136);
				SetShotDataA(SpotFairyShot00,90-i,0,dir,0.5,0.5,3,136);
				
				let SpotFairyShot01 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
				SetShotDataA(SpotFairyShot01,0,3,dir,0,0,3,136);
				SetShotDataA(SpotFairyShot01,15,0,dir,0,0,0,136);
				SetShotDataA(SpotFairyShot01,45-i,0,dir,-4.5,0.5,3,136);	
				SetShotDataA(SpotFairyShot01,90-i,0,dir,-0.5,0.5,3,136);				
				dir+=360/36;
				wait(1);
			}
			wait(5);
		}	
	}
}

// Dagger shot for familiar spinning down
task fireAfroSpotFairyFam(obj) {
	let dir = 270;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) { 
			if(Obj_IsDeleted(obj)) { break; } 
			let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
			SetShotDataA(SpotFairyShot00,0,1,dir,0,0,1,77);
			SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,77);
			SetShotDataA(SpotFairyShot00,45,1,dir,0,0.02,2,77);
			dir+=360/16;
			wait(5);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) { 
			if(Obj_IsDeleted(obj)) { break; } 
			let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
			SetShotDataA(SpotFairyShot00,0,1,dir,0,0,1,77);
			SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,77);
			SetShotDataA(SpotFairyShot00,45,1,dir,0,0.02,2,77);
			dir+=360/16;
			wait(2);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) { 
			if(Obj_IsDeleted(obj)) { break; } 
			let SpotFairyShot00 = CreateShotA(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),10); 
			SetShotDataA(SpotFairyShot00,0,1,dir,0,0,1,77);
			SetShotDataA(SpotFairyShot00,15,0,dir,0,0,0,77);
			SetShotDataA(SpotFairyShot00,45,2,dir,0,0.02,2,77);
			dir+=360/16;
			wait(2);
		}	
	}
}

// Fires 3-way fast bullet which slows down after certain frames
task fireAfroFastSlow(obj) {
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..3) { 
			if(Obj_IsDeleted(obj)) { break; } 	
			PlaySFX(SFX_TAN00);	
			let FastSlowShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)-15,41,10);
			ObjMove_AddPatternA2(FastSlowShot00,30,5,NO_CHANGE,-0.5,0,1);
			let FastSlowShot01 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj),41,10);
			ObjMove_AddPatternA2(FastSlowShot01,30,5,NO_CHANGE,-0.5,0,1);
			let FastSlowShot02 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)+15,41,10);
			ObjMove_AddPatternA2(FastSlowShot02,30,5,NO_CHANGE,-0.5,0,1);
			wait(90);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) {
		ascent(i in 0..3) { 
			if(Obj_IsDeleted(obj)) { break; } 	
			PlaySFX(SFX_TAN00);	
			let FastSlowShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,GetAngleToPlayer(obj)-15,41,10);
			ObjMove_AddPatternA2(FastSlowShot00,30,6,NO_CHANGE,-0.5,0,1);
			let FastSlowShot01 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,GetAngleToPlayer(obj),41,10);
			ObjMove_AddPatternA2(FastSlowShot01,30,6,NO_CHANGE,-0.5,0,1);
			let FastSlowShot02 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,GetAngleToPlayer(obj)+15,41,10);
			ObjMove_AddPatternA2(FastSlowShot02,30,6,NO_CHANGE,-0.5,0,1);
			wait(90);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		let dir = GetAngleToPlayer(obj);
		ascent(i in 0..5) { 
			dir = GetAngleToPlayer(obj);
			ascent(j in 0..5) { 
				if(Obj_IsDeleted(obj)) { break; } 	
				PlaySFX(SFX_TAN00);	
				let FastSlowShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,dir-1,41,10);
				ObjMove_AddPatternA2(FastSlowShot00,30,6,NO_CHANGE,-0.5,0,3);
				let FastSlowShot01 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,dir,41,10);
				ObjMove_AddPatternA2(FastSlowShot01,30,6,NO_CHANGE,-0.5,0,3);
				let FastSlowShot02 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,dir+1,41,10);
				ObjMove_AddPatternA2(FastSlowShot02,30,6,NO_CHANGE,-0.5,0,3);
				dir+=360/5;
			}
			wait(30);
		}	
	}
}

// Fires large rounds bullet right upon appearing
task fireAfroAppearingShot00(obj) {
	let dir = rand_int(0,359);
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..5) { 
			if(Obj_IsDeleted(obj)) { break; } 	
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir,207,15);
			dir+=360/5;
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..8) { 
			if(Obj_IsDeleted(obj)) { break; } 	
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,207,15);
			dir+=360/8;
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..5) { 
			if(Obj_IsDeleted(obj)) { break; } 	
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir+12,207,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,207,15);
			dir+=360/5;
		}	
	}
}

// Revenge shot
task fireAfroRevengeBallShot(obj) {
	let dir = 0;
	let deathX = 0;
	let deathY = 0;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) {	
			deathX = ObjMove_GetX(obj);
			deathY = ObjMove_GetY(obj);
			
			if(ObjEnemy_GetInfo(obj,INFO_LIFE) < 1) {
				PlaySFX(SFX_TAN01);
				ascent(i in 0..5) { 
					CreateShotA1(deathX,deathY,2,dir,230,0);
					dir+=360/5;
				}
				break;
			}			
			yield;
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) {	
			deathX = ObjMove_GetX(obj);
			deathY = ObjMove_GetY(obj);
			
			if(ObjEnemy_GetInfo(obj,INFO_LIFE) < 1) {
				PlaySFX(SFX_TAN01);
				ascent(i in 0..5) { 
					CreateShotA1(deathX,deathY,3,dir,230,0);
					dir+=360/5;
				}
				break;
			}			
			yield;
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) {	
			deathX = ObjMove_GetX(obj);
			deathY = ObjMove_GetY(obj);
			
			if(ObjEnemy_GetInfo(obj,INFO_LIFE) < 1) {
				PlaySFX(SFX_TAN01);
				ascent(i in 0..5) { 
					CreateShotA1(deathX,deathY,4,dir,230,0);
					dir+=360/5;
				}
				break;
			}			
			yield;
		}	
	}
}

// Fire curtain of icicles for rushing balls
task fireAfroRushingBalls00(obj,side) {
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		if(side == "right") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);					
				ascent(i in 0..3) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2+i/3,285,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2+i/3,105,91,10);
					wait(1);
				}
				wait(10);
			}	
		}	
		if(side == "left") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				ascent(i in 0..3) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2+i/3,260,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2+i/3,80,91,10);
					wait(1);
				}
				wait(10);
			}	
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		if(side == "right") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);					
				ascent(i in 0..3) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,285,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,105,91,10);
					wait(1);
				}
				wait(10);
			}	
		}	
		if(side == "left") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				ascent(i in 0..3) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,260,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,80,91,10);
					wait(1);
				}
				wait(10);
			}	
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		if(side == "right") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);		
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj),135,10);				
				ascent(i in 0..4) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,285,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3+i/3,105,91,10);
					wait(1);
				}
				wait(10);
			}	
		}	
		if(side == "left") { 
			ascent(i in 0..24) { 
				if(Obj_IsDeleted(obj)) { break; } 
				PlaySFX(SFX_TAN00);	
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),6,GetAngleToPlayer(obj),135,10);	
				ascent(i in 0..4) { 
					if(Obj_IsDeleted(obj)) { break; } 
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3.5+i/3,260,91,10);
					CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3.5+i/3,80,91,10);
					wait(1);
				}
				wait(10);
			}	
		}	
	}
}

// Stop and go fairy shots. 
task fireAfroStopGoShot(obj) {
	let dir = GetAngleToPlayer(obj);
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		loop(4) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir-24,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir-12,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir+12,124,15);
			wait(10);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		loop(6) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir-36,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir-24,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir-12,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir+12,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),2,dir+24,124,15);
			wait(10);
		}
	} 	
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		loop(7) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);	
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir-36,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir-24,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir-12,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir+12,124,15);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir+24,124,15);
			wait(10);
		}	
	}
}

// Multi familiar user fairy shot
task fireAfroMultiFamFairyShot(obj) {
	let dir = 0;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(j in 0..1) { 
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN01);	
			ascent(i in 0..24) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1+(j/2),dir,148,15);
				dir+=360/24;
			}
			wait(5);
		}
		ascent(j in 0..4) {
			if(Obj_IsDeleted(obj)) { break; } 
			dir = GetAngleToPlayer(obj) - 12; 
			ascent(i in 0..4) { 
					if(Obj_IsDeleted(obj)) { break; } 
					let delayShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,16,15);
					ObjMove_AddPatternA2(delayShot00,15,3,NO_CHANGE,-0.2,0,0); 
					ObjMove_AddPatternA2(delayShot00,30,0,NO_CHANGE,0.2,0,3); 	
					dir+=8; 
					yield;
			}
			wait(10);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(j in 0..2) { 
			if(Obj_IsDeleted(obj)) { break; } 
			ascent(i in 0..24) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1+(j/3),dir,148,15);
				dir+=360/24;
			}
			wait(5);
		}
		ascent(j in 0..6) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN01);	
			dir = GetAngleToPlayer(obj) - 12; 
			ascent(i in 0..6) { 
					if(Obj_IsDeleted(obj)) { break; } 
					let delayShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,16,15);
					ObjMove_AddPatternA2(delayShot00,15,4,NO_CHANGE,-0.2,0,0); 
					ObjMove_AddPatternA2(delayShot00,30,0,NO_CHANGE,0.2,0,4); 	
					dir+=8; 
					yield;
			}
			wait(10);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(j in 0..3) { 
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN01);	
			ascent(i in 0..36) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1+(j/3),dir,148,15);
				dir+=360/36;
			}
			wait(5);
		}
		ascent(j in 0..8) {
			if(Obj_IsDeleted(obj)) { break; } 
			dir = GetAngleToPlayer(obj) - 24; 
			ascent(i in 0..8) { 
					if(Obj_IsDeleted(obj)) { break; } 
					let delayShot00 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,16,15);
					ObjMove_AddPatternA2(delayShot00,15,4,NO_CHANGE,-0.2,0,0); 
					ObjMove_AddPatternA2(delayShot00,30,0,NO_CHANGE,0.2,0,4); 	
					dir+=8; 
					yield;
			}
			wait(10);
		}	
	}
}

// Balls out shot
task fireAfroBallsOutShot00(obj) {
	let dir = 0;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(j in 0..16) {
			PlaySFX(SFX_TAN00);	
			ascent(i in 0..3) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),2,dir,44,15);
				dir+=360/2;
			}
			dir+=24;
			wait(5);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(j in 0..16) {
			PlaySFX(SFX_TAN00);	
			ascent(i in 0..4) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),3,dir,44,15);
				dir+=360/4;
			}
			dir+=24;
			wait(5);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(j in 0..16) {
			PlaySFX(SFX_TAN00);	
			ascent(i in 0..5) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),4,dir,44,15);
				dir+=360/5;
			}
			dir+=24;
			wait(5);
		}	
	}
}

// Balls out shot
task fireAfroBallsOutShot01(obj) {
	let dir = 90;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) { 
			PlaySFX(SFX_TAN00);
			ascent(i in 0..3) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),2,dir,244,15);
				dir+=360/3;
			}
			dir+=10;
			wait(45);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) { 
			PlaySFX(SFX_TAN00);
			ascent(i in 0..3) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),3,dir,244,15);
				dir+=360/3;
			}
			dir+=10;
			wait(45);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) { 
			PlaySFX(SFX_TAN00);
			ascent(i in 0..4) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),3,dir,244,15);
				dir+=360/4;
			}
			dir+=10;
			wait(60);
		}	
	}
}

// Fires the circular laser 
task fireAfroLaserWheelShot(obj,side) { 
	wait(60);
	let dir = 260;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		if(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			ascent(i in 0..8) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateStraightLaserA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),dir,1024,16,90,5,30);
				if(side == "left") { dir+=360/8; }
				if(side == "right") { dir-=360/8; }
				yield;
			}
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		if(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			ascent(i in 0..16) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateStraightLaserA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),dir,1024,16,90,5,30);
				if(side == "left") { dir+=360/16; }
				if(side == "right") { dir-=360/16; }
				yield;
			}
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		if(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			ascent(i in 0..24) {
				if(Obj_IsDeleted(obj)) { break; } 
				CreateStraightLaserA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),dir,1024,16,90,5,30);
				if(side == "left") { dir+=360/24; }
				if(side == "right") { dir-=360/24; }
				yield;
			}
		}	
	}	
}

// Fires bullets from the fams for the fever fairy
task fireAfroLaserFamShot(obj,side) { 
	let dir = 0;
	if(side == "left") { dir = 0; }
	if(side == "right") { dir = 180; }
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..4) {
			if(Obj_IsDeleted(obj)) { break; } 		
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),2,dir,44,10);
			if(side == "left") { dir+=360/16; }
			if(side == "right") { dir-=360/16; }
			wait(30);

		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..7) {
			if(Obj_IsDeleted(obj)) { break; } 		
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),3,dir,44,10);
			if(side == "left") { dir+=360/16; }
			if(side == "right") { dir-=360/16; }
			wait(30);

		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..12) {
			if(Obj_IsDeleted(obj)) { break; } 		
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj)+16*cos(dir),ObjMove_GetY(obj)+16*sin(dir),4,dir,44,10);
			if(side == "left") { dir+=360/16; }
			if(side == "right") { dir-=360/16; }
			wait(30);

		}	
	}	
}


// Rocket trail for flying fairies. Not a shot so doesn't need difficulty settings. Is just for the effect.
task fireAfroRocketTrail(obj) {
	while(!Obj_IsDeleted(obj)) {
		let trailShot00 = CreateShotA(ObjMove_GetX(obj)+15,ObjMove_GetY(obj)+10,15);
		let trailShot01 = CreateShotA(ObjMove_GetX(obj)-15,ObjMove_GetY(obj)+10,15);
		
		SetShotDataA(trailShot00,0,2,ObjMove_GetAngle(obj)-rand_int(150,210),1,0,0,171);
		SetShotDataA(trailShot01,0,2,ObjMove_GetAngle(obj)-rand_int(150,210),1,0,0,177);
		
		DeleteShotA(trailShot00,0);
		DeleteShotA(trailShot01,0);
		
		wait(5);
	}
}

// Rocket fairy spray large bubble
task fireAfroRocketSpray00(obj) { 
	let speed = 0;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(25);
			speed = rand_int(2,4);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.05,0,rand_int(2,4),229,15);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) {
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(20);
			speed = rand_int(2,5);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.06,0,rand_int(2,5),229,15);
		}	
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(10);
			speed = rand_int(2,5);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.06,0,rand_int(2,5),229,15);
		}		
	}
}

// Rocket fairy spray large round bullets
task fireAfroRocketSpray01(obj) { 
	let speed = 0;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(15);
			speed = rand_int(2,4);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.05,0,rand_int(2,3),203,15);
		}		
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(10);
			speed = rand_int(2,5);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.05,0,rand_int(2,4),203,15);
		}	
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..80) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			wait(8);
			speed = rand_int(2,5);
			CreateShotB2(ObjMove_GetX(obj),ObjMove_GetY(obj)-16,speed*cos(rand(255,285)),speed*sin(rand(255,285)),0,0.05,0,rand_int(2,4),203,15);
		}		
	}
}

// Rocket fairy spray large round bullets
task fireAfroRocketSpray02(obj,side) { 
	let dir = 0;

	if(side == "right") { dir = GetAngleToPlayer(obj)-25; }
	if(side == "left") { dir = GetAngleToPlayer(obj)+25; }
	
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,0.2,3,239,15);
			if(side == "right") { dir+=20; } 
			if(side == "left") { dir-=20; } 
			wait(15);
		}		
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,0.2,4,239,15);
			if(side == "right") { dir+=20; } 
			if(side == "left") { dir-=20; } 
			wait(10);
		}	
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,0.2,4,239,15);
			CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,0.2,3,239,15);
			if(side == "right") { dir+=20; } 
			if(side == "left") { dir-=20; } 
			wait(5);
		}		
	}
}

// Rushing fairy 01 shot
task fireAfroRushingFairy01(obj) { 
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..24) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,GetAngleToPlayer(obj)-3,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,GetAngleToPlayer(obj),80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,GetAngleToPlayer(obj)+3,80,10);
			wait(30);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..24) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,GetAngleToPlayer(obj)-3,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,GetAngleToPlayer(obj)-1.5,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,GetAngleToPlayer(obj),80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,GetAngleToPlayer(obj)+1.5,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,GetAngleToPlayer(obj)+3,80,10);
			wait(30);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..24) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)-3,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)-1.5,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj),80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)+1.5,80,10);
			CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),5,GetAngleToPlayer(obj)+3,80,10);
			wait(25);
		}	
	}
} 

// Circle of stars spreading out
task fireAfroFeverStars00(obj,side) {
	let dir = 0;
	let kleur = 137;
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		ascent(i in 0..36) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			ascent(j in 0..3) {
				CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),0.5,dir,0.01,3,kleur,10);
				dir+=360/3;
			}
			if(i == 16) { kleur = 141; } 
			if(side == "right") { dir+=16; } 
			if(side == "left") { dir-=16; } 
			wait(5);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		ascent(i in 0..52) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			ascent(j in 0..4) {
				CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),0.5,dir,0.01,4,kleur,10);
				dir+=360/4;
			}
			if(i == 24) { kleur = 140; } 
			if(side == "right") { dir+=16; } 
			if(side == "left") { dir-=16; } 
			wait(3);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		ascent(i in 0..52) {
			if(Obj_IsDeleted(obj)) { break; } 
			PlaySFX(SFX_TAN00);
			ascent(j in 0..5) {
				CreateShotA2(ObjMove_GetX(obj),ObjMove_GetY(obj),0.5,dir,0.01,5,kleur,10);
				dir+=360/5;
			}
			if(i == 24) { kleur = 140; } 
			if(side == "right") { dir+=16; } 
			if(side == "left") { dir-=16; } 
			wait(3);
		}	
	}
}

// Fever fairy using 2 layer of spinning familiar
task fireAfroFeverShot00(obj) {
	let dir = 0;
	wait(30);
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) {
			let feverShot03 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1,ObjMove_GetAngle(obj),55,10);
			ObjMove_AddPatternA2(feverShot03,30,2,GetAngleToPlayer(feverShot03),0,0,2);
			dir+=10;
			wait(15);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) {
			let feverShot03 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1,ObjMove_GetAngle(obj),55,10);
			ObjMove_AddPatternA2(feverShot03,30,2,GetAngleToPlayer(feverShot03),0,0,2);
			dir+=10;
			wait(10);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) {
			let feverShot03 = CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),1,ObjMove_GetAngle(obj),55,10);
			ObjMove_AddPatternA2(feverShot03,30,2,GetAngleToPlayer(feverShot03),0,0,2);
			ObjMove_AddPatternA2(feverShot03,30,2.5,GetAngleToPlayer(feverShot03),0,0,2.5);
			dir+=10;
			wait(10);
		}	
	}
}

// Fever fairy's spinning fam shots
task fireAfroFeverFamShot00(obj) {

	let dir = ObjMove_GetAngle(obj);
	wait(30);
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			ascent(i in 0..3) { 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),-1.0-(i/2),dir,30,10);
			}
			dir = ObjMove_GetAngle(obj);
			wait(20);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			ascent(i in 0..3) { 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),-1.0-(i/3),dir,30,10);
			}
			dir = ObjMove_GetAngle(obj);
			wait(10);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_TAN00);
			ascent(i in 0..4) { 
				CreateShotA1(ObjMove_GetX(obj),ObjMove_GetY(obj),-2.0-(i/4),dir,30,10);
			}
			dir = ObjMove_GetAngle(obj);
			wait(10);
		}	
	}
}

// curve ball shot 00
task fireCurveBallShot00(obj) {
	let dir = GetAngleToPlayer(obj);
	if(GetAreaCommonData("game","difficulty",0) == 0) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,dir,100,8,204,10);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),3,-dir,100,8,204,10);
			dir+=16;
			wait(15);
		}	
	}
	if(GetAreaCommonData("game","difficulty",0) == 1) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,100,8,204,10);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,-dir,100,8,204,10);
			dir+=16;
			wait(10);
		}
	} 
	if(GetAreaCommonData("game","difficulty",0) == 2) { 
		while(!Obj_IsDeleted(obj)) {
			PlaySFX(SFX_LAZER01);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir,100,8,204,10);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir+120,100,8,204,10);
			CreateLooseLaserA1(ObjMove_GetX(obj),ObjMove_GetY(obj),4,dir+240,100,8,204,10);
			dir+=32;
			wait(10);
		}	
	}
}

// Object laser which can be used for reflections.
task CreateSpecialLaser01(x,y,v,dir,maxLen,width,graphic,delay,bounce,delcol,resist,source) {
	
	while(dir >= 180) { dir -= 360; }
	while(dir < -180) { dir += 360; }

	let NotYetBounced = true;
	let obj = ObjShot_Create(OBJ_STRAIGHT_LASER);

	ObjShot_Regist(obj);
	ObjMove_SetPosition(obj,x,y);
	ObjMove_SetSpeed(obj,v);
	ObjMove_SetAngle(obj,dir);
	ObjStLaser_SetAngle(obj,dir);
	ObjShot_SetGraphic(obj,graphic);
	ObjShot_SetDelay(obj,delay);
	ObjLaser_SetRenderWidth(obj,width);
	ObjLaser_SetIntersectionWidth(obj,width);
	ObjLaser_SetInvalidLength(obj,1,1);
	ObjStLaser_SetSource(obj,source);
	ObjShot_SetSpellResist(obj,resist);
	
	ObjMove_SpecialLaserGrowth(obj,maxLen,v);
	ObjMove_SpecialLaserMove(obj,x,y,v,dir);

	while(!Obj_IsDeleted(obj)) {
		x = ObjMove_GetX(obj);
		y = ObjMove_GetY(obj);
	
		// bounce code
		if(bounce < 1){
			// ceiling reflection
			if(dir < 0 && y < GetClipMinY) {
				CreateSpecialLaser01(x,y,v,-dir,maxLen,width,graphic,delay,bounce+1,delcol,resist,source);
				PlaySFX(SFX_KIRA00);
				wait(40);
				break;
			} 
			// wall reflection
			else if(((-90 < dir && dir < 90) && x > GetClipMaxX) || ((dir < -90 || 90 < dir) && x < GetClipMinX)) {
				CreateSpecialLaser01(x,y,v,180-dir,maxLen,width,graphic,delay,bounce+1,delcol,resist,source);
				PlaySFX(SFX_KIRA00);

				wait(40);
				break;
			}
		}	
		yield;
	}
}
