コード例 #1
0
ファイル: GoalHelpers.cs プロジェクト: ndilday/wizard-monks
        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));
                }
            }
        }
コード例 #2
0
ファイル: GoalHelpers.cs プロジェクト: ndilday/wizard-monks
        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));
                }
            }
        }