This commit is contained in:
Olivier Gagnon
2021-11-05 17:12:52 -04:00
parent f8917473f8
commit 88b4a7d862
32 changed files with 97 additions and 79 deletions

View File

@@ -16,6 +16,8 @@ migrated (only for ns2):
not migrated (require manual changes sometimes): not migrated (require manual changes sometimes):
* getPlayer().hacking_skill renamed `hacking`
* same thing in sleeves
* getPurchasedServers won't let you query for ips instead of hostnames. * getPurchasedServers won't let you query for ips instead of hostnames.
* getStats is deprecated in favor getPlayer * getStats is deprecated in favor getPlayer
* getCharacterInformation is deprecated in favor getPlayer * getCharacterInformation is deprecated in favor getPlayer

View File

@@ -224,7 +224,7 @@ export class Action implements IAction {
let high = real + diff; let high = real + diff;
const city = inst.getCurrentCity(); const city = inst.getCurrentCity();
const r = city.pop / city.popEst; const r = city.pop / city.popEst;
console.log(`${est} ${real}`);
if (r < 1) low *= r; if (r < 1) low *= r;
else high *= r; else high *= r;
return [clamp(low), clamp(high)]; return [clamp(low), clamp(high)];

View File

@@ -1424,7 +1424,7 @@ export class Bladeburner implements IBladeburner {
case ActionTypes["Field Analysis"]: { case ActionTypes["Field Analysis"]: {
// Does not use stamina. Effectiveness depends on hacking, int, and cha // Does not use stamina. Effectiveness depends on hacking, int, and cha
let eff = let eff =
0.04 * Math.pow(player.hacking_skill, 0.3) + 0.04 * Math.pow(player.hacking, 0.3) +
0.04 * Math.pow(player.intelligence, 0.9) + 0.04 * Math.pow(player.intelligence, 0.9) +
0.02 * Math.pow(player.charisma, 0.3); 0.02 * Math.pow(player.charisma, 0.3);
eff *= player.bladeburner_analysis_mult; eff *= player.bladeburner_analysis_mult;

View File

@@ -110,7 +110,7 @@ export class Crime {
successRate(p: IPlayerOrSleeve): number { successRate(p: IPlayerOrSleeve): number {
let chance: number = let chance: number =
this.hacking_success_weight * p.hacking_skill + this.hacking_success_weight * p.hacking +
this.strength_success_weight * p.strength + this.strength_success_weight * p.strength +
this.defense_success_weight * p.defense + this.defense_success_weight * p.defense +
this.dexterity_success_weight * p.dexterity + this.dexterity_success_weight * p.dexterity +

View File

@@ -12,7 +12,7 @@ export interface ICrime {
} }
export interface IPerson { export interface IPerson {
hacking_skill: number; hacking: number;
strength: number; strength: number;
defense: number; defense: number;
dexterity: number; dexterity: number;
@@ -24,7 +24,7 @@ export interface IPerson {
export function calculateCrimeSuccessChance(crime: ICrime, person: IPerson): number { export function calculateCrimeSuccessChance(crime: ICrime, person: IPerson): number {
let chance: number = let chance: number =
crime.hacking_success_weight * person.hacking_skill + crime.hacking_success_weight * person.hacking +
crime.strength_success_weight * person.strength + crime.strength_success_weight * person.strength +
crime.defense_success_weight * person.defense + crime.defense_success_weight * person.defense +
crime.dexterity_success_weight * person.dexterity + crime.dexterity_success_weight * person.dexterity +

View File

@@ -9,7 +9,7 @@ import { Server } from "./Server/Server";
export function calculateHackingChance(server: Server, player: IPlayer): number { export function calculateHackingChance(server: Server, player: IPlayer): number {
const hackFactor = 1.75; const hackFactor = 1.75;
const difficultyMult = (100 - server.hackDifficulty) / 100; const difficultyMult = (100 - server.hackDifficulty) / 100;
const skillMult = hackFactor * player.hacking_skill; const skillMult = hackFactor * player.hacking;
const skillChance = (skillMult - server.requiredHackingSkill) / skillMult; const skillChance = (skillMult - server.requiredHackingSkill) / skillMult;
const chance = const chance =
skillChance * difficultyMult * player.hacking_chance_mult * calculateIntelligenceBonus(player.intelligence, 1); skillChance * difficultyMult * player.hacking_chance_mult * calculateIntelligenceBonus(player.intelligence, 1);
@@ -48,7 +48,7 @@ export function calculatePercentMoneyHacked(server: Server, player: IPlayer): nu
const balanceFactor = 240; const balanceFactor = 240;
const difficultyMult = (100 - server.hackDifficulty) / 100; const difficultyMult = (100 - server.hackDifficulty) / 100;
const skillMult = (player.hacking_skill - (server.requiredHackingSkill - 1)) / player.hacking_skill; const skillMult = (player.hacking - (server.requiredHackingSkill - 1)) / player.hacking;
const percentMoneyHacked = (difficultyMult * skillMult * player.hacking_money_mult) / balanceFactor; const percentMoneyHacked = (difficultyMult * skillMult * player.hacking_money_mult) / balanceFactor;
if (percentMoneyHacked < 0) { if (percentMoneyHacked < 0) {
return 0; return 0;
@@ -71,7 +71,7 @@ export function calculateHackingTime(server: Server, player: IPlayer): number {
const diffFactor = 2.5; const diffFactor = 2.5;
let skillFactor = diffFactor * difficultyMult + baseDiff; let skillFactor = diffFactor * difficultyMult + baseDiff;
// tslint:disable-next-line // tslint:disable-next-line
skillFactor /= player.hacking_skill + baseSkill; skillFactor /= player.hacking + baseSkill;
const hackTimeMultiplier = 5; const hackTimeMultiplier = 5;
const hackingTime = const hackingTime =

View File

@@ -36,7 +36,7 @@ export function netscriptCanHack(server: Server, p: IPlayer): IReturnStatus {
} }
const s = server; const s = server;
if (s.requiredHackingSkill > p.hacking_skill) { if (s.requiredHackingSkill > p.hacking) {
return { return {
res: false, res: false,
msg: `Cannot hack ${server.hostname} server because your hacking skill is not high enough`, msg: `Cannot hack ${server.hostname} server because your hacking skill is not high enough`,

View File

@@ -73,26 +73,26 @@ function checkForMessagesToSend(): void {
if (!redPillFlag) { if (!redPillFlag) {
sendMessage(redpill); sendMessage(redpill);
} }
} else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) { } else if (jumper0 && !jumper0.recvd && Player.hacking >= 25) {
sendMessage(jumper0); sendMessage(jumper0);
const flightName = Programs.Flight.name; const flightName = Programs.Flight.name;
const homeComp = Player.getHomeComputer(); const homeComp = Player.getHomeComputer();
if (!homeComp.programs.includes(flightName)) { if (!homeComp.programs.includes(flightName)) {
homeComp.programs.push(flightName); homeComp.programs.push(flightName);
} }
} else if (jumper1 && !jumper1.recvd && Player.hacking_skill >= 40) { } else if (jumper1 && !jumper1.recvd && Player.hacking >= 40) {
sendMessage(jumper1); sendMessage(jumper1);
} else if (cybersecTest && !cybersecTest.recvd && Player.hacking_skill >= 50) { } else if (cybersecTest && !cybersecTest.recvd && Player.hacking >= 50) {
sendMessage(cybersecTest); sendMessage(cybersecTest);
} else if (jumper2 && !jumper2.recvd && Player.hacking_skill >= 175) { } else if (jumper2 && !jumper2.recvd && Player.hacking >= 175) {
sendMessage(jumper2); sendMessage(jumper2);
} else if (nitesecTest && !nitesecTest.recvd && Player.hacking_skill >= 200) { } else if (nitesecTest && !nitesecTest.recvd && Player.hacking >= 200) {
sendMessage(nitesecTest); sendMessage(nitesecTest);
} else if (jumper3 && !jumper3.recvd && Player.hacking_skill >= 350) { } else if (jumper3 && !jumper3.recvd && Player.hacking >= 350) {
sendMessage(jumper3); sendMessage(jumper3);
} else if (jumper4 && !jumper4.recvd && Player.hacking_skill >= 490) { } else if (jumper4 && !jumper4.recvd && Player.hacking >= 490) {
sendMessage(jumper4); sendMessage(jumper4);
} else if (bitrunnersTest && !bitrunnersTest.recvd && Player.hacking_skill >= 500) { } else if (bitrunnersTest && !bitrunnersTest.recvd && Player.hacking >= 500) {
sendMessage(bitrunnersTest); sendMessage(bitrunnersTest);
} }
} }

View File

@@ -1229,8 +1229,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
getHackingLevel: function (): any { getHackingLevel: function (): any {
updateDynamicRam("getHackingLevel", getRamCost("getHackingLevel")); updateDynamicRam("getHackingLevel", getRamCost("getHackingLevel"));
Player.updateSkillLevels(); Player.updateSkillLevels();
workerScript.log("getHackingLevel", `returned ${Player.hacking_skill}`); workerScript.log("getHackingLevel", `returned ${Player.hacking}`);
return Player.hacking_skill; return Player.hacking;
}, },
getHackingMultipliers: function (): any { getHackingMultipliers: function (): any {
updateDynamicRam("getHackingMultipliers", getRamCost("getHackingMultipliers")); updateDynamicRam("getHackingMultipliers", getRamCost("getHackingMultipliers"));
@@ -2085,7 +2085,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
helper.updateDynamicRam("getPlayer", getRamCost("getPlayer")); helper.updateDynamicRam("getPlayer", getRamCost("getPlayer"));
const data = { const data = {
hacking_skill: Player.hacking_skill, hacking: Player.hacking,
hp: Player.hp, hp: Player.hp,
max_hp: Player.max_hp, max_hp: Player.max_hp,
strength: Player.strength, strength: Player.strength,

View File

@@ -630,7 +630,7 @@ export function NetscriptSingularity(
workerScript.log("getStats", `getStats is deprecated, please use getplayer`); workerScript.log("getStats", `getStats is deprecated, please use getplayer`);
return { return {
hacking: player.hacking_skill, hacking: player.hacking,
strength: player.strength, strength: player.strength,
defense: player.defense, defense: player.defense,
dexterity: player.dexterity, dexterity: player.dexterity,

View File

@@ -139,7 +139,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
getSleeveStats: function (asleeveNumber: any = 0): { getSleeveStats: function (asleeveNumber: any = 0): {
shock: number; shock: number;
sync: number; sync: number;
hacking_skill: number; hacking: number;
strength: number; strength: number;
defense: number; defense: number;
dexterity: number; dexterity: number;
@@ -155,7 +155,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
return { return {
shock: 100 - sl.shock, shock: 100 - sl.shock,
sync: sl.sync, sync: sl.sync,
hacking_skill: sl.hacking_skill, hacking: sl.hacking,
strength: sl.strength, strength: sl.strength,
defense: sl.defense, defense: sl.defense,
dexterity: sl.dexterity, dexterity: sl.dexterity,

View File

@@ -73,7 +73,7 @@ export interface IPlayer {
totalPlaytime: number; totalPlaytime: number;
// Stats // Stats
hacking_skill: number; hacking: number;
strength: number; strength: number;
defense: number; defense: number;
dexterity: number; dexterity: number;

View File

@@ -3,7 +3,7 @@
export interface IPlayerOrSleeve { export interface IPlayerOrSleeve {
// Stats // Stats
hacking_skill: number; hacking: number;
strength: number; strength: number;
defense: number; defense: number;
dexterity: number; dexterity: number;

View File

@@ -35,7 +35,7 @@ export abstract class Person {
/** /**
* Stats * Stats
*/ */
hacking_skill = 1; hacking = 1;
strength = 1; strength = 1;
defense = 1; defense = 1;
dexterity = 1; dexterity = 1;
@@ -136,7 +136,7 @@ export abstract class Person {
getFactionFieldWorkRepGain(): number { getFactionFieldWorkRepGain(): number {
const t = const t =
(0.9 * (0.9 *
(this.hacking_skill / CONSTANTS.MaxSkillLevel + (this.hacking / CONSTANTS.MaxSkillLevel +
this.strength / CONSTANTS.MaxSkillLevel + this.strength / CONSTANTS.MaxSkillLevel +
this.defense / CONSTANTS.MaxSkillLevel + this.defense / CONSTANTS.MaxSkillLevel +
this.dexterity / CONSTANTS.MaxSkillLevel + this.dexterity / CONSTANTS.MaxSkillLevel +
@@ -151,7 +151,7 @@ export abstract class Person {
* when doing Hacking Work for a faction * when doing Hacking Work for a faction
*/ */
getFactionHackingWorkRepGain(): number { getFactionHackingWorkRepGain(): number {
return (this.hacking_skill / CONSTANTS.MaxSkillLevel) * this.faction_rep_mult; return (this.hacking / CONSTANTS.MaxSkillLevel) * this.faction_rep_mult;
} }
/** /**
@@ -161,7 +161,7 @@ export abstract class Person {
getFactionSecurityWorkRepGain(): number { getFactionSecurityWorkRepGain(): number {
const t = const t =
(0.9 * (0.9 *
(this.hacking_skill / CONSTANTS.MaxSkillLevel + (this.hacking / CONSTANTS.MaxSkillLevel +
this.strength / CONSTANTS.MaxSkillLevel + this.strength / CONSTANTS.MaxSkillLevel +
this.defense / CONSTANTS.MaxSkillLevel + this.defense / CONSTANTS.MaxSkillLevel +
this.dexterity / CONSTANTS.MaxSkillLevel + this.dexterity / CONSTANTS.MaxSkillLevel +
@@ -201,7 +201,7 @@ export abstract class Person {
* Update all stat levels * Update all stat levels
*/ */
updateStatLevels(): void { updateStatLevels(): void {
this.hacking_skill = Math.max( this.hacking = Math.max(
1, 1,
Math.floor(this.calculateStat(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier)), Math.floor(this.calculateStat(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier)),
); );

View File

@@ -80,7 +80,7 @@ export class PlayerObject implements IPlayer {
totalPlaytime: number; totalPlaytime: number;
// Stats // Stats
hacking_skill: number; hacking: number;
strength: number; strength: number;
defense: number; defense: number;
dexterity: number; dexterity: number;
@@ -287,7 +287,7 @@ export class PlayerObject implements IPlayer {
constructor() { constructor() {
//Skills and stats //Skills and stats
this.hacking_skill = 1; this.hacking = 1;
//Combat stats //Combat stats
this.hp = 10; this.hp = 10;

View File

@@ -86,7 +86,7 @@ export function prestigeAugmentation(this: PlayerObject): void {
this.karma = 0; this.karma = 0;
//Reset stats //Reset stats
this.hacking_skill = 1; this.hacking = 1;
this.strength = 1; this.strength = 1;
this.defense = 1; this.defense = 1;
@@ -228,7 +228,7 @@ export function calculateSkill(this: IPlayer, exp: number, mult = 1): number {
} }
export function updateSkillLevels(this: IPlayer): void { export function updateSkillLevels(this: IPlayer): void {
this.hacking_skill = Math.max( this.hacking = Math.max(
1, 1,
Math.floor(this.calculateSkill(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier)), Math.floor(this.calculateSkill(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier)),
); );
@@ -378,7 +378,7 @@ export function gainHackingExp(this: IPlayer, exp: number): void {
this.hacking_exp = 0; this.hacking_exp = 0;
} }
this.hacking_skill = calculateSkillF(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier); this.hacking = calculateSkillF(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier);
} }
export function gainStrengthExp(this: IPlayer, exp: number): void { export function gainStrengthExp(this: IPlayer, exp: number): void {
@@ -464,7 +464,7 @@ export function gainIntelligenceExp(this: IPlayer, exp: number): void {
export function queryStatFromString(this: IPlayer, str: string): number { export function queryStatFromString(this: IPlayer, str: string): number {
const tempStr = str.toLowerCase(); const tempStr = str.toLowerCase();
if (tempStr.includes("hack")) { if (tempStr.includes("hack")) {
return this.hacking_skill; return this.hacking;
} }
if (tempStr.includes("str")) { if (tempStr.includes("str")) {
return this.strength; return this.strength;
@@ -856,7 +856,7 @@ export function startFactionHackWork(this: IPlayer, router: IRouter, faction: Fa
this.workHackExpGainRate = 0.15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain; this.workHackExpGainRate = 0.15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain;
this.workRepGainRate = this.workRepGainRate =
((this.hacking_skill + this.intelligence) / CONSTANTS.MaxSkillLevel) * ((this.hacking + this.intelligence) / CONSTANTS.MaxSkillLevel) *
this.faction_rep_mult * this.faction_rep_mult *
this.getIntelligenceBonus(0.5); this.getIntelligenceBonus(0.5);
@@ -1180,7 +1180,7 @@ export function getWorkRepGain(this: IPlayer): number {
} }
let jobPerformance = companyPosition.calculateJobPerformance( let jobPerformance = companyPosition.calculateJobPerformance(
this.hacking_skill, this.hacking,
this.strength, this.strength,
this.defense, this.defense,
this.dexterity, this.dexterity,
@@ -1200,7 +1200,7 @@ export function getWorkRepGain(this: IPlayer): number {
} }
// export function getFactionSecurityWorkRepGain(this: IPlayer) { // export function getFactionSecurityWorkRepGain(this: IPlayer) {
// var t = 0.9 * (this.hacking_skill / CONSTANTS.MaxSkillLevel + // var t = 0.9 * (this.hacking / CONSTANTS.MaxSkillLevel +
// this.strength / CONSTANTS.MaxSkillLevel + // this.strength / CONSTANTS.MaxSkillLevel +
// this.defense / CONSTANTS.MaxSkillLevel + // this.defense / CONSTANTS.MaxSkillLevel +
// this.dexterity / CONSTANTS.MaxSkillLevel + // this.dexterity / CONSTANTS.MaxSkillLevel +
@@ -1209,7 +1209,7 @@ export function getWorkRepGain(this: IPlayer): number {
// } // }
// export function getFactionFieldWorkRepGain(this: IPlayer) { // export function getFactionFieldWorkRepGain(this: IPlayer) {
// var t = 0.9 * (this.hacking_skill / CONSTANTS.MaxSkillLevel + // var t = 0.9 * (this.hacking / CONSTANTS.MaxSkillLevel +
// this.strength / CONSTANTS.MaxSkillLevel + // this.strength / CONSTANTS.MaxSkillLevel +
// this.defense / CONSTANTS.MaxSkillLevel + // this.defense / CONSTANTS.MaxSkillLevel +
// this.dexterity / CONSTANTS.MaxSkillLevel + // this.dexterity / CONSTANTS.MaxSkillLevel +
@@ -1234,7 +1234,7 @@ export function startCreateProgramWork(
//Time needed to complete work affected by hacking skill (linearly based on //Time needed to complete work affected by hacking skill (linearly based on
//ratio of (your skill - required level) to MAX skill) //ratio of (your skill - required level) to MAX skill)
//var timeMultiplier = (CONSTANTS.MaxSkillLevel - (this.hacking_skill - reqLevel)) / CONSTANTS.MaxSkillLevel; //var timeMultiplier = (CONSTANTS.MaxSkillLevel - (this.hacking - reqLevel)) / CONSTANTS.MaxSkillLevel;
//if (timeMultiplier > 1) {timeMultiplier = 1;} //if (timeMultiplier > 1) {timeMultiplier = 1;}
//if (timeMultiplier < 0.01) {timeMultiplier = 0.01;} //if (timeMultiplier < 0.01) {timeMultiplier = 0.01;}
this.createProgramReqLvl = reqLevel; this.createProgramReqLvl = reqLevel;
@@ -1264,7 +1264,7 @@ export function startCreateProgramWork(
export function createProgramWork(this: IPlayer, numCycles: number): boolean { export function createProgramWork(this: IPlayer, numCycles: number): boolean {
//Higher hacking skill will allow you to create programs faster //Higher hacking skill will allow you to create programs faster
const reqLvl = this.createProgramReqLvl; const reqLvl = this.createProgramReqLvl;
let skillMult = (this.hacking_skill / reqLvl) * this.getIntelligenceBonus(3); //This should always be greater than 1; let skillMult = (this.hacking / 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"
@@ -1293,7 +1293,7 @@ export function finishCreateProgramWork(this: IPlayer, cancelled: boolean): stri
} }
if (!cancelled) { if (!cancelled) {
this.gainIntelligenceExp(CONSTANTS.IntelligenceProgramBaseExpGain * this.timeWorked/1000); this.gainIntelligenceExp((CONSTANTS.IntelligenceProgramBaseExpGain * this.timeWorked) / 1000);
} }
this.isWorking = false; this.isWorking = false;
@@ -1977,7 +1977,7 @@ export function isQualified(this: IPlayer, company: Company, position: CompanyPo
const reqCharisma = position.requiredCharisma > 0 ? position.requiredCharisma + offset : 0; const reqCharisma = position.requiredCharisma > 0 ? position.requiredCharisma + offset : 0;
if ( if (
this.hacking_skill >= reqHacking && this.hacking >= reqHacking &&
this.strength >= reqStrength && this.strength >= reqStrength &&
this.defense >= reqDefense && this.defense >= reqDefense &&
this.dexterity >= reqDexterity && this.dexterity >= reqDexterity &&
@@ -2035,6 +2035,7 @@ export function reapplyAllSourceFiles(this: IPlayer): void {
applySourceFile(this.sourceFiles[i]); applySourceFile(this.sourceFiles[i]);
} }
applyExploit(); applyExploit();
this.updateSkillLevels();
} }
/*************** Check for Faction Invitations *************/ /*************** Check for Faction Invitations *************/
@@ -2075,7 +2076,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!illuminatiFac.alreadyInvited && !illuminatiFac.alreadyInvited &&
numAugmentations >= 30 && numAugmentations >= 30 &&
this.money.gte(150000000000) && this.money.gte(150000000000) &&
this.hacking_skill >= 1500 && this.hacking >= 1500 &&
this.strength >= 1200 && this.strength >= 1200 &&
this.defense >= 1200 && this.defense >= 1200 &&
this.dexterity >= 1200 && this.dexterity >= 1200 &&
@@ -2092,7 +2093,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!daedalusFac.alreadyInvited && !daedalusFac.alreadyInvited &&
numAugmentations >= Math.round(30 * BitNodeMultipliers.DaedalusAugsRequirement) && numAugmentations >= Math.round(30 * BitNodeMultipliers.DaedalusAugsRequirement) &&
this.money.gte(100000000000) && this.money.gte(100000000000) &&
(this.hacking_skill >= 2500 || (this.hacking >= 2500 ||
(this.strength >= 1500 && this.defense >= 1500 && this.dexterity >= 1500 && this.agility >= 1500)) (this.strength >= 1500 && this.defense >= 1500 && this.dexterity >= 1500 && this.agility >= 1500))
) { ) {
invitedFactions.push(daedalusFac); invitedFactions.push(daedalusFac);
@@ -2106,7 +2107,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!covenantFac.alreadyInvited && !covenantFac.alreadyInvited &&
numAugmentations >= 20 && numAugmentations >= 20 &&
this.money.gte(75000000000) && this.money.gte(75000000000) &&
this.hacking_skill >= 850 && this.hacking >= 850 &&
this.strength >= 850 && this.strength >= 850 &&
this.defense >= 850 && this.defense >= 850 &&
this.dexterity >= 850 && this.dexterity >= 850 &&
@@ -2356,7 +2357,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!speakersforthedeadFac.isBanned && !speakersforthedeadFac.isBanned &&
!speakersforthedeadFac.isMember && !speakersforthedeadFac.isMember &&
!speakersforthedeadFac.alreadyInvited && !speakersforthedeadFac.alreadyInvited &&
this.hacking_skill >= 100 && this.hacking >= 100 &&
this.strength >= 300 && this.strength >= 300 &&
this.defense >= 300 && this.defense >= 300 &&
this.dexterity >= 300 && this.dexterity >= 300 &&
@@ -2375,7 +2376,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!thedarkarmyFac.isBanned && !thedarkarmyFac.isBanned &&
!thedarkarmyFac.isMember && !thedarkarmyFac.isMember &&
!thedarkarmyFac.alreadyInvited && !thedarkarmyFac.alreadyInvited &&
this.hacking_skill >= 300 && this.hacking >= 300 &&
this.strength >= 300 && this.strength >= 300 &&
this.defense >= 300 && this.defense >= 300 &&
this.dexterity >= 300 && this.dexterity >= 300 &&
@@ -2395,7 +2396,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!thesyndicateFac.isBanned && !thesyndicateFac.isBanned &&
!thesyndicateFac.isMember && !thesyndicateFac.isMember &&
!thesyndicateFac.alreadyInvited && !thesyndicateFac.alreadyInvited &&
this.hacking_skill >= 200 && this.hacking >= 200 &&
this.strength >= 200 && this.strength >= 200 &&
this.defense >= 200 && this.defense >= 200 &&
this.dexterity >= 200 && this.dexterity >= 200 &&
@@ -2480,7 +2481,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!netburnersFac.isBanned && !netburnersFac.isBanned &&
!netburnersFac.isMember && !netburnersFac.isMember &&
!netburnersFac.alreadyInvited && !netburnersFac.alreadyInvited &&
this.hacking_skill >= 80 && this.hacking >= 80 &&
totalHacknetRam >= 8 && totalHacknetRam >= 8 &&
totalHacknetCores >= 4 && totalHacknetCores >= 4 &&
totalHacknetLevels >= 100 totalHacknetLevels >= 100
@@ -2495,7 +2496,7 @@ export function checkForFactionInvitations(this: IPlayer): Faction[] {
!tiandihuiFac.isMember && !tiandihuiFac.isMember &&
!tiandihuiFac.alreadyInvited && !tiandihuiFac.alreadyInvited &&
this.money.gte(1000000) && this.money.gte(1000000) &&
this.hacking_skill >= 50 && this.hacking >= 50 &&
(this.city == CityName.Chongqing || this.city == CityName.NewTokyo || this.city == CityName.Ishima) (this.city == CityName.Chongqing || this.city == CityName.NewTokyo || this.city == CityName.Ishima)
) { ) {
invitedFactions.push(tiandihuiFac); invitedFactions.push(tiandihuiFac);

View File

@@ -123,7 +123,7 @@ export function ResleeveElem(props: IProps): React.ReactElement {
<Grid container> <Grid container>
<Grid item xs={3}> <Grid item xs={3}>
<Typography> <Typography>
Hacking: {numeralWrapper.formatSkill(props.resleeve.hacking_skill)} ( Hacking: {numeralWrapper.formatSkill(props.resleeve.hacking)} (
{numeralWrapper.formatExp(props.resleeve.hacking_exp)} exp) {numeralWrapper.formatExp(props.resleeve.hacking_exp)} exp)
<br /> <br />
Strength: {numeralWrapper.formatSkill(props.resleeve.strength)} ( Strength: {numeralWrapper.formatSkill(props.resleeve.strength)} (

View File

@@ -58,7 +58,7 @@ const SortFunctions: {
TotalNumAugmentations: (a: Resleeve, b: Resleeve) => number; TotalNumAugmentations: (a: Resleeve, b: Resleeve) => number;
} = { } = {
Cost: (a: Resleeve, b: Resleeve): number => a.getCost() - b.getCost(), Cost: (a: Resleeve, b: Resleeve): number => a.getCost() - b.getCost(),
Hacking: (a: Resleeve, b: Resleeve): number => a.hacking_skill - b.hacking_skill, Hacking: (a: Resleeve, b: Resleeve): number => a.hacking - b.hacking,
Strength: (a: Resleeve, b: Resleeve): number => a.strength - b.strength, Strength: (a: Resleeve, b: Resleeve): number => a.strength - b.strength,
Defense: (a: Resleeve, b: Resleeve): number => a.defense - b.defense, Defense: (a: Resleeve, b: Resleeve): number => a.defense - b.defense,
Dexterity: (a: Resleeve, b: Resleeve): number => a.dexterity - b.dexterity, Dexterity: (a: Resleeve, b: Resleeve): number => a.dexterity - b.dexterity,
@@ -68,8 +68,8 @@ const SortFunctions: {
getAverage(a.strength, a.defense, a.dexterity, a.agility) - getAverage(a.strength, a.defense, a.dexterity, a.agility) -
getAverage(b.strength, b.defense, b.dexterity, b.agility), getAverage(b.strength, b.defense, b.dexterity, b.agility),
AverageAllStats: (a: Resleeve, b: Resleeve): number => AverageAllStats: (a: Resleeve, b: Resleeve): number =>
getAverage(a.hacking_skill, a.strength, a.defense, a.dexterity, a.agility, a.charisma) - getAverage(a.hacking, a.strength, a.defense, a.dexterity, a.agility, a.charisma) -
getAverage(b.hacking_skill, b.strength, b.defense, b.dexterity, b.agility, b.charisma), getAverage(b.hacking, b.strength, b.defense, b.dexterity, b.agility, b.charisma),
TotalNumAugmentations: (a: Resleeve, b: Resleeve): number => a.augmentations.length - b.augmentations.length, TotalNumAugmentations: (a: Resleeve, b: Resleeve): number => a.augmentations.length - b.augmentations.length,
}; };

View File

@@ -397,7 +397,7 @@ export class Sleeve extends Person {
} }
const jobPerformance: number = companyPosition.calculateJobPerformance( const jobPerformance: number = companyPosition.calculateJobPerformance(
this.hacking_skill, this.hacking,
this.strength, this.strength,
this.defense, this.defense,
this.dexterity, this.dexterity,

View File

@@ -17,7 +17,7 @@ export function MoreStatsModal(props: IProps): React.ReactElement {
rows={[ rows={[
[ [
<>Hacking:&nbsp;</>, <>Hacking:&nbsp;</>,
props.sleeve.hacking_skill, props.sleeve.hacking,
<>&nbsp;({numeralWrapper.formatExp(props.sleeve.hacking_exp)} exp)</>, <>&nbsp;({numeralWrapper.formatExp(props.sleeve.hacking_exp)} exp)</>,
], ],
[ [

View File

@@ -17,7 +17,7 @@ export function StatsElement(props: IProps): React.ReactElement {
</>, </>,
], ],
["City: ", <>{props.sleeve.city}</>], ["City: ", <>{props.sleeve.city}</>],
["Hacking: ", <>{numeralWrapper.formatSkill(props.sleeve.hacking_skill)}</>], ["Hacking: ", <>{numeralWrapper.formatSkill(props.sleeve.hacking)}</>],
["Strength: ", <>{numeralWrapper.formatSkill(props.sleeve.strength)}</>], ["Strength: ", <>{numeralWrapper.formatSkill(props.sleeve.strength)}</>],
["Defense: ", <>{numeralWrapper.formatSkill(props.sleeve.defense)}</>], ["Defense: ", <>{numeralWrapper.formatSkill(props.sleeve.defense)}</>],
["Dexterity: ", <>{numeralWrapper.formatSkill(props.sleeve.dexterity)}</>], ["Dexterity: ", <>{numeralWrapper.formatSkill(props.sleeve.dexterity)}</>],

View File

@@ -13,7 +13,7 @@ function mult(f: Faction): number {
export function getHackingWorkRepGain(p: IPlayer, f: Faction): number { export function getHackingWorkRepGain(p: IPlayer, f: Faction): number {
return ( return (
((p.hacking_skill + p.intelligence / 3) / CONSTANTS.MaxSkillLevel) * ((p.hacking + p.intelligence / 3) / CONSTANTS.MaxSkillLevel) *
p.faction_rep_mult * p.faction_rep_mult *
p.getIntelligenceBonus(1) * p.getIntelligenceBonus(1) *
mult(f) mult(f)
@@ -23,7 +23,7 @@ export function getHackingWorkRepGain(p: IPlayer, f: Faction): number {
export function getFactionSecurityWorkRepGain(p: IPlayer, f: Faction): number { export function getFactionSecurityWorkRepGain(p: IPlayer, f: Faction): number {
const t = const t =
(0.9 * (0.9 *
(p.hacking_skill / CONSTANTS.MaxSkillLevel + (p.hacking / CONSTANTS.MaxSkillLevel +
p.strength / CONSTANTS.MaxSkillLevel + p.strength / CONSTANTS.MaxSkillLevel +
p.defense / CONSTANTS.MaxSkillLevel + p.defense / CONSTANTS.MaxSkillLevel +
p.dexterity / CONSTANTS.MaxSkillLevel + p.dexterity / CONSTANTS.MaxSkillLevel +
@@ -36,7 +36,7 @@ export function getFactionSecurityWorkRepGain(p: IPlayer, f: Faction): number {
export function getFactionFieldWorkRepGain(p: IPlayer, f: Faction): number { export function getFactionFieldWorkRepGain(p: IPlayer, f: Faction): number {
const t = const t =
(0.9 * (0.9 *
(p.hacking_skill / CONSTANTS.MaxSkillLevel + (p.hacking / CONSTANTS.MaxSkillLevel +
p.strength / CONSTANTS.MaxSkillLevel + p.strength / CONSTANTS.MaxSkillLevel +
p.defense / CONSTANTS.MaxSkillLevel + p.defense / CONSTANTS.MaxSkillLevel +
p.dexterity / CONSTANTS.MaxSkillLevel + p.dexterity / CONSTANTS.MaxSkillLevel +

View File

@@ -14,13 +14,13 @@ import { calculateHackingTime, calculateGrowTime, calculateWeakenTime } from "..
function requireHackingLevel(lvl: number) { function requireHackingLevel(lvl: number) {
return function (p: IPlayer) { return function (p: IPlayer) {
return p.hacking_skill >= lvl; return p.hacking >= lvl;
}; };
} }
function bitFlumeRequirements() { function bitFlumeRequirements() {
return function (p: IPlayer) { return function (p: IPlayer) {
return p.sourceFiles.length > 0 && p.hacking_skill >= 1; return p.sourceFiles.length > 0 && p.hacking >= 1;
}; };
} }
@@ -306,12 +306,11 @@ export const programsMetadata: IProgramCreationParams[] = [
create: null, create: null,
run: (router: IRouter, terminal: ITerminal, player: IPlayer): void => { run: (router: IRouter, terminal: ITerminal, player: IPlayer): void => {
const numAugReq = Math.round(BitNodeMultipliers.DaedalusAugsRequirement * 30); const numAugReq = Math.round(BitNodeMultipliers.DaedalusAugsRequirement * 30);
const fulfilled = const fulfilled = player.augmentations.length >= numAugReq && player.money.gt(1e11) && player.hacking >= 2500;
player.augmentations.length >= numAugReq && player.money.gt(1e11) && player.hacking_skill >= 2500;
if (!fulfilled) { if (!fulfilled) {
terminal.print(`Augmentations: ${player.augmentations.length} / ${numAugReq}`); terminal.print(`Augmentations: ${player.augmentations.length} / ${numAugReq}`);
terminal.print(`Money: ${numeralWrapper.formatMoney(player.money.toNumber())} / $100b`); terminal.print(`Money: ${numeralWrapper.formatMoney(player.money.toNumber())} / $100b`);
terminal.print(`Hacking skill: ${player.hacking_skill} / 2500`); terminal.print(`Hacking skill: ${player.hacking} / 2500`);
return; return;
} }

View File

@@ -293,7 +293,6 @@ function loadGame(saveString: string): boolean {
if (saveObj.hasOwnProperty("VersionSave")) { if (saveObj.hasOwnProperty("VersionSave")) {
try { try {
const ver = JSON.parse(saveObj.VersionSave, Reviver); const ver = JSON.parse(saveObj.VersionSave, Reviver);
console.log(ver);
evaluateVersionCompatibility(ver); evaluateVersionCompatibility(ver);
if (window.location.href.toLowerCase().includes("bitburner-beta")) { if (window.location.href.toLowerCase().includes("bitburner-beta")) {

View File

@@ -2,7 +2,7 @@
* @public * @public
*/ */
interface Player { interface Player {
hacking_skill: number; hacking: number;
hp: number; hp: number;
max_hp: number; max_hp: number;
strength: number; strength: number;
@@ -815,7 +815,7 @@ export interface SleeveSkills {
/** current sync of the sleeve [0-100] */ /** current sync of the sleeve [0-100] */
sync: number; sync: number;
/** current hacking skill of the sleeve */ /** current hacking skill of the sleeve */
hacking_skill: number; hacking: number;
/** current strength of the sleeve */ /** current strength of the sleeve */
strength: number; strength: number;
/** current defense of the sleeve */ /** current defense of the sleeve */

View File

@@ -29,7 +29,7 @@ export function backdoor(
); );
} else if (!normalServer.hasAdminRights) { } else if (!normalServer.hasAdminRights) {
terminal.error("You do not have admin rights for this machine! Cannot backdoor"); terminal.error("You do not have admin rights for this machine! Cannot backdoor");
} else if (normalServer.requiredHackingSkill > player.hacking_skill) { } else if (normalServer.requiredHackingSkill > player.hacking) {
terminal.error( terminal.error(
"Your hacking skill is not high enough to use backdoor on this machine. Try analyzing the machine to determine the required hacking skill", "Your hacking skill is not high enough to use backdoor on this machine. Try analyzing the machine to determine the required hacking skill",
); );

View File

@@ -34,7 +34,7 @@ export function grow(
terminal.error("You do not have admin rights for this machine! Cannot grow"); terminal.error("You do not have admin rights for this machine! Cannot grow");
return; return;
} }
if (normalServer.requiredHackingSkill > player.hacking_skill) { if (normalServer.requiredHackingSkill > player.hacking) {
terminal.error( terminal.error(
"Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill", "Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill",
); );

View File

@@ -34,7 +34,7 @@ export function hack(
terminal.error("You do not have admin rights for this machine! Cannot hack"); terminal.error("You do not have admin rights for this machine! Cannot hack");
return; return;
} }
if (normalServer.requiredHackingSkill > player.hacking_skill) { if (normalServer.requiredHackingSkill > player.hacking) {
terminal.error( terminal.error(
"Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill", "Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill",
); );

View File

@@ -34,7 +34,7 @@ export function weaken(
terminal.error("You do not have admin rights for this machine! Cannot weaken"); terminal.error("You do not have admin rights for this machine! Cannot weaken");
return; return;
} }
if (normalServer.requiredHackingSkill > player.hacking_skill) { if (normalServer.requiredHackingSkill > player.hacking) {
terminal.error( terminal.error(
"Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill", "Your hacking skill is not high enough to attempt hacking this machine. Try analyzing the machine to determine the required hacking skill",
); );

View File

@@ -303,7 +303,7 @@ export function CharacterStats(): React.ReactElement {
<Typography noWrap>Hacking:&nbsp;</Typography> <Typography noWrap>Hacking:&nbsp;</Typography>
</TableCell> </TableCell>
<TableCell align="right"> <TableCell align="right">
<Typography noWrap>{numeralWrapper.formatSkill(player.hacking_skill)}&nbsp;</Typography> <Typography noWrap>{numeralWrapper.formatSkill(player.hacking)}&nbsp;</Typography>
</TableCell> </TableCell>
<TableCell align="right"> <TableCell align="right">
<Typography noWrap>({numeralWrapper.formatExp(player.hacking_exp)} exp)</Typography> <Typography noWrap>({numeralWrapper.formatExp(player.hacking_exp)} exp)</Typography>

View File

@@ -192,9 +192,7 @@ export function CharacterOverview({ save, killScripts }: IProps): React.ReactEle
<Typography classes={{ root: classes.hack }}>Hack&nbsp;</Typography> <Typography classes={{ root: classes.hack }}>Hack&nbsp;</Typography>
</TableCell> </TableCell>
<TableCell align="right" classes={{ root: classes.cell }}> <TableCell align="right" classes={{ root: classes.cell }}>
<Typography classes={{ root: classes.hack }}> <Typography classes={{ root: classes.hack }}>{numeralWrapper.formatSkill(player.hacking)}</Typography>
{numeralWrapper.formatSkill(player.hacking_skill)}
</Typography>
</TableCell> </TableCell>
<TableCell align="right" classes={{ root: classes.cell }}> <TableCell align="right" classes={{ root: classes.cell }}>
<Typography id="overview-hack-hook" classes={{ root: classes.hack }}> <Typography id="overview-hack-hook" classes={{ root: classes.hack }}>

View File

@@ -63,6 +63,14 @@ export function ThemeEditorModal(props: IProps): React.ReactElement {
...Settings.theme, ...Settings.theme,
}); });
function resetTheme(): void {
setCustomTheme({
...defaultSettings.theme,
});
Object.assign(Settings.theme, defaultSettings.theme);
ThemeEvents.emit();
}
function onThemeChange(event: React.ChangeEvent<HTMLInputElement>): void { function onThemeChange(event: React.ChangeEvent<HTMLInputElement>): void {
try { try {
const importedTheme = JSON.parse(event.target.value); const importedTheme = JSON.parse(event.target.value);
@@ -299,7 +307,18 @@ export function ThemeEditorModal(props: IProps): React.ReactElement {
/> />
<br /> <br />
<br /> <br />
<TextField label={"import / export theme"} value={JSON.stringify(customTheme)} onChange={onThemeChange} /> <TextField
label={"import / export theme"}
value={JSON.stringify(customTheme)}
onChange={onThemeChange}
InputProps={{
endAdornment: (
<IconButton onClick={resetTheme} size="large">
<ReplyIcon />
</IconButton>
),
}}
/>
</Modal> </Modal>
); );
} }