Intelligence rework, most intelligence gain have been multiplied by at least 100, if not more. All intelligence use have been reviewed and often boosted but by a percentage. Typically this means intelligence gives a 2-6% boost to everything for normal players and around 13% for int farmers.

This commit is contained in:
Olivier Gagnon 2021-03-20 05:29:53 -04:00
parent 2507899762
commit 7232a786ed
18 changed files with 111 additions and 76 deletions

@ -3,39 +3,65 @@
Changelog Changelog
========= =========
v0.50.0 - 2021-03-20 Intelligence (hydroflame)
----------------------------------------------
**Intelligence**
* int exp gain and effect has been reworked. It is now much more easy to
acquire and far more powerful. The goal here is to feel like players have
another tool in their arsenal.
**Factions**
* Hacking factions no longer have hacking level requirements since their associated servers do.
**Misc.**
* Sleeve styling.
* number formatting
* remove wiki button in Hacking Missions.
* Fix NaN displayed when very very large numbers are reached.
v0.49.2 - 2021-03-13 (hydroflame) v0.49.2 - 2021-03-13 (hydroflame)
------- ---------------------------------
**BN8**
BN8
* A new bitnode multipler has been added, it lets you reduce money from a * A new bitnode multipler has been added, it lets you reduce money from a
server without gaining actually any money. This is important for BN8 where server without gaining actually any money. This is important for BN8 where
hack/grow can influence the stock market. No money can be gained from hack/grow can influence the stock market. No money can be gained from
hacking but server money can still be reduced. hacking but server money can still be reduced.
Documentation **Documentation**
* readthedocs should now be more consistent and many examples were added. * readthedocs should now be more consistent and many examples were added.
Netscript **Netscript**
* Ace editor will now correctly highlight all functions. * Ace editor will now correctly highlight all functions.
* 'tFormat' is a new netscript function that returns a human readable * 'tFormat' is a new netscript function that returns a human readable
representation of milliseconds. eg. "2 hours 15 minute 43 seconds" representation of milliseconds. eg. "2 hours 15 minute 43 seconds"
Gang **Gang**
* style improvements * style improvements
Bladeburner **Bladeburner**
* style improvements * style improvements
* fix bug where 'skill list SKILL' would crash if skill is level 0. * fix bug where 'skill list SKILL' would crash if skill is level 0.
Sleeve **Sleeve**
* karma gain now scales with sync. * karma gain now scales with sync.
Misc. **Misc.**
Fix issue where the effective stats under Character>Stats were being calculated.
* Fix issue where the effective stats under Character>Stats were being calculated.
v0.49.0 - 2021-03-11 Source-File -1 (hydroflame) v0.49.0 - 2021-03-11 Source-File -1 (hydroflame)
------- ------------------------------------------------
**Source-File -1** **Source-File -1**
@ -63,7 +89,7 @@ v0.49.0 - 2021-03-11 Source-File -1 (hydroflame)
v0.48.0 - ASCII - 2021-03-07 (hydroflame) v0.48.0 - ASCII - 2021-03-07 (hydroflame)
------- -----------------------------------------
**ASCII** **ASCII**
@ -135,7 +161,7 @@ v0.47.2 - 7/15/2019
* Added 'Solarized Dark' theme to CodeMirror editor * Added 'Solarized Dark' theme to CodeMirror editor
* After Infiltration, you will now return to the company page rather than the city page * After Infiltration, you will now return to the company page rather than the city page
* Bug fix: Stock Market UI should no longer crash for certain locale settings * Bug fix: Stock Market UI should no longer crash for certain locale settings
* Bug fix: You can now properly remove unfinished programs (the *.exe-N%-INC files) * Bug fix: You can now properly remove unfinished programs (the `*.exe-N%-INC` files)
* Bug fix: Fixed an issue that allowed you to increase money on servers with a 'maxMoney' of 0 (like CSEC) * Bug fix: Fixed an issue that allowed you to increase money on servers with a 'maxMoney' of 0 (like CSEC)
* Bug fix: Scripts no longer persist if they were started with syntax/import errors * Bug fix: Scripts no longer persist if they were started with syntax/import errors
* Bug fix: 'hack' and 'analyze' Terminal commands are now blocking * Bug fix: 'hack' and 'analyze' Terminal commands are now blocking

