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

	// 0 = normal, 2 = flight, 4 = guard
	let colors1=[4,2,5,1, 2,3,2,3, 8,8,8,8];
	let colors2=[5,1,4,2, 2,4,2,4, 6,4,6,4];

	let imgSpell=GetCurrentScriptDirectory()~"raibysspell.png";
	let form=GetCommonData("RaibysForm");
	task MainTask{
		SE("shardstorm");
		SpellCardEffect;
		RaibysSCBG;
		SetPlayerInvincibility(500);
		SetSpeed(4, 4);
		ForbidFormChange;
		let i=1;
		let angle=0;
		let sparkle=0;
		loop(12){
			i=0;
			loop(4){
				SmallShot(GetPlayerX,GetPlayerY,i*(360/4)-angle,colors1[i%4+form*2]-1,1,  sparkle%3);
				SmallShot(GetPlayerX,GetPlayerY,-i*(360/4)+angle,colors2[i%4+form*2]-1,-1,sparkle%3);
				i++;
			}
			angle+=7.2*(4/2);
			sparkle++;
			yield;
			yield;
			yield;
			yield;
		}
		loop(80){yield;}
		SE("ring");
		loop(80){yield;}
		SetSpeed(4, 2.5);
		AllowFormChange;
		loop(200){yield;}
		StopEffect=1;
		loop(60){yield;}
		End;
	}

	task SmallShot(x,y,angle,graphic,dir,sparkle){
		let damagemult=0.9;
//		let radii=[0.15,0.1];
//		dist=radii[(dist+1)/2];
		let obj = Obj_Create(OBJ_SPELL);
		Obj_SetPosition   (obj, x,y);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetScale(obj,1,1);
		ObjEffect_SetLayer(obj,5);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ALPHA);

		// 1 2
		// 4 3

		ObjEffect_SetVertexUV(obj,0,graphic*64,0);
		ObjEffect_SetVertexUV(obj,1,graphic*64+64,0);
		ObjEffect_SetVertexUV(obj,2,graphic*64+64,64);
		ObjEffect_SetVertexUV(obj,3,graphic*64,64);

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

		let frame=0;
		let v=0;
		let anglemult=1;
		RandomizeScale(obj,180);
		FadeIn(obj,20,10, 0,255);
		Sparkles(obj,sparkle,160,20);
		let fade=0;
		loop(60){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),20, 2.5*fade*damagemult, true);
			Obj_SetSpeed(obj,v);
			Obj_SetAngle(obj,angle);
			ObjEffect_SetAngle(obj,0,0,angle+90);
			angle-=dir*anglemult*7;
			anglemult-=0.005;
			v+=0.15;
			fade+=1/60;
			yield;
		}
		loop(60){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),20, 2.5*damagemult, true);
			Obj_SetSpeed(obj,v);
			Obj_SetAngle(obj,angle);
			ObjEffect_SetAngle(obj,0,0,angle+90);
			angle+=dir*anglemult*9;
			v-=0.15;
			yield;
		}
		angle-=90*dir;
		Obj_SetAngle(obj,angle);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		
		loop(30){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),20, 4*damagemult, true);
			Obj_SetSpeed(obj,v);
			v+=0.2;
			yield;
		}
		FadeIn(obj,30,40,255,0);
		fade=1;
		loop(70){
			ObjSpell_SetIntersecrionCircle(obj,Obj_GetX(obj),Obj_GetY(obj),20, 2.5*fade*damagemult, false);
			fade-=1/70;
			yield;
		}
		Obj_Delete(obj);
	}
	task RandomizeScale(obj,time){
		loop(time/2){
			ObjEffect_SetScale(obj,rand_int(0,1)*2-1+rand(-0.2,0.2),rand_int(0,1)*2-1+rand(-0.2,0.2));
			yield;
			yield;
		}
	}
	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;
		}
	}
	task Sparkles(obj,frame,time,delay){
		loop(delay){yield;}
		frame*=15;
		loop(time){
			if(frame%(3*15)==0){
				CreateSparkle(Obj_GetX(obj),Obj_GetY(obj),Obj_GetAngle(obj),form/2);
			}
			frame++;
			yield;
		}
	}
	task CreateSparkle(x,y,angle,graphic){
		graphic=0;
		let obj = Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obj,imgSpell);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
		ObjEffect_SetScale(obj,0.5,0.5);
		ObjEffect_SetLayer(obj,4);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetRenderState(obj,ALPHA);
		ObjEffect_SetAngle(obj,0,0,angle);

		ObjEffect_SetVertexUV(obj,0,graphic*64,64);ObjEffect_SetVertexUV(obj,1,graphic*64+64,64);ObjEffect_SetVertexUV(obj,2,graphic*64+64,128);ObjEffect_SetVertexUV(obj,3,graphic*64,128);
		ObjEffect_SetVertexXY(obj,0,-32,-32);ObjEffect_SetVertexXY(obj,1, 32,-32);ObjEffect_SetVertexXY(obj,2, 32, 32);ObjEffect_SetVertexXY(obj,3,-32, 32);

//		FadeIn(obj,0,60,255,0);

		if(graphic==0){
			let xv=cos(angle);
			let yv=sin(angle);
			let scale=1;
			loop(60){
				ObjEffect_SetScale(obj,scale/2,scale/2);
				scale-=1/60;
				Obj_SetPosition(obj, x,y);
				x+=xv*-2;
				y+=yv*-2;
				yield;
			}
		}
		if(graphic==1){
			FadeIn(obj,0,60,255,0);
			let xv=cos(angle);
			let yv=sin(angle);
			let graphicangle=0;
			let graphicangle2=90+rand(-20,20);
			let frame=rand(0,360);
			let percentage=0;
			let extraangle=600;
			let angledir=rand_int(0,1)*2-1;
			ObjEffect_SetScale(obj,rand_int(0,1)-0.5,rand_int(0,1)-0.5);
			loop(60){
				percentage=lower(percentage+0.015,1);
				Obj_SetPosition(obj, x,y);
				ObjEffect_SetAngle(obj,0,0,graphicangle2+extraangle*angledir);
				x+=xv*(1-percentage);
				y+=yv*(1-percentage);
				y+=2*percentage;
				frame++;
				extraangle*=0.92;
				yield;
			}
		}
		if(graphic==2){
			let xv=cos(angle);
			let yv=sin(angle);
			let drawangle=rand(0,360);
			let angvel=rand(5,16)*(rand_int(0,1)*2-1);
			FadeIn(obj,0,60,255,0);
			loop(60){
				ObjEffect_SetAngle(obj,0,0,drawangle);
				Obj_SetPosition(obj, x,y);
				x+=xv;
				y+=yv;
				drawangle+=angvel;
				yield;
			}
		}
		Obj_Delete(obj);
	}

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