예제 #1
0
        public static string GetBrigadeFormationString(PhlebotomistRepository phlebotomistRepository,
                                                       BrigadeFormation formation)
        {
            StringBuilder output = new StringBuilder();
            var           rows   = phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes.OrderByDescending(x =>
                                                                                                                          x.DamageDealtModifier);

            output.AppendLine(string.Format("Brigade Formation: {0}", formation.Name));
            foreach (var row in rows)
            {
                // using the assumption that HorizontalPositionTypeId increases from left to right
                foreach (var horizontalPosition in formation.Positions.OrderBy(x => x.HorizontalPositionTypeId))
                {
                    if (horizontalPosition.VerticalPositionTypes.Id == row.Id)
                    {
                        output.Append("*");
                    }
                    else
                    {
                        output.Append(" ");
                    }
                }
                output.AppendLine();
            }

            return(output.ToString());
        }
예제 #2
0
        static string GetBrigadeFormationsString(PhlebotomistRepository phlebotomistRepository,
                                                 IQueryable <BrigadeFormation> formations)
        {
            StringBuilder output = new StringBuilder();

            foreach (var brigadeFormation in formations)
            {
                output.Append(GetBrigadeFormationString(phlebotomistRepository, brigadeFormation));
            }

            return(output.ToString());
        }
예제 #3
0
        static List <FamiliarWinPercent> ReadInputFile(PhlebotomistRepository phlebotomistRepository,
                                                       string fileName)
        {
            int maxFamiliars = 10;
            var winPercents  = new List <FamiliarWinPercent>();

            using (var streamReader = new StreamReader(_inputFileName))
            {
                while (!streamReader.EndOfStream && winPercents.Count < maxFamiliars)
                {
                    var line    = streamReader.ReadLine();
                    var columns = line.Split(',');
                    int result;
                    if (winPercents.Count == 0 && columns.All(x => !int.TryParse(x, out result)))
                    {
                        System.Console.WriteLine("Assuming initial line contains headers: '{0}'", line);
                        continue;
                    }
                    if (columns.Length != 4)
                    {
                        throw new InvalidOperationException(
                                  string.Format("Row does not contain exactly four columns of data: '{0}'", line));
                    }

                    foreach (var column in columns)
                    {
                        System.Console.Write("'{0}'\t", column);
                    }
                    System.Console.WriteLine();

                    var familiarWinPercent = new FamiliarWinPercent
                    {
                        FamiliarName = columns[0]
                    };

                    int nextInputFileColumn = 1;
                    foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes
                             .OrderByDescending(x => x.DamageDealtModifier))
                    {
                        familiarWinPercent.WinPercents[verticalPosition] = int.Parse(columns[nextInputFileColumn]);
                        nextInputFileColumn++;
                    }

                    winPercents.Add(familiarWinPercent);
                }
            }

            return(winPercents);
        }
예제 #4
0
        public BrigadeFormationWithFamiliars(PhlebotomistRepository phlebotomistRepository,
                                             bool includeReserve = true)
        {
            PhlebotomistRepository = phlebotomistRepository;

            IncludeReserve          = includeReserve;
            FamiliarsInPositions    = new Dictionary <BrigadeFormationVerticalPositionType, List <FamiliarWinPercent> >();
            MaxFamiliarsInPositions = new Dictionary <BrigadeFormationVerticalPositionType, int>();

            // Initialize each potential index in the dictionaries.
            foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes)
            {
                FamiliarsInPositions[verticalPosition]    = new List <FamiliarWinPercent>();
                MaxFamiliarsInPositions[verticalPosition] = 0;
            }
        }
예제 #5
0
        static IEnumerable <BrigadeFormationWithFamiliars> GetBrigadeFormationPermutations(
            PhlebotomistRepository phlebotomistRepository, List <FamiliarWinPercent> familiarWinPercents,
            BrigadeFormation formation, bool includeReserve)
        {
            if (formation == null)
            {
                throw new ArgumentNullException("formation", "The BrigadeFormation argument can not be null!");
            }

            var currentBrigadeInstace = new BrigadeFormationWithFamiliars(phlebotomistRepository,
                                                                          includeReserve);

            currentBrigadeInstace.Formation = formation;
            foreach (var brigadeFormation in GetBrigadeFormationPermutations(phlebotomistRepository,
                                                                             familiarWinPercents, currentBrigadeInstace, includeReserve))
            {
                yield return(brigadeFormation);
            }
        }
예제 #6
0
        public static IEnumerable <BrigadeFormationWithFamiliars> GetBrigadeFormationPermutations(
            PhlebotomistRepository phlebotomistRepository, List <FamiliarWinPercent> familiarWinPercents,
            BrigadeFormationWithFamiliars currentFormation, bool includeReserve)
        {
            // Either no more familiars left to place or we've placed everyone already.
            if (familiarWinPercents.Count == 0 ||
                currentFormation.NumFamiliarsInPosition == (currentFormation.Formation.NumPositions *
                                                            (currentFormation.IncludeReserve ? 2 : 1)))
            {
                yield return(currentFormation);
            }
            // First place all familiars in the non-reserve positions (that is, make sure at least
            // currentFormation.Formation.NumPositions familiars have been placed).
            else if (currentFormation.NumFamiliarsInPosition < currentFormation.Formation.NumPositions)
            {
                bool forReserve             = false;
                var  positionsWithOpenSlots = new List <BrigadeFormationVerticalPositionType>();
                foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes)
                {
                    if (currentFormation.HasOpenSlotsInPosition(verticalPosition, forReserve))
                    {
                        positionsWithOpenSlots.Add(verticalPosition);
                    }
                }

                var nextFamiliar = familiarWinPercents[0];
                foreach (var verticalPosition in positionsWithOpenSlots)
                {
                    BrigadeFormationWithFamiliars nextFormation = new BrigadeFormationWithFamiliars(currentFormation);
                    var remainingFamiliars = new List <FamiliarWinPercent>(familiarWinPercents);
                    remainingFamiliars.RemoveAt(0);

                    nextFormation.FamiliarsInPositions[verticalPosition].Add(nextFamiliar);
                    foreach (var permutation in GetBrigadeFormationPermutations(phlebotomistRepository, remainingFamiliars,
                                                                                nextFormation, includeReserve))
                    {
                        yield return(permutation);
                    }
                }
            }
            // Then place a reserve familiar if we are including reserves.
            else if (includeReserve)
            {
                bool placingReserveFamiliar = true;
                var  positionsWithOpenSlots = new List <BrigadeFormationVerticalPositionType>();
                foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes)
                {
                    if (currentFormation.HasOpenSlotsInPosition(verticalPosition, placingReserveFamiliar))
                    {
                        positionsWithOpenSlots.Add(verticalPosition);
                    }
                }

                var nextFamiliar = familiarWinPercents[0];
                foreach (var verticalPosition in positionsWithOpenSlots)
                {
                    BrigadeFormationWithFamiliars nextFormation = new BrigadeFormationWithFamiliars(currentFormation);
                    var remainingFamiliars = new List <FamiliarWinPercent>(familiarWinPercents);
                    remainingFamiliars.RemoveAt(0);

                    nextFormation.FamiliarsInPositions[verticalPosition].Add(nextFamiliar);
                    foreach (var permutation in GetBrigadeFormationPermutations(phlebotomistRepository, remainingFamiliars,
                                                                                nextFormation, includeReserve))
                    {
                        yield return(permutation);
                    }
                }
            }
        }