/// <summary>
    /// Specialized Graphics Raycast for working with the hand card to be focused.
    /// </summary>
    /// <param name="tag">The tag of the card objects</param>
    /// <returns>true if a card is found, false if otherwise.</returns>
    private bool HandCardGR(string tag)
    {
        m_PointerEventData          = new PointerEventData(es);
        m_PointerEventData.position = Input.mousePosition;
        List <RaycastResult> results = new List <RaycastResult>();

        raycaster.Raycast(m_PointerEventData, results);


        foreach (RaycastResult r in results)
        {
            if (r.gameObject.CompareTag(tag) && r.gameObject.layer != 2)
            {
                this.selectedCard = r.gameObject.GetComponent <UIHandCard>();
                if (UIHandCardManager.Instance.GetPreviewedCard() != this.selectedCard)
                {
                    UIHandCardManager.Instance.RemovePreview();
                    UIHandCardManager.Instance.PreviewCard(this.selectedCard);
                }

                return(true);
            }
        }
        return(false);
    }
    /// <summary>
    /// Adds a UIHandCard for the specified card.
    /// </summary>
    /// <param name="card">The card to be add to UI</param>
    public void AddHandCard(Card card)
    {
        GameObject newCard = Instantiate(UIHandCardPrefab);

        UIHandCard uhc = newCard.GetComponent <UIHandCard> ();

        newCard.transform.SetParent(UIHandCardContainer.transform, false);
        uhc.Set(card);
    }
 /// <summary>
 /// Removes the previewed card, if any.
 /// </summary>
 public void RemovePreview()
 {
     if (this.previewedCard == null)
     {
         return;
     }
     this.previewedCard.ShouldShow(true);
     Destroy(this.previewCopy);
     this.previewedCard = null;
 }
    public void StopDragging()
    {
        if (selectedCard == null)
        {
            return;
        }

        selectedCard.transform.SetParent(this.UIHandCardContainer.transform);
        selectedCard.transform.SetSiblingIndex(this.originalIndex);
        selectedCard       = null;
        this.originalIndex = -1;
        StopCoroutine("DragCoroutine");
    }
 IEnumerator DragCoroutine()
 {
     selectedCard = this.UIHandCardContainer.transform.GetChild(originalIndex).GetComponent <UIHandCard>();
     selectedCard.transform.SetParent(this.dragContainer.transform, true);
     selectedCard.GetComponent <RectTransform>().pivot = new Vector2(0.5f, 0.5f);
     selectedCard.transform.localEulerAngles           = Vector3.zero;
     RemovePreview();
     while (true)
     {
         Vector3 newPos = Input.mousePosition;
         newPos.z = 1;
         newPos   = Camera.main.ScreenToWorldPoint(newPos);
         selectedCard.transform.position = newPos;
         yield return(null);
     }
 }
    /// <summary>
    /// Sets a card to be previewed.
    /// </summary>
    /// <param name="card">card to be previewed.</param>
    public void PreviewCard(UIHandCard card)
    {
        if (!isHiding && !isHidden)
        {
            PeekDown(false);
        }

        this.previewedCard = card;
        //this.prevCardOriginalScale = card.transform.localScale;
        this.originalIndex = card.transform.GetSiblingIndex();

        this.previewCopy = Instantiate(card.gameObject, UIHandCardPreview.transform, true);
        this.previewedCard.ShouldShow(false);
        this.previewCopy.layer = 2;
        //this.previewCopy.transform.localEulerAngles = Vector3.zero;
        //this.previewCopy.transform.localScale = new Vector3(this.previewCardScaleMultiplier, this.previewCardScaleMultiplier, this.previewCardScaleMultiplier);
        this.previewCopy.transform.localPosition = new Vector3(this.previewCopy.transform.localPosition.x, previewCardYPos);
    }
    // Update is called once per frame
    void Update()
    {
        if (!GameMaster.Instance.IsInActionPhase())
        {
            return;
        }

        if (isHeld)
        {
            if (Input.GetMouseButtonUp(0))
            {
                isHeld            = false;
                this.selectedCard = null;
                UIHandCardManager.Instance.RemovePreview();

                PlayerManager curPlayer = MainScreenManager_GameScene.Instance.GetPlayer();
                SoldierPlacementManager.Instance.SetTargetable(curPlayer, false);
                Card finalCard = UIHandCardManager.Instance.GetSelectedCard();

                bool replenishDefenseMode = GameMaster.Instance.IsReplenishMode();
                if (this.GRGeneral("OutZone"))
                {
                    UIHandCardManager.Instance.StopDragging();

                    // Hearts card was dropped -- Special Interaction
                    if (finalCard.GetCardSuit() == Card.Suit.HEARTS)
                    {
                        // Special interaction
                        int rank = finalCard.GetCardRank();
                        switch (rank)
                        {
                        case 1:                                 // +1 move
                            curPlayer.IncrementMove();
                            ActionsLeftPanel.Instance.Show();
                            Debug.Log("<color='green'> move incremented by 1 </color>");
                            break;

                        case 2:                                 // Swap rule
                            // Show Rule (higher/lower) has been swapped UI
                            bool prevRule = GameMaster.Instance.IsRuleHigher;
                            GameMaster.Instance.SwapHigherLower();
                            PlayerPanel.Instance.UpdateRuleIcon(!prevRule);
                            ActionsLeftPanel.Instance.ShowReverseRule(!prevRule);

                            Debug.Log("<color='green'> RULE SWAPPED: " + prevRule + "->" + GameMaster.Instance.IsRuleHigher + " </color>");
                            break;

                        default:                                 //Do nothing
                            break;
                        }
                        curPlayer.GetCardManager().GetHandManager().RemoveFromHand(finalCard);
                        Debug.Log("<color='blue'> Hearts removed from hand </color>");
                        return;
                    }

                    // Differentiate Defense interactions w/ Bullet-loadings
                    GameObject hit = PRGeneral("Soldier");
                    if (replenishDefenseMode)                           // REPLENISH DEFENSE MDOE INTERACTIONS ((TODO: might want to remove this))
                    {
                        if (hit != null)
                        {
                            // Replenish Soldier
                            Soldier hitSoldier = hit.GetComponent <SoldierCollider>().GetSoldier();
                            SoldierPlacementManager.Instance.ReplenishDefense(curPlayer, finalCard, hitSoldier);
                            Debug.Log("Soldier replenish HIT: " + hitSoldier.name);
                        }
                        else
                        {
                            hit = PRGeneral("Backup");
                            if (hit != null)
                            {
                                // Replenish Backup
                                SoldierBackup hitBackup = hit.GetComponent <SoldierBackupCollider>().GetSoldierBackup();
                                SoldierPlacementManager.Instance.ReplenishDefense(curPlayer, finalCard, hitBackup);
                                Debug.Log("Backup replenish HIT: " + hitBackup.name);
                            }
                        }
                    }
                    else
                    {
                        hit = PRGeneral("Backup");
                        if (hit != null)
                        {
                            SoldierBackup hitBackup = hit.GetComponent <SoldierBackupCollider>().GetSoldierBackup();
                            if (hitBackup.GetPlayer() == curPlayer && !hitBackup.IsHidden)
                            {
                                // Swap backup / place new backup
                                SoundManager.Instance.Play(AudibleNames.Button.SWITCH);
                                Debug.Log("Backup HIT: " + hitBackup.name);
                                SoldierPlacementManager.Instance.ReplenishDefense(curPlayer, finalCard, hitBackup);
                            }
                            else
                            {
                                //Load Bullet
                                if (curPlayer.GetMovesLeft() > 0)
                                {
                                    if (GameMaster.Instance.IsValidCard(finalCard))
                                    {
                                        // If card passes the current rule
                                        AttackManager.Instance.LoadCard(finalCard);
                                        //UIHandCardManager.Instance.ShowHand(false);
                                    }
                                    else
                                    {
                                        RuleManager.Instance.GetRulePanelAnimatable().Shake();
                                    }
                                }
                                else
                                {
                                    PlayerPanel.Instance.GetMovesLeftAnimatable().Shake();
                                }
                            }
                        }
                        else
                        {
                            // Load bullet
                            if (curPlayer.GetMovesLeft() > 0)
                            {
                                if (GameMaster.Instance.IsValidCard(finalCard))
                                {
                                    // If card passes the current rule
                                    AttackManager.Instance.LoadCard(finalCard);
                                    //UIHandCardManager.Instance.ShowHand(false);
                                }
                                else
                                {
                                    RuleManager.Instance.GetRulePanelAnimatable().Shake();
                                }
                            }
                            else
                            {
                                PlayerPanel.Instance.GetMovesLeftAnimatable().Shake();
                            }
                        }
                    }
                }
                else
                {
                    SoundManager.Instance.Play(AudibleNames.Button.RELEASE);
                    UIHandCardManager.Instance.StopDragging();
                }

                return;
            }
        }
        else
        {
            bool hasSelected = this.HandCardGR("UIHandCard");

            if (!hasSelected)
            {
                this.selectedCard = null;
                UIHandCardManager.Instance.RemovePreview();
                if (Input.GetMouseButtonDown(0))
                {
                    if (this.GRGeneral("OutZone"))
                    {
                        UIHandCardManager.Instance.PeekDown(true);
                    }
                }
            }
            else if (hasSelected && Input.GetMouseButtonDown(0))
            {
                isHeld = UIHandCardManager.Instance.BeginDragging();
                SoldierPlacementManager.Instance.SetTargetable(MainScreenManager_GameScene.Instance.GetPlayer(), true);
            }

            // Miscellaneous handling
            if (Input.GetMouseButtonDown(0))
            {
                RaycastHit hit;
                Ray        ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
                if (Physics.Raycast(ray, out hit, float.PositiveInfinity))
                {
                    // If Backupmat is pressed on screen, show.
                    GameObject mat = PRGeneral("BMC");
                    if (!isHeld && mat != null)
                    {
                        BackupMatCollider bmc = mat.GetComponent <BackupMatCollider>();
                        if (bmc.GetPlayer() == MainScreenManager_GameScene.Instance.GetPlayer())
                        {
                            bmc.GetParent().ToggleBackupMat();
                        }
                    }
                }
            }
        }
    }