Fixed various Coding Contract bugs. Added getContractType() to coding contract API

This commit is contained in:
danielyxie 2018-10-08 19:26:24 -05:00
parent f86d87fa03
commit 62b58cd766
7 changed files with 59 additions and 30 deletions

@ -31,6 +31,20 @@ attempt
:returns: Boolean indicating whether the solution was correct :returns: Boolean indicating whether the solution was correct
getContractType
---------------
.. js:function:: getContractType(fn[, hostname/ip=current ip])
:param string fn: Filename of the contract
:param string hostname/ip: Hostname or IP of the server containing the contract.
Optional. Defaults to current server if not provided
Returns a name describing the type of problem posed by the Coding Contract.
(e.g. Find Largest Prime Factor, Total Ways to Sum, etc.)
:returns: A string with the contract's problem type
getDescription getDescription
-------------- --------------

@ -112,7 +112,8 @@ let NetscriptFunctions =
"getCityChaos|switchCity|getStamina|joinBladeburnerFaction|getBonusTime|" + "getCityChaos|switchCity|getStamina|joinBladeburnerFaction|getBonusTime|" +
// Coding Contract API // Coding Contract API
"codingcontract|attempt|getData|getDescription|getNumTriesRemaining"; "codingcontract|attempt|getContractType|getData|getDescription|" +
"getNumTriesRemaining";
var NetscriptHighlightRules = function(options) { var NetscriptHighlightRules = function(options) {
var keywordMapper = this.createKeywordMapper({ var keywordMapper = this.createKeywordMapper({

@ -154,6 +154,10 @@ export class CodingContract {
return CodingContractTypes[this.type].numTries; return CodingContractTypes[this.type].numTries;
} }
getType(): string {
return CodingContractTypes[this.type].name;
}
isSolution(solution: string): boolean { isSolution(solution: string): boolean {
return CodingContractTypes[this.type].solver(this.data, solution); return CodingContractTypes[this.type].solver(this.data, solution);
} }

@ -506,18 +506,11 @@ let CONSTANTS = {
LatestUpdate: LatestUpdate:
` `
v0.40.4 v0.40.5
* Added new Coding Contracts mechanic. Solve programming problems to earn rewards * Added codingcontract.getContractType() Netscript function
* The write() and read() Netscript functions now work on scripts * Bug Fix: codingcontract.getData() Netscript function now returns arrays by value rather than reference
* Added getStockSymbols() Netscript function to the TIX API (by InfraK) * Bug Fix: Decreased highest possible data value for 'Find Largest Prime Factor' Coding Contract (to avoid hangs when solving it)
* Added wget() Netscript function * Bug Fix: Fixed a bug that caused game to freeze during Coding Contract generation
* Added bladeburner.getActionRepGain() function to the Netscript Bladeburner API
* The getLevelUpgradeCost(), getRamUpgradeCost(), and getCoreUpgradeCost() functions in the Hacknet API now return Infinity if the node is at max level. See documentation
* It is now possible to use freely use angled bracket (<, >) and create DOM elements using tprint()
* The game's theme colors can now be set through the Terminal configuration (.fconf).
* You can now switch to the old left-hand main menu bar through the Terminal configuration (.fconf)
* Bug Fix: grow() percentage is no longer reported as Infinity when a server's money is grown from 0 to X
* Bug Fix: Infiltration popup now displays the correct amount of exp gained
` `
} }

@ -4085,17 +4085,35 @@ function NetscriptFunctions(workerScript) {
return false; return false;
} }
}, },
getContractType : function(fn, ip=workerScript.serverIp) {
if (workerScript.checkingRam) {
return updateStaticRam("getContractType", CONSTANTS.ScriptCodingContractBaseRamCost / 2);
}
updateDynamicRam("getContractType", CONSTANTS.ScriptCodingContractBaseRamCost / 2);
let contract = getCodingContract(fn, ip);
if (contract == null) {
workerScript.log(`ERROR: codingcontract.getData() failed because it could find the specified contract ${fn} on server ${ip}`);
return null;
}
return contract.getType();
},
getData : function(fn, ip=workerScript.serverIp) { getData : function(fn, ip=workerScript.serverIp) {
if (workerScript.checkingRam) { if (workerScript.checkingRam) {
return updateStaticRam("getData", CONSTANTS.ScriptCodingContractBaseRamCost / 2); return updateStaticRam("getData", CONSTANTS.ScriptCodingContractBaseRamCost / 2);
} }
updateDynamicRam("getData", CONSTANTS.ScriptCodingContractBaseRamCost / 2); updateDynamicRam("getData", CONSTANTS.ScriptCodingContractBaseRamCost / 2);
var contract = getCodingContract(fn, ip); let contract = getCodingContract(fn, ip);
if (contract == null) { if (contract == null) {
workerScript.log(`ERROR: codingcontract.getData() failed because it could find the specified contract ${fn} on server ${ip}`); workerScript.log(`ERROR: codingcontract.getData() failed because it could find the specified contract ${fn} on server ${ip}`);
return null; return null;
} }
return contract.getData(); let data = contract.getData();
if (typeof data === "object") {
// Pass a copy
return data.slice();
} else {
return data;
}
}, },
getDescription : function(fn, ip=workerScript.serverIp) { getDescription : function(fn, ip=workerScript.serverIp) {
if (workerScript.checkingRam) { if (workerScript.checkingRam) {

@ -50,7 +50,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
}, },
difficulty: 1, difficulty: 1,
gen: () => { gen: () => {
return getRandomInt(500, 9e9); return getRandomInt(500, 1e9);
}, },
name: "Find Largest Prime Factor", name: "Find Largest Prime Factor",
numTries: 10, numTries: 10,

@ -1169,10 +1169,18 @@ const Engine = {
reward.type = getRandomInt(0, CodingContractRewardType.Money); reward.type = getRandomInt(0, CodingContractRewardType.Money);
// Change type based on certain conditions // Change type based on certain conditions
if (reward.type === CodingContractRewardType.FactionReputation && Player.factions.length === 0) { var factionsThatAllowHacking = Player.factions.filter((fac) => {
try {
return Factions[fac].getInfo().offerHackingWork;
} catch (e) {
console.error(`Error when trying to filter Hacking Factions for Coding Contract Generation: ${e}`);
return false;
}
});
if (reward.type === CodingContractRewardType.FactionReputation && factionsThatAllowHacking.length === 0) {
reward.type = CodingContractRewardType.CompanyReputation; reward.type = CodingContractRewardType.CompanyReputation;
} }
if (reward.type === CodingContractRewardType.FactionReputationAll && Player.factions.length === 0) { if (reward.type === CodingContractRewardType.FactionReputationAll && factionsThatAllowHacking.length === 0) {
reward.type = CodingContractRewardType.CompanyReputation; reward.type = CodingContractRewardType.CompanyReputation;
} }
if (reward.type === CodingContractRewardType.CompanyReputation && Player.companyName === "") { if (reward.type === CodingContractRewardType.CompanyReputation && Player.companyName === "") {
@ -1184,17 +1192,8 @@ const Engine = {
case CodingContractRewardType.FactionReputation: case CodingContractRewardType.FactionReputation:
// Get a random faction that player is a part of. That // Get a random faction that player is a part of. That
// faction must allow hacking contracts // faction must allow hacking contracts
var numFactions = Player.factions.length; var numFactions = factionsThatAllowHacking.length;
var randFaction = Player.factions[getRandomInt(0, numFactions - 1)]; var randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)];
try {
while(Factions[randFaction].getInfo().offerHackingWork !== true) {
randFaction = Player.factions[getRandomInt(0, numFactions - 1)];
}
reward.name = randFaction;
} catch (e) {
exceptionAlert("Failed to find a faction for Coding Contract Generation: " + e);
}
break; break;
case CodingContractRewardType.CompanyReputation: case CodingContractRewardType.CompanyReputation:
if (Player.companyName !== "") { if (Player.companyName !== "") {