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); }