Updated version to v0.41.0. Bug fixes for Gang API. Some Gang API functions now log. Final rebalancing for gang rework

This commit is contained in:
danielyxie 2018-10-29 11:08:41 -05:00
parent 23494a162e
commit ea3b13b286
8 changed files with 273 additions and 167889 deletions

56961
dist/engine.bundle.js vendored

File diff suppressed because one or more lines are too long

111030
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -3,6 +3,40 @@
Changelog Changelog
========= =========
v0.41.0 - 10/29/2018
--------------------
* WARNING: In NetscriptJS, defining a function called print() is no longer possible
* Gang Mechanic Changes (BitNode-2):
* Added a Gang Netscript API
* Added new 'ascension' mechanic for Gang Members
* The first three gang members are now 'free' (can be recruited instantly)
* Maximum number of increased Gang Members increased from 20 to 30
* Changed the formula for calculating respect needed to recruit the next gang member
* Added a new category of upgrades for Gang Members: Augmentations
* Non-Augmentation Gang member upgrades are now significantly weaker
* Reputation for your Gang faction can no longer be gained through Infiltration
* Re-worked the territory 'warfare' mechanic so that player can choose when to engage in it
* Gang Members can now be killed during territory 'warfare'
* Changed BitNode-2 Multipliers to make hacking slightly less profitable
* Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect
* The effects of Source-File 2 are now slightly more powerful
* RAM Cost of accessing the global document object lowered from 100 GB to 25 GB
* RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4
* b1t_flum3.exe now takes significantly less time to create
* Crimes commited through Singularity function no longer give half money/exp
* Improved number formatting for Player 'work' actions (including crimes, etc.). These numbers should also adhere to locale settings now (by Kline-)
* The order that Augmentations are listed in (when purchasing from Faction and viewing your Augmentations) is now saved and persists when choosing different orders
* getCharacterInformation() Singularity function now returns multiplier information (from Augmentations/Source Files)
* Bug Fix: Calling print() in NetscriptJS no longer brings up the print dialog
* Bug Fix: Fixed a bug that sometimes caused a blank black screen when destroying/resetting/switching BitNodes
* Bug Fix: Netscript calls that throw errors will now no longer cause the 'concurrent calls' error if they are caught in the script. i.e. try/catch should now work properly in scripts
* Bug Fix: Fixed a bug where sometimes the NeuroFlux Governor Augmentation level would be incorrectly calculated when the game was loaded
* Bug Fix: Fixed a bug where calling the scp() Netscript function with invalid hostname/ips would throw an unclear error message
* Bug Fix: Bladeburner API function getActionCountRemaining() should now work properly for BlackOps
* Bug Fix: Black Ops can no longer be attempted out-of-order or without the required rank via Bladeburner API
* Bug Fix: Dynamic RAM Calculation now properly accounts for number of threads
* RAM cost for basic Netscript functions added to documentation (by CBJamo)
v0.40.5 - 10/09/2018 v0.40.5 - 10/09/2018
-------------------- --------------------
* Added codingcontract.getContractType() Netscript function * Added codingcontract.getContractType() Netscript function

