Example #1
0
 /// <summary>
 /// initialization
 /// </summary>
 private void parse(XmlNode node)
 {
     town_ = EnumConvert.TownTypeFromString(node.Name);
     foreach (XmlNode n in node.ChildNodes)
     {
         specializations_.Add(n.InnerText);
     }
 }
Example #2
0
        public string GetRandomSpecialization(eTownType town)
        {
            TownSpecializations ts = ts_parser_.Towns.Find(delegate(TownSpecializations s) { return(s.Town == town); });

            if (ts == null || ts.Specializations.Count == 0)
            {
                return(null);
            }
            int i = Randomizer.rnd.Next(ts.Specializations.Count);

            return(ts.Specializations[i]);
        }
Example #3
0
        /// <summary>
        /// Convert eTownType enum to RaceSide enum
        /// </summary>
        /// <param name="town"></param>
        /// <returns></returns>
        public static RaceSide RaceSideFromTownType(eTownType town)
        {
            switch (town)
            {
            case eTownType.Academy:
            case eTownType.Fortress:
            case eTownType.Haven:
            case eTownType.Sylvan:
                return(RaceSide.Good);

            case eTownType.Dungeon:
            case eTownType.Inferno:
            case eTownType.Necropolis:
            case eTownType.Orcs:
                return(RaceSide.Evil);

            default:
                return(RaceSide.Neutral);
            }
        }
Example #4
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);
                }
            }
        }