BLADEBURNER: Allow unsafe positive integers for skill upgrade count (#1211)

This commit is contained in:
Snarling 2024-04-08 06:33:45 -04:00 committed by GitHub
parent 7ae309edda
commit be437c83f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 16 deletions

@ -3,7 +3,7 @@ import type { BladeMultName, BladeSkillName } from "@enums";
import { currentNodeMults } from "../BitNode/BitNodeMultipliers"; import { currentNodeMults } from "../BitNode/BitNodeMultipliers";
import { Bladeburner } from "./Bladeburner"; import { Bladeburner } from "./Bladeburner";
import { Availability } from "./Types"; import { Availability } from "./Types";
import { PositiveSafeInteger, isPositiveSafeInteger } from "../types"; import { PositiveInteger, PositiveSafeInteger, isPositiveInteger } from "../types";
import { PartialRecord, getRecordEntries } from "../Types/Record"; import { PartialRecord, getRecordEntries } from "../Types/Record";
interface SkillParams { interface SkillParams {
@ -34,10 +34,9 @@ export class Skill {
for (const [multName, mult] of getRecordEntries(params.mults)) this.mults[multName] = mult; for (const [multName, mult] of getRecordEntries(params.mults)) this.mults[multName] = mult;
} }
calculateCost(currentLevel: number, count = 1 as PositiveSafeInteger): number { calculateCost(currentLevel: number, count = 1 as PositiveInteger): number {
if (currentLevel + count > this.maxLvl) return Infinity; if (currentLevel + count > this.maxLvl) return Infinity;
//Recursive mode does not handle invalid inputs properly, but it should never
//be possible for it to run with them. For the sake of not crashing the game,
const recursiveMode = (currentLevel: number, count: PositiveSafeInteger): number => { const recursiveMode = (currentLevel: number, count: PositiveSafeInteger): number => {
if (count <= 1) { if (count <= 1) {
return Math.floor((this.baseCost + currentLevel * this.costInc) * currentNodeMults.BladeburnerSkillCost); return Math.floor((this.baseCost + currentLevel * this.costInc) * currentNodeMults.BladeburnerSkillCost);
@ -49,15 +48,9 @@ export class Skill {
} }
}; };
//Count must be a positive integer. // Use recursive mode if count is small
if (count < 0 || count % 1 != 0) { if (count <= 100) return recursiveMode(currentLevel, count as PositiveSafeInteger);
throw new Error(`${count} is an invalid number of upgrades`); // Use optimized mode if count is large
}
//Use recursive mode if count is small
if (count <= 100) {
return recursiveMode(currentLevel, count);
}
//Use optimized mode if count is large
else { else {
//unFloored is roughly equivalent to //unFloored is roughly equivalent to
//(this.baseCost + currentLevel * this.costInc) * BitNodeMultipliers.BladeburnerSkillCost //(this.baseCost + currentLevel * this.costInc) * BitNodeMultipliers.BladeburnerSkillCost
@ -70,7 +63,7 @@ export class Skill {
canUpgrade(bladeburner: Bladeburner, count = 1): Availability<{ cost: number }> { canUpgrade(bladeburner: Bladeburner, count = 1): Availability<{ cost: number }> {
const currentLevel = bladeburner.skills[this.name] ?? 0; const currentLevel = bladeburner.skills[this.name] ?? 0;
if (!isPositiveSafeInteger(count)) return { error: `Invalid upgrade count ${count}` }; if (!isPositiveInteger(count)) return { error: `Invalid upgrade count ${count}` };
if (currentLevel + count > this.maxLvl) return { error: `Upgraded level ${currentLevel + count} exceeds max` }; if (currentLevel + count > this.maxLvl) return { error: `Upgraded level ${currentLevel + count} exceeds max` };
const cost = this.calculateCost(currentLevel, count); const cost = this.calculateCost(currentLevel, count);
if (cost > bladeburner.skillPoints) return { error: `Insufficient skill points for upgrade` }; if (cost > bladeburner.skillPoints) return { error: `Insufficient skill points for upgrade` };

@ -202,14 +202,14 @@ export function NetscriptBladeburner(): InternalAPI<INetscriptBladeburner> {
getSkillUpgradeCost: (ctx) => (_skillName, _count) => { getSkillUpgradeCost: (ctx) => (_skillName, _count) => {
const bladeburner = getBladeburner(ctx); const bladeburner = getBladeburner(ctx);
const skillName = getEnumHelper("BladeSkillName").nsGetMember(ctx, _skillName, "skillName"); const skillName = getEnumHelper("BladeSkillName").nsGetMember(ctx, _skillName, "skillName");
const count = helpers.positiveSafeInteger(ctx, "count", _count ?? 1); const count = helpers.positiveInteger(ctx, "count", _count ?? 1);
const currentLevel = bladeburner.getSkillLevel(skillName); const currentLevel = bladeburner.getSkillLevel(skillName);
return Skills[skillName].calculateCost(currentLevel, count); return Skills[skillName].calculateCost(currentLevel, count);
}, },
upgradeSkill: (ctx) => (_skillName, _count) => { upgradeSkill: (ctx) => (_skillName, _count) => {
const bladeburner = getBladeburner(ctx); const bladeburner = getBladeburner(ctx);
const skillName = getEnumHelper("BladeSkillName").nsGetMember(ctx, _skillName, "skillName"); const skillName = getEnumHelper("BladeSkillName").nsGetMember(ctx, _skillName, "skillName");
const count = helpers.positiveSafeInteger(ctx, "count", _count ?? 1); const count = helpers.positiveInteger(ctx, "count", _count ?? 1);
const attempt = bladeburner.upgradeSkill(skillName, count); const attempt = bladeburner.upgradeSkill(skillName, count);
helpers.log(ctx, () => attempt.message); helpers.log(ctx, () => attempt.message);
return !!attempt.success; return !!attempt.success;