@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Bitburner - development</title> <title>Bitburner</title>
<link rel="apple-touch-icon" sizes="180x180" href="dist/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="dist/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="dist/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="dist/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="dist/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="dist/favicon-16x16.png">
@ -471,8 +471,7 @@
<!-- Tutorial content --> <!-- Tutorial content -->
<div id="tutorial-container" class="generic-menupage-container"> <div id="tutorial-container" class="generic-menupage-container">
<a id="tutorial-getting-started-link" class="a-link-button" <a id="tutorial-getting-started-link" class="a-link-button" href="http://bitburner.wikia.com/wiki/Chapt3rs_Guide_to_Getting_Started_with_Bitburner" target="_blank"> Getting Started </a>
href="http://bitburner.wikia.com/wiki/Chapt3rs_Guide_to_Getting_Started_with_Bitburner" target="_blank"> Getting Started </a>
<a id="tutorial-networking-link" class="a-link-button"> Servers & Networking </a> <a id="tutorial-networking-link" class="a-link-button"> Servers & Networking </a>
<a id="tutorial-hacking-link" class="a-link-button"> Hacking </a> <a id="tutorial-hacking-link" class="a-link-button"> Hacking </a>
<a id="tutorial-scripts-link" class="a-link-button"> Scripts </a> <a id="tutorial-scripts-link" class="a-link-button"> Scripts </a>
@ -481,8 +480,7 @@
<a id="tutorial-jobs-link" class="a-link-button"> Companies and Infiltration </a> <a id="tutorial-jobs-link" class="a-link-button"> Companies and Infiltration </a>
<a id="tutorial-factions-link" class="a-link-button"> Factions </a> <a id="tutorial-factions-link" class="a-link-button"> Factions </a>
<a id="tutorial-augmentations-link" class="a-link-button"> Augmentations </a> <a id="tutorial-augmentations-link" class="a-link-button"> Augmentations </a>
<a id="tutorial-shortcuts-link" class="a-link-button" <a id="tutorial-shortcuts-link" class="a-link-button" href="https://bitburner.wikia.com/wiki/Shortcuts" target="_blank"> Keyboard Shortcuts </a>
href="https://bitburner.wikia.com/wiki/Shortcuts" target="_blank"> Keyboard Shortcuts </a>
<a id="tutorial-back-button" class="a-link-button"> Back </a> <a id="tutorial-back-button" class="a-link-button"> Back </a>
<p id="tutorial-text"> </p> <p id="tutorial-text"> </p>

