internal PotionEffect GetPotionEffect(IngredientEffect ingredientEffect, PerkConfiguration perks) { var powerFactor = GetPowerFactor(ingredientEffect, perks); float magnitude = ingredientEffect.magicEffect.noMagnitude ? 0 : ingredientEffect.magnitude; var magnitudeFactor = ingredientEffect.magicEffect.powerAffectsMag ? powerFactor : 1.0f; magnitude *= magnitudeFactor; float duration = ingredientEffect.magicEffect.noDuration ? 0 : ingredientEffect.duration; var durationFactor = ingredientEffect.magicEffect.powerAffectsDur ? powerFactor : 1.0f; duration *= durationFactor; //magnitudeFactor = 1; //Used in the wiki calculations //if (magnitude < 0) magnitudeFactor = magnitude; //durationFactor = 1; //Used in the wiki calculations //if (duration < 0) durationFactor = duration / 10.0f; var durationCost = Math.Pow(durationFactor, 1.1); var magnitudeCost = Math.Pow(Math.Round(magnitudeFactor), 1.1); var value = ingredientEffect.value * magnitudeCost * durationCost; return(new PotionEffect(ingredientEffect: ingredientEffect, magnitude: ingredientEffect.magicEffect.noMagnitude ? 0 : (int)Math.Floor(magnitude), duration: ingredientEffect.magicEffect.noDuration ? 0 : (int)Math.Floor(duration))); }
internal PotionEffect(IngredientEffect ingredientEffect, int magnitude = 0, int duration = 0) { _alchemyEffect = ingredientEffect; _magicEffect = MagicEffect.GetMagicEffect(ingredientEffect.name); Magnitude = magnitude; Duration = duration; }
private static List <Ingredient> LoadFromFile(string filepath) { string NumbersInString(string str) { StringBuilder builder = new StringBuilder(); foreach (char c in str) { if ("0123456789.".Contains(c)) { builder.Append(c); } } return(builder.ToString()); } if (CSV.TryRead(filepath, hasHeaders: true, out CSV csv)) { List <Ingredient> ingredients = new List <Ingredient>(); var headerNumbers = csv.Headers.ToList().Select(header => NumbersInString(header)).Where(str => str.Length > 0).ToList(); int maxEffect = headerNumbers.Select(n => Convert.ToInt32(n)).Max(); for (int row = 0; row < csv.Rows; row++) { //Create an object from each row of the CSV IngredientEffect[] effects = new IngredientEffect[maxEffect]; for (int effectNum = 1; effectNum <= maxEffect; effectNum++) { effects[effectNum - 1] = new IngredientEffect( name: csv.GetEntry("Effect " + effectNum.ToString() + ": Name", row), mag: csv.GetEntry("Effect " + effectNum.ToString() + ": Magnitude", row), dur: csv.GetEntry("Effect " + effectNum.ToString() + ": Duration", row), val: csv.GetEntry("Effect " + effectNum.ToString() + ": Value", row), ingredientName: csv.GetEntry("Ingredient", row) ); } ingredients.Add(new Ingredient( name: csv.GetEntry("Ingredient", row), weight: csv.GetEntry("Weight", row), value: csv.GetEntry("Value", row), obtained: csv.GetEntry("Obtained", row), effects: effects )); } return(ingredients); } else { return(new List <Ingredient>()); } }
public Potion(IEnumerable <Ingredient> ingredients, PerkConfiguration perks) { this.ingredients = ingredients.Distinct().ToArray(); this.perks = perks; ingredientEffects = ProcessIngredients(this.ingredients); highestValueEffect = ingredientEffects.OrderByDescending(effect => effect.value).FirstOrDefault(); foreach (IngredientEffect effect in ingredientEffects) { GetPotionEffect(effect, perks); } }
internal float GetPowerFactor(IngredientEffect ingredientEffect, PerkConfiguration perks) { float physicianPerkMultiplier = perks.PhysicianPerk && (ingredientEffect.name == "Restore Health" || ingredientEffect.name == "Restore Magicka" || ingredientEffect.name == "Restore Stamina") ? 1.25f : 1.0f; float benefactorPerkMultiplier = perks.BenefactorPerk && IsPotion && ingredientEffect.magicEffect.beneficial ? 1.25f : 1.0f; float poisonerPerkMultiplier = perks.PoisonerPerk && IsPoison && ingredientEffect.magicEffect.HasKeyword("MagicAlchHarmful") ? 1.25f : 1.0f; float powerFactor = ingredientMult * (1.0f + (skillFactor - 1.0f) * perks.AlchemySkill / 100.0f) * (1.0f + perks.FortifyAlchemy / 100.0f) * (1.0f + perks.AlchemistPerk / 100.0f) * physicianPerkMultiplier * benefactorPerkMultiplier * poisonerPerkMultiplier; return(powerFactor); }