  #include_function ".\playerfunctions.txt"
  #include_function ".\effects.txt"
  #include_function ".\raibys_functions.txt"

	// 1 = attack, 3 = frost, 5 = stealth
	let colors1=[1,1,2,4, 8,5,5,6, 7,1,7,1];
	let colors2=[[1,0,0],[0,1,0],[1,1,1],[0,1,1],[1,0,1],[1,0,0]];

	let imgSpell=GetCurrentScriptDirectory~"raibysspell.png";
	let form=GetCommonData("RaibysForm");
	let targety;
	task MainTask{
		SpellCardEffectStatic;
		RaibysSCBG;
		SetPlayerInvincibility(240);
		SetSpeed(2, 1.5);
		PlayerForbidShotOn;
		ForbidFormChange;
		SE("raibyscharge");

		let i=0;
		loop(4){
			RotateThingy(i,7,60,400,colors2[form-1]);
			RotateThingy(i,-7,60,400,colors2[form]);
			i+=90;
		}

		let frame=0;
		let y=0;
		if(GetPlayerY<330){
			y=GetPlayerY;
			frame=0;
			loop(60){
				SetPlayerY( cos(frame*(90/60)+90)*(y-330)+y );
				frame++;
				yield;
			}
		}else{
			loop(60){
				if(GetPlayerY<330){
					SetPlayerY(330);
				}
				yield;
			}
		}
		MotionBlurRaibys;

		targety=GetPlayerY;
		let yadd=((GetClipMaxY-GetClipMinY))/50;
		let x=GetPlayerX;
		y=targety;
		frame=0;
		let sinframe;
		let dummyobj=Obj_Create(OBJ_SPELL);	//used for damage
		loop(50){
			sinframe=sin(frame*12);
			SpellTrail(GetPlayerX+sinframe*90,targety,90,20,250,7,colors2[form-1]);
			SpellTrail(GetPlayerX-sinframe*90,targety,90,20,250,7,colors2[form]);
			SetIntersectionCircle(GetPlayerX+sinframe*90,targety,20, 2, false);
			SetIntersectionCircle(GetPlayerX-sinframe*90,targety,20, 2, false);

			if(frame%2==0){
				BigShot(GetPlayerX+rand(-20,20),targety,rand(-7,7),-90,colors1[rand_int(0,3)+form*2-2]-1,rand(0.5,2),false);
				BigShot(GetPlayerX+rand(-20,20),targety,rand(-7,7),-90,colors1[rand_int(0,3)+form*2-2]-1,rand(0.5,2),true);
			}else{
				loop(2){
					BigShot(GetPlayerX+rand(-20,20),targety,rand(-7,7),-90,colors1[rand_int(0,3)+form*2-2]-1,rand(0.5,2),false);
				}
			}
			targety-=yadd;
			y-=yadd;
			if(y<GetClipMinY){
				y+=(GetClipMaxY-GetClipMinY);
			}
			SetPlayerX(x);
			SetPlayerY(y);
			frame++;

			if(frame==10){
				SE("lance");
			}else if(frame==28){
				SE("ring");
			}
			ObjSpell_SetIntersecrionLine(dummyobj,GetPlayerX,targety,GetPlayerX,GetClipMaxY+20,130, 6, false);
			yield;
		}
		MotionBlurRaibysOff;
		loop(10){
			sinframe=sin(frame*12);
			SpellTrail(GetPlayerX+sinframe*90,targety,90,20,250,7,colors2[form-1]);
			SpellTrail(GetPlayerX-sinframe*90,targety,90,20,250,7,colors2[form]);
			SetIntersectionCircle(GetPlayerX+sinframe*90,targety,20, 2, false);
			SetIntersectionCircle(GetPlayerX-sinframe*90,targety,20, 2, false);
			ObjSpell_SetIntersecrionLine(dummyobj,GetPlayerX,targety,GetPlayerX,GetClipMaxY+20,130, 6, false);
			frame++;
			yield;
		}
//		BigShot(GetPlayerX,GetPlayerY-100,15,-120,colors1[2+(form-1)*1.5]-1,30,2,1);
//		BigShot(GetPlayerX,GetPlayerY-100,15,-60,colors1[0+(form-1)*1.5]-1,30,2,1);

		PlayerForbidShotOff;
		let damage=1;
		loop(60){
			damage-=1/60;
			ObjSpell_SetIntersecrionLine(dummyobj,GetPlayerX,targety,GetPlayerX,GetClipMaxY+20,130, 6*damage, false);
			yield;
		}
		Obj_Delete(dummyobj);
		AllowFormChange;
		StopEffect=1;
		SetSpeed(4, 2.5);
		loop(60){yield;}
		End;
	}
	task RotateThingy(angle,angvel,time,radius,color){
		time/=2;
		let alpha=0;
		let alphaadd=255/time;
		let radiusadd=radius/time;
		loop(time){
			alpha+=alphaadd;
			SpellTrail(GetPlayerX+cos(angle)*radius,GetPlayerY+sin(angle)*radius,angle+90,30,alpha,-1,color);
			angle+=angvel;
			radius-=radiusadd;
			yield;
			yield;
		}

	}

	task BigShot(x,y,v,angle,graphic,size,explode){
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		Obj_SetAngle	  (obj,angle);
		Obj_SetSpeed(obj,0);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		ObjEffect_SetLayer(obj,5);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ALPHA);

		// 1 2
		// 4 3

		SetUVRaibys(obj,graphic,0);

		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_SetScale(obj,size/10,size/10);

		if(explode){
			Boom(x,y,3,20,255);
		}
		loop(6){
			ObjEffect_SetAngle(obj,0,0,rand(0,360));
			loop(4){yield;}
		}
		if(explode){
//			boom(x,y+rand(-50,50),5,60,255);
			OffshootThing(x,y,200,rand(0,360),200,40,rand(-3,3));
			OffshootThing(x,y,200,rand(0,360),200,40,rand(-3,3));
		}
		Obj_SetSpeed(obj,v);
		if(rand_int(0,1)==0){
			ObjEffect_SetAngle(obj,0,0,0);
		}

		let time=60;
		loop(time/4){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),30, 3, true);
			RandomizeScale(obj,size/2,size);
			yield;
			yield;
		}
		if(!explode){
			//BigBoom(Obj_GetX(obj),Obj_GetY(obj));
		}
		//SpellTrail(x,y,-90,40,200,rand(-10,10));

		OffshootThing(Obj_GetX(obj),Obj_GetY(obj),200,-90,200,60,rand(-2,2));
		let sizeadd=size/(time/2);
		let damage=1;
		loop(time/2){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),30, 3*damage, false);
			RandomizeScale(obj,size/2,size);
			size-=sizeadd;
			damage-=1/(time/2);
			yield;
		}
		Obj_Delete(obj);
	}
	task RandomizeScale(obj,xmult,ymult){
		ObjEffect_SetScale(obj,(rand_int(0,1)*2-1+rand(-0.2,0.2))*xmult,(rand_int(0,1)*2-1+rand(-0.2,0.2))*ymult);
	}
	task SpellTrail(x,y,a,time,alpha,v,color){
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		Obj_SetAngle	  (obj,a);
		Obj_SetSpeed(obj,v);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetScale(obj,1,1);
		ObjEffect_SetAngle(obj,0,0,a+90);
		ObjEffect_SetLayer(obj,4);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ADD);

		let colorintensity=rand_int(0,200);
		let colorarray=[color[0]*colorintensity+(255-colorintensity),color[1]*colorintensity+(255-colorintensity),color[2]*colorintensity+(255-colorintensity)];
		let k=0;

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

		let alphaadd=alpha/time;
		k=0;
		loop(time){
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj,k,alpha,colorarray[0],colorarray[1],colorarray[2]);
				k++;
			}
			alpha-=alphaadd;
			yield;
		}
		Obj_Delete(obj);
	}
	task OffshootThing(x,y,length,a,alpha,time,angvel){
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetLayer(obj,3);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ADD);

		SetUVRaibys(obj,6,1);
		ObjEffect_SetVertexXY(obj,0,-32,-64);
		ObjEffect_SetVertexXY(obj,1, 32,-64);
		ObjEffect_SetVertexXY(obj,2, 32, 10);
		ObjEffect_SetVertexXY(obj,3,-32, 10);

		let lengthadd=length/time;
		FadeIn(obj,0,time,alpha,0);
		length=0;
		let width=1;
		let widthadd=(1-0.4)/time;
		loop(time){
			length+=lengthadd;
			width-=widthadd;
			ObjEffect_SetScale(obj,width,length/32);

			a+=angvel;
			ObjEffect_SetAngle(obj,0,0,a+90);
			yield;
		}
		Obj_Delete(obj);
	}
	task Boom(x,y,size,time,alpha){
		let angle=rand(0,360);
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetLayer(obj,3);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ADD);

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



		let alphaadd=alpha/time;
		let k=0;
		let sizeadd=size/time;
		size=0;
		let angleadd=rand(6,10);
		loop(time){
			size+=sizeadd;
			ObjEffect_SetScale(obj,size,size);
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj,k,alpha,255,255,255);
				k++;
			}
			ObjEffect_SetAngle(obj,0,0,angle);
			angle+=angleadd;
			alpha-=alphaadd;
			yield;
		}
		Obj_Delete(obj);
	}
	task BigBoom(x,y){
		let angle=rand(0,360);
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetLayer(obj,3);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ADD);

