private List <Vector2> CalcDestinations(
            PieceEV pieceEV,
            List <PieceEV> allPieces,
            IEntitiesDB entitiesDB,
            bool excludeCheckViolations        = false,
            bool excludeObstructedDestinations = true)
        {
            bool       useGoldMovement = IsOpponentPieceDirectlyBelow(pieceEV, allPieces);
            IPieceData pieceData       = CreatePieceData(pieceEV, useGoldMovement);

            List <Vector2> returnValue = AdjustAndExcludeSingleDestinations(
                pieceData,
                pieceEV,
                allPieces,
                excludeObstructedDestinations);

            returnValue.AddRange(AdjustJumpDestinations(
                                     pieceData,
                                     pieceEV,
                                     allPieces
                                     ));

            returnValue.AddRange(AdjustAndExcludeLineDestinations(
                                     pieceData,
                                     pieceEV,
                                     allPieces,
                                     excludeObstructedDestinations));

            if (excludeCheckViolations) // Should only happen for turn player
            {
                ExcludeCheckViolations(pieceEV, returnValue, allPieces, entitiesDB);
            }

            return(returnValue);
        }
        private IEnumerable <Vector2> AdjustAndExcludeLineDestinations(
            IPieceData pieceData,
            PieceEV pieceEV,
            List <PieceEV> allPieces,
            bool excludeObstructedDestinations)
        {
            int            tier        = CalcTierToUse(pieceEV, allPieces);
            List <Vector2> vectors     = pieceData.Tiers[tier - 1].Line;
            List <Vector2> returnValue = new List <Vector2>();

            foreach (Vector2 vector in vectors)
            {
                List <Vector2> line = ExpandLineVector(vector);
                AdjustRawDataWithPieceLocationAndDirection(pieceEV, line);
                ExcludeOutOfBoard(line);

                if (excludeObstructedDestinations) // Do NOT allow destinations other pieces in the way
                {
                    ExcludeDestinationsWithObstructingPieces(pieceEV, line, allPieces);
                }

                // Always exclude these scenarios
                ExcludeDestinationsAtCannotBeStackedPieces(line, allPieces);
                ExcludeTowerDestinationsWithSameTypeAndTeam(pieceEV, line, allPieces);

                returnValue.AddRange(line);
            }

            return(returnValue);
        }
        private List <Vector2> AdjustJumpDestinations(
            IPieceData pieceData,
            PieceEV pieceEV,
            List <PieceEV> allPieces)
        {
            int            tier        = CalcTierToUse(pieceEV, allPieces);
            List <Vector2> returnValue = pieceData.Tiers[tier - 1].Jump;

            AdjustDestinations(returnValue, pieceEV, allPieces);

            return(returnValue);
        }
        public void Step(ref ForcedRecoveryStepState token, int condition)
        {
            TurnEV     currentTurn = turnService.GetCurrentTurnEV(entitiesDB);
            IPieceData piece       = pieceFactory.CreateIPieceData(token.PieceMoved.Piece.PieceType);

            bool forcedRecoveryPossible = token.PieceMoved.Tier.TopOfTower && // Paranoia check
                                          piece.Abilities.PostMove.Contains(PostMoveAbility.FORCED_RECOVERY) &&
                                          !HasDestinationTiles(token.PieceMoved) &&
                                          checkService.ForcedRecoveryResolvesOrDoesNotCreateCheck(token.PieceMoved, currentTurn, entitiesDB);

            NextAction(ref token, forcedRecoveryPossible);
        }
Example #5
0
        private static void AddPostMoveAbilities(IPieceData pieceData)
        {
            foreach (PostMoveAbility postMoveAbility in pieceData.Abilities.PostMove)
            {
                if (!PostMove.ContainsKey(postMoveAbility))
                {
                    PostMove[postMoveAbility] = new List <PieceType>();
                }

                PostMove[postMoveAbility].Add(pieceData.TypeOfPiece);
            }
        }
Example #6
0
        private static void AddDropAbilities(IPieceData pieceData)
        {
            foreach (DropAbility dropAbility in pieceData.Abilities.Drop)
            {
                if (!Drop.ContainsKey(dropAbility))
                {
                    Drop[dropAbility] = new List <PieceType>();
                }

                Drop[dropAbility].Add(pieceData.TypeOfPiece);
            }
        }
Example #7
0
        private static void AddOtherMoveAbilities(IPieceData pieceData)
        {
            if (pieceData.Abilities.OtherMove.HasValue)
            {
                if (!OtherMove.ContainsKey(pieceData.Abilities.OtherMove.Value))
                {
                    OtherMove[pieceData.Abilities.OtherMove.Value] = new List <PieceType>();
                }

                OtherMove[pieceData.Abilities.OtherMove.Value].Add(pieceData.TypeOfPiece);
            }
        }
Example #8
0
        static AbilityToPiece()
        {
            PieceFactory pieceFactory = new PieceFactory();
            Array        pieceTypes   = Enum.GetValues(typeof(PieceType));

            foreach (PieceType pieceType in pieceTypes)
            {
                IPieceData pieceData = pieceFactory.CreateIPieceData(pieceType);
                AddOtherMoveAbilities(pieceData);
                AddPreMoveAbilities(pieceData);
                AddPostMoveAbilities(pieceData);
                AddDropAbilities(pieceData);
            }
        }
        private List <Vector2> AdjustAndExcludeSingleDestinations(
            IPieceData pieceData,
            PieceEV pieceEV,
            List <PieceEV> allPieces,
            bool excludeObstructedDestinations)
        {
            int            tier        = CalcTierToUse(pieceEV, allPieces);
            List <Vector2> returnValue = pieceData.Tiers[tier - 1].Single;

            AdjustDestinations(returnValue, pieceEV, allPieces);

            if (excludeObstructedDestinations) // Do NOT allow destinations other pieces in the way
            {
                ExcludeDestinationsWithObstructingPieces(pieceEV, returnValue, allPieces, true);
            }

            return(returnValue);
        }
        private bool HasForcedRearrangementAbility(PieceType pieceType)
        {
            IPieceData pieceData = pieceFactory.CreateIPieceData(pieceType);

            return(pieceData.Abilities.PostMove.Contains(PostMoveAbility.FORCED_REARRANGEMENT));
        }