bitburner-src/src/Company/Company.ts

192 lines
4.8 KiB
TypeScript
Raw Normal View History

import { CompanyPosition } from "./CompanyPosition";
import * as posNames from "./data/companypositionnames";
import { CONSTANTS } from "../Constants";
import { IMap } from "../types";
2021-09-25 20:42:57 +02:00
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
export interface IConstructorParams {
2021-09-05 01:09:30 +02:00
name: string;
info: string;
companyPositions: IMap<boolean>;
expMultiplier: number;
salaryMultiplier: number;
jobStatReqOffset: number;
isMegacorp?: boolean;
}
const DefaultConstructorParams: IConstructorParams = {
2021-09-05 01:09:30 +02:00
name: "",
info: "",
companyPositions: {},
expMultiplier: 1,
salaryMultiplier: 1,
jobStatReqOffset: 0,
};
export class Company {
2021-09-05 01:09:30 +02:00
/**
* Company name
*/
name: string;
/**
* Description and general information about company
*/
info: string;
/**
* Has faction associated.
*/
isMegacorp: boolean;
2021-09-05 01:09:30 +02:00
/**
* Object that holds all available positions in this Company.
* Position names are held in keys.
* The values for the keys don't matter, but we'll make them booleans
*
* Must match names of Company Positions, defined in data/companypositionnames.ts
*/
companyPositions: IMap<boolean>;
/**
* Company-specific multiplier for earnings
*/
expMultiplier: number;
salaryMultiplier: number;
/**
* The additional levels of stats you need to quality for a job
* in this company.
*
* For example, the base stat requirement for an intern position is 1.
* But if a company has a offset of 200, then you would need stat(s) of 201
*/
jobStatReqOffset: number;
/**
* Properties to track the player's progress in this company
*/
isPlayerEmployed: boolean;
playerReputation: number;
favor: number;
rolloverRep: number;
constructor(p: IConstructorParams = DefaultConstructorParams) {
this.name = p.name;
this.info = p.info;
this.companyPositions = p.companyPositions;
this.expMultiplier = p.expMultiplier;
this.salaryMultiplier = p.salaryMultiplier;
this.jobStatReqOffset = p.jobStatReqOffset;
this.isPlayerEmployed = false;
this.playerReputation = 1;
this.favor = 0;
this.rolloverRep = 0;
this.isMegacorp = false;
if (p.isMegacorp) this.isMegacorp = true;
2021-09-05 01:09:30 +02:00
}
hasPosition(pos: CompanyPosition | string): boolean {
if (pos instanceof CompanyPosition) {
return this.companyPositions[pos.name] != null;
} else {
return this.companyPositions[pos] != null;
}
2021-09-05 01:09:30 +02:00
}
hasAgentPositions(): boolean {
return this.companyPositions[posNames.AgentCompanyPositions[0]] != null;
}
hasBusinessConsultantPositions(): boolean {
2021-09-09 05:47:34 +02:00
return this.companyPositions[posNames.BusinessConsultantCompanyPositions[0]] != null;
2021-09-05 01:09:30 +02:00
}
hasBusinessPositions(): boolean {
return this.companyPositions[posNames.BusinessCompanyPositions[0]] != null;
}
hasEmployeePositions(): boolean {
return this.companyPositions[posNames.MiscCompanyPositions[1]] != null;
}
hasITPositions(): boolean {
return this.companyPositions[posNames.ITCompanyPositions[0]] != null;
}
hasSecurityPositions(): boolean {
return this.companyPositions[posNames.SecurityCompanyPositions[2]] != null;
}
hasSoftwareConsultantPositions(): boolean {
2021-09-09 05:47:34 +02:00
return this.companyPositions[posNames.SoftwareConsultantCompanyPositions[0]] != null;
2021-09-05 01:09:30 +02:00
}
hasSoftwarePositions(): boolean {
return this.companyPositions[posNames.SoftwareCompanyPositions[0]] != null;
}
hasWaiterPositions(): boolean {
return this.companyPositions[posNames.MiscCompanyPositions[0]] != null;
}
gainFavor(): void {
if (this.favor == null) {
this.favor = 0;
}
2021-09-05 01:09:30 +02:00
if (this.rolloverRep == null) {
this.rolloverRep = 0;
}
2021-09-05 01:09:30 +02:00
const res = this.getFavorGain();
if (res.length != 2) {
console.error("Invalid result from getFavorGain() function");
return;
}
2021-09-05 01:09:30 +02:00
this.favor += res[0];
this.rolloverRep = res[1];
}
2021-09-05 01:09:30 +02:00
getFavorGain(): number[] {
if (this.favor == null) {
this.favor = 0;
}
2021-09-05 01:09:30 +02:00
if (this.rolloverRep == null) {
this.rolloverRep = 0;
}
2021-09-05 01:09:30 +02:00
let favorGain = 0,
rep = this.playerReputation + this.rolloverRep;
2021-09-09 05:47:34 +02:00
let reqdRep = CONSTANTS.CompanyReputationToFavorBase * Math.pow(CONSTANTS.CompanyReputationToFavorMult, this.favor);
2021-09-05 01:09:30 +02:00
while (rep > 0) {
if (rep >= reqdRep) {
++favorGain;
rep -= reqdRep;
} else {
break;
}
reqdRep *= CONSTANTS.FactionReputationToFavorMult;
2021-05-01 09:17:31 +02:00
}
2021-09-05 01:09:30 +02:00
return [favorGain, rep];
}
/**
* Serialize the current object to a JSON save state.
*/
toJSON(): any {
return Generic_toJSON("Company", this);
}
/**
* Initiatizes a Company from a JSON save state.
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
static fromJSON(value: any): Company {
return Generic_fromJSON(Company, value.data);
}
}
Reviver.constructors.Company = Company;