task SetMovePositionBezier(ControlX,ControlY,EndX,EndY,frame)
{
	let X=[GetX]~ControlX~[EndX];
	let Y=[GetY]~ControlY~[EndY];

	let num=length(X);

	let C=[];
	ascent(i in 0..num)
	{
		C=C~[factorial(num-1)/(factorial(num-1-i)*factorial(i))];
	}

	let x=0;
	let y=0;
	let k;
	let count=0;

	loop(frame)
	{
		k=count/frame;
		ascent(i in 0..num)
		{
			x+=C[i]*(1-k)^(num-1-i)*k^i*X[i];
			y+=C[i]*(1-k)^(num-1-i)*k^i*Y[i];
		}
		SetX(x);
		SetY(y);
		x=0;
		y=0;
		count+=1;
		yield;
    	}
}

task SetMovePositionBSpline(ControlX,ControlY,frame)
{
	let SX=GetX;
	let SY=GetY;

	let SCX=(SX-1/6*ControlX[1]-2/3*ControlX[0])*6;
	let SCY=(SY-1/6*ControlY[1]-2/3*ControlY[0])*6;

	let X=[SCX]~ControlX;
	let Y=[SCY]~ControlY;

	let num=length(X);

	let E=[0,0,0,0];
	let i=0;
	let x=0;
	let y=0;
	let k;
	let count=0;

	while(i+4<=num)
	{
		loop(frame)
		{
			k=count/frame;
			E[0]=-1/6*k^3 + 1/2*k^2 - 1/2*k + 1/6;
			E[1]= 1/2*k^3 - k^2		+ 2/3;
			E[2]=-1/2*k^3 + 1/2*k^2 + 1/2*k + 1/6;
			E[3]= 1/6*k^3;
			ascent(j in 0..4)
			{
				x+=E[j]*X[j+i];
				y+=E[j]*Y[j+i];
			}
			SetX(x);
			SetY(y);
			x=0;
			y=0;
			count+=1;
			yield;
    		}
		count=0;
		i+=1;
	}
}

task Obj_SetMovePosition01(obj,EndX,EndY,Speed)
{
	let Angle=atan2(EndY-Obj_GetY(obj),EndX-Obj_GetX(obj));
	let MoveDistance=((EndY-Obj_GetY(obj))^2+(EndX-Obj_GetX(obj))^2)^0.5;
	let time=floor(MoveDistance/Speed);
 	loop(time)
	{
		Obj_SetX(obj,Obj_GetX(obj)+Speed*cos(Angle));
		Obj_SetY(obj,Obj_GetY(obj)+Speed*sin(Angle));
               	yield;
	}
}

task Obj_SetMovePosition02(obj,EndX,EndY,Frame)
{
	let Angle=atan2(EndY-Obj_GetY(obj),EndX-Obj_GetX(obj));
	let MoveDistance=((EndY-Obj_GetY(obj))^2+(EndX-Obj_GetX(obj))^2)^0.5;
	let Speed=MoveDistance/Frame;
 	loop(Frame)
	{
		Obj_SetX(obj,Obj_GetX(obj)+Speed*cos(Angle));
		Obj_SetY(obj,Obj_GetY(obj)+Speed*sin(Angle));
               	yield;
	}
}

task Obj_SetMovePosition03(obj,EndX,EndY,Weight,MaxSpeed)
{
	let SX=Obj_GetX(obj);
	let SY=Obj_GetY(obj);
	let Angle=atan2(EndY-SY,EndX-SX);
	let MoveDistance=((EndY-SY)^2+(EndX-SX)^2)^0.5;
	let Cspeed=MaxSpeed;
	let e=2.71828;
	let count=0;
	let AttenuationTime=trunc((MoveDistance-Weight*MaxSpeed)*10)/10/MaxSpeed;
	let AttenuationCount=0;

 	while(Cspeed>MaxSpeed/20)
	{
		if(MoveDistance>MaxSpeed*Weight)
		{
			if(AttenuationCount<AttenuationTime)
			{
				Cspeed=MaxSpeed;
			}
			else
			{
				Cspeed=MaxSpeed*e^(-count/Weight);
				count+=1;
			}
		}
		else
		{
			Cspeed=MoveDistance/Weight*e^(-count/Weight);
			count+=1;
		}
		Obj_SetX(obj,Obj_GetX(obj)+Cspeed*cos(Angle));
		Obj_SetY(obj,Obj_GetY(obj)+Cspeed*sin(Angle));
		AttenuationCount+=1;
               	yield;
	}
}

