    let imgWhite=GPSD~"img\white.png";
    let imgPatchy=GPSD~"img\patchy.png";
    let imgPatchy2=GPSD~"img\patchyelements.png";

    let drawlogic=0;
    let pk=0;
    let scale=0;
    let bginit=0;

    let crystalx=[CX,CX,CX,CX,CX,CX,CX];
    let crystaly=[CX,CX,CX,CX,CX,CX,CX];
    let crystalxv=[CY,CY,CY,CY,CY,CY,CY];
    let crystalyv=[CY,CY,CY,CY,CY,CY,CY];
function CX{
	return rand(0,360);
}
function CY{
	return rand(1,2)*RandDir;
}
sub PatchyDrawLogic{
	drawlogic++;
	pk=0;
	loop(7){
		crystalx[pk]=crystalx[pk]+crystalxv[pk];
		crystaly[pk]=crystaly[pk]+crystalyv[pk];
		pk++;
	}
}

sub PatchyDrawLoop{

	SetTexture(imgPatchy);
	SetGraphicRect(262,0,79+240,120);

	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetAlpha(255);

	SetRenderState(ADD);
	SetColor(170,0,0);
	DrawGraphic(GetX+cos(drawlogic*3)*3+0.5,GetY+sin(drawlogic*4)*3+sin(drawlogic*3)*3+3);
	SetColor(0,120,120);
	DrawGraphic(GetX-cos(drawlogic*3)*3+0.5,GetY+sin(drawlogic*4)*3-sin(drawlogic*3)*3+3);

	SetRenderState(ALPHA);
	SetColor(255,255,255);
	SetGraphicRect(2+trunc(drawlogic/6%4)*60,0,59+trunc(drawlogic/6%4)*60,120);
	DrawGraphic(round(GetX)+3,round(GetY+sin(drawlogic*4)*3));

	pk=0;
	loop(7){
		scale=sin(pk*(360/7)+drawlogic*4);
		SetGraphicScale(0.2+scale*0.2,0.2+scale*0.2);
		SetAlpha(scale*127+127);
		SetGraphicRect(pk*50,110,pk*50+50,230);
		DrawGraphic(GetX+cos(crystalx[pk])*40,GetY+sin(crystaly[pk])*50);
		pk++;
	}
}
let patchlightcolor=[255,255,255];
function PatchyLightningColor(x,y,forwardv,sidev,angle,len,width, starttime,time,fadetime, animfreq, color){
	patchlightcolor=color;
	PatchyLightning(x,y,forwardv,sidev,angle,len,width, starttime,time,fadetime, animfreq);
	patchlightcolor=[255,255,255];
}
task PatchyLightning(x,y,forwardv,sidev,angle,len,width, starttime,time,fadetime, animfreq){
	let color=patchlightcolor;
	let xv=cos(angle)*forwardv+cos(angle+90)*sidev;
	let yv=sin(angle)*forwardv+sin(angle+90)*sidev;

	let graphic=0;

	x+=cos(angle)*len*0.5;
	y+=sin(angle)*len*0.5;

	let obj=InitEffect(x,y,imgPatchy,4,ADD,3);
	ObjEffect_SetXYRect(obj,-width/2,-len/2,width/2,len/2);
	let alpha=0;
	let frame=0;
	loop(starttime){
		CheckFrame;
		alpha+=255/starttime;
		Obj_SetColor(obj,4,alpha,color[0],color[1],color[2]);
		yield;
	}
	alpha=255;
	Obj_SetColor(obj,4,alpha,color[0],color[1],color[2]);
	loop(time){
		CheckFrame;
		yield;
	}
	loop(fadetime){
		CheckFrame;
		alpha-=255/fadetime;
		Obj_SetColor(obj,4,alpha,color[0],color[1],color[2]);
		yield;
	}

	Obj_Delete(obj);

	sub CheckFrame{
		if(frame%animfreq==0){
			graphic=rand_int(0,3);
			ObjEffect_SetAngle(obj,0,0,angle-90*RandDir);
			ObjEffect_SetUVRect(obj,graphic*128+1,385,graphic*128+127,511);
			ObjEffect_SetScale(obj,RandDir,RandDir);
		}
		frame++;
		Obj_SetPosition(obj,x,y);
		x+=xv;
		y+=yv;

	}
}
task PatchyFire(x,y,forwardv,sidev,angle,len,width, starttime,time,fadetime, graphic){
	let xv=cos(angle)*forwardv+cos(angle+90)*sidev;
	let yv=sin(angle)*forwardv+sin(angle+90)*sidev;

	let obj=Obj_Create(OBJ_LASER);
	ObjShot_SetGraphic(obj,graphic);
	ObjLaser_SetSource(obj,false);
	ObjLaser_SetWidth(obj,width);
	ObjLaser_SetLength(obj,len);
	Obj_SetAngle(obj,angle);
	ObjShot_ToItem(obj,false);
	Obj_SetCollisionToPlayer(obj,false);

	let alpha=0;
	loop(starttime){
		CheckFrame;
		alpha+=255/starttime;
		Obj_SetAlpha(obj,alpha);
		yield;
	}
	alpha=255;
	Obj_SetAlpha(obj,alpha);
	loop(time){
		CheckFrame;
		yield;
	}
	loop(fadetime){
		CheckFrame;
		alpha-=255/fadetime;
		Obj_SetAlpha(obj,alpha);
		yield;
	}

	Obj_Delete(obj);

	sub CheckFrame{
		Obj_SetPosition(obj,x,y);
		x+=xv;
		y+=yv;

	}
}

