mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-18 12:15:44 +01:00
build bunch of fixes
This commit is contained in:
parent
c94ec2f170
commit
0c932dd4d1
28
dist/vendor.bundle.js
vendored
28
dist/vendor.bundle.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1357
package-lock.json
generated
1357
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -58,7 +58,8 @@
|
||||
"treant-js": "^1.0.1",
|
||||
"unused-webpack-plugin": "^2.4.0",
|
||||
"uuid": "^3.2.1",
|
||||
"w3c-blob": "0.0.1"
|
||||
"w3c-blob": "0.0.1",
|
||||
"webpack-deadcode-plugin": "^0.1.15"
|
||||
},
|
||||
"description": "A cyberpunk-themed incremental game",
|
||||
"devDependencies": {
|
||||
|
1
src/CinematicText.d.ts
vendored
1
src/CinematicText.d.ts
vendored
@ -1 +0,0 @@
|
||||
export declare let cinematicTextFlag: boolean;
|
@ -1,119 +0,0 @@
|
||||
import { Engine } from "./engine";
|
||||
import { setTimeoutRef } from "./utils/SetTimeoutRef";
|
||||
|
||||
import { removeChildrenFromElement } from "../utils/uiHelpers/removeChildrenFromElement";
|
||||
import { createElement } from "../utils/uiHelpers/createElement";
|
||||
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||
import { isString } from "../utils/helpers/isString";
|
||||
|
||||
export let cinematicTextFlag = false;
|
||||
|
||||
/**
|
||||
* Print a message using a hacking-style "typing" effect.
|
||||
* Note that this clears the UI so that the text from this is the only thing visible.
|
||||
*
|
||||
* @param lines {string[]} Array of strings to print, where each element is a separate line
|
||||
*/
|
||||
export function writeCinematicText(lines) {
|
||||
cinematicTextFlag = true;
|
||||
|
||||
if (lines.constructor !== Array) {
|
||||
throw new Error("Invalid non-array argument passed into writeCinematicText()");
|
||||
}
|
||||
|
||||
// Reuse the 'Red Pill' content
|
||||
Engine.loadCinematicTextContent();
|
||||
const container = document.getElementById("cinematic-text-container");
|
||||
container.style.width = "75%";
|
||||
if (container == null) {
|
||||
throw new Error("Could not find cinematic-text-container for writeCinematicText()");
|
||||
}
|
||||
removeChildrenFromElement(container);
|
||||
|
||||
for (let i = 0; i < lines.length; ++i) {
|
||||
if (!isString(lines[i])) {
|
||||
throw new Error("Invalid non-string element in 'lines' argument. writeCinematicText() failed");
|
||||
}
|
||||
}
|
||||
|
||||
return writeCinematicTextRecurse(lines)
|
||||
.then(function () {
|
||||
return cinematicTextEnd(); //Puts the continue button
|
||||
})
|
||||
.catch(function (e) {
|
||||
exceptionAlert(e);
|
||||
});
|
||||
}
|
||||
|
||||
function writeCinematicTextRecurse(lines, lineNumber = 0) {
|
||||
if (lineNumber >= lines.length) {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
return writeCinematicTextLine(lines[lineNumber]).then(function () {
|
||||
return writeCinematicTextRecurse(lines, lineNumber + 1);
|
||||
});
|
||||
}
|
||||
|
||||
function writeCinematicTextLine(line) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
const container = document.getElementById("cinematic-text-container");
|
||||
const pElem = document.createElement("p");
|
||||
container.appendChild(pElem);
|
||||
|
||||
const promise = writeCinematicTextLetter(pElem, line, 0);
|
||||
promise.then(
|
||||
function (res) {
|
||||
resolve(res);
|
||||
},
|
||||
function (e) {
|
||||
reject(e);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function writeCinematicTextLetter(pElem, line, i = 0) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
setTimeoutRef(function () {
|
||||
const textToShow = line.substring(0, i);
|
||||
|
||||
if (i >= line.length) {
|
||||
pElem.innerHTML = textToShow;
|
||||
return resolve(true);
|
||||
}
|
||||
|
||||
pElem.innerHTML = textToShow + "<span class='typed-cursor'> █ </span>";
|
||||
const promise = writeCinematicTextLetter(pElem, line, i + 1);
|
||||
promise.then(
|
||||
function (res) {
|
||||
resolve(res);
|
||||
},
|
||||
function (e) {
|
||||
reject(e);
|
||||
},
|
||||
);
|
||||
}, 15);
|
||||
});
|
||||
}
|
||||
|
||||
function cinematicTextEnd() {
|
||||
var container = document.getElementById("cinematic-text-container");
|
||||
var mainMenu = document.getElementById("mainmenu-container");
|
||||
container.appendChild(createElement("br"));
|
||||
|
||||
return new Promise(function (resolve) {
|
||||
container.appendChild(
|
||||
createElement("a", {
|
||||
class: "a-link-button",
|
||||
innerText: "Continue...",
|
||||
clickListener: () => {
|
||||
removeChildrenFromElement(container);
|
||||
Engine.loadTerminalContent();
|
||||
mainMenu.style.visibility = "visible";
|
||||
cinematicTextFlag = false;
|
||||
resolve();
|
||||
},
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
||||
|
||||
// Array of all valid states
|
||||
export const AllCorporationStates: string[] = ["START", "PURCHASE", "PRODUCTION", "SALE", "EXPORT"];
|
||||
const AllCorporationStates: string[] = ["START", "PURCHASE", "PRODUCTION", "SALE", "EXPORT"];
|
||||
|
||||
export class CorporationState {
|
||||
// Number representing what state the Corporation is in. The number
|
||||
|
@ -24,35 +24,6 @@ export function checkIfConnectedToDarkweb(): void {
|
||||
}
|
||||
}
|
||||
|
||||
//Handler for dark web commands. The terminal's executeCommand() function will pass
|
||||
//dark web-specific commands into this. It will pass in the raw split command array
|
||||
//rather than the command string
|
||||
export function executeDarkwebTerminalCommand(commandArray: string[]): void {
|
||||
if (commandArray.length == 0) {
|
||||
return;
|
||||
}
|
||||
switch (commandArray[0]) {
|
||||
case "buy": {
|
||||
if (commandArray.length != 2) {
|
||||
Terminal.error("Incorrect number of arguments. Usage: ");
|
||||
Terminal.print("buy -l");
|
||||
Terminal.print("buy [item name]");
|
||||
return;
|
||||
}
|
||||
const arg = commandArray[1];
|
||||
if (arg == "-l" || arg == "-1" || arg == "--list") {
|
||||
listAllDarkwebItems();
|
||||
} else {
|
||||
buyDarkwebItem(arg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Terminal.error("Command not found");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
export function listAllDarkwebItems(): void {
|
||||
for (const key in DarkWebItems) {
|
||||
const item = DarkWebItems[key];
|
||||
|
@ -20,7 +20,7 @@ interface IServerProps {
|
||||
ip: string;
|
||||
}
|
||||
|
||||
export function ServerAccordion(props: IServerProps): React.ReactElement {
|
||||
function ServerAccordion(props: IServerProps): React.ReactElement {
|
||||
const server = AllServers[props.ip];
|
||||
let totalSize = 0;
|
||||
for (const f of server.scripts) {
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { Player } from "../Player";
|
||||
import { Exploit } from "./Exploit";
|
||||
|
||||
(function () {
|
||||
export function startTampering(): void {
|
||||
const a = 55;
|
||||
setInterval(function () {
|
||||
if (a.toExponential() !== "5.5e+1") {
|
||||
Player.giveExploit(Exploit.PrototypeTampering);
|
||||
}
|
||||
}, 15 * 60 * 1000); // 15 minutes
|
||||
})();
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Player } from "../Player";
|
||||
import { Exploit } from "./Exploit";
|
||||
|
||||
(function () {
|
||||
export function startUnclickable(): void {
|
||||
function clickTheUnclickable(event: MouseEvent): void {
|
||||
if (!event.target || !(event.target instanceof Element)) return;
|
||||
const display = window.getComputedStyle(event.target as Element).display;
|
||||
@ -19,4 +19,4 @@ import { Exploit } from "./Exploit";
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", targetElement);
|
||||
})();
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import { makeRuntimeRejectMsg } from "./NetscriptEvaluator";
|
||||
import { ScriptUrl } from "./Script/ScriptUrl";
|
||||
|
||||
// Makes a blob that contains the code of a given script.
|
||||
export function makeScriptBlob(code) {
|
||||
function makeScriptBlob(code) {
|
||||
return new Blob([code], { type: "text/javascript" });
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ function shouldCompile(script, scripts) {
|
||||
* the script parameter.
|
||||
*/
|
||||
// BUG: apparently seen is never consulted. Oops.
|
||||
export function _getScriptUrls(script, scripts, seen) {
|
||||
function _getScriptUrls(script, scripts, seen) {
|
||||
// Inspired by: https://stackoverflow.com/a/43834063/91401
|
||||
/** @type {ScriptUrl[]} */
|
||||
const urlStack = [];
|
||||
|
@ -10,10 +10,6 @@ import { SourceFiles } from "./SourceFile/SourceFiles";
|
||||
import { dialogBoxCreate } from "../utils/DialogBox";
|
||||
|
||||
let redPillFlag = false;
|
||||
function hackWorldDaemon(router, flume = false, quick = false) {
|
||||
router.toBitVerse(flume, quick);
|
||||
redPillFlag = true;
|
||||
}
|
||||
|
||||
function giveSourceFile(bitNodeNumber) {
|
||||
var sourceFileKey = "SourceFile" + bitNodeNumber.toString();
|
||||
@ -86,4 +82,4 @@ export function enterBitNode(router, flume, destroyedBitNode, newBitNode) {
|
||||
prestigeSourceFile(flume);
|
||||
}
|
||||
|
||||
export { redPillFlag, hackWorldDaemon };
|
||||
export { redPillFlag };
|
||||
|
@ -3,7 +3,7 @@ export type Position = {
|
||||
column: number;
|
||||
};
|
||||
|
||||
export class PositionTracker {
|
||||
class PositionTracker {
|
||||
positions: Map<string, Position>;
|
||||
|
||||
constructor() {
|
||||
|
@ -5,6 +5,14 @@ import { OwnedAugmentationsOrderSetting, PurchaseAugmentationsOrderSetting } fro
|
||||
* Represents the default settings the player could customize.
|
||||
*/
|
||||
interface IDefaultSettings {
|
||||
/**
|
||||
* How many servers per page
|
||||
*/
|
||||
ActiveScriptsServerPageSize: number;
|
||||
/**
|
||||
* How many scripts per page
|
||||
*/
|
||||
ActiveScriptsScriptPageSize: number;
|
||||
/**
|
||||
* How often the game should autosave the player's progress, in seconds.
|
||||
*/
|
||||
@ -101,6 +109,8 @@ interface ISettings extends IDefaultSettings {
|
||||
}
|
||||
|
||||
const defaultSettings: IDefaultSettings = {
|
||||
ActiveScriptsServerPageSize: 10,
|
||||
ActiveScriptsScriptPageSize: 10,
|
||||
AutosaveInterval: 60,
|
||||
CodeInstructionRunTime: 50,
|
||||
DisableASCIIArt: false,
|
||||
@ -123,6 +133,8 @@ const defaultSettings: IDefaultSettings = {
|
||||
*/
|
||||
// tslint:disable-next-line:variable-name
|
||||
export const Settings: ISettings & ISelfInitializer & ISelfLoading = {
|
||||
ActiveScriptsServerPageSize: defaultSettings.ActiveScriptsServerPageSize,
|
||||
ActiveScriptsScriptPageSize: defaultSettings.ActiveScriptsScriptPageSize,
|
||||
AutosaveInterval: defaultSettings.AutosaveInterval,
|
||||
CodeInstructionRunTime: 25,
|
||||
DisableASCIIArt: defaultSettings.DisableASCIIArt,
|
||||
|
@ -51,7 +51,6 @@ import { Settings } from "../../Settings/Settings";
|
||||
import { redPillFlag } from "../../RedPill";
|
||||
|
||||
import { inMission } from "../../Missions";
|
||||
import { cinematicTextFlag } from "../../CinematicText";
|
||||
import { KEY } from "../../../utils/helpers/keyCodes";
|
||||
import { FconfSettings } from "../../Fconf/FconfSettings";
|
||||
|
||||
@ -268,7 +267,7 @@ export function SidebarRoot(props: IProps): React.ReactElement {
|
||||
// Alt-o - Options
|
||||
function handleShortcuts(this: Document, event: KeyboardEvent): any {
|
||||
if (Settings.DisableHotkeys) return;
|
||||
if (props.player.isWorking || redPillFlag || inMission || cinematicTextFlag) return;
|
||||
if (props.player.isWorking || redPillFlag || inMission) return;
|
||||
if (event.keyCode == KEY.T && event.altKey) {
|
||||
event.preventDefault();
|
||||
clickTerminal();
|
||||
|
@ -44,8 +44,8 @@ import { Reputation } from "./ui/React/Reputation";
|
||||
import { dialogBoxCreate } from "../utils/DialogBox";
|
||||
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||
|
||||
import "./Exploits/tampering";
|
||||
import "./Exploits/unclickable";
|
||||
import { startTampering } from "./Exploits/tampering";
|
||||
import { startUnclickable } from "./Exploits/unclickable";
|
||||
|
||||
import React from "react";
|
||||
|
||||
@ -246,6 +246,8 @@ const Engine = {
|
||||
},
|
||||
|
||||
load: function (saveString) {
|
||||
startTampering();
|
||||
startUnclickable();
|
||||
// Load game from save or create new game
|
||||
if (loadGame(saveString)) {
|
||||
initBitNodeMultipliers(Player);
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React from "react";
|
||||
import ReactDOM from "react-dom";
|
||||
|
||||
import { TTheme as Theme, colors, refreshTheme } from "./ui/React/Theme";
|
||||
import { TTheme as Theme, colors } from "./ui/React/Theme";
|
||||
import { LoadingScreen } from "./ui/LoadingScreen";
|
||||
import "./engineStyle";
|
||||
|
||||
|
@ -4,6 +4,7 @@ import { WorkerScriptAccordion } from "./WorkerScriptAccordion";
|
||||
import List from "@mui/material/List";
|
||||
import TablePagination from "@mui/material/TablePagination";
|
||||
import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll";
|
||||
import { Settings } from "../../Settings/Settings";
|
||||
|
||||
interface IProps {
|
||||
workerScripts: WorkerScript[];
|
||||
@ -11,12 +12,13 @@ interface IProps {
|
||||
|
||||
export function ServerAccordionContent(props: IProps): React.ReactElement {
|
||||
const [page, setPage] = useState(0);
|
||||
const [rowsPerPage, setRowsPerPage] = useState(10);
|
||||
const [rowsPerPage, setRowsPerPage] = useState(Settings.ActiveScriptsScriptPageSize);
|
||||
const handleChangePage = (event: unknown, newPage: number): void => {
|
||||
setPage(newPage);
|
||||
};
|
||||
|
||||
const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>): void => {
|
||||
Settings.ActiveScriptsScriptPageSize = parseInt(event.target.value, 10);
|
||||
setRowsPerPage(parseInt(event.target.value, 10));
|
||||
setPage(0);
|
||||
};
|
||||
|
@ -13,6 +13,7 @@ import { WorkerScript } from "../../Netscript/WorkerScript";
|
||||
import { WorkerScriptStartStopEventEmitter } from "../../Netscript/WorkerScriptStartStopEventEmitter";
|
||||
import { getServer } from "../../Server/ServerHelpers";
|
||||
import { BaseServer } from "../../Server/BaseServer";
|
||||
import { Settings } from "../../Settings/Settings";
|
||||
import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll";
|
||||
import SearchIcon from "@mui/icons-material/Search";
|
||||
|
||||
@ -33,7 +34,7 @@ type IProps = {
|
||||
export function ServerAccordions(props: IProps): React.ReactElement {
|
||||
const [filter, setFilter] = useState("");
|
||||
const [page, setPage] = useState(0);
|
||||
const [rowsPerPage, setRowsPerPage] = useState(10);
|
||||
const [rowsPerPage, setRowsPerPage] = useState(Settings.ActiveScriptsServerPageSize);
|
||||
const setRerender = useState(false)[1];
|
||||
|
||||
const handleChangePage = (event: unknown, newPage: number): void => {
|
||||
@ -41,6 +42,7 @@ export function ServerAccordions(props: IProps): React.ReactElement {
|
||||
};
|
||||
|
||||
const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>): void => {
|
||||
Settings.ActiveScriptsServerPageSize = parseInt(event.target.value, 10);
|
||||
setRowsPerPage(parseInt(event.target.value, 10));
|
||||
setPage(0);
|
||||
};
|
||||
|
@ -60,9 +60,9 @@ export let colors = {
|
||||
rep: "#faffdf",
|
||||
};
|
||||
|
||||
export let theme: Theme;
|
||||
let theme: Theme;
|
||||
|
||||
export function refreshTheme() {
|
||||
function refreshTheme() {
|
||||
theme = createTheme({
|
||||
colors: {
|
||||
hp: "#dd3434",
|
||||
|
@ -11,10 +11,6 @@
|
||||
* This formula ensures that the effects of the statistic that is being processed
|
||||
* has diminishing returns, but never loses its effectiveness as you continue
|
||||
* to raise it.
|
||||
*
|
||||
* There are two implementations of this component. One is simply a function that
|
||||
* can be called with the stat and the exponential/linear factors. The other is a
|
||||
* class where the exponential and linear factors are defined upon construction.
|
||||
*/
|
||||
export function calculateEffectWithFactors(n: number, expFac: number, linearFac: number): number {
|
||||
if (expFac <= 0 || expFac >= 1) {
|
||||
@ -26,20 +22,3 @@ export function calculateEffectWithFactors(n: number, expFac: number, linearFac:
|
||||
|
||||
return Math.pow(n, expFac) + n / linearFac;
|
||||
}
|
||||
|
||||
export class EffectWithFactors {
|
||||
// Exponential factor
|
||||
private expFac: number;
|
||||
|
||||
// Linear Factor
|
||||
private linearFac: number;
|
||||
|
||||
constructor(expFac: number, linearFac: number) {
|
||||
this.expFac = expFac;
|
||||
this.linearFac = linearFac;
|
||||
}
|
||||
|
||||
calculate(n: number): number {
|
||||
return calculateEffectWithFactors(n, this.expFac, this.linearFac);
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
|
||||
const UnusedWebpackPlugin = require("unused-webpack-plugin");
|
||||
const ReactRefreshWebpackPlugin = require("@pmmmwh/react-refresh-webpack-plugin");
|
||||
const DeadCodePlugin = require("webpack-deadcode-plugin");
|
||||
|
||||
module.exports = (env, argv) => {
|
||||
const isDevServer = (env || {}).devServer === true;
|
||||
@ -130,6 +131,10 @@ module.exports = (env, argv) => {
|
||||
module: true,
|
||||
}),
|
||||
isDevelopment && new ReactRefreshWebpackPlugin(),
|
||||
new DeadCodePlugin({
|
||||
patterns: ["src/**/*.(js|jsx|css|ts|tsx)"],
|
||||
exclude: ["**/*.(stories|spec).(js|jsx)"],
|
||||
}),
|
||||
].filter(Boolean),
|
||||
target: "web",
|
||||
entry: entry,
|
||||
|
Loading…
Reference in New Issue
Block a user