2022-03-27 09:53:13 +02:00
|
|
|
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";
|
2022-04-22 21:30:49 +02:00
|
|
|
import { FactionNames } from "../Faction/data/FactionNames";
|
|
|
|
import { Factions } from "../Faction/Factions";
|
2022-04-22 23:12:14 +02:00
|
|
|
import { InternalAPI, NetscriptContext } from "../Netscript/APIWrapper";
|
|
|
|
import { checkEnum } from "../utils/helpers/checkEnum";
|
|
|
|
import { LocationName } from "../Locations/data/LocationNames";
|
2022-03-27 09:53:13 +02:00
|
|
|
|
2022-04-22 23:12:14 +02:00
|
|
|
export function NetscriptInfiltration(player: IPlayer): InternalAPI<IInfiltration> {
|
2022-03-27 09:53:13 +02:00
|
|
|
const getLocationsWithInfiltrations = Object.values(Locations).filter(
|
|
|
|
(location: Location) => location.infiltrationData,
|
|
|
|
);
|
|
|
|
|
2022-04-22 23:12:14 +02:00
|
|
|
const calculateInfiltrationData = (ctx: NetscriptContext, locationName: string): InfiltrationLocation => {
|
|
|
|
if (!checkEnum(LocationName, locationName)) throw new Error(`Location '${locationName}' does not exists.`);
|
|
|
|
const location = Locations[locationName];
|
|
|
|
if (location === undefined) throw ctx.makeRuntimeErrorMsg(`Location '${location}' does not exists.`);
|
2022-03-27 09:53:13 +02:00
|
|
|
if (location.infiltrationData === undefined)
|
2022-04-22 23:12:14 +02:00
|
|
|
throw ctx.makeRuntimeErrorMsg(`Location '${location}' does not provide infiltrations.`);
|
2022-03-27 09:53:13 +02:00
|
|
|
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),
|
2022-04-22 23:12:14 +02:00
|
|
|
SoARep: calculateInfiltratorsRepReward(player, Factions[FactionNames.ShadowsOfAnarchy], difficulty),
|
2022-03-27 09:53:13 +02:00
|
|
|
},
|
|
|
|
difficulty: difficulty,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
return {
|
2022-04-22 23:12:14 +02:00
|
|
|
getPossibleLocations: () => (): string[] => {
|
|
|
|
return getLocationsWithInfiltrations.map((l) => l + "");
|
2022-03-27 09:53:13 +02:00
|
|
|
},
|
2022-04-22 23:12:14 +02:00
|
|
|
getInfiltration:
|
|
|
|
(ctx: NetscriptContext) =>
|
|
|
|
(_location: unknown): InfiltrationLocation => {
|
|
|
|
const location = ctx.helper.string("location", _location);
|
|
|
|
return calculateInfiltrationData(ctx, location);
|
|
|
|
},
|
2022-03-27 09:53:13 +02:00
|
|
|
};
|
|
|
|
}
|