diff --git a/src/CodingContractGenerator.ts b/src/CodingContractGenerator.ts index 32328c59e..79c331653 100644 --- a/src/CodingContractGenerator.ts +++ b/src/CodingContractGenerator.ts @@ -45,6 +45,15 @@ export function generateRandomContractOnHome(): void { serv.addContract(contract); } +export const generateDummyContract = (problemType: string): void => { + if (!CodingContractTypes[problemType]) throw new Error(`Invalid problem type: '${problemType}'`); + const serv = Player.getHomeComputer(); + + const contractFn = getRandomFilename(serv); + const contract = new CodingContract(contractFn, problemType, null); + serv.addContract(contract); +}; + interface IGenerateContractParams { problemType?: string; server?: string; @@ -176,7 +185,7 @@ function getRandomServer(): BaseServer { return randServer; } -function getRandomFilename(server: BaseServer, reward: ICodingContractReward): string { +function getRandomFilename(server: BaseServer, reward: ICodingContractReward = { name: "", type: 0 }): string { let contractFn = `contract-${getRandomInt(0, 1e6)}`; for (let i = 0; i < 1000; ++i) { diff --git a/src/Netscript/RamCostGenerator.ts b/src/Netscript/RamCostGenerator.ts index 08edc907f..d23905de7 100644 --- a/src/Netscript/RamCostGenerator.ts +++ b/src/Netscript/RamCostGenerator.ts @@ -279,6 +279,8 @@ const codingcontract = { getData: RamCostConstants.ScriptCodingContractBaseRamCost / 2, getDescription: RamCostConstants.ScriptCodingContractBaseRamCost / 2, getNumTriesRemaining: RamCostConstants.ScriptCodingContractBaseRamCost / 5, + createDummyContract: RamCostConstants.ScriptCodingContractBaseRamCost / 5, + getContractTypes: RamCostConstants.ScriptCodingContractBaseRamCost / 5, } as const; // Duplicate Sleeve API diff --git a/src/NetscriptFunctions/CodingContract.ts b/src/NetscriptFunctions/CodingContract.ts index a95dbe0ec..a2f0d150a 100644 --- a/src/NetscriptFunctions/CodingContract.ts +++ b/src/NetscriptFunctions/CodingContract.ts @@ -3,6 +3,8 @@ import { CodingContract } from "../CodingContracts"; import { CodingAttemptOptions, CodingContract as ICodingContract } from "../ScriptEditor/NetscriptDefinitions"; import { InternalAPI, NetscriptContext } from "../Netscript/APIWrapper"; import { helpers } from "../Netscript/NetscriptHelpers"; +import { codingContractTypesMetadata } from "../data/codingcontracttypes"; +import { generateDummyContract } from "../CodingContractGenerator"; export function NetscriptCodingContract(): InternalAPI { const getCodingContract = function ( @@ -39,7 +41,6 @@ export function NetscriptCodingContract(): InternalAPI { // Convert answer to string. const answerStr = typeof answer === "string" ? answer : JSON.stringify(answer); const creward = contract.reward; - if (creward === null) throw new Error("Somehow solved a contract that didn't have a reward"); const serv = helpers.getServer(ctx, hostname); if (contract.isSolution(answerStr)) { @@ -112,5 +113,12 @@ export function NetscriptCodingContract(): InternalAPI { const contract = getCodingContract(ctx, "getNumTriesRemaining", hostname, filename); return contract.getMaxNumTries() - contract.tries; }, + createDummyContract: + (ctx: NetscriptContext) => + (_type: unknown): void => { + const type = helpers.string(ctx, "type", _type); + generateDummyContract(type); + }, + getContractTypes: () => (): string[] => codingContractTypesMetadata.map((c) => c.name), }; } diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts index 8a7ecd60b..403363c50 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts @@ -1109,7 +1109,11 @@ export function queueAugmentation(this: PlayerObject, name: string): void { } /************* Coding Contracts **************/ -export function gainCodingContractReward(this: PlayerObject, reward: ICodingContractReward, difficulty = 1): string { +export function gainCodingContractReward( + this: PlayerObject, + reward: ICodingContractReward | null, + difficulty = 1, +): string { if (reward == null || reward.type == null) { return `No reward for this contract`; } diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts index 0850bdd7e..f8b4d4cb3 100644 --- a/src/ScriptEditor/NetscriptDefinitions.d.ts +++ b/src/ScriptEditor/NetscriptDefinitions.d.ts @@ -3251,6 +3251,24 @@ export interface CodingContract { * @returns How many attempts are remaining for the contract. */ getNumTriesRemaining(filename: string, host?: string): number; + + /** + * Generate a dummy contract. + * @remarks + * RAM cost: 2 GB + * + * Generate a dummy contract on the home computer with no reward. Used to test various algorithms. + * + * @param type - Type of contract to generate + */ + createDummyContract(type: string): void; + + /** + * List all contract types. + * @remarks + * RAM cost: 2 GB + */ + getContractTypes(): string[]; } /**