/// <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; } ); }
/// <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); } } }