
  let enderbomb=0;
  let enderbombcharge=0;
  let lastpress=20;
  let enshotstate=0;

task EnderInit(shotdelay){
    SetThing;LoadGraphic(img_ender);

    SetPlayerLifeImage(img_ender, 100,210, 144, 252);
    SetSpeed(4, 2);
    SetAutoEffect(false);

    Left=[0,50,100];
    Right=[50,100,150];
    Flip=[1,1,1];

    loop(shotdelay){yield;}
    if(GetPlayerEx==GetPlayer){
	LoadPlayerShotData(GetCurrentScriptDirectory~"EnderShotData.txt");
    }else{
	LoadPlayerShotData(GetCurrentScriptDirectory~"EnderShotData2.txt");
    }
    playershot=6;
    hitboxcolor=[3,0][ExPlayer];
    HandleBombBar;
    LSE("enshot");
    LSE("slash");
    LSE("charge");
    LSE("ting1");
    LSE("ting2");
    LSE("ting3");

	cyberx=[-90,-90,-90,-90,-90,-90];
	cybery=[0,0,0,0,0,0];
	cybera=[0,0,0,0,0,0];
	cyberv=[0,0,0,0,0,0];
	cyberg=[0,0,0,0,0,0];
	cyberp=[0,0,0,0,0,0];

}


sub EnderMainLoop{
	if(dead==1){
		count=0;
	}
	if(GetPlayerBomb>=0){
		enderbomb+=GetPlayerBomb*2;
		AddBomb(-GetPlayerBomb);
	}
	lastpress++;
	if(GetKeyState(VK_SHOT)==KEY_PUSH){
		lastpress=0;
	}
	if(!IsForbidShot&&count==0&&lastpress<10&&GetKeyState(VK_BOMB)==KEY_FREE&&!OnBomb){
		count=180;
		enshotstate=0;
		if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH||GetKeyState(VK_SLOWMOVE)==KEY_HOLD){
			enshotstate=1;
		}
	}
	if(count>140){
		EnderCharge(rand(0,360),[0,1][enshotstate==1]);
	}
	if(count==140&&!IsForbidShot){
		SE("enshot");
		if(enshotstate==1){	//focused
			loop(15){
				count=rand(0,360);	//angle
				lastpress=rand(5,15);	//vel
				EnderSpark(1+rand_int(0,1),GetPlayerX,GetPlayerY,cos(count)*lastpress,sin(count)*lastpress,count,0,1,250,rand(10,20))
			}
			loop(12){
				EnderShot(GetPlayerX,GetPlayerY,rand(4,16),rand(2,4),-90+rand(-15,15),-90, 80,1, 5);
			}
		}else{
			loop(15){
				count=rand(0,360);	//angle
				lastpress=rand(5,15);	//vel
				EnderSpark(0+rand_int(0,1)*4,GetPlayerX,GetPlayerY,cos(count)*lastpress,sin(count)*lastpress,count,0,1,250,rand(10,20))
			}
			loop(20){
				EnderShot(GetPlayerX,GetPlayerY,rand(6,12),rand(4,6),-90+rand(-40,40),-90, 60,1, 1);
			}
		}
		count=140;
	}
	if(count==25){
		let k=45;
		loop(4){
			EnderCharge(k,[0,1][enshotstate==1]);
			k+=90;
		}
	}
	if(count==1){
		SE("charge");
		EnderBoom(0,GetPlayerX,GetPlayerY,0,0, 1,[255,255,255],0.3,10);
	}
	if(count>0){count--;}
	if(count<=0){count=0;}

	EnderDrawLogic;
}
task EnderShot(x,y,v,v2,a,a2,pow,pen,g){
	loop(rand_int(0,3)){yield;}
	let randg=rand_int(0,3);
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	ObjShot_SetGraphic(obj,g+randg);
	ObjShot_SetDamage(obj,pow);
	ObjShot_SetPenetration(obj,pen);
	Obj_SetAlpha(obj,lower(shotopacity*365,255));
	Obj_SetSpeed(obj,v);
	Obj_SetAngle(obj,a);
	let angleadd=rand(10,80);
	let vadd=(v2-v)/rand(20,60);
	let frame=0;
	while(!Obj_BeDeleted(obj)&&Obj_GetY(obj)>-30){
		if(v>v2){
			v+=vadd;
			Obj_SetSpeed(obj,v);
		}
		if(frame<120){
			a-=(Obj_GetX(obj)-x)/angleadd;
			Obj_SetAngle(obj,a);
		}
		if(frame%4==0){
			EnderShotTrail(Obj_GetX(obj),Obj_GetY(obj),v,a,g+((frame/4+randg)%4),14);
		}
		frame++;
		yield;
	}
	if(Obj_GetY(obj)>-30){
		enderbomb+=1/30;
		//explosion
	}
	Obj_Delete(obj);
}
task EnderShotTrail(x,y,v,a,g,t){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	ObjShot_SetGraphic(obj,g);
	Obj_SetCollisionToPlayer(obj,false);
	ObjShot_SetDamage(obj,0);
	Obj_SetAngle(obj,a);
	Obj_SetSpeed(obj,-v);
	let alpha=lower(shotopacity*365,255);
	let alphaadd=alpha/t;
	loop(t){
		alpha-=alphaadd;
		Obj_SetAlpha(obj,alpha);
		yield;
	}
	Obj_Delete(obj);
}

