/// <summary>
    /// Send move by Photon event (Photon turn extention).
    /// </summary>
    /// <param name="Action">Move action type.</param>
    /// <param name="PawnID">Moving pawnID</param>
    /// <param name="EffectName">Card effect class name</param>
    /// <param name="TargetPawnID">Move target pawn ID</param>
    /// <param name="TargetPosition">Target position</param>
    /// <param name="TargetRotation">Target rotation index (0-5)</param>
    /// <param name="HandIndex">Card hand index</param>
    /// <param name="SendBackEvent">Process this move locally (false by default)</param>
    public void GameplaySendMove(
        GamePlayActionStack.ActionTypeEnum Action,
        int PawnID,
        string EffectName,
        int TargetPawnID,
        int TargetPosition,
        int TargetRotation,
        int HandIndex,
        bool SendBackEvent = false)
    {
        GameplayPlayerMove move = new GameplayPlayerMove();

        move.Action         = Action;
        move.PawnID         = PawnID;
        move.EffectName     = EffectName;
        move.TargetPawnID   = TargetPawnID;
        move.TargetPosition = TargetPosition;
        move.TargetRotation = TargetRotation;
        move.HandIndex      = HandIndex;

        Debug.Log("[SEND EVENT]:" + JsonUtility.ToJson(move).ToString());
        this.turnManager.SendMove(JsonUtility.ToJson(move), false, SendBackEvent);
    }
    public void OnPlayerMove(PhotonPlayer sender, int turn, object move)
    {
        GameplayPlayerMove gPlayMove = JsonUtility.FromJson <GameplayPlayerMove> (move.ToString());

        Debug.Log("[RECEIVE EVENT]:" + move.ToString());

        if (gPlay.skipAnimations)
        {
            gPlay.RefreshPawnsHealth();
        }

        if ((gPlay.skipAnimations) && (turn == this.turnManager.Turn))
        {
            gPlay.skipAnimations = false;
        }

        if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.firstPlayer)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.SetAsSecondPlayer();
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.setHero)
        {
            if (sender == PhotonNetwork.player)
            {
                gPlay.SetMyHero(gPlayMove.EffectName);                 //hacky way, one string in struckture
            }
            else
            {
                gPlay.SetEnemyHero(gPlayMove.EffectName);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.signalReady)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.EnemyIsReady = true;
                gPlay.MatchStart();
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.redraw)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.EnemyRemoveCardFromHand(gPlayMove.HandIndex);
                gPlay.EnemyCardDraw();
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.draw)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.EnemyCardDraw();
            }
            else
            {
                gPlay.Draw(true);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.play)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.PutEnemyPawnOnBoard(gPlayMove.EffectName,
                                          gPlayMove.PawnID, gPlayMove.TargetRotation,
                                          gPlayMove.HandIndex, gPlayMove.TargetPosition);
            }
            else
            {
                gPlay.PutEnemyPawnOnBoard(gPlayMove.EffectName,
                                          gPlayMove.PawnID, gPlayMove.TargetRotation,
                                          gPlayMove.HandIndex, gPlayMove.TargetPosition, false);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.move)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.ChangeEnemyPawnPos(gPlayMove.PawnID, gPlayMove.TargetRotation,
                                         gPlayMove.TargetPosition);
            }
            else
            {
                gPlay.ChangeEnemyPawnPos(gPlayMove.PawnID, gPlayMove.TargetRotation,
                                         gPlayMove.TargetPosition);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.moveConfirm)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.ConfirmEnemyPawnPos(gPlayMove.EffectName, gPlayMove.PawnID,
                                          gPlayMove.TargetRotation, gPlayMove.TargetPosition);
            }
            else
            {
                gPlay.ConfirmEnemyPawnPos(gPlayMove.EffectName, gPlayMove.PawnID,
                                          gPlayMove.TargetRotation, gPlayMove.TargetPosition);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.playItem)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.PutEnemyWeaponOnBoard(gPlayMove.EffectName, gPlayMove.TargetRotation,
                                            gPlayMove.HandIndex, gPlayMove.TargetPosition);
            }
            else
            {
                gPlay.PutEnemyWeaponOnBoard(gPlayMove.EffectName, gPlayMove.TargetRotation,
                                            gPlayMove.HandIndex, gPlayMove.TargetPosition, false);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.playEffect)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.PlayEnemyEffectOnBoard(gPlayMove.EffectName, gPlayMove.TargetPawnID,
                                             gPlayMove.TargetPosition, gPlayMove.HandIndex);
            }
            else
            {
                gPlay.PlayEnemyEffectOnBoard(gPlayMove.EffectName, gPlayMove.TargetPawnID,
                                             gPlayMove.TargetPosition, gPlayMove.HandIndex, false);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.itemConfirm)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.GiveWeaponToEnemyPawn(gPlayMove.EffectName, gPlayMove.TargetPosition,
                                            gPlayMove.TargetRotation);
            }
            else
            {
                gPlay.GiveWeaponToEnemyPawn(gPlayMove.EffectName, gPlayMove.TargetPosition,
                                            gPlayMove.TargetRotation);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.attack)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.DoAttack(gPlayMove.PawnID, gPlayMove.TargetPosition, true);
            }
            else
            {
                gPlay.DoAttack(gPlayMove.PawnID, gPlayMove.TargetPosition, true);
            }
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.newTurn)
        {
            OnHandleNewTurnEvent(turn);
        }
        else if (gPlayMove.Action == GamePlayActionStack.ActionTypeEnum.giveup)
        {
            if (sender != PhotonNetwork.player)
            {
                gPlay.WinGame(0);
            }
            else
            {
                gPlay.DefeatGame(0);
            }
        }
        else
        {
            Debug.LogWarning("Unsupported move:" + move.ToString());
        }
    }