From aaf80a9a3319bc0078f5e974d1a07a4c05bf4401 Mon Sep 17 00:00:00 2001 From: Snarling <84951833+Snarling@users.noreply.github.com> Date: Sun, 5 Nov 2023 20:09:34 -0500 Subject: [PATCH] SLEEVE: Add a nextCompletion promise to SleeveBladeburnerWork (#916) --- markdown/bitburner.product.md | 1 + markdown/bitburner.product.size.md | 13 +++++++++++ markdown/bitburner.sleevebladeburnertask.md | 1 + .../Sleeve/Work/SleeveBladeburnerWork.ts | 23 ++++++++++++++++--- src/ScriptEditor/NetscriptDefinitions.d.ts | 1 + 5 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 markdown/bitburner.product.size.md diff --git a/markdown/bitburner.product.md b/markdown/bitburner.product.md index 58b45ca2b..8ff6ad02e 100644 --- a/markdown/bitburner.product.md +++ b/markdown/bitburner.product.md @@ -29,6 +29,7 @@ interface Product | [productionAmount](./bitburner.product.productionamount.md) | | number | Amount of product produced last cycle | | [productionCost](./bitburner.product.productioncost.md) | | number | Production cost | | [rating](./bitburner.product.rating.md) | | number | Rating based on stats | +| [size](./bitburner.product.size.md) | | number | How much warehouse space is occupied per unit of this product | | [stats](./bitburner.product.stats.md) | | { quality: number; performance: number; durability: number; reliability: number; aesthetics: number; features: number; } | Product stats | | [stored](./bitburner.product.stored.md) | | number | Amount of product stored in warehouse | diff --git a/markdown/bitburner.product.size.md b/markdown/bitburner.product.size.md new file mode 100644 index 000000000..7570af9a9 --- /dev/null +++ b/markdown/bitburner.product.size.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [bitburner](./bitburner.md) > [Product](./bitburner.product.md) > [size](./bitburner.product.size.md) + +## Product.size property + +How much warehouse space is occupied per unit of this product + +**Signature:** + +```typescript +size: number; +``` diff --git a/markdown/bitburner.sleevebladeburnertask.md b/markdown/bitburner.sleevebladeburnertask.md index 1c5bec15c..eadb26562 100644 --- a/markdown/bitburner.sleevebladeburnertask.md +++ b/markdown/bitburner.sleevebladeburnertask.md @@ -14,5 +14,6 @@ type SleeveBladeburnerTask = { actionName: string; cyclesWorked: number; cyclesNeeded: number; + nextCompletion: Promise; }; ``` diff --git a/src/PersonObjects/Sleeve/Work/SleeveBladeburnerWork.ts b/src/PersonObjects/Sleeve/Work/SleeveBladeburnerWork.ts index 708d4f2f4..6c13e850e 100644 --- a/src/PersonObjects/Sleeve/Work/SleeveBladeburnerWork.ts +++ b/src/PersonObjects/Sleeve/Work/SleeveBladeburnerWork.ts @@ -5,6 +5,7 @@ import { applySleeveGains, SleeveWorkClass, SleeveWorkType } from "./Work"; import { CONSTANTS } from "../../../Constants"; import { GeneralActions } from "../../../Bladeburner/data/GeneralActions"; import { scaleWorkStats } from "../../../Work/WorkStats"; +import { getKeyList } from "../../../utils/helpers/getKeyList"; interface SleeveBladeburnerWorkParams { type: "General" | "Contracts"; @@ -19,9 +20,14 @@ export class SleeveBladeburnerWork extends SleeveWorkClass { cyclesWorked = 0; actionType: "General" | "Contracts"; actionName: string; + signalCompletion = () => { + // Intentionally empty function, this is just an initial value and will never be used. + }; + nextCompletion: Promise; constructor(params?: SleeveBladeburnerWorkParams) { super(); + this.nextCompletion = new Promise((r) => (this.signalCompletion = r)); this.actionType = params?.type ?? "General"; this.actionName = params?.name ?? "Field Analysis"; } @@ -32,6 +38,10 @@ export class SleeveBladeburnerWork extends SleeveWorkClass { return ret / CONSTANTS.MilliPerCycle; } + finish() { + this.signalCompletion(); + } + process(sleeve: Sleeve, cycles: number) { if (!Player.bladeburner) return sleeve.stopWork(); this.cyclesWorked += cycles; @@ -43,7 +53,7 @@ export class SleeveBladeburnerWork extends SleeveWorkClass { if (action.count < 1) return sleeve.stopWork(); } - while (this.cyclesWorked > this.cyclesNeeded(sleeve)) { + while (this.cyclesWorked >= this.cyclesNeeded(sleeve)) { if (this.actionType === "Contracts") { const action = Player.bladeburner.getActionObject(actionIdent); if (!action) throw new Error(`Error getting ${this.actionName} action object`); @@ -60,6 +70,10 @@ export class SleeveBladeburnerWork extends SleeveWorkClass { applySleeveGains(sleeve, scaleWorkStats(retValue, sleeve.shockBonus(), false)); } this.cyclesWorked -= this.cyclesNeeded(sleeve); + // Resolve and reset nextCompletion promise + const resolver = this.signalCompletion; + this.nextCompletion = new Promise((r) => (this.signalCompletion = r)); + resolver(); } } @@ -70,17 +84,20 @@ export class SleeveBladeburnerWork extends SleeveWorkClass { actionName: this.actionName, cyclesWorked: this.cyclesWorked, cyclesNeeded: this.cyclesNeeded(sleeve), + nextCompletion: this.nextCompletion, }; } + static savedKeys = getKeyList(SleeveBladeburnerWork, { removedKeys: ["signalCompletion", "nextCompletion"] }); + /** Serialize the current object to a JSON save state. */ toJSON(): IReviverValue { - return Generic_toJSON("SleeveBladeburnerWork", this); + return Generic_toJSON("SleeveBladeburnerWork", this, SleeveBladeburnerWork.savedKeys); } /** Initializes a BladeburnerWork object from a JSON save state. */ static fromJSON(value: IReviverValue): SleeveBladeburnerWork { - return Generic_fromJSON(SleeveBladeburnerWork, value.data); + return Generic_fromJSON(SleeveBladeburnerWork, value.data, SleeveBladeburnerWork.savedKeys); } } diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts index 668171ecd..4d86900fa 100644 --- a/src/ScriptEditor/NetscriptDefinitions.d.ts +++ b/src/ScriptEditor/NetscriptDefinitions.d.ts @@ -986,6 +986,7 @@ type SleeveBladeburnerTask = { actionName: string; cyclesWorked: number; cyclesNeeded: number; + nextCompletion: Promise; }; /** @public */