@ -1,15 +0,0 @@
getHackTime(), getGrowTime(), & getWeakenTime()
===============================================
The :js:func:`getHackTime`, :js:func:`getGrowTime`, and :js:func:`getWeakenTime`
all take an additional third optional parameter for specifying a specific intelligence
level to see how that would affect the hack/grow/weaken times. This parameter
defaults to your current intelligence level.
(Intelligence is unlocked after obtaining Source-File 5).
The function signatures are then::
getHackTime(hostname/ip[, hackLvl=current level, intLvl=current level])
getGrowTime(hostname/ip[, hackLvl=current level, intLvl=current level])
getWeakenTime(hostname/ip[, hackLvl=current level, intLvl=current level])

@ -9,4 +9,3 @@ they contain spoilers for the game.
.. toctree:: .. toctree::
getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers> getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers>
getHackTime(), getGrowTime(), & getWeakenTime() <advancedfunctions/getHackGrowWeakenTimes>

@ -9,8 +9,12 @@ getAugmentationStats() Netscript Function
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
ns.getAugmentationStats("Synfibril Muscle") Examples:
{
strength_mult: 1.3, .. code-block:: javascript
defense_mult: 1.3,
} ns.getAugmentationStats("Synfibril Muscle")
{
strength_mult: 1.3,
defense_mult: 1.3,
}

@ -214,6 +214,7 @@ export class Action {
competence += (this.weights[stat] * Math.pow(effMultiplier*playerStatLvl, this.decays[stat])); competence += (this.weights[stat] * Math.pow(effMultiplier*playerStatLvl, this.decays[stat]));
} }
} }
competence *= Player.getIntelligenceBonus(0.75);
competence *= inst.calculateStaminaPenalty(); competence *= inst.calculateStaminaPenalty();
competence *= this.getTeamSuccessBonus(inst); competence *= this.getTeamSuccessBonus(inst);

