mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-22 14:12:27 +01:00
CORPORATION: Improve performance of cycle valuation (#1088)
This PR is an alternative for PR #1085. It includes these changes: * Create a new property: numberOfOfficesAndWarehouses. It's used for calculating cycle valuation. * Hardcode 1.0079741404289038 instead of calculating Math.pow(1.1, 1 / 12).
This commit is contained in:
parent
dc7c9bb065
commit
733f2ccb5b
@ -43,14 +43,16 @@ export function NewDivision(corporation: Corporation, industry: IndustryType, na
|
||||
type: industry,
|
||||
}),
|
||||
);
|
||||
corporation.numberOfOfficesAndWarehouses += 2;
|
||||
}
|
||||
}
|
||||
|
||||
export function removeDivision(corporation: Corporation, name: string): number {
|
||||
const division = corporation.divisions.get(name);
|
||||
if (!division) throw new Error("There is no division called " + name);
|
||||
const price = division.calculateRecoupableValue();
|
||||
corporation.divisions.delete(name);
|
||||
corporation.numberOfOfficesAndWarehouses -= getRecordValues(division.offices).length;
|
||||
corporation.numberOfOfficesAndWarehouses -= getRecordValues(division.warehouses).length;
|
||||
|
||||
// We also need to remove any exports that were pointing to the old division
|
||||
for (const otherDivision of corporation.divisions.values()) {
|
||||
@ -63,6 +65,7 @@ export function removeDivision(corporation: Corporation, name: string): number {
|
||||
}
|
||||
}
|
||||
}
|
||||
const price = division.calculateRecoupableValue();
|
||||
corporation.gainFunds(price, "division");
|
||||
return price;
|
||||
}
|
||||
@ -79,6 +82,7 @@ export function purchaseOffice(corporation: Corporation, division: Division, cit
|
||||
city: city,
|
||||
size: corpConstants.officeInitialSize,
|
||||
});
|
||||
++corporation.numberOfOfficesAndWarehouses;
|
||||
}
|
||||
|
||||
export function IssueDividends(corporation: Corporation, rate: number): void {
|
||||
@ -397,6 +401,7 @@ export function purchaseWarehouse(corp: Corporation, division: Division, city: C
|
||||
loc: city,
|
||||
size: corpConstants.warehouseInitialSize,
|
||||
});
|
||||
++corp.numberOfOfficesAndWarehouses;
|
||||
}
|
||||
|
||||
export function UpgradeWarehouseCost(warehouse: Warehouse, amt: number): number {
|
||||
|
@ -19,6 +19,7 @@ import { JSONMap, JSONSet } from "../Types/Jsonable";
|
||||
import { formatMoney } from "../ui/formatNumber";
|
||||
import { isPositiveInteger } from "../types";
|
||||
import { createEnumKeyedRecord, getRecordValues } from "../Types/Record";
|
||||
import { getKeyList } from "../utils/helpers/getKeyList";
|
||||
|
||||
export const CorporationPromise: PromisePair<CorpStateName> = { promise: null, resolve: null };
|
||||
|
||||
@ -72,6 +73,9 @@ export class Corporation {
|
||||
|
||||
state = new CorporationState();
|
||||
|
||||
// This is used for calculating cycle valuation.
|
||||
numberOfOfficesAndWarehouses = 0;
|
||||
|
||||
constructor(params: ICorporationParams = {}) {
|
||||
this.name = params.name || "The Corporation";
|
||||
this.seedFunded = params.seedFunded ?? false;
|
||||
@ -199,11 +203,6 @@ export class Corporation {
|
||||
assetDelta = (this.totalAssets - this.previousTotalAssets) / corpConstants.secondsPerMarketCycle;
|
||||
// Handle pre-totalAssets saves
|
||||
assetDelta ??= this.revenue - this.expenses;
|
||||
const numberOfOfficesAndWarehouses = [...this.divisions.values()]
|
||||
.map(
|
||||
(division: Division) => getRecordValues(division.offices).length + getRecordValues(division.warehouses).length,
|
||||
)
|
||||
.reduce((sum: number, currentValue: number) => sum + currentValue, 0);
|
||||
if (this.public) {
|
||||
// Account for dividends
|
||||
if (this.dividendRate > 0) {
|
||||
@ -211,14 +210,16 @@ export class Corporation {
|
||||
}
|
||||
|
||||
val = this.funds + assetDelta * 85e3;
|
||||
val *= Math.pow(Math.pow(1.1, 1 / 12), numberOfOfficesAndWarehouses);
|
||||
// Math.pow(1.1, 1 / 12) = 1.0079741404289038
|
||||
val *= Math.pow(1.0079741404289038, this.numberOfOfficesAndWarehouses);
|
||||
val = Math.max(val, 0);
|
||||
} else {
|
||||
val = 10e9 + this.funds / 3;
|
||||
if (assetDelta > 0) {
|
||||
val += assetDelta * 315e3;
|
||||
}
|
||||
val *= Math.pow(Math.pow(1.1, 1 / 12), numberOfOfficesAndWarehouses);
|
||||
// Math.pow(1.1, 1 / 12) = 1.0079741404289038
|
||||
val *= Math.pow(1.0079741404289038, this.numberOfOfficesAndWarehouses);
|
||||
val -= val % 1e6; //Round down to nearest million
|
||||
}
|
||||
if (val < 10e9) val = 10e9; // Base valuation
|
||||
@ -460,14 +461,23 @@ export class Corporation {
|
||||
return;
|
||||
}
|
||||
|
||||
// Exclude numberOfOfficesAndWarehouses
|
||||
static includedProperties = getKeyList(Corporation, { removedKeys: ["numberOfOfficesAndWarehouses"] });
|
||||
|
||||
/** Serialize the current object to a JSON save state. */
|
||||
toJSON(): IReviverValue {
|
||||
return Generic_toJSON("Corporation", this);
|
||||
return Generic_toJSON("Corporation", this, Corporation.includedProperties);
|
||||
}
|
||||
|
||||
/** Initializes a Corporation object from a JSON save state. */
|
||||
static fromJSON(value: IReviverValue): Corporation {
|
||||
return Generic_fromJSON(Corporation, value.data);
|
||||
const corporation = Generic_fromJSON(Corporation, value.data, Corporation.includedProperties);
|
||||
// numberOfOfficesAndWarehouses is not in the included properties and must be calculated
|
||||
for (const division of corporation.divisions.values()) {
|
||||
corporation.numberOfOfficesAndWarehouses += getRecordValues(division.offices).length;
|
||||
corporation.numberOfOfficesAndWarehouses += getRecordValues(division.warehouses).length;
|
||||
}
|
||||
return corporation;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user