task NhimorInit(shotdelay){
    LoadGraphic(img_nhimor);
    LSE("nhinee1");
    LSE("nhinee2");
    LSE("ting2");
    LSE("ring");
    LSE("bubble");
    LSE("nhimorlaser");
    SetPlayerLifeImage(img_nhimor, 208,52,252, 98);
    SetSpeed(4.5, 2.5);
    Pisclets;
    SetAutoEffect(false);
    SetCommonData("DrawNhineeClones",0);
    DeleteCommonData("NhimorAlwaysFollow");
    DeleteCommonData("NhimorTargetColor");
    PlayerForbidShotOffN;
    XOffset=[0,-6,6];
    YOffset=[-2,-1,-1];
    Left=[0,39,39];
    Right=[42,78,77];
    Flip=[1,-1,1];
    loop(shotdelay){yield;}
    if(ExPlayer){
	LoadPlayerShotData(GetCurrentScriptDirectory~"NhimorShotData2.txt");
    }else{
	LoadPlayerShotData(GetCurrentScriptDirectory~"NhimorShotData.txt");
    }
    playershot=2;
}

  let lastplayerx=GetPlayerX;
  let lastplayery=GetPlayerY;
  let currentpisclet=0;
  let angle=0;
  let timer=0;
  let firstkey=0;

  let NhineeColorArray=[
	[60,206,255],	//blue
	[231,236,70],	//yellow
	[255,156,156],	//pink
	[131,118,226],	//dark blue
	[247,55,55],	//red
	[201,226,235],	//white
	[175,63,255]	//purple
  ];
  let NhineeColor=[60,206,255];
  let NhineeTargetColor=0;
  let NhineeRainbowTime=0;
  let NhineeRT=[0,0,0];

sub NhimorMainLoop{
    if((GetKeyState(VK_SLOWMOVE)==KEY_HOLD&&dead==0)||GetCommonDataDefault("NhimorAlwaysFollow",0)==1){
	i=0;
	loop(4){
		pisclettx[i]=pisclettx[i]+GetPlayerX-lastplayerx;
		piscletty[i]=piscletty[i]+GetPlayerY-lastplayery;
		i++;
	}
    }
    lastplayerx=GetPlayerX;
    lastplayery=GetPlayerY;


    if(dead==1){	//if you just respawned
	ResetPositions(0);
    }
    dead=0;

    if((GetKeyState(VK_SHOT)==KEY_PUSH)&&GetKeyState(VK_SLOWMOVE)!=KEY_HOLD&&GetCommonDataDefault("NhimorAlwaysFollow",0)==0&&!IsForbidShot&&playershot==2){
	pisclettx[currentpisclet]=GetPlayerX;
	piscletty[currentpisclet]=GetPlayerY;
	currentpisclet=(currentpisclet+1)%4;
    }
    if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH){
	i=0;
	loop(4){
		if(distance(pisclettx[i],piscletty[i],GetPlayerX,GetPlayerY)>150){
			angle=atan2(piscletty[i]-GetPlayerY,pisclettx[i]-GetPlayerX);
			pisclettx[i]=GetPlayerX+cos(angle)*150;
			piscletty[i]=GetPlayerY+sin(angle)*150;
		}
		i++;
	}
    }


    if(GetKeyState(VK_SHOT)==KEY_PUSH){		//this chunk checks if shift and Z are pressed simultaneously
	if(timer==0){
		firstkey=0;
		timer=5;
	}else if(firstkey==1){
		ResetPositions(0);
	}
    }
    if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH){
	if(timer==0){
		firstkey=1;
		timer=5;
	}else if(firstkey==0){
		ResetPositions(0);
	}
    }


    if((GetKeyState(VK_SHOT)==KEY_PUSH || GetKeyState(VK_SHOT)==KEY_HOLD)){
	if((count==-1||count%8==0)&&GetCommonDataDefault("ForbidShot",0)==0&&GetPlayerY<GetClipMaxY+50){count = 0;}
    }
    if(count%8==1&&!IsForbidShot&&playershot==2){
	i=0;
	loop(4){
		CreatePlayerShot01Obj(piscletax[i]+cos(frame*4+i*90)*5,lower(piscletay[i]-sin(frame*8+i*180)+3,GetClipMaxY+20),10,prand(-90,-90),6,1,rand_int(1,4),255*shotopacity);
		i++;
	}
	if(GetCommonDataDefault("PlayerForbidShotN",false)==false){
		CreatePlayerShot01Obj(GetPlayerX   ,GetPlayerY,12,-90,3.5,1,rand_int(5,8),255*shotopacity);
		CreatePlayerShot01Obj(GetPlayerX-10,GetPlayerY,12,-95,3.5,1,rand_int(5,8),255*shotopacity);
		CreatePlayerShot01Obj(GetPlayerX+10,GetPlayerY,12,-85,3.5,1,rand_int(5,8),255*shotopacity);
	}
    }

    if(GetKeyState(VK_SLOWMOVE)!=KEY_PUSH && GetKeyState(VK_SLOWMOVE)!=KEY_HOLD){
	
    }else{   

    }
    if(count >= 0){
	count++;
    }
    if(count >= 32){
	count=-1;
    }
