mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-17 14:59:16 +02:00
BUGFIX: ns.bladeburner.getActionRepGain returns wrong value (#2186)
This commit is contained in:
@@ -29,7 +29,6 @@ import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
|||||||
import { getRandomIntInclusive } from "../utils/helpers/getRandomIntInclusive";
|
import { getRandomIntInclusive } from "../utils/helpers/getRandomIntInclusive";
|
||||||
import { BladeburnerConstants } from "./data/Constants";
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
import { formatExp, formatMoney, formatPercent, formatBigNumber, formatStamina } from "../ui/formatNumber";
|
import { formatExp, formatMoney, formatPercent, formatBigNumber, formatStamina } from "../ui/formatNumber";
|
||||||
import { currentNodeMults } from "../BitNode/BitNodeMultipliers";
|
|
||||||
import { addOffset } from "../utils/helpers/addOffset";
|
import { addOffset } from "../utils/helpers/addOffset";
|
||||||
import { Factions } from "../Faction/Factions";
|
import { Factions } from "../Faction/Factions";
|
||||||
import { calculateHospitalizationCost } from "../Hospital/Hospital";
|
import { calculateHospitalizationCost } from "../Hospital/Hospital";
|
||||||
@@ -56,6 +55,7 @@ import { assertObject } from "../utils/TypeAssertion";
|
|||||||
import { throwIfReachable } from "../utils/helpers/throwIfReachable";
|
import { throwIfReachable } from "../utils/helpers/throwIfReachable";
|
||||||
import { loadActionIdentifier } from "./utils/loadActionIdentifier";
|
import { loadActionIdentifier } from "./utils/loadActionIdentifier";
|
||||||
import { pluralize } from "../utils/I18nUtils";
|
import { pluralize } from "../utils/I18nUtils";
|
||||||
|
import { calculateActionRankGain, calculateActionReputationGain } from "./Formulas";
|
||||||
|
|
||||||
export const BladeburnerPromise: PromisePair<number> = { promise: null, resolve: null };
|
export const BladeburnerPromise: PromisePair<number> = { promise: null, resolve: null };
|
||||||
|
|
||||||
@@ -912,7 +912,7 @@ export class Bladeburner implements OperationTeam {
|
|||||||
action.setMaxLevel(BladeburnerConstants.ContractSuccessesPerLevel);
|
action.setMaxLevel(BladeburnerConstants.ContractSuccessesPerLevel);
|
||||||
}
|
}
|
||||||
if (action.rankGain) {
|
if (action.rankGain) {
|
||||||
const gain = addOffset(action.rankGain * rewardMultiplier * currentNodeMults.BladeburnerRank, 10);
|
const gain = addOffset(calculateActionRankGain(action), 10);
|
||||||
this.changeRank(person, gain);
|
this.changeRank(person, gain);
|
||||||
if (isOperation && this.logging.ops) {
|
if (isOperation && this.logging.ops) {
|
||||||
this.log(
|
this.log(
|
||||||
@@ -994,7 +994,7 @@ export class Bladeburner implements OperationTeam {
|
|||||||
this.numBlackOpsComplete++;
|
this.numBlackOpsComplete++;
|
||||||
let rankGain = 0;
|
let rankGain = 0;
|
||||||
if (action.rankGain) {
|
if (action.rankGain) {
|
||||||
rankGain = addOffset(action.rankGain * currentNodeMults.BladeburnerRank, 10);
|
rankGain = addOffset(calculateActionRankGain(action), 10);
|
||||||
this.changeRank(person, rankGain);
|
this.changeRank(person, rankGain);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1097,7 +1097,7 @@ export class Bladeburner implements OperationTeam {
|
|||||||
}
|
}
|
||||||
const hackingExpGain = 20 * person.mults.hacking_exp;
|
const hackingExpGain = 20 * person.mults.hacking_exp;
|
||||||
const charismaExpGain = 20 * person.mults.charisma_exp;
|
const charismaExpGain = 20 * person.mults.charisma_exp;
|
||||||
const rankGain = 0.1 * currentNodeMults.BladeburnerRank;
|
const rankGain = calculateActionRankGain(action);
|
||||||
retValue.hackExp = hackingExpGain;
|
retValue.hackExp = hackingExpGain;
|
||||||
retValue.chaExp = charismaExpGain;
|
retValue.chaExp = charismaExpGain;
|
||||||
retValue.intExp = BladeburnerConstants.BaseIntGain;
|
retValue.intExp = BladeburnerConstants.BaseIntGain;
|
||||||
@@ -1232,12 +1232,9 @@ export class Bladeburner implements OperationTeam {
|
|||||||
}
|
}
|
||||||
this.maxRank = Math.max(this.rank, this.maxRank);
|
this.maxRank = Math.max(this.rank, this.maxRank);
|
||||||
|
|
||||||
const bladeburnersFactionName = FactionName.Bladeburners;
|
const bladeburnerFaction = Factions[FactionName.Bladeburners];
|
||||||
const bladeburnerFac = Factions[bladeburnersFactionName];
|
if (bladeburnerFaction.isMember) {
|
||||||
if (bladeburnerFac.isMember) {
|
bladeburnerFaction.playerReputation += calculateActionReputationGain(person, change);
|
||||||
const favorBonus = 1 + bladeburnerFac.favor / 100;
|
|
||||||
bladeburnerFac.playerReputation +=
|
|
||||||
BladeburnerConstants.RankToFactionRepFactor * change * person.mults.faction_rep * favorBonus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gain skill points
|
// Gain skill points
|
||||||
|
|||||||
33
src/Bladeburner/Formulas.ts
Normal file
33
src/Bladeburner/Formulas.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { currentNodeMults } from "../BitNode/BitNodeMultipliers";
|
||||||
|
import { FactionName } from "../Enums";
|
||||||
|
import { Factions } from "../Faction/Factions";
|
||||||
|
import type { Person } from "../PersonObjects/Person";
|
||||||
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
|
import { BladeburnerActionType, BladeburnerGeneralActionName } from "./Enums";
|
||||||
|
import type { Action } from "./Types";
|
||||||
|
|
||||||
|
export function calculateActionRankGain(action: Action, level?: number): number {
|
||||||
|
switch (action.type) {
|
||||||
|
case BladeburnerActionType.General:
|
||||||
|
if (action.name === BladeburnerGeneralActionName.FieldAnalysis) {
|
||||||
|
return 0.1 * currentNodeMults.BladeburnerRank;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BladeburnerActionType.Contract:
|
||||||
|
case BladeburnerActionType.Operation: {
|
||||||
|
if (level == null) {
|
||||||
|
level = action.level;
|
||||||
|
}
|
||||||
|
const rewardMultiplier = Math.pow(action.rewardFac, level - 1);
|
||||||
|
return action.rankGain * rewardMultiplier * currentNodeMults.BladeburnerRank;
|
||||||
|
}
|
||||||
|
case BladeburnerActionType.BlackOp:
|
||||||
|
return action.rankGain * currentNodeMults.BladeburnerRank;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateActionReputationGain(person: Person, rankGain: number): number {
|
||||||
|
const favorBonus = 1 + Factions[FactionName.Bladeburners].favor / 100;
|
||||||
|
return BladeburnerConstants.RankToFactionRepFactor * rankGain * person.mults.faction_rep * favorBonus;
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ import { assertStringWithNSContext } from "../Netscript/TypeAssertion";
|
|||||||
import { BlackOperations, blackOpsArray } from "../Bladeburner/data/BlackOperations";
|
import { BlackOperations, blackOpsArray } from "../Bladeburner/data/BlackOperations";
|
||||||
import { checkSleeveAPIAccess, checkSleeveNumber } from "../NetscriptFunctions/Sleeve";
|
import { checkSleeveAPIAccess, checkSleeveNumber } from "../NetscriptFunctions/Sleeve";
|
||||||
import { canAccessBitNodeFeature } from "../BitNode/BitNodeUtils";
|
import { canAccessBitNodeFeature } from "../BitNode/BitNodeUtils";
|
||||||
|
import { calculateActionRankGain, calculateActionReputationGain } from "../Bladeburner/Formulas";
|
||||||
|
|
||||||
export function NetscriptBladeburner(): InternalAPI<INetscriptBladeburner> {
|
export function NetscriptBladeburner(): InternalAPI<INetscriptBladeburner> {
|
||||||
const checkBladeburnerAccess = function (ctx: NetscriptContext): void {
|
const checkBladeburnerAccess = function (ctx: NetscriptContext): void {
|
||||||
@@ -151,8 +152,8 @@ export function NetscriptBladeburner(): InternalAPI<INetscriptBladeburner> {
|
|||||||
checkBladeburnerAccess(ctx);
|
checkBladeburnerAccess(ctx);
|
||||||
const action = getAction(ctx, type, name);
|
const action = getAction(ctx, type, name);
|
||||||
const level = isLevelableAction(action) ? helpers.number(ctx, "level", _level ?? action.level) : 1;
|
const level = isLevelableAction(action) ? helpers.number(ctx, "level", _level ?? action.level) : 1;
|
||||||
const rewardMultiplier = isLevelableAction(action) ? Math.pow(action.rewardFac, level - 1) : 1;
|
const rankGain = calculateActionRankGain(action, level);
|
||||||
return action.rankGain * rewardMultiplier * currentNodeMults.BladeburnerRank;
|
return calculateActionReputationGain(Player, rankGain);
|
||||||
},
|
},
|
||||||
getActionCountRemaining: (ctx) => (type, name) => {
|
getActionCountRemaining: (ctx) => (type, name) => {
|
||||||
const bladeburner = getBladeburner(ctx);
|
const bladeburner = getBladeburner(ctx);
|
||||||
|
|||||||
@@ -191,5 +191,12 @@ export const breakingChanges300: VersionBreakingChange = {
|
|||||||
'It has been automatically replaced with "ns.getBitNodeMultipliers().FavorToDonateToFaction".',
|
'It has been automatically replaced with "ns.getBitNodeMultipliers().FavorToDonateToFaction".',
|
||||||
showPopUp: false,
|
showPopUp: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
brokenAPIs: [{ name: "getActionRepGain" }],
|
||||||
|
info:
|
||||||
|
"ns.bladeburner.getActionRepGain returned the average rank gain instead of the average reputation gain.\n" +
|
||||||
|
"This bug was fixed. Please check your code to see if it still works as you expect.",
|
||||||
|
showPopUp: false,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user