mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-30 03:23:48 +01:00
commit
326cd5afa0
BIN
assets/Steam/achievements/default_locked.png
Normal file
BIN
assets/Steam/achievements/default_locked.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.3 KiB |
BIN
assets/Steam/achievements/default_unlocked.png
Normal file
BIN
assets/Steam/achievements/default_unlocked.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.6 KiB |
168
assets/Steam/achievements/default_unlocked.svg
Normal file
168
assets/Steam/achievements/default_unlocked.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 54 KiB |
34
dist/vendor.bundle.js
vendored
34
dist/vendor.bundle.js
vendored
File diff suppressed because one or more lines are too long
217
electron/greenworks.js
Normal file
217
electron/greenworks.js
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
// Copyright (c) 2015 Greenheart Games Pty. Ltd. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
// The source code can be found in https://github.com/greenheartgames/greenworks
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var greenworks;
|
||||||
|
|
||||||
|
if (process.platform == 'darwin') {
|
||||||
|
if (process.arch == 'x64')
|
||||||
|
greenworks = require('./lib/greenworks-osx64');
|
||||||
|
else if (process.arch == 'ia32')
|
||||||
|
greenworks = require('./lib/greenworks-osx32');
|
||||||
|
} else if (process.platform == 'win32') {
|
||||||
|
if (process.arch == 'x64')
|
||||||
|
greenworks = require('./lib/greenworks-win64');
|
||||||
|
else if (process.arch == 'ia32')
|
||||||
|
greenworks = require('./lib/greenworks-win32');
|
||||||
|
} else if (process.platform == 'linux') {
|
||||||
|
if (process.arch == 'x64')
|
||||||
|
greenworks = require('./lib/greenworks-linux64');
|
||||||
|
else if (process.arch == 'ia32')
|
||||||
|
greenworks = require('./lib/greenworks-linux32');
|
||||||
|
}
|
||||||
|
|
||||||
|
function error_process(err, error_callback) {
|
||||||
|
if (err && error_callback)
|
||||||
|
error_callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.ugcGetItems = function(options, ugc_matching_type, ugc_query_type,
|
||||||
|
success_callback, error_callback) {
|
||||||
|
if (typeof options !== 'object') {
|
||||||
|
error_callback = success_callback;
|
||||||
|
success_callback = ugc_query_type;
|
||||||
|
ugc_query_type = ugc_matching_type;
|
||||||
|
ugc_matching_type = options;
|
||||||
|
options = {
|
||||||
|
'app_id': greenworks.getAppId(),
|
||||||
|
'page_num': 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type,
|
||||||
|
success_callback, error_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.ugcGetUserItems = function(options, ugc_matching_type,
|
||||||
|
ugc_list_sort_order, ugc_list, success_callback, error_callback) {
|
||||||
|
if (typeof options !== 'object') {
|
||||||
|
error_callback = success_callback;
|
||||||
|
success_callback = ugc_list;
|
||||||
|
ugc_list = ugc_list_sort_order;
|
||||||
|
ugc_list_sort_order = ugc_matching_type;
|
||||||
|
ugc_matching_type = options;
|
||||||
|
options = {
|
||||||
|
'app_id': greenworks.getAppId(),
|
||||||
|
'page_num': 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
greenworks._ugcGetUserItems(options, ugc_matching_type, ugc_list_sort_order,
|
||||||
|
ugc_list, success_callback, error_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback,
|
||||||
|
error_callback) {
|
||||||
|
if (typeof options !== 'object') {
|
||||||
|
error_callback = success_callback;
|
||||||
|
success_callback = sync_dir;
|
||||||
|
sync_dir = options;
|
||||||
|
options = {
|
||||||
|
'app_id': greenworks.getAppId(),
|
||||||
|
'page_num': 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
greenworks._ugcSynchronizeItems(options, sync_dir, success_callback,
|
||||||
|
error_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.publishWorkshopFile = function(options, file_path, image_path, title,
|
||||||
|
description, success_callback, error_callback) {
|
||||||
|
if (typeof options !== 'object') {
|
||||||
|
error_callback = success_callback;
|
||||||
|
success_callback = description;
|
||||||
|
description = title;
|
||||||
|
title = image_path;
|
||||||
|
image_path = file_path;
|
||||||
|
file_path = options;
|
||||||
|
options = {
|
||||||
|
'app_id': greenworks.getAppId(),
|
||||||
|
'tags': []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
greenworks._publishWorkshopFile(options, file_path, image_path, title,
|
||||||
|
description, success_callback, error_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.updatePublishedWorkshopFile = function(options,
|
||||||
|
published_file_handle, file_path, image_path, title, description,
|
||||||
|
success_callback, error_callback) {
|
||||||
|
if (typeof options !== 'object') {
|
||||||
|
error_callback = success_callback;
|
||||||
|
success_callback = description;
|
||||||
|
description = title;
|
||||||
|
title = image_path;
|
||||||
|
image_path = file_path;
|
||||||
|
file_path = published_file_handle;
|
||||||
|
published_file_handle = options;
|
||||||
|
options = {
|
||||||
|
'tags': [] // No tags are set
|
||||||
|
}
|
||||||
|
}
|
||||||
|
greenworks._updatePublishedWorkshopFile(options, published_file_handle,
|
||||||
|
file_path, image_path, title, description, success_callback,
|
||||||
|
error_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
// An utility function for publish related APIs.
|
||||||
|
// It processes remains steps after saving files to Steam Cloud.
|
||||||
|
function file_share_process(file_name, image_name, next_process_func,
|
||||||
|
error_callback, progress_callback) {
|
||||||
|
if (progress_callback)
|
||||||
|
progress_callback("Completed on saving files on Steam Cloud.");
|
||||||
|
greenworks.fileShare(file_name, function() {
|
||||||
|
greenworks.fileShare(image_name, function() {
|
||||||
|
next_process_func();
|
||||||
|
}, function(err) { error_process(err, error_callback); });
|
||||||
|
}, function(err) { error_process(err, error_callback); });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Publishing user generated content(ugc) to Steam contains following steps:
|
||||||
|
// 1. Save file and image to Steam Cloud.
|
||||||
|
// 2. Share the file and image.
|
||||||
|
// 3. publish the file to workshop.
|
||||||
|
greenworks.ugcPublish = function(file_name, title, description, image_name,
|
||||||
|
success_callback, error_callback, progress_callback) {
|
||||||
|
var publish_file_process = function() {
|
||||||
|
if (progress_callback)
|
||||||
|
progress_callback("Completed on sharing files.");
|
||||||
|
greenworks.publishWorkshopFile(file_name, image_name, title, description,
|
||||||
|
function(publish_file_id) { success_callback(publish_file_id); },
|
||||||
|
function(err) { error_process(err, error_callback); });
|
||||||
|
};
|
||||||
|
greenworks.saveFilesToCloud([file_name, image_name], function() {
|
||||||
|
file_share_process(file_name, image_name, publish_file_process,
|
||||||
|
error_callback, progress_callback);
|
||||||
|
}, function(err) { error_process(err, error_callback); });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update publish ugc steps:
|
||||||
|
// 1. Save new file and image to Steam Cloud.
|
||||||
|
// 2. Share file and images.
|
||||||
|
// 3. Update published file.
|
||||||
|
greenworks.ugcPublishUpdate = function(published_file_id, file_name, title,
|
||||||
|
description, image_name, success_callback, error_callback,
|
||||||
|
progress_callback) {
|
||||||
|
var update_published_file_process = function() {
|
||||||
|
if (progress_callback)
|
||||||
|
progress_callback("Completed on sharing files.");
|
||||||
|
greenworks.updatePublishedWorkshopFile(published_file_id,
|
||||||
|
file_name, image_name, title, description,
|
||||||
|
function() { success_callback(); },
|
||||||
|
function(err) { error_process(err, error_callback); });
|
||||||
|
};
|
||||||
|
|
||||||
|
greenworks.saveFilesToCloud([file_name, image_name], function() {
|
||||||
|
file_share_process(file_name, image_name, update_published_file_process,
|
||||||
|
error_callback, progress_callback);
|
||||||
|
}, function(err) { error_process(err, error_callback); });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greenworks Utils APIs implmentation.
|
||||||
|
greenworks.Utils.move = function(source_dir, target_dir, success_callback,
|
||||||
|
error_callback) {
|
||||||
|
fs.rename(source_dir, target_dir, function(err) {
|
||||||
|
if (err) {
|
||||||
|
if (error_callback) error_callback(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (success_callback)
|
||||||
|
success_callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
greenworks.init = function() {
|
||||||
|
if (this.initAPI()) return true;
|
||||||
|
if (!this.isSteamRunning())
|
||||||
|
throw new Error("Steam initialization failed. Steam is not running.");
|
||||||
|
var appId;
|
||||||
|
try {
|
||||||
|
appId = fs.readFileSync('steam_appid.txt', 'utf8');
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("Steam initialization failed. Steam is running," +
|
||||||
|
"but steam_appid.txt is missing. Expected to find it in: " +
|
||||||
|
require('path').resolve('steam_appid.txt'));
|
||||||
|
}
|
||||||
|
if (!/^\d+ *\r?\n?$/.test(appId)) {
|
||||||
|
throw new Error("Steam initialization failed. " +
|
||||||
|
"steam_appid.txt appears to be invalid; " +
|
||||||
|
"it should contain a numeric ID: " + appId);
|
||||||
|
}
|
||||||
|
throw new Error("Steam initialization failed, but Steam is running, " +
|
||||||
|
"and steam_appid.txt is present and valid." +
|
||||||
|
"Maybe that's not really YOUR app ID? " + appId.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
greenworks.__proto__ = EventEmitter.prototype;
|
||||||
|
EventEmitter.call(greenworks);
|
||||||
|
|
||||||
|
greenworks._steam_events.on = function () {
|
||||||
|
greenworks.emit.apply(greenworks, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
process.versions['greenworks'] = greenworks._version;
|
||||||
|
|
||||||
|
module.exports = greenworks;
|
BIN
electron/lib/greenworks-osx64.node
Executable file
BIN
electron/lib/greenworks-osx64.node
Executable file
Binary file not shown.
BIN
electron/lib/greenworks-win64.node
Executable file
BIN
electron/lib/greenworks-win64.node
Executable file
Binary file not shown.
BIN
electron/lib/libsdkencryptedappticket.dylib
Normal file
BIN
electron/lib/libsdkencryptedappticket.dylib
Normal file
Binary file not shown.
BIN
electron/lib/libsteam_api.dylib
Normal file
BIN
electron/lib/libsteam_api.dylib
Normal file
Binary file not shown.
BIN
electron/lib/sdkencryptedappticket64.dll
Normal file
BIN
electron/lib/sdkencryptedappticket64.dll
Normal file
Binary file not shown.
BIN
electron/lib/sdkencryptedappticket64.lib
Normal file
BIN
electron/lib/sdkencryptedappticket64.lib
Normal file
Binary file not shown.
BIN
electron/lib/steam_api.dll
Normal file
BIN
electron/lib/steam_api.dll
Normal file
Binary file not shown.
BIN
electron/lib/steam_api.lib
Normal file
BIN
electron/lib/steam_api.lib
Normal file
Binary file not shown.
BIN
electron/lib/steam_api64.dll
Normal file
BIN
electron/lib/steam_api64.dll
Normal file
Binary file not shown.
BIN
electron/lib/steam_api64.lib
Normal file
BIN
electron/lib/steam_api64.lib
Normal file
Binary file not shown.
1
electron/lib/steam_appid.txt
Normal file
1
electron/lib/steam_appid.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
1812820
|
@ -1,4 +1,11 @@
|
|||||||
const { app, BrowserWindow, Menu, globalShortcut, shell } = require("electron");
|
const { app, BrowserWindow, Menu, globalShortcut, shell } = require("electron");
|
||||||
|
const greenworks = require("./greenworks");
|
||||||
|
|
||||||
|
if (greenworks.init()) {
|
||||||
|
console.log("Steam API has been initialized.");
|
||||||
|
} else {
|
||||||
|
console.log("Steam API has failed to initialize.");
|
||||||
|
}
|
||||||
|
|
||||||
const debug = false;
|
const debug = false;
|
||||||
|
|
||||||
@ -33,6 +40,17 @@ function createWindow() {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
shell.openExternal(url);
|
shell.openExternal(url);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// This is backward but the game fills in an array called `document.achievements` and we retrieve it from
|
||||||
|
// here. Hey if it works it works.
|
||||||
|
const achievements = greenworks.getAchievementNames();
|
||||||
|
setInterval(async () => {
|
||||||
|
const achs = await win.webContents.executeJavaScript("document.achievements");
|
||||||
|
for (const ach of achs) {
|
||||||
|
if (!achievements.includes(ach)) continue;
|
||||||
|
greenworks.activateAchievement(ach, () => undefined);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
|
1
electron/steam_appid.txt
Normal file
1
electron/steam_appid.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
1812820
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
40
package-lock.json
generated
40
package-lock.json
generated
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "bitburner",
|
"name": "bitburner",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "SEE LICENSE IN license.txt",
|
"license": "SEE LICENSE IN license.txt",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -29,9 +29,9 @@
|
|||||||
"better-react-mathjax": "^1.0.3",
|
"better-react-mathjax": "^1.0.3",
|
||||||
"clsx": "^1.1.1",
|
"clsx": "^1.1.1",
|
||||||
"date-fns": "^2.25.0",
|
"date-fns": "^2.25.0",
|
||||||
"decimal.js": "7.2.3",
|
|
||||||
"escodegen": "^1.11.0",
|
"escodegen": "^1.11.0",
|
||||||
"file-saver": "^1.3.8",
|
"file-saver": "^1.3.8",
|
||||||
|
"fs": "^0.0.1-security",
|
||||||
"jquery": "^3.5.0",
|
"jquery": "^3.5.0",
|
||||||
"jszip": "^3.7.0",
|
"jszip": "^3.7.0",
|
||||||
"material-ui-color": "^1.2.0",
|
"material-ui-color": "^1.2.0",
|
||||||
@ -59,7 +59,7 @@
|
|||||||
"babel-jest": "^27.0.6",
|
"babel-jest": "^27.0.6",
|
||||||
"babel-loader": "^8.0.5",
|
"babel-loader": "^8.0.5",
|
||||||
"cypress": "^8.3.1",
|
"cypress": "^8.3.1",
|
||||||
"electron": "^14.0.1",
|
"electron": "^14.0.2",
|
||||||
"electron-packager": "^15.4.0",
|
"electron-packager": "^15.4.0",
|
||||||
"eslint": "^7.24.0",
|
"eslint": "^7.24.0",
|
||||||
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
||||||
@ -7012,11 +7012,6 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/decimal.js": {
|
|
||||||
"version": "7.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.2.3.tgz",
|
|
||||||
"integrity": "sha512-AoFI37QS0S87Ft0r3Bdz4q9xSpm1Paa9lSeKLXgMPk/u/+QPIM5Gy4DHcZQS1seqPJH4gHLauPGn347z0HbsrA=="
|
|
||||||
},
|
|
||||||
"node_modules/decode-uri-component": {
|
"node_modules/decode-uri-component": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
||||||
@ -7579,9 +7574,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/electron": {
|
"node_modules/electron": {
|
||||||
"version": "14.1.1",
|
"version": "14.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-14.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-14.0.2.tgz",
|
||||||
"integrity": "sha512-eaqaxMq/auE5VDIzYYqDUgZg+68Uiv+8jAQUXqLh8G58kOxqRL9Jw4TJ/w2/KXwWGaVPaUStbvO9BtqVZant+A==",
|
"integrity": "sha512-LIJj795cfggUtLHIM84lseE7LC0kAs/HNVXoDFPTjtYzQikPX9XAIMI1BTJcod3j+U1ZXsayk9N4M3M890WD3w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -9609,6 +9604,11 @@
|
|||||||
"safe-buffer": "~5.1.0"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/fs": {
|
||||||
|
"version": "0.0.1-security",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
|
||||||
|
"integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ="
|
||||||
|
},
|
||||||
"node_modules/fs-extra": {
|
"node_modules/fs-extra": {
|
||||||
"version": "9.1.0",
|
"version": "9.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||||
@ -27035,11 +27035,6 @@
|
|||||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
|
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"decimal.js": {
|
|
||||||
"version": "7.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.2.3.tgz",
|
|
||||||
"integrity": "sha512-AoFI37QS0S87Ft0r3Bdz4q9xSpm1Paa9lSeKLXgMPk/u/+QPIM5Gy4DHcZQS1seqPJH4gHLauPGn347z0HbsrA=="
|
|
||||||
},
|
|
||||||
"decode-uri-component": {
|
"decode-uri-component": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
||||||
@ -27509,9 +27504,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"electron": {
|
"electron": {
|
||||||
"version": "14.1.1",
|
"version": "14.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-14.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-14.0.2.tgz",
|
||||||
"integrity": "sha512-eaqaxMq/auE5VDIzYYqDUgZg+68Uiv+8jAQUXqLh8G58kOxqRL9Jw4TJ/w2/KXwWGaVPaUStbvO9BtqVZant+A==",
|
"integrity": "sha512-LIJj795cfggUtLHIM84lseE7LC0kAs/HNVXoDFPTjtYzQikPX9XAIMI1BTJcod3j+U1ZXsayk9N4M3M890WD3w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@electron/get": "^1.0.1",
|
"@electron/get": "^1.0.1",
|
||||||
@ -29108,6 +29103,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"fs": {
|
||||||
|
"version": "0.0.1-security",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
|
||||||
|
"integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ="
|
||||||
|
},
|
||||||
"fs-extra": {
|
"fs-extra": {
|
||||||
"version": "9.1.0",
|
"version": "9.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
"date-fns": "^2.25.0",
|
"date-fns": "^2.25.0",
|
||||||
"escodegen": "^1.11.0",
|
"escodegen": "^1.11.0",
|
||||||
"file-saver": "^1.3.8",
|
"file-saver": "^1.3.8",
|
||||||
|
"fs": "^0.0.1-security",
|
||||||
"jquery": "^3.5.0",
|
"jquery": "^3.5.0",
|
||||||
"jszip": "^3.7.0",
|
"jszip": "^3.7.0",
|
||||||
"material-ui-color": "^1.2.0",
|
"material-ui-color": "^1.2.0",
|
||||||
@ -60,7 +61,7 @@
|
|||||||
"babel-jest": "^27.0.6",
|
"babel-jest": "^27.0.6",
|
||||||
"babel-loader": "^8.0.5",
|
"babel-loader": "^8.0.5",
|
||||||
"cypress": "^8.3.1",
|
"cypress": "^8.3.1",
|
||||||
"electron": "^14.0.1",
|
"electron": "^14.0.2",
|
||||||
"electron-packager": "^15.4.0",
|
"electron-packager": "^15.4.0",
|
||||||
"eslint": "^7.24.0",
|
"eslint": "^7.24.0",
|
||||||
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
||||||
|
376
src/Electron.tsx
Normal file
376
src/Electron.tsx
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
import { AugmentationNames } from "./Augmentation/data/AugmentationNames";
|
||||||
|
import { SkillNames } from "./Bladeburner/data/SkillNames";
|
||||||
|
import { Skills } from "./Bladeburner/Skills";
|
||||||
|
import { CONSTANTS } from "./Constants";
|
||||||
|
import { Industries } from "./Corporation/IndustryData";
|
||||||
|
import { Exploit } from "./Exploits/Exploit";
|
||||||
|
import { Factions } from "./Faction/Factions";
|
||||||
|
import { AllGangs } from "./Gang/AllGangs";
|
||||||
|
import { GangConstants } from "./Gang/data/Constants";
|
||||||
|
import { HacknetServerConstants } from "./Hacknet/data/Constants";
|
||||||
|
import { hasHacknetServers } from "./Hacknet/HacknetHelpers";
|
||||||
|
import { HacknetServer } from "./Hacknet/HacknetServer";
|
||||||
|
import { CityName } from "./Locations/data/CityNames";
|
||||||
|
import { Player } from "./Player";
|
||||||
|
import { Programs } from "./Programs/Programs";
|
||||||
|
import { GetAllServers, GetServer } from "./Server/AllServers";
|
||||||
|
import { SpecialServers } from "./Server/data/SpecialServers";
|
||||||
|
import { Server } from "./Server/Server";
|
||||||
|
import { Router } from "./ui/GameRoot";
|
||||||
|
import { Page } from "./ui/Router";
|
||||||
|
|
||||||
|
interface Achievement {
|
||||||
|
ID: string;
|
||||||
|
Condition: () => boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bitNodeFinishedState(): boolean {
|
||||||
|
const wd = GetServer(SpecialServers.WorldDaemon);
|
||||||
|
if (!(wd instanceof Server)) return false;
|
||||||
|
if (wd.backdoorInstalled) return true;
|
||||||
|
return Player.bladeburner !== null && Player.bladeburner.blackops.hasOwnProperty("Operation Daedalus");
|
||||||
|
}
|
||||||
|
|
||||||
|
function sfAchievement(): Achievement[] {
|
||||||
|
const achs: Achievement[] = [];
|
||||||
|
for (let i = 0; i <= 11; i++) {
|
||||||
|
for (let j = 1; j <= 3; j++) {
|
||||||
|
achs.push({
|
||||||
|
ID: `SF${i}.${j}`,
|
||||||
|
Condition: () => Player.sourceFileLvl(i) >= j,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return achs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const achievements: Achievement[] = [
|
||||||
|
{
|
||||||
|
ID: "UNACHIEVABLE",
|
||||||
|
// Hey Players! Yes, you're supposed to modify this to get the achievement!
|
||||||
|
Condition: () => false,
|
||||||
|
},
|
||||||
|
...sfAchievement(),
|
||||||
|
{
|
||||||
|
ID: "SF12.100",
|
||||||
|
Condition: () => Player.sourceFileLvl(12) >= 100,
|
||||||
|
},
|
||||||
|
{ ID: "BYPASS", Condition: () => Player.exploits.includes(Exploit.Bypass) },
|
||||||
|
{ ID: "PROTOTYPETAMPERING", Condition: () => Player.exploits.includes(Exploit.PrototypeTampering) },
|
||||||
|
{ ID: "UNCLICKABLE", Condition: () => Player.exploits.includes(Exploit.Unclickable) },
|
||||||
|
{ ID: "UNDOCUMENTEDFUNCTIONCALL", Condition: () => Player.exploits.includes(Exploit.UndocumentedFunctionCall) },
|
||||||
|
{ ID: "TIMECOMPRESSION", Condition: () => Player.exploits.includes(Exploit.TimeCompression) },
|
||||||
|
{ ID: "REALITYALTERATION", Condition: () => Player.exploits.includes(Exploit.RealityAlteration) },
|
||||||
|
{ ID: "N00DLES", Condition: () => Player.exploits.includes(Exploit.N00dles) },
|
||||||
|
{ ID: "EDITSAVEFILE", Condition: () => Player.exploits.includes(Exploit.EditSaveFile) },
|
||||||
|
{
|
||||||
|
ID: "MONEY_1Q",
|
||||||
|
Condition: () => Player.money >= 1e18,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "MONEY_M1B",
|
||||||
|
Condition: () => Player.money <= -1e9,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "INSTALL_1",
|
||||||
|
Condition: () => Player.augmentations.length >= 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "INSTALL_100",
|
||||||
|
Condition: () => Player.augmentations.length >= 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "QUEUE_40",
|
||||||
|
Condition: () => Player.queuedAugmentations.length >= 40,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "SLEEVE_8",
|
||||||
|
Condition: () => Player.sleeves.length === 8,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HACKING_100000",
|
||||||
|
Condition: () => Player.hacking >= 100000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "INTELLIGENCE_255",
|
||||||
|
Condition: () => Player.intelligence >= 255,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "COMBAT_3000",
|
||||||
|
Condition: () =>
|
||||||
|
Player.strength >= 3000 && Player.defense >= 3000 && Player.dexterity >= 3000 && Player.agility >= 3000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "NEUROFLUX_255",
|
||||||
|
Condition: () => Player.augmentations.some((a) => a.name === AugmentationNames.NeuroFluxGovernor && a.level >= 255),
|
||||||
|
},
|
||||||
|
{ ID: "ILLUMINATI", Condition: () => Player.factions.includes("Illuminati") },
|
||||||
|
{ ID: "DAEDALUS", Condition: () => Player.factions.includes("Daedalus") },
|
||||||
|
{ ID: "THE_COVENANT", Condition: () => Player.factions.includes("The Covenant") },
|
||||||
|
{ ID: "ECORP", Condition: () => Player.factions.includes("ECorp") },
|
||||||
|
{ ID: "MEGACORP", Condition: () => Player.factions.includes("MegaCorp") },
|
||||||
|
{ ID: "BACHMAN_&_ASSOCIATES", Condition: () => Player.factions.includes("Bachman & Associates") },
|
||||||
|
{ ID: "BLADE_INDUSTRIES", Condition: () => Player.factions.includes("Blade Industries") },
|
||||||
|
{ ID: "NWO", Condition: () => Player.factions.includes("NWO") },
|
||||||
|
{ ID: "CLARKE_INCORPORATED", Condition: () => Player.factions.includes("Clarke Incorporated") },
|
||||||
|
{ ID: "OMNITEK_INCORPORATED", Condition: () => Player.factions.includes("OmniTek Incorporated") },
|
||||||
|
{ ID: "FOUR_SIGMA", Condition: () => Player.factions.includes("Four Sigma") },
|
||||||
|
{ ID: "KUAIGONG_INTERNATIONAL", Condition: () => Player.factions.includes("KuaiGong International") },
|
||||||
|
{ ID: "FULCRUM_SECRET_TECHNOLOGIES", Condition: () => Player.factions.includes("Fulcrum Secret Technologies") },
|
||||||
|
{ ID: "BITRUNNERS", Condition: () => Player.factions.includes("BitRunners") },
|
||||||
|
{ ID: "THE_BLACK_HAND", Condition: () => Player.factions.includes("The Black Hand") },
|
||||||
|
{ ID: "NITESEC", Condition: () => Player.factions.includes("NiteSec") },
|
||||||
|
{ ID: "AEVUM", Condition: () => Player.factions.includes("Aevum") },
|
||||||
|
{ ID: "CHONGQING", Condition: () => Player.factions.includes("Chongqing") },
|
||||||
|
{ ID: "ISHIMA", Condition: () => Player.factions.includes("Ishima") },
|
||||||
|
{ ID: "NEW_TOKYO", Condition: () => Player.factions.includes("New Tokyo") },
|
||||||
|
{ ID: "SECTOR-12", Condition: () => Player.factions.includes("Sector-12") },
|
||||||
|
{ ID: "VOLHAVEN", Condition: () => Player.factions.includes("Volhaven") },
|
||||||
|
{ ID: "SPEAKERS_FOR_THE_DEAD", Condition: () => Player.factions.includes("Speakers for the Dead") },
|
||||||
|
{ ID: "THE_DARK_ARMY", Condition: () => Player.factions.includes("The Dark Army") },
|
||||||
|
{ ID: "THE_SYNDICATE", Condition: () => Player.factions.includes("The Syndicate") },
|
||||||
|
{ ID: "SILHOUETTE", Condition: () => Player.factions.includes("Silhouette") },
|
||||||
|
{ ID: "TETRADS", Condition: () => Player.factions.includes("Tetrads") },
|
||||||
|
{ ID: "SLUM_SNAKES", Condition: () => Player.factions.includes("Slum Snakes") },
|
||||||
|
{ ID: "NETBURNERS", Condition: () => Player.factions.includes("Netburners") },
|
||||||
|
{ ID: "TIAN_DI_HUI", Condition: () => Player.factions.includes("Tian Di Hui") },
|
||||||
|
{ ID: "CYBERSEC", Condition: () => Player.factions.includes("CyberSec") },
|
||||||
|
{ ID: "BLADEBURNERS", Condition: () => Player.factions.includes("Bladeburners") },
|
||||||
|
{ ID: "BRUTESSH.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.BruteSSHProgram.name) },
|
||||||
|
{ ID: "FTPCRACK.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.FTPCrackProgram.name) },
|
||||||
|
{ ID: "RELAYSMTP.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.RelaySMTPProgram.name) },
|
||||||
|
{ ID: "HTTPWORM.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.HTTPWormProgram.name) },
|
||||||
|
{ ID: "SQLINJECT.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.SQLInjectProgram.name) },
|
||||||
|
{ ID: "DEEPSCANV1.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.DeepscanV1.name) },
|
||||||
|
{ ID: "DEEPSCANV2.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.DeepscanV2.name) },
|
||||||
|
{
|
||||||
|
ID: "SERVERPROFILER.EXE",
|
||||||
|
Condition: () => Player.getHomeComputer().programs.includes(Programs.ServerProfiler.name),
|
||||||
|
},
|
||||||
|
{ ID: "AUTOLINK.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.AutoLink.name) },
|
||||||
|
{ ID: "FORMULAS.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.Formulas.name) },
|
||||||
|
{ ID: "FLIGHT.EXE", Condition: () => Player.getHomeComputer().programs.includes(Programs.Flight.name) },
|
||||||
|
{
|
||||||
|
ID: "NS2",
|
||||||
|
Condition: () =>
|
||||||
|
Player.getHomeComputer().scripts.some((s) => s.filename.endsWith(".js") || s.filename.endsWith(".ns")),
|
||||||
|
},
|
||||||
|
{ ID: "FROZE", Condition: () => location.href.includes("noScripts") },
|
||||||
|
{
|
||||||
|
ID: "RUNNING_SCRIPTS_1000",
|
||||||
|
Condition: () => {
|
||||||
|
let running = 0;
|
||||||
|
for (const s of GetAllServers()) {
|
||||||
|
running += s.runningScripts.length;
|
||||||
|
}
|
||||||
|
return running >= 1000;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "DRAIN_SERVER",
|
||||||
|
Condition: () => {
|
||||||
|
for (const s of GetAllServers()) {
|
||||||
|
if (s instanceof Server) {
|
||||||
|
if (s.moneyMax > 0 && s.moneyAvailable === 0) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ ID: "MAX_RAM", Condition: () => Player.getHomeComputer().maxRam === CONSTANTS.HomeComputerMaxRam },
|
||||||
|
{ ID: "MAX_CORES", Condition: () => Player.getHomeComputer().cpuCores === 8 },
|
||||||
|
{ ID: "SCRIPTS_30", Condition: () => Player.getHomeComputer().scripts.length >= 30 },
|
||||||
|
{ ID: "KARMA_1000000", Condition: () => Player.karma <= -1e6 },
|
||||||
|
{ ID: "STOCK_1q", Condition: () => Player.moneySourceB.stock >= 1e15 },
|
||||||
|
{
|
||||||
|
ID: "DISCOUNT",
|
||||||
|
Condition: () => {
|
||||||
|
const p = GetServer("powerhouse-fitness");
|
||||||
|
if (!(p instanceof Server)) return false;
|
||||||
|
return p.backdoorInstalled;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{ ID: "SCRIPT_32GB", Condition: () => Player.getHomeComputer().scripts.some((s) => s.ramUsage >= 32) },
|
||||||
|
{ ID: "FIRST_HACKNET_SERVER", Condition: () => hasHacknetServers(Player) && Player.hacknetNodes.length > 0 },
|
||||||
|
{
|
||||||
|
ID: "ALL_HACKNET_SERVER",
|
||||||
|
Condition: () => hasHacknetServers(Player) && Player.hacknetNodes.length === HacknetServerConstants.MaxServers,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "MAX_HACKNET_SERVER",
|
||||||
|
Condition: () => {
|
||||||
|
if (!hasHacknetServers(Player)) return false;
|
||||||
|
for (const h of Player.hacknetNodes) {
|
||||||
|
if (!(h instanceof HacknetServer)) return false;
|
||||||
|
if (
|
||||||
|
h.maxRam === HacknetServerConstants.MaxRam &&
|
||||||
|
h.cores === HacknetServerConstants.MaxCores &&
|
||||||
|
h.level === HacknetServerConstants.MaxLevel &&
|
||||||
|
h.cache === HacknetServerConstants.MaxCache
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ ID: "HACKNET_SERVER_1B", Condition: () => hasHacknetServers(Player) && Player.moneySourceB.hacknet >= 1e9 },
|
||||||
|
{
|
||||||
|
ID: "MAX_CACHE",
|
||||||
|
Condition: () => hasHacknetServers(Player) && Player.hashManager.hashes === Player.hashManager.capacity,
|
||||||
|
},
|
||||||
|
{ ID: "REPUTATION_10M", Condition: () => Object.values(Factions).some((f) => f.playerReputation >= 10e6) },
|
||||||
|
{ ID: "DONATION", Condition: () => Object.values(Factions).some((f) => f.favor >= 150) },
|
||||||
|
{ ID: "TRAVEL", Condition: () => Player.city !== CityName.Sector12 },
|
||||||
|
{
|
||||||
|
ID: "WORKOUT",
|
||||||
|
Condition: () =>
|
||||||
|
[
|
||||||
|
CONSTANTS.ClassGymStrength,
|
||||||
|
CONSTANTS.ClassGymDefense,
|
||||||
|
CONSTANTS.ClassGymDexterity,
|
||||||
|
CONSTANTS.ClassGymAgility,
|
||||||
|
].includes(Player.className),
|
||||||
|
},
|
||||||
|
{ ID: "TOR", Condition: () => Player.hasTorRouter() },
|
||||||
|
{ ID: "4S", Condition: () => Player.has4SData },
|
||||||
|
{ ID: "GANG", Condition: () => Player.gang !== null },
|
||||||
|
{
|
||||||
|
ID: "FULL_GANG",
|
||||||
|
Condition: () => Player.gang !== null && Player.gang.members.length === GangConstants.MaximumGangMembers,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "GANG_TERRITORY",
|
||||||
|
Condition: () => Player.gang !== null && AllGangs[Player.gang.facName].territory === 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "GANG_MEMBER_POWER",
|
||||||
|
Condition: () =>
|
||||||
|
Player.gang !== null &&
|
||||||
|
Player.gang.members.some(
|
||||||
|
(m) =>
|
||||||
|
m.hack >= 10000 || m.str >= 10000 || m.def >= 10000 || m.dex >= 10000 || m.agi >= 10000 || m.cha >= 10000,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{ ID: "BLADEBURNER_DIVISION", Condition: () => Player.bladeburner !== null },
|
||||||
|
{
|
||||||
|
ID: "BLADEBURNER_OVERCLOCK",
|
||||||
|
Condition: () =>
|
||||||
|
Player.bladeburner !== null && Player.bladeburner.skills[SkillNames.Overclock] === Skills[SkillNames.Overclock],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "BLADEBURNER_UNSPENT_100000",
|
||||||
|
Condition: () => Player.bladeburner !== null && Player.bladeburner.skillPoints >= 100000,
|
||||||
|
},
|
||||||
|
{ ID: "CORPORATION", Condition: () => Player.corporation !== null },
|
||||||
|
{
|
||||||
|
ID: "CORPORATION_BRIBE",
|
||||||
|
Condition: () => Player.corporation !== null && Player.corporation.unlockUpgrades[6] === 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CORPORATION_PROD_1000",
|
||||||
|
Condition: () => Player.corporation !== null && Player.corporation.divisions.some((d) => d.prodMult >= 1000),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CORPORATION_EMPLOYEE_3000",
|
||||||
|
Condition: () => {
|
||||||
|
if (Player.corporation === null) return false;
|
||||||
|
for (const d of Player.corporation.divisions) {
|
||||||
|
for (const o of Object.values(d.offices)) {
|
||||||
|
if (o === 0) continue;
|
||||||
|
if (o.employees.length > 3000) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CORPORATION_REAL_ESTATE",
|
||||||
|
Condition: () =>
|
||||||
|
Player.corporation !== null && Player.corporation.divisions.some((d) => d.type === Industries.RealEstate),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN1",
|
||||||
|
Condition: () =>
|
||||||
|
Player.bitNodeN === 1 &&
|
||||||
|
bitNodeFinishedState() &&
|
||||||
|
Player.getHomeComputer().maxRam <= 32 &&
|
||||||
|
Player.getHomeComputer().cpuCores === 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN2",
|
||||||
|
Condition: () => Player.bitNodeN === 2 && bitNodeFinishedState() && Player.gang === null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN3",
|
||||||
|
Condition: () => Player.bitNodeN === 2 && bitNodeFinishedState() && Player.corporation === null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN6",
|
||||||
|
Condition: () => Player.bitNodeN === 6 && bitNodeFinishedState() && Player.bladeburner === null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN7",
|
||||||
|
Condition: () => Player.bitNodeN === 7 && bitNodeFinishedState() && Player.bladeburner === null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN8",
|
||||||
|
Condition: () => Player.bitNodeN === 8 && bitNodeFinishedState() && !Player.has4SData && !Player.has4SDataTixApi,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN9",
|
||||||
|
Condition: () =>
|
||||||
|
Player.bitNodeN === 9 &&
|
||||||
|
bitNodeFinishedState() &&
|
||||||
|
Player.moneySourceB.hacknet === 0 &&
|
||||||
|
Player.moneySourceB.hacknet_expenses === 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "CHALLENGE_BN10",
|
||||||
|
Condition: () =>
|
||||||
|
Player.bitNodeN === 10 &&
|
||||||
|
bitNodeFinishedState() &&
|
||||||
|
!Player.sleeves.some(
|
||||||
|
(s) =>
|
||||||
|
s.augmentations.length > 0 ||
|
||||||
|
s.hacking_exp > 0 ||
|
||||||
|
s.strength_exp > 0 ||
|
||||||
|
s.defense_exp > 0 ||
|
||||||
|
s.agility_exp > 0 ||
|
||||||
|
s.dexterity_exp > 0 ||
|
||||||
|
s.charisma_exp > 0,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "FAST_BN",
|
||||||
|
Condition: () => bitNodeFinishedState() && Player.playtimeSinceLastBitnode < 1000 * 60 * 60 * 24 * 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "INDECISIVE",
|
||||||
|
Condition: (function () {
|
||||||
|
let c = 0;
|
||||||
|
setInterval(() => {
|
||||||
|
if (Router.page() === Page.BitVerse) {
|
||||||
|
c++;
|
||||||
|
} else {
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
}, 60 * 1000);
|
||||||
|
return () => c > 60;
|
||||||
|
})(),
|
||||||
|
},
|
||||||
|
{ ID: "HOSPITALIZED", Condition: () => Player.moneySourceB.hospitalization !== 0 },
|
||||||
|
];
|
||||||
|
|
||||||
|
function setAchievements(achs: string[]): void {
|
||||||
|
(document as any).achievements = achs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateAchievements(): void {
|
||||||
|
setAchievements(achievements.filter((a) => a.Condition()).map((a) => a.ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function initElectron(): void {
|
||||||
|
setAchievements([]);
|
||||||
|
setInterval(calculateAchievements, 5000);
|
||||||
|
}
|
@ -30,7 +30,7 @@ const names: {
|
|||||||
Bypass: "by circumventing the ram cost of document.",
|
Bypass: "by circumventing the ram cost of document.",
|
||||||
EditSaveFile: "by editing your save file.",
|
EditSaveFile: "by editing your save file.",
|
||||||
PrototypeTampering: "by tampering with Numbers prototype.",
|
PrototypeTampering: "by tampering with Numbers prototype.",
|
||||||
TimeCompression: "by compressing time",
|
TimeCompression: "by compressing time.",
|
||||||
Unclickable: "by clicking the unclickable.",
|
Unclickable: "by clicking the unclickable.",
|
||||||
UndocumentedFunctionCall: "by looking beyond the documentation.",
|
UndocumentedFunctionCall: "by looking beyond the documentation.",
|
||||||
RealityAlteration: "by altering reality to suit your whims.",
|
RealityAlteration: "by altering reality to suit your whims.",
|
||||||
|
@ -1242,8 +1242,8 @@ export function NetscriptSingularity(
|
|||||||
return player.focus;
|
return player.focus;
|
||||||
},
|
},
|
||||||
setFocus: function (focus: any): void {
|
setFocus: function (focus: any): void {
|
||||||
helper.updateDynamicRam("isFocused", getRamCost("isFocused"));
|
helper.updateDynamicRam("setFocus", getRamCost("setFocus"));
|
||||||
helper.checkSingularityAccess("isFocused", 2);
|
helper.checkSingularityAccess("setFocus", 2);
|
||||||
if (focus === true) {
|
if (focus === true) {
|
||||||
player.startFocusing();
|
player.startFocusing();
|
||||||
} else if (focus === false) {
|
} else if (focus === false) {
|
||||||
|
@ -36,7 +36,7 @@ const BitNode8StartingMoney = 250e6;
|
|||||||
export function prestigeAugmentation(): void {
|
export function prestigeAugmentation(): void {
|
||||||
initBitNodeMultipliers(Player);
|
initBitNodeMultipliers(Player);
|
||||||
|
|
||||||
const maintainMembership = Player.factions.filter(function (faction) {
|
const maintainMembership = Player.factions.concat(Player.factionInvitations).filter(function (faction) {
|
||||||
return Factions[faction].getInfo().keep;
|
return Factions[faction].getInfo().keep;
|
||||||
});
|
});
|
||||||
Player.prestigeAugmentation();
|
Player.prestigeAugmentation();
|
||||||
|
@ -192,14 +192,11 @@ export class Terminal implements ITerminal {
|
|||||||
const expGainedOnFailure = expGainedOnSuccess / 4;
|
const expGainedOnFailure = expGainedOnSuccess / 4;
|
||||||
if (rand < hackChance) {
|
if (rand < hackChance) {
|
||||||
// Success!
|
// Success!
|
||||||
|
server.backdoorInstalled = true;
|
||||||
if (SpecialServers.WorldDaemon === server.hostname) {
|
if (SpecialServers.WorldDaemon === server.hostname) {
|
||||||
if (player.bitNodeN == null) {
|
|
||||||
player.bitNodeN = 1;
|
|
||||||
}
|
|
||||||
router.toBitVerse(false, false);
|
router.toBitVerse(false, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
server.backdoorInstalled = true;
|
|
||||||
let moneyGained = calculatePercentMoneyHacked(server, player);
|
let moneyGained = calculatePercentMoneyHacked(server, player);
|
||||||
moneyGained = Math.floor(server.moneyAvailable * moneyGained);
|
moneyGained = Math.floor(server.moneyAvailable * moneyGained);
|
||||||
|
|
||||||
|
@ -425,7 +425,6 @@ const Engine: {
|
|||||||
Player.lastUpdate = _thisUpdate - offset;
|
Player.lastUpdate = _thisUpdate - offset;
|
||||||
Engine.updateGame(diff);
|
Engine.updateGame(diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.requestAnimationFrame(Engine.start);
|
window.requestAnimationFrame(Engine.start);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -3,7 +3,8 @@ import ReactDOM from "react-dom";
|
|||||||
|
|
||||||
import { TTheme as Theme, ThemeEvents, refreshTheme } from "./ui/React/Theme";
|
import { TTheme as Theme, ThemeEvents, refreshTheme } from "./ui/React/Theme";
|
||||||
import { LoadingScreen } from "./ui/LoadingScreen";
|
import { LoadingScreen } from "./ui/LoadingScreen";
|
||||||
|
import { initElectron } from "./Electron";
|
||||||
|
initElectron();
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<Theme>
|
<Theme>
|
||||||
<LoadingScreen />
|
<LoadingScreen />
|
||||||
@ -26,7 +27,7 @@ function rerender(): void {
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
if (process.env.NODE_ENV === "development") return;
|
if (process.env.NODE_ENV === "development" || location.href.startsWith("file://")) return;
|
||||||
window.onbeforeunload = function () {
|
window.onbeforeunload = function () {
|
||||||
return "Your work will be lost.";
|
return "Your work will be lost.";
|
||||||
};
|
};
|
||||||
|
@ -535,32 +535,36 @@ export function GameOptionsRoot(props: IProps): React.ReactElement {
|
|||||||
</Select>
|
</Select>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
</List>
|
</List>
|
||||||
<ListItem>
|
{!location.href.startsWith("file://") && (
|
||||||
<Typography>danielyxie / BigD (Original developer): </Typography>
|
<>
|
||||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
|
<ListItem>
|
||||||
<input type="hidden" name="cmd" value="_s-xclick" />
|
<Typography>danielyxie / BigD (Original developer): </Typography>
|
||||||
<input
|
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
|
||||||
type="hidden"
|
<input type="hidden" name="cmd" value="_s-xclick" />
|
||||||
name="encrypted"
|
<input
|
||||||
value="-----BEGIN PKCS7-----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-----END PKCS7-----"
|
type="hidden"
|
||||||
/>
|
name="encrypted"
|
||||||
<input
|
value="-----BEGIN PKCS7-----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-----END PKCS7-----"
|
||||||
type="image"
|
/>
|
||||||
src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif"
|
<input
|
||||||
name="submit"
|
type="image"
|
||||||
alt="PayPal - The safer, easier way to pay online!"
|
src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif"
|
||||||
/>
|
name="submit"
|
||||||
</form>
|
alt="PayPal - The safer, easier way to pay online!"
|
||||||
</ListItem>
|
/>
|
||||||
|
</form>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
<ListItem>
|
<ListItem>
|
||||||
<Typography>
|
<Typography>
|
||||||
hydroflame (Current maintainer):{" "}
|
hydroflame (Current maintainer):{" "}
|
||||||
<Link href="https://www.google.com/search?q=Where+to+donate+blood+near+me%3F" target="_blank">
|
<Link href="https://www.google.com/search?q=Where+to+donate+blood+near+me%3F" target="_blank">
|
||||||
Donate blood!
|
Donate blood!
|
||||||
</Link>{" "}
|
</Link>{" "}
|
||||||
</Typography>
|
</Typography>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={12} sm={6}>
|
<Grid item xs={12} sm={6}>
|
||||||
<Box>
|
<Box>
|
||||||
|
BIN
steam_api.dll
Normal file
BIN
steam_api.dll
Normal file
Binary file not shown.
BIN
steam_api.lib
Normal file
BIN
steam_api.lib
Normal file
Binary file not shown.
1
steam_appid.txt
Normal file
1
steam_appid.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
1812820
|
@ -124,6 +124,9 @@ module.exports = (env, argv) => {
|
|||||||
isFastRefresh && new ReactRefreshWebpackPlugin(),
|
isFastRefresh && new ReactRefreshWebpackPlugin(),
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
target: "web",
|
target: "web",
|
||||||
|
// node: {
|
||||||
|
// fs: "mock",
|
||||||
|
// },
|
||||||
entry: entry,
|
entry: entry,
|
||||||
output: {
|
output: {
|
||||||
path: path.resolve(__dirname, "./"),
|
path: path.resolve(__dirname, "./"),
|
||||||
|
Loading…
Reference in New Issue
Block a user