From 23eef62332dc922ced86fcf495a71eefa500fc64 Mon Sep 17 00:00:00 2001 From: danielyxie Date: Wed, 31 Oct 2018 14:57:47 -0500 Subject: [PATCH] Created a standalone CompanyPosition class with TS --- src/{ => Company}/Company.js | 0 src/Company/CompanyPosition.ts | 192 +++++++++++++++++++++++ src/Company/data/companypositionnames.ts | 64 ++++++++ tsconfig.json | 1 + 4 files changed, 257 insertions(+) rename src/{ => Company}/Company.js (100%) create mode 100644 src/Company/CompanyPosition.ts create mode 100644 src/Company/data/companypositionnames.ts diff --git a/src/Company.js b/src/Company/Company.js similarity index 100% rename from src/Company.js rename to src/Company/Company.js diff --git a/src/Company/CompanyPosition.ts b/src/Company/CompanyPosition.ts new file mode 100644 index 000000000..2c29beb2e --- /dev/null +++ b/src/Company/CompanyPosition.ts @@ -0,0 +1,192 @@ +import { Generic_fromJSON, Generic_toJSON, Reviver } from "/utils/JSONReviver"; +import { CONSTANTS } from "/src/Constants"; +import * as names from "/src/Company/data/companypositionname"; + +/* tslint:disable:completed-docs */ + +interface ConstructorParams { + name: string, + 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 { + /** + * Initializes a CompanyPosition object from a JSON save state + */ + static fromJSON(value: any): CompanyPosition { + return Generic_fromJSON(CompanyPosition, value.data); + } + + /** + * Position title + */ + positionName: string; + + /** + * Base salary for this position ($ per 200ms game cycle) + * Will be multiplier by a company-specific multiplier for final salary + */ + baseSalary: number; + + /** + * Reputation multiplier + */ + positionMultiplier: 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: ConstructorParams) { + this.name = p.name; + this.baseSalary = p.baseSalary; + this.repMultiplier = p.repMultiplier; + + this.reqdHacking = (p.reqdHacking != null) ? p.reqdHacking : 0; + this.reqdStrength = (p.reqdStrength != null) ? p.reqdStrength : 0; + this.reqdDefense = (p.reqdDefense != null) ? p.reqdDefense : 0; + this.reqdDexterity = (p.reqdDexterity != null) ? p.reqdDexterity : 0; + this.reqdAgility = (p.reqdAgility != null) ? p.reqdAgility : 0; + this.reqdCharisma = (p.reqdCharisma != null) ? p.reqdCharisma : 0; + this.reqdReputation = (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.positionMultiplier * (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); + } + + /** + * Serialize the current file to a JSON save state. + */ + toJSON(): any { + return Generic_toJSON("CompanyPosition", this); + } +} + +Reviver.constructors.CompanyPosition = CompanyPosition; diff --git a/src/Company/data/companypositionnames.ts b/src/Company/data/companypositionnames.ts new file mode 100644 index 000000000..0c2f08191 --- /dev/null +++ b/src/Company/data/companypositionnames.ts @@ -0,0 +1,64 @@ +export const SoftwareCompanyPositions: string[] = [ + "Software Engineering Intern", + "Junior Software Engineer", + "Senior Software Engineer", + "Lead Software Developer", + "Head of Software", + "Head of Engineering", + "Vice President of Technology", + "Chief Technology Officer" +]; + +export const ITCompanyPositions: string[] = [ + "IT Intern", + "IT Analyst", + "IT Manager", + "Systems Administrator" +]; + +export const SecurityEngineerCompanyPositions: string[] = [ + "Security Engineer" +]; + +export const NetworkEngineerCompanyPositions: string[] = [ + "Network Engineer", + "Network Administrator" +]; + +export const BusinessCompanyPositions: string[] = [ + "Business Intern", + "Business Analyst", + "Business Manager", + "Operations Manager", + "Chief Financial Officer", + "Chief Executive Officer" +]; + +export const SecurityCompanyPositions: string[] = [ + "Security Guard", + "Police Officer", + "Security Officer", + "Security Supervisor", + "Head of Security" +]; + +export const AgentCompanyPositions: string[] = [ + "Field Agent", + "Secret Agent", + "Special Operative" +]; + +export const SoftwareConsultantCompanyPositions: string[] = [ + "Software Consultant", + "Senior Software Consultant" +]; + +export const BusinessConsultantCompanyPositions: string[] = [ + "Business Consultant", + "Senior Business Consultant" +]; + +export const PartTimeCompanyPositions: string[] = [ + "Part-time Waiter", + "Part-time Employee" +]; diff --git a/tsconfig.json b/tsconfig.json index 7f31edd5f..3e238cf10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl" : ".", "lib" : ["es2016", "dom"], "module": "commonjs", "target": "es6",