task HandleBombBar{
	yield;
	let obj2=InitBombBar;
	SetRectBombBar(obj2,1,300);
	let obj3=InitBombBar;
	ObjEffect_SetRenderState(obj3,ADD);
	SetRectBombBar(obj3,2,300);
	let obj1=InitBombBar;
	SetRectBombBar(obj1,0,342);
	let obj4=InitBombBar;
	SetRectBombBar(obj4,3,0);

	let frame=0;
	let k=0;
	let alpha=0;
	let lastcharge=0;
	let lastbomb=-1;
	let y=0;
	loop{
		if(enderbomb>3){enderbomb=3;}
		if(enderbomb!=lastbomb){
			SetRectBombBar(obj2,1,enderbomb*100);
			SetRectBombBar(obj4,3,trunc(enderbomb)*100);
			lastbomb=enderbomb;
		}
		if(trunc(enderbomb)>0&&frame%2==0){
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj4,k,sin(frame*20)*100+155,255,255,255);
				k++;
			}
		}
		if((GetKeyState(VK_BOMB)==KEY_HOLD)&&!OnBomb&&!OnMissed&&count<140&&!IsForbidBomb){
			lastcharge=trunc(enderbombcharge);
			enderbombcharge+=[0.040,0.020,0.010,0][trunc(enderbombcharge)];
			if(enderbombcharge>enderbomb){enderbombcharge=enderbomb;}
			if(trunc(enderbombcharge)>lastcharge){
				alpha=255;
				lastcharge=trunc(enderbombcharge);
				EnderBoom(0,GetPlayerX,GetPlayerY,0,0, 1,[[100,200,200],[100,200,100],[200,200,100]][lastcharge-1],0.2,20);
				SE(["ting1","ting2","ting3"][trunc(enderbombcharge-1)]);
			}
			if(frame%2==0&&trunc(enderbomb)>enderbombcharge){
				EnderCharge(rand(0,360),trunc(enderbombcharge)+2);
			}
		}else if(enderbombcharge>0){
			if(enderbombcharge>=1&&!IsForbidBomb&&!OnMissed){
				AddBomb(1);
				SetCommonData("EnderBombType",trunc(enderbombcharge)-1);
				CallSpellCard;
			}
			if(!OnMissed&&GetKeyState(VK_SHOT)==KEY_FREE){
				enderbomb-=trunc(enderbombcharge);
			}
			enderbombcharge=0;
		}
		SetRectBombBar(obj3,2,enderbombcharge*100);
		if(enderbombcharge==3){
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj3,k,upper(alpha,sin(frame*20)*70+255-70),255,255,255);
				k++;
			}
			alpha-=5;
		}else if(enderbombcharge>0){
			alpha=upper(alpha,120);
			k=0;
			loop(4){
				ObjEffect_SetVertexColor(obj3,k,alpha,255,255,255);
				k++;
			}
			alpha-=5;
		}
		if(IsForbidBomb&&y<12){
			y++;
			Obj_SetY(obj1,GetClipMaxY+1+y);
			Obj_SetY(obj2,GetClipMaxY+1+y);
			Obj_SetY(obj3,GetClipMaxY+1+y);
			Obj_SetY(obj4,GetClipMaxY+1+y);
		}
		if(!IsForbidBomb&&y>0){
			y--;
			Obj_SetY(obj1,GetClipMaxY+1+y);
			Obj_SetY(obj2,GetClipMaxY+1+y);
			Obj_SetY(obj3,GetClipMaxY+1+y);
			Obj_SetY(obj4,GetClipMaxY+1+y);
		}
		frame++;
		yield;
	}

function InitBombBar{
	let obj=Obj_Create(OBJ_EFFECT);
	ObjEffect_SetTexture(obj,img_ender);
	ObjEffect_CreateVertex(obj,4);
	ObjEffect_SetLayer(obj,4);
	Obj_SetPosition(obj,GetClipMinX+42,GetClipMaxY+1);
	ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
	return obj;
}

