API: Change singularity.applyToCompany() to use an enum for job field (#859)

This commit is contained in:
alutman 2023-10-17 20:33:16 +11:00 committed by GitHub
parent 686d2e2b9b
commit 1a052a7daf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 275 additions and 34 deletions

@ -0,0 +1,11 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [CompanyPositionInfo](./bitburner.companypositioninfo.md) &gt; [field](./bitburner.companypositioninfo.field.md)
## CompanyPositionInfo.field property
**Signature:**
```typescript
field: JobField;
```

@ -16,6 +16,7 @@ export interface CompanyPositionInfo
| Property | Modifiers | Type | Description | | Property | Modifiers | Type | Description |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| [field](./bitburner.companypositioninfo.field.md) | | [JobField](./bitburner.jobfield.md) | |
| [name](./bitburner.companypositioninfo.name.md) | | [JobName](./bitburner.jobname.md) | | | [name](./bitburner.companypositioninfo.name.md) | | [JobName](./bitburner.jobname.md) | |
| [nextPosition](./bitburner.companypositioninfo.nextposition.md) | | [JobName](./bitburner.jobname.md) \| null | | | [nextPosition](./bitburner.companypositioninfo.nextposition.md) | | [JobName](./bitburner.jobname.md) \| null | |
| [requiredReputation](./bitburner.companypositioninfo.requiredreputation.md) | | number | | | [requiredReputation](./bitburner.companypositioninfo.requiredreputation.md) | | number | |

@ -0,0 +1,31 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [JobField](./bitburner.jobfield.md)
## JobField enum
**Signature:**
```typescript
declare enum JobField
```
## Enumeration Members
| Member | Value | Description |
| --- | --- | --- |
| agent | <code>&quot;Agent&quot;</code> | |
| business | <code>&quot;Business&quot;</code> | |
| businessConsultant | <code>&quot;Business Consultant&quot;</code> | |
| employee | <code>&quot;Employee&quot;</code> | |
| it | <code>&quot;IT&quot;</code> | |
| networkEngineer | <code>&quot;Network Engineer&quot;</code> | |
| partTimeEmployee | <code>&quot;part-time Employee&quot;</code> | |
| partTimeWaiter | <code>&quot;part-time Waiter&quot;</code> | |
| security | <code>&quot;Security&quot;</code> | |
| securityEngineer | <code>&quot;Security Engineer&quot;</code> | |
| software | <code>&quot;Software&quot;</code> | |
| softwareConsultant | <code>&quot;Software Consultant&quot;</code> | |
| waiter | <code>&quot;Waiter&quot;</code> | |

@ -13,6 +13,7 @@
| [CrimeType](./bitburner.crimetype.md) | | | [CrimeType](./bitburner.crimetype.md) | |
| [FactionWorkType](./bitburner.factionworktype.md) | | | [FactionWorkType](./bitburner.factionworktype.md) | |
| [GymType](./bitburner.gymtype.md) | | | [GymType](./bitburner.gymtype.md) | |
| [JobField](./bitburner.jobfield.md) | |
| [JobName](./bitburner.jobname.md) | | | [JobName](./bitburner.jobname.md) | |
| [LocationName](./bitburner.locationname.md) | Names of all locations | | [LocationName](./bitburner.locationname.md) | Names of all locations |
| [OrderType](./bitburner.ordertype.md) | | | [OrderType](./bitburner.ordertype.md) | |

@ -14,11 +14,12 @@ export type NSEnums = {
FactionWorkType: typeof FactionWorkType; FactionWorkType: typeof FactionWorkType;
GymType: typeof GymType; GymType: typeof GymType;
JobName: typeof JobName; JobName: typeof JobName;
JobField: typeof JobField;
LocationName: typeof LocationName; LocationName: typeof LocationName;
ToastVariant: typeof ToastVariant; ToastVariant: typeof ToastVariant;
UniversityClassType: typeof UniversityClassType; UniversityClassType: typeof UniversityClassType;
CompanyName: typeof CompanyName; CompanyName: typeof CompanyName;
}; };
``` ```
**References:** [CityName](./bitburner.cityname.md)<!-- -->, [CrimeType](./bitburner.crimetype.md)<!-- -->, [FactionWorkType](./bitburner.factionworktype.md)<!-- -->, [GymType](./bitburner.gymtype.md)<!-- -->, [JobName](./bitburner.jobname.md)<!-- -->, [LocationName](./bitburner.locationname.md)<!-- -->, [ToastVariant](./bitburner.toastvariant.md)<!-- -->, [UniversityClassType](./bitburner.universityclasstype.md)<!-- -->, [CompanyName](./bitburner.companyname.md) **References:** [CityName](./bitburner.cityname.md)<!-- -->, [CrimeType](./bitburner.crimetype.md)<!-- -->, [FactionWorkType](./bitburner.factionworktype.md)<!-- -->, [GymType](./bitburner.gymtype.md)<!-- -->, [JobName](./bitburner.jobname.md)<!-- -->, [JobField](./bitburner.jobfield.md)<!-- -->, [LocationName](./bitburner.locationname.md)<!-- -->, [ToastVariant](./bitburner.toastvariant.md)<!-- -->, [UniversityClassType](./bitburner.universityclasstype.md)<!-- -->, [CompanyName](./bitburner.companyname.md)

