mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-30 19:43:49 +01:00
commit
91d9ebbedc
4
dist/main.bundle.js
vendored
4
dist/main.bundle.js
vendored
File diff suppressed because one or more lines are too long
2
dist/main.bundle.js.map
vendored
2
dist/main.bundle.js.map
vendored
File diff suppressed because one or more lines are too long
@ -17,7 +17,7 @@ import { IAction } from "./IAction";
|
||||
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||
import { createTaskTracker, ITaskTracker } from "../PersonObjects/ITaskTracker";
|
||||
import { IPerson } from "../PersonObjects/IPerson";
|
||||
import { IRouter, Page } from "../ui/Router";
|
||||
import { IRouter } from "../ui/Router";
|
||||
import { ConsoleHelpText } from "./data/Help";
|
||||
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||
@ -35,7 +35,6 @@ import { getTimestamp } from "../utils/helpers/getTimestamp";
|
||||
import { joinFaction } from "../Faction/FactionHelpers";
|
||||
import { WorkerScript } from "../Netscript/WorkerScript";
|
||||
import { FactionNames } from "../Faction/data/FactionNames";
|
||||
import { BlackOperationNames } from "./data/BlackOperationNames";
|
||||
import { KEY } from "../utils/helpers/keyCodes";
|
||||
|
||||
interface BlackOpsAttempt {
|
||||
@ -237,13 +236,13 @@ export class Bladeburner implements IBladeburner {
|
||||
}
|
||||
}
|
||||
|
||||
upgradeSkill(skill: Skill): void {
|
||||
upgradeSkill(skill: Skill, count = 1): void {
|
||||
// This does NOT handle deduction of skill points
|
||||
const skillName = skill.name;
|
||||
if (this.skills[skillName]) {
|
||||
++this.skills[skillName];
|
||||
this.skills[skillName] += count;
|
||||
} else {
|
||||
this.skills[skillName] = 1;
|
||||
this.skills[skillName] = count;
|
||||
}
|
||||
if (isNaN(this.skills[skillName]) || this.skills[skillName] < 0) {
|
||||
throw new Error("Level of Skill " + skillName + " is invalid: " + this.skills[skillName]);
|
||||
@ -2277,7 +2276,7 @@ export class Bladeburner implements IBladeburner {
|
||||
}
|
||||
}
|
||||
|
||||
getSkillUpgradeCostNetscriptFn(skillName: string, workerScript: WorkerScript): number {
|
||||
getSkillUpgradeCostNetscriptFn(skillName: string, count: number, workerScript: WorkerScript): number {
|
||||
if (skillName === "" || !Skills.hasOwnProperty(skillName)) {
|
||||
workerScript.log("bladeburner.getSkillUpgradeCost", () => `Invalid skill: '${skillName}'`);
|
||||
return -1;
|
||||
@ -2285,13 +2284,13 @@ export class Bladeburner implements IBladeburner {
|
||||
|
||||
const skill = Skills[skillName];
|
||||
if (this.skills[skillName] == null) {
|
||||
return skill.calculateCost(0);
|
||||
return skill.calculateCost(0, count);
|
||||
} else {
|
||||
return skill.calculateCost(this.skills[skillName]);
|
||||
return skill.calculateCost(this.skills[skillName], count);
|
||||
}
|
||||
}
|
||||
|
||||
upgradeSkillNetscriptFn(skillName: string, workerScript: WorkerScript): boolean {
|
||||
upgradeSkillNetscriptFn(skillName: string, count: number, workerScript: WorkerScript): boolean {
|
||||
const errorLogText = `Invalid skill: '${skillName}'`;
|
||||
if (!Skills.hasOwnProperty(skillName)) {
|
||||
workerScript.log("bladeburner.upgradeSkill", () => errorLogText);
|
||||
@ -2303,10 +2302,10 @@ export class Bladeburner implements IBladeburner {
|
||||
if (this.skills[skillName] && !isNaN(this.skills[skillName])) {
|
||||
currentLevel = this.skills[skillName];
|
||||
}
|
||||
const cost = skill.calculateCost(currentLevel);
|
||||
const cost = skill.calculateCost(currentLevel, count);
|
||||
|
||||
if (skill.maxLvl && currentLevel >= skill.maxLvl) {
|
||||
workerScript.log("bladeburner.upgradeSkill", () => `Skill '${skillName}' is already maxed.`);
|
||||
if (skill.maxLvl && currentLevel + count > skill.maxLvl) {
|
||||
workerScript.log("bladeburner.upgradeSkill", () => `Skill '${skillName}' cannot be upgraded ${count} time(s).`);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2314,13 +2313,13 @@ export class Bladeburner implements IBladeburner {
|
||||
workerScript.log(
|
||||
"bladeburner.upgradeSkill",
|
||||
() =>
|
||||
`You do not have enough skill points to upgrade ${skillName} (You have ${this.skillPoints}, you need ${cost})`,
|
||||
`You do not have enough skill points to upgrade ${skillName} ${count} time(s). (You have ${this.skillPoints}, you need ${cost})`,
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
this.skillPoints -= cost;
|
||||
this.upgradeSkill(skill);
|
||||
this.upgradeSkill(skill, count);
|
||||
workerScript.log("bladeburner.upgradeSkill", () => `'${skillName}' upgraded to level ${this.skills[skillName]}`);
|
||||
return true;
|
||||
}
|
||||
|
@ -76,8 +76,8 @@ export interface IBladeburner {
|
||||
getActionEstimatedSuccessChanceNetscriptFn(person: IPerson, type: string, name: string): [number, number] | string;
|
||||
getActionCountRemainingNetscriptFn(type: string, name: string, workerScript: WorkerScript): number;
|
||||
getSkillLevelNetscriptFn(skillName: string, workerScript: WorkerScript): number;
|
||||
getSkillUpgradeCostNetscriptFn(skillName: string, workerScript: WorkerScript): number;
|
||||
upgradeSkillNetscriptFn(skillName: string, workerScript: WorkerScript): boolean;
|
||||
getSkillUpgradeCostNetscriptFn(skillName: string, count: number, workerScript: WorkerScript): number;
|
||||
upgradeSkillNetscriptFn(skillName: string, count: number, workerScript: WorkerScript): boolean;
|
||||
getTeamSizeNetscriptFn(type: string, name: string, workerScript: WorkerScript): number;
|
||||
setTeamSizeNetscriptFn(type: string, name: string, size: number, workerScript: WorkerScript): number;
|
||||
joinBladeburnerFactionNetscriptFn(workerScript: WorkerScript): boolean;
|
||||
|
@ -133,8 +133,37 @@ export class Skill {
|
||||
}
|
||||
}
|
||||
|
||||
calculateCost(currentLevel: number): number {
|
||||
calculateCost(currentLevel: number, count = 1): number {
|
||||
//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: number): number => {
|
||||
if (count <= 1) {
|
||||
return Math.floor((this.baseCost + currentLevel * this.costInc) * BitNodeMultipliers.BladeburnerSkillCost);
|
||||
} else {
|
||||
const thisUpgrade = Math.floor(
|
||||
(this.baseCost + currentLevel * this.costInc) * BitNodeMultipliers.BladeburnerSkillCost,
|
||||
);
|
||||
return this.calculateCost(currentLevel + 1, count - 1) + thisUpgrade;
|
||||
}
|
||||
};
|
||||
|
||||
//Count must be a positive integer.
|
||||
if (count < 0 || count % 1 != 0) {
|
||||
throw new Error(`${count} is an invalid number of upgrades`);
|
||||
}
|
||||
//Use recursive mode if count is small
|
||||
if (count <= 100) {
|
||||
return recursiveMode(currentLevel, count);
|
||||
}
|
||||
//Use optimized mode if count is large
|
||||
else {
|
||||
//unFloored is roughly equivalent to
|
||||
//(this.baseCost + currentLevel * this.costInc) * BitNodeMultipliers.BladeburnerSkillCost
|
||||
//being repeated for increasing currentLevel
|
||||
const preMult = (count * (2 * this.baseCost + this.costInc * (2 * currentLevel + count + 1))) / 2;
|
||||
const unFloored = preMult * BitNodeMultipliers.BladeburnerSkillCost - count / 2;
|
||||
return Math.floor(unFloored);
|
||||
}
|
||||
}
|
||||
|
||||
getMultiplier(name: string): number {
|
||||
|
@ -279,26 +279,28 @@ export function NetscriptBladeburner(player: IPlayer, workerScript: WorkerScript
|
||||
},
|
||||
getSkillUpgradeCost:
|
||||
(ctx: NetscriptContext) =>
|
||||
(_skillName: unknown): number => {
|
||||
(_skillName: unknown, _count: unknown = 1): number => {
|
||||
const skillName = ctx.helper.string("skillName", _skillName);
|
||||
const count = ctx.helper.number("count", _count);
|
||||
checkBladeburnerAccess(ctx);
|
||||
const bladeburner = player.bladeburner;
|
||||
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
|
||||
try {
|
||||
return bladeburner.getSkillUpgradeCostNetscriptFn(skillName, workerScript);
|
||||
return bladeburner.getSkillUpgradeCostNetscriptFn(skillName, count, workerScript);
|
||||
} catch (e: any) {
|
||||
throw ctx.makeRuntimeErrorMsg(e);
|
||||
}
|
||||
},
|
||||
upgradeSkill:
|
||||
(ctx: NetscriptContext) =>
|
||||
(_skillName: unknown): boolean => {
|
||||
(_skillName: unknown, _count: unknown = 1): boolean => {
|
||||
const skillName = ctx.helper.string("skillName", _skillName);
|
||||
const count = ctx.helper.number("count", _count);
|
||||
checkBladeburnerAccess(ctx);
|
||||
const bladeburner = player.bladeburner;
|
||||
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
|
||||
try {
|
||||
return bladeburner.upgradeSkillNetscriptFn(skillName, workerScript);
|
||||
return bladeburner.upgradeSkillNetscriptFn(skillName, count, workerScript);
|
||||
} catch (e: any) {
|
||||
throw ctx.makeRuntimeErrorMsg(e);
|
||||
}
|
||||
|
@ -257,7 +257,7 @@ export function NetscriptCorporation(player: IPlayer, workerScript: WorkerScript
|
||||
|
||||
function getMaterial(divisionName: string, cityName: string, materialName: string): Material {
|
||||
const warehouse = getWarehouse(divisionName, cityName);
|
||||
const matName = (materialName ).replace(/ /g, "");
|
||||
const matName = materialName.replace(/ /g, "");
|
||||
const material = warehouse.materials[matName];
|
||||
if (material === undefined) throw new Error(`Invalid material name: '${materialName}'`);
|
||||
return material;
|
||||
@ -725,9 +725,11 @@ export function NetscriptCorporation(player: IPlayer, workerScript: WorkerScript
|
||||
const employeeName = ctx.helper.string("employeeName", _employeeName);
|
||||
const job = ctx.helper.string("job", _job);
|
||||
const employee = getEmployee(divisionName, cityName, employeeName);
|
||||
return netscriptDelay(["Training", "Unassigned"].includes(employee.pos) ? 0 : 1000, workerScript).then(function () {
|
||||
return netscriptDelay(["Training", "Unassigned"].includes(employee.pos) ? 0 : 1000, workerScript).then(
|
||||
function () {
|
||||
return Promise.resolve(AssignJob(employee, job));
|
||||
});
|
||||
},
|
||||
);
|
||||
},
|
||||
hireEmployee:
|
||||
(ctx: NetscriptContext) =>
|
||||
|
10
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
10
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
@ -3080,28 +3080,30 @@ export interface Bladeburner {
|
||||
* @remarks
|
||||
* RAM cost: 4 GB
|
||||
*
|
||||
* This function returns the number of skill points needed to upgrade the specified skill.
|
||||
* This function returns the number of skill points needed to upgrade the specified skill the specified number of times.
|
||||
*
|
||||
* The function returns -1 if an invalid skill name is passed in.
|
||||
*
|
||||
* @param skillName - Name of skill. Case-sensitive and must be an exact match
|
||||
* @param count - Number of times to upgrade the skill. Defaults to 1 if not specified.
|
||||
* @returns Number of skill points needed to upgrade the specified skill.
|
||||
*/
|
||||
getSkillUpgradeCost(name: string): number;
|
||||
getSkillUpgradeCost(name: string, count?: number): number;
|
||||
|
||||
/**
|
||||
* Upgrade skill.
|
||||
* @remarks
|
||||
* RAM cost: 4 GB
|
||||
*
|
||||
* Attempts to upgrade the specified Bladeburner skill.
|
||||
* Attempts to upgrade the specified Bladeburner skill the specified number of times.
|
||||
*
|
||||
* Returns true if the skill is successfully upgraded, and false otherwise.
|
||||
*
|
||||
* @param skillName - Name of skill to be upgraded. Case-sensitive and must be an exact match
|
||||
* @param count - Number of times to upgrade the skill. Defaults to 1 if not specified.
|
||||
* @returns true if the skill is successfully upgraded, and false otherwise.
|
||||
*/
|
||||
upgradeSkill(name: string): boolean;
|
||||
upgradeSkill(name: string, count?: number): boolean;
|
||||
|
||||
/**
|
||||
* Get team size.
|
||||
|
Loading…
Reference in New Issue
Block a user