//    if(frame%3==0){
//	Goo(GetPlayerX+prand(-16,16),GetPlayerY+prand(-20,17),0,0.5,0.5,170,60);
//    }
    frame++;
    if(frame>360*8){
	frame-=360*8;
    }

    if(timer>0){timer--;}

    if(!ExPlayer){
	if(GetCommonDataDefault("NhimorAlwaysFollow",0)==0){
		NhineeTargetColor=0;
		if(GetPlayerLife==102){
			NhineeTargetColor=3;
		}else if(GetPlayerLife<=101){
			NhineeTargetColor=6;
		}
	}else{
		NhineeTargetColor=4;
	}
    }else{
	if(GetCommonDataDefault("NhimorAlwaysFollow",0)!=0){
		NhineeRainbowTime-=7;
		NhineeColor=RainbowArray(NhineeRainbowTime+GetCommonData("NhimorAlwaysFollow"),200,55);
	}else if(NhineeRainbowTime<=0){
		NhineeRainbowTime=90;
		NhineeRT=[0,0,0];
		while(NhineeRT[0]+NhineeRT[1]+NhineeRT[2]<400){
			i=0;
			loop(3){
				NhineeRT[i]=rand_int(50,255);
				i++;
			}
		}
		i=0;
		loop(3){
			NhineeRT[i]=(NhineeRT[i]-NhineeColor[i])/90;
			i++;
		}
	}else{
		i=0;
		loop(3){
			NhineeColor[i]=NhineeColor[i]+NhineeRT[i];
			i++;
		}
		NhineeRainbowTime--;
	}

    }

    SetCommonData("PiscletX",piscletax);
    SetCommonData("PiscletY",piscletay);
    NhimorDrawLogic;
}

let NhimorShot=GetCurrentScriptDirectory~"NhimorShot.png";

let piscletax=[0,0,0,0];	//actual x/y
let piscletay=[0,0,0,0];
let pisclettx=[0,0,0,0];	//target x/y
let piscletty=[0,0,0,0];

let piscletaddx=[-40,40,40,-40];
let piscletaddy=[-40,-40,40,40];

