bitburner-src/src/NetscriptFunctions/Infiltration.ts

59 lines
2.6 KiB
TypeScript
Raw Normal View History

import type { InternalAPI, NetscriptContext } from "../Netscript/APIWrapper";
import { Infiltration as NetscriptInfiltation, InfiltrationLocation } from "@nsdefs";
import { FactionName, LocationName } from "@enums";
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";
2022-04-22 21:30:49 +02:00
import { Factions } from "../Faction/Factions";
import { getEnumHelper } from "../utils/EnumHelper";
2022-08-08 19:43:41 +02:00
import { helpers } from "../Netscript/NetscriptHelpers";
import { filterTruthy } from "../utils/helpers/ArrayHelpers";
export function NetscriptInfiltration(): InternalAPI<NetscriptInfiltation> {
const getLocationsWithInfiltrations = Object.values(Locations).filter(
(location: Location) => location.infiltrationData,
);
const calculateInfiltrationData = (ctx: NetscriptContext, locationName: LocationName): InfiltrationLocation => {
2022-04-22 23:12:14 +02:00
const location = Locations[locationName];
2022-08-08 19:43:41 +02:00
if (location === undefined) throw helpers.makeRuntimeErrorMsg(ctx, `Location '${location}' does not exists.`);
if (location.infiltrationData === undefined)
2022-08-08 19:43:41 +02:00
throw helpers.makeRuntimeErrorMsg(ctx, `Location '${location}' does not provide infiltrations.`);
const startingSecurityLevel = location.infiltrationData.startingSecurityLevel;
2022-09-18 03:09:15 +02:00
const difficulty = calculateDifficulty(startingSecurityLevel);
const reward = calculateReward(startingSecurityLevel);
const maxLevel = location.infiltrationData.maxClearanceLevel;
return {
location: JSON.parse(JSON.stringify(location)),
reward: {
2022-09-18 03:09:15 +02:00
tradeRep: calculateTradeInformationRepReward(reward, maxLevel, startingSecurityLevel),
sellCash: calculateSellInformationCashReward(reward, maxLevel, startingSecurityLevel),
SoARep: calculateInfiltratorsRepReward(Factions[FactionName.ShadowsOfAnarchy], startingSecurityLevel),
},
difficulty: difficulty,
};
};
return {
getPossibleLocations: () => () => {
return filterTruthy(
getLocationsWithInfiltrations.map((l) => {
if (!l.city) return false;
return {
city: l.city,
name: l.name,
};
}),
);
},
getInfiltration: (ctx) => (_locationName) => {
const locationName = getEnumHelper("LocationName").nsGetMember(ctx, _locationName);
return calculateInfiltrationData(ctx, locationName);
},
};
}