private void HandleAuras(Magus mage, ConsideredActions alreadyConsidered, IList <string> log) { double greatestAura = mage.KnownAuras.Select(a => a.Strength).Max(); double currentAura = mage.Covenant.Aura.Strength; if (greatestAura > currentAura) { Aura bestAura = mage.KnownAuras.Where(a => a.Strength == greatestAura).First(); if (mage.Laboratory == null) { // just move the covenant right now log.Add("Since no lab built, moving to better aura."); mage.FoundCovenant(bestAura); } else { // how do we want to rate the value of moving and having to build a new lab? // it seems like basically the same as any other single-season activity double gain = greatestAura - currentAura; double dueDateDesire = CalculateDesire(gain) / (BaseTier + 1); if (BaseDueDate != null) { if (BaseDueDate == 0) { return; } dueDateDesire /= (double)(BaseDueDate - 1); } log.Add("Moving to new aura (to boost lab total) worth " + dueDateDesire.ToString("0.00")); alreadyConsidered.Add(new BuildLaboratory(bestAura, Abilities.MagicTheory, dueDateDesire)); } } else { double auraCount = mage.KnownAuras.Count; double areaLore = mage.GetAbility(Abilities.AreaLore).Value; areaLore += mage.GetCastingTotal(MagicArtPairs.InVi) / 10; areaLore += mage.GetAttribute(AttributeType.Perception).Value; double probOfBetter = 1 - (currentAura * currentAura * auraCount / (5 * areaLore)); double maxAura = Math.Sqrt(5.0 * areaLore / auraCount); double averageGain = maxAura * probOfBetter / 2.0; double dueDateDesire = CalculateDesire(averageGain) / (BaseTier + 1); if (BaseDueDate != null) { if (BaseDueDate == 0) { return; } dueDateDesire /= (double)(BaseDueDate - 1); } if (probOfBetter > 0) { log.Add("Finding a better aura to build a lab in worth " + dueDateDesire.ToString("0.00")); alreadyConsidered.Add(new FindAura(Abilities.AreaLore, dueDateDesire)); } } }
private void HandleAuras(Magus mage, ConsideredActions alreadyConsidered, IList<string> log) { double greatestAura = mage.KnownAuras.Select(a => a.Strength).Max(); double currentAura = mage.Covenant.Aura.Strength; if (greatestAura > currentAura) { Aura bestAura = mage.KnownAuras.Where(a => a.Strength == greatestAura).First(); if (mage.Laboratory == null) { // just move the covenant right now log.Add("Since no lab built, moving to better aura."); mage.FoundCovenant(bestAura); } else { // how do we want to rate the value of moving and having to build a new lab? // it seems like basically the same as any other single-season activity double gain = greatestAura - currentAura; double dueDateDesire = CalculateDesire(gain) / (BaseTier + 1); if (BaseDueDate != null) { if (BaseDueDate == 0) { return; } dueDateDesire /= (double)(BaseDueDate - 1); } log.Add("Moving to new aura (to boost lab total) worth " + dueDateDesire.ToString("0.00")); alreadyConsidered.Add(new BuildLaboratory(bestAura, Abilities.MagicTheory, dueDateDesire)); } } else { double auraCount = mage.KnownAuras.Count; double areaLore = mage.GetAbility(Abilities.AreaLore).Value; areaLore += mage.GetCastingTotal(MagicArtPairs.InVi) / 10; areaLore += mage.GetAttribute(AttributeType.Perception).Value; double probOfBetter = 1 - (currentAura * currentAura * auraCount / (5 * areaLore)); double maxAura = Math.Sqrt(5.0 * areaLore / auraCount); double averageGain = maxAura * probOfBetter / 2.0; double dueDateDesire = CalculateDesire(averageGain) / (BaseTier + 1); if (BaseDueDate != null) { if (BaseDueDate == 0) { return; } dueDateDesire /= (double)(BaseDueDate - 1); } if (probOfBetter > 0) { log.Add("Finding a better aura to build a lab in worth " + dueDateDesire.ToString("0.00")); alreadyConsidered.Add(new FindAura(Abilities.AreaLore, dueDateDesire)); } } }