let imgLBG1=GetCurrentScriptDirectory~"\lymiabg1.png";
let imgLBG2=GetCurrentScriptDirectory~"\lymiabg2.png";

task laser(x,y,v,a,power,penetration,length,graphic,powertime){
	let top=rand_int(0,255);
	graphic*=20;

	let objshot=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(objshot,x,y);
	Obj_SetAngle(objshot,a);
	Obj_SetSpeed(objshot,v);
	if(powertime==0){
		ObjShot_SetDamage(objshot,power);
	}else{
		PowerUp(objshot,power,powertime);
	}
	ObjShot_SetPenetration(objshot,penetration);
	ObjShot_SetGraphic(objshot,0);
	Obj_SetAlpha(objshot,0);

	let obj=Obj_Create(OBJ_EFFECT);
	ObjEffect_SetScale(obj,1,1);
	ObjEffect_SetAngle(obj,0,0,a+90);
	ObjEffect_CreateVertex(obj,4);
	ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
	ObjEffect_SetTexture(obj,lym_spell);
	ObjEffect_SetScale(obj,rand_int(0,1)*2-1,1);
	ObjEffect_SetVertexColor(obj,0,255*shotopacity,255,255,255);
	ObjEffect_SetVertexColor(obj,1,255*shotopacity,255,255,255);

	let curlength=0;
	let endalpha=0;
	while(!Obj_BeDeleted(objshot)){
		x=Obj_GetX(objshot);
		y=Obj_GetY(objshot);
		curlength+=v;
		LaserLength(obj,top,lower(curlength,length),graphic,lower(curlength/length,2)*127*shotopacity);
		Obj_SetPosition(obj,x,y);
		top-=v;
		if(!OnScreen(x,y,10)){
			penetration=999;
			Obj_Delete(objshot);
		}
		yield;
	}
	if(penetration<999){
		laser(x,y,v,GetTarget(x,y,50,300),power/2,999,length,graphic/20,20);
//		SmallSpark(x,y);
	}
	LaserShrink(obj,top+v,lower(curlength,length),v,graphic);
}
task PowerUp(obj,power,time){
	let poweradd=power/time;
	power=0;
	loop(time){
		power+=poweradd;
		ObjShot_SetDamage(obj,power);
		yield;
	}		
}
function LaserLength(obj,top,length,color,endalpha){
	ObjEffect_SetVertexUV(obj,0,1 +color,top);
	ObjEffect_SetVertexUV(obj,1,19+color,top);
	ObjEffect_SetVertexUV(obj,2,19+color,top+length);
	ObjEffect_SetVertexUV(obj,3,1 +color,top+length);
	ObjEffect_SetVertexXY(obj,0,-9,0);
	ObjEffect_SetVertexXY(obj,1, 9,0);
	ObjEffect_SetVertexXY(obj,2, 9,length);
	ObjEffect_SetVertexXY(obj,3,-9,length);
	if(endalpha>-1){
		ObjEffect_SetVertexColor(obj,2,endalpha,255,255,255);
		ObjEffect_SetVertexColor(obj,3,endalpha,255,255,255);
	}
}
task LaserShrink(obj,top,length,speed,color){
	while(length>0){
		length-=speed;
		LaserLength(obj,top,length,color,-1);
		yield;
	}
	Obj_Delete(obj);
}
task SmallSpark(x,y){
	let angle=prand(0,360);
	let top=prand_int(0,234);
	let type=rand_int(0,2)*20;

	let obj=Obj_Create(OBJ_EFFECT);
	Obj_SetPosition(obj,x,y);
	Obj_SetAngle(obj,angle);
	ObjEffect_SetScale(obj,1,1);
	ObjEffect_SetAngle(obj,0,0,angle+90);
	Obj_SetSpeed(obj,prand(10,15));
	ObjEffect_CreateVertex(obj,4);
	ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
	ObjEffect_SetTexture(obj,lym_spell);
	ObjEffect_SetVertexXY(obj,0,-10,0);
	ObjEffect_SetVertexXY(obj,1, 10,0);
	ObjEffect_SetVertexXY(obj,2, 10,-40);
	ObjEffect_SetVertexXY(obj,3,-10,-40);
	ObjEffect_SetVertexUV(obj,0,type,top);
	ObjEffect_SetVertexUV(obj,1,20+type,top);
	ObjEffect_SetVertexUV(obj,2,20+type,top+40);
	ObjEffect_SetVertexUV(obj,3,type,top+40);
	let alpha=255;
	let k=0;
	loop(20){
		k=0;
		loop(4){
			ObjEffect_SetVertexColor(obj,k,alpha,255,255,255);
			k++;
		}
		alpha-=255/20;
		yield;
	}
	Obj_Delete(obj);
}

