public ClanBossBattle(ClanBoss.Level level, List <ChampionInBattle> championsInBattle) { ClanBossInBattle clanBoss = new ClanBossInBattle(ClanBoss.Get(level)); this.initialState = new CBBState(new List <ChampionInBattle>(championsInBattle), clanBoss); this.GetStunTarget = FindSlowBoi; }
static void PrintEffectiveSpeeds(List <Champion.CreateChampion> ccs, ClanBoss.Level level) { foreach (Champion.CreateChampion cc in ccs) { Champion c = cc(level).Item1; Console.WriteLine("{0}: {1}", c.Name, c.EffectiveSpeed); } }
static void TestCounterattackTeam(ClanBoss.Level clanBossLevel, List <Champion.CreateChampion> championCreators, ClanBossBattle.StunTargetExtractor getStunTarget) { List <ChampionInBattle> cibs = new List <ChampionInBattle>(); foreach (Champion.CreateChampion cc in championCreators) { Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > tuple = cc(clanBossLevel); cibs.Add(new ChampionInBattle(tuple.Item1, tuple.Item2, tuple.Item3)); } ClanBossBattle battle = new ClanBossBattle(clanBossLevel, cibs); battle.GetStunTarget = getStunTarget; List <ClanBossBattleResult> results = battle.Run(); ClanBossBattleResultsAnalysis.PrintResults(results, CBBRA.None); }
public IEnumerable <List <Champion> > Search(ClanBoss.Level level) { foreach (List <Champion> cs in this.GetChampionLists()) { List <ChampionInBattle> champions = new List <ChampionInBattle>(); foreach (Champion champ in cs) { Tuple <List <Constants.SkillId>, List <Constants.SkillId> > policies = this.skillPoliciesByChampionName[champ.Name]; champions.Add(new ChampionInBattle(champ, policies.Item1, policies.Item2)); } ClanBossBattle battle = new ClanBossBattle(level, champions); List <ClanBossBattleResult> results = battle.Run(); int lastKillableTurn = ClanBossBattleResultsAnalysis.LastClanBossTurnThatHitKillableChampion(results, Utils.FindSlowestChampion(cs)); if (lastKillableTurn < 10) { yield return(cs); } } }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateRhazinScarhide(ClanBoss.Level level) { int effectiveSpeed = 172; if (level == ClanBoss.Level.Nightmare) { effectiveSpeed = 182; } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(RhazinScarhide.Create(effectiveSpeed, 0, 1), RhazinScarhide.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateSlowboi(ClanBoss.Level level) { if (level == ClanBoss.Level.Nightmare) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Bulwark.Create(121, 0, 0), Bulwark.AISkills, new List <Constants.SkillId>())); } else { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Bulwark.Create(112, 0, 0), Bulwark.AISkills, new List <Constants.SkillId>())); } }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreatePainkeeper(ClanBoss.Level level) { List <Constants.SkillId> startupSkillOrder = new List <Constants.SkillId>() { Constants.SkillId.A3, Constants.SkillId.A1, }; return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Painkeeper.Create(213, 2, 0), Painkeeper.AISkills, startupSkillOrder)); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateTurvold(ClanBoss.Level level) { List <Constants.SkillId> startupSkillOrder = new List <Constants.SkillId>(); switch (level) { case ClanBoss.Level.UltraNightmare: startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); break; case ClanBoss.Level.Nightmare: startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); break; default: throw new ArgumentException("Only works for Nightmare or UltraNightmare"); } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Turvold.Create(154, 0, 0), Turvold.AISkills, startupSkillOrder)); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateManeater(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Maneater.Create(227, 2, 0), Maneater.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateGravechillKiller(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(GravechillKiller.Create(168, 0, 0), GravechillKiller.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateManeater(ClanBoss.Level level) { List <Constants.SkillId> startupSkillOrder = new List <Constants.SkillId>(); switch (level) { case ClanBoss.Level.Brutal: startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A2); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A2); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); break; case ClanBoss.Level.Nightmare: startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); break; case ClanBoss.Level.UltraNightmare: // Nothing special...just works! break; default: throw new ArgumentException("Only works for Brutal, Nightmare, or UltraNightmare"); } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Maneater.Create(241, 2, 0), Maneater.AISkills, startupSkillOrder)); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateOccultBrawler(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(OccultBrawler.Create(98 + 77, 0, 0), OccultBrawler.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateAothar(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Aothar.Create(92 + 24, 0, 0), Aothar.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateDPS2(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >( new Champion("DPS2", 102, 175, 2, 0, new List <Skill>() { new Skill("A1", Constants.SkillId.A1, 0, TurnAction.AttackOneEnemy()) }), new List <Constants.SkillId>() { Constants.SkillId.A1 }, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateSlowboi(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >( new Champion("Slowboi", 92, 114, 1, 0, new List <Skill>() { new Skill("A1", Constants.SkillId.A1, 0, TurnAction.AttackOneEnemy()) }), new List <Constants.SkillId>() { Constants.SkillId.A1 }, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreatePainkeeper(ClanBoss.Level level) { List <Constants.SkillId> skillsToUse = new List <Constants.SkillId>() { Constants.SkillId.A3, Constants.SkillId.A2, Constants.SkillId.A1, }; return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Painkeeper.Create(221, 3, 0), skillsToUse, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateManeater(ClanBoss.Level level) { List <Constants.SkillId> skillsToUse = new List <Constants.SkillId>() { Constants.SkillId.A3, Constants.SkillId.A1, }; return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Maneater.Create(227, 2, 0), skillsToUse, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateDPS(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Generic.Create("DPS", 0, 175.0d), Generic.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateFrozenBanshee(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(FrozenBanshee.Create(169, 0, 0), FrozenBanshee.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreatePainkeeper(ClanBoss.Level level) { List <Constants.SkillId> startupSkillOrder = new List <Constants.SkillId>(); switch (level) { case ClanBoss.Level.Brutal: startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A2); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A2); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A2); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A3); break; case ClanBoss.Level.Nightmare: startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A1); startupSkillOrder.Add(Constants.SkillId.A2); break; case ClanBoss.Level.UltraNightmare: startupSkillOrder.Add(Constants.SkillId.A3); startupSkillOrder.Add(Constants.SkillId.A1); break; default: throw new ArgumentException("Only works for Brutal, Nightmare, or UltraNightmare"); } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Painkeeper.Create(221, 3, 0), Painkeeper.AISkills, startupSkillOrder)); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateRhazinScarhide(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(RhazinScarhide.Create(170, 0, 1), RhazinScarhide.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateAothar(ClanBoss.Level level) { int uiSpeed = 114; if (level == ClanBoss.Level.Nightmare) { uiSpeed = 121; } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Aothar.Create(uiSpeed, 1, 0), Aothar.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateBulwark(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Bulwark.Create(106, 0, 0), Bulwark.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateAothar(ClanBoss.Level level) { double effectiveSpeed = 114.04d; if (level == ClanBoss.Level.Nightmare) { effectiveSpeed = 121.04d; } return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Aothar.Create(effectiveSpeed), Aothar.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateSeptimus(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Septimus.Create(171, 0, 0), Septimus.AISkills, new List <Constants.SkillId>())); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateDracomorph(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Dracomorph.Create(177, 0, 0), Dracomorph.AISkills, new List <Constants.SkillId>())); }
private static void RunUnkillableSearcher(ClanBoss.Level clanBossLevel, List <Champion.CreateChampion> championCreators, bool multiLevel) { Dictionary <string, Champion> initialChampions = new Dictionary <string, Champion>(); Dictionary <Champion, Tuple <List <Constants.SkillId>, List <Constants.SkillId> > > skillPoliciesByChampionBase = new Dictionary <Champion, Tuple <List <Constants.SkillId>, List <Constants.SkillId> > >(); foreach (Champion.CreateChampion cc in championCreators) { Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > tuple = cc(clanBossLevel); skillPoliciesByChampionBase[tuple.Item1] = new Tuple <List <Constants.SkillId>, List <Constants.SkillId> >(tuple.Item2, tuple.Item3); initialChampions[tuple.Item1.Name] = tuple.Item1; } UnkillableSearcher searcher = new UnkillableSearcher(skillPoliciesByChampionBase); Dictionary <int, List <List <Champion> > > unkillableTeamsByChangedChampionCount = new Dictionary <int, List <List <Champion> > >(); foreach (List <Champion> unkillableTeam in searcher.Search(clanBossLevel)) { if (multiLevel) { bool isMultiLevelUnkillable = true; foreach (ClanBoss.Level cbl in new List <ClanBoss.Level>() { ClanBoss.Level.Brutal, ClanBoss.Level.Nightmare, ClanBoss.Level.UltraNightmare }) { List <ChampionInBattle> cibs = new List <ChampionInBattle>(); foreach (Champion champ in unkillableTeam) { Tuple <List <Constants.SkillId>, List <Constants.SkillId> > tuple = skillPoliciesByChampionBase[initialChampions[champ.Name]]; cibs.Add(new ChampionInBattle(champ, tuple.Item1, tuple.Item2)); } ClanBossBattle baseline = new ClanBossBattle(cbl, cibs); List <ClanBossBattleResult> baselineResult = baseline.Run(); int lastKillableTurn = ClanBossBattleResultsAnalysis.LastClanBossTurnThatHitKillableChampion(baselineResult, Utils.FindSlowestChampion(unkillableTeam)); if (lastKillableTurn > 10) { isMultiLevelUnkillable = false; } } if (!isMultiLevelUnkillable) { continue; } } int key = 0; foreach (Champion c in unkillableTeam) { Champion cBase = initialChampions[c.Name]; string descriptor; if (cBase.EffectiveSpeed != c.EffectiveSpeed) { key++; descriptor = string.Format("{0} (UPDATED)", c.Name); } else { descriptor = c.Name; } Console.WriteLine("{0}", descriptor); Console.WriteLine(" Base Speed: {0}", c.BaseSpeed); Console.WriteLine(" UI Speed: {0}", c.UISpeed); Console.WriteLine(" Speed Sets: {0}", c.SpeedSets); Console.WriteLine(" Perception Sets: {0}", c.PerceptionSets); Console.WriteLine(" Effective Speed: {0}", c.EffectiveSpeed); } Console.WriteLine(); List <List <Champion> > teams; if (!unkillableTeamsByChangedChampionCount.TryGetValue(key, out teams)) { teams = new List <List <Champion> >(); unkillableTeamsByChangedChampionCount[key] = teams; } teams.Add(new List <Champion>(unkillableTeam)); } string filename = string.Format("{0}.txt", clanBossLevel); using (StreamWriter writer = new StreamWriter(File.OpenWrite(filename))) { foreach (int key in unkillableTeamsByChangedChampionCount.Keys.OrderBy(k => k)) { foreach (List <Champion> team in unkillableTeamsByChangedChampionCount[key]) { foreach (Champion c in team) { Champion cBase = initialChampions[c.Name]; writer.WriteLine("{0}{1}", c.Name, c.EffectiveSpeed == cBase.EffectiveSpeed ? string.Empty : " (UPDATED)"); writer.WriteLine(" Base Speed: {0}", c.BaseSpeed); writer.WriteLine(" UI Speed: {0}", c.UISpeed); writer.WriteLine(" Speed Sets: {0}", c.SpeedSets); writer.WriteLine(" Perception Sets: {0}", c.PerceptionSets); writer.WriteLine(" Effective Speed: {0}", c.EffectiveSpeed); } writer.WriteLine(); } writer.WriteLine("================"); } } System.Diagnostics.Process.Start(filename); }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateCoffinSmasher(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(CoffinSmasher.Create(171, 0, 0), CoffinSmasher.AISkills, new List <Constants.SkillId>())); }
static void TestUnkillableClanBossRun(ClanBoss.Level clanBossLevel, List <Champion.CreateChampion> championCreators, bool startupSequenceSearch, string allyAttackChampionToExclude = "") { List <Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > > champTuples = new List <Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > >(); foreach (Champion.CreateChampion cc in championCreators) { champTuples.Add(cc(clanBossLevel)); } List <Champion> champions = new List <Champion>(); List <ChampionInBattle> cibs = new List <ChampionInBattle>(); foreach (Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > tuple in champTuples) { champions.Add(tuple.Item1); ChampionInBattle cib = new ChampionInBattle(tuple.Item1, tuple.Item2, tuple.Item3); if (cib.Name == allyAttackChampionToExclude) { cib.LeaveOutOfAllyAttack = true; } cibs.Add(cib); } ClanBossBattle baseline = new ClanBossBattle(clanBossLevel, cibs); List <ClanBossBattleResult> baselineResult = baseline.Run(); Console.WriteLine("Baseline Results:"); ClanBossBattleResultsAnalysis.PrintSummary(baselineResult, Utils.FindSlowestChampion(champions), CBBRA.None); ClanBossBattleResultsAnalysis.PrintFrozenBansheeA1WithPoisonSensitivityOn(baselineResult); if (startupSequenceSearch) { cibs = new List <ChampionInBattle>(); foreach (Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > tuple in champTuples) { cibs.Add(new ChampionInBattle(tuple.Item1, tuple.Item2, tuple.Item3)); } ClanBossBattle battle = new ClanBossBattle(clanBossLevel, cibs); IEnumerable <List <ClanBossBattleResult> > resultSet; if (startupSequenceSearch) { resultSet = battle.FindUnkillableStartupSequences(); } else { resultSet = new List <List <ClanBossBattleResult> >() { battle.Run() }; } List <ClanBossBattleResult> optimalResults = null; int optimalAutoAfterCBTurn = int.MaxValue; foreach (List <ClanBossBattleResult> results in resultSet) { int autoAfterCBTurn = 0; Console.WriteLine(); Console.WriteLine("Run is over!"); ClanBossBattleResultsAnalysis.PrintResults(results, CBBRA.IncludeUnkillable); foreach (ClanBossBattleResult result in results) { if (result.AttackDetails.ActorName != Constants.Names.ClanBoss) { if (result.AttackDetails.ExpectedAISkill != result.AttackDetails.Skill) { autoAfterCBTurn = result.ClanBossTurn; } } } int lastKillableTurn = ClanBossBattleResultsAnalysis.LastClanBossTurnThatHitKillableChampion(results, Utils.FindSlowestChampion(champions)); Console.WriteLine("Last turn where there was a hit on a champion that wasn't unkillable: {0}", lastKillableTurn); Console.WriteLine("This setup runs on auto after turn {0}", autoAfterCBTurn); Console.WriteLine(); if (optimalAutoAfterCBTurn > autoAfterCBTurn) { optimalAutoAfterCBTurn = autoAfterCBTurn; optimalResults = results; } } if (optimalResults != null) { Console.WriteLine("Optimal Result:"); ClanBossBattleResultsAnalysis.PrintResults(optimalResults, CBBRA.IncludeUnkillable); Console.WriteLine("This setup runs on auto after turn {0}", optimalAutoAfterCBTurn); Console.WriteLine(); Console.WriteLine("Maneater setup"); foreach (ClanBossBattleResult result in optimalResults.Where(r => r.AttackDetails.ActorName == "Maneater")) { if (result.ClanBossTurn > optimalAutoAfterCBTurn) { break; } Console.WriteLine("Turn {0,2}, Skill {1} ({2})", result.AttackDetails.ActorTurn, result.AttackDetails.Skill, result.AttackDetails.SkillName); } Console.WriteLine(); Console.WriteLine("Painkeeper setup"); foreach (ClanBossBattleResult result in optimalResults.Where(r => r.AttackDetails.ActorName == "Painkeeper")) { if (result.ClanBossTurn > optimalAutoAfterCBTurn) { break; } Console.WriteLine("Turn {0,2}, Skill {1} ({2})", result.AttackDetails.ActorTurn, result.AttackDetails.Skill, result.AttackDetails.SkillName); } } else { Console.WriteLine("No results!"); } } }
static Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> > CreateSkullcrusher(ClanBoss.Level level) { return(new Tuple <Champion, List <Constants.SkillId>, List <Constants.SkillId> >(Skullcrusher.Create(170, 0, 0), Skullcrusher.AISkills, new List <Constants.SkillId>())); }