bitburner-src/src/NetscriptFunctions/Extra.ts

72 lines
2.3 KiB
TypeScript
Raw Normal View History

import { WorkerScript } from "../Netscript/WorkerScript";
import { IPlayer } from "../PersonObjects/IPlayer";
import { Exploit } from "../Exploits/Exploit";
2022-03-16 19:34:05 +01:00
import * as bcrypt from "bcryptjs";
2022-03-17 00:33:45 +01:00
import { INetscriptHelper } from "./INetscriptHelper";
2022-03-18 16:18:08 +01:00
import { Augmentations } from "../Augmentation/Augmentations";
export interface INetscriptExtra {
heart: {
break(): number;
};
exploit(): void;
bypass(doc: Document): void;
alterReality(): void;
2022-03-16 19:34:05 +01:00
rainbow(guess: string): void;
}
2022-03-17 00:33:45 +01:00
export function NetscriptExtra(player: IPlayer, workerScript: WorkerScript, helper: INetscriptHelper): INetscriptExtra {
return {
heart: {
// Easter egg function
break: function (): number {
return player.karma;
},
},
exploit: function (): void {
player.giveExploit(Exploit.UndocumentedFunctionCall);
},
2022-03-17 00:33:45 +01:00
bypass: function (doc: unknown): void {
// reset both fields first
2022-03-17 00:33:45 +01:00
const d = doc as any;
d.completely_unused_field = undefined;
const real_document: any = document;
real_document.completely_unused_field = undefined;
// set one to true and check that it affected the other.
real_document.completely_unused_field = true;
2022-03-17 00:33:45 +01:00
if (d.completely_unused_field && workerScript.ramUsage === 1.6) {
player.giveExploit(Exploit.Bypass);
}
2022-03-17 00:33:45 +01:00
d.completely_unused_field = undefined;
real_document.completely_unused_field = undefined;
},
alterReality: function (): void {
2021-11-13 01:28:52 +01:00
// We need to trick webpack into not optimizing a variable that is guaranteed to be false (and doesn't use prototypes)
let x = false;
const recur = function (depth: number): void {
if (depth === 0) return;
x = !x;
recur(depth - 1);
};
recur(2);
2021-10-27 21:55:11 +02:00
console.warn("I am sure that this variable is false.");
if (x !== false) {
console.warn("Reality has been altered!");
player.giveExploit(Exploit.RealityAlteration);
}
},
2022-03-16 19:34:05 +01:00
rainbow: function (guess: unknown): void {
async function tryGuess(): Promise<void> {
const verified = await bcrypt.compare(
2022-03-17 00:33:45 +01:00
helper.string("rainbow", "guess", guess),
2022-03-16 19:34:05 +01:00
"$2a$10$aertxDEkgor8baVtQDZsLuMwwGYmkRM/ohcA6FjmmzIHQeTCsrCcO",
);
if (verified) {
player.giveExploit(Exploit.INeedARainbow);
}
}
tryGuess();
},
};
}