/// <summary> /// initialization /// </summary> private void parse(XmlNode node) { town_ = EnumConvert.TownTypeFromString(node.Name); foreach (XmlNode n in node.ChildNodes) { specializations_.Add(n.InnerText); } }
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]); }
/// <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); } }
/// <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); } } }