@ -1,5 +1,5 @@
let CONSTANTS = { let CONSTANTS = {
Version: "0.40.5", Version: "0.41.0",
//Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience //Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
//and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then //and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then

@ -31,7 +31,7 @@ import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox"; yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox";
// Constants // Constants
const GangRespectToReputationRatio = 2; // Respect is divided by this to get rep gain const GangRespectToReputationRatio = 5; // Respect is divided by this to get rep gain
const MaximumGangMembers = 30; const MaximumGangMembers = 30;
const GangRecruitCostMultiplier = 2; const GangRecruitCostMultiplier = 2;
const CyclesPerTerritoryAndPowerUpdate = 100; const CyclesPerTerritoryAndPowerUpdate = 100;
@ -273,7 +273,7 @@ Gang.prototype.processTerritoryAndPowerGains = function(numCycles=1) {
// Multiplicative gain (50% chance) // Multiplicative gain (50% chance)
// This is capped per cycle, to prevent it from getting out of control // This is capped per cycle, to prevent it from getting out of control
const multiplicativeGain = AllGangs[name].power * 0.008; const multiplicativeGain = AllGangs[name].power * 0.008;
AllGangs[name].power += Math.min(1, multiplicativeGain); AllGangs[name].power += Math.min(0.9, multiplicativeGain);
} else { } else {
// Additive gain (50% chance) // Additive gain (50% chance)
const additiveGain = 0.5 * gainRoll * AllGangs[name].territory; const additiveGain = 0.5 * gainRoll * AllGangs[name].territory;
@ -357,6 +357,7 @@ Gang.prototype.getRespectNeededToRecruitMember = function() {
} }
Gang.prototype.recruitMember = function(name) { Gang.prototype.recruitMember = function(name) {
name = String(name);
if (name === "" || !this.canRecruitMember()) { return false; } if (name === "" || !this.canRecruitMember()) { return false; }
// Check for already-existing names // Check for already-existing names

@ -107,8 +107,13 @@ var possibleLogs = {
getServerGrowth: true, getServerGrowth: true,
getServerNumPortsRequired: true, getServerNumPortsRequired: true,
getServerRam: true, getServerRam: true,
// TIX API
buyStock: true, buyStock: true,
sellStock: true, sellStock: true,
shortStock: true,
sellShort: true,
// Singularity Functions
purchaseServer: true, purchaseServer: true,
deleteServer: true, deleteServer: true,
universityCourse: true, universityCourse: true,
@ -125,12 +130,18 @@ var possibleLogs = {
donateToFaction: true, donateToFaction: true,
createProgram: true, createProgram: true,
commitCrime: true, commitCrime: true,
shortStock: true,
sellShort: true, // Bladeburner API
startAction: true, startAction: true,
upgradeSkill: true, upgradeSkill: true,
setTeamSize: true, setTeamSize: true,
joinBladeburnerFaction: true, joinBladeburnerFaction: true,
// Gang API
recruitMember: true,
setMemberTask: true,
purchaseEquipment: true,
setTerritoryWarfare: true,
} }
//Used to check and set flags for every Source File, despite the name of the function //Used to check and set flags for every Source File, despite the name of the function
@ -3647,7 +3658,7 @@ function NetscriptFunctions(workerScript) {
strength: member.str, strength: member.str,
strengthEquipMult: member.str_mult, strengthEquipMult: member.str_mult,
strengthAscensionMult: member.str_asc_mult, strengthAscensionMult: member.str_asc_mult,
task: member.task.name, task: member.task,
} }
} }
} }
@ -3679,7 +3690,16 @@ function NetscriptFunctions(workerScript) {
nsGang.checkGangApiAccess(workerScript, "recruitMember"); nsGang.checkGangApiAccess(workerScript, "recruitMember");
try { try {
return Player.gang.recruitMember(name); const res = Player.gang.recruitMember(name);
if (workerScript.shouldLog("recruitMember")) {
if (res) {
workerScript.log(`Successfully recruited Gang Member ${name}`);
} else {
workerScript.log(`Failed to recruit Gang Member ${name}`);
}
}
return res;
} catch(e) { } catch(e) {
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("recruitMember", e)); throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("recruitMember", e));
} }
@ -3709,7 +3729,16 @@ function NetscriptFunctions(workerScript) {
try { try {
for (const member of Player.gang.members) { for (const member of Player.gang.members) {
if (member.name === memberName) { if (member.name === memberName) {
return member.assignToTask(taskName); const res = member.assignToTask(taskName);
if (workerScript.shouldLog("setMemberTask")) {
if (res) {
workerScript.log(`Successfully assigned Gang Member ${memberName} to ${taskName} task`);
} else {
workerScript.log(`Failed to assign Gang Member ${memberName} to ${taskName} task. ${memberName} is now Unassigned`);
}
}
return res;
} }
} }
@ -3755,7 +3784,16 @@ function NetscriptFunctions(workerScript) {
try { try {
for (const member in Player.gang.members) { for (const member in Player.gang.members) {
if (member.name === memberName) { if (member.name === memberName) {
return member.buyUpgrade(equipName, Player, Player.gang); const res = member.buyUpgrade(equipName, Player, Player.gang);
if (workerScript.shouldLog("purchaseEquipment")) {
if (res) {
workerScript.log(`Purchased ${equipName} for Gang member ${memberName}`);
} else {
workerScript.log(`Failed to purchase ${equipName} for Gang member ${memberName}`);
}
}
return res;
} }
} }
@ -3795,8 +3833,14 @@ function NetscriptFunctions(workerScript) {
try { try {
if (engage) { if (engage) {
Player.gang.territoryWarfareEngaged = true; Player.gang.territoryWarfareEngaged = true;
if (workerScript.shouldLog("setTerritoryWarfare")) {
workerScript.log("Engaging in Gang Territory Warfare");
}
} else { } else {
Player.gang.territoryWarfareEngaged = false; Player.gang.territoryWarfareEngaged = false;
if (workerScript.shouldLog("setTerritoryWarfare")) {
workerScript.log("Disengaging in Gang Territory Warfare");
}
} }
} catch(e) { } catch(e) {
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("setTerritoryWarfare", e)); throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("setTerritoryWarfare", e));

@ -205,7 +205,7 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isHacking: false, isHacking: false,
name: "Human Trafficking", name: "Human Trafficking",
params: { params: {
baseRespect: 0.005, baseWanted: 0.4, baseMoney: 120, baseRespect: 0.004, baseWanted: 1, baseMoney: 120,
hackWeight: 30, strWeight: 5, defWeight: 5, dexWeight: 30, chaWeight: 30, hackWeight: 30, strWeight: 5, defWeight: 5, dexWeight: 30, chaWeight: 30,
difficulty: 36, difficulty: 36,
territory: { territory: {
@ -221,7 +221,7 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isHacking: false, isHacking: false,
name: "Terrorism", name: "Terrorism",
params: { params: {
baseRespect: 0.01, baseWanted: 1.5, baseRespect: 0.01, baseWanted: 5,
hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 20, hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 20,
difficulty: 36, difficulty: 36,
territory: { territory: {