public CoinState GetNextState() { float newXSpeed = (float)MoreMath.MoveNumberTowards(XSpeed, 0, 0.001f * XSpeed * XSpeed); float newZSpeed = (float)MoreMath.MoveNumberTowards(ZSpeed, 0, 0.001f * ZSpeed * ZSpeed); float newHSpeed = (float)Math.Sqrt(newXSpeed * newXSpeed + newZSpeed * newZSpeed); float newYSpeed = Math.Max(-78, YSpeed - 4); float newX = X + newXSpeed; float newZ = Z + newZSpeed; float newY = Y + newYSpeed; ushort newAngle = Angle; (double newXSpeed2, double newZSpeed2) = MoreMath.GetComponentsFromVector( newHSpeed, MoreMath.TruncateToMultipleOf16(newAngle)); newXSpeed = (float)newXSpeed2; newZSpeed = (float)newZSpeed2; return(new CoinState( newX, newY, newZ, newXSpeed, newYSpeed, newZSpeed, newHSpeed, newAngle)); }