Files
bitburner-src/src/Faction/Faction.ts
T
2024-05-28 12:04:16 -07:00

87 lines
2.3 KiB
TypeScript

import { AugmentationName, FactionName, FactionDiscovery } from "@enums";
import { FactionInfo, FactionInfos } from "./FactionInfo";
import { MaxFavor, calculateFavorAfterResetting } from "./formulas/favor";
import { clampNumber } from "../utils/helpers/clampNumber";
export class Faction {
/**
* Flag signalling whether the player has already received an invitation
* to this faction
*/
alreadyInvited = false;
/** Holds names of all augmentations that this Faction offers */
augmentations: AugmentationName[] = [];
/** Amount of favor the player has with this faction. */
#favor = 0;
/** Flag signalling whether player has been banned from this faction */
isBanned = false;
/** Flag signalling whether player is a member of this faction */
isMember = false;
/** Level of player knowledge about this faction (unknown, rumored, known) */
discovery: FactionDiscovery = FactionDiscovery.unknown;
/** Name of faction */
name: FactionName;
/** Amount of reputation player has with this faction */
playerReputation = 0;
constructor(name: FactionName) {
this.name = name;
}
get favor() {
return this.#favor;
}
/**
* There is no setter for this.#favor. This is intentional. Performing arithmetic operations on `favor` may lead to
* the overflow error of `playerReputation`, so anything that wants to change `favor` must explicitly do that through
* `setFavor`.
*
* @param value
*/
setFavor(value: number) {
if (Number.isNaN(value)) {
this.#favor = 0;
return;
}
this.#favor = clampNumber(value, 0, MaxFavor);
}
getInfo(): FactionInfo {
const info = FactionInfos[this.name];
if (info == null) {
throw new Error(
`Missing faction from FactionInfos: ${this.name} this probably means the faction got corrupted somehow`,
);
}
return info;
}
prestigeSourceFile() {
// Reset favor, reputation, and flags
this.setFavor(0);
this.playerReputation = 0;
this.alreadyInvited = false;
this.isMember = false;
this.isBanned = false;
}
prestigeAugmentation(): void {
// Gain favor
this.setFavor(calculateFavorAfterResetting(this.favor, this.playerReputation));
// Reset reputation and flags
this.playerReputation = 0;
this.alreadyInvited = false;
this.isMember = false;
this.isBanned = false;
}
}