mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-18 05:33:54 +01:00
Refactored Code using Bluebird Promises. Still has memory issues. Added Buy Max and Sell All to stock market UI
This commit is contained in:
parent
7c4ac00f5a
commit
52967d7f9d
11337
dist/bundle.js
vendored
11337
dist/bundle.js
vendored
File diff suppressed because one or more lines are too long
@ -1,3 +1,6 @@
|
||||
import {Locations} from "./src/Location.js";
|
||||
import {getRandomInt} from "../utils/HelperFunctions.js";
|
||||
|
||||
/*
|
||||
Products
|
||||
For certain industries, players can creat their own custom products
|
||||
@ -204,3 +207,201 @@ Industries:
|
||||
will fluctuate based on company performance. Then you can sell whatever
|
||||
shares you have left on the stock market.
|
||||
*/
|
||||
var TOTALSHARES = 1000000000; //Total number of shares you have at your company
|
||||
|
||||
var Materials = {
|
||||
Water: 11,
|
||||
Energy: 12,
|
||||
Food: 13,
|
||||
Plants: 14,
|
||||
Metal: 15,
|
||||
Hardware: 16,
|
||||
Chemicals: 17,
|
||||
RealEstate: 18,
|
||||
Drugs: 19,
|
||||
Robots: 20,
|
||||
AICores:21,
|
||||
SciResearch: 22
|
||||
}
|
||||
|
||||
function Material(params={}) {
|
||||
this.name = params.name ? params.name : "";
|
||||
this.qty = 0;
|
||||
this.qlt = 0;
|
||||
this.dmd = 0;
|
||||
this.cmp = 0;
|
||||
this.mku = 0;
|
||||
|
||||
//How much space it takes in a Warehouse
|
||||
this.siz = params.size ? params.size : 0;
|
||||
|
||||
this.purc = 0; //How much of this material is being purchased per second
|
||||
this.cost = 0; //$ Cost per material
|
||||
|
||||
this.req = params.req ? params.req : [];
|
||||
}
|
||||
|
||||
function Product(params={}) {
|
||||
"use strict"
|
||||
this.name = params.name ? params.name : 0;
|
||||
this.dmd = params.demand ? params.demand : 0;
|
||||
this.cmp = params.competition ? params.competition : 0;
|
||||
this.mku = params.markup ? params.markup : 0;
|
||||
this.qlt = params.quality ? params.quality : 0;
|
||||
this.qty = 0;
|
||||
this.per = params.performance ? params.performance : 0;
|
||||
this.dur = params.durability ? params.durability : 0;
|
||||
this.rel = params.reliability ? params.reliability : 0;
|
||||
this.aes = params.aesthetics ? params.aesthetics : 0;
|
||||
this.fea = params.features ? params.features : 0;
|
||||
this.loc = params.location ? params.location : "";
|
||||
this.siz = params.size ? params.size : 0; //How much space it takes in the warehouse
|
||||
|
||||
//Material requirements. An object that maps the name of a material to how much it requires
|
||||
this.req = params.req ? params.req : {};
|
||||
}
|
||||
|
||||
var Industries = {
|
||||
Energy: 50,
|
||||
Utilities: 51,
|
||||
Agriculture: 52,
|
||||
Fishing: 53,
|
||||
Mining: 54,
|
||||
Food: 55,
|
||||
Tobacco: 56,
|
||||
Chemical: 57,
|
||||
Pharmaceutical: 58,
|
||||
Computer: 59,
|
||||
Robotics: 60,
|
||||
Software: 61,
|
||||
Healthcare: 62,
|
||||
RealEstate: 63,
|
||||
}
|
||||
|
||||
function Industry(params={}) {
|
||||
"use strict"
|
||||
this.offices = { //Maps locations to offices. 0 if no office at that location
|
||||
Locations.Aevum: 0,
|
||||
Locations.Chonqing: 0,
|
||||
Locations.Sector12: 0,
|
||||
Locations.NewTokyo: 0,
|
||||
Locations.Ishima: 0,
|
||||
Locations.Volhaven: 0
|
||||
};
|
||||
|
||||
this.warehouses = { //Maps locations to warehouses. 0 if no warehouse at that location
|
||||
Locations.Aevum: 0,
|
||||
Locations.Chonqing: 0,
|
||||
Locations.Sector12: 0,
|
||||
Locations.NewTokyo: 0,
|
||||
Locations.Ishima: 0,
|
||||
Locations.Volhaven: 0
|
||||
};
|
||||
|
||||
this.type = params.type ? params.type : 0;
|
||||
this.materials = {};
|
||||
this.products = {};
|
||||
|
||||
this.awareness = 0;
|
||||
this.popularity = 0;
|
||||
this.startingCost = 0;
|
||||
|
||||
/* The following are factors for how much production/other things are increased by
|
||||
different factors. The production increase always has diminishing returns,
|
||||
and they are all reprsented by inverse exponentials.
|
||||
The number for these properties represent the denominator in the inverse
|
||||
exponential (aka higher number = more diminishing returns); */
|
||||
this.reFac = 0; //Real estate Factor
|
||||
this.sciFac = 0; //Scientific Research Factor
|
||||
this.hwFac = 0; //Hardware factor
|
||||
this.robFac = 0; //Robotics Factor
|
||||
this.aiFac = 0; //AI Cores factor;
|
||||
this.advFac = 0; //Advertising factor
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
Industry.prototype.init = function() {
|
||||
//Set the unique properties of an industry (how much its affected by real estate/scientific research, etc.)
|
||||
switch (this.type) {
|
||||
case Industries.Energy:
|
||||
break;
|
||||
case Industries.Utilities:
|
||||
break;
|
||||
case Industries.Agriculture:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var EmployeePositions = {
|
||||
Operations: 1,
|
||||
Engineer: 2,
|
||||
Business: 3,
|
||||
Accounting: 4,
|
||||
Management: 5,
|
||||
RandD: 6
|
||||
}
|
||||
|
||||
function Employee(params={}) {
|
||||
"use strict"
|
||||
if (!(this instanceof Employee)) {
|
||||
return new Employee(params);
|
||||
}
|
||||
this.name = params.name ? params.name : "Bobby";
|
||||
this.mor = params.morale ? params.morale : getRandomInt(50, 100);
|
||||
this.hap = params.happiness ? params.happiness : getRandomInt(50, 100);
|
||||
this.ene = params.energy ? params.energy : getRandomInt(50, 100);
|
||||
this.age = params.age ? params.age : getRandomInt(20, 50);
|
||||
this.int = params.intelligence ? params.intelligence : getRandomInt(10, 50);
|
||||
this.cha = params.charisma ? params.charisma : getRandomInt(10, 50);
|
||||
this.exp = params.experience ? params.experience : getRandomInt(10, 50);
|
||||
this.cre = params.creativity ? params.creativity : getRandomInt(10, 50);
|
||||
this.eff = params.efficiency ? params.efficiency : getRandomInt(10, 50);
|
||||
this.sal = params.salary ? params.salary : getRandomInt(0.1, 5);
|
||||
this.pro = 0; //Calculated
|
||||
|
||||
this.off = params.officeSpace ? params.officeSpace : {};
|
||||
this.loc = params.officeSpace ? params.officeSpace.loc : "";
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
var OfficeSpaceTiers = {
|
||||
Basic: 7,
|
||||
Enhanced: 8,
|
||||
Luxurious: 9,
|
||||
Extravagant: 10
|
||||
}
|
||||
|
||||
function OfficeSpace(params={}) {
|
||||
"use strict"
|
||||
this.loc = params.loc ? params.loc : "";
|
||||
this.cost = params.cost ? params.cost : 1;
|
||||
this.size = params.size ? params.size : 1;
|
||||
this.comf = params.comfort ? params.comfort : 1;
|
||||
this.beau = parms.beauty ? params.beauty : 1;
|
||||
this.tier = OfficeSpaceTiers.Basic;
|
||||
this.employees = [];
|
||||
}
|
||||
|
||||
function Warehouse(params={}) {
|
||||
"use strict"
|
||||
this.loc = params.loc ? params.loc : "";
|
||||
this.size = params.size ? params.size : 0;
|
||||
|
||||
this.materials = {};
|
||||
this.products = {};
|
||||
}
|
||||
|
||||
function Company() {
|
||||
"use strict"
|
||||
|
||||
this.industries = [];
|
||||
|
||||
//Financial stats
|
||||
this.funds = 0;
|
||||
this.revenue = 0;
|
||||
this.expenses = 0;
|
||||
this.valuation = 0; //Private investory valuation of company before you go public.
|
||||
this.numShares = TOTALSHARES;
|
||||
this.sharePrice = 0;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -30,6 +30,7 @@ import {getCostOfNextHacknetNode,
|
||||
purchaseHacknet} from "./HacknetNode.js";
|
||||
import {Locations} from "./Location.js";
|
||||
import {Message, Messages} from "./Message.js";
|
||||
import {inMission} from "./Missions.js";
|
||||
import {Player} from "./Player.js";
|
||||
import {Script, findRunningScript, RunningScript} from "./Script.js";
|
||||
import {Server, getServer, AddToAllServers,
|
||||
@ -59,6 +60,9 @@ import {dialogBoxCreate} from "../utils/DialogBox.js"
|
||||
import {printArray, powerOfTwo} from "../utils/HelperFunctions.js";
|
||||
import {createRandomIp} from "../utils/IPAddress.js";
|
||||
import {formatNumber, isString, isHTML} from "../utils/StringHelperFunctions.js";
|
||||
import {yesNoBoxClose, yesNoBoxGetYesButton,
|
||||
yesNoBoxGetNoButton, yesNoBoxCreate,
|
||||
yesNoBoxOpen} from "../utils/YesNoBox.js";
|
||||
|
||||
var hasSingularitySF=false, hasAISF=false, hasBn11SF=false, hasWallStreetSF=false;
|
||||
var singularitySFLvl=1, wallStreetSFLvl=1;
|
||||
@ -1346,15 +1350,22 @@ function NetscriptFunctions(workerScript) {
|
||||
getTimeSinceLastAug : function() {
|
||||
return Player.playtimeSinceLastAug;
|
||||
},
|
||||
confirm : function(txt) {
|
||||
|
||||
},
|
||||
|
||||
/* Singularity Functions */
|
||||
universityCourse(universityName, className) {
|
||||
universityCourse : function(universityName, className) {
|
||||
if (Player.bitNodeN != 4) {
|
||||
if (!(hasSingularitySF && singularitySFLvl >= 1)) {
|
||||
throw makeRuntimeRejectMsg(workerScript, "Cannot run universityCourse(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
if (Player.isWorking) {
|
||||
var txt = Player.singularityStopWork();
|
||||
workerScript.scriptRef.log(txt);
|
||||
@ -1423,13 +1434,17 @@ function NetscriptFunctions(workerScript) {
|
||||
return true;
|
||||
},
|
||||
|
||||
gymWorkout(gymName, stat) {
|
||||
gymWorkout : function(gymName, stat) {
|
||||
if (Player.bitNodeN != 4) {
|
||||
if (!(hasSingularitySF && singularitySFLvl >= 1)) {
|
||||
throw makeRuntimeRejectMsg(workerScript, "Cannot run gymWorkout(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
if (Player.isWorking) {
|
||||
var txt = Player.singularityStopWork();
|
||||
workerScript.scriptRef.log(txt);
|
||||
@ -1757,6 +1772,11 @@ function NetscriptFunctions(workerScript) {
|
||||
}
|
||||
}
|
||||
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Player.companyPosition == "" || !(Player.companyPosition instanceof CompanyPosition)) {
|
||||
workerScript.scriptRef.log("ERROR: workForCompany() failed because you do not have a job");
|
||||
return false;
|
||||
@ -1910,6 +1930,11 @@ function NetscriptFunctions(workerScript) {
|
||||
}
|
||||
}
|
||||
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!factionExists(name)) {
|
||||
workerScript.scriptRef.log("ERROR: Faction specified in workForFaction() does not exist.");
|
||||
return false;
|
||||
@ -2005,7 +2030,10 @@ function NetscriptFunctions(workerScript) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
if (Player.isWorking) {
|
||||
var txt = Player.singularityStopWork();
|
||||
workerScript.scriptRef.log(txt);
|
||||
@ -2085,14 +2113,17 @@ function NetscriptFunctions(workerScript) {
|
||||
workerScript.scriptRef.log("Began creating program: " + name);
|
||||
return true;
|
||||
},
|
||||
commitCrime(crime) {
|
||||
commitCrime : function(crime) {
|
||||
if (Player.bitNodeN != 4) {
|
||||
if (!(hasSingularitySF && singularitySFLvl >= 3)) {
|
||||
throw makeRuntimeRejectMsg(workerScript, "Cannot run commitCrime(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (inMission) {
|
||||
workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
|
||||
return;
|
||||
}
|
||||
if (Player.isWorking) {
|
||||
var txt = Player.singularityStopWork();
|
||||
workerScript.scriptRef.log(txt);
|
||||
|
@ -4,7 +4,8 @@ import {addActiveScriptsItem,
|
||||
import {CONSTANTS} from "./Constants.js";
|
||||
import {Engine} from "./engine.js";
|
||||
import {Environment} from "./NetscriptEnvironment.js";
|
||||
import {evaluate, isScriptErrorMessage} from "./NetscriptEvaluator.js";
|
||||
import {evaluate, isScriptErrorMessage,
|
||||
killNetscriptDelay} from "./NetscriptEvaluator.js";
|
||||
import {AllServers} from "./Server.js";
|
||||
import {Settings} from "./Settings.js";
|
||||
|
||||
@ -24,7 +25,8 @@ function WorkerScript(runningScriptObj) {
|
||||
this.scriptRef = runningScriptObj;
|
||||
this.errorMessage = "";
|
||||
this.args = runningScriptObj.args;
|
||||
this.killTrigger = function() {}; //CB func used to clear any delays (netscriptDelay())
|
||||
//this.killTrigger = function() {}; //CB func used to clear any delays (netscriptDelay())
|
||||
this.delay = null;
|
||||
this.fnWorker = null; //Workerscript for a function call
|
||||
}
|
||||
|
||||
@ -93,7 +95,7 @@ function runScriptsLoop() {
|
||||
if (workerScripts[i].running == false && workerScripts[i].env.stopFlag == false) {
|
||||
try {
|
||||
var ast = parse(workerScripts[i].code);
|
||||
//console.log(ast);
|
||||
console.log(ast);
|
||||
} catch (e) {
|
||||
console.log("Error parsing script: " + workerScripts[i].name);
|
||||
dialogBoxCreate("Syntax ERROR in " + workerScripts[i].name + ":<br>" + e);
|
||||
@ -110,8 +112,8 @@ function runScriptsLoop() {
|
||||
w.running = false;
|
||||
w.env.stopFlag = true;
|
||||
w.scriptRef.log("Script finished running");
|
||||
}, function(w) {
|
||||
//console.log(w);
|
||||
}).catch(function(w) {
|
||||
console.log(w);
|
||||
if (w instanceof Error) {
|
||||
dialogBoxCreate("Script runtime unknown error. This is a bug please contact game developer");
|
||||
console.log("ERROR: Evaluating workerscript returns an Error. THIS SHOULDN'T HAPPEN: " + w.toString());
|
||||
@ -165,11 +167,16 @@ function killWorkerScript(runningScriptObj, serverIp) {
|
||||
if (workerScripts[i].name == runningScriptObj.filename && workerScripts[i].serverIp == serverIp &&
|
||||
compareArrays(workerScripts[i].args, runningScriptObj.args)) {
|
||||
workerScripts[i].env.stopFlag = true;
|
||||
workerScripts[i].killTrigger();
|
||||
killNetscriptDelay(workerScripts[i]);
|
||||
if (workerScripts[i].fnWorker) {
|
||||
workerScripts[i].fnWorker.env.stopFlag = true;
|
||||
killNetscriptDelay(workerScripts[i].fnWorker);
|
||||
}
|
||||
/*workerScripts[i].killTrigger();
|
||||
if (workerScripts[i].fnWorker) {
|
||||
workerScripts[i].fnWorker.env.stopFlag = true;
|
||||
workerScripts[i].fnWorker.killTrigger();
|
||||
}
|
||||
}*/
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -367,7 +367,7 @@ function initStockMarket() {
|
||||
StockMarket[joesguns] = joesgunsStk;
|
||||
|
||||
var catalyst = "Catalyst Ventures";
|
||||
var catalystStk = new Stock(catalyst, StockSymbols[catalyst], 1.6, true, 20, getRandomInt(500, 1000));
|
||||
var catalystStk = new Stock(catalyst, StockSymbols[catalyst], 1.6, true, 15, getRandomInt(500, 1000));
|
||||
StockMarket[catalyst] = catalystStk;
|
||||
|
||||
var microdyne = "Microdyne Technologies";
|
||||
@ -408,8 +408,8 @@ function stockMarketCycle() {
|
||||
for (var name in StockMarket) {
|
||||
if (StockMarket.hasOwnProperty(name)) {
|
||||
var stock = StockMarket[name];
|
||||
var thresh = 0.6;
|
||||
if (stock.b) {thresh = 0.4;}
|
||||
var thresh = 0.59;
|
||||
if (stock.b) {thresh = 0.41;}
|
||||
if (Math.random() < thresh) {
|
||||
stock.b = !stock.b;
|
||||
}
|
||||
@ -832,6 +832,8 @@ function createStockTicker(stock) {
|
||||
orderTypeSelect = document.createElement("select"),
|
||||
buyButton = document.createElement("span"),
|
||||
sellButton = document.createElement("span"),
|
||||
buyMaxButton = document.createElement("span"),
|
||||
sellAllButton = document.createElement("span"),
|
||||
positionTxt = document.createElement("p"),
|
||||
orderList = document.createElement("ul");
|
||||
|
||||
@ -952,6 +954,76 @@ function createStockTicker(stock) {
|
||||
return false;
|
||||
});
|
||||
|
||||
buyMaxButton.classList.add("stock-market-input");
|
||||
buyMaxButton.classList.add("a-link-button");
|
||||
buyMaxButton.innerHTML = "Buy MAX";
|
||||
buyMaxButton.addEventListener("click", ()=>{
|
||||
var pos = longShortSelect.options[longShortSelect.selectedIndex].text;
|
||||
pos === "Long" ? pos = PositionTypes.Long : pos = PositionTypes.Short;
|
||||
var ordType = orderTypeSelect.options[orderTypeSelect.selectedIndex].text;
|
||||
var money = Player.money.toMoney();
|
||||
switch (ordType) {
|
||||
case "Market Order":
|
||||
var shares = Math.floor(money / stock.price);
|
||||
pos === PositionTypes.Long ? buyStock(stock, shares) : shortStock(stock, shares, null);
|
||||
break;
|
||||
case "Limit Order":
|
||||
case "Stop Order":
|
||||
var yesBtn = yesNoTxtInpBoxGetYesButton(),
|
||||
noBtn = yesNoTxtInpBoxGetNoButton();
|
||||
yesBtn.innerText = "Place Buy " + ordType;
|
||||
noBtn.innerText = "Cancel Order";
|
||||
yesBtn.addEventListener("click", ()=>{
|
||||
var price = Number(yesNoTxtInpBoxGetInput()), type;
|
||||
if (ordType === "Limit Order") {
|
||||
type = OrderTypes.LimitBuy;
|
||||
} else {
|
||||
type = OrderTypes.StopBuy;
|
||||
}
|
||||
var shares = Math.floor(money / price);
|
||||
placeOrder(stock, shares, price, type, pos);
|
||||
yesNoTxtInpBoxClose();
|
||||
});
|
||||
noBtn.addEventListener("click", ()=>{
|
||||
yesNoTxtInpBoxClose();
|
||||
});
|
||||
yesNoTxtInpBoxCreate("Enter the price for your " + ordType);
|
||||
break;
|
||||
default:
|
||||
console.log("ERROR: Invalid order type");
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
sellAllButton.classList.add("stock-market-input");
|
||||
sellAllButton.classList.add("a-link-button");
|
||||
sellAllButton.innerHTML = "Sell ALL";
|
||||
sellAllButton.addEventListener("click", ()=>{
|
||||
var pos = longShortSelect.options[longShortSelect.selectedIndex].text;
|
||||
pos === "Long" ? pos = PositionTypes.Long : pos = PositionTypes.Short;
|
||||
var ordType = orderTypeSelect.options[orderTypeSelect.selectedIndex].text;
|
||||
switch (ordType) {
|
||||
case "Market Order":
|
||||
if (pos === PositionTypes.Long) {
|
||||
var shares = stock.playerShares;
|
||||
sellStock(stock, shares);
|
||||
} else {
|
||||
var shares = stock.playerShortShares;
|
||||
sellShort(stock, shares, null);
|
||||
}
|
||||
break;
|
||||
case "Limit Order":
|
||||
case "Stop Order":
|
||||
dialogBoxCreate("ERROR: 'Sell All' only works for Market Orders")
|
||||
break;
|
||||
default:
|
||||
console.log("ERROR: Invalid order type");
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
positionTxt.setAttribute("id", tickerId + "-position-text");
|
||||
positionTxt.classList.add("stock-market-position-text");
|
||||
stock.posTxtEl = positionTxt;
|
||||
@ -964,6 +1036,8 @@ function createStockTicker(stock) {
|
||||
stockDiv.appendChild(orderTypeSelect);
|
||||
stockDiv.appendChild(buyButton);
|
||||
stockDiv.appendChild(sellButton);
|
||||
stockDiv.appendChild(buyMaxButton);
|
||||
stockDiv.appendChild(sellAllButton);
|
||||
stockDiv.appendChild(positionTxt);
|
||||
stockDiv.appendChild(orderList);
|
||||
|
||||
|
@ -22,6 +22,7 @@ function yesNoBoxGetNoButton() {
|
||||
}
|
||||
|
||||
function yesNoBoxCreate(txt) {
|
||||
if (yesNoBoxOpen) {return false;} //Already open
|
||||
yesNoBoxOpen = true;
|
||||
var textElement = document.getElementById("yes-no-box-text");
|
||||
if (textElement) {
|
||||
@ -34,6 +35,7 @@ function yesNoBoxCreate(txt) {
|
||||
} else {
|
||||
console.log("ERROR: Container not found for YesNoBox");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Generic Yes-No POp-up Box with Text input */
|
||||
|
Loading…
Reference in New Issue
Block a user