mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-10-24 02:33:16 +02:00
52a80ad236
* Make command `cd` without arguments an alias for `cd /` (#853) In most shells `cd` without arguments takes you to the home directory of the current user. I keep trying to do this due to muscle memory from working in terminals, so I figured I'd make it do something useful. There is no home directory in the game, but going to / is the closest thing we have, since that is the starting point for the user in the game. * Add new `backdoor` terminal command (#852) * Add the backdoor command to the terminal This command will perform a manual hack without rewarding money. It will be used for the story, mainly for faction hacking tests * Add tab completion for backdoor command * Add help text for backdoor command * Change condition syntax to be more consistent with others * Extract reused code block so it is always called after actions * Update documentation for new backdoor command Modified references to manual hack as it isn't for factions anymore * Remove extra parenthesis * Rename manuallyHacked to backdoorInstalled * Fix typo * Change faction test messages to use backdoor instad of hack * Rename more instances of manuallyHacked * fixed typo in helptext of darkweb buy (#858) * Fix typos and unify descriptions of augmentations (#859) Made an attempt to... - give all "+rep% company/faction" the same text - make all augmentations with a single effect use a single line to describe the effect - make all effects end with a period * Made Cashroot starter kit display its tooltip with the money formatted properly and in gold * fix typo in docs (#860) * Initial code for Casino Card Deck implementation * Casino Blackjack Implementation * Update some tools (eslint, typescript) * Blackjack code cleanup * Update README_contribution * Update ScriptHelpers.js (#861) expand error message * More augmentation typo fixes (#862) * Add Netscript function getCurrentScript (#856) Add netscript function that returns the current script. * Added milestones menu to guide new players. (#865) Milestone menu * fix typos in milestones (#866) Co-authored-by: sschmidTU <s.schmid@phonicscore.com> * Corrupt location title when backdoor is installed (#864) * Add corruptableText component * Corrupt location title if backdoor is installed * Formatting * Add helper to check value of backdoorInstalled Helper could be oneline but it would make it less readable * Fix some formatting * Add settings option to disable text effects * Import useState * getRunningScript (#867) * Replaced getCurrentScript with getRunningScript * Bunch of smaller fixes (#904) Fix #884 Fix #879 Fix #878 Fix #876 Fix #874 Fix #873 Fix #887 Fix #891 Fix #895 * rework the early servers to be more noob friendly (#903) * v0.51.6 Co-authored-by: Andreas Eriksson <2691182+AndreasTPC@users.noreply.github.com> Co-authored-by: Jack <jackdewinter1@gmail.com> Co-authored-by: Teun Pronk <5228255+Crownie88@users.noreply.github.com> Co-authored-by: Pimvgd <Pimvgd@gmail.com> Co-authored-by: Daniel Xie <daniel.xie@flockfreight.com> Co-authored-by: Simon <33069673+sschmidTU@users.noreply.github.com> Co-authored-by: sschmidTU <s.schmid@phonicscore.com>
159 lines
6.9 KiB
TypeScript
159 lines
6.9 KiB
TypeScript
// Implement the collapsible main menu headers
|
|
import { MainMenuLinks } from "./Links";
|
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
|
|
|
interface IMainMenuHeaders {
|
|
Hacking: HTMLElement | null;
|
|
Character: HTMLElement | null;
|
|
World: HTMLElement | null;
|
|
Help: HTMLElement | null;
|
|
}
|
|
|
|
export const MainMenuHeaders: IMainMenuHeaders = {
|
|
Hacking: null,
|
|
Character: null,
|
|
World: null,
|
|
Help: null,
|
|
}
|
|
|
|
// Implements collapsible toggle feature when a header is clicked
|
|
function toggleHeader(open: boolean, elems: HTMLElement[], links: HTMLElement[]) {
|
|
for (var i = 0; i < elems.length; ++i) {
|
|
if (open) {
|
|
elems[i].style.opacity = "1";
|
|
elems[i].style.maxHeight = elems[i].scrollHeight + "px";
|
|
} else {
|
|
elems[i].style.opacity = "0";
|
|
elems[i].style.maxHeight = "";
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < links.length; ++i) {
|
|
if (open) {
|
|
links[i].style.opacity = "1";
|
|
links[i].style.maxHeight = links[i].scrollHeight + "px";
|
|
links[i].style.pointerEvents = "auto";
|
|
} else {
|
|
links[i].style.opacity = "0";
|
|
links[i].style.maxHeight = "";
|
|
links[i].style.pointerEvents = "none";
|
|
}
|
|
}
|
|
}
|
|
|
|
export function initializeMainMenuHeaders(p: IPlayer, dev = false): boolean {
|
|
function safeGetElement(id: string): HTMLElement {
|
|
const elem: HTMLElement | null = document.getElementById(id);
|
|
if (elem == null) {
|
|
throw new Error(`Failed to find element with id ${id} in initializeMainMenuHeaders()`);
|
|
}
|
|
|
|
return elem!;
|
|
}
|
|
|
|
try {
|
|
// Get references to the DOM elements
|
|
MainMenuHeaders.Hacking = safeGetElement("hacking-menu-header");
|
|
MainMenuHeaders.Character = safeGetElement("character-menu-header");
|
|
MainMenuHeaders.World = safeGetElement("world-menu-header");
|
|
MainMenuHeaders.Help = safeGetElement("help-menu-header");
|
|
|
|
// Set click handlers to turn the headers into collapsibles
|
|
MainMenuHeaders.Hacking.onclick = function() {
|
|
const terminal: HTMLElement = safeGetElement("terminal-tab");
|
|
const createScript: HTMLElement = safeGetElement("create-script-tab");
|
|
const activeScripts: HTMLElement = safeGetElement("active-scripts-tab");
|
|
const createProgram: HTMLElement = safeGetElement("create-program-tab");
|
|
const createProgramNot: HTMLElement = safeGetElement("create-program-notification");
|
|
|
|
createProgram.style.display = p.firstProgramAvailable ? "list-item" : "none";
|
|
|
|
(this as any).classList.toggle("opened");
|
|
|
|
const elems: HTMLElement[] = [terminal, createScript, activeScripts, createProgram];
|
|
const links: HTMLElement[] = [MainMenuLinks.Terminal!, MainMenuLinks.ScriptEditor!, MainMenuLinks.ActiveScripts!, MainMenuLinks.CreateProgram!];
|
|
if (terminal.style.maxHeight) {
|
|
toggleHeader(false, elems, links);
|
|
createProgramNot.style.display = "none";
|
|
} else {
|
|
toggleHeader(true, elems, links);
|
|
createProgramNot.style.display = "block"
|
|
}
|
|
}
|
|
|
|
MainMenuHeaders.Character.onclick = function() {
|
|
const stats: HTMLElement = safeGetElement("stats-tab");
|
|
const factions: HTMLElement = safeGetElement("factions-tab");
|
|
const augmentations: HTMLElement = safeGetElement("augmentations-tab");
|
|
const hacknetnodes: HTMLElement = safeGetElement("hacknet-nodes-tab");
|
|
const sleeves: HTMLElement = safeGetElement("sleeves-tab");
|
|
|
|
sleeves.style.display = p.sleeves.length > 0 ? "list-item" : "none";
|
|
|
|
(this as any).classList.toggle("opened");
|
|
|
|
const elems: HTMLElement[] = [stats, factions, augmentations, hacknetnodes, sleeves];
|
|
const links: HTMLElement[] = [MainMenuLinks.Stats!, MainMenuLinks.Factions!, MainMenuLinks.Augmentations!, MainMenuLinks.HacknetNodes!, MainMenuLinks.Sleeves!];
|
|
if (stats.style.maxHeight) {
|
|
toggleHeader(false, elems, links);
|
|
} else {
|
|
toggleHeader(true, elems, links);
|
|
}
|
|
}
|
|
|
|
MainMenuHeaders.World.onclick = function() {
|
|
const city: HTMLElement = safeGetElement("city-tab");
|
|
const travel: HTMLElement = safeGetElement("travel-tab");
|
|
const job: HTMLElement = safeGetElement("job-tab");
|
|
const stockmarket: HTMLElement = safeGetElement("stock-market-tab");
|
|
const bladeburner: HTMLElement = safeGetElement("bladeburner-tab");
|
|
const corporation: HTMLElement = safeGetElement("corporation-tab");
|
|
const gang: HTMLElement = safeGetElement("gang-tab");
|
|
|
|
// Determine whether certain links should show up
|
|
job.style.display = p.companyName !== "" ? "list-item" : "none";
|
|
stockmarket.style.display = p.hasWseAccount ? "list-item" : "none";
|
|
bladeburner.style.display = p.inBladeburner() ? "list-item" : "none";
|
|
corporation.style.display = p.hasCorporation() ? "list-item" : "none";
|
|
gang.style.display = p.inGang() ? "list-item" : "none";
|
|
|
|
(this as any).classList.toggle("opened");
|
|
|
|
const elems: HTMLElement[] = [city, travel, job, stockmarket, bladeburner, corporation, gang];
|
|
const links: HTMLElement[] = [MainMenuLinks.City!, MainMenuLinks.Travel!, MainMenuLinks.Job!, MainMenuLinks.StockMarket!, MainMenuLinks.Bladeburner!, MainMenuLinks.Corporation!, MainMenuLinks.Gang!];
|
|
if (city.style.maxHeight) {
|
|
toggleHeader(false, elems, links);
|
|
} else {
|
|
toggleHeader(true, elems, links);
|
|
}
|
|
}
|
|
|
|
MainMenuHeaders.Help.onclick = function() {
|
|
const milestones: HTMLElement = safeGetElement("milestones-tab");
|
|
const tutorial: HTMLElement = safeGetElement("tutorial-tab");
|
|
const options: HTMLElement = safeGetElement("options-tab");
|
|
|
|
(this as any).classList.toggle("opened");
|
|
|
|
const elems: HTMLElement[] = [milestones, tutorial, options];
|
|
const links: HTMLElement[] = [MainMenuLinks.Milestones!, MainMenuLinks.Tutorial!, MainMenuLinks.Options!];
|
|
|
|
if (dev) {
|
|
elems.push(safeGetElement("dev-tab"));
|
|
links.push(safeGetElement("dev-menu-link"));
|
|
}
|
|
|
|
if (tutorial.style.maxHeight) {
|
|
toggleHeader(false, elems, links);
|
|
} else {
|
|
toggleHeader(true, elems, links);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
} catch(e) {
|
|
console.error(`Failed to initialize Main Menu Headers: ${e}`);
|
|
return false;
|
|
}
|
|
}
|