@ -60,7 +60,7 @@ export const BladeburnerConstants: {
ChaosThreshold: 50, // City chaos level after which it starts making tasks harder ChaosThreshold: 50, // City chaos level after which it starts making tasks harder
BaseStatGain: 1, // Base stat gain per second BaseStatGain: 1, // Base stat gain per second
BaseIntGain: 0.001, // Base intelligence stat gain BaseIntGain: 0.003, // Base intelligence stat gain
ActionCountGrowthPeriod: 480, // Time (s) it takes for action count to grow by its specified value ActionCountGrowthPeriod: 480, // Time (s) it takes for action count to grow by its specified value

@ -6,7 +6,7 @@
import { IMap } from "./types"; import { IMap } from "./types";
export let CONSTANTS: IMap<any> = { export let CONSTANTS: IMap<any> = {
Version: "0.49.2", Version: "0.50.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
@ -75,14 +75,14 @@ export let CONSTANTS: IMap<any> = {
HospitalCostPerHp: 100e3, HospitalCostPerHp: 100e3,
// Intelligence-related constants // Intelligence-related constants
IntelligenceCrimeWeight: 0.05, // Weight for how much int affects crime success rates IntelligenceCrimeWeight: 0.025, // Weight for how much int affects crime success rates
IntelligenceInfiltrationWeight: 0.1, // Weight for how much int affects infiltration success rates IntelligenceInfiltrationWeight: 0.1, // Weight for how much int affects infiltration success rates
IntelligenceCrimeBaseExpGain: 0.001, IntelligenceCrimeBaseExpGain: 0.05,
IntelligenceProgramBaseExpGain: 500, // Program required hack level divided by this to determine int exp gain IntelligenceProgramBaseExpGain: 2.5, // Program required hack level divided by this to determine int exp gain
IntelligenceTerminalHackBaseExpGain: 200, // Hacking exp divided by this to determine int exp gain IntelligenceTerminalHackBaseExpGain: 200, // Hacking exp divided by this to determine int exp gain
IntelligenceSingFnBaseExpGain: 0.002, IntelligenceSingFnBaseExpGain: 1.5,
IntelligenceClassBaseExpGain: 0.000001, IntelligenceClassBaseExpGain: 0.01,
IntelligenceHackingMissionBaseExpGain: 0.03, // Hacking Mission difficulty multiplied by this to get exp gain IntelligenceHackingMissionBaseExpGain: 3, // Hacking Mission difficulty multiplied by this to get exp gain
// Hacking Missions // Hacking Missions
// TODO Move this into Hacking Mission implementation // TODO Move this into Hacking Mission implementation
@ -228,12 +228,20 @@ export let CONSTANTS: IMap<any> = {
LatestUpdate: LatestUpdate:
` `
v0.49.2 - 2021-03-13 v0.50.0 - 2021-03-20 Intelligence (hydroflame)
------- -------
Intelligence
* int exp gain and effect has been reworked. It is now much more easy to
acquire and far more powerful. The goal here is to feel like players have
another tool in their arsenal.
Factions Factions
* Hacking factions no longer have hacking level requirements since their associated servers do. * Hacking factions no longer have hacking level requirements since their associated servers do.
Misc. Misc.
* Sleeve styling. * Sleeve styling.
* number formatting
* remove wiki button in Hacking Missions.
* Fix NaN displayed when very very large numbers are reached.
` `
} }

@ -120,6 +120,7 @@ export class Crime {
chance /= CONSTANTS.MaxSkillLevel; chance /= CONSTANTS.MaxSkillLevel;
chance /= this.difficulty; chance /= this.difficulty;
chance *= p.crime_success_mult; chance *= p.crime_success_mult;
chance *= p.getIntelligenceBonus(1);
return Math.min(chance, 1); return Math.min(chance, 1);
} }

@ -21,7 +21,7 @@ export const Crimes: IMap<Crime> = {
dexterity_success_weight: 2, dexterity_success_weight: 2,
agility_success_weight: 1, agility_success_weight: 1,
intelligence_exp: 0.25 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 7.5 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
Mug: new Crime("Mug", CONSTANTS.CrimeMug, 4e3, 36e3, 1/5, 0.25, { Mug: new Crime("Mug", CONSTANTS.CrimeMug, 4e3, 36e3, 1/5, 0.25, {
@ -45,7 +45,7 @@ export const Crimes: IMap<Crime> = {
dexterity_success_weight: 1, dexterity_success_weight: 1,
agility_success_weight: 1, agility_success_weight: 1,
intelligence_exp: 0.5 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 15 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
DealDrugs: new Crime("Deal Drugs", CONSTANTS.CrimeDrugs, 10e3, 120e3, 1, 0.5, { DealDrugs: new Crime("Deal Drugs", CONSTANTS.CrimeDrugs, 10e3, 120e3, 1, 0.5, {
@ -66,7 +66,7 @@ export const Crimes: IMap<Crime> = {
hacking_success_weight: 0.05, hacking_success_weight: 0.05,
dexterity_success_weight: 1.25, dexterity_success_weight: 1.25,
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 60 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
TraffickArms: new Crime("Traffick Arms", CONSTANTS.CrimeTraffickArms, 40e3, 600e3, 2, 1, { TraffickArms: new Crime("Traffick Arms", CONSTANTS.CrimeTraffickArms, 40e3, 600e3, 2, 1, {
@ -110,7 +110,7 @@ export const Crimes: IMap<Crime> = {
agility_success_weight: 2, agility_success_weight: 2,
charisma_success_weight: 2, charisma_success_weight: 2,
intelligence_exp: CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 16 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
Kidnap: new Crime("Kidnap", CONSTANTS.CrimeKidnap, 120e3, 3.6e6, 5, 6, { Kidnap: new Crime("Kidnap", CONSTANTS.CrimeKidnap, 120e3, 3.6e6, 5, 6, {
@ -125,7 +125,7 @@ export const Crimes: IMap<Crime> = {
dexterity_success_weight: 1, dexterity_success_weight: 1,
agility_success_weight: 1, agility_success_weight: 1,
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 26 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
Assassination: new Crime("Assassination", CONSTANTS.CrimeAssassination, 300e3, 12e6, 8, 10, { Assassination: new Crime("Assassination", CONSTANTS.CrimeAssassination, 300e3, 12e6, 8, 10, {
@ -138,7 +138,7 @@ export const Crimes: IMap<Crime> = {
dexterity_success_weight: 2, dexterity_success_weight: 2,
agility_success_weight: 1, agility_success_weight: 1,
intelligence_exp: 5 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 65 * CONSTANTS.IntelligenceCrimeBaseExpGain,
kills: 1, kills: 1,
}), }),
@ -158,6 +158,6 @@ export const Crimes: IMap<Crime> = {
agility_success_weight: 1, agility_success_weight: 1,
charisma_success_weight: 1, charisma_success_weight: 1,
intelligence_exp: 10 * CONSTANTS.IntelligenceCrimeBaseExpGain, intelligence_exp: 130 * CONSTANTS.IntelligenceCrimeBaseExpGain,
}), }),
}; };

@ -8,11 +8,10 @@ import { HacknetServer } from "./Hacknet/HacknetServer";
*/ */
export function calculateHackingChance(server: Server): number { export function calculateHackingChance(server: Server): number {
const hackFactor = 1.75; const hackFactor = 1.75;
const intFactor = 0.2;
const difficultyMult = (100 - server.hackDifficulty) / 100; const difficultyMult = (100 - server.hackDifficulty) / 100;
const skillMult = (hackFactor * Player.hacking_skill) + (intFactor * Player.intelligence); const skillMult = hackFactor * Player.hacking_skill;
const skillChance = (skillMult - server.requiredHackingSkill) / skillMult; const skillChance = (skillMult - server.requiredHackingSkill) / skillMult;
const chance = skillChance * difficultyMult * Player.hacking_chance_mult; const chance = skillChance * difficultyMult * Player.hacking_chance_mult * Player.getIntelligenceBonus(1);
if (chance > 1) { return 1; } if (chance > 1) { return 1; }
if (chance < 0) { return 0; } if (chance < 0) { return 0; }
@ -55,21 +54,19 @@ export function calculatePercentMoneyHacked(server: Server): number {
/** /**
* Returns time it takes to complete a hack on a server, in seconds * Returns time it takes to complete a hack on a server, in seconds
*/ */
export function calculateHackingTime(server: Server, hack: number, int: number): number { export function calculateHackingTime(server: Server, hack: number): number {
const difficultyMult = server.requiredHackingSkill * server.hackDifficulty; const difficultyMult = server.requiredHackingSkill * server.hackDifficulty;
const baseDiff = 500; const baseDiff = 500;
const baseSkill = 50; const baseSkill = 50;
const diffFactor = 2.5; const diffFactor = 2.5;
const intFactor = 0.1;
if (hack == null) {hack = Player.hacking_skill;} if (hack == null) {hack = Player.hacking_skill;}
if (int == null) {int = Player.intelligence;}
let skillFactor = (diffFactor * difficultyMult + baseDiff); let skillFactor = (diffFactor * difficultyMult + baseDiff);
// tslint:disable-next-line // tslint:disable-next-line
skillFactor /= (hack + baseSkill + (intFactor * int)); skillFactor /= (hack + baseSkill);
const hackTimeMultiplier = 5; const hackTimeMultiplier = 5;
const hackingTime = hackTimeMultiplier * skillFactor / Player.hacking_speed_mult; const hackingTime = hackTimeMultiplier * skillFactor / (Player.hacking_speed_mult * Player.getIntelligenceBonus(1));
return hackingTime; return hackingTime;
} }
@ -77,17 +74,17 @@ export function calculateHackingTime(server: Server, hack: number, int: number):
/** /**
* Returns time it takes to complete a grow operation on a server, in seconds * Returns time it takes to complete a grow operation on a server, in seconds
*/ */
export function calculateGrowTime(server: Server, hack: number, int: number): number { export function calculateGrowTime(server: Server, hack: number): number {
const growTimeMultiplier = 3.2; // Relative to hacking time. 16/5 = 3.2 const growTimeMultiplier = 3.2; // Relative to hacking time. 16/5 = 3.2
return growTimeMultiplier * calculateHackingTime(server, hack, int); return growTimeMultiplier * calculateHackingTime(server, hack);
} }
/** /**
* Returns time it takes to complete a weaken operation on a server, in seconds * Returns time it takes to complete a weaken operation on a server, in seconds
*/ */
export function calculateWeakenTime(server: Server, hack: number, int: number): number { export function calculateWeakenTime(server: Server, hack: number): number {
const weakenTimeMultiplier = 4; // Relative to hacking time const weakenTimeMultiplier = 4; // Relative to hacking time
return weakenTimeMultiplier * calculateHackingTime(server, hack, int); return weakenTimeMultiplier * calculateHackingTime(server, hack);
} }

@ -178,4 +178,5 @@ export interface IPlayer {
travel(to: CityName): boolean; travel(to: CityName): boolean;
giveExploit(exploit: Exploit): void; giveExploit(exploit: Exploit): void;
queryStatFromString(str: string): number; queryStatFromString(str: string): number;
getIntelligenceBonus(weight: number): number;
} }

@ -21,4 +21,6 @@ export interface IPlayerOrSleeve {
// Multipliers // Multipliers
crime_success_mult: number; crime_success_mult: number;
getIntelligenceBonus(weight: number): number;
} }

@ -209,4 +209,13 @@ export abstract class Person {
this.max_hp = Math.floor(10 + this.defense / 10); this.max_hp = Math.floor(10 + this.defense / 10);
this.hp = Math.round(this.max_hp * ratio); this.hp = Math.round(this.max_hp * ratio);
} }
getIntelligenceBonus(weight: number): number {
// 15 => +1.4% when you initially acquire int
// 50 => +3.8% mid game
// 100 => +6.6% late game
// 250 => +13.4% realistic best possible
return 1+(weight*Math.pow(this.intelligence, 0.8)/600);
}
} }

@ -821,7 +821,7 @@ export function startFactionHackWork(faction) {
this.resetWorkStatus(); this.resetWorkStatus();
this.workHackExpGainRate = .15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain; this.workHackExpGainRate = .15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain;
this.workRepGainRate = this.workRepGainRate = (this.hacking_skill + this.intelligence) / CONSTANTS.MaxSkillLevel * this.faction_rep_mult; this.workRepGainRate = (this.hacking_skill + this.intelligence) / CONSTANTS.MaxSkillLevel * this.faction_rep_mult * this.getIntelligenceBonus(0.5);
this.factionWorkType = CONSTANTS.FactionWorkHacking; this.factionWorkType = CONSTANTS.FactionWorkHacking;
this.currentWorkFactionDescription = "carrying out hacking contracts"; this.currentWorkFactionDescription = "carrying out hacking contracts";
@ -869,7 +869,7 @@ export function workForFaction(numCycles) {
//Constantly update the rep gain rate //Constantly update the rep gain rate
switch (this.factionWorkType) { switch (this.factionWorkType) {
case CONSTANTS.FactionWorkHacking: case CONSTANTS.FactionWorkHacking:
this.workRepGainRate = (this.hacking_skill + this.intelligence) / CONSTANTS.MaxSkillLevel * this.faction_rep_mult; this.workRepGainRate = (this.hacking_skill + this.intelligence) / CONSTANTS.MaxSkillLevel * this.faction_rep_mult * this.getIntelligenceBonus(0.5);
break; break;
case CONSTANTS.FactionWorkField: case CONSTANTS.FactionWorkField:
this.workRepGainRate = this.getFactionFieldWorkRepGain(); this.workRepGainRate = this.getFactionFieldWorkRepGain();
@ -1157,7 +1157,7 @@ export function startCreateProgramWork(programName, time, reqLevel) {
export function createProgramWork(numCycles) { export function createProgramWork(numCycles) {
//Higher hacking skill will allow you to create programs faster //Higher hacking skill will allow you to create programs faster
var reqLvl = this.createProgramReqLvl; var reqLvl = this.createProgramReqLvl;
var skillMult = (this.hacking_skill / reqLvl); //This should always be greater than 1; var skillMult = (this.hacking_skill / reqLvl) * this.getIntelligenceBonus(3); //This should always be greater than 1;
skillMult = 1 + ((skillMult - 1) / 5); //The divider constant can be adjusted as necessary skillMult = 1 + ((skillMult - 1) / 5); //The divider constant can be adjusted as necessary
//Skill multiplier directly applied to "time worked" //Skill multiplier directly applied to "time worked"
@ -2305,4 +2305,13 @@ export function giveExploit(exploit) {
if(!this.exploits.includes(exploit)) { if(!this.exploits.includes(exploit)) {
this.exploits.push(exploit); this.exploits.push(exploit);
} }
}
export function getIntelligenceBonus(weight) {
// 15 => +1.4% when you initially acquire int
// 50 => +3.8% mid game
// 100 => +6.6% late game
// 250 => +13.4% realistic best possible
return 1+(weight*Math.pow(this.intelligence, 0.8)/600);
} }

@ -533,7 +533,7 @@ export class Sleeve extends Person {
this.shock = Math.min(100, this.shock + (0.0002 * cyclesUsed)); this.shock = Math.min(100, this.shock + (0.0002 * cyclesUsed));
break; break;
case SleeveTaskType.Sync: case SleeveTaskType.Sync:
this.sync = Math.min(100, this.sync + (0.0002 * cyclesUsed)); this.sync = Math.min(100, this.sync + (p.getIntelligenceBonus(0.5) * 0.0002 * cyclesUsed));
break; break;
default: default:
break; break;

@ -348,7 +348,7 @@ function prestigeSourceFile() {
document.getElementById("world-menu-header").click(); document.getElementById("world-menu-header").click();
// Gain int exp // Gain int exp
Player.gainIntelligenceExp(5); Player.gainIntelligenceExp(300);
resetPidCounter(); resetPidCounter();
} }

@ -298,9 +298,9 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal
if (!flume) { if (!flume) {
giveSourceFile(destroyedBitNode); giveSourceFile(destroyedBitNode);
} else { } else {
// If player used flume, subtract 5 int exp. The prestigeSourceFile() // If player used flume, subtract 300 int exp. The prestigeSourceFile()
// function below grants 5 int exp, so this allows sets net gain to 0 // function below grants 300 int exp, so this allows sets net gain to 0
Player.gainIntelligenceExp(-5); Player.gainIntelligenceExp(-300);
} }
redPillFlag = false; redPillFlag = false;
var container = document.getElementById("red-pill-content"); var container = document.getElementById("red-pill-content");

@ -196,13 +196,6 @@ const Engine = {
// Display objects // Display objects
// TODO-Refactor this into its own component // TODO-Refactor this into its own component
Display: { Display: {
// Progress bar
progress: null,
// Display for status text (such as "Saved" or "Loaded")
statusText: null,
hacking_skill: null,
// Main menu content // Main menu content
terminalContent: null, terminalContent: null,