task Pisclets{
	while(playernum!=2){
		yield;
	}
	let followlayer=8;
	if(GetCommonDataDefault("InAWCMenu",0)>=1){
		followlayer=7;
	}

	ResetPositions(1);

	yield;

	ResetPositions(1);

	let obj=[];
	let objfollow=[];
	let k=0;
	loop(4){
		obj=obj~[Obj_Create(OBJ_EFFECT)];
		Obj_SetPosition(obj[k],pisclettx[k],piscletty[k]);
		ObjEffect_SetScale(obj[k],0.5,0.5);
		ObjEffect_SetLayer(obj[k],2);
		ObjEffect_SetTexture(obj[k],img_nhimor);
		ObjEffect_SetPrimitiveType(obj[k],PRIMITIVE_TRIANGLEFAN);
		ObjEffect_CreateVertex(obj[k],4);
		ObjEffect_SetVertexXY(obj[k],0,-18,-18);
		ObjEffect_SetVertexXY(obj[k],1, 18,-18);
		ObjEffect_SetVertexXY(obj[k],2, 18, 18);
		ObjEffect_SetVertexXY(obj[k],3,-18, 18);
		if(ExPlayer){
			goocolor=k;
		}
		Pisclet_SetGraphic(obj[k],k);

		objfollow=objfollow~[Obj_Create(OBJ_EFFECT)];
		Obj_SetY(objfollow[k],480);
		Obj_SetAutoDelete(objfollow[k],false);
		ObjEffect_SetLayer(objfollow[k],followlayer);
		ObjEffect_SetTexture(objfollow[k],img_nhimor);
		ObjEffect_SetPrimitiveType(objfollow[k],PRIMITIVE_TRIANGLEFAN);
		ObjEffect_CreateVertex(objfollow[k],4);
		ObjEffect_SetVertexXY(objfollow[k],0,-5,-15);
		ObjEffect_SetVertexXY(objfollow[k],1, 5,-15);
		ObjEffect_SetVertexXY(objfollow[k],2, 5,  0);
		ObjEffect_SetVertexXY(objfollow[k],3,-5,  0);
		ObjEffect_SetVertexUV(objfollow[k],0,174,38);
		ObjEffect_SetVertexUV(objfollow[k],1,184,38);
		ObjEffect_SetVertexUV(objfollow[k],2,184,53);
		ObjEffect_SetVertexUV(objfollow[k],3,174,53);

		k++;
	}
	k=0;
	loop(16){
		ObjEffect_SetVertexColor(obj[trunc(k/4)],k%4,200,255,255,255);
		k++;
	}
	let dist=0;
	let angle=0;
	let x;
	let y;
	while(playernum==2){
		k=0;
		loop(4){
			x=Obj_GetX(obj[k]);
			y=Obj_GetY(obj[k]);
			dist=distance(x,y,pisclettx[k],piscletty[k]);
			if(dist>1){
				angle=atan2(piscletty[k]-y,pisclettx[k]-x);
				x+=cos(angle)*dist*0.15;
				y+=sin(angle)*dist*0.15;
			}
			Obj_SetPosition(obj[k],x+cos(frame*4+k*90)+ScreenShakeX,y-sin(frame*8+k*180)+ScreenShakeY);
			if(GetPlayerY<GetClipMaxY+50){
				Obj_SetX(objfollow[k],center(37,piscletax[k],412));
			}else{
				Obj_SetX(objfollow[k],-20);
			}
			piscletax[k]=x;
			piscletay[k]=y;
			k++;
		}
		if(frame%4==0){
			k=0;
			loop(4){
				if(ExPlayer){
					Pisclet_SetGraphic(obj[k],k);
					ObjEffect_SetAngle(obj[k],0,0,rand(0,360));
				}else{
					Pisclet_SetGraphic(obj[k],(trunc(frame/4)+k)%4);
				}
				k++;
			}
		}
		if(frame%2==0){
			k=trunc(frame/2)%4;
			if(ExPlayer){
				goocolor=k;
			}else if(k==currentpisclet){
				goocolor=5;//white
			}
			Goo(piscletax[k],piscletay[k],0,0.5,0.4,200,30);
		}
		yield;
	}
	k=0;
	loop(4){
		Obj_Delete(obj[k]);
		Obj_Delete(objfollow[k]);
		k++;
	}
}
function ResetPositions(actual){
	pisclettx=[GetPlayerX+piscletaddx[0],GetPlayerX+piscletaddx[1],GetPlayerX+piscletaddx[2],GetPlayerX+piscletaddx[3]];
	piscletty=[GetPlayerY+piscletaddy[0],GetPlayerY+piscletaddy[1],GetPlayerY+piscletaddy[2],GetPlayerY+piscletaddy[3]];
	piscletax=pisclettx;
	if(actual!=0){
		piscletay=piscletty;
	}
}
sub NhimorSpell{
    if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD){
      UseSpellCard("NhimorF", 0);
    }else{
      UseSpellCard("NhimorU", 0);
    }
  }