let sparklex=[0,0,0,0,0,0];
let sparkley=[0,0,0,0,0,0];
let sparkletimer=0;
let currentsparkle=0;
sub SparkleLogic{
	if(sparkletimer%3==0){
		sparklex[currentsparkle]=GetPlayerX+rand(-12,12);
		sparkley[currentsparkle]=GetPlayerY+rand(-18,18);
		currentsparkle++;
		if(currentsparkle==6){currentsparkle=0;}
	}
	if(sparkletimer==36){
		sparkletimer=0;
	}
	if(dead==1){
		sparklex=[0,0,0,0,0,0];
		sparkley=[0,0,0,0,0,0];
	}
	sparkletimer++;
}
sub DrawSparkles{
	SetGraphicRect(30,230,41,241);
	SetGraphicScale(1,1);
	loop(6){
		SetGraphicAngle(0,0,sparkletimer*-10+currentsparkle*60);
		SetAlpha((((currentsparkle*3-sparkletimer)+18)%18)*14);
//		SetAlpha(sparkletimer-(currentsparkle%6)*5);
//		SetAlpha(255);
		DrawGraphic(sparklex[currentsparkle%6],sparkley[currentsparkle%6]);
		currentsparkle++;
	}
	currentsparkle-=6;
}

task HomingBall(x,y,v,a,p,t,color){

	let target=AcquireTarget;

	let xv=cos(a)*v;
	let yv=sin(a)*v;

	let obj=Obj_Create(OBJ_SHOT);
	ObjShot_SetGraphic(obj,1+color*2);
	ObjShot_SetDamage(obj,p);
	ObjShot_SetPenetration(obj,1);
//	Obj_SetAlpha(obj,0);

	let frame=0;
	let accel=20;
	while(!Obj_BeDeleted(obj)&&frame<t&&!IsForbidShot){
		accel=upper(accel-0.5,2);
		Obj_SetPosition(obj,x,y);

		if(frame%2==0){
			if(target==-1){	//if no enemies are on-screen
				a=atan2((GetPlayerY-500)-y,GetPlayerX-x);
				xv+=2*cos(a)/accel;
				yv+=2*sin(a)/accel;
				if( (xv*xv+yv*yv)>5*5){
					a=atan2(yv,xv);
					xv=cos(a)*5;
					yv=sin(a)*5;
				}
			}else if(GetEnemyInfoDefault(target,ENEMY_Y,-999)!=-999){	//if target is found
				a=atan2(GetEnemyInfo(target,ENEMY_Y)-y,GetEnemyInfo(target,ENEMY_X)-x);
				xv+=2*cos(a)/accel;
				yv+=2*sin(a)/accel;
				if( (xv*xv+yv*yv)>5*5){
					a=atan2(yv,xv);
					xv=cos(a)*5;
					yv=sin(a)*5;
				}
			}else{	//if target is lost
				target=AcquireTarget;
			}
		}
		if(frame%6==0){
			HomingBallSpark(true,1*shotopacity,2);
			HomingBallSpark(false,0.5*shotopacity,2);
		}
		Obj_SetAlpha(obj,((trunc(frame/2)%2)*100+155)*shotopacity);
		x+=xv;
		y+=yv;
		frame++;
		yield;
	}
	Obj_Delete(obj);

	task HomingBallSpark(type,maxalpha,graphic){
		let obj2=Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj2,graphic+color*2);
		ObjShot_SetDamage(obj2,0);
		Obj_SetAngle(obj2,rand(0,360));
		ObjShot_SetPenetration(obj2,1);
		Obj_SetCollisionToPlayer(obj2,false);
		Obj_SetPosition(obj2,x,y);
		let alpha=0;
		if(type){
			loop(10){
				alpha+=255/10;
				Obj_SetAlpha(obj2,alpha*maxalpha);
				Obj_SetPosition(obj2,x,y);
				yield;
			}
		}else{
			Obj_SetAlpha(obj2,255*maxalpha);
			loop(5){yield;}
		}
		alpha=255;
		loop(10){
			alpha-=255/10;
			Obj_SetAlpha(obj2,alpha*maxalpha);
			if(type){
				Obj_SetPosition(obj2,x,y);
			}
			yield;
		}
		Obj_Delete(obj2);
	}

	function AcquireTarget{
		let best_target=-1;
		let best_dist=400;
		let target=-1;
		let i=0;
		ascent(i in EnumEnemyBegin..EnumEnemyEnd) {
			target=EnumEnemyGetID(i);
			if(absolute(GetPlayerX-GetEnemyInfo(target,ENEMY_X))<best_dist&&GetEnemyInfo(target,ENEMY_X)>GetClipMinX-50&&GetEnemyInfo(target,ENEMY_X)<GetClipMaxX+50){
				best_target=target;
				best_dist=absolute(GetPlayerX-GetEnemyInfo(target,ENEMY_X));
			}
		}
		return best_target;
	}

}
