mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-11 02:03:58 +01:00
added ns functions
* refactored out logic to be reused by api
This commit is contained in:
parent
aa3b692aac
commit
7c5097ee83
@ -5,7 +5,7 @@ import { Programs } from "../Programs/Programs";
|
|||||||
import { WHRNG } from "../Casino/RNG";
|
import { WHRNG } from "../Casino/RNG";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { FactionNames } from "../Faction/data/FactionNames";
|
import { FactionNames } from "../Faction/data/FactionNames";
|
||||||
import { CityName } from "src/Locations/data/CityNames";
|
import { CityName } from "../Locations/data/CityNames";
|
||||||
|
|
||||||
function getRandomBonus(): any {
|
function getRandomBonus(): any {
|
||||||
const bonuses = [
|
const bonuses = [
|
||||||
|
25
src/Infiltration/formulas/game.ts
Normal file
25
src/Infiltration/formulas/game.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
||||||
|
import { calculateSkill } from "../../PersonObjects/formulas/skill";
|
||||||
|
|
||||||
|
function calculateRawDiff(player: IPlayer, stats: number, startingDifficulty: number): number {
|
||||||
|
const difficulty = startingDifficulty - Math.pow(stats, 0.9) / 250 - player.intelligence / 1600;
|
||||||
|
if (difficulty < 0) return 0;
|
||||||
|
if (difficulty > 3) return 3;
|
||||||
|
return difficulty;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateDifficulty(player: IPlayer, startingSecurityLevel: number): number {
|
||||||
|
const totalStats = player.strength + player.defense + player.dexterity + player.agility + player.charisma;
|
||||||
|
return calculateRawDiff(player, totalStats, startingSecurityLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateReward(player: IPlayer, startingSecurityLevel: number): number {
|
||||||
|
const xpMult = 10 * 60 * 15;
|
||||||
|
const total =
|
||||||
|
calculateSkill(player.strength_exp_mult * xpMult, player.strength_mult) +
|
||||||
|
calculateSkill(player.defense_exp_mult * xpMult, player.defense_mult) +
|
||||||
|
calculateSkill(player.agility_exp_mult * xpMult, player.agility_mult) +
|
||||||
|
calculateSkill(player.dexterity_exp_mult * xpMult, player.dexterity_mult) +
|
||||||
|
calculateSkill(player.charisma_exp_mult * xpMult, player.charisma_mult);
|
||||||
|
return calculateRawDiff(player, total, startingSecurityLevel);
|
||||||
|
}
|
49
src/Infiltration/formulas/victory.ts
Normal file
49
src/Infiltration/formulas/victory.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
||||||
|
import { BitNodeMultipliers } from "../../BitNode/BitNodeMultipliers";
|
||||||
|
import { LocationsMetadata } from "../../Locations/data/LocationsMetadata";
|
||||||
|
|
||||||
|
export function calculateSellInformationCashReward(
|
||||||
|
player: IPlayer,
|
||||||
|
reward: number,
|
||||||
|
maxLevel: number,
|
||||||
|
difficulty: number,
|
||||||
|
): number {
|
||||||
|
const levelBonus = maxLevel * Math.pow(1.01, maxLevel);
|
||||||
|
|
||||||
|
return (
|
||||||
|
Math.pow(reward + 1, 2) *
|
||||||
|
Math.pow(difficulty, 3) *
|
||||||
|
3e3 *
|
||||||
|
levelBonus *
|
||||||
|
player.infiltration_sell_mult *
|
||||||
|
BitNodeMultipliers.InfiltrationMoney
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateTradeInformationRepReward(
|
||||||
|
player: IPlayer,
|
||||||
|
reward: number,
|
||||||
|
maxLevel: number,
|
||||||
|
difficulty: number,
|
||||||
|
): number {
|
||||||
|
const levelBonus = maxLevel * Math.pow(1.01, maxLevel);
|
||||||
|
|
||||||
|
return (
|
||||||
|
Math.pow(reward + 1, 2) *
|
||||||
|
Math.pow(difficulty, 3) *
|
||||||
|
3e3 *
|
||||||
|
levelBonus *
|
||||||
|
player.infiltration_sell_mult *
|
||||||
|
BitNodeMultipliers.InfiltrationMoney
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateInfiltratorsRepReward(player: IPlayer, difficulty: number): number {
|
||||||
|
const maxStartingSecurityLevel = LocationsMetadata.reduce((acc, data): number => {
|
||||||
|
const startingSecurityLevel = data.infiltrationData?.startingSecurityLevel || 0;
|
||||||
|
return acc > startingSecurityLevel ? acc : startingSecurityLevel;
|
||||||
|
}, 0);
|
||||||
|
const baseRepGain = (difficulty / maxStartingSecurityLevel) * 10;
|
||||||
|
|
||||||
|
return (baseRepGain + player.infiltration_base_rep_increase) * player.infiltration_rep_mult;
|
||||||
|
}
|
@ -1,47 +1,22 @@
|
|||||||
import { IPlayer } from "../../PersonObjects/IPlayer";
|
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { Intro } from "./Intro";
|
import { Intro } from "./Intro";
|
||||||
import { Game } from "./Game";
|
import { Game } from "./Game";
|
||||||
import { Location } from "../../Locations/Location";
|
import { Location } from "../../Locations/Location";
|
||||||
import { use } from "../../ui/Context";
|
import { use } from "../../ui/Context";
|
||||||
import { calculateSkill } from "../../PersonObjects/formulas/skill";
|
import { calculateDifficulty, calculateReward } from "../formulas/game";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
location: Location;
|
location: Location;
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcRawDiff(player: IPlayer, stats: number, startingDifficulty: number): number {
|
|
||||||
const difficulty = startingDifficulty - Math.pow(stats, 0.9) / 250 - player.intelligence / 1600;
|
|
||||||
if (difficulty < 0) return 0;
|
|
||||||
if (difficulty > 3) return 3;
|
|
||||||
return difficulty;
|
|
||||||
}
|
|
||||||
|
|
||||||
function calcDifficulty(player: IPlayer, startingDifficulty: number): number {
|
|
||||||
const totalStats = player.strength + player.defense + player.dexterity + player.agility + player.charisma;
|
|
||||||
return calcRawDiff(player, totalStats, startingDifficulty);
|
|
||||||
}
|
|
||||||
|
|
||||||
function calcReward(player: IPlayer, startingDifficulty: number): number {
|
|
||||||
const xpMult = 10 * 60 * 15;
|
|
||||||
const total =
|
|
||||||
calculateSkill(player.strength_exp_mult * xpMult, player.strength_mult) +
|
|
||||||
calculateSkill(player.defense_exp_mult * xpMult, player.defense_mult) +
|
|
||||||
calculateSkill(player.agility_exp_mult * xpMult, player.agility_mult) +
|
|
||||||
calculateSkill(player.dexterity_exp_mult * xpMult, player.dexterity_mult) +
|
|
||||||
calculateSkill(player.charisma_exp_mult * xpMult, player.charisma_mult);
|
|
||||||
return calcRawDiff(player, total, startingDifficulty);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function InfiltrationRoot(props: IProps): React.ReactElement {
|
export function InfiltrationRoot(props: IProps): React.ReactElement {
|
||||||
const player = use.Player();
|
const player = use.Player();
|
||||||
const router = use.Router();
|
const router = use.Router();
|
||||||
const [start, setStart] = useState(false);
|
const [start, setStart] = useState(false);
|
||||||
|
|
||||||
if (props.location.infiltrationData === undefined) throw new Error("Trying to do infiltration on invalid location.");
|
if (props.location.infiltrationData === undefined) throw new Error("Trying to do infiltration on invalid location.");
|
||||||
const startingDifficulty = props.location.infiltrationData.startingSecurityLevel;
|
const startingSecurityLevel = props.location.infiltrationData.startingSecurityLevel;
|
||||||
const difficulty = calcDifficulty(player, startingDifficulty);
|
const difficulty = calculateDifficulty(player, startingSecurityLevel);
|
||||||
const reward = calcReward(player, startingDifficulty);
|
const reward = calculateReward(player, startingSecurityLevel);
|
||||||
|
|
||||||
function cancel(): void {
|
function cancel(): void {
|
||||||
router.toCity();
|
router.toCity();
|
||||||
@ -61,7 +36,7 @@ export function InfiltrationRoot(props: IProps): React.ReactElement {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Game
|
<Game
|
||||||
StartingDifficulty={startingDifficulty}
|
StartingDifficulty={startingSecurityLevel}
|
||||||
Difficulty={difficulty}
|
Difficulty={difficulty}
|
||||||
Reward={reward}
|
Reward={reward}
|
||||||
MaxLevel={props.location.infiltrationData.maxClearanceLevel}
|
MaxLevel={props.location.infiltrationData.maxClearanceLevel}
|
||||||
|
@ -10,8 +10,12 @@ import Button from "@mui/material/Button";
|
|||||||
import MenuItem from "@mui/material/MenuItem";
|
import MenuItem from "@mui/material/MenuItem";
|
||||||
import Select, { SelectChangeEvent } from "@mui/material/Select";
|
import Select, { SelectChangeEvent } from "@mui/material/Select";
|
||||||
import { FactionNames } from "../../Faction/data/FactionNames";
|
import { FactionNames } from "../../Faction/data/FactionNames";
|
||||||
import { LocationsMetadata } from "../../Locations/data/LocationsMetadata";
|
|
||||||
import { formatNumber } from "../../utils/StringHelperFunctions";
|
import { formatNumber } from "../../utils/StringHelperFunctions";
|
||||||
|
import {
|
||||||
|
calculateInfiltratorsRepReward,
|
||||||
|
calculateSellInformationCashReward,
|
||||||
|
calculateTradeInformationRepReward,
|
||||||
|
} from "../formulas/victory";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
StartingDifficulty: number;
|
StartingDifficulty: number;
|
||||||
@ -30,37 +34,13 @@ export function Victory(props: IProps): React.ReactElement {
|
|||||||
router.toCity();
|
router.toCity();
|
||||||
}
|
}
|
||||||
|
|
||||||
const levelBonus = props.MaxLevel * Math.pow(1.01, props.MaxLevel);
|
const repGain = calculateTradeInformationRepReward(player, props.Reward, props.MaxLevel, props.StartingDifficulty);
|
||||||
|
const moneyGain = calculateSellInformationCashReward(player, props.Reward, props.MaxLevel, props.StartingDifficulty);
|
||||||
const repGain =
|
const infiltrationRepGain = calculateInfiltratorsRepReward(player, props.StartingDifficulty);
|
||||||
Math.pow(props.Reward + 1, 1.1) *
|
|
||||||
Math.pow(props.StartingDifficulty, 1.2) *
|
|
||||||
30 *
|
|
||||||
levelBonus *
|
|
||||||
player.infiltration_trade_mult *
|
|
||||||
BitNodeMultipliers.InfiltrationRep;
|
|
||||||
|
|
||||||
const infiltratorFaction = Factions[FactionNames.Infiltrators];
|
const infiltratorFaction = Factions[FactionNames.Infiltrators];
|
||||||
const isMemberOfInfiltrators = infiltratorFaction && infiltratorFaction.isMember;
|
const isMemberOfInfiltrators = infiltratorFaction && infiltratorFaction.isMember;
|
||||||
|
|
||||||
const moneyGain =
|
|
||||||
Math.pow(props.Reward + 1, 2) *
|
|
||||||
Math.pow(props.StartingDifficulty, 3) *
|
|
||||||
3e3 *
|
|
||||||
levelBonus *
|
|
||||||
player.infiltration_sell_mult *
|
|
||||||
BitNodeMultipliers.InfiltrationMoney;
|
|
||||||
|
|
||||||
function calculateInfiltratorsRepReward(): number {
|
|
||||||
const maxStartingSecurityLevel = LocationsMetadata.reduce((acc, data): number => {
|
|
||||||
const startingSecurityLevel = data.infiltrationData?.startingSecurityLevel || 0;
|
|
||||||
return acc > startingSecurityLevel ? acc : startingSecurityLevel;
|
|
||||||
}, 0);
|
|
||||||
const baseRepGain = (props.StartingDifficulty / maxStartingSecurityLevel) * 10;
|
|
||||||
|
|
||||||
return (baseRepGain + player.infiltration_base_rep_increase) * player.infiltration_rep_mult;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sell(): void {
|
function sell(): void {
|
||||||
handleInfiltrators();
|
handleInfiltrators();
|
||||||
player.gainMoney(moneyGain, "infiltration");
|
player.gainMoney(moneyGain, "infiltration");
|
||||||
@ -81,7 +61,7 @@ export function Victory(props: IProps): React.ReactElement {
|
|||||||
function handleInfiltrators(): void {
|
function handleInfiltrators(): void {
|
||||||
player.hasCompletedAnInfiltration = true;
|
player.hasCompletedAnInfiltration = true;
|
||||||
if (isMemberOfInfiltrators) {
|
if (isMemberOfInfiltrators) {
|
||||||
infiltratorFaction.playerReputation += calculateInfiltratorsRepReward();
|
infiltratorFaction.playerReputation += infiltrationRepGain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +76,7 @@ export function Victory(props: IProps): React.ReactElement {
|
|||||||
You{" "}
|
You{" "}
|
||||||
{isMemberOfInfiltrators ? (
|
{isMemberOfInfiltrators ? (
|
||||||
<>
|
<>
|
||||||
have gained {formatNumber(calculateInfiltratorsRepReward(), 2)} rep for {FactionNames.Infiltrators} and{" "}
|
have gained {formatNumber(infiltrationRepGain, 2)} rep for {FactionNames.Infiltrators} and{" "}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<></>
|
<></>
|
||||||
|
@ -69,6 +69,11 @@ export const RamCostConstants: IMap<number> = {
|
|||||||
ScriptStanekPlace: 5,
|
ScriptStanekPlace: 5,
|
||||||
ScriptStanekFragmentAt: 2,
|
ScriptStanekFragmentAt: 2,
|
||||||
ScriptStanekDeleteAt: 0.15,
|
ScriptStanekDeleteAt: 0.15,
|
||||||
|
|
||||||
|
ScriptInfiltrationCalculateDifficulty: 2.5,
|
||||||
|
ScriptInfiltrationCalculateRewards: 2.5,
|
||||||
|
ScriptInfiltrationGetLocations: 5,
|
||||||
|
ScriptInfiltrationGetInfiltrations: 15,
|
||||||
};
|
};
|
||||||
|
|
||||||
function SF4Cost(cost: number): (player: IPlayer) => number {
|
function SF4Cost(cost: number): (player: IPlayer) => number {
|
||||||
@ -376,6 +381,13 @@ export const RamCosts: IMap<any> = {
|
|||||||
remove: RamCostConstants.ScriptStanekDeleteAt,
|
remove: RamCostConstants.ScriptStanekDeleteAt,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
infiltration: {
|
||||||
|
calculateDifficulty: RamCostConstants.ScriptInfiltrationCalculateDifficulty,
|
||||||
|
calculateRewards: RamCostConstants.ScriptInfiltrationCalculateRewards,
|
||||||
|
calculateGetLocations: RamCostConstants.ScriptInfiltrationGetLocations,
|
||||||
|
calculateGetInfiltrations: RamCostConstants.ScriptInfiltrationGetInfiltrations,
|
||||||
|
},
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
getTheme: 0,
|
getTheme: 0,
|
||||||
setTheme: 0,
|
setTheme: 0,
|
||||||
|
@ -64,6 +64,7 @@ import { NetscriptSleeve } from "./NetscriptFunctions/Sleeve";
|
|||||||
import { NetscriptExtra } from "./NetscriptFunctions/Extra";
|
import { NetscriptExtra } from "./NetscriptFunctions/Extra";
|
||||||
import { NetscriptHacknet } from "./NetscriptFunctions/Hacknet";
|
import { NetscriptHacknet } from "./NetscriptFunctions/Hacknet";
|
||||||
import { NetscriptStanek } from "./NetscriptFunctions/Stanek";
|
import { NetscriptStanek } from "./NetscriptFunctions/Stanek";
|
||||||
|
import { NetscriptInfiltration } from "./NetscriptFunctions/Infiltration";
|
||||||
import { NetscriptUserInterface } from "./NetscriptFunctions/UserInterface";
|
import { NetscriptUserInterface } from "./NetscriptFunctions/UserInterface";
|
||||||
import { NetscriptBladeburner } from "./NetscriptFunctions/Bladeburner";
|
import { NetscriptBladeburner } from "./NetscriptFunctions/Bladeburner";
|
||||||
import { NetscriptCodingContract } from "./NetscriptFunctions/CodingContract";
|
import { NetscriptCodingContract } from "./NetscriptFunctions/CodingContract";
|
||||||
@ -78,6 +79,7 @@ import {
|
|||||||
Gang as IGang,
|
Gang as IGang,
|
||||||
Bladeburner as IBladeburner,
|
Bladeburner as IBladeburner,
|
||||||
Stanek as IStanek,
|
Stanek as IStanek,
|
||||||
|
Infiltration as IInfiltration,
|
||||||
SourceFileLvl,
|
SourceFileLvl,
|
||||||
} from "./ScriptEditor/NetscriptDefinitions";
|
} from "./ScriptEditor/NetscriptDefinitions";
|
||||||
import { NetscriptSingularity } from "./NetscriptFunctions/Singularity";
|
import { NetscriptSingularity } from "./NetscriptFunctions/Singularity";
|
||||||
@ -96,6 +98,7 @@ interface NS extends INS {
|
|||||||
gang: IGang;
|
gang: IGang;
|
||||||
bladeburner: IBladeburner;
|
bladeburner: IBladeburner;
|
||||||
stanek: IStanek;
|
stanek: IStanek;
|
||||||
|
infiltration: IInfiltration;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function NetscriptFunctions(workerScript: WorkerScript): NS {
|
export function NetscriptFunctions(workerScript: WorkerScript): NS {
|
||||||
@ -473,6 +476,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
|
|||||||
const extra = NetscriptExtra(Player, workerScript, helper);
|
const extra = NetscriptExtra(Player, workerScript, helper);
|
||||||
const hacknet = NetscriptHacknet(Player, workerScript, helper);
|
const hacknet = NetscriptHacknet(Player, workerScript, helper);
|
||||||
const stanek = NetscriptStanek(Player, workerScript, helper);
|
const stanek = NetscriptStanek(Player, workerScript, helper);
|
||||||
|
const infiltration = NetscriptInfiltration(Player, workerScript, helper);
|
||||||
const bladeburner = NetscriptBladeburner(Player, workerScript, helper);
|
const bladeburner = NetscriptBladeburner(Player, workerScript, helper);
|
||||||
const codingcontract = NetscriptCodingContract(Player, workerScript, helper);
|
const codingcontract = NetscriptCodingContract(Player, workerScript, helper);
|
||||||
const corporation = NetscriptCorporation(Player, workerScript, helper);
|
const corporation = NetscriptCorporation(Player, workerScript, helper);
|
||||||
@ -490,6 +494,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
|
|||||||
sleeve: sleeve,
|
sleeve: sleeve,
|
||||||
corporation: corporation,
|
corporation: corporation,
|
||||||
stanek: stanek,
|
stanek: stanek,
|
||||||
|
infiltration: infiltration,
|
||||||
ui: ui,
|
ui: ui,
|
||||||
formulas: formulas,
|
formulas: formulas,
|
||||||
stock: stockmarket,
|
stock: stockmarket,
|
||||||
|
75
src/NetscriptFunctions/Infiltration.ts
Normal file
75
src/NetscriptFunctions/Infiltration.ts
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import { INetscriptHelper } from "./INetscriptHelper";
|
||||||
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||||
|
import { WorkerScript } from "../Netscript/WorkerScript";
|
||||||
|
import { getRamCost } from "../Netscript/RamCostGenerator";
|
||||||
|
|
||||||
|
import {
|
||||||
|
Infiltration as IInfiltration,
|
||||||
|
InfiltrationLocation,
|
||||||
|
InfiltrationReward,
|
||||||
|
} from "../ScriptEditor/NetscriptDefinitions";
|
||||||
|
import { Location } from "../Locations/Location";
|
||||||
|
import { Locations } from "../Locations/Locations";
|
||||||
|
import { calculateDifficulty, calculateReward } from "../Infiltration/formulas/game";
|
||||||
|
import {
|
||||||
|
calculateInfiltratorsRepReward,
|
||||||
|
calculateSellInformationCashReward,
|
||||||
|
calculateTradeInformationRepReward,
|
||||||
|
} from "../Infiltration/formulas/victory";
|
||||||
|
|
||||||
|
export function NetscriptInfiltration(
|
||||||
|
player: IPlayer,
|
||||||
|
workerScript: WorkerScript,
|
||||||
|
helper: INetscriptHelper,
|
||||||
|
): IInfiltration {
|
||||||
|
const getLocationsWithInfiltrations = Object.values(Locations).filter(
|
||||||
|
(location: Location) => location.infiltrationData,
|
||||||
|
);
|
||||||
|
|
||||||
|
const calculateInfiltrationData = (location: Location | undefined): InfiltrationLocation => {
|
||||||
|
if (location === undefined)
|
||||||
|
throw helper.makeRuntimeErrorMsg(
|
||||||
|
`infiltration.calculateReward`,
|
||||||
|
"The provided location does not exist or does not provide infiltrations",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (location.infiltrationData === undefined)
|
||||||
|
throw helper.makeRuntimeErrorMsg(
|
||||||
|
`infiltration.calculateReward`,
|
||||||
|
"The provided location does not exist or does not provide infiltrations",
|
||||||
|
);
|
||||||
|
const startingSecurityLevel = location.infiltrationData.startingSecurityLevel;
|
||||||
|
const difficulty = calculateDifficulty(player, startingSecurityLevel);
|
||||||
|
const reward = calculateReward(player, startingSecurityLevel);
|
||||||
|
const maxLevel = location.infiltrationData.maxClearanceLevel;
|
||||||
|
return {
|
||||||
|
location: location,
|
||||||
|
reward: {
|
||||||
|
tradeRep: calculateTradeInformationRepReward(player, reward, maxLevel, difficulty),
|
||||||
|
sellCash: calculateSellInformationCashReward(player, reward, maxLevel, difficulty),
|
||||||
|
infiltratorRep: calculateInfiltratorsRepReward(player, difficulty),
|
||||||
|
},
|
||||||
|
difficulty: difficulty,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
calculateDifficulty: function (locationName: string): number {
|
||||||
|
const location = getLocationsWithInfiltrations.find((infilLocation) => infilLocation.name === locationName);
|
||||||
|
helper.updateDynamicRam("calculateDifficulty", getRamCost(player, "infiltration", "calculateDifficulty"));
|
||||||
|
return calculateInfiltrationData(location).difficulty;
|
||||||
|
},
|
||||||
|
calculateRewards: function (locationName: string): InfiltrationReward {
|
||||||
|
const location = getLocationsWithInfiltrations.find((infilLocation) => infilLocation.name === locationName);
|
||||||
|
helper.updateDynamicRam("calculateReward", getRamCost(player, "infiltration", "calculateReward"));
|
||||||
|
return calculateInfiltrationData(location).reward;
|
||||||
|
},
|
||||||
|
getLocations: function (): Location[] {
|
||||||
|
helper.updateDynamicRam("getLocations", getRamCost(player, "infiltration", "getLocations"));
|
||||||
|
return getLocationsWithInfiltrations;
|
||||||
|
},
|
||||||
|
getInfiltrations: function (): InfiltrationLocation[] {
|
||||||
|
helper.updateDynamicRam("getInfiltrations", getRamCost(player, "infiltration", "getInfiltrations"));
|
||||||
|
return getLocationsWithInfiltrations.map(calculateInfiltrationData);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
@ -17,7 +17,7 @@ import { areImportsEquals } from "../Terminal/DirectoryHelpers";
|
|||||||
import { IPlayer } from "../PersonObjects/IPlayer";
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||||
|
|
||||||
export interface RamUsageEntry {
|
export interface RamUsageEntry {
|
||||||
type: 'ns' | 'dom' | 'fn' | 'misc';
|
type: "ns" | "dom" | "fn" | "misc";
|
||||||
name: string;
|
name: string;
|
||||||
cost: number;
|
cost: number;
|
||||||
}
|
}
|
||||||
@ -139,7 +139,9 @@ async function parseOnlyRamCalculate(
|
|||||||
// Finally, walk the reference map and generate a ram cost. The initial set of keys to scan
|
// Finally, walk the reference map and generate a ram cost. The initial set of keys to scan
|
||||||
// are those that start with __SPECIAL_INITIAL_MODULE__.
|
// are those that start with __SPECIAL_INITIAL_MODULE__.
|
||||||
let ram = RamCostConstants.ScriptBaseRamCost;
|
let ram = RamCostConstants.ScriptBaseRamCost;
|
||||||
const detailedCosts: RamUsageEntry[] = [{ type: 'misc', name: 'baseCost', cost: RamCostConstants.ScriptBaseRamCost}];
|
const detailedCosts: RamUsageEntry[] = [
|
||||||
|
{ type: "misc", name: "baseCost", cost: RamCostConstants.ScriptBaseRamCost },
|
||||||
|
];
|
||||||
const unresolvedRefs = Object.keys(dependencyMap).filter((s) => s.startsWith(initialModule));
|
const unresolvedRefs = Object.keys(dependencyMap).filter((s) => s.startsWith(initialModule));
|
||||||
const resolvedRefs = new Set();
|
const resolvedRefs = new Set();
|
||||||
while (unresolvedRefs.length > 0) {
|
while (unresolvedRefs.length > 0) {
|
||||||
@ -149,19 +151,19 @@ async function parseOnlyRamCalculate(
|
|||||||
// Check if this is one of the special keys, and add the appropriate ram cost if so.
|
// Check if this is one of the special keys, and add the appropriate ram cost if so.
|
||||||
if (ref === "hacknet" && !resolvedRefs.has("hacknet")) {
|
if (ref === "hacknet" && !resolvedRefs.has("hacknet")) {
|
||||||
ram += RamCostConstants.ScriptHacknetNodesRamCost;
|
ram += RamCostConstants.ScriptHacknetNodesRamCost;
|
||||||
detailedCosts.push({ type: 'ns', name: 'hacknet', cost: RamCostConstants.ScriptHacknetNodesRamCost});
|
detailedCosts.push({ type: "ns", name: "hacknet", cost: RamCostConstants.ScriptHacknetNodesRamCost });
|
||||||
}
|
}
|
||||||
if (ref === "document" && !resolvedRefs.has("document")) {
|
if (ref === "document" && !resolvedRefs.has("document")) {
|
||||||
ram += RamCostConstants.ScriptDomRamCost;
|
ram += RamCostConstants.ScriptDomRamCost;
|
||||||
detailedCosts.push({ type: 'dom', name: 'document', cost: RamCostConstants.ScriptDomRamCost});
|
detailedCosts.push({ type: "dom", name: "document", cost: RamCostConstants.ScriptDomRamCost });
|
||||||
}
|
}
|
||||||
if (ref === "window" && !resolvedRefs.has("window")) {
|
if (ref === "window" && !resolvedRefs.has("window")) {
|
||||||
ram += RamCostConstants.ScriptDomRamCost;
|
ram += RamCostConstants.ScriptDomRamCost;
|
||||||
detailedCosts.push({ type: 'dom', name: 'window', cost: RamCostConstants.ScriptDomRamCost});
|
detailedCosts.push({ type: "dom", name: "window", cost: RamCostConstants.ScriptDomRamCost });
|
||||||
}
|
}
|
||||||
if (ref === "corporation" && !resolvedRefs.has("corporation")) {
|
if (ref === "corporation" && !resolvedRefs.has("corporation")) {
|
||||||
ram += RamCostConstants.ScriptCorporationRamCost;
|
ram += RamCostConstants.ScriptCorporationRamCost;
|
||||||
detailedCosts.push({ type: 'ns', name: 'corporation', cost: RamCostConstants.ScriptCorporationRamCost});
|
detailedCosts.push({ type: "ns", name: "corporation", cost: RamCostConstants.ScriptCorporationRamCost });
|
||||||
}
|
}
|
||||||
|
|
||||||
resolvedRefs.add(ref);
|
resolvedRefs.add(ref);
|
||||||
@ -203,7 +205,7 @@ async function parseOnlyRamCalculate(
|
|||||||
|
|
||||||
// This accounts for namespaces (Bladeburner, CodingCpntract, etc.)
|
// This accounts for namespaces (Bladeburner, CodingCpntract, etc.)
|
||||||
let func;
|
let func;
|
||||||
let refDetail = 'n/a';
|
let refDetail = "n/a";
|
||||||
if (ref in workerScript.env.vars.bladeburner) {
|
if (ref in workerScript.env.vars.bladeburner) {
|
||||||
func = workerScript.env.vars.bladeburner[ref];
|
func = workerScript.env.vars.bladeburner[ref];
|
||||||
refDetail = `bladeburner.${ref}`;
|
refDetail = `bladeburner.${ref}`;
|
||||||
@ -213,6 +215,9 @@ async function parseOnlyRamCalculate(
|
|||||||
} else if (ref in workerScript.env.vars.stanek) {
|
} else if (ref in workerScript.env.vars.stanek) {
|
||||||
func = workerScript.env.vars.stanek[ref];
|
func = workerScript.env.vars.stanek[ref];
|
||||||
refDetail = `stanek.${ref}`;
|
refDetail = `stanek.${ref}`;
|
||||||
|
} else if (ref in workerScript.env.vars.infiltration) {
|
||||||
|
func = workerScript.env.vars.infiltration[ref];
|
||||||
|
refDetail = `infiltration.${ref}`;
|
||||||
} else if (ref in workerScript.env.vars.gang) {
|
} else if (ref in workerScript.env.vars.gang) {
|
||||||
func = workerScript.env.vars.gang[ref];
|
func = workerScript.env.vars.gang[ref];
|
||||||
refDetail = `gang.${ref}`;
|
refDetail = `gang.${ref}`;
|
||||||
@ -231,12 +236,12 @@ async function parseOnlyRamCalculate(
|
|||||||
}
|
}
|
||||||
const fnRam = applyFuncRam(func);
|
const fnRam = applyFuncRam(func);
|
||||||
ram += fnRam;
|
ram += fnRam;
|
||||||
detailedCosts.push({ type: 'fn', name: refDetail, cost: fnRam});
|
detailedCosts.push({ type: "fn", name: refDetail, cost: fnRam });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { cost: ram, entries: detailedCosts.filter(e => e.cost > 0) };
|
return { cost: ram, entries: detailedCosts.filter((e) => e.cost > 0) };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// console.info("parse or eval error: ", error);
|
// console.info("parse or eval error: ", error);
|
||||||
// This is not unexpected. The user may be editing a script, and it may be in
|
// This is not unexpected. The user may be editing a script, and it may be in
|
||||||
|
60
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
60
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
@ -1,3 +1,5 @@
|
|||||||
|
import { Location } from "src/Locations/Location";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
@ -4119,6 +4121,59 @@ interface Stanek {
|
|||||||
remove(rootX: number, rootY: number): boolean;
|
remove(rootX: number, rootY: number): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface InfiltrationReward {
|
||||||
|
tradeRep: number;
|
||||||
|
sellCash: number;
|
||||||
|
infiltratorRep: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InfiltrationLocation {
|
||||||
|
location: Location;
|
||||||
|
reward: InfiltrationReward;
|
||||||
|
difficulty: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Infiltration API.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
interface Infiltration {
|
||||||
|
/**
|
||||||
|
* Calculate the difficulty of performing an infiltration.
|
||||||
|
* @remarks
|
||||||
|
* RAM cost: 2.5 GB
|
||||||
|
*
|
||||||
|
* @param locationName - name of the location to check.
|
||||||
|
* @returns the difficulty.
|
||||||
|
*/
|
||||||
|
calculateDifficulty(locationName: string): number;
|
||||||
|
/**
|
||||||
|
* Calculate the rewards for trading and selling information for completing an infiltration.
|
||||||
|
* @remarks
|
||||||
|
* RAM cost: 2.5 GB
|
||||||
|
*
|
||||||
|
* @param locationName - name of the location to check.
|
||||||
|
* @returns the trade reputation, sell cash and infiltrators rep reward.
|
||||||
|
*/
|
||||||
|
calculateRewards(locationName: string): InfiltrationReward;
|
||||||
|
/**
|
||||||
|
* Get all locations that can be infiltrated.
|
||||||
|
* @remarks
|
||||||
|
* RAM cost: 5 GB
|
||||||
|
*
|
||||||
|
* @returns all locations that can be infiltrated.
|
||||||
|
*/
|
||||||
|
getLocations(): Location[];
|
||||||
|
/**
|
||||||
|
* Get all infiltrations with difficulty, location and rewards.
|
||||||
|
* @remarks
|
||||||
|
* RAM cost: 15 GB
|
||||||
|
*
|
||||||
|
* @returns all infiltrations with difficulty, location and rewards.
|
||||||
|
*/
|
||||||
|
getInfiltrations(): InfiltrationLocation[];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User Interface API.
|
* User Interface API.
|
||||||
* @public
|
* @public
|
||||||
@ -4268,6 +4323,11 @@ export interface NS extends Singularity {
|
|||||||
* RAM cost: 0 GB
|
* RAM cost: 0 GB
|
||||||
*/
|
*/
|
||||||
readonly stanek: Stanek;
|
readonly stanek: Stanek;
|
||||||
|
/**
|
||||||
|
* Namespace for infiltration functions.
|
||||||
|
* RAM cost: 0 GB
|
||||||
|
*/
|
||||||
|
readonly infiltration: Infiltration;
|
||||||
/**
|
/**
|
||||||
* Namespace for corporation functions.
|
* Namespace for corporation functions.
|
||||||
* RAM cost: 0 GB
|
* RAM cost: 0 GB
|
||||||
|
Loading…
Reference in New Issue
Block a user