sub NhimorDrawLogic{
	Frame++;
	if(Frame==6){
		Frame=0;
		Pose++;
		if(Pose==4){
			Pose=0;
		}
	}

	Dir=0;
	if(GetCommonDataDefault("NhimorTargetColor",-1)>-1){
		loop(3){
			NhineeColor[Dir]=NhineeColor[Dir]+(NhineeColorArray[  GetCommonDataDefault("NhimorTargetColor",NhineeTargetColor) ][Dir]-NhineeColor[Dir])/20;
			Dir++;
		}
	}else if(!ExPlayer){
		loop(3){
			NhineeColor[Dir]=NhineeColor[Dir]+(NhineeColorArray[NhineeTargetColor][Dir]-NhineeColor[Dir])/25;
			Dir++;
		}
	}


	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.08;}
	if(GetKeyState(VK_SLOWMOVE)==KEY_FREE&&Focus>0){Focus-=0.08;}

	EffectsLogic;
}


sub NhimorDrawLoop{
	SetColor(255,255,255);
	SetTexture(img_nhimor);

	SetGraphicRect(80,10,144,54);
	SetGraphicScale(2.2-Focus,2.2-Focus);
	SetGraphicAngle(0,0,Rot);
	SetAlpha(Focus*(InvincibilityAlpha*0.8));
//	DrawGraphic(GetPlayerX,GetPlayerY);


	if(GetCommonData("DrawNhineeClones")==1){
		i=0;
		loop(length(GetCommonData("NhineeCloneX"))){
			DrawNhinee(GetCommonData("NhineeCloneX")[i],GetCommonData("NhineeCloneY")[i],255,GetCommonData("NhineeCloneDir")[i],trunc(i+frame/6)%4,i+1);
			i++;
		}
	}

	DrawNhinee(GetPlayerX,GetPlayerY,InvincibilityAlpha,Dir,Pose,0);

	DrawFocus;
  }
  function DrawNhinee(x,y,alpha,dir,pose,clonenum){

	SetAlpha(alpha);

	SetGraphicScale(Flip[dir],1);
	SetGraphicAngle(0,0,0);
	if(clonenum>0&&ExPlayer){
		let i=x*3+(frame);
		SetColor(Rainbow(0,i)*100+155,Rainbow(1,i)*100+155,Rainbow(2,i)*100+155);
	}else{
		SetColor(NhineeColor[0],NhineeColor[1],NhineeColor[2]);
	}

	SetGraphicRect(Left[dir],0+60*pose,Right[dir],60+60*pose);
	DrawGraphic(round(x+XOffset[dir]+ScreenShakeX), round(y+YOffset[dir]+ScreenShakeY));

	SetColor(255,255,255);

	SetGraphicRect(Left[dir]+80,0+60*pose,Right[dir]+80,60+60*pose);
	DrawGraphic(round(x+XOffset[dir]+ScreenShakeX), round(y+YOffset[dir]+ScreenShakeY));

  }





sub NhimorFinalize{
    DeleteGraphic(img_nhimor);
    DSE("nhinee1");
    DSE("nhinee2");
    DSE("ting2");
    DSE("ring");
    DSE("bubble");
    DSE("nhimorlaser");
  }