API: Programming-friendly interface to getFactionInviteRequirements (#953)

This commit is contained in:
Jesse Clark 2023-12-16 01:27:22 -08:00 committed by GitHub
parent e957864c4b
commit 473217ef31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
79 changed files with 1626 additions and 140 deletions

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [BackdoorRequirement](./bitburner.backdoorrequirement.md)
## BackdoorRequirement interface
Player must have installed a backdoor on this server.
**Signature:**
```typescript
interface BackdoorRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [server](./bitburner.backdoorrequirement.server.md) | | string | |
| [type](./bitburner.backdoorrequirement.type.md) | | "backdoorInstalled" | |

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

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [BitNodeRequirement](./bitburner.bitnoderequirement.md)
## BitNodeRequirement interface
Player must be located in this BitNode.
**Signature:**
```typescript
interface BitNodeRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [bitNodeN](./bitburner.bitnoderequirement.bitnoden.md) | | number | |
| [type](./bitburner.bitnoderequirement.type.md) | | "bitNodeN" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [BladeburnerRankRequirement](./bitburner.bladeburnerrankrequirement.md)
## BladeburnerRankRequirement interface
Player must have at least this rank in the Bladeburner Division.
**Signature:**
```typescript
interface BladeburnerRankRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [bladeburnerRank](./bitburner.bladeburnerrankrequirement.bladeburnerrank.md) | | number | |
| [type](./bitburner.bladeburnerrankrequirement.type.md) | | "bladeburnerRank" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [CityRequirement](./bitburner.cityrequirement.md)
## CityRequirement interface
Player must be located in this city.
**Signature:**
```typescript
interface CityRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [city](./bitburner.cityrequirement.city.md) | | [CityName](./bitburner.cityname.md) | |
| [type](./bitburner.cityrequirement.type.md) | | "city" | |

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

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

@ -0,0 +1,22 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [CompanyReputationRequirement](./bitburner.companyreputationrequirement.md)
## CompanyReputationRequirement interface
Player must have at least this much reputation with this company.
**Signature:**
```typescript
interface CompanyReputationRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [company](./bitburner.companyreputationrequirement.company.md) | | [CompanyName](./bitburner.companyname.md) | |
| [reputation](./bitburner.companyreputationrequirement.reputation.md) | | number | |
| [type](./bitburner.companyreputationrequirement.type.md) | | "companyReputation" | |

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

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [EmployedByRequirement](./bitburner.employedbyrequirement.md)
## EmployedByRequirement interface
Player must be working for this company.
**Signature:**
```typescript
interface EmployedByRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [company](./bitburner.employedbyrequirement.company.md) | | [CompanyName](./bitburner.companyname.md) | |
| [type](./bitburner.employedbyrequirement.type.md) | | "employedBy" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [EveryRequirement](./bitburner.everyrequirement.md)
## EveryRequirement interface
All sub-conditions must be satisfied.
**Signature:**
```typescript
interface EveryRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [conditions](./bitburner.everyrequirement.conditions.md) | | [PlayerRequirement](./bitburner.playerrequirement.md)<!-- -->\[\] | |
| [type](./bitburner.everyrequirement.type.md) | | "everyCondition" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [FileRequirement](./bitburner.filerequirement.md)
## FileRequirement interface
Player must have a specific Literature or Message file on their home computer.
**Signature:**
```typescript
interface FileRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [file](./bitburner.filerequirement.file.md) | | string | |
| [type](./bitburner.filerequirement.type.md) | | "file" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [HacknetCoresRequirement](./bitburner.hacknetcoresrequirement.md)
## HacknetCoresRequirement interface
Player's Hacknet devices must have at least this many total cores.
**Signature:**
```typescript
interface HacknetCoresRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [hacknetCores](./bitburner.hacknetcoresrequirement.hacknetcores.md) | | number | |
| [type](./bitburner.hacknetcoresrequirement.type.md) | | "hacknetCores" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [HacknetLevelsRequirement](./bitburner.hacknetlevelsrequirement.md)
## HacknetLevelsRequirement interface
Player's Hacknet devices must have at least this many total levels.
**Signature:**
```typescript
interface HacknetLevelsRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [hacknetLevels](./bitburner.hacknetlevelsrequirement.hacknetlevels.md) | | number | |
| [type](./bitburner.hacknetlevelsrequirement.type.md) | | "hacknetLevels" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [HacknetRAMRequirement](./bitburner.hacknetramrequirement.md)
## HacknetRAMRequirement interface
Player's Hacknet devices must have at least this much total RAM.
**Signature:**
```typescript
interface HacknetRAMRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [hacknetRAM](./bitburner.hacknetramrequirement.hacknetram.md) | | number | |
| [type](./bitburner.hacknetramrequirement.type.md) | | "hacknetRAM" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [JobTitleRequirement](./bitburner.jobtitlerequirement.md)
## JobTitleRequirement interface
Player must have this job title at some company.
**Signature:**
```typescript
interface JobTitleRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [jobTitle](./bitburner.jobtitlerequirement.jobtitle.md) | | [JobName](./bitburner.jobname.md) | |
| [type](./bitburner.jobtitlerequirement.type.md) | | "jobTitle" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [KarmaRequiremennt](./bitburner.karmarequiremennt.md)
## KarmaRequiremennt interface
Player must have less than this much karma.
**Signature:**
```typescript
interface KarmaRequiremennt
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [karma](./bitburner.karmarequiremennt.karma.md) | | number | |
| [type](./bitburner.karmarequiremennt.type.md) | | "karma" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [LocationRequirement](./bitburner.locationrequirement.md)
## LocationRequirement interface
Player must be at this location within a city.
**Signature:**
```typescript
interface LocationRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [location](./bitburner.locationrequirement.location.md) | | [LocationName](./bitburner.locationname.md) | |
| [type](./bitburner.locationrequirement.type.md) | | "location" | |

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

@ -28,12 +28,17 @@
| [ActiveFragment](./bitburner.activefragment.md) | |
| [AugmentPair](./bitburner.augmentpair.md) | Return value of [getSleevePurchasableAugs](./bitburner.sleeve.getsleevepurchasableaugs.md) |
| [AutocompleteData](./bitburner.autocompletedata.md) | Used for autocompletion |
| [BackdoorRequirement](./bitburner.backdoorrequirement.md) | Player must have installed a backdoor on this server. |
| [BasicHGWOptions](./bitburner.basichgwoptions.md) | Options to affect the behavior of [hack](./bitburner.ns.hack.md)<!-- -->, [grow](./bitburner.ns.grow.md)<!-- -->, and [weaken](./bitburner.ns.weaken.md)<!-- -->. |
| [BitNodeMultipliers](./bitburner.bitnodemultipliers.md) | All multipliers affecting the difficulty of the current challenge. |
| [BitNodeRequirement](./bitburner.bitnoderequirement.md) | Player must be located in this BitNode. |
| [Bladeburner](./bitburner.bladeburner.md) | Bladeburner API |
| [BladeburnerCurAction](./bitburner.bladeburnercuraction.md) | Bladeburner current action. |
| [BladeburnerRankRequirement](./bitburner.bladeburnerrankrequirement.md) | Player must have at least this rank in the Bladeburner Division. |
| [CityRequirement](./bitburner.cityrequirement.md) | Player must be located in this city. |
| [CodingContract](./bitburner.codingcontract.md) | Coding Contract API |
| [CompanyPositionInfo](./bitburner.companypositioninfo.md) | Company position requirements and salary. |
| [CompanyReputationRequirement](./bitburner.companyreputationrequirement.md) | Player must have at least this much reputation with this company. |
| [CorpConstants](./bitburner.corpconstants.md) | Corporation related constants |
| [CorpIndustryData](./bitburner.corpindustrydata.md) | Data for an individual industry |
| [CorpMaterialConstantData](./bitburner.corpmaterialconstantdata.md) | Corporation material information |
@ -42,8 +47,11 @@
| [CorpProductData](./bitburner.corpproductdata.md) | Product rating information |
| [CrimeStats](./bitburner.crimestats.md) | Data representing the internal values of a crime. |
| [Division](./bitburner.division.md) | Corporation division |
| [EmployedByRequirement](./bitburner.employedbyrequirement.md) | Player must be working for this company. |
| [EquipmentStats](./bitburner.equipmentstats.md) | Object representing data representing a gang member equipment. |
| [EveryRequirement](./bitburner.everyrequirement.md) | All sub-conditions must be satisfied. |
| [Export](./bitburner.export.md) | Export order for a material |
| [FileRequirement](./bitburner.filerequirement.md) | Player must have a specific Literature or Message file on their home computer. |
| [Formulas](./bitburner.formulas.md) | Formulas API |
| [Fragment](./bitburner.fragment.md) | |
| [GameInfo](./bitburner.gameinfo.md) | Game Information |
@ -60,9 +68,12 @@
| [HackingFormulas](./bitburner.hackingformulas.md) | Hacking formulas |
| [HackingMultipliers](./bitburner.hackingmultipliers.md) | Hack related multipliers. |
| [Hacknet](./bitburner.hacknet.md) | Hacknet API |
| [HacknetCoresRequirement](./bitburner.hacknetcoresrequirement.md) | Player's Hacknet devices must have at least this many total cores. |
| [HacknetLevelsRequirement](./bitburner.hacknetlevelsrequirement.md) | Player's Hacknet devices must have at least this many total levels. |
| [HacknetMultipliers](./bitburner.hacknetmultipliers.md) | Hacknet related multipliers. |
| [HacknetNodeConstants](./bitburner.hacknetnodeconstants.md) | Hacknet node related constants |
| [HacknetNodesFormulas](./bitburner.hacknetnodesformulas.md) | Hacknet Node formulas |
| [HacknetRAMRequirement](./bitburner.hacknetramrequirement.md) | Player's Hacknet devices must have at least this much total RAM. |
| [HacknetServerConstants](./bitburner.hacknetserverconstants.md) | Hacknet server related constants |
| [HacknetServersFormulas](./bitburner.hacknetserversformulas.md) | Hacknet Server formulas |
| [HP](./bitburner.hp.md) | |
@ -73,15 +84,23 @@
| [InfiltrationReward](./bitburner.infiltrationreward.md) | |
| [InvestmentOffer](./bitburner.investmentoffer.md) | Corporation investment offer |
| [IStyleSettings](./bitburner.istylesettings.md) | Interface Styles |
| [JobTitleRequirement](./bitburner.jobtitlerequirement.md) | Player must have this job title at some company. |
| [KarmaRequiremennt](./bitburner.karmarequiremennt.md) | Player must have less than this much karma. |
| [LocationRequirement](./bitburner.locationrequirement.md) | Player must be at this location within a city. |
| [Material](./bitburner.material.md) | Material in a warehouse |
| [MoneyRequirement](./bitburner.moneyrequirement.md) | Player must have at least this much money. |
| [MoneySource](./bitburner.moneysource.md) | |
| [MoneySources](./bitburner.moneysources.md) | |
| [Multipliers](./bitburner.multipliers.md) | |
| [NetscriptPort](./bitburner.netscriptport.md) | Object representing a port. A port is a serialized queue. |
| [NodeStats](./bitburner.nodestats.md) | Object representing all the values related to a hacknet node. |
| [NotRequirement](./bitburner.notrequirement.md) | The sub-condition must not be satisfied. |
| [NS](./bitburner.ns.md) | Collection of all functions passed to scripts |
| [NumAugmentationsRequirement](./bitburner.numaugmentationsrequirement.md) | Player must have at least this many augmentations installed (if positive). Player must have no augmentations installed (if zero). |
| [NumInfiltrationsRequirement](./bitburner.numinfiltrationsrequirement.md) | Player must have completed this many infiltrations. |
| [Office](./bitburner.office.md) | Office for a division in a city. |
| [OfficeAPI](./bitburner.officeapi.md) | Corporation Office API |
| [PeopleKilledRequirement](./bitburner.peoplekilledrequirement.md) | Player must have killed at least this many people. |
| [Person](./bitburner.person.md) | |
| [Player](./bitburner.player.md) | |
| [ProcessInfo](./bitburner.processinfo.md) | A single process on a server. |
@ -94,11 +113,14 @@
| [RunOptions](./bitburner.runoptions.md) | |
| [Server](./bitburner.server.md) | A server. Not all servers have all of these properties - optional properties are missing on certain servers. |
| [Singularity](./bitburner.singularity.md) | Singularity API |
| [SkillRequirement](./bitburner.skillrequirement.md) | Player must have each listed skill at least this level. |
| [Skills](./bitburner.skills.md) | |
| [SkillsFormulas](./bitburner.skillsformulas.md) | Skills formulas |
| [Sleeve](./bitburner.sleeve.md) | Sleeve API |
| [SleevePerson](./bitburner.sleeveperson.md) | |
| [SomeRequirement](./bitburner.somerequirement.md) | At least one sub-condition must be satisfied. |
| [SourceFileLvl](./bitburner.sourcefilelvl.md) | |
| [SourceFileRequirement](./bitburner.sourcefilerequirement.md) | Player must have this Source File. |
| [SpawnOptions](./bitburner.spawnoptions.md) | |
| [Stanek](./bitburner.stanek.md) | Stanek's Gift API. |
| [StockMarketConstants](./bitburner.stockmarketconstants.md) | Constants used for the stockmarket game mechanic. |
@ -128,6 +150,7 @@
| [CorpUpgradeName](./bitburner.corpupgradename.md) | |
| [FilenameOrPID](./bitburner.filenameorpid.md) | |
| [NSEnums](./bitburner.nsenums.md) | |
| [PlayerRequirement](./bitburner.playerrequirement.md) | Structured interface to requirements for joining a faction or company. For fields with numerical value &gt; 0, the player must have at least this value. For fields with numerical value &lt;<!-- -->= 0, the player must have at most this value. For "not", the sub-condition must be failed instead of passed. For "someCondition", at least one sub-condition must be passed. |
| [PortData](./bitburner.portdata.md) | |
| [ReactNode](./bitburner.reactnode.md) | <p>A stand-in for the real React.ReactNode. A [ReactElement](./bitburner.reactelement.md) is rendered dynamically with React. number and string are displayed directly. boolean, null, and undefined are ignored and not rendered. An array of ReactNodes will display all members of that array sequentially.</p><p>Use React.createElement to make the ReactElement type, see [creating an element without jsx](https://react.dev/reference/react/createElement#creating-an-element-without-jsx) from the official React documentation.</p> |
| [ScriptArg](./bitburner.scriptarg.md) | |

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [MoneyRequirement](./bitburner.moneyrequirement.md)
## MoneyRequirement interface
Player must have at least this much money.
**Signature:**
```typescript
interface MoneyRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [money](./bitburner.moneyrequirement.money.md) | | number | |
| [type](./bitburner.moneyrequirement.type.md) | | "money" | |

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

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [NotRequirement](./bitburner.notrequirement.md)
## NotRequirement interface
The sub-condition must not be satisfied.
**Signature:**
```typescript
interface NotRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [condition](./bitburner.notrequirement.condition.md) | | [PlayerRequirement](./bitburner.playerrequirement.md) | |
| [type](./bitburner.notrequirement.type.md) | | "not" | |

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [NumAugmentationsRequirement](./bitburner.numaugmentationsrequirement.md)
## NumAugmentationsRequirement interface
Player must have at least this many augmentations installed (if positive). Player must have no augmentations installed (if zero).
**Signature:**
```typescript
interface NumAugmentationsRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [numAugmentations](./bitburner.numaugmentationsrequirement.numaugmentations.md) | | number | |
| [type](./bitburner.numaugmentationsrequirement.type.md) | | "numAugmentations" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [NumInfiltrationsRequirement](./bitburner.numinfiltrationsrequirement.md)
## NumInfiltrationsRequirement interface
Player must have completed this many infiltrations.
**Signature:**
```typescript
interface NumInfiltrationsRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [numInfiltrations](./bitburner.numinfiltrationsrequirement.numinfiltrations.md) | | number | |
| [type](./bitburner.numinfiltrationsrequirement.type.md) | | "numInfiltrations" | |

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [PeopleKilledRequirement](./bitburner.peoplekilledrequirement.md)
## PeopleKilledRequirement interface
Player must have killed at least this many people.
**Signature:**
```typescript
interface PeopleKilledRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [numPeopleKilled](./bitburner.peoplekilledrequirement.numpeoplekilled.md) | | number | |
| [type](./bitburner.peoplekilledrequirement.type.md) | | "numPeopleKilled" | |

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

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

@ -0,0 +1,37 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [PlayerRequirement](./bitburner.playerrequirement.md)
## PlayerRequirement type
Structured interface to requirements for joining a faction or company. For fields with numerical value &gt; 0, the player must have at least this value. For fields with numerical value &lt;<!-- -->= 0, the player must have at most this value. For "not", the sub-condition must be failed instead of passed. For "someCondition", at least one sub-condition must be passed.
**Signature:**
```typescript
export type PlayerRequirement =
| MoneyRequirement
| SkillRequirement
| KarmaRequiremennt
| PeopleKilledRequirement
| FileRequirement
| NumAugmentationsRequirement
| EmployedByRequirement
| CompanyReputationRequirement
| JobTitleRequirement
| CityRequirement
| LocationRequirement
| BackdoorRequirement
| HacknetRAMRequirement
| HacknetCoresRequirement
| HacknetLevelsRequirement
| BitNodeRequirement
| SourceFileRequirement
| BladeburnerRankRequirement
| NumInfiltrationsRequirement
| NotRequirement
| SomeRequirement
| EveryRequirement;
```
**References:** [MoneyRequirement](./bitburner.moneyrequirement.md)<!-- -->, [SkillRequirement](./bitburner.skillrequirement.md)<!-- -->, [KarmaRequiremennt](./bitburner.karmarequiremennt.md)<!-- -->, [PeopleKilledRequirement](./bitburner.peoplekilledrequirement.md)<!-- -->, [FileRequirement](./bitburner.filerequirement.md)<!-- -->, [NumAugmentationsRequirement](./bitburner.numaugmentationsrequirement.md)<!-- -->, [EmployedByRequirement](./bitburner.employedbyrequirement.md)<!-- -->, [CompanyReputationRequirement](./bitburner.companyreputationrequirement.md)<!-- -->, [JobTitleRequirement](./bitburner.jobtitlerequirement.md)<!-- -->, [CityRequirement](./bitburner.cityrequirement.md)<!-- -->, [LocationRequirement](./bitburner.locationrequirement.md)<!-- -->, [BackdoorRequirement](./bitburner.backdoorrequirement.md)<!-- -->, [HacknetRAMRequirement](./bitburner.hacknetramrequirement.md)<!-- -->, [HacknetCoresRequirement](./bitburner.hacknetcoresrequirement.md)<!-- -->, [HacknetLevelsRequirement](./bitburner.hacknetlevelsrequirement.md)<!-- -->, [BitNodeRequirement](./bitburner.bitnoderequirement.md)<!-- -->, [SourceFileRequirement](./bitburner.sourcefilerequirement.md)<!-- -->, [BladeburnerRankRequirement](./bitburner.bladeburnerrankrequirement.md)<!-- -->, [NumInfiltrationsRequirement](./bitburner.numinfiltrationsrequirement.md)<!-- -->, [NotRequirement](./bitburner.notrequirement.md)<!-- -->, [SomeRequirement](./bitburner.somerequirement.md)<!-- -->, [EveryRequirement](./bitburner.everyrequirement.md)

@ -0,0 +1,56 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [Singularity](./bitburner.singularity.md) &gt; [getFactionInviteRequirements](./bitburner.singularity.getfactioninviterequirements.md)
## Singularity.getFactionInviteRequirements() method
List conditions for being invited to a faction.
**Signature:**
```typescript
getFactionInviteRequirements(faction: string): PlayerRequirement[];
```
## Parameters
| Parameter | Type | Description |
| --- | --- | --- |
| faction | string | Name of the faction |
**Returns:**
[PlayerRequirement](./bitburner.playerrequirement.md)<!-- -->\[\]
Array of PlayerRequirement objects which must all be fulfilled to receive an invitation.
## Remarks
RAM cost: 3 GB \* 16/4/1
## Example
```js
ns.singularity.getFactionInviteRequirements("The Syndicate")
[
{ "type": "someCondition", "conditions": [
{ "type": "city", "city": "Aevum" },
{ "type": "city", "city": "Sector-12" }
]
},
{ "type": "not", "condition": {
"type": "employedBy", "company": "Central Intelligence Agency"
}
},
{ "type": "not", "condition": {
"type": "employedBy", "company": "National Security Agency"
}
},
{ "type": "money", "money": 10000000 },
{ "type": "skills", "skills": { "hacking": 200 } },
{ "type": "skills", "skills": { "strength": 200, "defense": 200, "dexterity": 200, "agility": 200 } },
{ "type": "karma", "karma": -90 }
]
```

@ -50,6 +50,7 @@ This API requires Source-File 4 to use. The RAM cost of all these functions is m
| [getDarkwebPrograms()](./bitburner.singularity.getdarkwebprograms.md) | Get a list of programs offered on the dark web. |
| [getFactionFavor(faction)](./bitburner.singularity.getfactionfavor.md) | Get faction favor. |
| [getFactionFavorGain(faction)](./bitburner.singularity.getfactionfavorgain.md) | Get faction favor gain. |
| [getFactionInviteRequirements(faction)](./bitburner.singularity.getfactioninviterequirements.md) | List conditions for being invited to a faction. |
| [getFactionRep(faction)](./bitburner.singularity.getfactionrep.md) | Get faction reputation. |
| [getOwnedAugmentations(purchased)](./bitburner.singularity.getownedaugmentations.md) | Get a list of owned augmentation. |
| [getOwnedSourceFiles()](./bitburner.singularity.getownedsourcefiles.md) | Get a list of acquired Source-Files. |

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [SkillRequirement](./bitburner.skillrequirement.md)
## SkillRequirement interface
Player must have each listed skill at least this level.
**Signature:**
```typescript
interface SkillRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [skills](./bitburner.skillrequirement.skills.md) | | Partial&lt;[Skills](./bitburner.skills.md)<!-- -->&gt; | |
| [type](./bitburner.skillrequirement.type.md) | | "skills" | |

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

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

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [SomeRequirement](./bitburner.somerequirement.md)
## SomeRequirement interface
At least one sub-condition must be satisfied.
**Signature:**
```typescript
interface SomeRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [conditions](./bitburner.somerequirement.conditions.md) | | [PlayerRequirement](./bitburner.playerrequirement.md)<!-- -->\[\] | |
| [type](./bitburner.somerequirement.type.md) | | "someCondition" | |

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

@ -0,0 +1,21 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [SourceFileRequirement](./bitburner.sourcefilerequirement.md)
## SourceFileRequirement interface
Player must have this Source File.
**Signature:**
```typescript
interface SourceFileRequirement
```
## Properties
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [sourceFile](./bitburner.sourcefilerequirement.sourcefile.md) | | number | |
| [type](./bitburner.sourcefilerequirement.type.md) | | "sourceFile" | |

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

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

@ -1,16 +1,18 @@
import React from "react";
import { FactionName, CompanyName, CityName, LiteratureName, MessageFilename } from "@enums";
import { FactionName, CompanyName, CityName, LiteratureName, MessageFilename, LocationName } from "@enums";
import { currentNodeMults } from "../BitNode/BitNodeMultipliers";
import { Router } from "../ui/GameRoot";
import { Page } from "../ui/Router";
import { Option } from "./ui/Option";
import { Typography } from "@mui/material";
import {
JoinCondition,
PlayerCondition,
CompoundPlayerCondition,
haveBackdooredServer,
employedBy,
haveCompanyRep,
executiveEmployee,
notEmployee,
notEmployedBy,
haveAugmentations,
haveMoney,
haveSkill,
@ -18,13 +20,18 @@ import {
haveKarma,
haveKilledPeople,
locatedInCity,
locatedInSomeCity,
totalHacknetRam,
totalHacknetCores,
totalHacknetLevels,
haveBladeburnerRank,
haveSourceFile,
haveSomeSourceFile,
haveFile,
someCondition,
everyCondition,
delayedCondition,
unsatisfiable,
} from "./FactionJoinCondition";
import { SpecialServers } from "../Server/data/SpecialServers";
import { CONSTANTS } from "../Constants";
@ -34,8 +41,8 @@ import type { PlayerObject } from "../PersonObjects/Player/PlayerObject";
interface FactionInfoParams {
infoText?: JSX.Element;
rumorText?: JSX.Element;
inviteReqs?: JoinCondition[];
rumorReqs?: JoinCondition[];
inviteReqs?: PlayerCondition[];
rumorReqs?: PlayerCondition[];
enemies?: FactionName[];
offerHackingWork?: boolean;
offerFieldWork?: boolean;
@ -57,10 +64,10 @@ export class FactionInfo {
rumorText: JSX.Element;
/** Conditions for being automatically inivited to this facton. */
inviteReqs: JoinCondition[];
inviteReqs: CompoundPlayerCondition;
/** Conditions for automatically hearing a rumor about this facton. */
rumorReqs: JoinCondition[];
rumorReqs: CompoundPlayerCondition;
/** A flag indicating if the faction supports field work to earn reputation. */
offerFieldWork: boolean;
@ -83,8 +90,8 @@ export class FactionInfo {
constructor(params: FactionInfoParams) {
this.infoText = params.infoText ?? <></>;
this.rumorText = params.rumorText ?? <></>;
this.inviteReqs = params.inviteReqs ?? [];
this.rumorReqs = params.rumorReqs ?? [];
this.inviteReqs = everyCondition(params.inviteReqs ?? [unsatisfiable]);
this.rumorReqs = everyCondition(params.rumorReqs ?? [unsatisfiable]);
this.enemies = params.enemies ?? [];
this.offerHackingWork = params.offerHackingWork ?? false;
this.offerFieldWork = params.offerFieldWork ?? false;
@ -127,9 +134,9 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.</>,
rumorText: <>Follow the thread. Take fl1ght.</>,
inviteReqs: [
haveAugmentations(currentNodeMults.DaedalusAugsRequirement),
delayedCondition(() => haveAugmentations(currentNodeMults.DaedalusAugsRequirement)),
haveMoney(100e9),
someCondition(haveSkill("hacking", 2500), haveCombatSkills(1500)),
someCondition([haveSkill("hacking", 2500), haveCombatSkills(1500)]),
],
rumorReqs: [haveFile(MessageFilename.TruthGazer)],
offerHackingWork: true,
@ -168,7 +175,7 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
</>
),
rumorText: <>High-ranking employees of {CompanyName.ECorp} can gain access to proprietary hacking augmentations.</>,
inviteReqs: [employedBy(CompanyName.ECorp, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [employedBy(CompanyName.ECorp), haveCompanyRep(CompanyName.ECorp, CONSTANTS.CorpFactionRepRequirement)],
rumorReqs: [employedBy(CompanyName.ECorp)],
offerHackingWork: true,
offerFieldWork: true,
@ -191,7 +198,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
rumorText: (
<>High-ranking employees of {CompanyName.MegaCorp} can gain access to proprietary biotech augmentations.</>
),
inviteReqs: [employedBy(CompanyName.MegaCorp, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.MegaCorp),
haveCompanyRep(CompanyName.MegaCorp, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.MegaCorp)],
offerHackingWork: true,
offerFieldWork: true,
@ -214,7 +224,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
augmentations.
</>
),
inviteReqs: [employedBy(CompanyName.BachmanAndAssociates, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.BachmanAndAssociates),
haveCompanyRep(CompanyName.BachmanAndAssociates, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.BachmanAndAssociates)],
offerHackingWork: true,
offerFieldWork: true,
@ -227,7 +240,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
rumorText: (
<>High-ranking employees of {CompanyName.BladeIndustries} can gain access to proprietary bionic augmentations.</>
),
inviteReqs: [employedBy(CompanyName.BladeIndustries, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.BladeIndustries),
haveCompanyRep(CompanyName.BladeIndustries, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.BladeIndustries)],
offerHackingWork: true,
offerFieldWork: true,
@ -244,7 +260,7 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
</>
),
rumorText: <>High-ranking employees of {CompanyName.NWO} can gain access to proprietary nanotech augmentations.</>,
inviteReqs: [employedBy(CompanyName.NWO, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [employedBy(CompanyName.NWO), haveCompanyRep(CompanyName.NWO, CONSTANTS.CorpFactionRepRequirement)],
rumorReqs: [employedBy(CompanyName.NWO)],
offerHackingWork: true,
offerFieldWork: true,
@ -260,7 +276,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
augmentations.
</>
),
inviteReqs: [employedBy(CompanyName.ClarkeIncorporated, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.ClarkeIncorporated),
haveCompanyRep(CompanyName.ClarkeIncorporated, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.ClarkeIncorporated)],
offerHackingWork: true,
offerFieldWork: true,
@ -276,7 +295,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
augmentations.
</>
),
inviteReqs: [employedBy(CompanyName.OmniTekIncorporated, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.OmniTekIncorporated),
haveCompanyRep(CompanyName.OmniTekIncorporated, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.OmniTekIncorporated)],
offerHackingWork: true,
offerFieldWork: true,
@ -294,7 +316,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
rumorText: (
<>High-ranking employees of {CompanyName.FourSigma} can gain access to a range of versatile augmentations.</>
),
inviteReqs: [employedBy(CompanyName.FourSigma, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.FourSigma),
haveCompanyRep(CompanyName.FourSigma, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.FourSigma)],
offerHackingWork: true,
offerFieldWork: true,
@ -310,7 +335,10 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
augmentations.
</>
),
inviteReqs: [employedBy(CompanyName.KuaiGongInternational, { withRep: CONSTANTS.CorpFactionRepRequirement })],
inviteReqs: [
employedBy(CompanyName.KuaiGongInternational),
haveCompanyRep(CompanyName.KuaiGongInternational, CONSTANTS.CorpFactionRepRequirement),
],
rumorReqs: [employedBy(CompanyName.KuaiGongInternational)],
offerHackingWork: true,
offerFieldWork: true,
@ -333,7 +361,8 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
</>
),
inviteReqs: [
employedBy(CompanyName.FulcrumTechnologies, { withRep: CONSTANTS.CorpFactionRepRequirement }),
employedBy(CompanyName.FulcrumTechnologies),
haveCompanyRep(CompanyName.FulcrumTechnologies, CONSTANTS.CorpFactionRepRequirement),
haveBackdooredServer(SpecialServers.FulcrumSecretTechnologies),
],
rumorReqs: [employedBy(CompanyName.FulcrumTechnologies)],
@ -520,12 +549,12 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>It is better to reign in Hell than to serve in Heaven.</>,
rumorText: <>We know.</>,
inviteReqs: [
notEmployee(CompanyName.CIA),
notEmployee(CompanyName.NSA),
haveKarma(-45),
notEmployedBy(CompanyName.CIA),
notEmployedBy(CompanyName.NSA),
haveSkill("hacking", 100),
haveCombatSkills(300),
haveKilledPeople(30),
haveKarma(-45),
],
rumorReqs: [haveKarma(-45), haveSkill("hacking", 50), haveCombatSkills(150), haveKilledPeople(5)],
offerHackingWork: true,
@ -538,19 +567,19 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
rumorText: <>A ruthless criminal organization based in {CityName.Chongqing}</>,
inviteReqs: [
locatedInCity(CityName.Chongqing),
notEmployee(CompanyName.CIA),
notEmployee(CompanyName.NSA),
haveKarma(-45),
notEmployedBy(CompanyName.CIA),
notEmployedBy(CompanyName.NSA),
haveSkill("hacking", 300),
haveCombatSkills(300),
haveKilledPeople(5),
haveKarma(-45),
],
rumorReqs: [
locatedInCity(CityName.Chongqing),
haveKarma(-45),
haveSkill("hacking", 150),
haveCombatSkills(150),
haveKilledPeople(1),
haveKarma(-45),
],
offerHackingWork: true,
offerFieldWork: true,
@ -560,17 +589,18 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>Honor holds you back.</>,
rumorText: <>An elite criminal organization that operates in the western hemisphere</>,
inviteReqs: [
locatedInCity(CityName.Aevum, CityName.Sector12),
notEmployee(CompanyName.CIA),
notEmployee(CompanyName.NSA),
haveKarma(-90),
locatedInSomeCity(CityName.Aevum, CityName.Sector12),
notEmployedBy(CompanyName.CIA),
notEmployedBy(CompanyName.NSA),
haveMoney(10e6),
haveSkill("hacking", 200),
haveCombatSkills(200),
haveKarma(-90),
],
rumorReqs: [
locatedInCity(CityName.Aevum, CityName.Sector12),
someCondition(haveKarma(-90), haveFile(LiteratureName.Sector12Crime)),
locatedInSomeCity(CityName.Aevum, CityName.Sector12),
haveCombatSkills(100),
someCondition([haveKarma(-90), haveFile(LiteratureName.Sector12Crime)]),
],
offerHackingWork: true,
offerFieldWork: true,
@ -603,13 +633,14 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>Following the mandate of Heaven and carrying out the way.</>,
rumorText: <>A notorious East Asian criminal organization</>,
inviteReqs: [
locatedInCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
haveKarma(-18),
locatedInSomeCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
haveCombatSkills(75),
haveKarma(-18),
],
rumorReqs: [
locatedInCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
someCondition(haveKarma(-18), haveFile(LiteratureName.NewTriads)),
locatedInSomeCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
haveCombatSkills(50),
someCondition([haveKarma(-18), haveFile(LiteratureName.NewTriads)]),
],
offerFieldWork: true,
offerSecurityWork: true,
@ -619,7 +650,7 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>{FactionName.SlumSnakes} rule!</>,
rumorText: <>Graffiti seen in the slums: {FactionName.SlumSnakes} rule!</>,
inviteReqs: [haveCombatSkills(30), haveMoney(1e6), haveKarma(-9)],
rumorReqs: [haveKarma(-1)],
rumorReqs: [haveCombatSkills(10), someCondition([haveKarma(-1), haveFile(LiteratureName.Sector12Crime)])],
offerFieldWork: true,
offerSecurityWork: true,
}),
@ -637,12 +668,12 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
infoText: <>Obey Heaven and work righteously.</>,
rumorText: <>A Chinese honor society with the motto: Obey Heaven and work righteously.</>,
inviteReqs: [
locatedInCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
locatedInSomeCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
haveSkill("hacking", 50),
haveMoney(1e6),
],
rumorReqs: [
locatedInCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
locatedInSomeCity(CityName.Chongqing, CityName.NewTokyo, CityName.Ishima),
haveSkill("hacking", 25),
haveMoney(0.5e6),
],
@ -662,8 +693,8 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
</>
),
rumorText: <>The {CompanyName.NSA} would like to have a word with you once you're ready.</>,
inviteReqs: [haveSourceFile(6, 7), haveBladeburnerRank(BladeburnerConstants.RankNeededForFaction)],
rumorReqs: [haveSourceFile(6, 7)],
inviteReqs: [haveSomeSourceFile(6, 7), haveBladeburnerRank(BladeburnerConstants.RankNeededForFaction)],
rumorReqs: [haveSomeSourceFile(6, 7)],
special: true,
assignment: (): React.ReactElement => {
return (
@ -715,6 +746,7 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
haveAugmentations(0),
{
toString: () => `Investigate the dilapidated church in ${CityName.Chongqing}`,
toJSON: () => ({ type: "location", location: LocationName.ChongqingChurchOfTheMachineGod }),
isSatisfied: (p: PlayerObject) => {
return [...p.factions, ...p.factionInvitations].includes(FactionName.ChurchOfTheMachineGod);
},
@ -750,6 +782,7 @@ export const FactionInfos: Record<FactionName, FactionInfo> = {
inviteReqs: [
{
toString: () => `Complete an infiltration`,
toJSON: () => ({ type: "numInfiltrations", numInfiltrations: 1 }),
isSatisfied: (p: PlayerObject) => {
return [...p.factions, ...p.factionInvitations].includes(FactionName.ShadowsOfAnarchy);
},

@ -1,4 +1,5 @@
import { CompanyName, JobName, CityName, AugmentationName, LiteratureName, MessageFilename } from "@enums";
import { ServerName } from "../Types/strings";
import { Server } from "../Server/Server";
import { GetServer } from "../Server/AllServers";
import { HacknetServer } from "../Hacknet/HacknetServer";
@ -7,16 +8,44 @@ import { Companies } from "../Company/Companies";
import { formatReputation, formatMoney, formatRam } from "../ui/formatNumber";
import type { PlayerObject } from "../PersonObjects/Player/PlayerObject";
import type { Skills } from "../PersonObjects/Skills";
import type {
PlayerRequirement,
BackdoorRequirement,
CityRequirement,
CompanyReputationRequirement,
EmployedByRequirement,
JobTitleRequirement,
KarmaRequiremennt,
MoneyRequirement,
NumAugmentationsRequirement,
PeopleKilledRequirement,
SkillRequirement,
FileRequirement,
BladeburnerRankRequirement,
HacknetRAMRequirement,
HacknetCoresRequirement,
HacknetLevelsRequirement,
NotRequirement,
SomeRequirement,
EveryRequirement,
} from "@nsdefs";
export interface JoinCondition {
/**
* Declarative format for checking that the player satisfies some condition, such as the requirements for being invited to a faction.
*/
export interface PlayerCondition {
toString(): string;
toJSON(): PlayerRequirement;
isSatisfied(p: PlayerObject): boolean;
}
export const haveBackdooredServer = (hostname: string): JoinCondition => ({
export const haveBackdooredServer = (hostname: ServerName): PlayerCondition => ({
toString(): string {
return `Backdoor access to ${hostname} server`;
},
toJSON(): BackdoorRequirement {
return { type: "backdoorInstalled", server: hostname };
},
isSatisfied(): boolean {
const server = GetServer(hostname);
if (!(server instanceof Server)) {
@ -26,57 +55,69 @@ export const haveBackdooredServer = (hostname: string): JoinCondition => ({
},
});
export const employedBy = (
companyName: CompanyName,
{ withRep }: { withRep: number } = { withRep: 0 },
): JoinCondition => ({
export const employedBy = (companyName: CompanyName): PlayerCondition => ({
toString(): string {
if (withRep == 0) {
return `Employed at ${companyName}`;
} else {
return `Employed at ${companyName} with ${formatReputation(withRep)} reputation`;
}
return `Employed at ${companyName}`;
},
toJSON(): EmployedByRequirement {
return { type: "employedBy", company: companyName };
},
isSatisfied(p: PlayerObject): boolean {
return Object.hasOwn(p.jobs, companyName);
},
});
export const haveCompanyRep = (companyName: CompanyName, rep: number): PlayerCondition => ({
toString(): string {
return `${formatReputation(rep)} reputation with ${companyName}`;
},
toJSON(): CompanyReputationRequirement {
return { type: "companyReputation", company: companyName, reputation: rep };
},
isSatisfied(): boolean {
const company = Companies[companyName];
if (!company) return false;
const serverMeta = serverMetadata.find((s) => s.specialName === companyName);
const server = GetServer(serverMeta ? serverMeta.hostname : "");
const bonus = (server as Server).backdoorInstalled ? -100e3 : 0;
return Object.hasOwn(p.jobs, companyName) && company.playerReputation > withRep + bonus;
const bonus = server?.backdoorInstalled ? 100e3 : 0;
return company.playerReputation + bonus >= rep;
},
});
export const executiveEmployee = (): JoinCondition => ({
export const haveJobTitle = (jobTitle: JobName): PlayerCondition => ({
toString(): string {
return `CTO, CFO, or CEO of a company`;
return `Employed as a ${jobTitle}`;
},
toJSON(): JobTitleRequirement {
return { type: "jobTitle", jobTitle: jobTitle };
},
isSatisfied(p: PlayerObject): boolean {
const allPositions = Object.values(p.jobs);
return (
allPositions.includes(JobName.software7) || // CTO
allPositions.includes(JobName.business4) || // CFO
allPositions.includes(JobName.business5) // CEO
);
return allPositions.includes(jobTitle);
},
});
export const notEmployee = (...companyNames: CompanyName[]): JoinCondition => ({
export const executiveEmployee = (): PlayerCondition => ({
...someCondition([JobName.software7, JobName.business4, JobName.business5].map((jobTitle) => haveJobTitle(jobTitle))),
toString(): string {
return `Not working for the ${joinList(companyNames)}`;
},
isSatisfied(p: PlayerObject): boolean {
for (const companyName of companyNames) {
if (Object.hasOwn(p.jobs, companyName)) return false;
}
return true;
return `CTO, CFO, or CEO of a company`;
},
});
export const haveAugmentations = (n: number): JoinCondition => ({
export const notEmployedBy = (companyName: CompanyName): PlayerCondition => ({
...notCondition(employedBy(companyName)),
toString(): string {
return `Not working for the ${companyName}`;
},
});
export const haveAugmentations = (n: number): PlayerCondition => ({
toString(): string {
return `${n || "No"} augmentations installed`;
},
toJSON(): NumAugmentationsRequirement {
return { type: "numAugmentations", numAugmentations: n };
},
isSatisfied(p: PlayerObject): boolean {
if (n == 0) {
const augs = [...p.augmentations, ...p.queuedAugmentations].filter(
@ -88,67 +129,94 @@ export const haveAugmentations = (n: number): JoinCondition => ({
},
});
export const haveMoney = (n: number): JoinCondition => ({
export const haveMoney = (n: number): PlayerCondition => ({
toString(): string {
return `Have ${formatMoney(n)}`;
},
toJSON(): MoneyRequirement {
return { type: "money", money: n };
},
isSatisfied(p: PlayerObject): boolean {
return p.money >= n;
},
});
export const haveSkill = (skill: keyof Skills, n: number): JoinCondition => ({
export const haveSkill = (skill: keyof Skills, n: number): PlayerCondition => ({
toString(): string {
return `${capitalize(skill)} level ${n}`;
},
toJSON(): SkillRequirement {
return { type: "skills", skills: { [skill]: n } };
},
isSatisfied(p: PlayerObject): boolean {
return p.skills[skill] >= n;
},
});
export const haveCombatSkills = (n: number): JoinCondition => ({
export const haveCombatSkills = (n: number): CompoundPlayerCondition => ({
...everyCondition(["strength", "defense", "dexterity", "agility"].map((s) => haveSkill(s as keyof Skills, n))),
toString(): string {
return `All combat skills level ${n}`;
},
isSatisfied(p: PlayerObject): boolean {
return p.skills.strength >= n && p.skills.defense >= n && p.skills.dexterity >= n && p.skills.agility >= n;
toJSON(): SkillRequirement {
return { type: "skills", skills: { strength: n, defense: n, dexterity: n, agility: n } };
},
});
export const haveKarma = (n: number): JoinCondition => ({
export const haveKarma = (n: number): PlayerCondition => ({
toString(): string {
return `${n} karma`;
if (n < -1000) return "An extensive criminal record";
else if (n < -40) return "A criminal reputation";
else if (n < -20) return "A disregard for the law";
else if (n < -10) return "A history of violence";
else return "Street cred";
},
toJSON(): KarmaRequiremennt {
return { type: "karma", karma: n };
},
isSatisfied(p: PlayerObject): boolean {
return p.karma <= n;
},
});
export const haveKilledPeople = (n: number): JoinCondition => ({
export const haveKilledPeople = (n: number): PlayerCondition => ({
toString(): string {
return `${n} people killed`;
},
toJSON(): PeopleKilledRequirement {
return { type: "numPeopleKilled", numPeopleKilled: n };
},
isSatisfied(p: PlayerObject): boolean {
return p.numPeopleKilled >= n;
},
});
export const locatedInCity = (...cities: CityName[]): JoinCondition => ({
export const locatedInCity = (city: CityName): PlayerCondition => ({
toString(): string {
return `Located in ${joinList(cities)}`;
return `Located in ${city}`;
},
toJSON(): CityRequirement {
return { type: "city", city: city };
},
isSatisfied(p: PlayerObject): boolean {
for (const city of cities) {
if (p.city == city) return true;
}
return false;
return p.city == city;
},
});
export const totalHacknetRam = (n: number): JoinCondition => ({
export const locatedInSomeCity = (...cities: CityName[]): PlayerCondition => ({
...someCondition(cities.map((city) => locatedInCity(city))),
toString(): string {
return `Located in ${joinList(cities)}`;
},
});
export const totalHacknetRam = (n: number): PlayerCondition => ({
toString(): string {
return `Total Hacknet RAM of ${formatRam(n)}`;
},
toJSON(): HacknetRAMRequirement {
return { type: "hacknetRAM", hacknetRAM: n };
},
isSatisfied(p: PlayerObject): boolean {
let total = 0;
for (const node of iterateHacknet(p)) {
@ -159,10 +227,13 @@ export const totalHacknetRam = (n: number): JoinCondition => ({
},
});
export const totalHacknetCores = (n: number): JoinCondition => ({
export const totalHacknetCores = (n: number): PlayerCondition => ({
toString(): string {
return `Total Hacknet cores of ${n}`;
},
toJSON(): HacknetCoresRequirement {
return { type: "hacknetCores", hacknetCores: n };
},
isSatisfied(p: PlayerObject): boolean {
let total = 0;
for (const node of iterateHacknet(p)) {
@ -173,10 +244,13 @@ export const totalHacknetCores = (n: number): JoinCondition => ({
},
});
export const totalHacknetLevels = (n: number): JoinCondition => ({
export const totalHacknetLevels = (n: number): PlayerCondition => ({
toString(): string {
return `Total Hacknet levels of ${n}`;
},
toJSON(): HacknetLevelsRequirement {
return { type: "hacknetLevels", hacknetLevels: n };
},
isSatisfied(p: PlayerObject): boolean {
let total = 0;
for (const node of iterateHacknet(p)) {
@ -187,48 +261,141 @@ export const totalHacknetLevels = (n: number): JoinCondition => ({
},
});
export const haveBladeburnerRank = (n: number): JoinCondition => ({
export const haveBladeburnerRank = (n: number): PlayerCondition => ({
toString(): string {
return `Rank ${n} in the Bladeburner Division`;
},
toJSON(): BladeburnerRankRequirement {
return { type: "bladeburnerRank", bladeburnerRank: n };
},
isSatisfied(p: PlayerObject): boolean {
const rank = p.bladeburner?.rank || 0;
return rank >= n;
},
});
export const haveSourceFile = (...nodeNums: number[]): JoinCondition => ({
export const haveSourceFile = (n: number): PlayerCondition => ({
toString(): string {
return `In BitNode ${joinList(nodeNums)} or have SourceFile ${joinList(nodeNums)}`;
return `In BitNode ${n} or have SourceFile ${n}`;
},
toJSON(): SomeRequirement {
return {
type: "someCondition",
conditions: [
{ type: "bitNodeN", bitNodeN: n },
{ type: "sourceFile", sourceFile: n },
],
};
},
isSatisfied(p: PlayerObject): boolean {
for (const n of nodeNums) {
if (p.bitNodeN === n || p.sourceFileLvl(n) > 0) return true;
}
return false;
return p.bitNodeN == n || p.sourceFileLvl(n) > 0;
},
});
export const haveFile = (fileName: LiteratureName | MessageFilename): JoinCondition => ({
export const haveSomeSourceFile = (...nodeNums: number[]): PlayerCondition => ({
...someCondition(nodeNums.map((n) => haveSourceFile(n))),
toString(): string {
return `In BitNode ${joinList(nodeNums)} or have SourceFile ${joinList(nodeNums)}`;
},
});
export const haveFile = (fileName: LiteratureName | MessageFilename): PlayerCondition => ({
toString(): string {
return `Have the file '${fileName}'`;
},
toJSON(): FileRequirement {
return { type: "file", file: fileName };
},
isSatisfied(p: PlayerObject): boolean {
const homeComputer = p.getHomeComputer();
return homeComputer.messages.includes(fileName);
},
});
export const someCondition = (...conditions: JoinCondition[]): JoinCondition => ({
/* higher-order conditions */
export interface CompoundPlayerCondition extends PlayerCondition, Iterable<PlayerCondition> {
type: "someCondition" | "everyCondition";
[Symbol.iterator]: () => IterableIterator<PlayerCondition>;
}
export const unsatisfiable: PlayerCondition = {
toString(): string {
return "(unsatisfiable)";
},
toJSON(): SomeRequirement {
return { type: "someCondition", conditions: [] };
},
isSatisfied(): boolean {
return false;
},
};
export const notCondition = (condition: PlayerCondition): PlayerCondition => ({
toString(): string {
return `Not ${condition.toString()}`;
},
toJSON(): NotRequirement {
return { type: "not", condition: condition.toJSON() };
},
isSatisfied(p: PlayerObject): boolean {
return !condition.isSatisfied(p);
},
});
export const someCondition = (conditions: PlayerCondition[]): CompoundPlayerCondition => ({
type: "someCondition",
toString(): string {
return joinList(conditions.map((c) => c.toString()));
},
isSatisfied(p: PlayerObject): boolean {
for (const condition of conditions) {
if (condition.isSatisfied(p)) return true;
}
return false;
toJSON(): SomeRequirement {
return { type: "someCondition", conditions: conditions.map((c) => c.toJSON()) };
},
isSatisfied(p: PlayerObject): boolean {
return conditions.some((c) => c.isSatisfied(p));
},
*[Symbol.iterator](): IterableIterator<PlayerCondition> {
for (const cond of conditions) {
if ("type" in cond && cond.type == "someCondition") {
// automatically flatten nested OR lists
yield* cond as CompoundPlayerCondition;
} else {
yield cond;
}
}
},
});
export const everyCondition = (conditions: PlayerCondition[]): CompoundPlayerCondition => ({
type: "everyCondition",
toString(): string {
return joinList(
conditions.map((c) => c.toString()),
"and",
);
},
toJSON(): EveryRequirement {
return { type: "everyCondition", conditions: conditions.map((c) => c.toJSON()) };
},
isSatisfied(p: PlayerObject): boolean {
return conditions.every((c) => c.isSatisfied(p));
},
*[Symbol.iterator](): IterableIterator<PlayerCondition> {
for (const cond of conditions) {
if ("type" in cond && cond.type == "everyCondition") {
// automatically flatten nested AND lists
yield* cond as CompoundPlayerCondition;
} else {
yield cond;
}
}
},
});
export const delayedCondition = (arg: () => PlayerCondition): PlayerCondition => ({
toString: () => arg().toString(),
toJSON: () => arg().toJSON(),
isSatisfied: (p: PlayerObject) => arg().isSatisfied(p),
});
/* helpers */

@ -50,7 +50,7 @@ const JoinChecklist = (props: { faction: Faction }): React.ReactElement => {
const info = props.faction.getInfo();
return (
<>
{info.inviteReqs.map((condition, i) => (
{[...info.inviteReqs].map((condition, i) => (
<Requirement key={i} fulfilled={condition.isSatisfied(Player)} value={condition.toString()} />
))}
</>

@ -181,7 +181,7 @@ const singularity = {
getCompanyRep: SF4Cost(RamCostConstants.SingularityFn2 / 3),
getCompanyFavor: SF4Cost(RamCostConstants.SingularityFn2 / 3),
getCompanyFavorGain: SF4Cost(RamCostConstants.SingularityFn2 / 4),
// Temporarily removed for API improvements getFactionInviteRequirements: SF4Cost(RamCostConstants.SingularityFn2),
getFactionInviteRequirements: SF4Cost(RamCostConstants.SingularityFn2),
checkFactionInvitations: SF4Cost(RamCostConstants.SingularityFn2),
joinFaction: SF4Cost(RamCostConstants.SingularityFn2),
workForFaction: SF4Cost(RamCostConstants.SingularityFn2),

@ -816,14 +816,12 @@ export function NetscriptSingularity(): InternalAPI<ISingularity> {
const companyName = getEnumHelper("CompanyName").nsGetMember(ctx, _companyName);
return Companies[companyName].getFavorGain();
},
/* Function temporarily removed, likely to change in next version to be more programming-friendly instead of providing human-readable string outputs for each requirement
getFactionInviteRequirements: (ctx) => (_facName) => {
helpers.checkSingularityAccess(ctx);
const facName = getEnumHelper("FactionName").nsGetMember(ctx, _facName);
const fac = Factions[facName];
return fac.getInfo().inviteReqs.map((condition) => condition.toString());
return [...fac.getInfo().inviteReqs].map((condition) => condition.toJSON());
},
*/
checkFactionInvitations: (ctx) => () => {
helpers.checkSingularityAccess(ctx);
// Manually trigger a check for faction invites

@ -108,19 +108,13 @@ export function NetscriptStanek(): InternalAPI<IStanek> {
return staneksGift.delete(rootX, rootY);
},
acceptGift: (ctx) => () => {
//Check if the player is eligible to join the church
if (
Player.canAccessCotMG() &&
Player.augmentations.filter((a) => a.name !== AugmentationName.NeuroFluxGovernor).length == 0 &&
Player.queuedAugmentations.filter((a) => a.name !== AugmentationName.NeuroFluxGovernor).length == 0
) {
//Attempt to join CotMG
joinFaction(Factions[FactionName.ChurchOfTheMachineGod]);
//Attempt to install the first Stanek aug
if (
!Player.hasAugmentation(AugmentationName.StaneksGift1) &&
!Player.queuedAugmentations.some((a) => a.name === AugmentationName.StaneksGift1)
) {
const cotmgFaction = Factions[FactionName.ChurchOfTheMachineGod];
// Check if the player is eligible to join the church
if (cotmgFaction.getInfo().inviteReqs.isSatisfied(Player)) {
// Attempt to join CotMG
joinFaction(cotmgFaction);
// Attempt to install the first Stanek aug (unless it is already queued)
if (!Player.hasAugmentation(AugmentationName.StaneksGift1, false)) {
applyAugmentation({ name: AugmentationName.StaneksGift1, level: 1 });
helpers.log(
ctx,
@ -128,11 +122,8 @@ export function NetscriptStanek(): InternalAPI<IStanek> {
);
}
}
//Return true iff the player is in CotMG and has the first Stanek aug installed
return (
Factions[FactionName.ChurchOfTheMachineGod].isMember &&
Player.hasAugmentation(AugmentationName.StaneksGift1, true)
);
// Return true iff the player is in CotMG and has the first Stanek aug installed
return cotmgFaction.isMember && Player.hasAugmentation(AugmentationName.StaneksGift1, true);
},
};
}

@ -620,10 +620,10 @@ export function checkForFactionInvitations(this: PlayerObject): Faction[] {
if (faction.alreadyInvited) continue;
// Handle invites
const { inviteReqs, rumorReqs } = faction.getInfo();
if (inviteReqs.every((req) => req.isSatisfied(this))) invitedFactions.push(faction);
if (inviteReqs.isSatisfied(this)) invitedFactions.push(faction);
// Handle rumors
if (this.factionRumors.has(faction.name)) continue;
if (rumorReqs.every((req) => req.isSatisfied(this))) this.receiveRumor(faction.name);
if (rumorReqs.isSatisfied(this)) this.receiveRumor(faction.name);
}
return invitedFactions;
}

@ -1937,29 +1937,39 @@ export interface Singularity {
*/
getCompanyFavorGain(companyName: CompanyName | `${CompanyName}`): number;
/* Experimental function temporarily removed, likely to undergo changes in next patch to make return value more programming-friendly
/**
* List conditions for being invited to a faction.
* @remarks
* RAM cost: 3 GB * 16/4/1
*
* @param faction - Name of the faction.
* @returns Array of strings describing conditions for receiving an invitation to the faction.
* @param faction - Name of the faction
* @returns Array of PlayerRequirement objects which must all be fulfilled to receive an invitation.
*
* @example
* ```js
* ns.singularity.getFactionInviteRequirements("The Syndicate")
* [
* "Located in Aevum or Sector-12",
* "Not working for the Central Intelligence Agency",
* "Not working for the National Security Agency",
* "-90 karma",
* "Have $10.000m",
* "Hacking level 200",
* "All combat skills level 200"
* { "type": "someCondition", "conditions": [
* { "type": "city", "city": "Aevum" },
* { "type": "city", "city": "Sector-12" }
* ]
* },
* { "type": "not", "condition": {
* "type": "employedBy", "company": "Central Intelligence Agency"
* }
* },
* { "type": "not", "condition": {
* "type": "employedBy", "company": "National Security Agency"
* }
* },
* { "type": "money", "money": 10000000 },
* { "type": "skills", "skills": { "hacking": 200 } },
* { "type": "skills", "skills": { "strength": 200, "defense": 200, "dexterity": 200, "agility": 200 } },
* { "type": "karma", "karma": -90 }
* ]
* ```
getFactionInviteRequirements(faction: string): string[];
*/
*/
getFactionInviteRequirements(faction: string): PlayerRequirement[];
/**
* List all current faction invitations.
@ -8145,3 +8155,215 @@ interface AutocompleteData {
txts: string[];
flags(schema: [string, string | number | boolean | string[]][]): { [key: string]: ScriptArg | string[] };
}
/**
* Player must have at least this much money.
* @public
*/
interface MoneyRequirement {
type: "money";
money: number;
}
/**
* Player must have each listed skill at least this level.
* @public
*/
interface SkillRequirement {
type: "skills";
skills: Partial<Skills>;
}
/**
* Player must have less than this much karma.
* @public
*/
interface KarmaRequiremennt {
type: "karma";
karma: number;
}
/**
* Player must have killed at least this many people.
* @public
*/
interface PeopleKilledRequirement {
type: "numPeopleKilled";
numPeopleKilled: number;
}
/**
* Player must have a specific Literature or Message file on their home computer.
* @public
*/
interface FileRequirement {
type: "file";
file: string;
}
/**
* Player must have at least this many augmentations installed (if positive).
* Player must have no augmentations installed (if zero).
* @public
*/
interface NumAugmentationsRequirement {
type: "numAugmentations";
numAugmentations: number;
}
/**
* Player must be working for this company.
* @public
*/
interface EmployedByRequirement {
type: "employedBy";
company: CompanyName;
}
/**
* Player must have at least this much reputation with this company.
* @public
*/
interface CompanyReputationRequirement {
type: "companyReputation";
company: CompanyName;
reputation: number;
}
/**
* Player must have this job title at some company.
* @public
*/
interface JobTitleRequirement {
type: "jobTitle";
jobTitle: JobName;
}
/**
* Player must be located in this city.
* @public
*/
interface CityRequirement {
type: "city";
city: CityName;
}
/**
* Player must be at this location within a city.
* @public
*/
interface LocationRequirement {
type: "location";
location: LocationName;
}
/**
* Player must have installed a backdoor on this server.
* @public
*/
interface BackdoorRequirement {
type: "backdoorInstalled";
server: string;
}
/**
* Player's Hacknet devices must have at least this much total RAM.
* @public
*/
interface HacknetRAMRequirement {
type: "hacknetRAM";
hacknetRAM: number;
}
/**
* Player's Hacknet devices must have at least this many total cores.
* @public
*/
interface HacknetCoresRequirement {
type: "hacknetCores";
hacknetCores: number;
}
/**
* Player's Hacknet devices must have at least this many total levels.
* @public
*/
interface HacknetLevelsRequirement {
type: "hacknetLevels";
hacknetLevels: number;
}
/**
* Player must be located in this BitNode.
* @public
*/
interface BitNodeRequirement {
type: "bitNodeN";
bitNodeN: number;
}
/**
* Player must have this Source File.
* @public
*/
interface SourceFileRequirement {
type: "sourceFile";
sourceFile: number;
}
/**
* Player must have at least this rank in the Bladeburner Division.
* @public
*/
interface BladeburnerRankRequirement {
type: "bladeburnerRank";
bladeburnerRank: number;
}
/**
* Player must have completed this many infiltrations.
* @public
*/
interface NumInfiltrationsRequirement {
type: "numInfiltrations";
numInfiltrations: number;
}
/**
* The sub-condition must not be satisfied.
* @public
*/
interface NotRequirement {
type: "not";
condition: PlayerRequirement;
}
/**
* At least one sub-condition must be satisfied.
* @public
*/
interface SomeRequirement {
type: "someCondition";
conditions: PlayerRequirement[];
}
/**
* All sub-conditions must be satisfied.
* @public
*/
interface EveryRequirement {
type: "everyCondition";
conditions: PlayerRequirement[];
}
/**
* Structured interface to requirements for joining a faction or company.
* For fields with numerical value \> 0, the player must have at least this value.
* For fields with numerical value \<= 0, the player must have at most this value.
* For "not", the sub-condition must be failed instead of passed.
* For "someCondition", at least one sub-condition must be passed.
* @public
* @returns - An object representing one requirement.
*/
export type PlayerRequirement =
| MoneyRequirement
| SkillRequirement
| KarmaRequiremennt
| PeopleKilledRequirement
| FileRequirement
| NumAugmentationsRequirement
| EmployedByRequirement
| CompanyReputationRequirement
| JobTitleRequirement
| CityRequirement
| LocationRequirement
| BackdoorRequirement
| HacknetRAMRequirement
| HacknetCoresRequirement
| HacknetLevelsRequirement
| BitNodeRequirement
| SourceFileRequirement
| BladeburnerRankRequirement
| NumInfiltrationsRequirement
| NotRequirement
| SomeRequirement
| EveryRequirement;