private static HashSet <int> GetIndicesForDirectionalFileStepping(
            Square square,
            BoardData board,
            DataMoveRuleDirectional rule)
        {
            HashSet <int> indices = new HashSet <int>();

            // North and south
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 1));
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 5));

            return(indices);
        }
        private static HashSet <int> GetIndicesForDirectionalRankStepping(
            Square square,
            BoardData board,
            DataMoveRuleDirectional rule)
        {
            HashSet <int> indices = new HashSet <int>();

            // East and West
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 3));
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 7));

            return(indices);
        }
        private static HashSet <int> GetIndicesForDirectionalDiagonalStepping(
            Square square,
            BoardData board,
            DataMoveRuleDirectional rule)
        {
            HashSet <int> indices = new HashSet <int>();

            // Diagonals
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 0));
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 2));
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 4));
            indices.UnionWith(GetNeighborSquareChain(square, board, rule.MaxDistance, 6));

            return(indices);
        }
        private static HashSet <int> GetIndicesForDirectionalStepping(
            Square square,
            BoardData board,
            DataMoveRuleDirectional rule)
        {
            HashSet <int> indices = new HashSet <int>();

            switch (rule.Direction)
            {
            case MoveDirectionType.File:
                indices = GetIndicesForDirectionalFileStepping(square, board, rule);
                break;

            case MoveDirectionType.Rank:
                indices = GetIndicesForDirectionalRankStepping(square, board, rule);
                break;

            case MoveDirectionType.Diagonal:
                indices = GetIndicesForDirectionalDiagonalStepping(square, board, rule);
                break;
            }

            return(indices);
        }