@ -9,7 +9,7 @@ Apply for a job at a company.
**Signature:** **Signature:**
```typescript ```typescript
applyToCompany(companyName: CompanyName | `${CompanyName}`, field: string): boolean; applyToCompany(companyName: CompanyName | `${CompanyName}`, field: JobField | `${JobField}`): boolean;
``` ```
## Parameters ## Parameters
@ -17,7 +17,7 @@ applyToCompany(companyName: CompanyName | `${CompanyName}`, field: string): bool
| Parameter | Type | Description | | Parameter | Type | Description |
| --- | --- | --- | | --- | --- | --- |
| companyName | [CompanyName](./bitburner.companyname.md) \| \`${[CompanyName](./bitburner.companyname.md)<!-- -->}\` | Name of company to apply to. | | companyName | [CompanyName](./bitburner.companyname.md) \| \`${[CompanyName](./bitburner.companyname.md)<!-- -->}\` | Name of company to apply to. |
| field | string | Field to which you want to apply. | | field | [JobField](./bitburner.jobfield.md) \| \`${[JobField](./bitburner.jobfield.md)<!-- -->}\` | Field to which you want to apply. |
**Returns:** **Returns:**

@ -1,6 +1,6 @@
import { Person as IPerson } from "@nsdefs"; import { Person as IPerson } from "@nsdefs";
import { CONSTANTS } from "../Constants"; import { CONSTANTS } from "../Constants";
import { JobName } from "@enums"; import { JobName, JobField } from "@enums";
import { import {
agentJobs, agentJobs,
businessConsultJobs, businessConsultJobs,
@ -14,6 +14,7 @@ import {
export interface CompanyPositionCtorParams { export interface CompanyPositionCtorParams {
nextPosition: JobName | null; nextPosition: JobName | null;
field: JobField;
baseSalary: number; baseSalary: number;
repMultiplier: number; repMultiplier: number;
@ -44,6 +45,9 @@ export class CompanyPosition {
/** Position title */ /** Position title */
name: JobName; name: JobName;
/** Field type of the position (software, it, business, etc) */
field: JobField;
/** Title of next position to be promoted to */ /** Title of next position to be promoted to */
nextPosition: JobName | null; nextPosition: JobName | null;
@ -85,6 +89,7 @@ export class CompanyPosition {
constructor(name: JobName, p: CompanyPositionCtorParams) { constructor(name: JobName, p: CompanyPositionCtorParams) {
this.name = name; this.name = name;
this.field = p.field;
this.nextPosition = p.nextPosition; this.nextPosition = p.nextPosition;
this.baseSalary = p.baseSalary; this.baseSalary = p.baseSalary;
this.repMultiplier = p.repMultiplier; this.repMultiplier = p.repMultiplier;

@ -1,11 +1,12 @@
// Metadata used for constructing Company Positions // Metadata used for constructing Company Positions
import { JobName } from "@enums"; import { JobName, JobField } from "@enums";
import { CompanyPositionCtorParams } from "../CompanyPosition"; import { CompanyPositionCtorParams } from "../CompanyPosition";
export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCtorParams> { export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCtorParams> {
return { return {
[JobName.software0]: { [JobName.software0]: {
nextPosition: JobName.software1, // Junior Software Engineer nextPosition: JobName.software1, // Junior Software Engineer
field: JobField.software,
baseSalary: 33, baseSalary: 33,
charismaEffectiveness: 15, charismaEffectiveness: 15,
charismaExpGain: 0.02, charismaExpGain: 0.02,
@ -16,6 +17,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software1]: { [JobName.software1]: {
nextPosition: JobName.software2, // Senior Software Engineer nextPosition: JobName.software2, // Senior Software Engineer
field: JobField.software,
baseSalary: 80, baseSalary: 80,
charismaEffectiveness: 15, charismaEffectiveness: 15,
charismaExpGain: 0.05, charismaExpGain: 0.05,
@ -27,6 +29,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software2]: { [JobName.software2]: {
nextPosition: JobName.software3, // Lead Software Developer nextPosition: JobName.software3, // Lead Software Developer
field: JobField.software,
baseSalary: 165, baseSalary: 165,
charismaEffectiveness: 20, charismaEffectiveness: 20,
charismaExpGain: 0.08, charismaExpGain: 0.08,
@ -39,6 +42,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software3]: { [JobName.software3]: {
nextPosition: JobName.software4, // Head of Software nextPosition: JobName.software4, // Head of Software
field: JobField.software,
baseSalary: 500, baseSalary: 500,
charismaEffectiveness: 25, charismaEffectiveness: 25,
charismaExpGain: 0.1, charismaExpGain: 0.1,
@ -51,6 +55,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software4]: { [JobName.software4]: {
nextPosition: JobName.software5, // Head of Engineering nextPosition: JobName.software5, // Head of Engineering
field: JobField.software,
baseSalary: 800, baseSalary: 800,
charismaEffectiveness: 25, charismaEffectiveness: 25,
charismaExpGain: 0.5, charismaExpGain: 0.5,
@ -63,6 +68,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software5]: { [JobName.software5]: {
nextPosition: JobName.software6, // Vice President of Technology nextPosition: JobName.software6, // Vice President of Technology
field: JobField.software,
baseSalary: 1650, baseSalary: 1650,
charismaEffectiveness: 25, charismaEffectiveness: 25,
charismaExpGain: 0.5, charismaExpGain: 0.5,
@ -75,6 +81,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software6]: { [JobName.software6]: {
nextPosition: JobName.software7, // Chief Technology Officer nextPosition: JobName.software7, // Chief Technology Officer
field: JobField.software,
baseSalary: 2310, baseSalary: 2310,
charismaEffectiveness: 30, charismaEffectiveness: 30,
charismaExpGain: 0.6, charismaExpGain: 0.6,
@ -87,6 +94,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.software7]: { [JobName.software7]: {
nextPosition: null, nextPosition: null,
field: JobField.software,
baseSalary: 2640, baseSalary: 2640,
charismaEffectiveness: 35, charismaEffectiveness: 35,
charismaExpGain: 1, charismaExpGain: 1,
@ -99,6 +107,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.IT0]: { [JobName.IT0]: {
nextPosition: JobName.IT1, // IT Analyst nextPosition: JobName.IT1, // IT Analyst
field: JobField.it,
baseSalary: 26, baseSalary: 26,
charismaEffectiveness: 10, charismaEffectiveness: 10,
charismaExpGain: 0.01, charismaExpGain: 0.01,
@ -109,6 +118,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.IT1]: { [JobName.IT1]: {
nextPosition: JobName.IT2, // IT Manager nextPosition: JobName.IT2, // IT Manager
field: JobField.it,
baseSalary: 66, baseSalary: 66,
charismaEffectiveness: 15, charismaEffectiveness: 15,
charismaExpGain: 0.02, charismaExpGain: 0.02,
@ -120,6 +130,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.IT2]: { [JobName.IT2]: {
nextPosition: JobName.IT3, // Systems Administrator nextPosition: JobName.IT3, // Systems Administrator
field: JobField.it,
baseSalary: 132, baseSalary: 132,
charismaEffectiveness: 20, charismaEffectiveness: 20,
charismaExpGain: 0.1, charismaExpGain: 0.1,
@ -132,6 +143,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.IT3]: { [JobName.IT3]: {
nextPosition: JobName.software5, // Head of Engineering nextPosition: JobName.software5, // Head of Engineering
field: JobField.it,
baseSalary: 410, baseSalary: 410,
charismaEffectiveness: 20, charismaEffectiveness: 20,
charismaExpGain: 0.2, charismaExpGain: 0.2,
@ -144,6 +156,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.securityEng]: { [JobName.securityEng]: {
nextPosition: JobName.software5, // Head of Engineering nextPosition: JobName.software5, // Head of Engineering
field: JobField.securityEngineer,
baseSalary: 121, baseSalary: 121,
charismaEffectiveness: 15, charismaEffectiveness: 15,
charismaExpGain: 0.05, charismaExpGain: 0.05,
@ -156,6 +169,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.networkEng0]: { [JobName.networkEng0]: {
nextPosition: JobName.networkEng1, // Network Administrator nextPosition: JobName.networkEng1, // Network Administrator
field: JobField.networkEngineer,
baseSalary: 121, baseSalary: 121,
charismaEffectiveness: 15, charismaEffectiveness: 15,
charismaExpGain: 0.05, charismaExpGain: 0.05,
@ -168,6 +182,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.networkEng1]: { [JobName.networkEng1]: {
nextPosition: JobName.software5, // Head of Engineering nextPosition: JobName.software5, // Head of Engineering
field: JobField.networkEngineer,
baseSalary: 410, baseSalary: 410,
charismaEffectiveness: 20, charismaEffectiveness: 20,
charismaExpGain: 0.1, charismaExpGain: 0.1,
@ -180,6 +195,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business0]: { [JobName.business0]: {
nextPosition: JobName.business1, // Business Analyst nextPosition: JobName.business1, // Business Analyst
field: JobField.business,
baseSalary: 46, baseSalary: 46,
charismaEffectiveness: 90, charismaEffectiveness: 90,
charismaExpGain: 0.08, charismaExpGain: 0.08,
@ -191,6 +207,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business1]: { [JobName.business1]: {
nextPosition: JobName.business2, // Business Manager nextPosition: JobName.business2, // Business Manager
field: JobField.business,
baseSalary: 100, baseSalary: 100,
charismaEffectiveness: 85, charismaEffectiveness: 85,
charismaExpGain: 0.15, charismaExpGain: 0.15,
@ -203,6 +220,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business2]: { [JobName.business2]: {
nextPosition: JobName.business3, // Operations Manager nextPosition: JobName.business3, // Operations Manager
field: JobField.business,
baseSalary: 200, baseSalary: 200,
charismaEffectiveness: 85, charismaEffectiveness: 85,
charismaExpGain: 0.3, charismaExpGain: 0.3,
@ -215,6 +233,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business3]: { [JobName.business3]: {
nextPosition: JobName.business4, // Chief Financial Officer nextPosition: JobName.business4, // Chief Financial Officer
field: JobField.business,
baseSalary: 660, baseSalary: 660,
charismaEffectiveness: 85, charismaEffectiveness: 85,
charismaExpGain: 0.4, charismaExpGain: 0.4,
@ -227,6 +246,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business4]: { [JobName.business4]: {
nextPosition: JobName.business5, // Chief Executive Officer nextPosition: JobName.business5, // Chief Executive Officer
field: JobField.business,
baseSalary: 1950, baseSalary: 1950,
charismaEffectiveness: 90, charismaEffectiveness: 90,
charismaExpGain: 1, charismaExpGain: 1,
@ -239,6 +259,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.business5]: { [JobName.business5]: {
nextPosition: null, nextPosition: null,
field: JobField.business,
baseSalary: 3900, baseSalary: 3900,
charismaEffectiveness: 90, charismaEffectiveness: 90,
charismaExpGain: 1.5, charismaExpGain: 1.5,
@ -251,6 +272,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.security0]: { [JobName.security0]: {
nextPosition: JobName.security1, // Security Officer nextPosition: JobName.security1, // Security Officer
field: JobField.security,
baseSalary: 50, baseSalary: 50,
hackingEffectiveness: 5, hackingEffectiveness: 5,
strengthEffectiveness: 20, strengthEffectiveness: 20,
@ -273,6 +295,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.security1]: { [JobName.security1]: {
nextPosition: JobName.security2, // Security Supervisor nextPosition: JobName.security2, // Security Supervisor
field: JobField.security,
baseSalary: 195, baseSalary: 195,
hackingEffectiveness: 10, hackingEffectiveness: 10,
strengthEffectiveness: 20, strengthEffectiveness: 20,
@ -297,6 +320,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.security2]: { [JobName.security2]: {
nextPosition: JobName.security3, // Head of Security nextPosition: JobName.security3, // Head of Security
field: JobField.security,
baseSalary: 660, baseSalary: 660,
hackingEffectiveness: 10, hackingEffectiveness: 10,
strengthEffectiveness: 15, strengthEffectiveness: 15,
@ -321,6 +345,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.security3]: { [JobName.security3]: {
nextPosition: null, nextPosition: null,
field: JobField.security,
baseSalary: 1320, baseSalary: 1320,
hackingEffectiveness: 10, hackingEffectiveness: 10,
strengthEffectiveness: 15, strengthEffectiveness: 15,
@ -345,6 +370,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.agent0]: { [JobName.agent0]: {
nextPosition: JobName.agent1, // Secret Agent nextPosition: JobName.agent1, // Secret Agent
field: JobField.agent,
baseSalary: 330, baseSalary: 330,
hackingEffectiveness: 10, hackingEffectiveness: 10,
strengthEffectiveness: 15, strengthEffectiveness: 15,
@ -369,6 +395,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.agent1]: { [JobName.agent1]: {
nextPosition: JobName.agent2, // Special Operative nextPosition: JobName.agent2, // Special Operative
field: JobField.agent,
baseSalary: 990, baseSalary: 990,
hackingEffectiveness: 15, hackingEffectiveness: 15,
strengthEffectiveness: 15, strengthEffectiveness: 15,
@ -393,6 +420,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.agent2]: { [JobName.agent2]: {
nextPosition: null, nextPosition: null,
field: JobField.agent,
baseSalary: 2000, baseSalary: 2000,
hackingEffectiveness: 15, hackingEffectiveness: 15,
strengthEffectiveness: 15, strengthEffectiveness: 15,
@ -417,6 +445,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.waiter]: { [JobName.waiter]: {
nextPosition: null, nextPosition: null,
field: JobField.waiter,
baseSalary: 22, baseSalary: 22,
strengthEffectiveness: 10, strengthEffectiveness: 10,
dexterityEffectiveness: 10, dexterityEffectiveness: 10,
@ -431,6 +460,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.employee]: { [JobName.employee]: {
nextPosition: null, nextPosition: null,
field: JobField.employee,
baseSalary: 22, baseSalary: 22,
strengthEffectiveness: 10, strengthEffectiveness: 10,
dexterityEffectiveness: 10, dexterityEffectiveness: 10,
@ -445,6 +475,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.softwareConsult0]: { [JobName.softwareConsult0]: {
nextPosition: JobName.softwareConsult1, // Senior Software Consultant nextPosition: JobName.softwareConsult1, // Senior Software Consultant
field: JobField.softwareConsultant,
baseSalary: 66, baseSalary: 66,
hackingEffectiveness: 80, hackingEffectiveness: 80,
charismaEffectiveness: 20, charismaEffectiveness: 20,
@ -455,6 +486,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.softwareConsult1]: { [JobName.softwareConsult1]: {
nextPosition: null, nextPosition: null,
field: JobField.softwareConsultant,
baseSalary: 132, baseSalary: 132,
hackingEffectiveness: 75, hackingEffectiveness: 75,
charismaEffectiveness: 25, charismaEffectiveness: 25,
@ -466,6 +498,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.businessConsult0]: { [JobName.businessConsult0]: {
nextPosition: JobName.businessConsult1, // Senior Business Consultant nextPosition: JobName.businessConsult1, // Senior Business Consultant
field: JobField.businessConsultant,
baseSalary: 66, baseSalary: 66,
hackingEffectiveness: 20, hackingEffectiveness: 20,
charismaEffectiveness: 80, charismaEffectiveness: 80,
@ -477,6 +510,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.businessConsult1]: { [JobName.businessConsult1]: {
nextPosition: null, nextPosition: null,
field: JobField.businessConsultant,
baseSalary: 525, baseSalary: 525,
hackingEffectiveness: 15, hackingEffectiveness: 15,
charismaEffectiveness: 85, charismaEffectiveness: 85,
@ -488,6 +522,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.waiterPT]: { [JobName.waiterPT]: {
nextPosition: null, nextPosition: null,
field: JobField.partTimeWaiter,
baseSalary: 20, baseSalary: 20,
strengthEffectiveness: 10, strengthEffectiveness: 10,
dexterityEffectiveness: 10, dexterityEffectiveness: 10,
@ -502,6 +537,7 @@ export function getCompanyPositionMetadata(): Record<JobName, CompanyPositionCto
}, },
[JobName.employeePT]: { [JobName.employeePT]: {
nextPosition: null, nextPosition: null,
field: JobField.partTimeEmployee,
baseSalary: 20, baseSalary: 20,
strengthEffectiveness: 10, strengthEffectiveness: 10,
dexterityEffectiveness: 10, dexterityEffectiveness: 10,

@ -12,7 +12,7 @@ import Box from "@mui/material/Box";
import { ApplyToJobButton } from "./ApplyToJobButton"; import { ApplyToJobButton } from "./ApplyToJobButton";
import { Locations } from "../Locations"; import { Locations } from "../Locations";
import { CompanyName, JobName } from "@enums"; import { CompanyName, JobName, JobField } from "@enums";
import { Companies } from "../../Company/Companies"; import { Companies } from "../../Company/Companies";
import { CompanyPositions } from "../../Company/CompanyPositions"; import { CompanyPositions } from "../../Company/CompanyPositions";
@ -238,7 +238,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.agent0]} entryPosType={CompanyPositions[JobName.agent0]}
onClick={applyForAgentJob} onClick={applyForAgentJob}
text={"Apply for Agent Job"} text={"Apply for " + JobField.agent + " Job"}
/> />
)} )}
{company.hasBusinessConsultantPositions() && ( {company.hasBusinessConsultantPositions() && (
@ -246,7 +246,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.businessConsult0]} entryPosType={CompanyPositions[JobName.businessConsult0]}
onClick={applyForBusinessConsultantJob} onClick={applyForBusinessConsultantJob}
text={"Apply for Business Consultant Job"} text={"Apply for " + JobField.businessConsultant + " Job"}
/> />
)} )}
{company.hasBusinessPositions() && ( {company.hasBusinessPositions() && (
@ -254,7 +254,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.business0]} entryPosType={CompanyPositions[JobName.business0]}
onClick={applyForBusinessJob} onClick={applyForBusinessJob}
text={"Apply for Business Job"} text={"Apply for " + JobField.business + " Job"}
/> />
)} )}
{company.hasEmployeePositions() && ( {company.hasEmployeePositions() && (
@ -262,7 +262,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.employee]} entryPosType={CompanyPositions[JobName.employee]}
onClick={applyForEmployeeJob} onClick={applyForEmployeeJob}
text={"Apply to be an Employee"} text={"Apply to be an " + JobField.employee}
/> />
)} )}
{company.hasEmployeePositions() && ( {company.hasEmployeePositions() && (
@ -270,7 +270,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.employeePT]} entryPosType={CompanyPositions[JobName.employeePT]}
onClick={applyForPartTimeEmployeeJob} onClick={applyForPartTimeEmployeeJob}
text={"Apply to be a part-time Employee"} text={"Apply to be a " + JobField.partTimeEmployee}
/> />
)} )}
{company.hasITPositions() && ( {company.hasITPositions() && (
@ -278,7 +278,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.IT0]} entryPosType={CompanyPositions[JobName.IT0]}
onClick={applyForItJob} onClick={applyForItJob}
text={"Apply for IT Job"} text={"Apply for " + JobField.it + " Job"}
/> />
)} )}
{company.hasSecurityPositions() && ( {company.hasSecurityPositions() && (
@ -286,7 +286,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.security0]} entryPosType={CompanyPositions[JobName.security0]}
onClick={applyForSecurityJob} onClick={applyForSecurityJob}
text={"Apply for Security Job"} text={"Apply for " + JobField.security + " Job"}
/> />
)} )}
{company.hasSoftwareConsultantPositions() && ( {company.hasSoftwareConsultantPositions() && (
@ -294,7 +294,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.softwareConsult0]} entryPosType={CompanyPositions[JobName.softwareConsult0]}
onClick={applyForSoftwareConsultantJob} onClick={applyForSoftwareConsultantJob}
text={"Apply for Software Consultant Job"} text={"Apply for " + JobField.softwareConsultant + " Job"}
/> />
)} )}
{company.hasSoftwarePositions() && ( {company.hasSoftwarePositions() && (
@ -302,7 +302,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.software0]} entryPosType={CompanyPositions[JobName.software0]}
onClick={applyForSoftwareJob} onClick={applyForSoftwareJob}
text={"Apply for Software Job"} text={"Apply for " + JobField.software + " Job"}
/> />
)} )}
{company.hasWaiterPositions() && ( {company.hasWaiterPositions() && (
@ -310,7 +310,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.waiter]} entryPosType={CompanyPositions[JobName.waiter]}
onClick={applyForWaiterJob} onClick={applyForWaiterJob}
text={"Apply to be a Waiter"} text={"Apply to be a " + JobField.waiter}
/> />
)} )}
{company.hasWaiterPositions() && ( {company.hasWaiterPositions() && (
@ -318,7 +318,7 @@ export function CompanyLocation(props: IProps): React.ReactElement {
company={company} company={company}
entryPosType={CompanyPositions[JobName.waiterPT]} entryPosType={CompanyPositions[JobName.waiterPT]}
onClick={applyForPartTimeWaiterJob} onClick={applyForPartTimeWaiterJob}
text={"Apply to be a part-time Waiter"} text={"Apply to be a " + JobField.partTimeWaiter}
/> />
)} )}
{location.infiltrationData != null && <Button onClick={startInfiltration}>Infiltrate Company</Button>} {location.infiltrationData != null && <Button onClick={startInfiltration}>Infiltrate Company</Button>}

@ -20,6 +20,7 @@ import {
FactionWorkType, FactionWorkType,
GymType, GymType,
JobName, JobName,
JobField,
LiteratureName, LiteratureName,
LocationName, LocationName,
ToastVariant, ToastVariant,
@ -109,6 +110,7 @@ export const enums: NSEnums = {
FactionWorkType, FactionWorkType,
GymType, GymType,
JobName, JobName,
JobField,
LocationName, LocationName,
ToastVariant, ToastVariant,
UniversityClassType, UniversityClassType,

@ -8,6 +8,7 @@ import {
FactionName, FactionName,
FactionWorkType, FactionWorkType,
GymType, GymType,
JobField,
LocationName, LocationName,
UniversityClassType, UniversityClassType,
} from "@enums"; } from "@enums";
@ -31,7 +32,7 @@ import { formatMoney, formatRam, formatReputation } from "../ui/formatNumber";
import { currentNodeMults } from "../BitNode/BitNodeMultipliers"; import { currentNodeMults } from "../BitNode/BitNodeMultipliers";
import { Companies } from "../Company/Companies"; import { Companies } from "../Company/Companies";
import { Factions } from "../Faction/Factions"; import { Factions } from "../Faction/Factions";
import { helpers } from "../Netscript/NetscriptHelpers"; import { helpers, assertString } from "../Netscript/NetscriptHelpers";
import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions"; import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions";
import { getServerOnNetwork } from "../Server/ServerHelpers"; import { getServerOnNetwork } from "../Server/ServerHelpers";
import { Terminal } from "../Terminal"; import { Terminal } from "../Terminal";
@ -687,6 +688,7 @@ export function NetscriptSingularity(): InternalAPI<ISingularity> {
const job = CompanyPositions[positionName]; const job = CompanyPositions[positionName];
const res = { const res = {
name: CompanyPositions[positionName].name, name: CompanyPositions[positionName].name,
field: CompanyPositions[positionName].field,
nextPosition: CompanyPositions[positionName].nextPosition, nextPosition: CompanyPositions[positionName].nextPosition,
salary: CompanyPositions[positionName].baseSalary * company.salaryMultiplier, salary: CompanyPositions[positionName].baseSalary * company.salaryMultiplier,
requiredReputation: CompanyPositions[positionName].requiredReputation, requiredReputation: CompanyPositions[positionName].requiredReputation,
@ -736,48 +738,63 @@ export function NetscriptSingularity(): InternalAPI<ISingularity> {
applyToCompany: (ctx) => (_companyName, _field) => { applyToCompany: (ctx) => (_companyName, _field) => {
helpers.checkSingularityAccess(ctx); helpers.checkSingularityAccess(ctx);
const companyName = getEnumHelper("CompanyName").nsGetMember(ctx, _companyName); const companyName = getEnumHelper("CompanyName").nsGetMember(ctx, _companyName);
const field = helpers.string(ctx, "field", _field); assertString(ctx, "field", _field);
// capitalize each word, except for "part-time"
function capitalizeJobField(field: string) {
return field
.toLowerCase()
.split(" ")
.map((s) => {
if (s.length == 0 || s == "part-time") return s;
if (s.length == 2) return s.toUpperCase(); // Probably an acronym
return s[0].toUpperCase() + s.slice(1);
})
.join(" ");
}
const field = getEnumHelper("JobField").nsGetMember(ctx, capitalizeJobField(_field as string), "field");
Player.location = companyNameAsLocationName(companyName); Player.location = companyNameAsLocationName(companyName);
let res; let res;
switch (field.toLowerCase()) { switch (field) {
case "software": case JobField.software:
res = Player.applyForSoftwareJob(true); res = Player.applyForSoftwareJob(true);
break; break;
case "software consultant": case JobField.softwareConsultant:
res = Player.applyForSoftwareConsultantJob(true); res = Player.applyForSoftwareConsultantJob(true);
break; break;
case "it": case JobField.it:
res = Player.applyForItJob(true); res = Player.applyForItJob(true);
break; break;
case "security engineer": case JobField.securityEngineer:
res = Player.applyForSecurityEngineerJob(true); res = Player.applyForSecurityEngineerJob(true);
break; break;
case "network engineer": case JobField.networkEngineer:
res = Player.applyForNetworkEngineerJob(true); res = Player.applyForNetworkEngineerJob(true);
break; break;
case "business": case JobField.business:
res = Player.applyForBusinessJob(true); res = Player.applyForBusinessJob(true);
break; break;
case "business consultant": case JobField.businessConsultant:
res = Player.applyForBusinessConsultantJob(true); res = Player.applyForBusinessConsultantJob(true);
break; break;
case "security": case JobField.security:
res = Player.applyForSecurityJob(true); res = Player.applyForSecurityJob(true);
break; break;
case "agent": case JobField.agent:
res = Player.applyForAgentJob(true); res = Player.applyForAgentJob(true);
break; break;
case "employee": case JobField.employee:
res = Player.applyForEmployeeJob(true); res = Player.applyForEmployeeJob(true);
break; break;
case "part-time employee": case JobField.partTimeEmployee:
res = Player.applyForPartTimeEmployeeJob(true); res = Player.applyForPartTimeEmployeeJob(true);
break; break;
case "waiter": case JobField.waiter:
res = Player.applyForWaiterJob(true); res = Player.applyForWaiterJob(true);
break; break;
case "part-time waiter": case JobField.partTimeWaiter:
res = Player.applyForPartTimeWaiterJob(true); res = Player.applyForPartTimeWaiterJob(true);
break; break;
default: default:

@ -1856,7 +1856,7 @@ export interface Singularity {
* @param field - Field to which you want to apply. * @param field - Field to which you want to apply.
* @returns True if the player successfully get a job/promotion, and false otherwise. * @returns True if the player successfully get a job/promotion, and false otherwise.
*/ */
applyToCompany(companyName: CompanyName | `${CompanyName}`, field: string): boolean; applyToCompany(companyName: CompanyName | `${CompanyName}`, field: JobField | `${JobField}`): boolean;
/** /**
* Get company reputation. * Get company reputation.
@ -2423,6 +2423,7 @@ export interface Singularity {
*/ */
export interface CompanyPositionInfo { export interface CompanyPositionInfo {
name: JobName; name: JobName;
field: JobField;
nextPosition: JobName | null; nextPosition: JobName | null;
salary: number; salary: number;
requiredReputation: number; requiredReputation: number;
@ -6860,6 +6861,23 @@ declare enum JobName {
employeePT = "Part-time Employee", employeePT = "Part-time Employee",
} }
/** @public */
declare enum JobField {
software = "Software",
softwareConsultant = "Software Consultant",
it = "IT",
securityEngineer = "Security Engineer",
networkEngineer = "Network Engineer",
business = "Business",
businessConsultant = "Business Consultant",
security = "Security",
agent = "Agent",
employee = "Employee",
partTimeEmployee = "part-time Employee",
waiter = "Waiter",
partTimeWaiter = "part-time Waiter",
}
// CORP ENUMS - Changed to types // CORP ENUMS - Changed to types
/** @public */ /** @public */
type CorpEmployeePosition = type CorpEmployeePosition =
@ -7021,6 +7039,7 @@ export type NSEnums = {
FactionWorkType: typeof FactionWorkType; FactionWorkType: typeof FactionWorkType;
GymType: typeof GymType; GymType: typeof GymType;
JobName: typeof JobName; JobName: typeof JobName;
JobField: typeof JobField;
LocationName: typeof LocationName; LocationName: typeof LocationName;
ToastVariant: typeof ToastVariant; ToastVariant: typeof ToastVariant;
UniversityClassType: typeof UniversityClassType; UniversityClassType: typeof UniversityClassType;

@ -63,3 +63,19 @@ export enum JobName {
businessConsult0 = "Business Consultant", businessConsult0 = "Business Consultant",
businessConsult1 = "Senior Business Consultant", businessConsult1 = "Senior Business Consultant",
} }
export enum JobField {
software = "Software",
softwareConsultant = "Software Consultant",
it = "IT",
securityEngineer = "Security Engineer",
networkEngineer = "Network Engineer",
business = "Business",
businessConsultant = "Business Consultant",
security = "Security",
agent = "Agent",
employee = "Employee",
partTimeEmployee = "part-time Employee",
waiter = "Waiter",
partTimeWaiter = "part-time Waiter",
}

@ -0,0 +1,101 @@
import { Player, setPlayer } from "../../../src/Player";
import { getCompaniesMetadata } from "../../../src/Company/data/CompaniesMetadata";
import { getCompanyPositionMetadata } from "../../../src/Company/data/CompanyPositionsMetadata";
import { PlayerObject } from "../../../src/PersonObjects/Player/PlayerObject";
import { NetscriptSingularity } from "../../../src/NetscriptFunctions/Singularity";
import { CompanyName, JobField, JobName } from "@enums";
import { WorkerScript } from "../../../src/Netscript/WorkerScript";
import { Script } from "../../../src/Script/Script";
import { RunningScript } from "../../../src/Script/RunningScript";
import { ScriptFilePath } from "../../../src/Paths/ScriptFilePath";
import { GetServer } from "../../../src/Server/AllServers";
describe("Singularity", () => {
let ctx;
let singularity;
let positionMetadata;
let companyMetadata;
beforeAll(() => {
singularity = NetscriptSingularity();
positionMetadata = getCompanyPositionMetadata();
companyMetadata = getCompaniesMetadata();
});
beforeEach(() => {
setPlayer(new PlayerObject());
Player.init();
Player.sourceFiles.set(4, 3);
GetServer("home").writeToScriptFile("function.js", "");
let script = new Script("function.js", "", "home");
let runningScript = new RunningScript(script, 1, []);
let workerScript = new WorkerScript(runningScript, 1);
ctx = { workerScript: workerScript, function: "singularityTest", functionPath: "test.singularityTest" };
});
afterEach(() => {
Object.values(CompanyName).forEach((k) => {
companyMetadata[k].playerReputation = 0;
});
});
describe("getCompanyPositionInfo", () => {
it("returns an enum for field", () => {
let companyWithPositions = Object.values(CompanyName).find(
(cn) => companyMetadata[cn].companyPositions.length > 0,
);
let company = companyMetadata[companyWithPositions];
let positionName = company.companyPositions[0];
let position = positionMetadata[positionName];
let companyPosition = singularity.getCompanyPositionInfo(ctx)(company.name, positionName);
expect(companyPosition.field).toEqual(position.field);
});
});
describe("applyToCompany", () => {
it("throws an error if input doesn't match an enum", () => {
let anyValidCompany = Object.values(CompanyName)[0];
expect(() => singularity.applyToCompany(ctx)(anyValidCompany, "sockware")).toThrow("should be a JobField");
expect(() => singularity.applyToCompany(ctx)(anyValidCompany, "invalid-job-field")).toThrow(
"should be a JobField",
);
});
it("accepts the JobField specified by getCompanyPositionInfo", () => {
Object.values(CompanyName).forEach((cn) => {
companyMetadata[cn].companyPositions.forEach((pn) => {
let pos = positionMetadata[pn];
expect(() => singularity.applyToCompany(ctx)(cn, pos.field)).not.toThrow();
Player.quitJob(cn);
});
});
});
it("is case-insensitive to string inputs to the field parameter", () => {
Object.values(CompanyName).forEach((cn) => {
companyMetadata[cn].companyPositions.forEach((pn) => {
let pos = positionMetadata[pn];
let field = pos.field;
let upperCase = field.toUpperCase();
expect(() => singularity.applyToCompany(ctx)(cn, upperCase)).not.toThrow();
Player.quitJob(cn);
let lowerCase = field.toLowerCase();
expect(() => singularity.applyToCompany(ctx)(cn, lowerCase)).not.toThrow();
Player.quitJob(cn);
let brokenCasing = field
.split("")
.map((c, i) => (i % 2 == 0 ? c.toUpperCase() : c.toLowerCase()))
.join("");
expect(() => singularity.applyToCompany(ctx)(cn, brokenCasing)).not.toThrow();
Player.quitJob(cn);
});
});
});
});
});