task Obj_SetMovePositionHermite(obj,EndX,EndY,Size1,Angle1,Size2,Angle2,frame)
{
	let StartX=Obj_GetX(obj);
	let StartY=Obj_GetY(obj);
	let x=[0,0,0,0];
	let y=[0,0,0,0];
	let k;
	let count=0;
	loop(frame)
	{
		k=count/frame;
		x[0]=2*StartX+Size1*cos(Angle1)-2*EndX+Size2*cos(Angle2);
		x[1]=-3*StartX-2*Size1*cos(Angle1)+3*EndX-Size2*cos(Angle2);
		x[2]=Size1*cos(Angle1);
		x[3]=StartX;
		Obj_SetX(obj,x[0]*k^3+x[1]*k^2+x[2]*k+x[3]);

		y[0]=2*StartY+Size1*sin(Angle1)-2*EndY+Size2*sin(Angle2);
		y[1]=-3*StartY-2*Size1*sin(Angle1)+3*EndY-Size2*sin(Angle2);
		y[2]=Size1*sin(Angle1);
		y[3]=StartY;
		Obj_SetY(obj,y[0]*(k^3)+y[1]*(k^2)+y[2]*k+y[3]);
		count+=1;
		yield;
    	}
}

task Obj_SetMovePositionBezier(obj,ControlX,ControlY,EndX,EndY,frame)
{
	let X=[Obj_GetX(obj)]~ControlX~[EndX];
	let Y=[Obj_GetY(obj)]~ControlY~[EndY];

	let num=length(X);

	let C=[];
	ascent(i in 0..num)
	{
		C=C~[factorial(num-1)/(factorial(num-1-i)*factorial(i))];
	}

	let x=0;
	let y=0;
	let k;
	let count=0;

	loop(frame)
	{
		k=count/frame;
		ascent(i in 0..num)
		{
			x+=C[i]*(1-k)^(num-1-i)*k^i*X[i];
			y+=C[i]*(1-k)^(num-1-i)*k^i*Y[i];
		}
		Obj_SetX(obj,x);
		Obj_SetY(obj,y);
		x=0;
		y=0;
		count+=1;
		yield;
    	}
}

task Obj_SetMovePositionBSpline(obj,ControlX,ControlY,frame)
{
	let SX=Obj_GetX(obj);
	let SY=Obj_GetY(obj);

	let SCX=(SX-1/6*ControlX[1]-2/3*ControlX[0])*6;
	let SCY=(SY-1/6*ControlY[1]-2/3*ControlY[0])*6;

	let X=[SCX]~ControlX;
	let Y=[SCY]~ControlY;

	let num=length(X);

	let E=[0,0,0,0];
	let i=0;
	let x=0;
	let y=0;
	let k;
	let count=0;

	while(i+4<=num)
	{
		loop(frame)
		{
			k=count/frame;
			E[0]=-1/6*k^3 + 1/2*k^2 - 1/2*k + 1/6;
			E[1]= 1/2*k^3 - k^2		+ 2/3;
			E[2]=-1/2*k^3 + 1/2*k^2 + 1/2*k + 1/6;
			E[3]= 1/6*k^3;
			ascent(j in 0..4)
			{
				x+=E[j]*X[j+i];
				y+=E[j]*Y[j+i];
			}
			Obj_SetX(obj,x);
			Obj_SetY(obj,y);
			x=0;
			y=0;
			count+=1;
			yield;
    		}
		count=0;
		i+=1;
	}
}

function factorial(num)
{
	num=absolute(num);
	if(num==0){num=1;}
	let answer=num;
	while(num>1)
	{
		num-=1;
		answer*=num;
	}
	return(answer);
}