private void RestorePreviousState(PreviousTowerState previousState, IEntitiesDB entitiesDB)
        {
            foreach (PreviousPieceState state in previousState.Pieces)
            {
                PieceEV piece = state.Piece;
                pieceSetService.SetPiecePlayerOwner(piece, state.PlayerColor, entitiesDB);

                if (piece.Piece.PieceType != state.PieceType)
                {
                    pieceSetService.SetPieceSide(piece, state.PieceType == piece.Piece.Front ? PieceSide.FRONT : PieceSide.BACK, entitiesDB);
                }

                pieceSetService.SetPieceLocationAndTier(piece, state.Location, state.Tier, entitiesDB);
                pieceSetService.SetTopOfTower(piece, entitiesDB, state.TopOfTower);
            }
        }
        private PreviousTowerState?SaveDestinationTowerState(PreviousMoveState previousMoveState, List <PieceEV> allPieces)
        {
            PreviousTowerState returnValue = new PreviousTowerState
            {
                Pieces = new List <PreviousPieceState>()
            };

            List <PieceEV> piecesAtDestination = FindPiecesAtLocation(previousMoveState.pieceCaptured.Value.Location, allPieces); // Min size one

            foreach (PieceEV piece in piecesAtDestination)
            {
                returnValue.Pieces.Add(SaveSingleState(piece));
            }

            return(returnValue);
        }
        private PreviousTowerState CreatePreviousState(List <PieceEV> towerPieces)
        {
            PreviousTowerState returnValue = new PreviousTowerState
            {
                Pieces = new List <PreviousPieceState>()
            };

            foreach (PieceEV piece in towerPieces)
            {
                returnValue.Pieces.Add(new PreviousPieceState
                {
                    Piece       = piece,
                    PlayerColor = piece.PlayerOwner.PlayerColor,
                    PieceType   = piece.Piece.PieceType,
                    Location    = piece.Location.Location,
                    Tier        = piece.Tier.Tier,
                    TopOfTower  = piece.Tier.TopOfTower
                });
            }

            return(returnValue);
        }
        private bool DoesImmobileCaptureResolveOrPreventCheck(List <PieceEV> towerPieces, int tierIndex, IEntitiesDB entitiesDB)
        {
            bool returnValue = false;
            PreviousTowerState previousState = CreatePreviousState(towerPieces);
            TurnEV             currentTurn   = turnService.GetCurrentTurnEV(entitiesDB);
            PieceEV            commander     = pieceFindService.FindCommander(currentTurn.TurnPlayer.PlayerColor, entitiesDB);

            PieceEV?capturedPiece = TempImmobileCapture(
                towerPieces, tierIndex, currentTurn.TurnPlayer.PlayerColor, entitiesDB);

            // Betrayal did not cause two file move violation
            if (capturedPiece.HasValue)
            {
                returnValue = !checkService.IsCommanderInCheck(currentTurn.TurnPlayer.PlayerColor, entitiesDB);

                if (!returnValue && checkService.IsForcedRearrangementPossible(capturedPiece.Value))
                {
                    returnValue = DoesForcedRearrangementResolveOrPreventCheck(capturedPiece.Value, commander, towerPieces, entitiesDB);
                }
            }

            RestorePreviousState(previousState, entitiesDB);
            return(returnValue);
        }