From 95b739f703cd7d2b50449da954fcf0ec84bad56c Mon Sep 17 00:00:00 2001 From: catloversg <152669316+catloversg@users.noreply.github.com> Date: Wed, 11 Feb 2026 00:39:31 +0700 Subject: [PATCH] BUGFIX: Darknet state is not reset properly on prestige (#2486) --- src/DarkNet/effects/labyrinth.ts | 4 ++-- src/DarkNet/models/DarknetState.ts | 22 ++++++++++++++++++++++ src/Prestige.ts | 5 +++++ src/Server/AllServers.ts | 9 +-------- test/jest/Netscript/Darknet.test.ts | 6 ++++++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/DarkNet/effects/labyrinth.ts b/src/DarkNet/effects/labyrinth.ts index 46814ac1d..906b30668 100644 --- a/src/DarkNet/effects/labyrinth.ts +++ b/src/DarkNet/effects/labyrinth.ts @@ -24,7 +24,7 @@ const PATH = " "; const MULTI_MAZE_THRESHOLD = 5; -type labDetails = { +type LabDetails = { name: string; depth: number; cha: number; @@ -33,7 +33,7 @@ type labDetails = { manual: boolean; }; -export const labData: Record = { +export const labData: Record = { [SpecialServers.NormalLab]: { name: SpecialServers.NormalLab, depth: 7, diff --git a/src/DarkNet/models/DarknetState.ts b/src/DarkNet/models/DarknetState.ts index 97f9a7e1e..4559c9cbd 100644 --- a/src/DarkNet/models/DarknetState.ts +++ b/src/DarkNet/models/DarknetState.ts @@ -22,6 +22,9 @@ export type LogEntry = { message: string | PasswordResponse; }; +/** + * If you add a new property to this global state, you must check if you need to reset it in prestigeDarknetState. + */ export const DarknetState = { allowMutating: true, openServer: null as BaseServer | null, @@ -57,6 +60,25 @@ export const DarknetState = { netViewLeftScroll: 0, }; +export function prestigeDarknetState(prestigeSourceFile: boolean): void { + DarknetState.allowMutating = true; + DarknetState.openServer = null; + DarknetState.storedCycles = 0; + if (prestigeSourceFile) { + DarknetState.hasUsedHeartbleed = false; + } + DarknetState.cyclesSinceLastMutation = 0; + DarknetState.Network = new Array(MAX_NET_DEPTH).fill(null).map(() => new Array(NET_WIDTH).fill(null)); + DarknetState.labyrinth = null; + DarknetState.labLocations = { "-1": [1, 1] }; + DarknetState.lastPhishingCacheTime = new Date(); + DarknetState.lastStormTime = new Date(); + DarknetState.stockPromotions = {}; + DarknetState.migrationInductionServers.clear(); + DarknetState.serverState.clear(); + DarknetState.offlineServers = []; +} + /** * Get the server state. It will initialize the state if it does not exist in DarknetState.serverState. */ diff --git a/src/Prestige.ts b/src/Prestige.ts index 60b99a4e8..73cf1307a 100644 --- a/src/Prestige.ts +++ b/src/Prestige.ts @@ -33,6 +33,7 @@ import { pendingUIShareJobIds } from "./NetworkShare/Share"; import { getDarkscapeNavigator } from "./DarkNet/effects/effects"; import { CodingContractEventEmitter } from "./CodingContract/CodingContractEventEmitter"; import { showLiterature } from "./Literature/LiteratureHelpers"; +import { prestigeDarknetState } from "./DarkNet/models/DarknetState"; const BitNode8StartingMoney = 250e6; function delayedDialog(message: string, canBeDismissedEasily = true) { @@ -75,6 +76,8 @@ export function prestigeAugmentation(): void { // Delete all servers except home computer prestigeAllServers(); + prestigeDarknetState(false); + // Reset home computer (only the programs) and add to AllServers AddToAllServers(homeComp); prestigeHomeComputer(homeComp); @@ -225,6 +228,8 @@ export function prestigeSourceFile(isFlume: boolean): void { // Delete all servers except home computer prestigeAllServers(); // Must be done before initForeignServers() + prestigeDarknetState(true); + // Reset home computer (only the programs) and add to AllServers AddToAllServers(homeComp); prestigeHomeComputer(homeComp); diff --git a/src/Server/AllServers.ts b/src/Server/AllServers.ts index 2983493a5..4eda2c7af 100644 --- a/src/Server/AllServers.ts +++ b/src/Server/AllServers.ts @@ -11,8 +11,6 @@ import "../Script/RunningScript"; // For reviver side-effect import { assertObject } from "../utils/TypeAssertion"; import { DarknetServer } from "./DarknetServer"; import { applyRamBlocks } from "../DarkNet/effects/ramblock"; -import { DarknetState } from "../DarkNet/models/DarknetState"; -import { MAX_NET_DEPTH, NET_WIDTH } from "../DarkNet/Enums"; /** * Map of all Servers that exist in the game @@ -150,10 +148,6 @@ export const renameServer = (hostname: string, newName: string): void => { export function prestigeAllServers(): void { AllServers.clear(); - // WIP: Check other properties in DarknetState as well, then improve validateDarknetNetwork. - DarknetState.Network = new Array(MAX_NET_DEPTH) - .fill(null) - .map(() => new Array(NET_WIDTH).fill(null)); } export function loadAllServers(saveString: string): void { @@ -166,9 +160,8 @@ export function loadAllServers(saveString: string): void { for (const [serverName, server] of Object.entries(allServersData)) { if (!(server instanceof Server) && !(server instanceof HacknetServer) && !(server instanceof DarknetServer)) { throw new Error(`Server ${serverName} is not an instance of Server or HacknetServer or DarknetServer.`); - } else { - AllServers.set(serverName, server); } + AllServers.set(serverName, server); } // Apply blocked ram for darknet servers diff --git a/test/jest/Netscript/Darknet.test.ts b/test/jest/Netscript/Darknet.test.ts index 7d89dffb2..733840998 100644 --- a/test/jest/Netscript/Darknet.test.ts +++ b/test/jest/Netscript/Darknet.test.ts @@ -1298,6 +1298,12 @@ describe("lab location methods", () => { }); test("dnet.labradar()", async () => { const ns = getNsOnServerNearLabyrinth(); + + // Make sure we are at the starting point. + const locationStatus = (await ns.dnet.labreport()) as LocationStatus; + expect(isLocationStatus(locationStatus)).toBe(true); + expect(locationStatus.coords).toStrictEqual([1, 1]); + const response = (await ns.dnet.labradar()) as Result; assertNonNullish(response.message); const surroundingsString = response.message.split("\n");