task SunShot(x,y,v,a,g1,g2,size,d){
	let obj=Obj_Create(OBJ_SHOT);
	ObjShot_SetGraphic(obj,g1);
	Obj_SetPosition(obj,x,y);
	Obj_SetAngle(obj,a);
	Obj_SetSpeed(obj,v);

	let obj2=Obj_Create(OBJ_LASER);
	ObjShot_SetGraphic(obj2,g2);
	ObjShot_SetBombResist(obj2,true);
	Obj_SetAutoDelete(obj2,false);
	Obj_SetAngle(obj2,a);
	Obj_SetCollisionToPlayer(obj2,false);
	ObjLaser_SetSource(obj2,false);
	ObjShot_ToItem(obj2,false);

	let xo=cos(a);
	let yo=sin(a);

	let size2;
	let frame=rand_int(0,360);
	while(!Obj_BeDeleted(obj)){
		size2=(sin(frame*6)*0.1+1)*size;

		ObjLaser_SetWidth(obj2,size2);
		ObjLaser_SetLength(obj2,size2);

		Obj_SetPosition(obj2,Obj_GetX(obj)-xo*size2*0.5+xo*v,Obj_GetY(obj)-yo*size2*0.5+yo*v);
		frame++;
		yield;
	}
	ObjShot_FadeDelete(obj2);
}

let fadepatchyelemento=-1;
let fadepatchyelementt=-1;

function PatchyElement(type,x,y,startuptime,glowfrequency, alpha,fadetime){
	let obj=InitEffect(x,y,imgPatchy2,4,ALPHA,3);
	PatchyElement2(obj,type,x,y,startuptime,glowfrequency, alpha,fadetime);
	return obj;
}
task PatchyElement2(obj,type,x,y,startuptime,glowfrequency, alpha,fadetime){
	ObjEffect_SetXYRect(obj,-32,-32,32,32);
	ObjEffect_SetUVRect(obj,type*64,0,type*64+64,64);
	let frame=0;
	let scale=0;
	loop(startuptime){
		scale+=1/startuptime;
		ObjEffect_SetScale(obj,scale,2-scale);
		frame++;
		if(frame%glowfrequency==0){
			PatchyElementGlow(type,Obj_GetX(obj),Obj_GetY(obj),rand(-1,1),rand(-1,0),glowfrequency,scale,2-scale, 255);
		}
		yield;
	}
	let alphaadd=(255-alpha)/fadetime;
	alpha=255;
	while(fadepatchyelemento!=obj){
		if(frame-startuptime<=fadetime){
			alpha-=alphaadd;
			Obj_SetColor(obj,4,alpha,255,255,255);
		}
		frame++;
		if(frame%glowfrequency==0){
			PatchyElementGlow(type,Obj_GetX(obj),Obj_GetY(obj),rand(-1,1),rand(-1,0),glowfrequency,1,1, alpha);
		}
		yield;
	}
	startuptime=fadepatchyelementt;
	fadepatchyelementt=-1;
	fadepatchyelemento=-1;
	scale=1;
	loop(startuptime){
		scale-=1/startuptime;
		ObjEffect_SetScale(obj,scale,2-scale);
		frame++;
		if(frame%glowfrequency==0){
			PatchyElementGlow(type,Obj_GetX(obj),Obj_GetY(obj),rand(-1,1),rand(-1,0),glowfrequency,scale,2-scale, alpha);
		}
		yield;
	}
	Obj_Delete(obj);


	task PatchyElementGlow(type,x,y,xv,yv,startuptime,xscale,yscale,maxalpha){
		let obj=InitEffect(x,y,imgPatchy2,4,ADD,2);
		ObjEffect_SetXYRect(obj,-32,-32,32,32);
		ObjEffect_SetUVRect(obj,type*64,64,type*64+64,128);
		let alpha=1;
		loop(30){
			x+=xv;
			y+=yv;
			yv-=0.1;
			Obj_SetPosition(obj,x,y);
			ObjEffect_SetScale(obj,alpha*xscale,(2-alpha)*yscale);
			Obj_SetColor(obj,4,maxalpha*alpha,255,255,255);
			alpha-=1/30;
			yield;
		}
		Obj_Delete(obj);
	}

}
task FadePatchyElement(obj,time,delay){
	Wait(delay);
	fadepatchyelemento=obj;
	fadepatchyelementt=time;
}

sub PatchyInit{
	StartFunctions(1,0,0);
}
sub PatchyFinalize{
}