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