Converted Programs and DarkWeb implementations to Typescript

This commit is contained in:
danielyxie 2018-12-25 02:14:18 -08:00
parent 4383d1393d
commit 928faa5b4c
18 changed files with 2905 additions and 2645 deletions

3852
dist/engine.bundle.js vendored

File diff suppressed because it is too large Load Diff

1095
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -1,159 +0,0 @@
import {CONSTANTS} from "./Constants";
import {Player} from "./Player";
import {createElement} from "../utils/uiHelpers/createElement";
// a function that returns a requirement for a program that requires only that
// the player has at least the given skill level.
function requireLevel(lvl) {
return function() {
return Player.hacking_skill >= lvl;
}
}
function Program(name, create) {
this.name = name;
this.create = create;
}
Program.prototype.htmlID = function() {
const name = this.name.endsWith('.exe') ? this.name.slice(0, -('.exe'.length)) : this.name;
return "create-program-"+name;
}
/* Create programs */
const Programs = {
NukeProgram: new Program("NUKE.exe", {
level: 1,
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
req: requireLevel(1),
time: CONSTANTS.MillisecondsPerFiveMinutes,
}),
BruteSSHProgram: new Program("BruteSSH.exe", {
level: 50,
tooltip:"This program executes a brute force attack that opens SSH ports",
req: requireLevel(50),
time: CONSTANTS.MillisecondsPerFiveMinutes * 2,
}),
FTPCrackProgram: new Program("FTPCrack.exe", {
level: 100,
tooltip:"This program cracks open FTP ports",
req: requireLevel(100),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
RelaySMTPProgram: new Program("relaySMTP.exe", {
level: 250,
tooltip:"This program opens SMTP ports by redirecting data",
req: requireLevel(250),
time: CONSTANTS.MillisecondsPer2Hours,
}),
HTTPWormProgram: new Program("HTTPWorm.exe", {
level: 500,
tooltip:"This virus opens up HTTP ports",
req: requireLevel(500),
time: CONSTANTS.MillisecondsPer4Hours,
}),
SQLInjectProgram: new Program("SQLInject.exe", {
level: 750,
tooltip:"This virus opens SQL ports",
req: requireLevel(750),
time: CONSTANTS.MillisecondsPer8Hours,
}),
DeepscanV1: new Program("DeepscanV1.exe", {
level: 75,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 5",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
DeepscanV2: new Program("DeepscanV2.exe", {
level: 400,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 10",
req: requireLevel(400),
time: CONSTANTS.MillisecondsPer2Hours,
}),
ServerProfiler: new Program("ServerProfiler.exe", {
level: 75,
tooltip:"This program is used to display hacking and Netscript-related information about servers",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
AutoLink: new Program("AutoLink.exe", {
level: 25,
tooltip:"This program allows you to directly connect to other servers through the 'scan-analyze' command",
req: requireLevel(25),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
BitFlume: new Program("b1t_flum3.exe", {
level: 1,
tooltip:"This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)",
req: function() {return Player.sourceFiles.length > 0 && Player.hacking_skill >= 1},
time: CONSTANTS.MillisecondsPerFiveMinutes / 20,
}),
// special because you can't create it.
Flight: new Program("fl1ght.exe"),
};
// this has the same key as 'Programs', not program names
const aLinks = {};
function displayCreateProgramContent() {
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].style.display = "none";
if(!Player.hasProgram(p.name) && p.create.req()){
aLinks[key].style.display = "inline-block";
}
}
}
//Returns the number of programs that are currently available to be created
function getNumAvailableCreateProgram() {
var count = 0;
for(const key in Programs) {
if(Programs[key].create === undefined) { // a program we can't create
continue
}
if(Player.hasProgram(Programs[key].name)) { // can't create it twice
continue
}
if(!Programs[key].create.req()) { // if you don't fullfill the creation requirement
continue
}
count++;
}
if (Player.firstProgramAvailable === false && count > 0) {
Player.firstProgramAvailable = true;
document.getElementById("create-program-tab").style.display = "list-item";
document.getElementById("hacking-menu-header").click();
document.getElementById("hacking-menu-header").click();
}
return count;
}
function initCreateProgramButtons() {
var createProgramList = document.getElementById("create-program-list");
for(const key in Programs) {
if(Programs[key].create === undefined) {
continue
}
const elem = createElement("a", {
class: "a-link-button", id: Programs[key].htmlID(), innerText: Programs[key].name,
tooltip: Programs[key].create.tooltip,
});
aLinks[key] = elem;
createProgramList.appendChild(elem);
}
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].addEventListener("click", function() {
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
return false;
});
}
}
export {Programs, displayCreateProgramContent, getNumAvailableCreateProgram,
initCreateProgramButtons};

@ -1,15 +1,14 @@
import {Programs} from "./CreateProgram";
import {Player} from "./Player";
import {SpecialServerIps} from "./SpecialServerIps";
import {post} from "./ui/postToTerminal";
import { DarkWebItems } from "./DarkWebItems";
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
import {formatNumber} from "../utils/StringHelperFunctions";
import { Player } from "../Player";
import { SpecialServerIps } from "../SpecialServerIps";
import { post } from "../ui/postToTerminal";
import { isValidIPAddress } from "../../utils/helpers/isValidIPAddress";
import { formatNumber } from "../../utils/StringHelperFunctions";
/* DarkWeb.js */
//Posts a "help" message if connected to DarkWeb
function checkIfConnectedToDarkweb() {
export function checkIfConnectedToDarkweb() {
if (SpecialServerIps.hasOwnProperty("Darkweb Server")) {
var darkwebIp = SpecialServerIps["Darkweb Server"];
if (!isValidIPAddress(darkwebIp)) {return;}
@ -24,7 +23,7 @@ function checkIfConnectedToDarkweb() {
//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
function executeDarkwebTerminalCommand(commandArray) {
export function executeDarkwebTerminalCommand(commandArray) {
if (commandArray.length == 0) {return;}
switch (commandArray[0]) {
case "buy":
@ -87,30 +86,5 @@ function buyDarkwebItem(itemName) {
// buy and push
Player.loseMoney(item.price);
Player.getHomeComputer().programs.push(item.program);
post('You have purchased the '+item.program+' program. The new program can be found on your home computer.');
post('You have purchased the ' + item.program + ' program. The new program can be found on your home computer.');
}
function DarkWebItem(program, price, description) {
this.program = program;
this.price = price;
this.description = description;
}
// formats the item for the terminal (eg. "BruteSSH.exe - $500,000 - Opens up SSH Ports")
DarkWebItem.prototype.toString = function() {
return [this.program, "$"+formatNumber(this.price), this.description].join(' - ');
}
const DarkWebItems = {
BruteSSHProgram: new DarkWebItem(Programs.BruteSSHProgram.name, 500000, "Opens up SSH Ports"),
FTPCrackProgram: new DarkWebItem(Programs.FTPCrackProgram.name, 1500000, "Opens up FTP Ports"),
RelaySMTPProgram: new DarkWebItem(Programs.RelaySMTPProgram.name, 5000000, "Opens up SMTP Ports"),
HTTPWormProgram: new DarkWebItem(Programs.HTTPWormProgram.name, 30000000, "Opens up HTTP Ports"),
SQLInjectProgram: new DarkWebItem(Programs.SQLInjectProgram.name, 250000000, "Opens up SQL Ports"),
DeepscanV1: new DarkWebItem(Programs.DeepscanV1.name, 500000, "Enables 'scan-analyze' with a depth up to 5"),
DeepscanV2: new DarkWebItem(Programs.DeepscanV2.name, 25000000, "Enables 'scan-analyze' with a depth up to 10"),
AutolinkProgram: new DarkWebItem(Programs.AutoLink.name, 1000000, "Enables direct connect via 'scan-analyze'"),
};
export {checkIfConnectedToDarkweb, executeDarkwebTerminalCommand, DarkWebItems};

@ -0,0 +1,18 @@
import { formatNumber } from "../../utils/StringHelperFunctions";
export class DarkWebItem {
program: string;
price: number;
description: string;
constructor(program: string, price: number, description: string) {
this.program = program;
this.price = price;
this.description = description;
}
// Formats the item to print out to terminal (e.g. BruteSSH.exe -$500,000 - Opens up SSH Ports)
toString(): string {
return [this.program, "$" + formatNumber(this.price, 0), this.description].join(' - ');
}
}

@ -0,0 +1,14 @@
import { DarkWebItem } from "./DarkWebItem";
import { IMap } from "../types";
import { Programs } from "../Programs/Programs";
export const DarkWebItems: IMap<DarkWebItem> = {
BruteSSHProgram: new DarkWebItem(Programs.BruteSSHProgram.name, 500000, "Opens up SSH Ports"),
FTPCrackProgram: new DarkWebItem(Programs.FTPCrackProgram.name, 1500000, "Opens up FTP Ports"),
RelaySMTPProgram: new DarkWebItem(Programs.RelaySMTPProgram.name, 5000000, "Opens up SMTP Ports"),
HTTPWormProgram: new DarkWebItem(Programs.HTTPWormProgram.name, 30000000, "Opens up HTTP Ports"),
SQLInjectProgram: new DarkWebItem(Programs.SQLInjectProgram.name, 250000000, "Opens up SQL Ports"),
DeepscanV1: new DarkWebItem(Programs.DeepscanV1.name, 500000, "Enables 'scan-analyze' with a depth up to 5"),
DeepscanV2: new DarkWebItem(Programs.DeepscanV2.name, 25000000, "Enables 'scan-analyze' with a depth up to 10"),
AutolinkProgram: new DarkWebItem(Programs.AutoLink.name, 1000000, "Enables direct connect via 'scan-analyze'"),
};

@ -1,6 +1,6 @@
import { AugmentationNames } from "./Augmentations";
import { generateRandomContract } from "./CodingContractGenerator";
import { Programs } from "./CreateProgram";
import { Programs } from "./Programs/Programs";
import { Factions } from "./Faction/Factions";
import { Player } from "./Player";
import { AllServers } from "./Server";

@ -1,12 +1,14 @@
import {Augmentations, Augmentation,
AugmentationNames} from "./Augmentations";
import {Programs} from "./CreateProgram";
import {inMission} from "./Missions";
import {Player} from "./Player";
import {redPillFlag} from "./RedPill";
import {GetServerByHostname} from "./Server";
import {Settings} from "./Settings";
import {dialogBoxCreate, dialogBoxOpened} from "../utils/DialogBox";
import { Augmentations,
Augmentation,
AugmentationNames } from "./Augmentations";
import { Programs } from "./Programs/Programs";
import { inMission } from "./Missions";
import { Player } from "./Player";
import { redPillFlag } from "./RedPill";
import { GetServerByHostname } from "./Server";
import { Settings } from "./Settings";
import { dialogBoxCreate,
dialogBoxOpened} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";

@ -13,8 +13,7 @@ import {Companies, companyExists} from "./Company/Companies";
import {CompanyPosition} from "./Company/CompanyPosition";
import {CompanyPositions} from "./Company/CompanyPositions";
import {CONSTANTS} from "./Constants";
import {Programs} from "./CreateProgram";
import {DarkWebItems} from "./DarkWeb";
import { DarkWebItems } from "./DarkWeb/DarkWebItems";
import {calculateHackingChance,
calculateHackingExpGain,
calculatePercentMoneyHacked,
@ -33,6 +32,7 @@ import {Locations} from "./Locations";
import {Message, Messages} from "./Message";
import {inMission} from "./Missions";
import {Player} from "./Player";
import { Programs } from "./Programs/Programs";
import {Script, findRunningScript, RunningScript,
isScriptFilename} from "./Script";
import {Server, getServer, AddToAllServers,

@ -1,17 +1,18 @@
import {Augmentations, applyAugmentation,
AugmentationNames,
PlayerOwnedAugmentation} from "./Augmentations";
import {BitNodeMultipliers} from "./BitNodeMultipliers";
import {CodingContractRewardType} from "./CodingContracts";
import {Company} from "./Company/Company";
import {Companies} from "./Company/Companies";
import {getNextCompanyPosition} from "./Company/GetNextCompanyPosition";
import {getJobRequirementText} from "./Company/GetJobRequirementText";
import {CompanyPositions} from "./Company/CompanyPositions";
import { Augmentations,
applyAugmentation,
AugmentationNames,
PlayerOwnedAugmentation } from "./Augmentations";
import { BitNodeMultipliers } from "./BitNodeMultipliers";
import { CodingContractRewardType } from "./CodingContracts";
import { Company } from "./Company/Company";
import { Companies } from "./Company/Companies";
import { getNextCompanyPosition } from "./Company/GetNextCompanyPosition";
import { getJobRequirementText } from "./Company/GetJobRequirementText";
import { CompanyPositions } from "./Company/CompanyPositions";
import * as posNames from "./Company/data/CompanyPositionNames";
import {CONSTANTS} from "./Constants";
import { Corporation } from "./Corporation/Corporation";
import {Programs} from "./CreateProgram";
import { Programs } from "./Programs/Programs";
import {determineCrimeSuccess, Crimes} from "./Crimes";
import {Engine} from "./engine";
import { Faction } from "./Faction/Faction";

@ -5,7 +5,7 @@ import {initBitNodeMultipliers} from "./BitNode";
import {Bladeburner} from "./Bladeburner";
import {writeCinematicText} from "./CinematicText";
import {Companies, initCompanies} from "./Company/Companies";
import {Programs} from "./CreateProgram";
import { Programs } from "./Programs/Programs";
import {Engine} from "./engine";
import { Faction } from "./Faction/Faction";
import { Factions,

26
src/Programs/Program.ts Normal file

@ -0,0 +1,26 @@
export interface IPlayer {
hacking_skill: number;
sourceFiles: any[];
}
export interface IProgramCreate {
level: number;
req(p: IPlayer): boolean; // Function that indicates whether player meets requirements
time: number;
tooltip: string;
}
export class Program {
name: string = "";
create: IProgramCreate | null;
constructor(name: string, create: IProgramCreate | null) {
this.name = name;
this.create = create;
}
htmlID(): string {
const name = this.name.endsWith('.exe') ? this.name.slice(0, -('.exe'.length)) : this.name;
return "create-program-" + name;
}
}

@ -0,0 +1,75 @@
import { Programs } from "./Programs";
import { CONSTANTS } from "../Constants";
import { Player } from "../Player";
import { createElement } from "../../utils/uiHelpers/createElement";
// this has the same key as 'Programs', not program names
const aLinks = {};
function displayCreateProgramContent() {
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].style.display = "none";
if(!Player.hasProgram(p.name) && p.create.req(Player)){
aLinks[key].style.display = "inline-block";
}
}
}
//Returns the number of programs that are currently available to be created
function getNumAvailableCreateProgram() {
var count = 0;
for (const key in Programs) {
// Non-creatable program
if (Programs[key].create == null) {
continue;
}
// Already has program
if (Player.hasProgram(Programs[key].name)) {
continue;
}
// Does not meet requirements
if (!Programs[key].create.req(Player)) {
continue;
}
count++;
}
if (Player.firstProgramAvailable === false && count > 0) {
Player.firstProgramAvailable = true;
document.getElementById("create-program-tab").style.display = "list-item";
document.getElementById("hacking-menu-header").click();
document.getElementById("hacking-menu-header").click();
}
return count;
}
function initCreateProgramButtons() {
const createProgramList = document.getElementById("create-program-list");
for (const key in Programs) {
if(Programs[key].create === null) {
continue;
}
const elem = createElement("a", {
class: "a-link-button", id: Programs[key].htmlID(), innerText: Programs[key].name,
tooltip: Programs[key].create.tooltip,
});
aLinks[key] = elem;
createProgramList.appendChild(elem);
}
for (const key in aLinks) {
const p = Programs[key]
aLinks[key].addEventListener("click", function() {
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
return false;
});
}
}
export {displayCreateProgramContent, getNumAvailableCreateProgram,
initCreateProgramButtons};

10
src/Programs/Programs.ts Normal file

@ -0,0 +1,10 @@
import { Program } from "./Program";
import { IProgramCreationParams,
programsMetadata } from "./data/programsMetadata";
import { IMap } from "../types";
export const Programs: IMap<Program> = {};
for (const params of programsMetadata) {
Programs[params.key] = new Program(params.name, params.create);
}

@ -0,0 +1,139 @@
import { IPlayer,
IProgramCreate } from "../Program";
import { CONSTANTS } from "../../Constants";
function requireHackingLevel(lvl: number) {
return function(p: IPlayer) {
return p.hacking_skill >= lvl;
}
}
function bitFlumeRequirements() {
return function(p: IPlayer) {
return p.sourceFiles.length > 0 && p.hacking_skill >= 1;
}
}
export interface IProgramCreationParams {
key: string;
name: string;
create: IProgramCreate | null;
}
export const programsMetadata: IProgramCreationParams[] = [
{
key: "NukeProgram",
name: "NUKE.exe",
create: {
level: 1,
tooltip: "This virus is used to gain root access to a machine if enough ports are opened.",
req: requireHackingLevel(1),
time: CONSTANTS.MillisecondsPerFiveMinutes,
},
},
{
key: "BruteSSHProgram",
name: "BruteSSH.exe",
create: {
level: 50,
tooltip: "This program executes a brute force attack that opens SSH ports",
req: requireHackingLevel(50),
time: CONSTANTS.MillisecondsPerFiveMinutes * 2,
},
},
{
key: "FTPCrackProgram",
name: "FTPCrack.exe",
create: {
level: 100,
tooltip: "This program cracks open FTP ports",
req: requireHackingLevel(100),
time: CONSTANTS.MillisecondsPerHalfHour,
},
},
{
key: "RelaySMTPProgram",
name: "relaySMTP.exe",
create: {
level: 250,
tooltip: "This program opens SMTP ports by redirecting data",
req: requireHackingLevel(250),
time: CONSTANTS.MillisecondsPer2Hours,
},
},
{
key: "HTTPWormProgram",
name: "HTTPWorm.exe",
create: {
level: 500,
tooltip: "This virus opens up HTTP ports",
req: requireHackingLevel(500),
time: CONSTANTS.MillisecondsPer4Hours,
},
},
{
key: "SQLInjectProgram",
name: "SQLInject.exe",
create: {
level: 750,
tooltip: "This virus opens SQL ports",
req: requireHackingLevel(750),
time: CONSTANTS.MillisecondsPer8Hours,
},
},
{
key: "DeepscanV1",
name: "DeepscanV1.exe",
create: {
level: 75,
tooltip: "This program allows you to use the scan-analyze command with a depth up to 5",
req: requireHackingLevel(75),
time: CONSTANTS.MillisecondsPerQuarterHour,
},
},
{
key: "DeepscanV2",
name: "DeepscanV2.exe",
create: {
level: 400,
tooltip: "This program allows you to use the scan-analyze command with a depth up to 10",
req: requireHackingLevel(400),
time: CONSTANTS.MillisecondsPer2Hours,
},
},
{
key: "ServerProfiler",
name: "ServerProfiler.exe",
create: {
level: 75,
tooltip: "This program is used to display hacking and Netscript-related information about servers",
req: requireHackingLevel(75),
time: CONSTANTS.MillisecondsPerHalfHour,
},
},
{
key: "AutoLink",
name: "AutoLink.exe",
create: {
level: 25,
tooltip: "This program allows you to directly connect to other servers through the 'scan-analyze' command",
req: requireHackingLevel(25),
time: CONSTANTS.MillisecondsPerQuarterHour,
},
},
{
key: "BitFlume",
name: "b1t_flum3.exe",
create: {
level: 1,
tooltip: "This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)",
req: bitFlumeRequirements(),
time: CONSTANTS.MillisecondsPerFiveMinutes / 20,
},
},
{
key: "Flight",
name: "fl1ght.exe",
create: null,
},
];

@ -1,17 +1,21 @@
import {BitNodeMultipliers} from "./BitNodeMultipliers";
import {CodingContract, ContractTypes} from "./CodingContracts";
import {CONSTANTS} from "./Constants";
import {Script, isScriptFilename} from "./Script";
import {Programs} from "./CreateProgram";
import {Player} from "./Player";
import {SpecialServerIps} from "./SpecialServerIps";
import {TextFile} from "./TextFile";
import {getRandomInt} from "../utils/helpers/getRandomInt";
import {createRandomIp, ipExists} from "../utils/IPAddress";
import {serverMetadata} from "./data/servers";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
import { BitNodeMultipliers } from "./BitNodeMultipliers";
import { CodingContract,
ContractTypes } from "./CodingContracts";
import { CONSTANTS } from "./Constants";
import { Script,
isScriptFilename } from "./Script";
import { Player } from "./Player";
import { Programs } from "./Programs/Programs";
import { SpecialServerIps } from "./SpecialServerIps";
import { TextFile } from "./TextFile";
import { getRandomInt } from "../utils/helpers/getRandomInt";
import { createRandomIp,
ipExists } from "../utils/IPAddress";
import { serverMetadata } from "./data/servers";
import { Reviver,
Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
function Server(params={ip:createRandomIp(), hostname:""}) {
/* Properties */

@ -5,11 +5,11 @@ import {substituteAliases, printAliases,
import {CodingContract, CodingContractResult,
CodingContractRewardType} from "./CodingContracts";
import {CONSTANTS} from "./Constants";
import {Programs} from "./CreateProgram";
import {executeDarkwebTerminalCommand,
checkIfConnectedToDarkweb,
DarkWebItems} from "./DarkWeb";
import {Engine} from "./engine";
import { Programs } from "./Programs/Programs";
import { executeDarkwebTerminalCommand,
checkIfConnectedToDarkweb } from "./DarkWeb/DarkWeb";
import { DarkWebItems } from "./DarkWeb/DarkWebItems";
import {Engine} from "./engine";
import {FconfSettings, parseFconfSettings,
createFconf} from "./Fconf";
import {calculateHackingChance,

@ -1,11 +1,12 @@
import {dialogBoxCreate} from "../utils/DialogBox";
import {gameOptionsBoxOpen, gameOptionsBoxClose} from "../utils/GameOptions";
import { dialogBoxCreate} from "../utils/DialogBox";
import { gameOptionsBoxClose,
gameOptionsBoxOpen} from "../utils/GameOptions";
import { getRandomInt } from "../utils/helpers/getRandomInt";
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
import {createElement} from "../utils/uiHelpers/createElement";
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
import {removeLoadingScreen} from "../utils/uiHelpers/removeLoadingScreen";
import { removeChildrenFromElement } from "../utils/uiHelpers/removeChildrenFromElement";
import { clearEventListeners } from "../utils/uiHelpers/clearEventListeners";
import { createElement } from "../utils/uiHelpers/createElement";
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
import { removeLoadingScreen } from "../utils/uiHelpers/removeLoadingScreen";
import {numeralWrapper} from "./ui/numeralFormat";
@ -29,10 +30,8 @@ import {CompanyPositions} from "./Company/CompanyP
import {initCompanies} from "./Company/Companies";
import { Corporation } from "./Corporation/Corporation";
import {CONSTANTS} from "./Constants";
import {displayCreateProgramContent,
getNumAvailableCreateProgram,
initCreateProgramButtons,
Programs} from "./CreateProgram";
import {createDevMenu, closeDevMenu} from "./DevMenu";
import { Factions, initFactions } from "./Faction/Factions";
import { displayFactionContent, joinFaction,
@ -55,6 +54,10 @@ import {updateOnlineScriptTimes,
import {Player} from "./Player";
import {prestigeAugmentation,
prestigeSourceFile} from "./Prestige";
import { Programs } from "./Programs/Programs";
import { displayCreateProgramContent,
getNumAvailableCreateProgram,
initCreateProgramButtons } from "./Programs/ProgramHelpers";
import {redPillFlag, hackWorldDaemon} from "./RedPill";
import {saveObject, loadGame} from "./SaveObject";
import {loadAllRunningScripts, scriptEditorInit,