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

	task ChaosSlash{
		SpellCardEffectSmall;
		let angle=-90+30;
		let cosa;
		let sina;
		let x;
		let y;
		SE("slash");
		loop(5){
			x=GetPlayerX;
			y=GetPlayerY;
			cosa=cos(angle);
			sina=sin(angle);
			SlashGraphic(x+cosa*120,y+sina*90+50,120,20,angle+90, 10,12,2, 0, 30);
			loop(2){
				EnderSpark(2,x+cosa*120,y+sina*90+50,rand(-4,4),rand(-2,2),0, 0,1,255,30);
			}
			DeleteEnemyShotImmediatelyInCircle(SHOT,x+cosa*60,y+sina*60,50);
			angle-=15;
			loop(2){yield;}
		}
		loop(5){yield;}
		SE("slash");
		loop(5){
			x=GetPlayerX;
			y=GetPlayerY;
			angle+=15;
			cosa=cos(angle);
			sina=sin(angle);
			SlashGraphic(x+cosa*120,y+sina*90+50,120,20,angle+90, 10,12,2, 2, 30);
			DeleteEnemyShotImmediatelyInCircle(SHOT,x+cosa*60,y+sina*60,50);
			loop(2){
				EnderSpark(1,x+cosa*120,y+sina*90+50,rand(4,-4),rand(-2,2),0, 0,1,255,30);
			}
			loop(2){yield;}
		}
		loop(5){yield;}
		SE("slash");
		loop(5){
			x=GetPlayerX;
			y=GetPlayerY;
			cosa=cos(angle);
			sina=sin(angle);
			SlashGraphic(x+cosa*120,y+sina*90+50,120,20,angle+90, 10,12,2, 0, 30);
			DeleteEnemyShotImmediatelyInCircle(SHOT,x+cosa*60,y+sina*60,50);
			angle-=15;
			loop(2){
				EnderSpark(2,x+cosa*120,y+sina*90+50,rand(-4,4),rand(-2,2),0, 0,1,255,30);
			}
			loop(2){yield;}
		}
		loop(60){yield;}
		End;
	}
	task VorpalBlade{
		SetPlayerInvincibility(180);
		SpellCardEffect;
		StopEffect=1;
		loop(20){yield;}
		let x=GetPlayerX;
		let y=GetPlayerY;
		let angle=0;
		let k=-3;
		SE("slash");
		loop(7){
			angle=0;
			loop(3){
				if(k==-3||k==0||k==3){
					SwordTip(x+cos(angle)*-150,y-150+sin(angle)*-150,cos(angle)*25,sin(angle)*25, [2,0,1][angle/120], [255,100,255],angle,1,4,8,4);
					SwordTip(x+cos(angle)*-150,y-150+sin(angle)*-150,cos(angle)*25,sin(angle)*25, [2,0,1][angle/120], [255,100,255],angle,-1,4,8,4);
				}
				SlashGraphic(x+cos(angle)*k*50,y-150+sin(angle)*k*50, 80,15,angle, 60,20,2,angle/120,15);
				DeleteEnemyShotImmediatelyInCircle(SHOT,x+cos(angle)*k*50,y-150+sin(angle)*k*50,40);
				if(k!=3){
					DeleteEnemyShotImmediatelyInCircle(SHOT,x+cos(angle)*(k*50+25),y-150+sin(angle)*(k*50+25),40);
				}
				angle+=120;
			}
			if(k==0){
				loop(2){
					EnderBoomRandom(1,x,y-150,0,0,0,[255,100,100],rand(0.1,0.3),rand_int(40,120));
					EnderBoomRandom(1,x,y-150,0,0,0,[255,100,255],rand(0.1,0.3),rand_int(40,120));
					EnderBoomRandom(1,x,y-150,0,0,0,[100,100,255],rand(0.1,0.3),rand_int(40,120));

					EnderBoomRandom(1,x,y-150,0,0,0,[255,100,100],rand(0.5,0.9),rand_int(40,70));
					EnderBoomRandom(1,x,y-150,0,0,0,[255,100,255],rand(0.5,0.9),rand_int(40,70));
					EnderBoomRandom(1,x,y-150,0,0,0,[100,100,255],rand(0.5,0.9),rand_int(40,70));
				}
			}
			if(k>=0){
				DeleteEnemyShotImmediatelyInCircle(SHOT,x,y-150,k*40);
			}
			k++;
			loop(2){yield;}
		}
		loop(120){yield;}
		End;
	}
	task SwordTip(x,y,xv,yv,colorindex,color,angle,flip,fadein,time,fadeout){
		let size=0.5;
		let v;
		let x2=x;
		let y2=y;
		let angle2;
		let obj=InitEffect(x,y,img_ender,4,ADD,4);
		ObjEffect_SetXYRect(obj,-53,-40,11,200-40);
		ObjEffect_SetUVRect(obj,281,0,281+64,200);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		ObjEffect_SetScale(obj,size*flip,size);
		let k=0;
		loop(4){
			ObjEffect_SetVertexColor(obj,k,255,color[0],color[1],color[2]);
			k++;
		}
		let scaleadd=size/fadein;
		let xscale=0;
		loop(fadein){
			y+=yv;
			x+=xv;
			Obj_SetPosition(obj,x,y);
			xscale+=scaleadd;
			ObjEffect_SetScale(obj,xscale*flip,size);
			angle2=angle+rand(-20,20)+180;
			if(flip==1&&rand_int(0,3)==0){
				v=rand(1.5,3);
				EnderSpark(colorindex,x,y,cos(angle2)*v,sin(angle2)*v,angle2,0,1,255,60);
			}
			yield;
		}
		ObjEffect_SetScale(obj,size*flip,size);
		loop(time){
			y+=yv;
			x+=xv;
			Obj_SetPosition(obj,x,y);
			angle2=angle+rand(-20,20)+180;
			if(flip==1&&rand_int(0,3)==0){
				v=rand(1.5,3);
				EnderSpark(colorindex,x,y,cos(angle2)*v,sin(angle2)*v,angle2,0,1,255,60);
			}
			yield;
		}
		xscale=size;
		scaleadd=size/fadeout;
		loop(fadeout){
			y+=yv;
			x+=xv;
			Obj_SetPosition(obj,x,y);
			xscale-=scaleadd;
			ObjEffect_SetScale(obj,xscale*flip,size);
			angle2=angle+rand(-20,20)+180;
			if(flip==1&&rand_int(0,3)==0){
				v=rand(1.5,3);
				EnderSpark(colorindex,x,y,cos(angle2)*v,sin(angle2)*v,angle2,0,1,255,60);
			}
			yield;
		}
		Obj_Delete(obj);
	}

	task Nevella{
		SetPlayerInvincibility(420);
		SpellCardEffect;
		DeathSpear(GetPlayerX,GetClipMaxY,-90);
		loop(10){yield;}
		let dir=RandDir;
		loop(2){
			DeathSpear(GetPlayerX+100*dir,GetClipMaxY,-90-30*dir);
			dir=-dir;
			loop(10){yield;}
		}
		loop(2){
			DeathSpear(GetPlayerX+150*dir,GetClipMaxY,-90);
			dir=-dir;
			loop(10){yield;}
		}
		DeathSpear(GetPlayerX,GetClipMaxY,-90);
		loop(40){yield;}
		StopEffect=1;
		loop(120){yield;}
		End;
	}
	task DeathSpear(x,y,angle){
		SE("slash");
		let xv=cos(angle);
		let yv=sin(angle);
		NevellaTip(x,y,xv*20,yv*20,[255,255,255],angle,1);
		NevellaTip(x,y,xv*20,yv*20,[255,255,255],angle,-1);
		loop(15){
			SlashGraphic(x,y,80,25,angle,51,30,3,3,0);
			yield;
			yield;
			x+=xv*40;
			y+=yv*40;
		}
	}
	task NevellaTip(x,y,xv,yv,color,angle,flip){
		let x2=x;
		let y2=y;
		let obj=InitEffect(x,y,img_ender,4,ADD,4);
		let obj2;
		if(flip==1){
			obj2=Obj_Create(OBJ_SPELL);
		}
		ObjEffect_SetXYRect(obj,-53,-40,11,200-40);
		ObjEffect_SetUVRect(obj,281,0,281+64,200);
		ObjEffect_SetScale(obj,flip,1);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		let k=0;
		loop(4){
			ObjEffect_SetVertexColor(obj,k,255,color[0],color[1],color[2]);
			k++;
		}

		let frame=rand_int(0,360);
		loop(30){
			y+=yv;
			x+=xv;
			DeleteEnemyShotImmediatelyInCircle(SHOT,x-xv*100,y-xv*100,50);
			SetIntersectionCircle(x-xv*100,y-xv*100,40,20,false);
			Obj_SetPosition(obj,x,y);
			if(frame%4==0){
				NevellaTipFade(x,y,xv,yv,angle,[120,120,200],rand(0.5,0.9),80,flip);
			}
			if(frame%4==2){
				if(!ExPlayer){
					EnderBoomRandom(1,x,y,0,0,0,[255,255,180+sin(frame*20)*75],rand(0.1,0.3),rand_int(40,60));
				}else{
					EnderBoomRandom(1,x,y,0,0,0,[180+sin(frame*20)*75,255,255],rand(0.1,0.3),rand_int(40,60));
				}
			}
			if(flip==1){
				ObjSpell_SetIntersecrionLine(obj2,x2,y2,x,y,50,30,false);
			}
			frame++;
			yield;
		}
		Obj_Delete(obj);
		if(flip==1){
			frame=0;
			loop(30){
				ObjSpell_SetIntersecrionLine(obj2,x2,y2,x,y,(1-(frame/30))*50,30,false);
				frame++;
				yield;
			}
			Obj_Delete(obj2);
		}
	}
	task NevellaTipFade(x,y,xv,yv,angle,color,scale,time,flip){
		let obj=InitEffect(x,y,img_ender,4,ADD,4);
		ObjEffect_SetXYRect(obj,-53,-40,11,200-40);
		ObjEffect_SetUVRect(obj,281,0,281+64,200);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		let k=0;
		loop(4){
			ObjEffect_SetVertexColor(obj,k,255,color[0],color[1],color[2]);
			k++;
		}
		let scaleadd=scale/time;
		let frame=0;
		let scalemult;
		loop(time){
			if(frame%5==0){
				scalemult=rand(0.5,1);
			}
			ObjEffect_SetScale(obj,flip*scale*scalemult,1);
			scale-=scaleadd;
			frame++;
			yield;
		}
		Obj_Delete(obj);
	}

	task SlashGraphic(x,y,length,width,angle,time,fadetime,changefreq,color, damage){
		let xo=cos(angle)*length*0.5;
		let yo=sin(angle)*length*0.5;
		let obj=InitEffect(x,y,img_ender,4,[ALPHA,ALPHA,ALPHA,ADD][color],3);
		let obj2;
		if(damage>0){
			obj2=Obj_Create(OBJ_SPELL);
		}
		ObjEffect_SetXYRect(obj,-width/2,-length/2,width/2,length/2);
		ObjEffect_SetAngle(obj,0,0,angle+90);
		let graphic=-1;
		let graphic2=-1;
		let xscale;
		let yscale;
		let frame=0;
		let alpha=255;
		let k=0;
		let xcolor=[0,-80,0,-80];
		let ycolor=[0,0,-70,-70];
		loop((time+fadetime)/changefreq){
			while(graphic==graphic2){
				graphic=rand_int(0,3);
			}
			if(frame>=time/changefreq){
				alpha-=255/(fadetime/changefreq);
			}
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj,k,alpha*rand(0.5,1),255,255,255);
				k++;
			}
			xscale=RandDir; yscale=RandDir;
			graphic2=graphic;
			ObjEffect_SetScale(obj,xscale*rand(0.75,1.5),yscale);
			ObjEffect_SetUVRect(obj,491-20*graphic+xcolor[color],255-70+ycolor[color],511-20*graphic+xcolor[color],255+ycolor[color]);

			frame++;
			loop(changefreq){
				if(damage>0&&frame<time/changefreq){
					ObjSpell_SetIntersecrionLine(obj2,x+xo,y+yo,x-xo,y-yo,width,damage,false);
				}
				yield;
			}
		}
		Obj_Delete(obj);
		if(damage>0){
			Obj_Delete(obj2);
		}
	}

	@Initialize{
		SetThing;
		let type=GetCommonData("EnderBombType");
		if(type==0){
			ChaosSlash;
		}else if(type==1){
			VorpalBlade;
		}else{
			Nevella;
		}
		DeleteCommonData("EnderBombType");
	}
	@MainLoop{
		CollectItems;
		yield;
	}
