forked from profectus/Profectus
Fix calculate max affordable edge case
This commit is contained in:
parent
4160986a4d
commit
b6317a47e8
2 changed files with 20 additions and 2 deletions
|
@ -1426,14 +1426,14 @@ export function calculateMaxAffordable(
|
||||||
summedPurchases = 0;
|
summedPurchases = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (summedPurchases > 0) {
|
if (summedPurchases > 0 && Decimal.lt(calculateCost(formula, affordable, true, 0), 1e308)) {
|
||||||
affordable = affordable.sub(summedPurchases).clampMin(0);
|
affordable = affordable.sub(summedPurchases).clampMin(0);
|
||||||
let summedCost = calculateCost(formula, affordable, true, 0);
|
let summedCost = calculateCost(formula, affordable, true, 0);
|
||||||
while (true) {
|
while (true) {
|
||||||
const nextCost = formula.evaluate(
|
const nextCost = formula.evaluate(
|
||||||
affordable.add(unref(formula.innermostVariable) ?? 0)
|
affordable.add(unref(formula.innermostVariable) ?? 0)
|
||||||
);
|
);
|
||||||
if (Decimal.add(summedCost, nextCost).lt(resource.value)) {
|
if (Decimal.add(summedCost, nextCost).lte(resource.value)) {
|
||||||
affordable = affordable.add(1);
|
affordable = affordable.add(1);
|
||||||
summedCost = Decimal.add(summedCost, nextCost);
|
summedCost = Decimal.add(summedCost, nextCost);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1174,6 +1174,24 @@ describe("Buy Max", () => {
|
||||||
// Since we're summing all the purchases this should be equivalent
|
// Since we're summing all the purchases this should be equivalent
|
||||||
expect(calculatedCost).compare_tolerance(actualCost);
|
expect(calculatedCost).compare_tolerance(actualCost);
|
||||||
});
|
});
|
||||||
|
test("Handles summing purchases when making very few purchases", () => {
|
||||||
|
const purchases = ref(0);
|
||||||
|
const variable = Formula.variable(purchases);
|
||||||
|
const formula = variable.add(1);
|
||||||
|
const resource = createResource(ref(3));
|
||||||
|
const maxAffordable = calculateMaxAffordable(formula, resource, true);
|
||||||
|
expect(maxAffordable.value).compare_tolerance(2);
|
||||||
|
|
||||||
|
const actualCost = new Array(2)
|
||||||
|
.fill(null)
|
||||||
|
.reduce(
|
||||||
|
(acc, _, i) => acc.add(formula.evaluate(i + purchases.value)),
|
||||||
|
new Decimal(0)
|
||||||
|
);
|
||||||
|
const calculatedCost = calculateCost(formula, maxAffordable.value, true);
|
||||||
|
// Since we're summing all the purchases this should be equivalent
|
||||||
|
expect(calculatedCost).compare_tolerance(actualCost);
|
||||||
|
});
|
||||||
test("Handles summing purchases when over e308 purchases", () => {
|
test("Handles summing purchases when over e308 purchases", () => {
|
||||||
resource.value = "1ee308";
|
resource.value = "1ee308";
|
||||||
const purchases = ref(0);
|
const purchases = ref(0);
|
||||||
|
|
Loading…
Reference in a new issue