  #include_function ".\playerfunctions.txt"
  #include_function ".\lymia_functions.txt"
  #include_function ".\lymia_functions_spell.txt"
  #include_function ".\effects.txt"
  let fulltimer=0;

  task run{
    SE("shine");
    SE("ting1");
    SpellCardEffectStatic;
    LymiaSCBG;
    PlayerForbidShotOn;
    YayThingy(200,GetPlayerMoveAngle);
    loop(200){yield;}
    MoveSpeedChange(20,20,5.5,3,60);
    loop(40){yield;}
    StopEffect=1;
    PlayerForbidShotOff;
    loop(75){
      yield;
    }
    End();
  }
  @Initialize{
    LymiaSwitch;
    SetPlayerInvincibility(300);
    run();
  }
  @MainLoop{
    CollectItems();
    yield;
  }
  @Finalize{

  }
  task YayThingy(time,angle){
	let obj=Obj_Create(OBJ_SPELL);

	let speed=20;
	let accel=2;
	let xv=cos(angle)*speed;
	let yv=sin(angle)*speed;
	let xdir=cos(angle);
	let ydir=sin(angle);
	let x=GetPlayerX;
	let y=GetPlayerY;
	let color=0;

	let x2=0;
	let y2=0;

	let angle=0;
	let pushed=0;
	let frame=0;

	loop(time){
		pushed=0;
		if(GetKeyState(VK_RIGHT)==KEY_HOLD){
			pushed=1;
			xv+=accel;
			if(xv>=speed*0.9){
				if(yv<0){yv+=accel/7;}
				else if(yv>0){yv-=accel/7;}
			}
		}else if(GetKeyState(VK_LEFT)==KEY_HOLD){
			pushed=1;
			xv-=accel;
			if(xv<=speed*-0.9){
				if(yv<0){yv+=accel/7;}
				else if(yv>0){yv-=accel/7;}
			}
		}
		if(GetKeyState(VK_DOWN)==KEY_HOLD){
			pushed=1;
			yv+=accel;
			if(yv>=speed*0.9){
				if(xv<0){xv+=accel/7;}
				else if(xv>0){xv-=accel/7;}
			}
		}else if(GetKeyState(VK_UP)==KEY_HOLD){
			pushed=1;
			yv-=accel;
			if(yv<=speed*-0.9){
				if(xv<0){xv+=accel/7;}
				else if(xv>0){xv-=accel/7;}
			}
		}

		if(x<GetClipMinX-70){
			x+=screendiffx;
		}
		if(x>=GetClipMaxX-70){
			x-=screendiffx;
		}
		if(y<GetClipMinY-70){
			y+=screendiffy;
		}
		if(y>=GetClipMaxY-70){
			y-=screendiffy;
		}

		xv=center(-speed,xv,speed);
		yv=center(-speed,yv,speed);

		x2=x+cos(frame*10)*4;
		y2=y+sin(frame*10)*4;

		ElectricBall(1,x,y,color,50,4,20,0.8);
		loop(2){
			x+=xv/2+cos(frame*10)*2;
			y+=yv/2+sin(frame*10)*2;
			ElectricBall(0,x,y,color,20,-1,40,0);
			color+=8;
		}
		if(distance(x,y,x2,y2)<50&&pushed==0){
			let angle=atan2(y2-y,x2-x);
			xv-=cos(angle)*accel;
			yv-=sin(angle)*accel;
		}
		if(frame%16==0){
			SpellcardExplosionXY(Range(x,GetClipMinX,GetClipMaxX),Range(y,GetClipMinY,GetClipMaxY),30,5,0,0);
		}
		if(frame%16==8){
			SpellcardExplosionXY(Range(x,GetClipMinX,GetClipMaxX),Range(y,GetClipMinY,GetClipMaxY),30,5,1,0);
		}
		SetPlayerX(Range(x,GetClipMinX,GetClipMaxX));
		SetPlayerY(Range(y,GetClipMinY,GetClipMaxY));
		ObjSpell_SetIntersecrionCircle(obj,x,            y,            60,15,true);
		ObjSpell_SetIntersecrionCircle(obj,x+screendiffx,y,            60,15,true);
		ObjSpell_SetIntersecrionCircle(obj,x+screendiffx,y+screendiffy,60,15,true);
		ObjSpell_SetIntersecrionCircle(obj,x,            y+screendiffy,60,15,true);
		ObjSpell_SetIntersecrionCircle(obj,x,            y,            120,15,false);
		ObjSpell_SetIntersecrionCircle(obj,x+screendiffx,y,            120,15,false);
		ObjSpell_SetIntersecrionCircle(obj,x+screendiffx,y+screendiffy,120,15,false);
		ObjSpell_SetIntersecrionCircle(obj,x,            y+screendiffy,120,15,false);
		frame++;
		yield;
	}
	Obj_Delete(obj);
  }

