// Use this for initialization
    void Start()
    {
        GridUpdateSubscriber   gus = GetComponent <GridUpdateSubscriber>();
        GridMovementSubscriber gms = GetComponent <GridMovementSubscriber>();

        gus.SetSubscriberMethod(new GridUpdateSubscriber.SubscriberDelegate(SubUpdate));
        gms.SetMovementMethod(new GridMovementSubscriber.MovementMethod(SubMovement));
        gms.SetAttackMethod(new GridMovementSubscriber.AttackMethod(SubAttack));
    }
    protected void Init()
    {
        // NOTE(clark, 2/8/2017): Added ec. Calling GetComponent takes a fair bit of time
        ec = GetComponent <EnemyComponent>();
        GridUpdateSubscriber   gus = GetComponent <GridUpdateSubscriber>();
        GridMovementSubscriber gms = GetComponent <GridMovementSubscriber>();

        gus.SetSubscriberMethod(new GridUpdateSubscriber.SubscriberDelegate(SubUpdate));
        gms.SetMovementMethod(new GridMovementSubscriber.MovementMethod(SubMovement));
        gms.SetAttackMethod(new GridMovementSubscriber.AttackMethod(SubAttack));
    }
    // Processed the current state.
    void ProcessState()
    {
        // Check for null case
        if (declaredMovement == Vector2.zero)
        {
            state = MoveStates.IDLE;
        }

        else
        {
            // Do a raycast to check for player and environment collision.
            // Shoot out a ray to check for a collision with the level layer.
            RaycastHit2D hit = Physics2D.Raycast(
                transform.position + (Vector3)declaredMovement, // origin
                Vector2.up,                                     // direction!
                0.1f,                                           // Only check this cell unit on Grid
                LayerMask.GetMask("Level", "Player", "Enemies")
                );

            // Hit something.
            if (hit.collider != null)
            {
                LayerMask mask = hit.collider.gameObject.layer;
                // Switch off the mask
                // Debug.Log(mask);

                // Player layer hit.
                if (mask == LayerMask.NameToLayer("Player"))
                {
                    state = MoveStates.IDLE;
                }

                // Enemies layer hit
                else if (mask == LayerMask.NameToLayer("Enemies"))
                {
                    Debug.Log("Hit an enemy");
                    GridMovementSubscriber t_gms =
                        hit.collider.gameObject.GetComponent <GridMovementSubscriber>();

                    if (t_gms != null)
                    {
                        MoveStates t_state = t_gms.GetState();
                        // If it has not processed its mo

                        // Force it to finish its movement. Recursive.
                        if (t_state == MoveStates.NULL)
                        {
                            t_gms.Move();
                            ProcessState();
                        }
                        // If it hits this, then we've gotten into a recursive loop. Time to end it.
                        // Or it's just finished. Either way, it has already processed.
                        else
                        {
                            state = MoveStates.IDLE;
                        }
                    }
                    // Else the enemy doesn't move. Therefore I can't move.
                    else
                    {
                        state = MoveStates.IDLE;
                    }
                }

                // Level layer hit
                else if (mask == LayerMask.NameToLayer("Level"))
                {
                    state = MoveStates.IDLE;
                }
            }
            else
            {
                state = MoveStates.MOVING;
            }
        }
        // Debug.Log(transform.name + ": State- " + state.ToString());
    }