bitburner-src/src/Company/CompanyPosition.ts
2021-09-08 23:47:34 -04:00

192 lines
6.0 KiB
TypeScript

import { CONSTANTS } from "../Constants";
import * as names from "./data/companypositionnames";
/* tslint:disable:completed-docs */
export interface IConstructorParams {
name: string;
nextPosition: string | null;
baseSalary: number;
repMultiplier: number;
reqdHacking?: number;
reqdStrength?: number;
reqdDefense?: number;
reqdDexterity?: number;
reqdAgility?: number;
reqdCharisma?: number;
reqdReputation?: number;
hackingEffectiveness?: number;
strengthEffectiveness?: number;
defenseEffectiveness?: number;
dexterityEffectiveness?: number;
agilityEffectiveness?: number;
charismaEffectiveness?: number;
hackingExpGain?: number;
strengthExpGain?: number;
defenseExpGain?: number;
dexterityExpGain?: number;
agilityExpGain?: number;
charismaExpGain?: number;
}
export class CompanyPosition {
/**
* Position title
*/
name: string;
/**
* Title of next position to be promoted to
*/
nextPosition: string | null;
/**
* Base salary for this position ($ per 200ms game cycle)
* Will be multiplier by a company-specific multiplier for final salary
*/
baseSalary: number;
/**
* Reputation multiplier
*/
repMultiplier: number;
/**
* Required stats to earn this position
*/
requiredAgility: number;
requiredCharisma: number;
requiredDefense: number;
requiredDexterity: number;
requiredHacking: number;
requiredStrength: number;
/**
* Required company reputation to earn this position
*/
requiredReputation: number;
/**
* Effectiveness of each stat time for job performance
*/
hackingEffectiveness: number;
strengthEffectiveness: number;
defenseEffectiveness: number;
dexterityEffectiveness: number;
agilityEffectiveness: number;
charismaEffectiveness: number;
/**
* Experience gain for performing job (per 200ms game cycle)
*/
hackingExpGain: number;
strengthExpGain: number;
defenseExpGain: number;
dexterityExpGain: number;
agilityExpGain: number;
charismaExpGain: number;
constructor(p: IConstructorParams) {
this.name = p.name;
this.nextPosition = p.nextPosition;
this.baseSalary = p.baseSalary;
this.repMultiplier = p.repMultiplier;
this.requiredHacking = p.reqdHacking != null ? p.reqdHacking : 0;
this.requiredStrength = p.reqdStrength != null ? p.reqdStrength : 0;
this.requiredDefense = p.reqdDefense != null ? p.reqdDefense : 0;
this.requiredDexterity = p.reqdDexterity != null ? p.reqdDexterity : 0;
this.requiredAgility = p.reqdAgility != null ? p.reqdAgility : 0;
this.requiredCharisma = p.reqdCharisma != null ? p.reqdCharisma : 0;
this.requiredReputation = p.reqdReputation != null ? p.reqdReputation : 0;
this.hackingEffectiveness = p.hackingEffectiveness != null ? p.hackingEffectiveness : 0;
this.strengthEffectiveness = p.strengthEffectiveness != null ? p.strengthEffectiveness : 0;
this.defenseEffectiveness = p.defenseEffectiveness != null ? p.defenseEffectiveness : 0;
this.dexterityEffectiveness = p.dexterityEffectiveness != null ? p.dexterityEffectiveness : 0;
this.agilityEffectiveness = p.agilityEffectiveness != null ? p.agilityEffectiveness : 0;
this.charismaEffectiveness = p.charismaEffectiveness != null ? p.charismaEffectiveness : 0;
if (
Math.round(
this.hackingEffectiveness +
this.strengthEffectiveness +
this.defenseEffectiveness +
this.dexterityEffectiveness +
this.agilityEffectiveness +
this.charismaEffectiveness,
) !== 100
) {
console.error(`CompanyPosition ${this.name} parameters do not sum to 100`);
}
this.hackingExpGain = p.hackingExpGain != null ? p.hackingExpGain : 0;
this.strengthExpGain = p.strengthExpGain != null ? p.strengthExpGain : 0;
this.defenseExpGain = p.defenseExpGain != null ? p.defenseExpGain : 0;
this.dexterityExpGain = p.dexterityExpGain != null ? p.dexterityExpGain : 0;
this.agilityExpGain = p.agilityExpGain != null ? p.agilityExpGain : 0;
this.charismaExpGain = p.charismaExpGain != null ? p.charismaExpGain : 0;
}
calculateJobPerformance(hack: number, str: number, def: number, dex: number, agi: number, cha: number): number {
const hackRatio: number = (this.hackingEffectiveness * hack) / CONSTANTS.MaxSkillLevel;
const strRatio: number = (this.strengthEffectiveness * str) / CONSTANTS.MaxSkillLevel;
const defRatio: number = (this.defenseEffectiveness * def) / CONSTANTS.MaxSkillLevel;
const dexRatio: number = (this.dexterityEffectiveness * dex) / CONSTANTS.MaxSkillLevel;
const agiRatio: number = (this.agilityEffectiveness * agi) / CONSTANTS.MaxSkillLevel;
const chaRatio: number = (this.charismaEffectiveness * cha) / CONSTANTS.MaxSkillLevel;
let reputationGain: number =
(this.repMultiplier * (hackRatio + strRatio + defRatio + dexRatio + agiRatio + chaRatio)) / 100;
if (isNaN(reputationGain)) {
console.error("Company reputation gain calculated to be NaN");
reputationGain = 0;
}
return reputationGain;
}
isSoftwareJob(): boolean {
return names.SoftwareCompanyPositions.includes(this.name);
}
isITJob(): boolean {
return names.ITCompanyPositions.includes(this.name);
}
isSecurityEngineerJob(): boolean {
return names.SecurityEngineerCompanyPositions.includes(this.name);
}
isNetworkEngineerJob(): boolean {
return names.NetworkEngineerCompanyPositions.includes(this.name);
}
isBusinessJob(): boolean {
return names.BusinessCompanyPositions.includes(this.name);
}
isSecurityJob(): boolean {
return names.SecurityCompanyPositions.includes(this.name);
}
isAgentJob(): boolean {
return names.AgentCompanyPositions.includes(this.name);
}
isSoftwareConsultantJob(): boolean {
return names.SoftwareConsultantCompanyPositions.includes(this.name);
}
isBusinessConsultantJob(): boolean {
return names.BusinessConsultantCompanyPositions.includes(this.name);
}
isPartTimeJob(): boolean {
return names.PartTimeCompanyPositions.includes(this.name);
}
}