mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-29 17:37:34 +01:00
d386528627
Adds actions to save the game's data directly in the filesystem and/or into Steam Cloud. Them game will push an event with the save data whenever the game is saved. Electron will use that data to persist it into the User Data folder, until the folder reaches a certain size. Once over the quota, it's going to remove previous saves. Files are grouped according the the player's identifier, ensuring backups off different playthroughs if importing. Optionally, the file will be gzipped before saving to disk, largely reducing file size. Adds a way to save & load from Steam Cloud, currently manually only. When loading a save, it'll trigger the new "Import Data Comparison" page to accept or cancel the import. When saving the game, it will save to Steam Cloud & to filesystem if the options are enabled. Add automatic game restore Detects when the player has access to a newer game that has been saved more recently than the one being loaded. It checks both in the Steam Cloud and on the local filesystem. Adds an option to disable the feature. - Adds a "Save Game" menu item that triggers the game's save. - Adds a "Export Game" menu item that triggers the download file popup. - Adds a "Export Scripts" menu item that triggers the "download *" terminal command. - Adds a "Load Last Save" menu item that loads the latest file modified in the user data folder. - Adds a "Load from Steam Cloud" menu item. - Adds a "Load From File" menu item that popups a file selector & loads the file. - Adds settings for "Saves Compression (.gz)", "Auto-save Backups" & "Auto-save to Steam", toggleable through the menu. - Adds a "Open Game Data","Open Saves", "Open Logs" & "Open User Data" menu items. - Adds a "Quit" menu item.
55 lines
2.1 KiB
JavaScript
55 lines
2.1 KiB
JavaScript
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
const greenworks = require("./greenworks");
|
|
const log = require("electron-log");
|
|
|
|
async function enableAchievementsInterval(window) {
|
|
// If the Steam API could not be initialized on game start, we'll abort this.
|
|
if (global.greenworksError) return;
|
|
|
|
// 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 steamAchievements = greenworks.getAchievementNames();
|
|
log.silly(`All Steam achievements ${JSON.stringify(steamAchievements)}`);
|
|
const playerAchieved = (await Promise.all(steamAchievements.map(checkSteamAchievement))).filter(name => !!name);
|
|
log.debug(`Player has Steam achievements ${JSON.stringify(playerAchieved)}`);
|
|
const intervalID = setInterval(async () => {
|
|
try {
|
|
const playerAchievements = await window.webContents.executeJavaScript("document.achievements");
|
|
for (const ach of playerAchievements) {
|
|
if (!steamAchievements.includes(ach)) continue; // Don't try activating achievements that don't exist Steam-side
|
|
if (playerAchieved.includes(ach)) continue; // Don't spam achievements that have already been recorded
|
|
log.info(`Granting Steam achievement ${ach}`);
|
|
greenworks.activateAchievement(ach, () => undefined);
|
|
playerAchieved.push(ach);
|
|
}
|
|
} catch (error) {
|
|
log.error(error);
|
|
|
|
// The interval probably did not get cleared after a window kill
|
|
log.warn('Clearing achievements timer');
|
|
clearInterval(intervalID);
|
|
return;
|
|
}
|
|
}, 1000);
|
|
window.achievementsIntervalID = intervalID;
|
|
}
|
|
|
|
function checkSteamAchievement(name) {
|
|
return new Promise((resolve) => {
|
|
greenworks.getAchievement(name, playerHas => resolve(playerHas ? name : ""), err => {
|
|
log.warn(`Failed to get Steam achievement ${name} status: ${err}`);
|
|
resolve("");
|
|
});
|
|
});
|
|
}
|
|
|
|
function disableAchievementsInterval(window) {
|
|
if (window.achievementsIntervalID) {
|
|
clearInterval(window.achievementsIntervalID);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
enableAchievementsInterval, disableAchievementsInterval
|
|
}
|