Fix #2018: Blade console check blackops order

Prevents you from running blackops if you have not completed the
preceeding one.
This commit is contained in:
Martin Fournier 2021-12-21 10:13:12 -05:00
parent dbe36fd6b7
commit 2d269c7a4e

@ -34,6 +34,12 @@ import { getTimestamp } from "../utils/helpers/getTimestamp";
import { joinFaction } from "../Faction/FactionHelpers"; import { joinFaction } from "../Faction/FactionHelpers";
import { WorkerScript } from "../Netscript/WorkerScript"; import { WorkerScript } from "../Netscript/WorkerScript";
interface BlackOpsAttempt {
error?: string;
isAvailable?: boolean;
action?: BlackOperation;
}
export class Bladeburner implements IBladeburner { export class Bladeburner implements IBladeburner {
numHosp = 0; numHosp = 0;
moneyLost = 0; moneyLost = 0;
@ -113,6 +119,44 @@ export class Bladeburner implements IBladeburner {
return Math.min(1, this.stamina / (0.5 * this.maxStamina)); return Math.min(1, this.stamina / (0.5 * this.maxStamina));
} }
canAttemptBlackOp(actionId: IActionIdentifier): BlackOpsAttempt {
// Safety measure - don't repeat BlackOps that are already done
if (this.blackops[actionId.name] != null) {
return { error: "Tried to start a Black Operation that had already been completed" }
}
const action = this.getActionObject(actionId);
if (!(action instanceof BlackOperation)) throw new Error(`Action should be BlackOperation but isn't`);
if (action == null) throw new Error("Failed to get BlackOperation object for: " + actionId.name);
if (action.reqdRank > this.rank) {
return { error: "Tried to start a Black Operation without the rank requirement" };
}
// Can't start a BlackOp if you haven't done the one before it
const blackops = [];
for (const nm in BlackOperations) {
if (BlackOperations.hasOwnProperty(nm)) {
blackops.push(nm);
}
}
blackops.sort(function (a, b) {
return BlackOperations[a].reqdRank - BlackOperations[b].reqdRank; // Sort black ops in intended order
});
const i = blackops.indexOf(actionId.name);
if (i === -1) {
return { error: `Invalid Black Op: '${name}'` };
}
if (i > 0 && this.blackops[blackops[i - 1]] == null) {
return { error: `Preceding Black Op must be completed before starting '${actionId.name}'.` }
}
return { isAvailable: true, action }
}
startAction(player: IPlayer, actionId: IActionIdentifier): void { startAction(player: IPlayer, actionId: IActionIdentifier): void {
if (actionId == null) return; if (actionId == null) return;
this.action = actionId; this.action = actionId;
@ -156,24 +200,13 @@ export class Bladeburner implements IBladeburner {
case ActionTypes["BlackOp"]: case ActionTypes["BlackOp"]:
case ActionTypes["BlackOperation"]: { case ActionTypes["BlackOperation"]: {
try { try {
// Safety measure - don't repeat BlackOps that are already done const testBlackOp = this.canAttemptBlackOp(actionId);
if (this.blackops[actionId.name] != null) { if (!testBlackOp.isAvailable) {
this.resetAction(); this.resetAction();
this.log("Error: Tried to start a Black Operation that had already been completed"); this.log(`Error: ${testBlackOp.error}`);
break; break;
} }
this.actionTimeToComplete = testBlackOp.action.getActionTime(this);
const action = this.getActionObject(actionId);
if (!(action instanceof BlackOperation)) throw new Error(`Action should be BlackOperation but isn't`);
if (action.reqdRank > (player.bladeburner?.rank ?? 0)) {
this.resetAction();
this.log("Error: Tried to start a Black Operation without the rank requirement");
break;
}
if (action == null) {
throw new Error("Failed to get BlackOperation object for: " + actionId.name);
}
this.actionTimeToComplete = action.getActionTime(this);
} catch (e: any) { } catch (e: any) {
exceptionAlert(e); exceptionAlert(e);
} }
@ -2043,44 +2076,9 @@ export class Bladeburner implements IBladeburner {
// Special logic for Black Ops // Special logic for Black Ops
if (actionId.type === ActionTypes["BlackOp"]) { if (actionId.type === ActionTypes["BlackOp"]) {
// Can't start a BlackOp if you don't have the required rank const canRunOp = this.canAttemptBlackOp(actionId);
const action = this.getActionObject(actionId); if (!canRunOp.isAvailable) {
if (action == null) throw new Error(`Action not found ${actionId.type}, ${actionId.name}`); workerScript.log("bladeburner.startAction", () => canRunOp.error);
if (!(action instanceof BlackOperation)) throw new Error(`Action should be BlackOperation but isn't`);
//const blackOp = (action as BlackOperation);
if (action.reqdRank > this.rank) {
workerScript.log("bladeburner.startAction", () => `Insufficient rank to start Black Op '${actionId.name}'.`);
return false;
}
// Can't start a BlackOp if its already been done
if (this.blackops[actionId.name] != null) {
workerScript.log("bladeburner.startAction", () => `Black Op ${actionId.name} has already been completed.`);
return false;
}
// Can't start a BlackOp if you haven't done the one before it
const blackops = [];
for (const nm in BlackOperations) {
if (BlackOperations.hasOwnProperty(nm)) {
blackops.push(nm);
}
}
blackops.sort(function (a, b) {
return BlackOperations[a].reqdRank - BlackOperations[b].reqdRank; // Sort black ops in intended order
});
const i = blackops.indexOf(actionId.name);
if (i === -1) {
workerScript.log("bladeburner.startAction", () => `Invalid Black Op: '${name}'`);
return false;
}
if (i > 0 && this.blackops[blackops[i - 1]] == null) {
workerScript.log(
"bladeburner.startAction",
() => `Preceding Black Op must be completed before starting '${actionId.name}'.`,
);
return false; return false;
} }
} }