mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-05-01 05:17:04 +02:00
Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a5e5780c9 | |||
| f4c4b17797 | |||
| a99eeea80c | |||
| eeef4cf772 | |||
| 548cb24b2e | |||
| c72a2928eb | |||
| 01c63ea0c0 | |||
| 8ad5ec075e | |||
| 115b1b63ad | |||
| 851ed2b9dc | |||
| 234ee7a923 | |||
| 9e85068cbb | |||
| ed6df3dfa7 | |||
| 253b8b2672 | |||
| 3146c50edc | |||
| 4a91a71891 | |||
| 99afa3cd50 | |||
| 750f79adf3 | |||
| dbb20c1526 | |||
| 60fb303915 | |||
| 32fed9f142 | |||
| 33ffc2107c | |||
| 36e1adf2d2 | |||
| ee3014b029 | |||
| 112d317fd2 | |||
| 355f650367 | |||
| a4b0f22a2e | |||
| 2aa5092d85 | |||
| a7409a01cc | |||
| a99109d9c7 | |||
| 95af138c39 | |||
| f5bbc26495 | |||
| f8ec7f4294 | |||
| c06c6590c9 | |||
| 45bce6e45e | |||
| c21d1f44b2 | |||
| 956e00f789 | |||
| c5536d252b | |||
| a99ca64455 | |||
| cb14655325 | |||
| 9ab3e0bcb4 | |||
| cc9144c01b | |||
| fb3fa00b3d | |||
| 8cbd6ff9e1 | |||
| 00a1bc2f6e | |||
| be6fcd206f | |||
| a6a112198e | |||
| 732aadb2d6 | |||
| 85c9ac0181 | |||
| e232f37550 | |||
| 6074721c59 | |||
| 09e46d757b | |||
| 5cb0d559df |
@@ -2,7 +2,17 @@ name: Build artifacts
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
git-sha:
|
||||
description: "Commit SHA-1 to checkout"
|
||||
required: false
|
||||
default: ""
|
||||
workflow_call:
|
||||
inputs:
|
||||
git-sha:
|
||||
type: string
|
||||
required: false
|
||||
default: ""
|
||||
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
@@ -13,6 +23,8 @@ jobs:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.inputs.git-sha || inputs.git-sha || github.sha }}
|
||||
- name: Use Node.js 24
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
@@ -46,6 +58,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.inputs.git-sha || inputs.git-sha || github.sha }}
|
||||
- name: Use Node.js 24
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
@@ -77,6 +91,8 @@ jobs:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.inputs.git-sha || inputs.git-sha || github.sha }}
|
||||
- name: Use Node.js 24
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
|
||||
@@ -9,7 +9,7 @@ Base interface of all tasks.
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface BaseTask
|
||||
interface BaseTask
|
||||
```
|
||||
|
||||
## Properties
|
||||
@@ -37,7 +37,7 @@ Description
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[cyclesWorked](./bitburner.basetask.cyclesworked.md)
|
||||
[nextCompletion](./bitburner.basetask.nextcompletion.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
@@ -45,12 +45,16 @@ Description
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
Promise<void>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
The number of game engine cycles has passed since this task started. 1 engine cycle = 200ms.
|
||||
This promise resolves when the task completes or is canceled.
|
||||
|
||||
Tasks that do not track progress, such as studying or working for a company, are non-completable, i.e., they continue indefinitely until canceled. The `nextCompletion` promise of these tasks resolves only when they are canceled.
|
||||
|
||||
Among completable tasks, some are repeatable, i.e., they automatically restart after completion. The `nextCompletion` promise of these tasks resolves on the next completion or when they are canceled.
|
||||
|
||||
|
||||
</td></tr>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [BaseTask](./bitburner.basetask.md) > [nextCompletion](./bitburner.basetask.nextcompletion.md)
|
||||
|
||||
## BaseTask.nextCompletion property
|
||||
|
||||
This promise resolves when the task completes or is canceled.
|
||||
|
||||
Tasks that do not track progress, such as studying or working for a company, are non-completable, i.e., they continue indefinitely until canceled. The `nextCompletion` promise of these tasks resolves only when they are canceled.
|
||||
|
||||
Among completable tasks, some are repeatable, i.e., they automatically restart after completion. The `nextCompletion` promise of these tasks resolves on the next completion or when they are canceled.
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
nextCompletion: Promise<void>;
|
||||
```
|
||||
@@ -12,7 +12,7 @@ Default value:
|
||||
|
||||
- All boolean options: false
|
||||
|
||||
If you specify intelligenceOverride, it must be a non-negative integer.
|
||||
If you specify intelligenceOverride, it must be a positive integer.
|
||||
|
||||
**Signature:**
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Promise that resolves to the number of milliseconds of Bladeburner time that wer
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
The amount of real time spent asleep between updates can vary due to "bonus time" (usually 1 second).
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ Company Work
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface CompanyWorkTask extends BaseTask
|
||||
interface CompanyWorkTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Promise that resolves to the name of the state that was just processed.
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
The amount of real time spent asleep between updates can vary due to "bonus time" (usually 200 milliseconds - 2 seconds).
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ Create Program
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface CreateProgramWorkTask extends BaseTask
|
||||
interface CreateProgramWorkTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ Crime
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface CrimeTask extends BaseTask
|
||||
interface CrimeTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
|
||||
@@ -29,5 +29,5 @@ Promise<void>
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ Faction Work
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface FactionWorkTask extends BaseTask
|
||||
interface FactionWorkTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
|
||||
+3
-3
@@ -1,15 +1,15 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [Gang](./bitburner.gang.md) > [getOtherGangInformation](./bitburner.gang.getotherganginformation.md)
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [Gang](./bitburner.gang.md) > [getAllGangInformation](./bitburner.gang.getallganginformation.md)
|
||||
|
||||
## Gang.getOtherGangInformation() method
|
||||
## Gang.getAllGangInformation() method
|
||||
|
||||
Get information about all gangs.
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
getOtherGangInformation(): Record<string, GangOtherInfoObject>;
|
||||
getAllGangInformation(): Record<string, GangOtherInfoObject>;
|
||||
```
|
||||
**Returns:**
|
||||
|
||||
+11
-11
@@ -61,6 +61,17 @@ Check if you can recruit a new gang member.
|
||||
Create a gang.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[getAllGangInformation()](./bitburner.gang.getallganginformation.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Get information about all gangs.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
@@ -182,17 +193,6 @@ Get information about a specific gang member.
|
||||
List all gang members.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[getOtherGangInformation()](./bitburner.gang.getotherganginformation.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Get information about all gangs.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Promise that resolves to the number of milliseconds of Gang time that were proce
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
The amount of real time spent asleep between updates can vary due to "bonus time".
|
||||
|
||||
|
||||
@@ -19,5 +19,5 @@ A promise that resolves when the current grafting finishes or is canceled. If th
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [GraftingTask](./bitburner.graftingtask.md) > [completion](./bitburner.graftingtask.completion.md)
|
||||
|
||||
## GraftingTask.completion property
|
||||
|
||||
This promise resolves when the task is complete.
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
completion: Promise<void>;
|
||||
```
|
||||
@@ -9,9 +9,9 @@ Grafting Work
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface GraftingTask extends BaseTask
|
||||
interface GraftingTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
@@ -56,25 +56,6 @@ string
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[completion](./bitburner.graftingtask.completion.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Promise<void>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
This promise resolves when the task is complete.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
|
||||
@@ -126,6 +126,17 @@ Calculate hack percent for one thread. (Ex: 0.25 would steal 25% of the server's
|
||||
Calculate hack time.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[weakenEffect(threads, cores)](./bitburner.hackingformulas.weakeneffect.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Calculate the security decrease from a weaken operation. Unlike other hacking formulas, weaken effect depends only on thread count and core count, not on server or player properties. The core bonus formula is `1 + (cores - 1) / 16}`<!-- -->.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [HackingFormulas](./bitburner.hackingformulas.md) > [weakenEffect](./bitburner.hackingformulas.weakeneffect.md)
|
||||
|
||||
## HackingFormulas.weakenEffect() method
|
||||
|
||||
Calculate the security decrease from a weaken operation. Unlike other hacking formulas, weaken effect depends only on thread count and core count, not on server or player properties. The core bonus formula is `1 + (cores - 1) / 16}`<!-- -->.
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
weakenEffect(threads: number, cores?: number): number;
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Parameter
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
threads
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Number of threads running weaken.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
cores
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
_(Optional)_ Number of cores on the host server. Default 1.
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Returns:**
|
||||
|
||||
number
|
||||
|
||||
The security decrease amount.
|
||||
|
||||
+102
-91
@@ -123,7 +123,7 @@ Default value:
|
||||
|
||||
- All boolean options: false
|
||||
|
||||
If you specify intelligenceOverride, it must be a non-negative integer.
|
||||
If you specify intelligenceOverride, it must be a positive integer.
|
||||
|
||||
|
||||
</td></tr>
|
||||
@@ -1111,6 +1111,17 @@ Player must have killed at least this many people.
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
Base interface of all player tasks.
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
@@ -1272,6 +1283,66 @@ Skills formulas
|
||||
Sleeve API
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveClassTask](./bitburner.sleeveclasstask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveCompanyTask](./bitburner.sleevecompanytask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveCrimeTask](./bitburner.sleevecrimetask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveFactionTask](./bitburner.sleevefactiontask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
@@ -1282,6 +1353,36 @@ Sleeve API
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveRecoveryTask](./bitburner.sleeverecoverytask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveSupportTask](./bitburner.sleevesupporttask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveSynchroTask](./bitburner.sleevesynchrotask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
@@ -2206,96 +2307,6 @@ Use React.createElement to make the ReactElement type, see [creating an element
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveClassTask](./bitburner.sleeveclasstask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveCompanyTask](./bitburner.sleevecompanytask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveCrimeTask](./bitburner.sleevecrimetask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveFactionTask](./bitburner.sleevefactiontask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveRecoveryTask](./bitburner.sleeverecoverytask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveSupportTask](./bitburner.sleevesupporttask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[SleeveSynchroTask](./bitburner.sleevesynchrotask.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [BaseTask](./bitburner.basetask.md) > [cyclesWorked](./bitburner.basetask.cyclesworked.md)
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [PlayerBaseTask](./bitburner.playerbasetask.md) > [cyclesWorked](./bitburner.playerbasetask.cyclesworked.md)
|
||||
|
||||
## BaseTask.cyclesWorked property
|
||||
## PlayerBaseTask.cyclesWorked property
|
||||
|
||||
The number of game engine cycles has passed since this task started. 1 engine cycle = 200ms.
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## PlayerBaseTask interface
|
||||
|
||||
Base interface of all player tasks.
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
interface PlayerBaseTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[cyclesWorked](./bitburner.playerbasetask.cyclesworked.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
The number of game engine cycles has passed since this task started. 1 engine cycle = 200ms.
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
@@ -52,7 +52,7 @@ Name of faction to join.
|
||||
|
||||
boolean
|
||||
|
||||
True if player joined the faction, and false otherwise.
|
||||
True if the player successfully accepts an invitation, and false otherwise.
|
||||
|
||||
## Remarks
|
||||
|
||||
@@ -60,3 +60,5 @@ RAM cost: 3 GB \* 16/4/1
|
||||
|
||||
This function will automatically accept an invitation from a faction and join it.
|
||||
|
||||
Note that this function returns false if you are already a member of the specified faction.
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [actionName](./bitburner.sleevebladeburnertask.actionname.md)
|
||||
|
||||
## SleeveBladeburnerTask.actionName property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
actionName: string;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [actionType](./bitburner.sleevebladeburnertask.actiontype.md)
|
||||
|
||||
## SleeveBladeburnerTask.actionType property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
actionType: "General" | "Contracts";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [cyclesNeeded](./bitburner.sleevebladeburnertask.cyclesneeded.md)
|
||||
|
||||
## SleeveBladeburnerTask.cyclesNeeded property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesNeeded: number;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [cyclesWorked](./bitburner.sleevebladeburnertask.cyclesworked.md)
|
||||
|
||||
## SleeveBladeburnerTask.cyclesWorked property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesWorked: number;
|
||||
```
|
||||
@@ -2,19 +2,140 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md)
|
||||
|
||||
## SleeveBladeburnerTask type
|
||||
## SleeveBladeburnerTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveBladeburnerTask = {
|
||||
type: "BLADEBURNER";
|
||||
actionType: "General" | "Contracts";
|
||||
actionName: string;
|
||||
cyclesWorked: number;
|
||||
cyclesNeeded: number;
|
||||
nextCompletion: Promise<void>;
|
||||
tasksCompleted: number;
|
||||
};
|
||||
interface SleeveBladeburnerTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[actionName](./bitburner.sleevebladeburnertask.actionname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
string
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[actionType](./bitburner.sleevebladeburnertask.actiontype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"General" \| "Contracts"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[cyclesNeeded](./bitburner.sleevebladeburnertask.cyclesneeded.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[cyclesWorked](./bitburner.sleevebladeburnertask.cyclesworked.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[tasksCompleted](./bitburner.sleevebladeburnertask.taskscompleted.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleevebladeburnertask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"BLADEBURNER"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [tasksCompleted](./bitburner.sleevebladeburnertask.taskscompleted.md)
|
||||
|
||||
## SleeveBladeburnerTask.tasksCompleted property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
tasksCompleted: number;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveBladeburnerTask](./bitburner.sleevebladeburnertask.md) > [type](./bitburner.sleevebladeburnertask.type.md)
|
||||
|
||||
## SleeveBladeburnerTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "BLADEBURNER";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveClassTask](./bitburner.sleeveclasstask.md) > [classType](./bitburner.sleeveclasstask.classtype.md)
|
||||
|
||||
## SleeveClassTask.classType property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
classType: UniversityClassType | GymType;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveClassTask](./bitburner.sleeveclasstask.md) > [location](./bitburner.sleeveclasstask.location.md)
|
||||
|
||||
## SleeveClassTask.location property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
location: LocationName;
|
||||
```
|
||||
@@ -2,17 +2,89 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveClassTask](./bitburner.sleeveclasstask.md)
|
||||
|
||||
## SleeveClassTask type
|
||||
## SleeveClassTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveClassTask = {
|
||||
type: "CLASS";
|
||||
classType: UniversityClassType | GymType;
|
||||
location: LocationName;
|
||||
};
|
||||
interface SleeveClassTask extends BaseTask
|
||||
```
|
||||
**References:** [UniversityClassType](./bitburner.universityclasstype.md)<!-- -->, [GymType](./bitburner.gymtype.md)<!-- -->, [LocationName](./bitburner.locationname.md)
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[classType](./bitburner.sleeveclasstask.classtype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[UniversityClassType](./bitburner.universityclasstype.md) \| [GymType](./bitburner.gymtype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[location](./bitburner.sleeveclasstask.location.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[LocationName](./bitburner.locationname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleeveclasstask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"CLASS"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveClassTask](./bitburner.sleeveclasstask.md) > [type](./bitburner.sleeveclasstask.type.md)
|
||||
|
||||
## SleeveClassTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "CLASS";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCompanyTask](./bitburner.sleevecompanytask.md) > [companyName](./bitburner.sleevecompanytask.companyname.md)
|
||||
|
||||
## SleeveCompanyTask.companyName property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
companyName: CompanyName;
|
||||
```
|
||||
@@ -2,13 +2,72 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCompanyTask](./bitburner.sleevecompanytask.md)
|
||||
|
||||
## SleeveCompanyTask type
|
||||
## SleeveCompanyTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveCompanyTask = { type: "COMPANY"; companyName: CompanyName };
|
||||
interface SleeveCompanyTask extends BaseTask
|
||||
```
|
||||
**References:** [CompanyName](./bitburner.companyname.md)
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[companyName](./bitburner.sleevecompanytask.companyname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[CompanyName](./bitburner.companyname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleevecompanytask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"COMPANY"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCompanyTask](./bitburner.sleevecompanytask.md) > [type](./bitburner.sleevecompanytask.type.md)
|
||||
|
||||
## SleeveCompanyTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "COMPANY";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md) > [crimeType](./bitburner.sleevecrimetask.crimetype.md)
|
||||
|
||||
## SleeveCrimeTask.crimeType property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
crimeType: CrimeType;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md) > [cyclesNeeded](./bitburner.sleevecrimetask.cyclesneeded.md)
|
||||
|
||||
## SleeveCrimeTask.cyclesNeeded property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesNeeded: number;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md) > [cyclesWorked](./bitburner.sleevecrimetask.cyclesworked.md)
|
||||
|
||||
## SleeveCrimeTask.cyclesWorked property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesWorked: number;
|
||||
```
|
||||
@@ -2,19 +2,123 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md)
|
||||
|
||||
## SleeveCrimeTask type
|
||||
## SleeveCrimeTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveCrimeTask = {
|
||||
type: "CRIME";
|
||||
crimeType: CrimeType;
|
||||
cyclesWorked: number;
|
||||
cyclesNeeded: number;
|
||||
tasksCompleted: number;
|
||||
};
|
||||
interface SleeveCrimeTask extends BaseTask
|
||||
```
|
||||
**References:** [CrimeType](./bitburner.crimetype.md)
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[crimeType](./bitburner.sleevecrimetask.crimetype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[CrimeType](./bitburner.crimetype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[cyclesNeeded](./bitburner.sleevecrimetask.cyclesneeded.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[cyclesWorked](./bitburner.sleevecrimetask.cyclesworked.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[tasksCompleted](./bitburner.sleevecrimetask.taskscompleted.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleevecrimetask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"CRIME"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md) > [tasksCompleted](./bitburner.sleevecrimetask.taskscompleted.md)
|
||||
|
||||
## SleeveCrimeTask.tasksCompleted property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
tasksCompleted: number;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveCrimeTask](./bitburner.sleevecrimetask.md) > [type](./bitburner.sleevecrimetask.type.md)
|
||||
|
||||
## SleeveCrimeTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "CRIME";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveFactionTask](./bitburner.sleevefactiontask.md) > [factionName](./bitburner.sleevefactiontask.factionname.md)
|
||||
|
||||
## SleeveFactionTask.factionName property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
factionName: FactionName;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveFactionTask](./bitburner.sleevefactiontask.md) > [factionWorkType](./bitburner.sleevefactiontask.factionworktype.md)
|
||||
|
||||
## SleeveFactionTask.factionWorkType property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
factionWorkType: FactionWorkType;
|
||||
```
|
||||
@@ -2,17 +2,89 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveFactionTask](./bitburner.sleevefactiontask.md)
|
||||
|
||||
## SleeveFactionTask type
|
||||
## SleeveFactionTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveFactionTask = {
|
||||
type: "FACTION";
|
||||
factionWorkType: FactionWorkType;
|
||||
factionName: FactionName;
|
||||
};
|
||||
interface SleeveFactionTask extends BaseTask
|
||||
```
|
||||
**References:** [FactionWorkType](./bitburner.factionworktype.md)<!-- -->, [FactionName](./bitburner.factionname.md)
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[factionName](./bitburner.sleevefactiontask.factionname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[FactionName](./bitburner.factionname.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[factionWorkType](./bitburner.sleevefactiontask.factionworktype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
[FactionWorkType](./bitburner.factionworktype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleevefactiontask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"FACTION"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveFactionTask](./bitburner.sleevefactiontask.md) > [type](./bitburner.sleevefactiontask.type.md)
|
||||
|
||||
## SleeveFactionTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "FACTION";
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md) > [cyclesNeeded](./bitburner.sleeveinfiltratetask.cyclesneeded.md)
|
||||
|
||||
## SleeveInfiltrateTask.cyclesNeeded property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesNeeded: number;
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md) > [cyclesWorked](./bitburner.sleeveinfiltratetask.cyclesworked.md)
|
||||
|
||||
## SleeveInfiltrateTask.cyclesWorked property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
cyclesWorked: number;
|
||||
```
|
||||
@@ -2,16 +2,89 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md)
|
||||
|
||||
## SleeveInfiltrateTask type
|
||||
## SleeveInfiltrateTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveInfiltrateTask = {
|
||||
type: "INFILTRATE";
|
||||
cyclesWorked: number;
|
||||
cyclesNeeded: number;
|
||||
nextCompletion: Promise<void>;
|
||||
};
|
||||
interface SleeveInfiltrateTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[cyclesNeeded](./bitburner.sleeveinfiltratetask.cyclesneeded.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[cyclesWorked](./bitburner.sleeveinfiltratetask.cyclesworked.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
number
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[type](./bitburner.sleeveinfiltratetask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"INFILTRATE"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveInfiltrateTask](./bitburner.sleeveinfiltratetask.md) > [type](./bitburner.sleeveinfiltratetask.type.md)
|
||||
|
||||
## SleeveInfiltrateTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "INFILTRATE";
|
||||
```
|
||||
@@ -2,11 +2,55 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveRecoveryTask](./bitburner.sleeverecoverytask.md)
|
||||
|
||||
## SleeveRecoveryTask type
|
||||
## SleeveRecoveryTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveRecoveryTask = { type: "RECOVERY" };
|
||||
interface SleeveRecoveryTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[type](./bitburner.sleeverecoverytask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"RECOVERY"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveRecoveryTask](./bitburner.sleeverecoverytask.md) > [type](./bitburner.sleeverecoverytask.type.md)
|
||||
|
||||
## SleeveRecoveryTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "RECOVERY";
|
||||
```
|
||||
@@ -2,11 +2,55 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveSupportTask](./bitburner.sleevesupporttask.md)
|
||||
|
||||
## SleeveSupportTask type
|
||||
## SleeveSupportTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveSupportTask = { type: "SUPPORT" };
|
||||
interface SleeveSupportTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[type](./bitburner.sleevesupporttask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"SUPPORT"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveSupportTask](./bitburner.sleevesupporttask.md) > [type](./bitburner.sleevesupporttask.type.md)
|
||||
|
||||
## SleeveSupportTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "SUPPORT";
|
||||
```
|
||||
@@ -2,11 +2,55 @@
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveSynchroTask](./bitburner.sleevesynchrotask.md)
|
||||
|
||||
## SleeveSynchroTask type
|
||||
## SleeveSynchroTask interface
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type SleeveSynchroTask = { type: "SYNCHRO" };
|
||||
interface SleeveSynchroTask extends BaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
|
||||
## Properties
|
||||
|
||||
<table><thead><tr><th>
|
||||
|
||||
Property
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Modifiers
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Type
|
||||
|
||||
|
||||
</th><th>
|
||||
|
||||
Description
|
||||
|
||||
|
||||
</th></tr></thead>
|
||||
<tbody><tr><td>
|
||||
|
||||
[type](./bitburner.sleevesynchrotask.type.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
"SYNCHRO"
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [SleeveSynchroTask](./bitburner.sleevesynchrotask.md) > [type](./bitburner.sleevesynchrotask.type.md)
|
||||
|
||||
## SleeveSynchroTask.type property
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type: "SYNCHRO";
|
||||
```
|
||||
@@ -19,7 +19,7 @@ Promise that resolves to the number of milliseconds of Stock Market time that we
|
||||
|
||||
## Remarks
|
||||
|
||||
RAM cost: 1 GB
|
||||
RAM cost: 0 GB
|
||||
|
||||
The amount of real time spent asleep between updates can vary due to "bonus time" (usually 4 seconds - 6 seconds).
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ Study
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
export interface StudyTask extends BaseTask
|
||||
interface StudyTask extends PlayerBaseTask
|
||||
```
|
||||
**Extends:** [BaseTask](./bitburner.basetask.md)
|
||||
**Extends:** [PlayerBaseTask](./bitburner.playerbasetask.md)
|
||||
|
||||
## Remarks
|
||||
|
||||
|
||||
@@ -104,3 +104,11 @@ void
|
||||
|
||||
RAM cost: 20 GB
|
||||
|
||||
This limit applies only to output; it does not affect input consumption.
|
||||
|
||||
For example, in Agriculture, assume the division's raw production is 1000. You need to consume 500 Water and 200 Chemicals to produce 1000 Plants and 1000 Food. If you set the limits for Plants and Food to 200 and 100 respectively, you will still consume 500 Water and 200 Chemicals, but only produce 200 Plants and 100 Food.
|
||||
|
||||
With industries that produce both materials and products, the material production limits do not affect product production.
|
||||
|
||||
You can set a limit on any material, but only limits on output materials are enforced. Limits on other materials are stored but ignored during production calculations. For example, in Agriculture, only limits on Plants and Food are enforced.
|
||||
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
"SLEEVE_8": {
|
||||
"ID": "SLEEVE_8",
|
||||
"Name": "You and what army?",
|
||||
"Description": "Purchase all duplicate sleeves from The Covenant."
|
||||
"Description": "Acquire all 8 sleeves."
|
||||
},
|
||||
"INDECISIVE": {
|
||||
"ID": "INDECISIVE",
|
||||
@@ -454,7 +454,7 @@
|
||||
"CHALLENGE_BN9": {
|
||||
"ID": "CHALLENGE_BN9",
|
||||
"Name": "BN9: Challenge",
|
||||
"Description": "Destroy BN9 without using hacknet servers."
|
||||
"Description": "Destroy BN9 without using hacknet servers or hacknet nodes."
|
||||
},
|
||||
"CHALLENGE_BN10": {
|
||||
"ID": "CHALLENGE_BN10",
|
||||
|
||||
@@ -4,19 +4,10 @@ import { AchievementList } from "./AchievementList";
|
||||
import { achievements } from "./Achievements";
|
||||
import { Box, Typography } from "@mui/material";
|
||||
import { Player } from "@player";
|
||||
import { makeStyles } from "tss-react/mui";
|
||||
|
||||
const useStyles = makeStyles()({
|
||||
root: {
|
||||
width: 50,
|
||||
userSelect: "none",
|
||||
},
|
||||
});
|
||||
|
||||
export function AchievementsRoot(): JSX.Element {
|
||||
const { classes } = useStyles();
|
||||
return (
|
||||
<div className={classes.root} style={{ width: "100%" }}>
|
||||
<div style={{ width: "100%" }}>
|
||||
<Typography variant="h4">Achievements</Typography>
|
||||
<Box mx={2}>
|
||||
<Typography>
|
||||
|
||||
@@ -37,7 +37,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"triggers feelings of admiration, approval, and respect in others.",
|
||||
company_rep: 1.2,
|
||||
faction_rep: 1.2,
|
||||
charisma: 1.2,
|
||||
charisma: 1.1,
|
||||
factions: [
|
||||
FactionName.Silhouette,
|
||||
FactionName.FourSigma,
|
||||
@@ -517,7 +517,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"millions of nanobots capable of projecting high-density muon beams, " +
|
||||
"creating an energy barrier around the user.",
|
||||
defense: 1.4,
|
||||
charisma: 1.1,
|
||||
charisma: 1.05,
|
||||
factions: [FactionName.Volhaven],
|
||||
},
|
||||
// === E === //
|
||||
@@ -528,7 +528,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"A neural implant that enhances the user's ability to resonate with others. " +
|
||||
"It is capable of analyzing and interpreting the emotions of those nearby, allowing " +
|
||||
"the user to better understand and influence them.",
|
||||
charisma: 1.1,
|
||||
charisma: 1.05,
|
||||
crime_success: 1.1,
|
||||
work_money: 1.2,
|
||||
factions: [FactionName.SpeakersForTheDead],
|
||||
@@ -772,7 +772,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"An aural implant that enhances the user's ability to communicate and persuade others. " +
|
||||
"The implant uses a predictive model that lets the user say precisely what their audience " +
|
||||
"wants to hear. This implant is commonly used by many high-level executives and government officials.",
|
||||
charisma: 1.2,
|
||||
charisma: 1.1,
|
||||
charisma_exp: 1.3,
|
||||
factions: [FactionName.SpeakersForTheDead],
|
||||
},
|
||||
@@ -945,7 +945,6 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"Even though it contains no weapons, the advanced tungsten titanium " +
|
||||
"alloy increases the user's strength to unbelievable levels.",
|
||||
strength: 2.8,
|
||||
charisma: 1.4,
|
||||
factions: [FactionName.NWO],
|
||||
},
|
||||
[AugmentationName.HyperionV1]: {
|
||||
@@ -985,7 +984,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
dexterity: 1.4,
|
||||
hacking_speed: 1.03,
|
||||
hacking_money: 1.1,
|
||||
charisma: 1.05,
|
||||
charisma: 1.03,
|
||||
factions: [FactionName.BladeIndustries, FactionName.KuaiGongInternational],
|
||||
},
|
||||
// === I === //
|
||||
@@ -1033,7 +1032,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"cells, when powered, have a negative refractive index. As a result, they bend light " +
|
||||
"around the skin, making the user much harder to see with the naked eye.",
|
||||
agility: 1.05,
|
||||
charisma: 1.05,
|
||||
charisma: 1.03,
|
||||
crime_money: 1.1,
|
||||
factions: [FactionName.SlumSnakes, FactionName.Tetrads],
|
||||
},
|
||||
@@ -1057,7 +1056,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
repCost: 1.5e4,
|
||||
moneyCost: 2.5e8,
|
||||
info: "A cranial implant that increases the attractive force of the wearer. (Even its inventor isn't quite sure how it works).",
|
||||
charisma: 1.1,
|
||||
charisma: 1.05,
|
||||
company_rep: 1.1,
|
||||
factions: [FactionName.TheBlackHand, FactionName.TheDarkArmy],
|
||||
},
|
||||
@@ -1081,7 +1080,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"which improves its regenerative and extracellular homeostasis abilities.",
|
||||
strength: 1.2,
|
||||
defense: 1.2,
|
||||
charisma: 1.1,
|
||||
charisma: 1.05,
|
||||
factions: [
|
||||
FactionName.TheDarkArmy,
|
||||
FactionName.TheSyndicate,
|
||||
@@ -1134,7 +1133,6 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
hacking_speed: 1.02,
|
||||
hacking_chance: 1.1,
|
||||
hacking_exp: 1.12,
|
||||
charisma: 1.05,
|
||||
factions: [
|
||||
FactionName.TheBlackHand,
|
||||
FactionName.Chongqing,
|
||||
@@ -1294,7 +1292,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"the bloodstream to improve memory, increase focus, and provide other " +
|
||||
"cognitive enhancements.",
|
||||
company_rep: 1.2,
|
||||
charisma: 1.05,
|
||||
charisma: 1.03,
|
||||
factions: [
|
||||
FactionName.TianDiHui,
|
||||
FactionName.Volhaven,
|
||||
@@ -1432,7 +1430,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
strength: 1.4,
|
||||
defense: 1.4,
|
||||
agility: 1.4,
|
||||
charisma: 1.4,
|
||||
charisma: 1.2,
|
||||
factions: [FactionName.KuaiGongInternational],
|
||||
},
|
||||
[AugmentationName.PowerRecirculator]: {
|
||||
@@ -1462,7 +1460,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
info:
|
||||
"A cutting-edge knowledgebase entirely built off of nanotech rod-logic, training the user on social engineering. " +
|
||||
"Thought to be stolen technology, its existance has been a secret until recently.",
|
||||
charisma: 1.2,
|
||||
charisma: 1.1,
|
||||
charisma_exp: 1.4,
|
||||
factions: [FactionName.TheDarkArmy, FactionName.TheSyndicate],
|
||||
},
|
||||
@@ -1500,7 +1498,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
info:
|
||||
"Makes the wearer a better leader and mentor by greatly increasing their awareness of social dynamics. " +
|
||||
"Not actually a standard implant, but rather a series of training courses and seminars, led by a famous speaker named Denis.",
|
||||
charisma: 1.3,
|
||||
charisma: 1.1,
|
||||
company_rep: 1.3,
|
||||
factions: [FactionName.MegaCorp, FactionName.ECorp, FactionName.OmniTekIncorporated],
|
||||
},
|
||||
@@ -1528,7 +1526,6 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"criminal organizations and allows the user to project and control holographic " +
|
||||
"simulacrums within a large radius. These simulacrums are commonly used for " +
|
||||
"espionage and surveillance work.",
|
||||
charisma: 1.15,
|
||||
company_rep: 1.15,
|
||||
faction_rep: 1.15,
|
||||
factions: [FactionName.TheSyndicate, FactionName.TheDarkArmy, FactionName.SpeakersForTheDead],
|
||||
@@ -1743,7 +1740,6 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"Scientists have named these artificially enhanced units 'synfibrils'.",
|
||||
strength: 1.3,
|
||||
defense: 1.3,
|
||||
charisma: 1.15,
|
||||
factions: [
|
||||
FactionName.KuaiGongInternational,
|
||||
FactionName.FulcrumSecretTechnologies,
|
||||
@@ -1763,7 +1759,7 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
"more efficiently than an organic heart.",
|
||||
agility: 1.5,
|
||||
strength: 1.5,
|
||||
charisma: 1.5,
|
||||
charisma: 1.3,
|
||||
factions: [
|
||||
FactionName.KuaiGongInternational,
|
||||
FactionName.FulcrumSecretTechnologies,
|
||||
@@ -2042,8 +2038,8 @@ export const Augmentations: Record<AugmentationName, Augmentation> = (() => {
|
||||
info:
|
||||
"A connective brain implant that greatly increases the user's speech reaction time. " +
|
||||
"This allows the user to think faster and respond quicker in negotiations, and always have the last word.",
|
||||
charisma: 1.08,
|
||||
charisma_exp: 1.1,
|
||||
charisma: 1.03,
|
||||
charisma_exp: 1.05,
|
||||
company_rep: 1.05,
|
||||
factions: [FactionName.SlumSnakes, FactionName.BitRunners],
|
||||
},
|
||||
|
||||
@@ -93,3 +93,12 @@ export function finishBitNode() {
|
||||
}
|
||||
wd.backdoorInstalled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* BitNode level is not something that is stored, but rather calculated from the current BN and SF level. The concept
|
||||
* appeared because saying "Enter BN1.2" is shorter than saying "Enter BN1 with SF1.1". This is how we display it in the
|
||||
* BitVerse UI and other places. This function is used to consistently calculate this "level".
|
||||
*/
|
||||
export function getBitNodeLevel(bn = Player.bitNodeN, sfLevel = Player.activeSourceFileLvl(bn)): number {
|
||||
return Math.min(sfLevel + 1, bn === 12 ? Number.MAX_VALUE : 3);
|
||||
}
|
||||
|
||||
@@ -271,13 +271,13 @@ function IntelligenceOverride({
|
||||
disabled={!enabled}
|
||||
value={intelligenceOverride !== undefined ? intelligenceOverride : ""}
|
||||
onChange={(event) => {
|
||||
// Empty string will be automatically changed to "0".
|
||||
// Empty string will be automatically changed to "1".
|
||||
if (event.target.value === "") {
|
||||
callbacks.setIntelligenceOverride(0);
|
||||
callbacks.setIntelligenceOverride(1);
|
||||
return;
|
||||
}
|
||||
const value = Number.parseInt(event.target.value);
|
||||
if (!Number.isInteger(value) || value < 0) {
|
||||
if (!Number.isInteger(value) || value < 1) {
|
||||
return;
|
||||
}
|
||||
callbacks.setIntelligenceOverride(value);
|
||||
|
||||
@@ -20,7 +20,7 @@ import { StatsRow } from "../../ui/React/StatsRow";
|
||||
import { defaultMultipliers, getBitNodeMultipliers } from "../BitNode";
|
||||
import { BitNodeMultipliers } from "../BitNodeMultipliers";
|
||||
import { PartialRecord, getRecordEntries } from "../../Types/Record";
|
||||
import { canAccessBitNodeFeature } from "../BitNodeUtils";
|
||||
import { canAccessBitNodeFeature, getBitNodeLevel } from "../BitNodeUtils";
|
||||
|
||||
interface IProps {
|
||||
n: number;
|
||||
@@ -56,8 +56,7 @@ export const BitNodeMultipliersDisplay = ({ n, level, hideMultsIfCannotAccessFea
|
||||
// If not, then we have to assume that we want the next level up from the
|
||||
// current node's source file, so we get the min of that, the SF's max level,
|
||||
// or if it's BN12, ∞
|
||||
const maxSfLevel = n === 12 ? Number.MAX_VALUE : 3;
|
||||
const mults = getBitNodeMultipliers(n, level ?? Math.min(Player.activeSourceFileLvl(n) + 1, maxSfLevel));
|
||||
const mults = getBitNodeMultipliers(n, level ?? getBitNodeLevel(n));
|
||||
|
||||
return (
|
||||
<Box sx={{ columnCount: 2, columnGap: 1, mb: n === 1 ? 0 : -2 }}>
|
||||
|
||||
@@ -10,6 +10,7 @@ import Button from "@mui/material/Button";
|
||||
import { BitNodeMultiplierDescription } from "./BitnodeMultipliersDescription";
|
||||
import { BitNodeAdvancedOptions } from "./BitNodeAdvancedOptions";
|
||||
import { JSONMap } from "../../Types/Jsonable";
|
||||
import { getBitNodeLevel } from "../BitNodeUtils";
|
||||
|
||||
interface IProps {
|
||||
open: boolean;
|
||||
@@ -37,7 +38,7 @@ export function PortalModal(props: IProps): React.ReactElement {
|
||||
const bitNode = BitNodes[bitNodeKey];
|
||||
if (bitNode == null) throw new Error(`Could not find BitNode object for number: ${props.n}`);
|
||||
const maxSourceFileLevel = props.n === 12 ? "∞" : "3";
|
||||
const newLevel = Math.min(props.level + 1, props.n === 12 ? Number.MAX_VALUE : 3);
|
||||
const newLevel = getBitNodeLevel(props.n, props.level);
|
||||
|
||||
let currentSourceFiles = new Map(Player.sourceFiles);
|
||||
if (!props.flume) {
|
||||
|
||||
@@ -6,6 +6,8 @@ import { ActionClass, ActionParams } from "./Action";
|
||||
import { operationSkillSuccessBonus, operationTeamSuccessBonus } from "./Operation";
|
||||
import { getEnumHelper } from "../../utils/EnumHelper";
|
||||
import type { TeamActionWithCasualties } from "./TeamCasualties";
|
||||
import { constructorsForReviver, Generic_fromJSON, type IReviverValue } from "../../utils/JSONReviver";
|
||||
import { clampInteger } from "../../utils/helpers/clampNumber";
|
||||
|
||||
interface BlackOpParams {
|
||||
name: BladeburnerBlackOpName;
|
||||
@@ -32,11 +34,11 @@ export class BlackOperation extends ActionClass implements TeamActionWithCasualt
|
||||
return getEnumHelper("BladeburnerBlackOpName").isMember(name);
|
||||
}
|
||||
|
||||
constructor(params: ActionParams & BlackOpParams) {
|
||||
constructor(params: (ActionParams & BlackOpParams) | null = null) {
|
||||
super(params);
|
||||
this.name = params.name;
|
||||
this.reqdRank = params.reqdRank;
|
||||
this.n = params.n;
|
||||
this.name = params?.name ?? BladeburnerBlackOpName.OperationTyphoon;
|
||||
this.reqdRank = params?.reqdRank ?? 0;
|
||||
this.n = params?.n ?? 0;
|
||||
}
|
||||
|
||||
getAvailability(bladeburner: Bladeburner): Availability {
|
||||
@@ -65,4 +67,23 @@ export class BlackOperation extends ActionClass implements TeamActionWithCasualt
|
||||
getTeamSuccessBonus = operationTeamSuccessBonus;
|
||||
|
||||
getActionTypeSkillSuccessBonus = operationSkillSuccessBonus;
|
||||
|
||||
toJSON(): IReviverValue {
|
||||
return {
|
||||
ctor: "BlackOperation",
|
||||
data: {
|
||||
teamCount: this.teamCount,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
loadData(loadedObject: BlackOperation): void {
|
||||
this.teamCount = clampInteger(loadedObject.teamCount, 0);
|
||||
}
|
||||
|
||||
static fromJSON(value: IReviverValue): BlackOperation {
|
||||
return Generic_fromJSON(BlackOperation, value.data);
|
||||
}
|
||||
}
|
||||
|
||||
constructorsForReviver.BlackOperation = BlackOperation;
|
||||
|
||||
@@ -44,12 +44,18 @@ export function resolveTeamCasualties(action: TeamActionWithCasualties, team: Op
|
||||
*/
|
||||
const losses =
|
||||
minCasualties <= maxCasualties ? team.getTeamCasualtiesRoll(minCasualties, maxCasualties) : minCasualties;
|
||||
team.teamSize -= losses;
|
||||
if (team.teamSize < team.sleeveSize) {
|
||||
team.killRandomSupportingSleeves(team.sleeveSize - team.teamSize);
|
||||
// Calculate the new teamSize in a temporary variable and call the setter team.teamSize ONCE.
|
||||
// Note that it's important to call the setter only once; otherwise, the team count of each operation won't be reset
|
||||
// correctly.
|
||||
// For example, if _teamSize is 9 (1 team member + 8 support sleeves) and "losses" is 9, calling the setter with
|
||||
// (team.teamSize - losses) will set teamCount of ops/blackOps to 0 while it should be 8.
|
||||
let newTeamSize = team.teamSize - losses;
|
||||
if (newTeamSize < team.sleeveSize) {
|
||||
team.killRandomSupportingSleeves(team.sleeveSize - newTeamSize);
|
||||
// If this happens, all team members died and some sleeves took damage. In this case, teamSize = sleeveSize.
|
||||
team.teamSize = team.sleeveSize;
|
||||
newTeamSize = team.sleeveSize;
|
||||
}
|
||||
team.teamSize = newTeamSize;
|
||||
team.teamLost += losses;
|
||||
|
||||
return losses;
|
||||
|
||||
@@ -47,7 +47,7 @@ import { createContracts, loadContractsData } from "./data/Contracts";
|
||||
import { createOperations, loadOperationsData } from "./data/Operations";
|
||||
import { clampInteger, clampNumber } from "../utils/helpers/clampNumber";
|
||||
import { parseCommand } from "../Terminal/Parser";
|
||||
import { BlackOperations } from "./data/BlackOperations";
|
||||
import { createBlackOperations, loadBlackOperationsData } from "./data/BlackOperations";
|
||||
import { GeneralActions } from "./data/GeneralActions";
|
||||
import { PlayerObject } from "../PersonObjects/Player/PlayerObject";
|
||||
import { Sleeve } from "../PersonObjects/Sleeve/Sleeve";
|
||||
@@ -72,7 +72,31 @@ export class Bladeburner implements OperationTeam {
|
||||
skillPoints = 0;
|
||||
totalSkillPoints = 0;
|
||||
|
||||
teamSize = 0;
|
||||
/**
|
||||
* Do NOT directly read and write this field. You must use the getter/setter.
|
||||
* We use _teamSize instead of a private field #teamSize to reduce the complexity of saving/loading code.
|
||||
*/
|
||||
_teamSize = 0;
|
||||
get teamSize() {
|
||||
return this._teamSize;
|
||||
}
|
||||
set teamSize(value: number) {
|
||||
// Ensure teamSize is a non-negative integer.
|
||||
let newSize = value;
|
||||
if (!Number.isInteger(newSize) || newSize < 0) {
|
||||
newSize = 0;
|
||||
}
|
||||
// Early return if there is no change.
|
||||
if (this._teamSize === newSize) {
|
||||
return;
|
||||
}
|
||||
this._teamSize = newSize;
|
||||
// Reduce teamCount of actions if it's greater than the team size.
|
||||
for (const action of [...Object.values(this.operations), ...Object.values(this.blackOperations)]) {
|
||||
action.teamCount = Math.min(action.teamCount, this._teamSize);
|
||||
}
|
||||
}
|
||||
|
||||
get sleeveSize() {
|
||||
return Player.sleevesSupportingBladeburner().length;
|
||||
}
|
||||
@@ -96,9 +120,13 @@ export class Bladeburner implements OperationTeam {
|
||||
staminaBonus = 0;
|
||||
maxStamina = 1;
|
||||
stamina = 1;
|
||||
// Contracts and operations are stored on the Bladeburner object even though they are global so that they can utilize save/load of the main bladeburner object
|
||||
// Contracts, operations and blackOps are stored on the Bladeburner object even though they are global so that they
|
||||
// can utilize save/load of the main bladeburner object
|
||||
contracts: Record<BladeburnerContractName, Contract>;
|
||||
operations: Record<BladeburnerOperationName, Operation>;
|
||||
blackOperations: Record<BladeburnerBlackOpName, BlackOperation>;
|
||||
// Array for quick lookup by BlackOp number
|
||||
blackOperationArray: BlackOperation[];
|
||||
numBlackOpsComplete = 0;
|
||||
logging = {
|
||||
general: true,
|
||||
@@ -119,6 +147,11 @@ export class Bladeburner implements OperationTeam {
|
||||
constructor() {
|
||||
this.contracts = createContracts();
|
||||
this.operations = createOperations();
|
||||
this.blackOperations = createBlackOperations();
|
||||
this.blackOperationArray = Object.values(this.blackOperations).sort((a, b) => (a.n < b.n ? -1 : 1));
|
||||
if (!this.blackOperationArray.every((blackOp, i) => blackOp.n === i)) {
|
||||
throw new Error("blackOperationArray is not initialized with correct indices");
|
||||
}
|
||||
}
|
||||
|
||||
// Initialization code that is dependent on Player is here instead of in the constructor
|
||||
@@ -1407,7 +1440,7 @@ export class Bladeburner implements OperationTeam {
|
||||
case BladeburnerActionType.Operation:
|
||||
return this.operations[actionId.name];
|
||||
case BladeburnerActionType.BlackOp:
|
||||
return BlackOperations[actionId.name];
|
||||
return this.blackOperations[actionId.name];
|
||||
case BladeburnerActionType.General:
|
||||
return GeneralActions[actionId.name];
|
||||
}
|
||||
@@ -1426,7 +1459,7 @@ export class Bladeburner implements OperationTeam {
|
||||
case BladeburnerActionType.Operation:
|
||||
return this.operations[name as BladeburnerOperationName];
|
||||
case BladeburnerActionType.BlackOp:
|
||||
return BlackOperations[name as BladeburnerBlackOpName];
|
||||
return this.blackOperations[name as BladeburnerBlackOpName];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1437,9 +1470,11 @@ export class Bladeburner implements OperationTeam {
|
||||
return id ? this.getActionObject(id) : null;
|
||||
}
|
||||
|
||||
static keysToSave = getKeyList(Bladeburner, { removedKeys: ["skillMultipliers"] });
|
||||
static keysToSave = getKeyList(Bladeburner, { removedKeys: ["skillMultipliers", "blackOperationArray"] });
|
||||
// Don't load contracts or operations because of the special loading method they use, see fromJSON
|
||||
static keysToLoad = getKeyList(Bladeburner, { removedKeys: ["skillMultipliers", "contracts", "operations"] });
|
||||
static keysToLoad = getKeyList(Bladeburner, {
|
||||
removedKeys: ["skillMultipliers", "contracts", "operations", "blackOperations", "blackOperationArray"],
|
||||
});
|
||||
|
||||
/** Serialize the current object to a JSON save state. */
|
||||
toJSON(): IReviverValue {
|
||||
@@ -1449,9 +1484,10 @@ export class Bladeburner implements OperationTeam {
|
||||
/** Initializes a Bladeburner object from a JSON save state. */
|
||||
static fromJSON(value: IReviverValue): Bladeburner {
|
||||
assertObject(value.data);
|
||||
// operations and contracts are not loaded directly from the save, we load them in using a different method
|
||||
// Contracts, operations, and black ops are not loaded directly from the save; they are loaded via a different method.
|
||||
const contractsData = value.data.contracts;
|
||||
const operationsData = value.data.operations;
|
||||
const blackOperationsData = value.data.blackOperations;
|
||||
const bladeburner = Generic_fromJSON(Bladeburner, value.data, Bladeburner.keysToLoad);
|
||||
|
||||
/**
|
||||
@@ -1472,10 +1508,11 @@ export class Bladeburner implements OperationTeam {
|
||||
bladeburner.automateActionLow = loadActionIdentifier(bladeburner.automateActionLow);
|
||||
}
|
||||
}
|
||||
// Loading this way allows better typesafety and also allows faithfully reconstructing contracts/operations
|
||||
// Loading this way allows better typesafety and also allows faithfully reconstructing contracts/operations/blackOps
|
||||
// even from save data that is missing a lot of static info about the objects.
|
||||
loadContractsData(contractsData, bladeburner.contracts);
|
||||
loadOperationsData(operationsData, bladeburner.operations);
|
||||
loadBlackOperationsData(blackOperationsData, bladeburner.blackOperations);
|
||||
// Regenerate skill multiplier data, which is not included in savedata
|
||||
bladeburner.updateSkillMultipliers();
|
||||
// If stamina or maxStamina is invalid, we set both of them to 1 and recalculate them.
|
||||
@@ -1488,6 +1525,10 @@ export class Bladeburner implements OperationTeam {
|
||||
bladeburner.maxStamina = 1;
|
||||
bladeburner.calculateMaxStamina();
|
||||
}
|
||||
// "_teamSize" was "teamSize" in pre-v3 versions.
|
||||
if ("teamSize" in value.data && Number.isFinite(value.data.teamSize)) {
|
||||
bladeburner.teamSize = value.data.teamSize as number;
|
||||
}
|
||||
return bladeburner;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -113,7 +113,9 @@ export function createContracts(): Record<BladeburnerContractName, Contract> {
|
||||
export function loadContractsData(data: unknown, contracts: Record<BladeburnerContractName, Contract>) {
|
||||
// loading data as "unknown" and typechecking it down is probably not necessary
|
||||
// but this will prevent crashes even with malformed savedata
|
||||
if (!data || typeof data !== "object") return;
|
||||
if (data == null || typeof data !== "object" || Array.isArray(data)) {
|
||||
return;
|
||||
}
|
||||
assertLoadingType<Record<BladeburnerContractName, unknown>>(data);
|
||||
for (const contractName of Object.values(BladeburnerContractName)) {
|
||||
const loadedContract = data[contractName];
|
||||
|
||||
@@ -230,7 +230,9 @@ export function createOperations(): Record<BladeburnerOperationName, Operation>
|
||||
export function loadOperationsData(data: unknown, operations: Record<BladeburnerOperationName, Operation>) {
|
||||
// loading data as "unknown" and typechecking it down is probably not necessary
|
||||
// but this will prevent crashes even with malformed savedata
|
||||
if (!data || typeof data !== "object") return;
|
||||
if (data == null || typeof data !== "object" || Array.isArray(data)) {
|
||||
return;
|
||||
}
|
||||
assertLoadingType<Record<BladeburnerOperationName, unknown>>(data);
|
||||
for (const operationName of Object.values(BladeburnerOperationName)) {
|
||||
const loadedOperation = data[operationName];
|
||||
|
||||
@@ -7,7 +7,7 @@ import { BlackOpElem } from "./BlackOpElem";
|
||||
import { Router } from "../../ui/GameRoot";
|
||||
import { Page } from "../../ui/Router";
|
||||
import { CorruptibleText } from "../../ui/React/CorruptibleText";
|
||||
import { blackOpsArray } from "../data/BlackOperations";
|
||||
import { numberOfBlackOperations } from "../data/BlackOperations";
|
||||
import { finishBitNode } from "../../BitNode/BitNodeUtils";
|
||||
import { Player } from "@player";
|
||||
|
||||
@@ -16,7 +16,7 @@ interface BlackOpPageProps {
|
||||
}
|
||||
|
||||
export function BlackOpPage({ bladeburner }: BlackOpPageProps): React.ReactElement {
|
||||
const blackOperations = blackOpsArray.slice(0, bladeburner.numBlackOpsComplete + 1).reverse();
|
||||
const blackOperations = bladeburner.blackOperationArray.slice(0, bladeburner.numBlackOpsComplete + 1).reverse();
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -36,11 +36,11 @@ export function BlackOpPage({ bladeburner }: BlackOpPageProps): React.ReactEleme
|
||||
Unaffected by Charisma.
|
||||
</Typography>
|
||||
|
||||
{bladeburner.numBlackOpsComplete >= blackOpsArray.length && (
|
||||
{bladeburner.numBlackOpsComplete >= numberOfBlackOperations && (
|
||||
<Button
|
||||
sx={{ my: 1, p: 1 }}
|
||||
onClick={() => {
|
||||
if (!Player.bladeburner || Player.bladeburner.numBlackOpsComplete < blackOpsArray.length) {
|
||||
if (!Player.bladeburner || Player.bladeburner.numBlackOpsComplete < numberOfBlackOperations) {
|
||||
return;
|
||||
}
|
||||
finishBitNode();
|
||||
|
||||
@@ -3,7 +3,7 @@ import type { Bladeburner } from "../Bladeburner";
|
||||
import React, { useMemo } from "react";
|
||||
import { CopyableText } from "../../ui/React/CopyableText";
|
||||
import { formatBigNumber } from "../../ui/formatNumber";
|
||||
import { Box, IconButton, Paper, Typography } from "@mui/material";
|
||||
import { Box, IconButton, Paper, Tooltip, Typography } from "@mui/material";
|
||||
import AddIcon from "@mui/icons-material/Add";
|
||||
import CloseIcon from "@mui/icons-material/Close";
|
||||
import { Skill } from "../Skill";
|
||||
@@ -18,10 +18,8 @@ export function SkillElem({ skill, bladeburner, onUpgrade }: SkillElemProps): Re
|
||||
const skillName = skill.name;
|
||||
const skillLevel = bladeburner.getSkillLevel(skillName);
|
||||
const pointCost = useMemo(() => skill.calculateCost(skillLevel), [skill, skillLevel]);
|
||||
// No need to support "+1" button when the skill level reaches Number.MAX_SAFE_INTEGER.
|
||||
const isSupported = skillLevel < Number.MAX_SAFE_INTEGER;
|
||||
// Use skill.canUpgrade() instead of reimplementing all conditional checks.
|
||||
const canLevel = isSupported && skill.canUpgrade(bladeburner, 1).available;
|
||||
const check = skill.canUpgrade(bladeburner, 1);
|
||||
/**
|
||||
* maxLvl is only useful when we check if we should show "MAX LEVEL". For the check of the icon button, we don't need
|
||||
* it. This condition is checked in skill.canUpgrade().
|
||||
@@ -37,10 +35,14 @@ export function SkillElem({ skill, bladeburner, onUpgrade }: SkillElemProps): Re
|
||||
<Paper sx={{ my: 1, p: 1 }}>
|
||||
<Box display="flex" flexDirection="row" alignItems="center">
|
||||
<CopyableText variant="h6" color="primary" value={skillName} />
|
||||
{!canLevel ? (
|
||||
<IconButton disabled>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
{!check.available ? (
|
||||
<Tooltip title={check.error}>
|
||||
<span>
|
||||
<IconButton disabled>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
</span>
|
||||
</Tooltip>
|
||||
) : (
|
||||
<IconButton onClick={onClick}>
|
||||
<AddIcon />
|
||||
@@ -51,7 +53,7 @@ export function SkillElem({ skill, bladeburner, onUpgrade }: SkillElemProps): Re
|
||||
{maxLvl ? (
|
||||
<Typography>MAX LEVEL</Typography>
|
||||
) : (
|
||||
<Typography>Skill Points required: {isSupported ? formatBigNumber(pointCost) : "N/A"}</Typography>
|
||||
<Typography>Skill Points required: {formatBigNumber(pointCost)}</Typography>
|
||||
)}
|
||||
<Typography>{skill.desc}</Typography>
|
||||
</Paper>
|
||||
|
||||
@@ -15,25 +15,26 @@ interface TeamSizeModalProps {
|
||||
}
|
||||
|
||||
export function TeamSizeModal({ bladeburner, action, open, onClose }: TeamSizeModalProps): React.ReactElement {
|
||||
const [teamSize, setTeamSize] = useState<number | undefined>();
|
||||
const [teamSize, setTeamSize] = useState(0);
|
||||
|
||||
function confirmTeamSize(event: React.FormEvent): void {
|
||||
// Prevent reloading page when submitting form
|
||||
event.preventDefault();
|
||||
if (teamSize === undefined) return;
|
||||
const num = Math.round(teamSize);
|
||||
if (isNaN(num) || num < 0) {
|
||||
dialogBoxCreate("Invalid value entered for number of Team Members (must be numeric and non-negative)");
|
||||
} else {
|
||||
action.teamCount = num;
|
||||
if (!Number.isInteger(teamSize) || teamSize < 0) {
|
||||
dialogBoxCreate("Invalid value entered for number of Team Members (must be a non-negative integer)");
|
||||
return;
|
||||
}
|
||||
action.teamCount = teamSize;
|
||||
onClose();
|
||||
}
|
||||
|
||||
function onTeamSize(event: React.ChangeEvent<HTMLInputElement>): void {
|
||||
const x = parseFloat(event.target.value);
|
||||
if (x > bladeburner.teamSize) setTeamSize(bladeburner.teamSize);
|
||||
else setTeamSize(x);
|
||||
const newTeamSize = Number(event.target.value);
|
||||
if (newTeamSize > bladeburner.teamSize) {
|
||||
setTeamSize(bladeburner.teamSize);
|
||||
} else {
|
||||
setTeamSize(newTeamSize);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
+59
-5
@@ -4,10 +4,10 @@
|
||||
* Constants for specific mechanics or features will NOT be here.
|
||||
*/
|
||||
export const CONSTANTS = {
|
||||
VersionString: "3.0.0dev",
|
||||
isDevBranch: true,
|
||||
VersionString: "3.0.0",
|
||||
isDevBranch: false,
|
||||
isInTestEnvironment: globalThis.process?.env?.JEST_WORKER_ID !== undefined,
|
||||
VersionNumber: 48,
|
||||
VersionNumber: 50,
|
||||
|
||||
/** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
|
||||
* and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
|
||||
@@ -111,7 +111,7 @@ export const CONSTANTS = {
|
||||
|
||||
// Also update Documentation/doc/en/changelog.md when appropriate (when doing a release)
|
||||
LatestUpdate: `
|
||||
## v3.0.0 development version: last updated 18 February 2026
|
||||
## v3.0.0 Release: 1 May 2026
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
@@ -143,13 +143,15 @@ export const CONSTANTS = {
|
||||
- Cancel sleeve's current task when calling ns.sleeve.travel() (#2559) (@catloversg)
|
||||
- Make ns.cloud.purchaseServer() and ns.cloud.deleteServer() use hostname as provided (#2560) (@catloversg)
|
||||
- Make implicit string conversion consistent across all coding contracts (#2608) (@catloversg)
|
||||
- Rename ns.gang.getOtherGangInformation to getAllGangInformation (#2635) (@lstutzman)
|
||||
- Standardize "nextCompletion" promise in tasks (#2687) (@catloversg)
|
||||
|
||||
### MAJOR CHANGES
|
||||
|
||||
- Added Darknet, a new mechanic based on spreading through an unstable network and cracking passwords. Purchase DarkscapeNavigator.exe in the terminal to unlock access. (#2139) (@ficocelliguy)
|
||||
- Balance change: IPvGO: Improve favor gain from wins to balance around the rep value of favor (#2131) (@ficocelliguy)
|
||||
- Search and read NS API docs in editor tab and documentation tab (#2163) (@catloversg)
|
||||
- Balance change: Infiltration: Rebalance rewards, add min stat requirement, add market demand (#2210) (@ficocelliguy, @d0sboots, @catloversg)
|
||||
- Add Dark Net (#2139) (@ficocelliguy)
|
||||
|
||||
### UI
|
||||
|
||||
@@ -224,6 +226,14 @@ export const CONSTANTS = {
|
||||
- Fix: Import save comparison popup shows wrong BN level (#2595) (@catloversg)
|
||||
- Fix: Cannot type in text boxes rendered by players' scripts when terminal tab is shown (#2615, #2622) (@lstutzman, @catloversg)
|
||||
- Navigate to gym/university instead of city when stopping focusing on gym/class work (#2613) (@lstutzman)
|
||||
- Ensure prompts shown by ns.prompt do not lose focus in the terminal tab (#2631) (@catloversg)
|
||||
- Remove unnecessary max-width of tab list in in-game editor (#2643) (@catloversg)
|
||||
- Add hooks to sidebar for players to attach custom content (#2651) (@catloversg)
|
||||
- Use exponential notation when formatting very small HP or thread values (#2656) (@catloversg)
|
||||
- Show effective amount of shared RAM when using UI (#2691) (@catloversg)
|
||||
- Use "success" theme color for low infiltration difficulty instead of "primary" (#2693) (@catloversg)
|
||||
- Reload immediately after importing, deleting save data or killing all scripts (#2697) (@catloversg)
|
||||
- Activate recovery mode on critical BN prestige bugs (#2699) (@catloversg)
|
||||
|
||||
### MISC
|
||||
|
||||
@@ -325,6 +335,20 @@ export const CONSTANTS = {
|
||||
- Dnet: Remove packet capture (#2594) (@ficocelliguy)
|
||||
- Generate more frequent and lower-reward coding contracts (#2603) (@ficocelliguy)
|
||||
- Electron: Fix issues in edge cases of using --export-save (#2590) (@catloversg)
|
||||
- Fix recursive alias detection causing infinite recursion (#2610) (@lstutzman)
|
||||
- Add "hidden" mkdir command (#2646) (@catloversg)
|
||||
- Dnet: Remove bonus time effect on authentication and heartbleed speed; fix ram rounding (#2627) (@ficocelliguy)
|
||||
- Fix tab completion for multi-word quoted autocomplete options (#2612) (@lstutzman)
|
||||
- Add weakenEffect to formulas.hacking namespace (#2626) (@lstutzman)
|
||||
- Update description of "cat" in "help" command (#2654) (@catloversg)
|
||||
- Reduce achievements check interval (#2650) (@catloversg)
|
||||
- Fix: calculateExp throws errors in edge cases (#2667) (@catloversg)
|
||||
- Clear recent scripts when installing augmentations (#2670) (@Mathekatze)
|
||||
- Better error message for port serialization failure (#2688) (@d0sboots)
|
||||
- Adjust charisma augmentation power (#2698) (@ficocelliguy)
|
||||
- Clarify what "backdoor" does in "help" command (#2694) (@abbyintheattic)
|
||||
- Fix: Hacknet upgrade cost formulas ignore upgrade level when enforcing max level (#2696) (@lucebac)
|
||||
- Improve error messages for invalid module parsing (#2707) (@catloversg)
|
||||
|
||||
### DOCUMENTATION
|
||||
|
||||
@@ -378,6 +402,10 @@ export const CONSTANTS = {
|
||||
- Update mention of outdated getStockForecast API (#2578) (@catloversg)
|
||||
- Fix newline issues in IPvGO docs and add missing RAM cost (#2602) (@catloversg)
|
||||
- Document coding contract's generation and rewards (#2624) (@catloversg)
|
||||
- Clarify scp and exec darknet permissions in API docs (#2634) (@lstutzman)
|
||||
- Update RAM cost of hacknet APIs and remove unnecessary RAM cost docs (#2639) (@catloversg)
|
||||
- Update tutorial script for buying cloud servers (#2653) (@catloversg)
|
||||
- Improve coding contract documentation (#2689) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - UI
|
||||
|
||||
@@ -389,6 +417,11 @@ export const CONSTANTS = {
|
||||
- Prevent ending BNs through reuse of Bladeburner UI event handler (#2574) (@catloversg)
|
||||
- Always show Black Operations list (#2592) (@catloversg)
|
||||
- Show hints of Sleeves mechanic in pre-endgame (#2605) (@catloversg)
|
||||
- Consistently calculate BitNode "level" (#2645) (@catloversg)
|
||||
- Add tooltips explaining why Bladeburner skill upgrades are disabled (#2648) (@catloversg)
|
||||
- Add button to open Faction page from Gang UI (#2655) (@catloversg)
|
||||
- Ensure intelligence override is a positive integer (#2673) (@catloversg)
|
||||
- Remove max width of corporation division list (#2686) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - MISC
|
||||
|
||||
@@ -416,6 +449,18 @@ export const CONSTANTS = {
|
||||
- Add APIs to get rank gain and rank loss of an action (#2572) (@catloversg)
|
||||
- Reduce RAM cost of inGang and inBladeburner APIs (#2582) (@catloversg)
|
||||
- Fix skillMaxUpgradeCount returning 1 at extreme skill levels (#2611) (@lstutzman)
|
||||
- API: Expose charged effects of Stanek's Gift active fragments (#2638) (@catloversg)
|
||||
- Apply SF override to charisma calculations (#2642) (@catloversg)
|
||||
- Update description of "BN9: Challenge" achievement (#2647) (@catloversg)
|
||||
- Fix: Intelligence data is incorrectly migrated when Intelligence is not unlocked (#2660, #2666) (@catloversg)
|
||||
- Restrict team count of Ops/BlackOps to total team size (#2672) (@catloversg)
|
||||
- Fix: DarkscapeNavigator program is not granted on BN prestige when having SF15 (#2690) (@catloversg)
|
||||
- Prevent duplicate processing of boost materials (#2695) (@catloversg)
|
||||
- Update error message of ns.singularity.joinFaction (#2700) (@catloversg)
|
||||
- Update RAM cost of nextUpdate and similar APIs (#2702) (@catloversg)
|
||||
- Update description of "You and what army?" achievement (#2703) (@catloversg)
|
||||
- Rework material production limit (#2683) (@catloversg)
|
||||
- Remove references to "sudo.Assist" research (#2709) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - DOCUMENTATION
|
||||
|
||||
@@ -519,5 +564,14 @@ export const CONSTANTS = {
|
||||
- Refactor and fix issues in db.ts (#2623) (@catloversg)
|
||||
- Add dependency array to TerminalInput keydown useEffect (#2620) (@lstutzman)
|
||||
- Add dependency array to GameRoot useEffect (#2617) (@lstutzman)
|
||||
- Dev menu: Initialize dark net data when setting SF15 level (#2632) (@catloversg)
|
||||
- Use type-only imports in ArrayHelpers.ts (#2630) (@catloversg)
|
||||
- Remove redundant "$" from JS/TS regex in webpack config (#2649) (@catloversg)
|
||||
- Allow specifying commit hash id when building artifacts (#2652) (@catloversg)
|
||||
- Fix passive event listener warning (#2671) (@catloversg)
|
||||
- Ignore .DS_Store files when generating pages.ts (#2685) (@catloversg)
|
||||
- Consistently check when to show intelligence skill (#2692) (@catloversg)
|
||||
- Fix api-extractor warnings (#2701) (@catloversg)
|
||||
- Add comments explaining redundant check in product calculation (#2705) (@catloversg)
|
||||
`,
|
||||
} as const;
|
||||
|
||||
+38
-44
@@ -215,32 +215,25 @@ export class Division {
|
||||
}
|
||||
}
|
||||
|
||||
// Process change in demand and competition for this industry's materials
|
||||
// Process demand, competition, and market price changes for this division's materials
|
||||
processMaterialMarket(): void {
|
||||
//References to prodMats and reqMats
|
||||
const reqMats = this.requiredMaterials,
|
||||
prodMats = this.producedMaterials;
|
||||
// Relevant materials:
|
||||
// - All materials this division requires or produces
|
||||
// - Boost materials
|
||||
const materials = new Set([
|
||||
...getRecordKeys(this.requiredMaterials),
|
||||
...this.producedMaterials,
|
||||
...corpConstants.boostMaterials,
|
||||
]);
|
||||
|
||||
//Only 'process the market' for materials that this industry deals with
|
||||
for (const city of Object.values(CityName)) {
|
||||
//If this industry has a warehouse in this city, process the market
|
||||
//for every material this industry requires or produces
|
||||
if (this.warehouses[city]) {
|
||||
const wh = this.warehouses[city];
|
||||
for (const name of Object.keys(reqMats) as CorpMaterialName[]) {
|
||||
if (Object.hasOwn(reqMats, name)) {
|
||||
wh.materials[name].processMarket();
|
||||
}
|
||||
}
|
||||
|
||||
//Produced materials are stored in an array
|
||||
for (const matName of prodMats) wh.materials[matName].processMarket();
|
||||
|
||||
//Process these twice because these boost production ??????
|
||||
wh.materials.Hardware.processMarket();
|
||||
wh.materials.Robots.processMarket();
|
||||
wh.materials["AI Cores"].processMarket();
|
||||
wh.materials["Real Estate"].processMarket();
|
||||
const warehouse = this.warehouses[city];
|
||||
// If this division has a warehouse in this city, process the relevant materials
|
||||
if (warehouse == null) {
|
||||
continue;
|
||||
}
|
||||
for (const materialName of materials) {
|
||||
warehouse.materials[materialName].processMarket();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -592,20 +585,16 @@ export class Division {
|
||||
|
||||
/* Process production of materials */
|
||||
if (this.producedMaterials.length > 0) {
|
||||
const mat = warehouse.materials[this.producedMaterials[0]];
|
||||
//Calculate the maximum production of this material based
|
||||
//on the office's productivity
|
||||
const maxProd =
|
||||
this.getOfficeProductivity(office) *
|
||||
this.productionMult * // Multiplier from materials
|
||||
this.productionMult * // Multiplier from boost materials
|
||||
corporation.getProductionMultiplier() *
|
||||
this.getProductionMultiplier(); // Multiplier from Research
|
||||
let prod;
|
||||
|
||||
// If there is a limit set on production, apply the limit
|
||||
prod = mat.productionLimit === null ? maxProd : Math.min(maxProd, mat.productionLimit);
|
||||
|
||||
prod *= corpConstants.secondsPerMarketCycle * marketCycles; //Convert production from per second to per market cycle
|
||||
// Convert production from per second to per market cycle
|
||||
let prod = maxProd * corpConstants.secondsPerMarketCycle * marketCycles;
|
||||
|
||||
// Calculate net change in warehouse storage making the produced materials will cost
|
||||
let totalMatSize = 0;
|
||||
@@ -677,6 +666,14 @@ export class Division {
|
||||
}
|
||||
avgQlt = Math.max(avgQlt, 1);
|
||||
for (let j = 0; j < this.producedMaterials.length; ++j) {
|
||||
let outputAmount = prod * producableFrac;
|
||||
const productionLimit = warehouse.materials[this.producedMaterials[j]].productionLimit;
|
||||
if (productionLimit !== null) {
|
||||
// productionLimit is per second, so we need to convert it to per market cycle.
|
||||
const effectiveLimitValue = productionLimit * corpConstants.secondsPerMarketCycle * marketCycles;
|
||||
outputAmount = Math.min(outputAmount, effectiveLimitValue);
|
||||
}
|
||||
|
||||
let tempQlt =
|
||||
office.employeeProductionByJob[CorpEmployeeJob.Engineer] / 90 +
|
||||
Math.pow(this.researchPoints, this.researchFactor) +
|
||||
@@ -687,27 +684,24 @@ export class Division {
|
||||
1,
|
||||
(warehouse.materials[this.producedMaterials[j]].quality *
|
||||
warehouse.materials[this.producedMaterials[j]].stored +
|
||||
tempQlt * prod * producableFrac) /
|
||||
(warehouse.materials[this.producedMaterials[j]].stored + prod * producableFrac),
|
||||
tempQlt * outputAmount) /
|
||||
(warehouse.materials[this.producedMaterials[j]].stored + outputAmount),
|
||||
);
|
||||
warehouse.materials[this.producedMaterials[j]].averagePrice =
|
||||
(warehouse.materials[this.producedMaterials[j]].averagePrice *
|
||||
warehouse.materials[this.producedMaterials[j]].stored +
|
||||
warehouse.materials[this.producedMaterials[j]].marketPrice * prod * producableFrac) /
|
||||
(warehouse.materials[this.producedMaterials[j]].stored + prod * producableFrac);
|
||||
warehouse.materials[this.producedMaterials[j]].stored += prod * producableFrac;
|
||||
warehouse.materials[this.producedMaterials[j]].marketPrice * outputAmount) /
|
||||
(warehouse.materials[this.producedMaterials[j]].stored + outputAmount);
|
||||
|
||||
warehouse.materials[this.producedMaterials[j]].stored += outputAmount;
|
||||
warehouse.materials[this.producedMaterials[j]].productionAmount =
|
||||
outputAmount / (corpConstants.secondsPerMarketCycle * marketCycles);
|
||||
}
|
||||
} else {
|
||||
for (const reqMatName of getRecordKeys(this.requiredMaterials)) {
|
||||
warehouse.materials[reqMatName].productionAmount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//Per second
|
||||
const materialProduction = (prod * producableFrac) / (corpConstants.secondsPerMarketCycle * marketCycles);
|
||||
for (const prodMatName of this.producedMaterials) {
|
||||
warehouse.materials[prodMatName].productionAmount = materialProduction;
|
||||
}
|
||||
} else {
|
||||
//If this doesn't produce any materials, then it only creates
|
||||
//Products. Creating products will consume materials. The
|
||||
@@ -860,12 +854,12 @@ export class Division {
|
||||
if (!warehouse) continue;
|
||||
switch (state) {
|
||||
case "PRODUCTION": {
|
||||
//Calculate the maximum production of this material based
|
||||
//Calculate the maximum production of this product based
|
||||
//on the office's productivity
|
||||
const maxProd =
|
||||
this.getOfficeProductivity(office, { forProduct: true }) *
|
||||
corporation.getProductionMultiplier() *
|
||||
this.productionMult * // Multiplier from materials
|
||||
this.productionMult * // Multiplier from boost materials
|
||||
this.getProductionMultiplier() * // Multiplier from research
|
||||
this.getProductProductionMultiplier(); // Multiplier from research
|
||||
let prod;
|
||||
@@ -879,12 +873,12 @@ export class Division {
|
||||
}
|
||||
prod *= corpConstants.secondsPerMarketCycle * marketCycles;
|
||||
|
||||
// The "netStorageSize" check is redundant, but retained in case the product size calculation changes.
|
||||
//Calculate net change in warehouse storage making the Products will cost
|
||||
let netStorageSize = product.size;
|
||||
for (const [reqMatName, reqQty] of getRecordEntries(product.requiredMaterials)) {
|
||||
netStorageSize -= MaterialInfo[reqMatName].size * reqQty;
|
||||
}
|
||||
|
||||
//If there's not enough space in warehouse, limit the amount of Product
|
||||
if (netStorageSize > 0) {
|
||||
const maxAmt = Math.floor((warehouse.size - warehouse.sizeUsed) / netStorageSize);
|
||||
|
||||
@@ -19,7 +19,7 @@ import {
|
||||
CorpBaseResearchName,
|
||||
CorpProductResearchName,
|
||||
} from "@enums";
|
||||
import { PositiveInteger } from "../../types";
|
||||
import type { PositiveInteger } from "../../types";
|
||||
|
||||
/** Names of all corporation game states */
|
||||
export const stateNames: CorpStateName[] = ["START", "PURCHASE", "PRODUCTION", "EXPORT", "SALE"],
|
||||
@@ -30,6 +30,8 @@ export const stateNames: CorpStateName[] = ["START", "PURCHASE", "PRODUCTION", "
|
||||
industryNames: CorpIndustryName[] = Object.values(IndustryType),
|
||||
/** Names of all materials */
|
||||
materialNames: APIMaterialName[] = Object.values(CorpMaterialName),
|
||||
/** Names of all boost materials */
|
||||
boostMaterials: CorpMaterialName[] = ["Hardware", "Robots", "AI Cores", "Real Estate"],
|
||||
/** Names of all one-time corporation-wide unlocks */
|
||||
unlockNames: APIUnlockName[] = Object.values(CorpUnlockName),
|
||||
upgradeNames: APIUpgradeName[] = Object.values(CorpUpgradeName),
|
||||
|
||||
@@ -27,7 +27,7 @@ export function CorporationRoot(): React.ReactElement {
|
||||
|
||||
return (
|
||||
<Context.Corporation.Provider value={corporation}>
|
||||
<Tabs variant="scrollable" value={divisionName} onChange={handleChange} sx={{ maxWidth: "65vw" }} scrollButtons>
|
||||
<Tabs variant="scrollable" value={divisionName} onChange={handleChange} scrollButtons>
|
||||
<Tab label={corporation.name} value={"Overview"} />
|
||||
{[...corporation.divisions.values()].map((div) => (
|
||||
<Tab key={div.name} label={div.name} value={div.name} />
|
||||
|
||||
@@ -73,6 +73,7 @@ function WarehouseRoot(props: WarehouseProps): React.ReactElement {
|
||||
const isInStock = props.warehouse.materials[matName].stored > 0;
|
||||
const isRelevant = isRelevantMaterial(matName, division);
|
||||
if (!isInStock && !isRelevant) continue;
|
||||
const isOutputMaterial = division.producedMaterials.includes(matName);
|
||||
mats.push(
|
||||
<MaterialElem
|
||||
rerender={props.rerender}
|
||||
@@ -80,6 +81,7 @@ function WarehouseRoot(props: WarehouseProps): React.ReactElement {
|
||||
key={matName}
|
||||
mat={props.warehouse.materials[matName]}
|
||||
warehouse={props.warehouse}
|
||||
isOutputMaterial={isOutputMaterial}
|
||||
/>,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
import { CorpMaterialName } from "@nsdefs";
|
||||
import { Division } from "../Division";
|
||||
import { boostMaterials } from "../data/Constants";
|
||||
|
||||
// Returns a boolean indicating whether the given material is relevant for the
|
||||
// current industry.
|
||||
export function isRelevantMaterial(matName: CorpMaterialName, division: Division): boolean {
|
||||
// Materials that affect Production multiplier
|
||||
const prodMultiplierMats: CorpMaterialName[] = ["Hardware", "Robots", "AI Cores", "Real Estate"];
|
||||
|
||||
if (Object.keys(division.requiredMaterials).includes(matName)) return true;
|
||||
if (division.producedMaterials.includes(matName)) return true;
|
||||
if (prodMultiplierMats.includes(matName)) return true;
|
||||
if (boostMaterials.includes(matName)) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ interface IMaterialProps {
|
||||
city: CityName;
|
||||
mat: Material;
|
||||
rerender: () => void;
|
||||
isOutputMaterial: boolean;
|
||||
}
|
||||
|
||||
// Creates the UI for a single Material type
|
||||
@@ -74,7 +75,7 @@ export function MaterialElem(props: IMaterialProps): React.ReactElement {
|
||||
}
|
||||
|
||||
// Limit Production button
|
||||
let limitMaterialButtonText = "Limit Material";
|
||||
let limitMaterialButtonText = "Limit Material Production";
|
||||
if (mat.productionLimit !== null) {
|
||||
limitMaterialButtonText += " (" + formatCorpStat(mat.productionLimit) + ")";
|
||||
}
|
||||
@@ -158,14 +159,18 @@ export function MaterialElem(props: IMaterialProps): React.ReactElement {
|
||||
open={sellMaterialOpen}
|
||||
onClose={() => setSellMaterialOpen(false)}
|
||||
/>
|
||||
<Button color={tutorial ? "error" : "primary"} onClick={() => setLimitProductionOpen(true)}>
|
||||
{limitMaterialButtonText}
|
||||
</Button>
|
||||
<LimitMaterialProductionModal
|
||||
material={mat}
|
||||
open={limitProductionOpen}
|
||||
onClose={() => setLimitProductionOpen(false)}
|
||||
/>
|
||||
{props.isOutputMaterial && (
|
||||
<>
|
||||
<Button color={tutorial ? "error" : "primary"} onClick={() => setLimitProductionOpen(true)}>
|
||||
{limitMaterialButtonText}
|
||||
</Button>
|
||||
<LimitMaterialProductionModal
|
||||
material={mat}
|
||||
open={limitProductionOpen}
|
||||
onClose={() => setLimitProductionOpen(false)}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</Box>
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
@@ -45,7 +45,16 @@ export function LimitMaterialProductionModal(props: IProps): React.ReactElement
|
||||
<Typography>
|
||||
Enter a limit to the amount of this material you would like to produce per second. Leave the box empty to set no
|
||||
limit.
|
||||
<br />
|
||||
<br />
|
||||
This limit applies only to output; it does not affect input consumption.
|
||||
<br />
|
||||
<br />
|
||||
For example, in Agriculture, assume the division's raw production is 1000. You need to consume 500 Water and 200
|
||||
Chemicals to produce 1000 Plants and 1000 Food. If you set the limits for Plants and Food to 200 and 100
|
||||
respectively, you will still consume 500 Water and 200 Chemicals, but only produce 200 Plants and 100 Food.
|
||||
</Typography>
|
||||
<br />
|
||||
<TextField autoFocus={true} placeholder="Limit" type="number" onChange={onChange} onKeyDown={onKeyDown} />
|
||||
<Button onClick={limitMaterialProduction}>Limit production</Button>
|
||||
</Modal>
|
||||
|
||||
@@ -210,7 +210,7 @@ export const getTimingAttackConfig = (difficulty: number): ServerConfig => {
|
||||
"I spent some time on it, but that's not the password",
|
||||
];
|
||||
const alphanumeric = difficulty > 16 && Math.random() < 0.3;
|
||||
const length = (alphanumeric ? 0 : 3) + difficulty / 4;
|
||||
const length = Math.min((alphanumeric ? 0 : 3) + difficulty / 4, 8);
|
||||
return {
|
||||
modelId: ModelIds.TimingAttack,
|
||||
password: getPassword(length, alphanumeric),
|
||||
|
||||
@@ -79,17 +79,9 @@ export const calculateAuthenticationTime = (
|
||||
const underleveledFactor = applyUnderleveledFactor ? 1.5 + (chaRequired + 50) / (person.skills.charisma + 50) : 1;
|
||||
const hasBootsFactor = Player.hasAugmentation(AugmentationName.TheBoots) ? 0.8 : 1;
|
||||
const hasSf15_2Factor = Player.activeSourceFileLvl(15) > 2 ? 0.8 : 1;
|
||||
const bonusTimeFactor = hasDarknetBonusTime() ? 0.75 : 1;
|
||||
|
||||
const time =
|
||||
baseTime *
|
||||
skillFactor *
|
||||
backdoorFactor *
|
||||
underleveledFactor *
|
||||
hasBootsFactor *
|
||||
hasSf15_2Factor *
|
||||
bonusTimeFactor *
|
||||
threadsFactor;
|
||||
baseTime * skillFactor * backdoorFactor * underleveledFactor * hasBootsFactor * hasSf15_2Factor * threadsFactor;
|
||||
|
||||
// We need to call GetServer and check if it's a dnet server later because this function can be called by formulas
|
||||
// APIs (darknetServerData.hostname may be an invalid hostname).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Player } from "@player";
|
||||
import { addClue } from "./effects";
|
||||
import { formatNumber } from "../../ui/formatNumber";
|
||||
import { formatNumber, formatRam } from "../../ui/formatNumber";
|
||||
import { logger } from "./offlineServerHandling";
|
||||
import type { NetscriptContext } from "../../Netscript/APIWrapper";
|
||||
import type { DarknetServer } from "../../Server/DarknetServer";
|
||||
@@ -12,6 +12,7 @@ import type { DarknetServerData, Person as IPerson } from "@nsdefs";
|
||||
import { clampNumber } from "../../utils/helpers/clampNumber";
|
||||
import { ResponseCodeEnum } from "../Enums";
|
||||
import { isLabyrinthServer } from "./labyrinth";
|
||||
import { roundToTwo } from "../../utils/helpers/roundToTwo";
|
||||
|
||||
/*
|
||||
* Handles the effects of removing some blocked RAM from a Darknet server.
|
||||
@@ -21,7 +22,7 @@ export const handleRamBlockRemoved = (ctx: NetscriptContext, server: DarknetServ
|
||||
const difficulty = server.difficulty + 1;
|
||||
|
||||
const ramBlockRemoved = getRamBlockRemoved(server, threads);
|
||||
server.blockedRam -= ramBlockRemoved;
|
||||
server.blockedRam = roundToTwo(server.blockedRam - ramBlockRemoved);
|
||||
server.updateRamUsed(server.ramUsed - ramBlockRemoved);
|
||||
|
||||
if (server.blockedRam <= 0) {
|
||||
@@ -30,10 +31,10 @@ export const handleRamBlockRemoved = (ctx: NetscriptContext, server: DarknetServ
|
||||
const xpGained = Player.mults.charisma_exp * threads * 10 * 1.1 ** difficulty;
|
||||
Player.gainCharismaExp(xpGained);
|
||||
|
||||
const result = `Liberated ${formatNumber(
|
||||
const result = `Liberated ${formatRam(
|
||||
ramBlockRemoved,
|
||||
4,
|
||||
)}gb of RAM from the server owner's processes. (Gained ${formatNumber(xpGained, 1)} cha xp.)`;
|
||||
)} of RAM from the server owner's processes. (Gained ${formatNumber(xpGained, 1)} cha xp.)`;
|
||||
logger(ctx)(result);
|
||||
return {
|
||||
success: true,
|
||||
@@ -72,7 +73,7 @@ export const getRamBlockRemoved = (darknetServerData: DarknetServerData, threads
|
||||
const charismaFactor = 1 + player.skills.charisma / 100;
|
||||
const difficultyFactor = 2 * 0.92 ** (difficulty + 1);
|
||||
const baseAmount = 0.02;
|
||||
return clampNumber(baseAmount * difficultyFactor * threads * charismaFactor, 0, remainingRamBlock);
|
||||
return roundToTwo(clampNumber(baseAmount * difficultyFactor * threads * charismaFactor, 0, remainingRamBlock));
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -100,5 +101,5 @@ export const getRamBlock = (maxRam: number): number => {
|
||||
return [16, 32, maxRam - 8][Math.floor(Math.random() * 3)];
|
||||
}
|
||||
|
||||
return [maxRam, maxRam - 8, maxRam - 64, maxRam / 2][Math.floor(Math.random() * 4)];
|
||||
return roundToTwo([maxRam, maxRam - 8, maxRam - 64, maxRam / 2][Math.floor(Math.random() * 4)]);
|
||||
};
|
||||
|
||||
@@ -77,7 +77,7 @@ export function NetworkDisplayWrapper(): React.ReactElement {
|
||||
|
||||
useEffect(() => {
|
||||
const clearSubscription = DarknetEvents.subscribe(() => updateDisplay());
|
||||
draggableBackground.current?.addEventListener("wheel", (e) => e.preventDefault());
|
||||
draggableBackground.current?.addEventListener("wheel", (e) => e.preventDefault(), { passive: false });
|
||||
scrollTo(DarknetState.netViewTopScroll, DarknetState.netViewLeftScroll);
|
||||
updateDisplay();
|
||||
|
||||
|
||||
@@ -77,5 +77,4 @@ The documentation is a bit long and intimidating at first glance, but you don't
|
||||
- Use mathematical library
|
||||
- Ceres Solver
|
||||
- Noodles trick
|
||||
- "sudo.Assist" research
|
||||
- Dummy division
|
||||
|
||||
@@ -142,8 +142,23 @@ same as the string `['foo', 'bar']`.
|
||||
Internally, we use `JSON.parse` to convert the string answer, and `['foo', 'bar']` is not a valid string representation
|
||||
of an array. In JSON, a string needs to be enclosed by double quotes. Using single quotes or backticks is not allowed.
|
||||
|
||||
This is another example of why you should not convert your answer to a string when not requested. If you submit your
|
||||
array as it is, you do not need to care about the quote types.
|
||||
This is one reason why you should not convert your answer to a string unless requested. If you submit your array as is,
|
||||
you do not need to worry about quote types.
|
||||
|
||||
Let's check another example:
|
||||
|
||||
```js
|
||||
const firstString = "foo";
|
||||
const secondString = "bar";
|
||||
const answer = [firstString, secondString];
|
||||
ns.codingcontract.attempt(answer.toString(), "filename.cct");
|
||||
ns.codingcontract.attempt(String(answer), "filename.cct");
|
||||
```
|
||||
|
||||
Do NOT call toString() or use similar methods to convert your string array to a string. `["foo", "bar"]` will be
|
||||
converted to `foo,bar`. For contracts that expect a string array, submitting this string causes it to be interpreted as
|
||||
`[foo,bar]`, which is then passed to `JSON.parse`. However, `[foo,bar]` is not valid JSON (it lacks double quotes), so
|
||||
your answer will be invalid.
|
||||
|
||||
## Rewards
|
||||
|
||||
|
||||
@@ -1 +1,464 @@
|
||||
# Changelog
|
||||
|
||||
## v3.0.0: 1 May 2026
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
- Remove API server (#2084) (@catloversg)
|
||||
- Remove support for running NS1 scripts (#2083) (@catloversg)
|
||||
- Enforce stricter param check on ns.getBitNodeMultipliers and ns.hacknet.spendHashes (#2085) (@catloversg)
|
||||
- Remove APIs that were deprecated a long time ago (#2088) (@catloversg)
|
||||
- Moved formatting functions to their own interface (#1635) (@G4mingJon4s)
|
||||
- Remove fuzzy matching when checking params (#2091) (@catloversg)
|
||||
- Remove deprecated tail-related APIs (#2143) (@catloversg)
|
||||
- Rename setAutoJobAssignment API to setJobAssignment (#2146) (@catloversg)
|
||||
- Make nuke and port cracking APIs return false instead of throwing error (#1023, #2153) (@Hydrogeniouss, @catloversg)
|
||||
- Standardize names of Stock APIs (#2173) (@catloversg)
|
||||
- Rename BN multiplier RepToDonateToFaction to FavorToDonateToFaction (#2178) (@catloversg)
|
||||
- Make ns.bladeburner.getActionRepGain return the expected reputation gain (#2186) (@catloversg)
|
||||
- Rename FactionName.BachmanAssociates to FactionName.BachmanAndAssociates (#2048, #2183) (@masarakki, @catloversg)
|
||||
- Remove DreamSense upgrade (#2232) (@catloversg)
|
||||
- Use different term for dividend modifier instead of tax (#2237) (@catloversg)
|
||||
- Remove Spring Water industry (#2240) (@catloversg)
|
||||
- Remove VeChain (#2245) (@catloversg)
|
||||
- Make some APIs throw error when server is invalid (#2261) (@catloversg)
|
||||
- Rename equipment that uses real brand names (#2293) (@catloversg)
|
||||
- Make TIX access independent from WSE account (#2342) (@catloversg)
|
||||
- Move and rename purchased server functions to cloud API (#2367) (@gmcew)
|
||||
- Fix: Coding contracts may have duplicate names (#2399) (@aaaa-imcute)
|
||||
- Generate test contracts on executing host by default. Add support for optional parameter to specify the server (#2417) (@1337JiveTurkey)
|
||||
- The "darkweb" server becomes a darknet server (Check new Dark Net feature in #2139) (@ficocelliguy)
|
||||
- Remove RAM cost of hacknet namespace and set RAM cost of each hacknet API (#2502) (@catloversg)
|
||||
- Cancel sleeve's current task when calling ns.sleeve.travel() (#2559) (@catloversg)
|
||||
- Make ns.cloud.purchaseServer() and ns.cloud.deleteServer() use hostname as provided (#2560) (@catloversg)
|
||||
- Make implicit string conversion consistent across all coding contracts (#2608) (@catloversg)
|
||||
- Rename ns.gang.getOtherGangInformation to getAllGangInformation (#2635) (@lstutzman)
|
||||
- Standardize "nextCompletion" promise in tasks (#2687) (@catloversg)
|
||||
|
||||
### MAJOR CHANGES
|
||||
|
||||
- Added Darknet, a new mechanic based on spreading through an unstable network and cracking passwords. Purchase DarkscapeNavigator.exe in the terminal to unlock access. (#2139) (@ficocelliguy)
|
||||
- Balance change: IPvGO: Improve favor gain from wins to balance around the rep value of favor (#2131) (@ficocelliguy)
|
||||
- Search and read NS API docs in editor tab and documentation tab (#2163) (@catloversg)
|
||||
- Balance change: Infiltration: Rebalance rewards, add min stat requirement, add market demand (#2210) (@ficocelliguy, @d0sboots, @catloversg)
|
||||
|
||||
### UI
|
||||
|
||||
- Fix: Hacknet's RAM upgrade button is off-by-one (#2093) (@catloversg)
|
||||
- Add visual indicators for tooltips of reputation/favor (#2092) (@catloversg)
|
||||
- Mitigate crash in Terminal page in edge cases (#2099) (@catloversg)
|
||||
- Update favicon files (#2122) (@catloversg)
|
||||
- Add option to enable/disable syncing Steam achievements (#2117) (@catloversg)
|
||||
- Change min and step value of "Tail render interval" setting (#2129) (@catloversg)
|
||||
- Realign and update text in achievement icons (#2127) (@catloversg)
|
||||
- Show achievement lists in grids (#2109) (@catloversg)
|
||||
- Fix styling of IPvGO score modal (#2166) (@ficocelliguy)
|
||||
- Add RAM usage and file size to "ls -l" output (#2135) (@HansLuft778)
|
||||
- Fix: Coding contract UI does not handle error properly when answer format is invalid (#2171) (@catloversg)
|
||||
- Improve Recovery Mode screen (#2206) (@catloversg)
|
||||
- Add "Recent Errors" tab and improved error modal (#2169) (@ficocelliguy)
|
||||
- Validate bet input of casino mini games (#1694) (@catloversg)
|
||||
- Scroll to top when opening new NS API doc page in popup mode (#2181) (@catloversg)
|
||||
- Fix nbsp rendering as text rather than a space (#2225) (@gmcew)
|
||||
- Show terminal warning instead of popup for breaking changes (#2244) (@catloversg)
|
||||
- Show money in exponential form instead of "0.000" for dividends when it's > 0 but still too small (#2243) (@catloversg)
|
||||
- Place tooltips and popups in front of log windows (#2253) (@catloversg)
|
||||
- Fix: Go history page shows favor bonus instead of reputation bonus (#2251) (@catloversg)
|
||||
- Fix: Error message shows blob URL instead of script name (#2265) (@catloversg)
|
||||
- Add tooltip for reputation/favor in page of faction's augmentation list (#2268) (@catloversg)
|
||||
- Fix: Dropdown list appears behind modal when it's used in modal (#2282) (@catloversg)
|
||||
- Close coding contract popup on prestige (#2285) (@catloversg)
|
||||
- Add "Run Beautify on Save" option for built-in editor (#2287) (@TheCleric)
|
||||
- Add configurable option for auto-reconnecting to RFA client (#2297) (@catloversg)
|
||||
- Fix: Active Scripts page may mix up UI after prestige (#2303) (@catloversg)
|
||||
- Better status bar animations (#2317) (@d0sboots)
|
||||
- Prevent text from overflowing when script's args are too long in Active Scripts page (#2324) (@catloversg)
|
||||
- Print error detail to terminal if script cannot be compiled or there is runtime error while autocompleting (#2328) (@catloversg)
|
||||
- Fix: Color picker appears behind theme editor (#2321) (@catloversg)
|
||||
- Allow automatically hiding the top menu in Electron (#2325) (@femboyfireball)
|
||||
- Clarify why you can't buy 4S when disabled (#2311) (@femboyfireball)
|
||||
- Warn player if they run no-arg programs with arguments (#2338) (@catloversg)
|
||||
- Show server's money in exponential form if it's too small (#2343) (@catloversg)
|
||||
- Format the shared RAM multipler on the factions (#2355) (@mctylr-gh)
|
||||
- Fix: Electron app does not show achievement icons (#2362) (@catloversg)
|
||||
- Reword tutorial steps to distinguish between instruction and example (#2370) (@catloversg)
|
||||
- Prevent showing redundant error toasts on failed RFA auto connect attempts (#2381) (@shyguy1412)
|
||||
- Fix: Company's job list shows wrong starting jobs (#2391) (@catloversg)
|
||||
- Improve instructions in recovery mode (#2394) (@catloversg)
|
||||
- Add option to set fractional digits (#2419) (@CTNOriginals)
|
||||
- Add links to documentation pages in tutorial's last step (#2424) (@catloversg)
|
||||
- Show useful error messages when loading unsupported save data from newer versions (#2425) (@catloversg)
|
||||
- Change notice for breaking changes in v2 (#2426) (@catloversg)
|
||||
- Do not show error popup related to Stanek's Gift data when loading save files from pre-v1.1.0 (#2429) (@catloversg)
|
||||
- Add Script Editor toggle for Sticky Scroll (#2431) (@gmcew)
|
||||
- Display contract answers on completely failed contracts (#2440) (@TheCleric)
|
||||
- Remove BitNode's difficulty in BitNode selection popup (#2454) (@catloversg)
|
||||
- Add settings to change currency symbol and whether to show it after money value (#2453) (@kaoticengineering)
|
||||
- Fix: Monaco shows wrong TSDoc of APIs that have "export" word (#2473) (@catloversg)
|
||||
- Show karma in Stats page and explain what it is in documentation (#2475) (@catloversg)
|
||||
- Update icon of DARKNET_BACKDOOR and DARKNET_DEPTHS achievements (#2480) (@catloversg)
|
||||
- Update incorrect ps command shown in help (#2484) (@Groot-0909)
|
||||
- Improve help text of scp and run (#2493) (@catloversg)
|
||||
- Add option to disable minimap in script editor (#2504) (@catloversg)
|
||||
- Improve navigation system of in-game documentation viewer (#2499) (@catloversg)
|
||||
- Use font family setting when rendering MUI Link component (#2511) (@catloversg)
|
||||
- Show hints of BitNode documentation and allow opening it in BitVerse (#2513) (@catloversg)
|
||||
- Show errors if using nano/vim with patterns that do not match any files (#2515) (@catloversg)
|
||||
- Tweak CSS/Position of Darknet Docs link (#2517) (@d0sboots)
|
||||
- Add indicator of RFA connection status to overview panel (#2497) (@catloversg)
|
||||
- Fix issues with RFA auto-reconnecting feature (#2535) (@catloversg)
|
||||
- Add inline script RAM usage text to each active script (#2546) (@vadien)
|
||||
- Update toolbar of in-game editor (#2551) (@catloversg)
|
||||
- Show "undefined" instead of -1 as pid in error popup when catching promise errors (#2555) (@catloversg)
|
||||
- Add option to autosave scripts on focus change (#2565) (@catloversg)
|
||||
- Prevent joining banned factions via UI (#2573) (@catloversg)
|
||||
- Fix: Import save comparison popup shows wrong BN level (#2595) (@catloversg)
|
||||
- Fix: Cannot type in text boxes rendered by players' scripts when terminal tab is shown (#2615, #2622) (@lstutzman, @catloversg)
|
||||
- Navigate to gym/university instead of city when stopping focusing on gym/class work (#2613) (@lstutzman)
|
||||
- Ensure prompts shown by ns.prompt do not lose focus in the terminal tab (#2631) (@catloversg)
|
||||
- Remove unnecessary max-width of tab list in in-game editor (#2643) (@catloversg)
|
||||
- Add hooks to sidebar for players to attach custom content (#2651) (@catloversg)
|
||||
- Use exponential notation when formatting very small HP or thread values (#2656) (@catloversg)
|
||||
- Show effective amount of shared RAM when using UI (#2691) (@catloversg)
|
||||
- Use "success" theme color for low infiltration difficulty instead of "primary" (#2693) (@catloversg)
|
||||
- Reload immediately after importing, deleting save data or killing all scripts (#2697) (@catloversg)
|
||||
- Activate recovery mode on critical BN prestige bugs (#2699) (@catloversg)
|
||||
|
||||
### MISC
|
||||
|
||||
- Ensure IPvGO board has at least 1 offline node (#2072) (@ficocelliguy)
|
||||
- Fix: Game crashes when generating CCT in weird case (#2077) (@catloversg)
|
||||
- Add ns.dynamicImport() to dynamically import a script (#2036) (@shyguy1412)
|
||||
- Add functionality and support to fully allow Players to use IP addresses in place of hostnames (#1990) (@NagaOuroboros)
|
||||
- Fix: IPvGO tutorial was getting stuck if you left the tab and returned (#2071) (@ficocelliguy)
|
||||
- Fix: Passive faction reputation gain applies Player.mults.faction_rep twice (#2125) (@catloversg)
|
||||
- Fix: Electron app does not run on Linux due to incompatible glibc version and wrong usage of net.fetch (#2114) (@catloversg)
|
||||
- Change how enums are exposed in NetscriptDefinitions.d.ts (#1998) (@catloversg)
|
||||
- Add formulas API for calculating share power and move UI of sharing RAM (#2126) (@catloversg)
|
||||
- Use FactionName enum in relevant APIs (#2101) (@catloversg)
|
||||
- Prevent running multiple instances of Electron app (#2095) (@catloversg)
|
||||
- Tweak "The Covenant" faction's rumor condition (#2110) (@catloversg)
|
||||
- Export crash report when a fatal error occurs (#2106) (@catloversg)
|
||||
- Correctly end game & winstreak if a cheat attempt critically fails (#2130) (@ficocelliguy)
|
||||
- Show custom error message when player imports decompressed save file (#2108) (@catloversg)
|
||||
- Add "Total Number of Primes" contract (#2116) (@gmcew)
|
||||
- Make IP addresses use the full 32 bit space (#2113) (@whiskeyfur)
|
||||
- Add "--tail" to default autocomplete options (#2103) (@catloversg)
|
||||
- Update blood donation (#2151, #2216, #2508) (@catloversg, @hydroflame, @d0sboots)
|
||||
- Fix typo in sector-12-crime.lit (#2159) (@Boingostarr)
|
||||
- Add versionNumber to ns.ui.getGameInfo() (#2155) (@catloversg)
|
||||
- Fix typos in literature files (#2164) (@catloversg)
|
||||
- Add more enums to ns.enums (#2165) (@catloversg)
|
||||
- Add removal of fuzzy matching to list of breaking changes (#2149) (@catloversg)
|
||||
- Fix: API break detector does not detect affected code in some cases (#2172) (@catloversg)
|
||||
- Mention bug-report channel on Discord for reporting bugs (#2201) (@catloversg)
|
||||
- Add file metadata (timestamps) (#1271, #2199) (@Hoekstraa, @catloversg)
|
||||
- Allow using E notation in expr CLI (#2209) (@catloversg)
|
||||
- Fix: Current work is not shown in edge cases (#2208) (@catloversg)
|
||||
- Make ns.codingcontract.createDummyContract throw error if type is invalid (#2188) (@catloversg)
|
||||
- Fix: Documentation navigator does not handle external URL properly (#2202) (@catloversg)
|
||||
- Detect circular dependencies when generating modules (#2194) (@catloversg)
|
||||
- Fix: Running scripts may be loaded before main UI (#1726) (@catloversg)
|
||||
- Fix: Autocomplete of "connect" command does not list purchased servers (#2229) (@gmcew)
|
||||
- Expose difficulty value of coding contract in NS API (#2230) (@gmcew)
|
||||
- Fix: Exporting game via menu of Steam app does not give export bonus (#2241) (@catloversg)
|
||||
- Update migration instruction for breaking change of ns.nFormat (#2247) (@catloversg)
|
||||
- Fix: Loading code discards entire Go data due to missing migration code for favor/rep (#2252) (@catloversg)
|
||||
- Add removal of API server to list of breaking changes (#2205) (@catloversg)
|
||||
- Fix typo in KARMA_1000000 achievement (#2264) (@UncleCeiling)
|
||||
- Clarify the reason of failure when trying to move a running script (#2160) (@UncleCeiling)
|
||||
- Fix: ns.mv writes to destination file even if it cannot delete source file (#2267) (@catloversg)
|
||||
- Update messages related to text files (#2266) (@catloversg)
|
||||
- Fix calculateExp so that it won't return a too small result (#2274) (@d0sboots)
|
||||
- Change ns.alert to accept multiple args as other print functions (#2278) (@vamo89)
|
||||
- Fix: Coding contract can be solved manually via UI after it is removed on prestige (#2281) (@TheCleric)
|
||||
- Ensure ns.go.analysis.getValidMoves correctly handles playing as white (#2292) (@ficocelliguy)
|
||||
- Ensure that player's promises are changed to "gameOver" once the game is over (#2198) (@ficocelliguy)
|
||||
- Export save data before migrating to v3 (#2304) (@catloversg)
|
||||
- Prevent tiny islands surrounded by offline nodes during initial board generation (#2310) (@ficocelliguy)
|
||||
- Add FragmentType to NS Enums (#2341) (@TheCleric)
|
||||
- Do not round down amount of hacked money in "hack" CLI (#2344, #2345) (@catloversg)
|
||||
- Rename "TIX" interface to "Stock" (#2351) (@catloversg)
|
||||
- Add --temporary flag to run command (#2354) (@catloversg)
|
||||
- Let ServerProfiler.exe autocomplete servers (#2356) (@rladenson)
|
||||
- Correct phrasing in SmartSonar description (#2368) (@The-Chaddeus)
|
||||
- Make ActiveFragment extend Fragment (#2373) (@catloversg)
|
||||
- Expose theme as css custom props (#2380) (@shyguy1412)
|
||||
- Support css file type (#2378) (@shyguy1412)
|
||||
- Do not update captures on passed analysis boards (#2415) (@ficocelliguy)
|
||||
- Update error message when backdooring without admin rights (#2435) (@CicaProductions)
|
||||
- Add literature expanding the augment prestige lore (#2433) (@Nick-Colclasure)
|
||||
- Improve script args validation message (#2451) (@ficocelliguy)
|
||||
- Add sleeve commands to purchase sleeves and memory via the API (#2443) (@TheAimMan)
|
||||
- Allow ns.read to read .msg and .lit files (#2455) (@catloversg)
|
||||
- Fix scoring of very large open areas in IPvGO (#2464) (@ficocelliguy)
|
||||
- Make threads' bonus apply to timing attack puzzle's extra time per char (#2466) (@ficocelliguy)
|
||||
- Improve documentation; remove requirement that getBlockedRam and getDepth be called on a darknet server (#2472) (@ficocelliguy)
|
||||
- Prevent blocked ram on the "darkweb" server (#2468) (@ficocelliguy)
|
||||
- Add extra hint to sorted echo puzzle at high levels (#2465) (@ficocelliguy)
|
||||
- Change coding contract's fallback reward priorities (#2481) (@gmcew)
|
||||
- Add JS object properties as server names; refactor save/load/server storage to support this (#2482) (@ficocelliguy)
|
||||
- Buff packet sniffing slightly (#2485) (@d0sboots)
|
||||
- Fix: Darknet state is not reset properly on prestige (#2486) (@catloversg)
|
||||
- Change how coding contract rewards are randomized (#2490) (@catloversg)
|
||||
- Expose ProgramName enum (#2492) (@catloversg)
|
||||
- More fixes and feedback in darknet (#2489) (@ficocelliguy)
|
||||
- Fix missed cases in offline server handling (#2495) (@d0sboots)
|
||||
- Adjust darknet balance from player feedback (#2512) (@ficocelliguy)
|
||||
- Add "Find Largest Rectangle in a Matrix" coding contract (#2519) (@Misha279-UA)
|
||||
- Tweak Dnet based on player feedback (#2533, #2545, #2593) (@ficocelliguy)
|
||||
- Allow parsing unknown options with data.flags in autocomplete (#2539) (@catloversg)
|
||||
- Fix webstorm by using a mutationLock (#2542) (@d0sboots)
|
||||
- Print error message when calling ns.ui.closeTail with nonexistent pid or pid of stopped scripts (#2557) (@catloversg)
|
||||
- Add minimum width/height constraints to ns.ui.resizeTail (#2558) (@catloversg)
|
||||
- Add API to minimize and expand tail windows (#2556) (@catloversg)
|
||||
- Improve error messages for invalid sleeve numbers (#2567) (@catloversg)
|
||||
- Improve help text of expr command (#2561) (@catloversg)
|
||||
- Rework faction rumor (#2569) (@catloversg)
|
||||
- Fix: hacknetNodeCost formula API throws when using documented optional parameter (#2577) (@catloversg)
|
||||
- Rework intelligence override (#2575) (@catloversg)
|
||||
- Electron: Allow opening dev tools via CLI arguments (#2589) (@catloversg)
|
||||
- Support importing Steam Cloud save file manually (#2583) (@catloversg)
|
||||
- Electron: Add UI menus and CLI flags to change log levels (#2596) (@catloversg)
|
||||
- Import correct cloud file when multiple exist (#2599) (@catloversg)
|
||||
- Dnet: Remove packet capture (#2594) (@ficocelliguy)
|
||||
- Generate more frequent and lower-reward coding contracts (#2603) (@ficocelliguy)
|
||||
- Electron: Fix issues in edge cases of using --export-save (#2590) (@catloversg)
|
||||
- Fix recursive alias detection causing infinite recursion (#2610) (@lstutzman)
|
||||
- Add "hidden" mkdir command (#2646) (@catloversg)
|
||||
- Dnet: Remove bonus time effect on authentication and heartbleed speed; fix ram rounding (#2627) (@ficocelliguy)
|
||||
- Fix tab completion for multi-word quoted autocomplete options (#2612) (@lstutzman)
|
||||
- Add weakenEffect to formulas.hacking namespace (#2626) (@lstutzman)
|
||||
- Update description of "cat" in "help" command (#2654) (@catloversg)
|
||||
- Reduce achievements check interval (#2650) (@catloversg)
|
||||
- Fix: calculateExp throws errors in edge cases (#2667) (@catloversg)
|
||||
- Clear recent scripts when installing augmentations (#2670) (@Mathekatze)
|
||||
- Better error message for port serialization failure (#2688) (@d0sboots)
|
||||
- Adjust charisma augmentation power (#2698) (@ficocelliguy)
|
||||
- Clarify what "backdoor" does in "help" command (#2694) (@abbyintheattic)
|
||||
- Fix: Hacknet upgrade cost formulas ignore upgrade level when enforcing max level (#2696) (@lucebac)
|
||||
- Improve error messages for invalid module parsing (#2707) (@catloversg)
|
||||
|
||||
### DOCUMENTATION
|
||||
|
||||
- Fix wrong links in some docs pages (#2082) (@mizmantle)
|
||||
- Add getContractTypes to Coding Contracts documentation page (#2089) (@gmcew)
|
||||
- Clarify applicability of wiki entry in Hamming contracts (#2087) (@gmcew)
|
||||
- Make minor improvements in "Getting Started" page (#2112) (@catloversg)
|
||||
- Remove mention of Netscript 1.0/2.0/JS in NetscriptDefinitions.d.ts (#2150) (@catloversg)
|
||||
- Clarify ns.go.getGameState (#2158) (@Arjan-akkermans)
|
||||
- Remove unnecessary br tag in scripts.md (#2204) (@catloversg)
|
||||
- Fix minor problem in old changelog (#2203) (@catloversg)
|
||||
- Remove mention of NS2 in NetscriptDefinitions.d.ts (#2200) (@catloversg)
|
||||
- Move CONTRIBUTING.md (#2191) (@catloversg)
|
||||
- Specify parameter types of of ns.go.analysis.highlightPoint and ns.go.analysis.clearPointHighlight (#2175) (@kevinsandow)
|
||||
- Fix warnings when generating NS API docs (#2189) (@kevinsandow)
|
||||
- Support showing images in markdown docs (#2207) (@catloversg)
|
||||
- Update links to CONTRIBUTING.md (#2213) (@catloversg)
|
||||
- Update contribution guide (#2214) (@emmanuel-ferdman)
|
||||
- Clarify condition of joining Daedalus faction (#2234) (@catloversg)
|
||||
- Update infiltration docs (#2259) (@catloversg)
|
||||
- Mention TypeScript support and update example in React docs (#2263) (@catloversg)
|
||||
- Update Remote API docs (#2258) (@catloversg)
|
||||
- Change ns.tail to ns.ui.openTail in example code (#2270) (@gmcew)
|
||||
- Clarify description of ArrayJumpingGame contract (#2277) (@acidduk)
|
||||
- Update 'Hacking Algorithms' page (#2288) (@gmcew)
|
||||
- Reword HammingCode contracts and mention dummy contract API (#2296) (@gmcew)
|
||||
- Clarify cross-host characteristic of PID and port (#2336) (@Thaccus)
|
||||
- Fix wrong commands in getting_started.md (#2349) (@catloversg)
|
||||
- Use alternative fix for newline issue in IPvGO docs (#2350) (@catloversg)
|
||||
- Fix missing/wrong TSDoc of APIs having optional host parameter (#2371) (@catloversg)
|
||||
- Fix typo in README.md (#2375) (@HolyNaet)
|
||||
- Improve wording around host argument of getScriptRam (#2374) (@nickmshelley)
|
||||
- Remove references to defunct wiki from Hack/Weaken/Grow (#2404) (@maglinvinn)
|
||||
- Clarify behavior of NS.getScriptLogs() for running scripts (#2408) (@sg673)
|
||||
- Add instructions to troubleshoot common issues for contributors to CONTRIBUTING.md (#2420) (@catloversg)
|
||||
- Add FAQ and another JIT batcher illustration to documentation (#2400) (@HolyNaet)
|
||||
- Change wording in Singularity.installAugmentation (#2439) (@HolyNaet)
|
||||
- Update README.md to correct Frequently Asked Questions link. (#2444) (@jonathonchase)
|
||||
- Add a question and a grammatical fix in faq.md (#2446) (@HolyNaet)
|
||||
- Move current changelog to changelog-v2.md (#2461) (@catloversg)
|
||||
- Fix some IPvGO docs that do not reflect winstreak rep converted to favor (#2463) (@ficocelliguy)
|
||||
- Add glossary of darknet terms to the documentation page (#2469) (@ficocelliguy)
|
||||
- Add a note to CONTRIBUTING.md about the npm peer dep issue (#2474) (@d0sboots)
|
||||
- Update darknet documentation (#2483) (@ficocelliguy)
|
||||
- Fix invalid links in ns.sleep and ns.asleep (#2496) (@catloversg)
|
||||
- Use relative links instead of absolute links (#2521) (@catloversg)
|
||||
- Document quirky behavior of ns.flags when default value is nullish (#2528) (@catloversg)
|
||||
- Clarify how share power affects reputation gain rate of non-hacking work (#2544) (@catloversg)
|
||||
- Update guides (#2550) (@catloversg)
|
||||
- Add missing newline after RAM cost (#2570) (@catloversg)
|
||||
- Update mention of outdated getStockForecast API (#2578) (@catloversg)
|
||||
- Fix newline issues in IPvGO docs and add missing RAM cost (#2602) (@catloversg)
|
||||
- Document coding contract's generation and rewards (#2624) (@catloversg)
|
||||
- Clarify scp and exec darknet permissions in API docs (#2634) (@lstutzman)
|
||||
- Update RAM cost of hacknet APIs and remove unnecessary RAM cost docs (#2639) (@catloversg)
|
||||
- Update tutorial script for buying cloud servers (#2653) (@catloversg)
|
||||
- Improve coding contract documentation (#2689) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - UI
|
||||
|
||||
- Fix: BitVerse does not show all BN multipliers in some cases (#2045) (@catloversg)
|
||||
- Add UI hint about scripting tea/party and using Intern (#2179) (@catloversg)
|
||||
- Fix: Bladeburner console prints main body's HP instead of sleeve's HP (#2390) (@catloversg)
|
||||
- Reduce threshold of showing warning of low population (#2450) (@catloversg)
|
||||
- Fix: Hacknet server UI shows NaN hash rate when 100% RAM is being used (#2500) (@catloversg)
|
||||
- Prevent ending BNs through reuse of Bladeburner UI event handler (#2574) (@catloversg)
|
||||
- Always show Black Operations list (#2592) (@catloversg)
|
||||
- Show hints of Sleeves mechanic in pre-endgame (#2605) (@catloversg)
|
||||
- Consistently calculate BitNode "level" (#2645) (@catloversg)
|
||||
- Add tooltips explaining why Bladeburner skill upgrades are disabled (#2648) (@catloversg)
|
||||
- Add button to open Faction page from Gang UI (#2655) (@catloversg)
|
||||
- Ensure intelligence override is a positive integer (#2673) (@catloversg)
|
||||
- Remove max width of corporation division list (#2686) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - MISC
|
||||
|
||||
- Add achievement for acquiring SF13.1 (#2107) (@catloversg)
|
||||
- Add achievement for completing all BNs (#2128) (@catloversg)
|
||||
- Renamed Division.type to Division.industry (#2079, #2152) (@whiskeyfur, @catloversg)
|
||||
- Make ns.hacknet.spendHashes handle invalid targets in same way as UI (#2102) (@catloversg)
|
||||
- Add achievements for BN14 (#2140) (@catloversg)
|
||||
- Print logs when ns.hacknet.spendHashes fails and update param type of APIs using hash upgrade (#2145) (@catloversg)
|
||||
- Add ns.singularity.getUnlockedAchievements (#2156) (@UncleCeiling)
|
||||
- Remove mention of unusable research "sudo.Assist" (#2187) (@catloversg)
|
||||
- Change message of Singularity error and uncaught promise error (#2174) (@catloversg)
|
||||
- Add ns.singularity.getHackingLevelRequirementOfProgram (#2271) (@catloversg)
|
||||
- Expose gang's discount rate (#2272) (@catloversg)
|
||||
- Prevent purchasing product-only research for material industries (#2283) (@catloversg)
|
||||
- Fix: Stat levels are not recalculated after grafting augs or accepting Stanek's Gift (#2322) (@catloversg)
|
||||
- Expose production limit of material and product (#2330) (@AnteIndustrial)
|
||||
- Make some editorial changes in Black Operations' description (#2449) (@catloversg)
|
||||
- Add warning when installing backdoor on backdoored server with Singularity API (#2458) (@catloversg)
|
||||
- Fix: Sleeves can earn exp and purchase augmentations when enabling disableSleeveExpAndAugmentation (#2467) (@catloversg)
|
||||
- Add improved challenge achievement for BN15 (#2479) (@ficocelliguy)
|
||||
- Stop randomizing Bladeburner's action difficulty (#2491) (@catloversg)
|
||||
- Adjusted Bladeburner's team bonus computation to make one member help (#2541) (@JoshuaCF)
|
||||
- Rebalance charisma exp gain of Recruitment action (#2549) (@catloversg)
|
||||
- Add APIs to get rank gain and rank loss of an action (#2572) (@catloversg)
|
||||
- Reduce RAM cost of inGang and inBladeburner APIs (#2582) (@catloversg)
|
||||
- Fix skillMaxUpgradeCount returning 1 at extreme skill levels (#2611) (@lstutzman)
|
||||
- API: Expose charged effects of Stanek's Gift active fragments (#2638) (@catloversg)
|
||||
- Apply SF override to charisma calculations (#2642) (@catloversg)
|
||||
- Update description of "BN9: Challenge" achievement (#2647) (@catloversg)
|
||||
- Fix: Intelligence data is incorrectly migrated when Intelligence is not unlocked (#2660, #2666) (@catloversg)
|
||||
- Restrict team count of Ops/BlackOps to total team size (#2672) (@catloversg)
|
||||
- Fix: DarkscapeNavigator program is not granted on BN prestige when having SF15 (#2690) (@catloversg)
|
||||
- Prevent duplicate processing of boost materials (#2695) (@catloversg)
|
||||
- Update error message of ns.singularity.joinFaction (#2700) (@catloversg)
|
||||
- Update RAM cost of nextUpdate and similar APIs (#2702) (@catloversg)
|
||||
- Update description of "You and what army?" achievement (#2703) (@catloversg)
|
||||
- Rework material production limit (#2683) (@catloversg)
|
||||
- Remove references to "sudo.Assist" research (#2709) (@catloversg)
|
||||
|
||||
### SPOILER CHANGES - DOCUMENTATION
|
||||
|
||||
- Update rewards of SF14 (#2142) (@catloversg)
|
||||
- Fix missing and outdated info of optional parameter (#2176) (@catloversg)
|
||||
- Specify param type of many Corporation APIs (#2190) (@catloversg)
|
||||
- Fix typo in bitnodes.md (#2221) (@catloversg)
|
||||
- Add short guide of BitNode recommendation (#2041) (@1337JiveTurkey)
|
||||
- Add comprehensive guide of BitNode recommendation (#2044) (@catloversg)
|
||||
- Fix outdated description of Bladeburner interface (#2226) (@catloversg)
|
||||
- Clarify advice about Smart Supply in round 1 (#2233) (@catloversg)
|
||||
- Fix wrong param/return type and clarify ns.sleep, ns.asleep, ns.singularity.exportGame (#2242) (@catloversg)
|
||||
- Clarify ns.gang.getOtherGangInformation (#2289) (@acidduk)
|
||||
- Update type of Player.factions, GangGenInfo.faction and CorpMaterialConstantData.name (#2347) (@catloversg)
|
||||
- Clarification of Singularity costs inside BN4 (#2403) (@gmcew)
|
||||
- Update math notations in corporation docs (#2452) (@catloversg)
|
||||
- Update BitNode recommendation short guide (#2523, #2529) (@catloversg)
|
||||
|
||||
### CODEBASE/REFACTOR/WORKFLOW/JEST/TOOL/DEPS
|
||||
|
||||
- Electron: Use steamworks.js to integrate with Steamworks SDK (#1563) (@catloversg)
|
||||
- Electron: Replace deprecated protocol.interceptFileProtocol with protocol.handle (#2100) (@catloversg)
|
||||
- Dev menu: Add tools to set stat level and queue augmentations of faction (#2118) (@catloversg)
|
||||
- Remove wrong and irrelevant comments/code (#2111) (@catloversg)
|
||||
- Refactor: Change repNeededToDonate to favorNeededToDonate (#2134) (@d0sboots)
|
||||
- Workflow: Build artifacts and upload to release (#2120) (@catloversg)
|
||||
- Configure .editorconfig to not trim trailing whitespace in NetscriptDefinitions.d.ts (#2137) (@G4mingJon4s)
|
||||
- Fix typo of "CorruptableText" (#2144) (@catloversg)
|
||||
- Dev menu: Fix bugs in WD tools (#2141) (@catloversg)
|
||||
- Make prettier ignore src/Documentation/pages.ts (#2185) (@catloversg)
|
||||
- Workflow: Allow enabling dev mode when deploying dev build (#2184) (@catloversg)
|
||||
- Refactor: Refactor message handler of Remote API (#2211) (@catloversg)
|
||||
- Dev menu: Auto expand last opened tools (#2182) (@catloversg)
|
||||
- Update build script to avoid unnecessary newline in generated script (#2224) (@catloversg)
|
||||
- Fix inconsistent generated pages.ts (#2236) (@catloversg)
|
||||
- Dev menu: Reset hacknet server list properly when setting level of SF9 (#2177) (@catloversg)
|
||||
- Update dev dependencies (#2246) (@catloversg)
|
||||
- Move all docs into en/ subdirectory (#1505) (@d0sboots)
|
||||
- Fix ctrl-clicking after the doc_en refactor (#2256) (@d0sboots)
|
||||
- Electron: Specify mime type when loading wasm files (#2262) (@catloversg)
|
||||
- Electron: Build universal macOS binary (#2306) (@Snarling)
|
||||
- Add Jest test to test migration from v2 to v3 (#2305) (@catloversg)
|
||||
- Workflow: Split build-artifacts.yml into 2 workflows (#2309) (@catloversg)
|
||||
- Workflow: Update NodeJs version in workflows (#2319) (@catloversg)
|
||||
- Update NodeJS to v22 (#2318) (@mctylr-gh)
|
||||
- Update api-documentor and api-extractor (#2320) (@mctylr-gh)
|
||||
- Improve dev menu for augmentations (#2315) (@d0sboots)
|
||||
- Add more debug info for troubleshooting corporation issues (#2327) (@catloversg)
|
||||
- Update doc.sh (#2331) (@catloversg)
|
||||
- Enable restoreMocks option and fix lint errors (#2333) (@catloversg)
|
||||
- Workflow: Add new job to check generated docs (#2329) (@catloversg)
|
||||
- Quiet Jest tests output on expected failures (#2332) (@mctylr-gh)
|
||||
- Standardize error handling in netscriptGoImplementation.ts (#2335) (@ficocelliguy)
|
||||
- Enable linting in test folder (#2337) (@catloversg)
|
||||
- Update minor version of material UI and Emotion packages (#2339) (@mctylr-gh)
|
||||
- Refactor Stanek's Gift UI code and change internal FragmentType enum (#2346) (@catloversg)
|
||||
- Minor React related packages update (#2353) (@mctylr-gh)
|
||||
- Remove redundant check in getServer utility function and serverExists API (#2357) (@catloversg)
|
||||
- Refactor tests that add home server manually (#2358) (@catloversg)
|
||||
- Update Electron version (#2360) (@catloversg)
|
||||
- Prepare for save data migration of next beta version (#2369) (@catloversg)
|
||||
- Rewrite infiltration to pull state out of React (#2316, #2393) (@d0sboots)
|
||||
- Use getCoreBonus function when calculating server growth (#2387) (@aaaa-imcute)
|
||||
- Refactor implementation of ports (#2396) (@d0sboots)
|
||||
- Avoid re-entrancy issues with EventEmitter (#2397) (@d0sboots)
|
||||
- Update packages-lock.json to not use vulnerable versions (#2405) (@mctylr-gh)
|
||||
- Allow specifying migrator when migrating player's scripts (#2418) (@catloversg)
|
||||
- Refactor code related to in-game documentation link (#2422) (@catloversg)
|
||||
- Clean up "doc" folder (#2427) (@catloversg)
|
||||
- Update dependencies related to monaco (#2432) (@catloversg)
|
||||
- Fix typos and duplicating ms per cycle constant (#2436) (@gmcew)
|
||||
- Update dependencies to fix vulnerability warnings (#2445) (@catloversg)
|
||||
- Move Result to the public API (#2398) (@d0sboots)
|
||||
- Generate display data for math notation at built time and remove runtime mathjax dependency (#2447) (@catloversg)
|
||||
- Update SaveData type to be compatible with TS 5.9 and upgrade TS (#2457) (@catloversg)
|
||||
- Update NodeJS to v24 (#2456) (@catloversg)
|
||||
- Update format created by "build artifacts" workflows (#2470) (@Snarling)
|
||||
- Consolidate checks under getFailureResult() (#2476) (@d0sboots)
|
||||
- Fix: Global states are not reset properly between each Jest test (#2487) (@catloversg)
|
||||
- Change getFailureResult to checkDarknetServer (#2494) (@d0sboots)
|
||||
- Speed up by-ip lookups by introducing a new map entry (#2488) (@d0sboots)
|
||||
- Refactor/adjust getPixelPosition in darknet UI code (#2501) (@d0sboots)
|
||||
- Add tests for checking getAnswer and solver of coding contracts (#2503) (@catloversg)
|
||||
- Refactor ImportSave component (#2505) (@catloversg)
|
||||
- Show coding contract names when their tests failed (#2520) (@catloversg)
|
||||
- Workflow: Fix wrong instruction of generating docs (#2522) (@catloversg)
|
||||
- Update comment of LoadingScreen of ComplexPage enum (#2527) (@catloversg)
|
||||
- Make getPlayer 10x faster (#2548) (@d0sboots)
|
||||
- Create monaco editor instance with null model (#2563) (@catloversg)
|
||||
- Update dependencies (#2576) (@catloversg)
|
||||
- Remove barrel imports in Bladeburner code (#2580) (@catloversg)
|
||||
- Fix React warning in IPvGO scoring explanation popup (#2581) (@catloversg)
|
||||
- Update Babel core, presets and module loader for webpack (#2585) (@catloversg)
|
||||
- Add script to generate webpack bundle report (#2587) (@catloversg)
|
||||
- Update Electron (#2591) (@catloversg)
|
||||
- Mitigate issue of forcefullyCrashRenderer (#2597) (@catloversg)
|
||||
- Split Settings.ts to reduce number of imports (#2600) (@catloversg)
|
||||
- Remove duplicate random alphanumeric string functions (#2601) (@catloversg)
|
||||
- Update comments to reflect changes in #2603 (#2606) (@catloversg)
|
||||
- Replace ipExists() linear scan with O(1) Map.has() (#2621) (@lstutzman)
|
||||
- Refactor and fix issues in db.ts (#2623) (@catloversg)
|
||||
- Add dependency array to TerminalInput keydown useEffect (#2620) (@lstutzman)
|
||||
- Add dependency array to GameRoot useEffect (#2617) (@lstutzman)
|
||||
- Dev menu: Initialize dark net data when setting SF15 level (#2632) (@catloversg)
|
||||
- Use type-only imports in ArrayHelpers.ts (#2630) (@catloversg)
|
||||
- Remove redundant "$" from JS/TS regex in webpack config (#2649) (@catloversg)
|
||||
- Allow specifying commit hash id when building artifacts (#2652) (@catloversg)
|
||||
- Fix passive event listener warning (#2671) (@catloversg)
|
||||
- Ignore .DS_Store files when generating pages.ts (#2685) (@catloversg)
|
||||
- Consistently check when to show intelligence skill (#2692) (@catloversg)
|
||||
- Fix api-extractor warnings (#2701) (@catloversg)
|
||||
- Add comments explaining redundant check in product calculation (#2705) (@catloversg)
|
||||
|
||||
@@ -367,12 +367,11 @@ Paste the following code into the [Script](../basic/scripts.md) editor:
|
||||
|
||||
/** @param {NS} ns */
|
||||
export async function main(ns) {
|
||||
// How much RAM each cloud server will have. In this case, it'll
|
||||
// be 8GB.
|
||||
// How much RAM each cloud server will have. In this case, it'll be 8GB.
|
||||
const ram = 8;
|
||||
|
||||
// Iterator we'll use for our loop
|
||||
let i = 0;
|
||||
let i = ns.cloud.getServerNames().length;
|
||||
|
||||
// Continuously try to purchase cloud servers until we've reached the maximum
|
||||
// amount of servers
|
||||
@@ -381,16 +380,16 @@ Paste the following code into the [Script](../basic/scripts.md) editor:
|
||||
if (ns.getServerMoneyAvailable("home") > ns.cloud.getRamLimit(ram)) {
|
||||
// If we have enough money, then:
|
||||
// 1. Purchase the server
|
||||
// 2. Copy our hacking script onto the newly-purchased cloud server
|
||||
// 3. Run our hacking script on the newly-purchased cloud server with 3 threads
|
||||
// 2. Copy our hacking script onto the newly purchased cloud server
|
||||
// 3. Run our hacking script on the newly purchased cloud server with 3 threads
|
||||
// 4. Increment our iterator to indicate that we've bought a new server
|
||||
let hostname = ns.cloud.purchaseServer("cloud-server-" + i, ram);
|
||||
const hostname = ns.cloud.purchaseServer("cloud-server-" + i, ram);
|
||||
ns.scp("early-hack-template.js", hostname);
|
||||
ns.exec("early-hack-template.js", hostname, 3);
|
||||
++i;
|
||||
}
|
||||
//Make the script wait for a second before looping again.
|
||||
//Removing this line will cause an infinite loop and crash the game.
|
||||
// Make the script wait for a second before looping again.
|
||||
// Removing this line will cause an infinite loop and crash the game.
|
||||
await ns.sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ Adding a sleep like in the first example, or changing the code so that the `awai
|
||||
|
||||
Common infinite loop when translating the server purchasing script in starting guide to scripts is to have a while loop, where the condition's change is conditional:
|
||||
|
||||
var ram = 8;
|
||||
var i = 0;
|
||||
const ram = 8;
|
||||
let i = ns.cloud.getServerNames().length;
|
||||
|
||||
while (i < ns.cloud.getServerLimit()) {
|
||||
if (ns.getServerMoneyAvailable("home") > ns.cloud.getRamLimit(ram)) {
|
||||
var hostname = ns.cloud.purchaseServer("cloud-server-" + i, ram);
|
||||
const hostname = ns.cloud.purchaseServer("cloud-server-" + i, ram);
|
||||
ns.scp("early-hack-template.js", hostname);
|
||||
ns.exec("early-hack-template.js", hostname, 3);
|
||||
++i;
|
||||
|
||||
@@ -91,8 +91,8 @@ import nsDoc_bitburner_autocompletedata_txts_md from "../../markdown/bitburner.a
|
||||
import nsDoc_bitburner_backdoorrequirement_md from "../../markdown/bitburner.backdoorrequirement.md?raw";
|
||||
import nsDoc_bitburner_backdoorrequirement_server_md from "../../markdown/bitburner.backdoorrequirement.server.md?raw";
|
||||
import nsDoc_bitburner_backdoorrequirement_type_md from "../../markdown/bitburner.backdoorrequirement.type.md?raw";
|
||||
import nsDoc_bitburner_basetask_cyclesworked_md from "../../markdown/bitburner.basetask.cyclesworked.md?raw";
|
||||
import nsDoc_bitburner_basetask_md from "../../markdown/bitburner.basetask.md?raw";
|
||||
import nsDoc_bitburner_basetask_nextcompletion_md from "../../markdown/bitburner.basetask.nextcompletion.md?raw";
|
||||
import nsDoc_bitburner_basichgwoptions_additionalmsec_md from "../../markdown/bitburner.basichgwoptions.additionalmsec.md?raw";
|
||||
import nsDoc_bitburner_basichgwoptions_md from "../../markdown/bitburner.basichgwoptions.md?raw";
|
||||
import nsDoc_bitburner_basichgwoptions_stock_md from "../../markdown/bitburner.basichgwoptions.stock.md?raw";
|
||||
@@ -561,6 +561,7 @@ import nsDoc_bitburner_gameinfo_versionnumber_md from "../../markdown/bitburner.
|
||||
import nsDoc_bitburner_gang_ascendmember_md from "../../markdown/bitburner.gang.ascendmember.md?raw";
|
||||
import nsDoc_bitburner_gang_canrecruitmember_md from "../../markdown/bitburner.gang.canrecruitmember.md?raw";
|
||||
import nsDoc_bitburner_gang_creategang_md from "../../markdown/bitburner.gang.creategang.md?raw";
|
||||
import nsDoc_bitburner_gang_getallganginformation_md from "../../markdown/bitburner.gang.getallganginformation.md?raw";
|
||||
import nsDoc_bitburner_gang_getascensionresult_md from "../../markdown/bitburner.gang.getascensionresult.md?raw";
|
||||
import nsDoc_bitburner_gang_getbonustime_md from "../../markdown/bitburner.gang.getbonustime.md?raw";
|
||||
import nsDoc_bitburner_gang_getchancetowinclash_md from "../../markdown/bitburner.gang.getchancetowinclash.md?raw";
|
||||
@@ -572,7 +573,6 @@ import nsDoc_bitburner_gang_getganginformation_md from "../../markdown/bitburner
|
||||
import nsDoc_bitburner_gang_getinstallresult_md from "../../markdown/bitburner.gang.getinstallresult.md?raw";
|
||||
import nsDoc_bitburner_gang_getmemberinformation_md from "../../markdown/bitburner.gang.getmemberinformation.md?raw";
|
||||
import nsDoc_bitburner_gang_getmembernames_md from "../../markdown/bitburner.gang.getmembernames.md?raw";
|
||||
import nsDoc_bitburner_gang_getotherganginformation_md from "../../markdown/bitburner.gang.getotherganginformation.md?raw";
|
||||
import nsDoc_bitburner_gang_getrecruitsavailable_md from "../../markdown/bitburner.gang.getrecruitsavailable.md?raw";
|
||||
import nsDoc_bitburner_gang_gettasknames_md from "../../markdown/bitburner.gang.gettasknames.md?raw";
|
||||
import nsDoc_bitburner_gang_gettaskstats_md from "../../markdown/bitburner.gang.gettaskstats.md?raw";
|
||||
@@ -730,7 +730,6 @@ import nsDoc_bitburner_grafting_graftaugmentation_md from "../../markdown/bitbur
|
||||
import nsDoc_bitburner_grafting_md from "../../markdown/bitburner.grafting.md?raw";
|
||||
import nsDoc_bitburner_grafting_waitforongoinggrafting_md from "../../markdown/bitburner.grafting.waitforongoinggrafting.md?raw";
|
||||
import nsDoc_bitburner_graftingtask_augmentation_md from "../../markdown/bitburner.graftingtask.augmentation.md?raw";
|
||||
import nsDoc_bitburner_graftingtask_completion_md from "../../markdown/bitburner.graftingtask.completion.md?raw";
|
||||
import nsDoc_bitburner_graftingtask_md from "../../markdown/bitburner.graftingtask.md?raw";
|
||||
import nsDoc_bitburner_graftingtask_type_md from "../../markdown/bitburner.graftingtask.type.md?raw";
|
||||
import nsDoc_bitburner_gymenumtype_md from "../../markdown/bitburner.gymenumtype.md?raw";
|
||||
@@ -746,6 +745,7 @@ import nsDoc_bitburner_hackingformulas_hackexp_md from "../../markdown/bitburner
|
||||
import nsDoc_bitburner_hackingformulas_hackpercent_md from "../../markdown/bitburner.hackingformulas.hackpercent.md?raw";
|
||||
import nsDoc_bitburner_hackingformulas_hacktime_md from "../../markdown/bitburner.hackingformulas.hacktime.md?raw";
|
||||
import nsDoc_bitburner_hackingformulas_md from "../../markdown/bitburner.hackingformulas.md?raw";
|
||||
import nsDoc_bitburner_hackingformulas_weakeneffect_md from "../../markdown/bitburner.hackingformulas.weakeneffect.md?raw";
|
||||
import nsDoc_bitburner_hackingformulas_weakentime_md from "../../markdown/bitburner.hackingformulas.weakentime.md?raw";
|
||||
import nsDoc_bitburner_hackingmultipliers_chance_md from "../../markdown/bitburner.hackingmultipliers.chance.md?raw";
|
||||
import nsDoc_bitburner_hackingmultipliers_growth_md from "../../markdown/bitburner.hackingmultipliers.growth.md?raw";
|
||||
@@ -1171,6 +1171,8 @@ import nsDoc_bitburner_player_md from "../../markdown/bitburner.player.md?raw";
|
||||
import nsDoc_bitburner_player_money_md from "../../markdown/bitburner.player.money.md?raw";
|
||||
import nsDoc_bitburner_player_numpeoplekilled_md from "../../markdown/bitburner.player.numpeoplekilled.md?raw";
|
||||
import nsDoc_bitburner_player_totalplaytime_md from "../../markdown/bitburner.player.totalplaytime.md?raw";
|
||||
import nsDoc_bitburner_playerbasetask_cyclesworked_md from "../../markdown/bitburner.playerbasetask.cyclesworked.md?raw";
|
||||
import nsDoc_bitburner_playerbasetask_md from "../../markdown/bitburner.playerbasetask.md?raw";
|
||||
import nsDoc_bitburner_playerrequirement_md from "../../markdown/bitburner.playerrequirement.md?raw";
|
||||
import nsDoc_bitburner_positionenumtype_md from "../../markdown/bitburner.positionenumtype.md?raw";
|
||||
import nsDoc_bitburner_positiontype_md from "../../markdown/bitburner.positiontype.md?raw";
|
||||
@@ -1383,20 +1385,45 @@ import nsDoc_bitburner_sleeve_settosynchronize_md from "../../markdown/bitburner
|
||||
import nsDoc_bitburner_sleeve_settouniversitycourse_md from "../../markdown/bitburner.sleeve.settouniversitycourse.md?raw";
|
||||
import nsDoc_bitburner_sleeve_travel_md from "../../markdown/bitburner.sleeve.travel.md?raw";
|
||||
import nsDoc_bitburner_sleeve_upgradememory_md from "../../markdown/bitburner.sleeve.upgradememory.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_actionname_md from "../../markdown/bitburner.sleevebladeburnertask.actionname.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_actiontype_md from "../../markdown/bitburner.sleevebladeburnertask.actiontype.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_cyclesneeded_md from "../../markdown/bitburner.sleevebladeburnertask.cyclesneeded.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_cyclesworked_md from "../../markdown/bitburner.sleevebladeburnertask.cyclesworked.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_md from "../../markdown/bitburner.sleevebladeburnertask.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_taskscompleted_md from "../../markdown/bitburner.sleevebladeburnertask.taskscompleted.md?raw";
|
||||
import nsDoc_bitburner_sleevebladeburnertask_type_md from "../../markdown/bitburner.sleevebladeburnertask.type.md?raw";
|
||||
import nsDoc_bitburner_sleeveclasstask_classtype_md from "../../markdown/bitburner.sleeveclasstask.classtype.md?raw";
|
||||
import nsDoc_bitburner_sleeveclasstask_location_md from "../../markdown/bitburner.sleeveclasstask.location.md?raw";
|
||||
import nsDoc_bitburner_sleeveclasstask_md from "../../markdown/bitburner.sleeveclasstask.md?raw";
|
||||
import nsDoc_bitburner_sleeveclasstask_type_md from "../../markdown/bitburner.sleeveclasstask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevecompanytask_companyname_md from "../../markdown/bitburner.sleevecompanytask.companyname.md?raw";
|
||||
import nsDoc_bitburner_sleevecompanytask_md from "../../markdown/bitburner.sleevecompanytask.md?raw";
|
||||
import nsDoc_bitburner_sleevecompanytask_type_md from "../../markdown/bitburner.sleevecompanytask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_crimetype_md from "../../markdown/bitburner.sleevecrimetask.crimetype.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_cyclesneeded_md from "../../markdown/bitburner.sleevecrimetask.cyclesneeded.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_cyclesworked_md from "../../markdown/bitburner.sleevecrimetask.cyclesworked.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_md from "../../markdown/bitburner.sleevecrimetask.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_taskscompleted_md from "../../markdown/bitburner.sleevecrimetask.taskscompleted.md?raw";
|
||||
import nsDoc_bitburner_sleevecrimetask_type_md from "../../markdown/bitburner.sleevecrimetask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevefactiontask_factionname_md from "../../markdown/bitburner.sleevefactiontask.factionname.md?raw";
|
||||
import nsDoc_bitburner_sleevefactiontask_factionworktype_md from "../../markdown/bitburner.sleevefactiontask.factionworktype.md?raw";
|
||||
import nsDoc_bitburner_sleevefactiontask_md from "../../markdown/bitburner.sleevefactiontask.md?raw";
|
||||
import nsDoc_bitburner_sleevefactiontask_type_md from "../../markdown/bitburner.sleevefactiontask.type.md?raw";
|
||||
import nsDoc_bitburner_sleeveinfiltratetask_cyclesneeded_md from "../../markdown/bitburner.sleeveinfiltratetask.cyclesneeded.md?raw";
|
||||
import nsDoc_bitburner_sleeveinfiltratetask_cyclesworked_md from "../../markdown/bitburner.sleeveinfiltratetask.cyclesworked.md?raw";
|
||||
import nsDoc_bitburner_sleeveinfiltratetask_md from "../../markdown/bitburner.sleeveinfiltratetask.md?raw";
|
||||
import nsDoc_bitburner_sleeveinfiltratetask_type_md from "../../markdown/bitburner.sleeveinfiltratetask.type.md?raw";
|
||||
import nsDoc_bitburner_sleeveperson_md from "../../markdown/bitburner.sleeveperson.md?raw";
|
||||
import nsDoc_bitburner_sleeveperson_memory_md from "../../markdown/bitburner.sleeveperson.memory.md?raw";
|
||||
import nsDoc_bitburner_sleeveperson_shock_md from "../../markdown/bitburner.sleeveperson.shock.md?raw";
|
||||
import nsDoc_bitburner_sleeveperson_storedcycles_md from "../../markdown/bitburner.sleeveperson.storedcycles.md?raw";
|
||||
import nsDoc_bitburner_sleeveperson_sync_md from "../../markdown/bitburner.sleeveperson.sync.md?raw";
|
||||
import nsDoc_bitburner_sleeverecoverytask_md from "../../markdown/bitburner.sleeverecoverytask.md?raw";
|
||||
import nsDoc_bitburner_sleeverecoverytask_type_md from "../../markdown/bitburner.sleeverecoverytask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevesupporttask_md from "../../markdown/bitburner.sleevesupporttask.md?raw";
|
||||
import nsDoc_bitburner_sleevesupporttask_type_md from "../../markdown/bitburner.sleevesupporttask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevesynchrotask_md from "../../markdown/bitburner.sleevesynchrotask.md?raw";
|
||||
import nsDoc_bitburner_sleevesynchrotask_type_md from "../../markdown/bitburner.sleevesynchrotask.type.md?raw";
|
||||
import nsDoc_bitburner_sleevetask_md from "../../markdown/bitburner.sleevetask.md?raw";
|
||||
import nsDoc_bitburner_somerequirement_conditions_md from "../../markdown/bitburner.somerequirement.conditions.md?raw";
|
||||
import nsDoc_bitburner_somerequirement_md from "../../markdown/bitburner.somerequirement.md?raw";
|
||||
@@ -1687,8 +1714,8 @@ AllPages["nsDoc/bitburner.autocompletedata.txts.md"] = nsDoc_bitburner_autocompl
|
||||
AllPages["nsDoc/bitburner.backdoorrequirement.md"] = nsDoc_bitburner_backdoorrequirement_md;
|
||||
AllPages["nsDoc/bitburner.backdoorrequirement.server.md"] = nsDoc_bitburner_backdoorrequirement_server_md;
|
||||
AllPages["nsDoc/bitburner.backdoorrequirement.type.md"] = nsDoc_bitburner_backdoorrequirement_type_md;
|
||||
AllPages["nsDoc/bitburner.basetask.cyclesworked.md"] = nsDoc_bitburner_basetask_cyclesworked_md;
|
||||
AllPages["nsDoc/bitburner.basetask.md"] = nsDoc_bitburner_basetask_md;
|
||||
AllPages["nsDoc/bitburner.basetask.nextcompletion.md"] = nsDoc_bitburner_basetask_nextcompletion_md;
|
||||
AllPages["nsDoc/bitburner.basichgwoptions.additionalmsec.md"] = nsDoc_bitburner_basichgwoptions_additionalmsec_md;
|
||||
AllPages["nsDoc/bitburner.basichgwoptions.md"] = nsDoc_bitburner_basichgwoptions_md;
|
||||
AllPages["nsDoc/bitburner.basichgwoptions.stock.md"] = nsDoc_bitburner_basichgwoptions_stock_md;
|
||||
@@ -2157,6 +2184,7 @@ AllPages["nsDoc/bitburner.gameinfo.versionnumber.md"] = nsDoc_bitburner_gameinfo
|
||||
AllPages["nsDoc/bitburner.gang.ascendmember.md"] = nsDoc_bitburner_gang_ascendmember_md;
|
||||
AllPages["nsDoc/bitburner.gang.canrecruitmember.md"] = nsDoc_bitburner_gang_canrecruitmember_md;
|
||||
AllPages["nsDoc/bitburner.gang.creategang.md"] = nsDoc_bitburner_gang_creategang_md;
|
||||
AllPages["nsDoc/bitburner.gang.getallganginformation.md"] = nsDoc_bitburner_gang_getallganginformation_md;
|
||||
AllPages["nsDoc/bitburner.gang.getascensionresult.md"] = nsDoc_bitburner_gang_getascensionresult_md;
|
||||
AllPages["nsDoc/bitburner.gang.getbonustime.md"] = nsDoc_bitburner_gang_getbonustime_md;
|
||||
AllPages["nsDoc/bitburner.gang.getchancetowinclash.md"] = nsDoc_bitburner_gang_getchancetowinclash_md;
|
||||
@@ -2168,7 +2196,6 @@ AllPages["nsDoc/bitburner.gang.getganginformation.md"] = nsDoc_bitburner_gang_ge
|
||||
AllPages["nsDoc/bitburner.gang.getinstallresult.md"] = nsDoc_bitburner_gang_getinstallresult_md;
|
||||
AllPages["nsDoc/bitburner.gang.getmemberinformation.md"] = nsDoc_bitburner_gang_getmemberinformation_md;
|
||||
AllPages["nsDoc/bitburner.gang.getmembernames.md"] = nsDoc_bitburner_gang_getmembernames_md;
|
||||
AllPages["nsDoc/bitburner.gang.getotherganginformation.md"] = nsDoc_bitburner_gang_getotherganginformation_md;
|
||||
AllPages["nsDoc/bitburner.gang.getrecruitsavailable.md"] = nsDoc_bitburner_gang_getrecruitsavailable_md;
|
||||
AllPages["nsDoc/bitburner.gang.gettasknames.md"] = nsDoc_bitburner_gang_gettasknames_md;
|
||||
AllPages["nsDoc/bitburner.gang.gettaskstats.md"] = nsDoc_bitburner_gang_gettaskstats_md;
|
||||
@@ -2326,7 +2353,6 @@ AllPages["nsDoc/bitburner.grafting.graftaugmentation.md"] = nsDoc_bitburner_graf
|
||||
AllPages["nsDoc/bitburner.grafting.md"] = nsDoc_bitburner_grafting_md;
|
||||
AllPages["nsDoc/bitburner.grafting.waitforongoinggrafting.md"] = nsDoc_bitburner_grafting_waitforongoinggrafting_md;
|
||||
AllPages["nsDoc/bitburner.graftingtask.augmentation.md"] = nsDoc_bitburner_graftingtask_augmentation_md;
|
||||
AllPages["nsDoc/bitburner.graftingtask.completion.md"] = nsDoc_bitburner_graftingtask_completion_md;
|
||||
AllPages["nsDoc/bitburner.graftingtask.md"] = nsDoc_bitburner_graftingtask_md;
|
||||
AllPages["nsDoc/bitburner.graftingtask.type.md"] = nsDoc_bitburner_graftingtask_type_md;
|
||||
AllPages["nsDoc/bitburner.gymenumtype.md"] = nsDoc_bitburner_gymenumtype_md;
|
||||
@@ -2342,6 +2368,7 @@ AllPages["nsDoc/bitburner.hackingformulas.hackexp.md"] = nsDoc_bitburner_hacking
|
||||
AllPages["nsDoc/bitburner.hackingformulas.hackpercent.md"] = nsDoc_bitburner_hackingformulas_hackpercent_md;
|
||||
AllPages["nsDoc/bitburner.hackingformulas.hacktime.md"] = nsDoc_bitburner_hackingformulas_hacktime_md;
|
||||
AllPages["nsDoc/bitburner.hackingformulas.md"] = nsDoc_bitburner_hackingformulas_md;
|
||||
AllPages["nsDoc/bitburner.hackingformulas.weakeneffect.md"] = nsDoc_bitburner_hackingformulas_weakeneffect_md;
|
||||
AllPages["nsDoc/bitburner.hackingformulas.weakentime.md"] = nsDoc_bitburner_hackingformulas_weakentime_md;
|
||||
AllPages["nsDoc/bitburner.hackingmultipliers.chance.md"] = nsDoc_bitburner_hackingmultipliers_chance_md;
|
||||
AllPages["nsDoc/bitburner.hackingmultipliers.growth.md"] = nsDoc_bitburner_hackingmultipliers_growth_md;
|
||||
@@ -2767,6 +2794,8 @@ AllPages["nsDoc/bitburner.player.md"] = nsDoc_bitburner_player_md;
|
||||
AllPages["nsDoc/bitburner.player.money.md"] = nsDoc_bitburner_player_money_md;
|
||||
AllPages["nsDoc/bitburner.player.numpeoplekilled.md"] = nsDoc_bitburner_player_numpeoplekilled_md;
|
||||
AllPages["nsDoc/bitburner.player.totalplaytime.md"] = nsDoc_bitburner_player_totalplaytime_md;
|
||||
AllPages["nsDoc/bitburner.playerbasetask.cyclesworked.md"] = nsDoc_bitburner_playerbasetask_cyclesworked_md;
|
||||
AllPages["nsDoc/bitburner.playerbasetask.md"] = nsDoc_bitburner_playerbasetask_md;
|
||||
AllPages["nsDoc/bitburner.playerrequirement.md"] = nsDoc_bitburner_playerrequirement_md;
|
||||
AllPages["nsDoc/bitburner.positionenumtype.md"] = nsDoc_bitburner_positionenumtype_md;
|
||||
AllPages["nsDoc/bitburner.positiontype.md"] = nsDoc_bitburner_positiontype_md;
|
||||
@@ -2979,20 +3008,45 @@ AllPages["nsDoc/bitburner.sleeve.settosynchronize.md"] = nsDoc_bitburner_sleeve_
|
||||
AllPages["nsDoc/bitburner.sleeve.settouniversitycourse.md"] = nsDoc_bitburner_sleeve_settouniversitycourse_md;
|
||||
AllPages["nsDoc/bitburner.sleeve.travel.md"] = nsDoc_bitburner_sleeve_travel_md;
|
||||
AllPages["nsDoc/bitburner.sleeve.upgradememory.md"] = nsDoc_bitburner_sleeve_upgradememory_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.actionname.md"] = nsDoc_bitburner_sleevebladeburnertask_actionname_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.actiontype.md"] = nsDoc_bitburner_sleevebladeburnertask_actiontype_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.cyclesneeded.md"] = nsDoc_bitburner_sleevebladeburnertask_cyclesneeded_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.cyclesworked.md"] = nsDoc_bitburner_sleevebladeburnertask_cyclesworked_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.md"] = nsDoc_bitburner_sleevebladeburnertask_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.taskscompleted.md"] = nsDoc_bitburner_sleevebladeburnertask_taskscompleted_md;
|
||||
AllPages["nsDoc/bitburner.sleevebladeburnertask.type.md"] = nsDoc_bitburner_sleevebladeburnertask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleeveclasstask.classtype.md"] = nsDoc_bitburner_sleeveclasstask_classtype_md;
|
||||
AllPages["nsDoc/bitburner.sleeveclasstask.location.md"] = nsDoc_bitburner_sleeveclasstask_location_md;
|
||||
AllPages["nsDoc/bitburner.sleeveclasstask.md"] = nsDoc_bitburner_sleeveclasstask_md;
|
||||
AllPages["nsDoc/bitburner.sleeveclasstask.type.md"] = nsDoc_bitburner_sleeveclasstask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevecompanytask.companyname.md"] = nsDoc_bitburner_sleevecompanytask_companyname_md;
|
||||
AllPages["nsDoc/bitburner.sleevecompanytask.md"] = nsDoc_bitburner_sleevecompanytask_md;
|
||||
AllPages["nsDoc/bitburner.sleevecompanytask.type.md"] = nsDoc_bitburner_sleevecompanytask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.crimetype.md"] = nsDoc_bitburner_sleevecrimetask_crimetype_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.cyclesneeded.md"] = nsDoc_bitburner_sleevecrimetask_cyclesneeded_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.cyclesworked.md"] = nsDoc_bitburner_sleevecrimetask_cyclesworked_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.md"] = nsDoc_bitburner_sleevecrimetask_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.taskscompleted.md"] = nsDoc_bitburner_sleevecrimetask_taskscompleted_md;
|
||||
AllPages["nsDoc/bitburner.sleevecrimetask.type.md"] = nsDoc_bitburner_sleevecrimetask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevefactiontask.factionname.md"] = nsDoc_bitburner_sleevefactiontask_factionname_md;
|
||||
AllPages["nsDoc/bitburner.sleevefactiontask.factionworktype.md"] = nsDoc_bitburner_sleevefactiontask_factionworktype_md;
|
||||
AllPages["nsDoc/bitburner.sleevefactiontask.md"] = nsDoc_bitburner_sleevefactiontask_md;
|
||||
AllPages["nsDoc/bitburner.sleevefactiontask.type.md"] = nsDoc_bitburner_sleevefactiontask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleeveinfiltratetask.cyclesneeded.md"] = nsDoc_bitburner_sleeveinfiltratetask_cyclesneeded_md;
|
||||
AllPages["nsDoc/bitburner.sleeveinfiltratetask.cyclesworked.md"] = nsDoc_bitburner_sleeveinfiltratetask_cyclesworked_md;
|
||||
AllPages["nsDoc/bitburner.sleeveinfiltratetask.md"] = nsDoc_bitburner_sleeveinfiltratetask_md;
|
||||
AllPages["nsDoc/bitburner.sleeveinfiltratetask.type.md"] = nsDoc_bitburner_sleeveinfiltratetask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleeveperson.md"] = nsDoc_bitburner_sleeveperson_md;
|
||||
AllPages["nsDoc/bitburner.sleeveperson.memory.md"] = nsDoc_bitburner_sleeveperson_memory_md;
|
||||
AllPages["nsDoc/bitburner.sleeveperson.shock.md"] = nsDoc_bitburner_sleeveperson_shock_md;
|
||||
AllPages["nsDoc/bitburner.sleeveperson.storedcycles.md"] = nsDoc_bitburner_sleeveperson_storedcycles_md;
|
||||
AllPages["nsDoc/bitburner.sleeveperson.sync.md"] = nsDoc_bitburner_sleeveperson_sync_md;
|
||||
AllPages["nsDoc/bitburner.sleeverecoverytask.md"] = nsDoc_bitburner_sleeverecoverytask_md;
|
||||
AllPages["nsDoc/bitburner.sleeverecoverytask.type.md"] = nsDoc_bitburner_sleeverecoverytask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevesupporttask.md"] = nsDoc_bitburner_sleevesupporttask_md;
|
||||
AllPages["nsDoc/bitburner.sleevesupporttask.type.md"] = nsDoc_bitburner_sleevesupporttask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevesynchrotask.md"] = nsDoc_bitburner_sleevesynchrotask_md;
|
||||
AllPages["nsDoc/bitburner.sleevesynchrotask.type.md"] = nsDoc_bitburner_sleevesynchrotask_type_md;
|
||||
AllPages["nsDoc/bitburner.sleevetask.md"] = nsDoc_bitburner_sleevetask_md;
|
||||
AllPages["nsDoc/bitburner.somerequirement.conditions.md"] = nsDoc_bitburner_somerequirement_conditions_md;
|
||||
AllPages["nsDoc/bitburner.somerequirement.md"] = nsDoc_bitburner_somerequirement_md;
|
||||
|
||||
@@ -4,6 +4,8 @@ import { TextField } from "@mui/material";
|
||||
import Button from "@mui/material/Button";
|
||||
import Paper from "@mui/material/Paper";
|
||||
import Typography from "@mui/material/Typography";
|
||||
import Tooltip from "@mui/material/Tooltip";
|
||||
import InfoIcon from "@mui/icons-material/Info";
|
||||
|
||||
import { Player } from "@player";
|
||||
import {
|
||||
@@ -24,6 +26,7 @@ export function ShareOption({ rerender }: { rerender: () => void }): React.React
|
||||
|
||||
const home = Player.getHomeComputer();
|
||||
const threads = Math.floor(ram / 4);
|
||||
const ramUsage = roundToTwo(4 * threads);
|
||||
|
||||
function onShare(): void {
|
||||
if (threads === 0) {
|
||||
@@ -34,7 +37,6 @@ export function ShareOption({ rerender }: { rerender: () => void }): React.React
|
||||
return;
|
||||
}
|
||||
const freeRAM = home.maxRam - home.ramUsed;
|
||||
const ramUsage = roundToTwo(4 * threads);
|
||||
if (ramUsage > freeRAM + 0.001) {
|
||||
dialogBoxCreate("Not enough RAM.");
|
||||
return;
|
||||
@@ -50,6 +52,7 @@ export function ShareOption({ rerender }: { rerender: () => void }): React.React
|
||||
rerender();
|
||||
}, ShareBonusTime);
|
||||
pendingUIShareJobIds.push(jobId);
|
||||
rerender();
|
||||
}
|
||||
|
||||
return (
|
||||
@@ -62,27 +65,40 @@ export function ShareOption({ rerender }: { rerender: () => void }): React.React
|
||||
<br />
|
||||
Free RAM on home computer: {formatRam(home.maxRam - home.ramUsed)}.
|
||||
<br />
|
||||
Current bonus: {formatNumber(calculateCurrentShareBonus(), 6)}. Bonus with {formatRam(ram)}:{" "}
|
||||
Current bonus: {formatNumber(calculateCurrentShareBonus(), 6)}. Bonus with {formatRam(ramUsage)}:{" "}
|
||||
{formatNumber(calculateShareBonusWithAdditionalThreads(threads, home.cpuCores), 6)}
|
||||
</Typography>
|
||||
|
||||
<TextField
|
||||
value={ram}
|
||||
onChange={(event) => {
|
||||
if (event.target.value === "") {
|
||||
setRam(0);
|
||||
return;
|
||||
<Typography component="div" style={{ display: "flex" }}>
|
||||
<TextField
|
||||
value={ram}
|
||||
onChange={(event) => {
|
||||
if (event.target.value === "") {
|
||||
setRam(0);
|
||||
return;
|
||||
}
|
||||
const value = Number.parseFloat(event.target.value);
|
||||
if (!Number.isFinite(value) || value < 0) {
|
||||
return;
|
||||
}
|
||||
setRam(value);
|
||||
}}
|
||||
/>
|
||||
<Tooltip
|
||||
title={
|
||||
<Typography>
|
||||
RAM shared via this tool is rounded down to the nearest multiple of 4.
|
||||
<br />
|
||||
For example, a value of 18 GB results in 16 GB.
|
||||
</Typography>
|
||||
}
|
||||
const value = Number.parseFloat(event.target.value);
|
||||
if (!Number.isFinite(value) || value < 0) {
|
||||
return;
|
||||
}
|
||||
setRam(value);
|
||||
}}
|
||||
InputProps={{
|
||||
endAdornment: <Button onClick={onShare}>Share</Button>,
|
||||
}}
|
||||
/>
|
||||
>
|
||||
<Typography component="div" style={{ display: "flex", alignItems: "center" }}>
|
||||
<Button onClick={onShare}>Share</Button>
|
||||
<InfoIcon sx={{ fontSize: "1.5em", marginLeft: "10px" }} />
|
||||
</Typography>
|
||||
</Tooltip>
|
||||
</Typography>
|
||||
</Paper>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,10 @@ import Tabs from "@mui/material/Tabs";
|
||||
import Tab from "@mui/material/Tab";
|
||||
|
||||
import { useCycleRerender } from "../../ui/React/hooks";
|
||||
import Button from "@mui/material/Button";
|
||||
import { Router } from "../../ui/GameRoot";
|
||||
import { Page } from "../../ui/Router";
|
||||
import { Factions } from "../../Faction/Factions";
|
||||
|
||||
/** React Component for all the gang stuff. */
|
||||
export function GangRoot(): React.ReactElement {
|
||||
@@ -18,7 +22,7 @@ export function GangRoot(): React.ReactElement {
|
||||
})();
|
||||
const [value, setValue] = React.useState(0);
|
||||
|
||||
function handleChange(event: React.SyntheticEvent, tab: number): void {
|
||||
function handleChange(__event: React.SyntheticEvent, tab: number): void {
|
||||
setValue(tab);
|
||||
}
|
||||
|
||||
@@ -26,11 +30,26 @@ export function GangRoot(): React.ReactElement {
|
||||
|
||||
return (
|
||||
<Context.Gang.Provider value={gang}>
|
||||
<Tabs variant="fullWidth" value={value} onChange={handleChange} sx={{ minWidth: "fit-content", maxWidth: "45%" }}>
|
||||
<Tab label="Management" />
|
||||
<Tab label="Equipment" />
|
||||
<Tab label="Territory" />
|
||||
</Tabs>
|
||||
<div style={{ display: "flex" }}>
|
||||
<Tabs
|
||||
variant="fullWidth"
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
sx={{ minWidth: "fit-content", maxWidth: "45%" }}
|
||||
>
|
||||
<Tab label="Management" />
|
||||
<Tab label="Equipment" />
|
||||
<Tab label="Territory" />
|
||||
</Tabs>
|
||||
<Button
|
||||
style={{ marginLeft: "20px" }}
|
||||
onClick={() => {
|
||||
Router.toPage(Page.Faction, { faction: Factions[gang.facName] });
|
||||
}}
|
||||
>
|
||||
Faction
|
||||
</Button>
|
||||
</div>
|
||||
{value === 0 && <ManagementSubpage />}
|
||||
{value === 1 && <EquipmentsSubpage />}
|
||||
{value === 2 && <TerritorySubpage />}
|
||||
|
||||
@@ -16,7 +16,7 @@ export function calculateLevelUpgradeCost(startingLevel: number, extraLevels = 1
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingLevel >= HacknetNodeConstants.MaxLevel) {
|
||||
if (startingLevel + sanitizedLevels > HacknetNodeConstants.MaxLevel) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ export function calculateRamUpgradeCost(startingRam: number, extraLevels = 1, co
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingRam >= HacknetNodeConstants.MaxRam) {
|
||||
if (startingRam * Math.pow(2, sanitizedLevels) > HacknetNodeConstants.MaxRam) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
@@ -60,20 +60,20 @@ export function calculateRamUpgradeCost(startingRam: number, extraLevels = 1, co
|
||||
return totalCost;
|
||||
}
|
||||
|
||||
export function calculateCoreUpgradeCost(startingCore: number, extraLevels = 1, costMult = 1): number {
|
||||
export function calculateCoreUpgradeCost(startingCores: number, extraLevels = 1, costMult = 1): number {
|
||||
const sanitizedCores = Math.round(extraLevels);
|
||||
if (isNaN(sanitizedCores) || sanitizedCores < 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingCore >= HacknetNodeConstants.MaxCores) {
|
||||
if (startingCores + sanitizedCores > HacknetNodeConstants.MaxCores) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
const coreBaseCost = HacknetNodeConstants.CoreBaseCost;
|
||||
const mult = HacknetNodeConstants.UpgradeCoreMult;
|
||||
let totalCost = 0;
|
||||
let currentCores = startingCore;
|
||||
let currentCores = startingCores;
|
||||
for (let i = 0; i < sanitizedCores; ++i) {
|
||||
totalCost += coreBaseCost * Math.pow(mult, currentCores - 1);
|
||||
++currentCores;
|
||||
|
||||
@@ -22,7 +22,7 @@ export function calculateLevelUpgradeCost(startingLevel: number, extraLevels = 1
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingLevel >= HacknetServerConstants.MaxLevel) {
|
||||
if (startingLevel + sanitizedLevels > HacknetServerConstants.MaxLevel) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ export function calculateRamUpgradeCost(startingRam: number, extraLevels = 1, co
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingRam >= HacknetServerConstants.MaxRam) {
|
||||
if (startingRam * Math.pow(2, sanitizedLevels) > HacknetServerConstants.MaxRam) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ export function calculateCoreUpgradeCost(startingCores: number, extraLevels = 1,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingCores >= HacknetServerConstants.MaxCores) {
|
||||
if (startingCores + sanitizedLevels > HacknetServerConstants.MaxCores) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ export function calculateCacheUpgradeCost(startingCache: number, extraLevels = 1
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (startingCache >= HacknetServerConstants.MaxCache) {
|
||||
if (startingCache + sanitizedLevels > HacknetServerConstants.MaxCache) {
|
||||
return Infinity;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ function coloredArrow(difficulty: number): JSX.Element {
|
||||
} else {
|
||||
return (
|
||||
<>
|
||||
{arrowPart(Settings.theme.primary, cappedDifficulty * 13)}
|
||||
{arrowPart(Settings.theme.success, cappedDifficulty * 13)}
|
||||
{arrowPart(Settings.theme.warning, (cappedDifficulty - 1) * 13)}
|
||||
{arrowPart(Settings.theme.warning, (cappedDifficulty - 2) * 13)}
|
||||
{arrowPart(Settings.theme.error, (cappedDifficulty - 3) * 26)}
|
||||
|
||||
+24
-24
@@ -4,37 +4,37 @@ let pidCounter = 1;
|
||||
|
||||
/** Find and return the next available PID for a script */
|
||||
export function generateNextPid(): number {
|
||||
let tempCounter = pidCounter;
|
||||
let pidCandidate = pidCounter;
|
||||
|
||||
// Cap the number of search iterations at some arbitrary value to avoid
|
||||
// infinite loops. We'll assume that players wont have 1mil+ running scripts
|
||||
let found = false;
|
||||
for (let i = 0; i < 1e6; ) {
|
||||
if (!workerScripts.has(tempCounter + i)) {
|
||||
found = true;
|
||||
tempCounter = tempCounter + i;
|
||||
break;
|
||||
// infinite loops. We'll assume that players won't have a million running scripts.
|
||||
for (let attemptCounter = 0; attemptCounter < 1e6; ++attemptCounter, ++pidCandidate) {
|
||||
// ensure the candidate PID is a safe integer
|
||||
if (pidCandidate >= Number.MAX_SAFE_INTEGER) {
|
||||
pidCandidate = 1;
|
||||
}
|
||||
|
||||
if (i === Number.MAX_SAFE_INTEGER - 1) {
|
||||
i = 1;
|
||||
} else {
|
||||
++i;
|
||||
// ensure the PID is not in use
|
||||
if (workerScripts.has(pidCandidate)) {
|
||||
continue;
|
||||
}
|
||||
// found a PID that's not in use
|
||||
pidCounter = pidCandidate + 1;
|
||||
return pidCandidate;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
pidCounter = tempCounter + 1;
|
||||
if (pidCounter >= Number.MAX_SAFE_INTEGER) {
|
||||
pidCounter = 1;
|
||||
}
|
||||
|
||||
return tempCounter;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
// ran out of attempts without finding an unused PID :-(
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the PID counter to 1.
|
||||
*
|
||||
* Note that the list of recently finished scripts has to be
|
||||
* cleared (`recentScripts.splice(0)`) when resetting the PID counter.
|
||||
* Otherwise scripts which re-use a PID that is still in the
|
||||
* list of recent scripts do not show up there when they finish
|
||||
* (if the previous script with that PID is still in the list at that point),
|
||||
* because the function `AddRecentScript` de-duplicates scripts by PID.
|
||||
*/
|
||||
export function resetPidCounter(): void {
|
||||
pidCounter = 1;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user