let screendiffx=GetClipMaxX-GetClipMinX;
let screendiffy=GetClipMaxY-GetClipMinY;

function ElectricBall(type,x,y,color,coloradd,expand,time,minrand){
	let angle=rand(0,360);
	let size=rand(1,2);
	ElectricBall2(type,x,            y,            angle,size, (size/time)*expand,minrand, color,coloradd,time);
	ElectricBall2(type,x+screendiffx,y,            angle,size, (size/time)*expand,minrand, color,coloradd,time);
	ElectricBall2(type,x,            y+screendiffy,angle,size, (size/time)*expand,minrand, color,coloradd,time);
	ElectricBall2(type,x+screendiffx,y+screendiffy,angle,size, (size/time)*expand,minrand, color,coloradd,time);
}

task ElectricBall2(type,x,y,angle,scale,scaleadd,minrand,color,coloradd,time){
	let sizearray=[1.8,1];
	let sizemult=sizearray[type];
	if(OnScreen(x,y,64)){
		if(ExPlayer){coloradd*=2;}
		type*=64;
		let sincolor=sin(color)*coloradd;
		let obj=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obj,lym_spell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetLayer(obj,4);
		ObjEffect_SetRenderState(obj,ADD);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetAngle(obj,0,0,angle);

		ObjEffect_SetVertexXY(obj,0,-32,-32);
		ObjEffect_SetVertexXY(obj,1,32,-32);
		ObjEffect_SetVertexXY(obj,2,32,32);
		ObjEffect_SetVertexXY(obj,3,-32,32);

		ObjEffect_SetVertexUV(obj,0,65,1+type);
		ObjEffect_SetVertexUV(obj,1,127,1+type);
		ObjEffect_SetVertexUV(obj,2,127,63+type);
		ObjEffect_SetVertexUV(obj,3,65,63+type);

		let alpha=255;
		let k=0;

		let randscale;

		loop(time){
			Obj_SetPosition(obj,x,y);
//			x+=cos(moveangle)*0.5;
//			y+=sin(moveangle)*0.5;
			randscale=rand(minrand,1);
			ObjEffect_SetScale(obj,scale*randscale*sizemult,scale*randscale*sizemult);
			scale+=scaleadd;
			if(!ExPlayer){
				k=0;
				loop(4){
					ObjEffect_SetVertexColor(obj,k,alpha,115+sincolor,115+sincolor,115-sincolor);
					k++;
				}
			}else{
				k=0;
				loop(4){
					ObjEffect_SetVertexColor(obj,k,alpha,115+sincolor,115-coloradd,115+coloradd);
					k++;
				}
			}
			alpha-=255/time;
			yield;
		}
		Obj_Delete(obj);
	}
}
function GetPlayerMoveAngle {
	let angle = -90;
	if(GetKeyState(VK_DOWN)==KEY_HOLD){
		if(GetKeyState(VK_RIGHT)==KEY_HOLD){
			angle = 45;
		}
		else if(GetKeyState(VK_LEFT)==KEY_HOLD){
			angle = 135;
		}
		else {
			angle = 90;
		}
	}
	else if(GetKeyState(VK_UP)==KEY_HOLD){
		if(GetKeyState(VK_RIGHT)==KEY_HOLD){
			angle = 315;
		}
		else if(GetKeyState(VK_LEFT)==KEY_HOLD){
			angle = 225;
		}
		else {
			angle = 270;
		}
	}
	else if(GetKeyState(VK_RIGHT)==KEY_HOLD){
		angle = 0;
	}
	else if(GetKeyState(VK_LEFT)==KEY_HOLD){
		angle = 180;
	}
	return angle;
}
task MoveSpeedChange(unfocus1,focus1,unfocus2,focus2,time){
	let uchange=(unfocus1-unfocus2)/time;
	let fchange=(focus1-focus2)/time;
	loop(time){
		SetSpeed(unfocus1,focus1);
		unfocus1-=uchange;
		focus1-=fchange;
		yield;
	}
	SetSpeed(unfocus2,focus2);
}
