From d4bdb8de2bfc34e83e9c9ab13a91ad1ca5949007 Mon Sep 17 00:00:00 2001 From: catloversg <152669316+catloversg@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:35:56 +0700 Subject: [PATCH] MISC: Rework reputation bonus after installing a backdoor (#1236) --- src/Company/utils.ts | 8 ++++++++ src/Constants.ts | 3 +++ src/Documentation/doc/advanced/faction_list.md | 2 ++ src/Faction/FactionJoinCondition.ts | 15 ++++++++------- src/NetscriptFunctions/Singularity.ts | 3 ++- src/Server/ServerHelpers.ts | 10 ++++++++++ 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/Company/utils.ts b/src/Company/utils.ts index e936ccad0..3853d7004 100644 --- a/src/Company/utils.ts +++ b/src/Company/utils.ts @@ -1,4 +1,6 @@ import type { CompanyName, LocationName } from "@enums"; +import { CONSTANTS } from "../Constants"; +import { isBackdoorInstalledInCompanyServer } from "../Server/ServerHelpers"; type LocationNameString = `${LocationName}`; type CompanyNameString = `${CompanyName}`; @@ -9,3 +11,9 @@ export function companyNameAsLocationName(companyName: CompanyName): LocationNam // Due to the check above, we know that all company names are valid location names. return companyName as unknown as LocationName; } + +export function calculateEffectiveRequiredReputation(companyName: CompanyName, reputation: number): number { + return ( + reputation * (isBackdoorInstalledInCompanyServer(companyName) ? CONSTANTS.CompanyRequiredReputationMultiplier : 1) + ); +} diff --git a/src/Constants.ts b/src/Constants.ts index f786797ea..f36632104 100644 --- a/src/Constants.ts +++ b/src/Constants.ts @@ -53,6 +53,7 @@ export const CONSTANTS: { SoARepMult: number; EntropyEffect: number; Donations: number; // number of blood/plasma/palette donation the dev have verified., boosts NFG + CompanyRequiredReputationMultiplier: number; // Only use this if a backdoor is installed in the company's server LatestUpdate: string; } = { VersionString: "2.6.1dev", @@ -153,6 +154,8 @@ export const CONSTANTS: { Donations: 151, + CompanyRequiredReputationMultiplier: 0.75, + // Also update doc/source/changelog.rst LatestUpdate: ` ## v2.6.1 dev - last updated 23 Apr 2024 diff --git a/src/Documentation/doc/advanced/faction_list.md b/src/Documentation/doc/advanced/faction_list.md index 7a8444188..0a51a8300 100644 --- a/src/Documentation/doc/advanced/faction_list.md +++ b/src/Documentation/doc/advanced/faction_list.md @@ -31,6 +31,8 @@ ### Megacorporations +If you install a backdoor on a company's server, the required reputation of that company faction is reduced by 25%. + | Faction Name | Requirements | | --------------------------- | ----------------------------------------------------------------------------------------------------- | | ECorp | \* Have 400k reputation with the Corporation | diff --git a/src/Faction/FactionJoinCondition.ts b/src/Faction/FactionJoinCondition.ts index 38d1bcec6..dff62d1c4 100644 --- a/src/Faction/FactionJoinCondition.ts +++ b/src/Faction/FactionJoinCondition.ts @@ -3,7 +3,6 @@ import { ServerName } from "../Types/strings"; import { Server } from "../Server/Server"; import { GetServer } from "../Server/AllServers"; import { HacknetServer } from "../Hacknet/HacknetServer"; -import { serverMetadata } from "../Server/data/servers"; import { Companies } from "../Company/Companies"; import { formatReputation, formatMoney, formatRam } from "../ui/formatNumber"; import type { PlayerObject } from "../PersonObjects/Player/PlayerObject"; @@ -29,6 +28,7 @@ import type { SomeRequirement, EveryRequirement, } from "@nsdefs"; +import { calculateEffectiveRequiredReputation } from "../Company/utils"; /** * Declarative format for checking that the player satisfies some condition, such as the requirements for being invited to a faction. @@ -69,18 +69,19 @@ export const employedBy = (companyName: CompanyName): PlayerCondition => ({ export const haveCompanyRep = (companyName: CompanyName, rep: number): PlayerCondition => ({ toString(): string { - return `${formatReputation(rep)} reputation with ${companyName}`; + return `${formatReputation(calculateEffectiveRequiredReputation(companyName, rep))} reputation with ${companyName}`; }, toJSON(): CompanyReputationRequirement { - return { type: "companyReputation", company: companyName, reputation: rep }; + return { + type: "companyReputation", + company: companyName, + reputation: calculateEffectiveRequiredReputation(companyName, rep), + }; }, isSatisfied(): boolean { const company = Companies[companyName]; if (!company) return false; - const serverMeta = serverMetadata.find((s) => s.specialName === companyName); - const server = GetServer(serverMeta ? serverMeta.hostname : ""); - const bonus = server?.backdoorInstalled ? 100e3 : 0; - return company.playerReputation + bonus >= rep; + return company.playerReputation >= calculateEffectiveRequiredReputation(companyName, rep); }, }); diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts index 61b169493..4ad8ab147 100644 --- a/src/NetscriptFunctions/Singularity.ts +++ b/src/NetscriptFunctions/Singularity.ts @@ -57,6 +57,7 @@ import { getRecordEntries } from "../Types/Record"; import { JobTracks } from "../Company/data/JobTracks"; import { ServerConstants } from "../Server/data/Constants"; import { blackOpsArray } from "../Bladeburner/data/BlackOperations"; +import { calculateEffectiveRequiredReputation } from "../Company/utils"; export function NetscriptSingularity(): InternalAPI { const runAfterReset = function (cbScript: ScriptFilePath) { @@ -691,7 +692,7 @@ export function NetscriptSingularity(): InternalAPI { field: job.field, nextPosition: job.nextPosition, salary: job.baseSalary * company.salaryMultiplier, - requiredReputation: job.requiredReputation, + requiredReputation: calculateEffectiveRequiredReputation(companyName, job.requiredReputation), requiredSkills: job.requiredSkills(company.jobStatReqOffset), }; return res; diff --git a/src/Server/ServerHelpers.ts b/src/Server/ServerHelpers.ts index 7f60233ca..ee6ad8419 100644 --- a/src/Server/ServerHelpers.ts +++ b/src/Server/ServerHelpers.ts @@ -10,6 +10,7 @@ import { Person as IPerson } from "@nsdefs"; import { Server as IServer } from "@nsdefs"; import { workerScripts } from "../Netscript/WorkerScripts"; import { killWorkerScriptByPid } from "../Netscript/killWorkerScript"; +import { serverMetadata } from "./data/servers"; /** * Constructs a new server, while also ensuring that the new server @@ -236,6 +237,15 @@ export function isBackdoorInstalled(server: BaseServer): boolean { return false; } +export function isBackdoorInstalledInCompanyServer(companyName: string): boolean { + const serverMeta = serverMetadata.find((s) => s.specialName === companyName); + const server = GetServer(serverMeta ? serverMeta.hostname : ""); + if (!server) { + return false; + } + return isBackdoorInstalled(server); +} + export function getCoreBonus(cores = 1): number { const coreBonus = 1 + (cores - 1) / 16; return coreBonus;