protected ASimulator(Monster monster, int heroLevel, int itemLevel) { this.HeroLevel = heroLevel; this.monster = monster; foreach (var hero in Library.Heroes) { var relevantItems = ItemFilter.RelevantFor(hero, itemLevel, monster, StatsFilter.All); var items = new Stats[(int)ItemSlot.N][]; for (int i = 0; i < relevantItems.Count; i++) { items[i] = relevantItems[(ItemSlot)i]; maxItemChoices = Math.Max(maxItemChoices, items[i].Length); } AllItems.Add(hero, items); } }
private void initItems(Hero hero, int maxItemLevel, Monster monster, BuildPurpose buildFor) { var statsMask = (StatsFilter)0; switch (buildFor) { case BuildPurpose.MaxDefense: statsMask = StatsFilter.Defenses; break; case BuildPurpose.MaxEffectiveHp: statsMask = StatsFilter.Defenses | StatsFilter.Hp; break; case BuildPurpose.MinHpLoss: statsMask = StatsFilter.Defenses | StatsFilter.Offensive; break; case BuildPurpose.MinTurns: statsMask = StatsFilter.Offensive; break; } this.AllItems = ItemFilter.RelevantFor(hero, maxItemLevel, monster, statsMask); this.Slots = AllItems.Keys.OrderBy(x => (int)x).ToArray(); this.BuildCombinations = new List <EquipmentBuild>(); BuildCombinations.Add(new EquipmentBuild(0, new int[Slots.Length])); bool moreCombinations = true; while (moreCombinations) { var build = new EquipmentBuild(BuildCombinations.Count, new int[Slots.Length]); for (int i = 0; i < Slots.Length; i++) { build.Combination[i] = BuildCombinations[BuildCombinations.Count - 1].Combination[i]; } build.Combination[0]++; for (int i = 0; i < Slots.Length; i++) { if (build.Combination[i] >= AllItems[Slots[i]].Length) { if (i + 1 < Slots.Length) { build.Combination[i] = 0; build.Combination[i + 1]++; } else { moreCombinations = false; } } } if (moreCombinations) { BuildCombinations.Add(build); } } }