void HookMove()
    {
        //break up the rope
        if (ropeTargets.Count > 1)
        {
            for (int i = 1; i < ropeTargets.Count; i++)
            {
                if (Vector2.Distance(ropeTargets[i], ropeTargets[i - 1]) < .2)
                {
                    ropeTargets.RemoveAt(i);
                    i--;
                }
            }
        }
        if (ropeTargets.Count > 1)
        {
            for (int i = 0; i < ropeTargets.Count - 1; i++)
            {
                Vector2 ropeTargetA = ropeTargets[i];
                ropeA = Physics2D.Linecast(transform.position, ropeTargetA, mask);
                if (ropeA.point == ropeTargetA)
                {
                    for (int j = i + 1; j < ropeTargets.Count; j++)
                    {
                        ropeTargets.RemoveAt(j);
                        if (ropeTargets.Count > j)
                        {
                            ropeTargetA = ropeTargets[j];
                        }
                        joint.distance        = Vector2.Distance(transform.position, ropeTargetA);
                        joint.connectedAnchor = ropeTargetA;
                    }
                    joint.distance        = Vector2.Distance(transform.position, ropeTargetA);
                    joint.connectedAnchor = ropeTargetA;
                    i = ropeTargets.Count;
                }
            }
        }
        Vector2 ropeTargetB = ropeTargets [ropeTargets.Count - 1];

        ropeB = Physics2D.Linecast(transform.position, ropeTargetB, mask);
        if (ropeB.collider != null && ropeB.point != ropeTargetB)
        {
            ropeTargets.Add(ropeB.point);
            joint.connectedAnchor = ropeB.point;
            joint.distance        = ropeB.distance;
        }

        hookDistance = hookMaxDistance;
        for (int i = 1; i < ropeTargets.Count; i++)
        {
            if (ropeTargets[i] != Vector2.zero)
            {
                hookDistance -= Vector2.Distance(ropeTargets [i], ropeTargets [i - 1]);
            }
        }
        if (joint.distance > hookDistance)
        {
            joint.distance = hookDistance;
        }
        //point the player toward the rope
        transform.LookAt(joint.connectedAnchor);
        transform.rotation = new Quaternion(0, 0, transform.rotation.z, transform.rotation.w);

        if (Input.touchCount > 0)
        {
            switch (Input.GetTouch(0).phase)
            {
            case TouchPhase.Began:
                targetA = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
                break;

            case TouchPhase.Moved:
                isSecondary = true;
                if (Mathf.Abs(Input.GetTouch(0).deltaPosition.y) > 0)
                {
                    joint.distance += -.1f * (Input.GetTouch(0).deltaPosition.y / Mathf.Abs(Input.GetTouch(0).deltaPosition.y));
                    if (joint.distance > hookDistance)
                    {
                        joint.distance = hookDistance;
                    }
                }
                if (Mathf.Abs(Input.GetTouch(0).deltaPosition.x) > 0)
                {
                    body.AddForce(Input.GetTouch(0).deltaPosition.normalized * 20);
                }
                break;

            case TouchPhase.Ended:
                if (!isSecondary)
                {
                    joint.enabled = false;
                    rope.enabled  = false;
                    ropeTargets.Clear();
                    hookDistance = hookMaxDistance;
                    currentHook.KillYourself();
                    SetCurrentState(ControlState.IN_AIR);
                }
                isSecondary = false;
                break;
            }
        }
    }