diff --git a/src/utils/formulas/constants.ts b/src/utils/formulas/constants.ts index 485973f..a5e21e5 100644 --- a/src/utils/formulas/constants.ts +++ b/src/utils/formulas/constants.ts @@ -1,4 +1,4 @@ -import { Multipliers } from "./player"; +import { Multipliers } from "@ns"; /** * Generic Game Constants diff --git a/src/utils/formulas/exports.ts b/src/utils/formulas/exports.ts index 57f6939..5354649 100644 --- a/src/utils/formulas/exports.ts +++ b/src/utils/formulas/exports.ts @@ -1,4 +1,3 @@ -import { Player } from "./player"; import { clampNumber } from "./utils"; export type PartialRecord = Partial>; @@ -185,10 +184,112 @@ export class BitNodeMultipliers { /** The multipliers currently in effect */ export const currentNodeMults = new BitNodeMultipliers(); -export function calculateIntelligenceBonus(intelligence: number, weight = 1): number { - const effectiveIntelligence = - Player.bitNodeOptions.intelligenceOverride !== undefined - ? Math.min(Player.bitNodeOptions.intelligenceOverride, intelligence) - : intelligence; - return 1 + (weight * Math.pow(effectiveIntelligence, 0.8)) / 600; +/** Names of all cities */ +export enum CityName { + Aevum = "Aevum", + Chongqing = "Chongqing", + Sector12 = "Sector-12", + NewTokyo = "New Tokyo", + Ishima = "Ishima", + Volhaven = "Volhaven", +} + +/** Names of all locations */ +export enum LocationName { + AevumAeroCorp = "AeroCorp", + AevumBachmanAndAssociates = "Bachman & Associates", + AevumClarkeIncorporated = "Clarke Incorporated", + AevumCrushFitnessGym = "Crush Fitness Gym", + AevumECorp = "ECorp", + AevumFulcrumTechnologies = "Fulcrum Technologies", + AevumGalacticCybersystems = "Galactic Cybersystems", + AevumNetLinkTechnologies = "NetLink Technologies", + AevumPolice = "Aevum Police Headquarters", + AevumRhoConstruction = "Rho Construction", + AevumSnapFitnessGym = "Snap Fitness Gym", + AevumSummitUniversity = "Summit University", + AevumWatchdogSecurity = "Watchdog Security", + AevumCasino = "Iker Molina Casino", + + ChongqingKuaiGongInternational = "KuaiGong International", + ChongqingSolarisSpaceSystems = "Solaris Space Systems", + ChongqingChurchOfTheMachineGod = "Church of the Machine God", + + Sector12AlphaEnterprises = "Alpha Enterprises", + Sector12BladeIndustries = "Blade Industries", + Sector12CIA = "Central Intelligence Agency", + Sector12CarmichaelSecurity = "Carmichael Security", + Sector12CityHall = "Sector-12 City Hall", + Sector12DeltaOne = "DeltaOne", + Sector12FoodNStuff = "FoodNStuff", + Sector12FourSigma = "Four Sigma", + Sector12IcarusMicrosystems = "Icarus Microsystems", + Sector12IronGym = "Iron Gym", + Sector12JoesGuns = "Joe's Guns", + Sector12MegaCorp = "MegaCorp", + Sector12NSA = "National Security Agency", + Sector12PowerhouseGym = "Powerhouse Gym", + Sector12RothmanUniversity = "Rothman University", + Sector12UniversalEnergy = "Universal Energy", + + NewTokyoDefComm = "DefComm", + NewTokyoGlobalPharmaceuticals = "Global Pharmaceuticals", + NewTokyoNoodleBar = "Noodle Bar", + NewTokyoVitaLife = "VitaLife", + NewTokyoArcade = "Arcade", + + IshimaNovaMedical = "Nova Medical", + IshimaOmegaSoftware = "Omega Software", + IshimaStormTechnologies = "Storm Technologies", + IshimaGlitch = "0x6C1", + + VolhavenCompuTek = "CompuTek", + VolhavenHeliosLabs = "Helios Labs", + VolhavenLexoCorp = "LexoCorp", + VolhavenMilleniumFitnessGym = "Millenium Fitness Gym", + VolhavenNWO = "NWO", + VolhavenOmniTekIncorporated = "OmniTek Incorporated", + VolhavenOmniaCybersystems = "Omnia Cybersystems", + VolhavenSysCoreSecurities = "SysCore Securities", + VolhavenZBInstituteOfTechnology = "ZB Institute of Technology", + + Hospital = "Hospital", + Slums = "The Slums", + TravelAgency = "Travel Agency", + WorldStockExchange = "World Stock Exchange", + + Void = "The Void", +} + +export interface Multipliers { + hacking_chance: number; + hacking_speed: number; + hacking_money: number; + hacking_grow: number; + hacking: number; + hacking_exp: number; + strength: number; + strength_exp: number; + defense: number; + defense_exp: number; + dexterity: number; + dexterity_exp: number; + agility: number; + agility_exp: number; + charisma: number; + charisma_exp: number; + hacknet_node_money: number; + hacknet_node_purchase_cost: number; + hacknet_node_ram_cost: number; + hacknet_node_core_cost: number; + hacknet_node_level_cost: number; + company_rep: number; + faction_rep: number; + work_money: number; + crime_success: number; + crime_money: number; + bladeburner_max_stamina: number; + bladeburner_stamina_gain: number; + bladeburner_analysis: number; + bladeburner_success_chance: number; } diff --git a/src/utils/formulas/hacking.ts b/src/utils/formulas/hacking.ts index 0769aeb..d725705 100644 --- a/src/utils/formulas/hacking.ts +++ b/src/utils/formulas/hacking.ts @@ -1,8 +1,8 @@ import { Player as IPerson, Server as IServer } from "@ns"; -import { currentNodeMults } from "./exports"; -import { clampNumber, isValidNumber } from "./utils"; -import { Player } from "./player"; import { ServerConstants } from "./constants"; +import { currentNodeMults } from "./exports"; +import { Player } from "./player"; +import { clampNumber, isValidNumber } from "./utils"; export function calculateIntelligenceBonus(intelligence: number, weight = 1): number { const effectiveIntelligence = @@ -285,3 +285,13 @@ export function numCycleForGrowthCorrected( } return ccycle + 1; } + +export function getCoreBonus(cores = 1): number { + const coreBonus = 1 + (cores - 1) / 16; + return coreBonus; +} + +export function getWeakenEffect(threads: number, cores: number): number { + const coreBonus = getCoreBonus(cores); + return ServerConstants.ServerWeakenAmount * threads * coreBonus * currentNodeMults.ServerWeakenRate; +} diff --git a/src/utils/formulas/player.ts b/src/utils/formulas/player.ts index ce5c134..eeec192 100644 --- a/src/utils/formulas/player.ts +++ b/src/utils/formulas/player.ts @@ -14,119 +14,9 @@ import { type WorkStats, } from "@ns"; import { CONSTANTS, defaultMultipliers } from "./constants"; -import { currentNodeMults, PartialRecord } from "./exports"; +import { CityName, currentNodeMults, LocationName, type PartialRecord } from "./exports"; import { calculateSkill } from "./skills"; -/** Names of all cities */ -enum CityName { - Aevum = "Aevum", - Chongqing = "Chongqing", - Sector12 = "Sector-12", - NewTokyo = "New Tokyo", - Ishima = "Ishima", - Volhaven = "Volhaven", -} - -/** Names of all locations */ -export enum LocationName { - AevumAeroCorp = "AeroCorp", - AevumBachmanAndAssociates = "Bachman & Associates", - AevumClarkeIncorporated = "Clarke Incorporated", - AevumCrushFitnessGym = "Crush Fitness Gym", - AevumECorp = "ECorp", - AevumFulcrumTechnologies = "Fulcrum Technologies", - AevumGalacticCybersystems = "Galactic Cybersystems", - AevumNetLinkTechnologies = "NetLink Technologies", - AevumPolice = "Aevum Police Headquarters", - AevumRhoConstruction = "Rho Construction", - AevumSnapFitnessGym = "Snap Fitness Gym", - AevumSummitUniversity = "Summit University", - AevumWatchdogSecurity = "Watchdog Security", - AevumCasino = "Iker Molina Casino", - - ChongqingKuaiGongInternational = "KuaiGong International", - ChongqingSolarisSpaceSystems = "Solaris Space Systems", - ChongqingChurchOfTheMachineGod = "Church of the Machine God", - - Sector12AlphaEnterprises = "Alpha Enterprises", - Sector12BladeIndustries = "Blade Industries", - Sector12CIA = "Central Intelligence Agency", - Sector12CarmichaelSecurity = "Carmichael Security", - Sector12CityHall = "Sector-12 City Hall", - Sector12DeltaOne = "DeltaOne", - Sector12FoodNStuff = "FoodNStuff", - Sector12FourSigma = "Four Sigma", - Sector12IcarusMicrosystems = "Icarus Microsystems", - Sector12IronGym = "Iron Gym", - Sector12JoesGuns = "Joe's Guns", - Sector12MegaCorp = "MegaCorp", - Sector12NSA = "National Security Agency", - Sector12PowerhouseGym = "Powerhouse Gym", - Sector12RothmanUniversity = "Rothman University", - Sector12UniversalEnergy = "Universal Energy", - - NewTokyoDefComm = "DefComm", - NewTokyoGlobalPharmaceuticals = "Global Pharmaceuticals", - NewTokyoNoodleBar = "Noodle Bar", - NewTokyoVitaLife = "VitaLife", - NewTokyoArcade = "Arcade", - - IshimaNovaMedical = "Nova Medical", - IshimaOmegaSoftware = "Omega Software", - IshimaStormTechnologies = "Storm Technologies", - IshimaGlitch = "0x6C1", - - VolhavenCompuTek = "CompuTek", - VolhavenHeliosLabs = "Helios Labs", - VolhavenLexoCorp = "LexoCorp", - VolhavenMilleniumFitnessGym = "Millenium Fitness Gym", - VolhavenNWO = "NWO", - VolhavenOmniTekIncorporated = "OmniTek Incorporated", - VolhavenOmniaCybersystems = "Omnia Cybersystems", - VolhavenSysCoreSecurities = "SysCore Securities", - VolhavenZBInstituteOfTechnology = "ZB Institute of Technology", - - Hospital = "Hospital", - Slums = "The Slums", - TravelAgency = "Travel Agency", - WorldStockExchange = "World Stock Exchange", - - Void = "The Void", -} - -export interface Multipliers { - hacking_chance: number; - hacking_speed: number; - hacking_money: number; - hacking_grow: number; - hacking: number; - hacking_exp: number; - strength: number; - strength_exp: number; - defense: number; - defense_exp: number; - dexterity: number; - dexterity_exp: number; - agility: number; - agility_exp: number; - charisma: number; - charisma_exp: number; - hacknet_node_money: number; - hacknet_node_purchase_cost: number; - hacknet_node_ram_cost: number; - hacknet_node_core_cost: number; - hacknet_node_level_cost: number; - company_rep: number; - faction_rep: number; - work_money: number; - crime_success: number; - crime_money: number; - bladeburner_max_stamina: number; - bladeburner_stamina_gain: number; - bladeburner_analysis: number; - bladeburner_success_chance: number; -} - export let Player: PlayerObject; // Base class representing a person-like object diff --git a/src/utils/formulas/utils.ts b/src/utils/formulas/utils.ts index 231f9d0..766f66c 100644 --- a/src/utils/formulas/utils.ts +++ b/src/utils/formulas/utils.ts @@ -15,7 +15,18 @@ export function clampNumber(value: number, min: number = -Number.MAX_VALUE, max: return Math.max(Math.min(value, max), min); } -export function clampInteger(value: number, min = -Number.MAX_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) { +/** + * Clamps the value to an integer within a lower and an upper bound + * @param {number} value Value to clamp + * @param {number} min Lower bound, defaults to negative Number.MAX_SAFE_INTEGER + * @param {number} max Upper bound, defaults to Number.MAX_SAFE_INTEGER + * @returns {number} Clamped integer value + */ +export function clampInteger( + value: number, + min: number = -Number.MAX_SAFE_INTEGER, + max: number = Number.MAX_SAFE_INTEGER, +): number { if (isNaN(value)) { if (CONSTANTS.isDevBranch) throw new Error("NaN passed into clampInteger()"); return min; @@ -26,6 +37,8 @@ export function clampInteger(value: number, min = -Number.MAX_SAFE_INTEGER, max /** * Checks that a variable is a valid number. A valid number * must be a "number" type and cannot be NaN + * @param {number} n The number to check + * @returns {boolean} True if n is a valid number, false otherwise */ export function isValidNumber(n: number): boolean { return typeof n === "number" && !isNaN(n); diff --git a/tsconfig.json b/tsconfig.json index 831c90d..67a725f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,7 @@ "isolatedModules": true, "esModuleInterop": true, "inlineSourceMap": true, - "moduleResolution": "node", + // "moduleResolution": "node", "resolveJsonModule": true, "skipLibCheck": true, "paths": {