function SetRectBombBar(obj,num,x){
	let x2=0;
	if(x>300){
		x2=x-300;
	}
	x=trunc(x);
	x2=trunc(x2);
	ObjEffect_SetVertexUV(obj,0,-x2,247-num*9);
	ObjEffect_SetVertexUV(obj,1,x,247-num*9);
	ObjEffect_SetVertexUV(obj,2,x,256-num*9);
	ObjEffect_SetVertexUV(obj,3,-x2,256-num*9);
	ObjEffect_SetVertexXY(obj,0,-x2*2,-9);
	ObjEffect_SetVertexXY(obj,1,x-x2,-9);
	ObjEffect_SetVertexXY(obj,2,x-x2,0);
	ObjEffect_SetVertexXY(obj,3,-x2*2,0);
}

}

sub EnderSpell{
	UseSpellCard("Ender", trunc(enderbombcharge)-1);
}

let cyberx=[];
let cybery=[];
let cybera=[];
let cyberv=[];
let cyberg=[];
let cyberp=[];
let cybert;
let Frame2=0;
let enderopacity=1;

sub EnderDrawLogic{
	Frame++;
	if(Frame==5){
		Frame=0;
		Pose++;
		if(Pose==4){
			Pose=0;
		}
	}
	if(GetKeyState(VK_RIGHT)==KEY_HOLD||GetKeyState(VK_RIGHT)==KEY_PUSH){
		Dir=2;
	}else if(GetKeyState(VK_LEFT)==KEY_HOLD||GetKeyState(VK_LEFT)==KEY_PUSH){
		Dir=1;
	}else{Dir=0;}
	if(OnEdgeOfScreen){Dir=0;}

	Rot+=12-Focus*10;
	if(GetKeyState(VK_SLOWMOVE)==KEY_HOLD&&Focus<1){Focus+=0.1;}
	if(GetKeyState(VK_SLOWMOVE)==KEY_FREE&&Focus>0){Focus-=0.1;}

	if(Frame2%3==0){
		cybert=rand(0,360);
		cyberx[Frame2/3]=trunc(GetPlayerX+cos(cybert)*rand(0,40));
		cybery[Frame2/3]=trunc(GetPlayerY+sin(cybert)*rand(0,40));
		cybera[Frame2/3]=rand_int(0,3)*90;
		if(cybert<180){
			cyberv[Frame2/3]=-rand(1,2);
		}else{
			cyberv[Frame2/3]=rand(1,2);
		}
		cyberg[Frame2/3]=rand_int(0,15);
		cyberp[Frame2/3]=0;
	}

	cybert=0;
	loop(6){
		cybery[cybert]=cybery[cybert]+cyberv[cybert];
		cyberp[cybert]=cyberp[cybert]+1/(3*6);
		cybert++;
	}

	Frame2++;
	if(Frame2>=6*3){
		Frame2=0;
	}

	if(Frame2%2==0&&GetPlayerEx!=6){
		if(rand_int(0,10)==0){
			enderopacity=rand(0.5,0.9);
		}else{
			enderopacity=1-(Frame2/2%2)*0.2;
		}
	}

	EffectsLogic;
}

sub EnderDrawLoop{
	if(trunc(enderbombcharge)==0){
		SetColor(255,255,255);
	}else if(trunc(enderbombcharge)==1){
		SetColor(155+sin(Frame2*40)*100,155+sin(Frame2*40)*100,255);
	}else if(trunc(enderbombcharge)==2){
		SetColor(135+sin(Frame2*40)*120,255,135+sin(Frame2*40)*120);
	}else{
		SetColor(255,155+sin(Frame2*40)*100,155+sin(Frame2*40)*100);
	}
	SetTexture(img_ender);

	if(Focus>0){
		SetAlpha(90*Focus);
		let k=0;
		loop(6){
			SetGraphicRect(212+cyberg[k]%4*16,3+trunc(cyberg[k]/4)*16,212+16+cyberg[k]%4*16,3+16+trunc(cyberg[k]/4)*16);

			SetGraphicAngle(0,0,cybera[k]);
			SetGraphicScale( 1-upper(  absolute(0.5-cyberp[k])*2,0) ,4-Focus*3);
			DrawGraphic(cyberx[k]+(cyberx[k]-GetPlayerX)*(1-Focus),cybery[k]+(cybery[k]-GetPlayerY)*(1-Focus));
			k++;
		}
	}

	SetGraphicAngle(0,0,0);
	SetGraphicScale(Flip[Dir],1);
	SetGraphicRect(Left[Dir],0+54*Pose,Right[Dir],54+54*Pose);

	SetAlpha(InvincibilityAlpha*enderopacity);
	DrawGraphic(round(GetPlayerX+ScreenShakeX)+1, round(GetPlayerY+ScreenShakeY-2));
}



sub EnderFinalize{
    DSE("enshot");
    DSE("slash");
    DSE("charge");
    DSE("ting1");
    DSE("ting2");
    DSE("ting3");
    DeleteGraphic(img_ender);
}