/// <summary>
        /// Analyze ComboArmyBuild object before building army
        /// </summary>
        public void PreBuildAnalyze(ComboArmyBuilder builder)
        {
            //save initial data
            size_      = builder.Size;
            power_     = builder.Power;
            alignment_ = builder.Alignment;
            traits_    = new MonsterTraits[builder.PlaceHolders.Count];
            int i = 0;

            builder.PlaceHolders.ForEach(
                delegate(MonsterPlaceHolder h) {
                traits_[i++] = h.Traits;
            }
                );
        }
Exemple #2
0
        /// <summary>
        /// Add random monster to army
        /// </summary>
        public void AddRandomMonster(int base_level, int strength, bool last_attempt)
        {
            int            rnd, amount = 0;
            bool           fl_get_new_list_monsters;
            Monster        monster       = null;
            List <Monster> list_monsters = null;

            if (strength < weakest_monster_.Power * Guards.MIN_UNIT_AMOUNT)
            {
                return; //impossible to find so weak creature
            }

            foreach (MonsterPlaceHolder holder in placeholders_)
            {
                if (holder.Monster == null)
                {
                    //find random monster according to alignment and composition
                    fl_get_new_list_monsters = true;
                    do
                    {
                        // dwp. было зацикливание при выборе охраны на остатке силы.
                        // так как уже достаточно велико минимальное ограничение количества юнитов.
                        // защитил алгоритм от зацикливания

                        if (fl_get_new_list_monsters)
                        {
                            list_monsters = get_ALL_monster(base_level, holder);
                        }
                        if (list_monsters != null && list_monsters.Count > 0)
                        {
                            rnd     = Randomizer.rnd.Next(list_monsters.Count);
                            monster = list_monsters[rnd];
                            amount  = Math.Max(strength / monster.Power, 1);

                            if (amount > Guards.MAX_UNIT_AMOUNT)   //max limit
                            {
                                if (base_level++ < 7)
                                {
                                    fl_get_new_list_monsters = true;
                                    continue; //too many monsters, level up
                                }
                                if (holder.Traits == MonsterTraits.Any)
                                {
                                    base_level = 7;
                                    list_monsters.RemoveAt(rnd);
                                    monster = null;
                                    fl_get_new_list_monsters = false;
                                    continue; //too many level 7 monsters, try other level 7 ones
                                }
                            }
                            if (amount < Guards.MIN_UNIT_AMOUNT)   //min limit
                            {
                                if (base_level-- > 1)
                                {
                                    fl_get_new_list_monsters = true;
                                    continue; //too few monsters, level down
                                }
                                if (holder.Traits == MonsterTraits.Any)
                                {
                                    base_level = 1;
                                    list_monsters.RemoveAt(rnd);
                                    monster = null;
                                    fl_get_new_list_monsters = false;
                                    continue; //too few level 1 monsters, try other level 1 ones
                                }
                            }
                        }
                        break;
                    } while (true);
                    if (monster != null)   //save monster on its position
                    {
                        holder.Monster = monster;
                        holder.Amount  = amount;
                        if (empty_)   //save alignment info
                        {
                            current_town_ = monster.TownType;
                            current_side_ = monster.RaceSide;
                            //dwp использовать в охране только одну фракцию?
                            if (Settings.Default.SingleFactionGuards)
                            {
                                current_alignment_ = ArmyAlignment.Town;                                       //да
                            }
                            else
                            {
                                current_alignment_ = alignment_; // нет
                            }
                            empty_ = false;
                        }
                        break;
                    }
                }
            }
            if (monster == null)   //monster not found -> change search data
            //dwp. используется одна фракция и менять её нельзя
            {
                if (!Settings.Default.SingleFactionGuards)
                {
                    if (current_alignment_ == ArmyAlignment.None)
                    {
                        int n = 0;
                        foreach (MonsterPlaceHolder h in placeholders_)
                        { //remove monster requirements
                            if (h.Monster == null && h.Traits != MonsterTraits.Any)
                            {
                                h.Traits = MonsterTraits.Any;
                                ++n;
                            }
                        }
                        if (n == 0)
                        { //thats bad(
                            throw new Exception("Critical error: impossible to generate army");
                        }
                        else
                        {
                            current_alignment_ = alignment_;               //restore alignment
                            AddRandomMonster(base_level, strength, false); //and try again
                        }
                    }
                    else
                    {
                        current_alignment_--;                          //weaken alignment
                        AddRandomMonster(base_level, strength, false); //next try
                    }
                }
                //dwp. фракцию нельзя менять меняем ограничение по максимуму, чтобы получить нужную охрану.
                else if (!last_attempt)
                {
                    AddRandomMonster(base_level, strength, true);
                }
            }
        }