/// <summary> /// How much resource would it cost to buy (numItems) items if you already have currentOwned, /// the initial price is priceStart and it multiplies by priceRatio each purchase? /// </summary> public static BigDouble SumGeometricSeries(BigDouble numItems, BigDouble priceStart, BigDouble priceRatio, BigDouble currentOwned) { var actualStart = priceStart * BigDouble.Pow(priceRatio, currentOwned); return(actualStart * (1 - BigDouble.Pow(priceRatio, numItems)) / (1 - priceRatio)); }
/// <summary> /// If you're willing to spend 'resourcesAvailable' and want to buy something with /// exponentially increasing cost each purchase (start at priceStart, multiply by priceRatio, /// already own currentOwned), how much of it can you buy? /// <para> /// Adapted from Trimps source code. /// </para> /// </summary> public static BigDouble AffordGeometricSeries(BigDouble resourcesAvailable, BigDouble priceStart, BigDouble priceRatio, BigDouble currentOwned) { var actualStart = priceStart * BigDouble.Pow(priceRatio, currentOwned); //return Math.floor(log10(((resourcesAvailable / (priceStart * Math.pow(priceRatio, currentOwned))) * (priceRatio - 1)) + 1) / log10(priceRatio)); return(BigDouble.Floor(BigDouble.Log10(resourcesAvailable / actualStart * (priceRatio - 1) + 1) / BigDouble.Log10(priceRatio))); }
/// <summary> /// If you're willing to spend 'resourcesAvailable' and want to buy something with /// additively increasing cost each purchase (start at priceStart, add by priceAdd, /// already own currentOwned), how much of it can you buy? /// </summary> public static BigDouble AffordArithmeticSeries(BigDouble resourcesAvailable, BigDouble priceStart, BigDouble priceAdd, BigDouble currentOwned) { var actualStart = priceStart + currentOwned * priceAdd; //n = (-(a-d/2) + sqrt((a-d/2)^2+2dS))/d //where a is actualStart, d is priceAdd and S is resourcesAvailable //then floor it and you're done! var b = actualStart - priceAdd / 2; var b2 = BigDouble.Pow(b, 2); return(BigDouble.Floor( (BigDouble.Sqrt(b2 + priceAdd * resourcesAvailable * 2) - b) / priceAdd )); }
/// <summary> /// Joke function from Realm Grinder. /// </summary> public static BigDouble AscensionPenalty(this BigDouble value, double ascensions) { return(Math.Abs(ascensions) < double.Epsilon ? value : BigDouble.Pow(value, Math.Pow(10, -ascensions))); }
public static BigDouble Sqr(this BigDouble value) { return(BigDouble.Pow(value, 2)); }
public static BigDouble Pow(this BigDouble value, double power) { return(BigDouble.Pow(value, power)); }