//		ObjEffect_SetVertexUV(obj,0,0,128);
//		ObjEffect_SetVertexUV(obj,1,128,128);
//		ObjEffect_SetVertexUV(obj,2,128,256);
//		ObjEffect_SetVertexUV(obj,3,0,256);

		SetUVRaibys(obj,5,1);

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

		let k=0;
		let time=20;
		let size=rand(1,2);
		let alpha=120;
		let alphaadd=alpha/time;
		Obj_SetAngle(obj,angle);
		Obj_SetSpeed(obj,7);
		loop(time){
			ObjEffect_SetScale(obj,size,size);
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj,k,alpha,255,255,255);
				k++;
			}
			alpha-=alphaadd;
			ObjEffect_SetAngle(obj,0,0,angle-90);
			yield;
		}
		Obj_Delete(obj);
	}
	task FadeIn(obj,waittime,time,alpha1,alpha2){
		let i=0;
		loop(4){
			ObjEffect_SetVertexColor(obj,i,alpha1,255,255,255);
			i++;
		}		
		loop(waittime){yield;}
		let alpha=alpha1;
		let alphaadd=(alpha2-alpha1)/time;
		loop(time){
			alpha+=alphaadd;
			i=0;
			loop(4){
				ObjEffect_SetVertexColor(obj,i,alpha,255,255,255);
				i++;
			}
			yield;
		}
	}
	function SetUVRaibys(obj,x,y){
		ObjEffect_SetVertexUV(obj,0,x*64+1,y*64+1);
		ObjEffect_SetVertexUV(obj,1,x*64+63,y*64+1);
		ObjEffect_SetVertexUV(obj,2,x*64+63,y*64+63);
		ObjEffect_SetVertexUV(obj,3,x*64+1,y*64+63);
	}

	@Initialize{
		MainTask;
		if(ExPlayer){
			FilmGrain;
			FilmGrain;
		}
	}
	@MainLoop{
		CollectItems;
		yield;
	}
