mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-10-23 02:03:14 +02:00
32 lines
1.4 KiB
TypeScript
32 lines
1.4 KiB
TypeScript
|
import { PositiveInteger } from "../types";
|
||
|
import { Corporation } from "./Corporation";
|
||
|
import { CorpUpgrade } from "./data/CorporationUpgrades";
|
||
|
|
||
|
export function calculateUpgradeCost(corporation: Corporation, upgrade: CorpUpgrade, amount: PositiveInteger): number {
|
||
|
const priceMult = upgrade.priceMult;
|
||
|
const level = corporation.upgrades[upgrade.name].level;
|
||
|
const baseCost = upgrade.basePrice * Math.pow(priceMult, level);
|
||
|
const cost = (baseCost * (1 - Math.pow(priceMult, amount))) / (1 - priceMult);
|
||
|
return cost;
|
||
|
}
|
||
|
|
||
|
export function calculateMaxAffordableUpgrade(corp: Corporation, upgrade: CorpUpgrade): 0 | PositiveInteger {
|
||
|
const Lvl = corp.upgrades[upgrade.name].level;
|
||
|
const Multi = upgrade.priceMult;
|
||
|
const Base = upgrade.basePrice;
|
||
|
/*
|
||
|
Let's calculate X - affordable upgrade count using the formula in `calculateUpgradeCost`:
|
||
|
|
||
|
Base * Multi^Lvl * (1 - Multi^X) / (1 - Multi) <= FUNDS
|
||
|
(1 - Multi^X) >= FUNDS / Base / Multi^Lvl * (1 - Multi)
|
||
|
Multi^X >= 1 - FUNDS / Base / Multi^Lvl * (1 - Multi)
|
||
|
X <= ln(1 - FUNDS / Base / Multi^Lvl * (1 - Multi)) / ln(Multi)
|
||
|
*/
|
||
|
const maxAffordableUpgrades = Math.floor(
|
||
|
Math.log(1 - (corp.funds / Base / Math.pow(Multi, Lvl)) * (1 - Multi)) / Math.log(Multi),
|
||
|
);
|
||
|
|
||
|
const sanitizedValue = maxAffordableUpgrades >= 0 ? maxAffordableUpgrades : 0;
|
||
|
return sanitizedValue as PositiveInteger | 0;
|
||
|
}
|