mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-10-23 18:23:15 +02:00
76 lines
3.3 KiB
TypeScript
76 lines
3.3 KiB
TypeScript
|
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);
|
||
|
},
|
||
|
};
|
||
|
}
|