private void HandleVisUse(Magus mage, CharacterAbilityBase charAbility, double remainingTotal, double desire, ConsideredActions alreadyConsidered, IList<string> log ) { // see if the mage has enough vis of this type double stockpile = mage.GetVisCount(charAbility.Ability); double visNeed = 0.5 + (charAbility.Value / 10.0); double baseDesire = desire * charAbility.GetValueGain(mage.VisStudyRate) / remainingTotal; // if so, assume vis will return an average of 6XP + aura if (stockpile > visNeed) { log.Add("Studying vis for " + charAbility.Ability.AbilityName + " worth " + baseDesire.ToString("0.00")); VisStudying visStudy = new VisStudying(charAbility.Ability, baseDesire); alreadyConsidered.Add(visStudy); // TODO: how do we decrement the cost of the vis? } else if(baseDesire > 0.01 && (DueDate == null || DueDate > 1)) { // only try to extract the vis now if there's sufficient time to do so List<Ability> visType = new List<Ability>(); visType.Add(charAbility.Ability); VisCondition visCondition = new VisCondition(visType, visNeed - stockpile, baseDesire, (byte)(Tier + 1), DueDate == null ? null : DueDate - 1); visCondition.ModifyActionList(mage, alreadyConsidered, log); if(baseDesire > 0.04 && (DueDate == null || DueDate > 4)) { // we have enough time and interest to consider finding a new aura and building a new lab in it } } }
public void ModifyActionList(Character character, ConsideredActions alreadyConsidered, IList<string> log) { if (character.GetType() == typeof(Magus)) { Magus mage = (Magus)character; Desire = CalculateDesire(mage); double visNeed = character.SeasonalAge / 20.0; VisCondition visCondition = new VisCondition(_artsRequired, visNeed, Desire, Tier, DueDate == null ? null : DueDate - 1); bool visComplete = visCondition.IsComplete(character); bool labComplete = _hasLabCondition.IsComplete(character); if (!visComplete) { visCondition.ModifyActionList(character, alreadyConsidered, log); } if (!labComplete) { _hasLabCondition.Desire = Desire; _hasLabCondition.ModifyActionList(character, alreadyConsidered, log); } if (visComplete && labComplete) { //effectively, every five points of lab total is worth a decade of effectiveness double dueDateDesire = Desire / (Tier + 1); if (DueDate != null) { if (DueDate == 0) { log.Add("Not enough time to perform longevity ritual"); return; } dueDateDesire /= (double)DueDate; } if (DueDate == null || DueDate < 4) { log.Add("Performing longevity ritual worth " + dueDateDesire.ToString("0.00")); alreadyConsidered.Add(new LongevityRitual(Abilities.MagicTheory, dueDateDesire)); } double labTotalDesire = mage.GetLabTotal(MagicArtPairs.CrVi, Activity.DistillVis) * 8; if (DueDate != null) { labTotalDesire /= (double)DueDate; } // every point of lab total is effectively two years LongevityRitualAbilitiesHelper helper = new LongevityRitualAbilitiesHelper(labTotalDesire, (byte)(Tier + 1), DueDate == null ? null : DueDate - 1); helper.ModifyActionList(character, alreadyConsidered, log); } } }
public void ModifyVisNeeds(Character character, VisDesire[] desires) { double visNeed = character.SeasonalAge / 20.0; VisCondition visCondition = new VisCondition(_artsRequired, visNeed, Desire, Tier, DueDate == null ? null : DueDate - 1); visCondition.ModifyVisNeeds(character, desires); }
public IList<BookDesire> GetBookNeeds(Character character) { if(!IsComplete(character)) { List<BookDesire> booksDesired = new List<BookDesire>(); var bookNeeds = _hasLabCondition.GetBookNeeds(character); if (bookNeeds != null) { booksDesired.AddRange(bookNeeds); } double visNeed = character.SeasonalAge / 20.0; VisCondition visCondition = new VisCondition(_artsRequired, visNeed, Desire, Tier, DueDate == null ? null : DueDate - 1); if (!visCondition.IsComplete(character)) { bookNeeds = visCondition.GetBookNeeds(character); if (bookNeeds != null) { booksDesired.AddRange(bookNeeds); } } return booksDesired; } return null; }