diff --git a/css/popupboxes.css b/css/popupboxes.css
index 9a6ce8843..708102496 100644
--- a/css/popupboxes.css
+++ b/css/popupboxes.css
@@ -296,4 +296,8 @@
color: white;
text-decoration: none;
cursor: pointer;
+}
+
+#import-game-file-selector {
+ display:none;
}
\ No newline at end of file
diff --git a/index.html b/index.html
index fce111073..22cb22ea3 100644
--- a/index.html
+++ b/index.html
@@ -750,7 +750,8 @@
Changelog
Save Game
Export Game
- Import Game
+
+ Import Game
Delete Game
(DEBUG) Delete Active Scripts
diff --git a/src/Constants.js b/src/Constants.js
index 538b41c93..071d21dd9 100644
--- a/src/Constants.js
+++ b/src/Constants.js
@@ -535,6 +535,10 @@ CONSTANTS = {
"RAM Upgrades on your home computer",
Changelog:
+ "v0.20.1
" +
+ "-Fixed bug where sometimes scripts would crash without showing the error
" +
+ "-Added Deepscan programs to Dark Web
" +
+ "-" +
"v0.20.0
" +
"-Refactored Netscript Interpreter code. Operations in Netscript should now run significantly faster (Every operation " +
"such as a variable assignment, a function call, a binary operator, getting a variable's value, etc. used to take up to several seconds, " +
diff --git a/src/Message.js b/src/Message.js
index 64c1fa533..0adbd7dee 100644
--- a/src/Message.js
+++ b/src/Message.js
@@ -71,7 +71,7 @@ function checkForMessagesToSend() {
sendMessage(bitrunnersTest);
} if (jumper5 && !jumper5.recvd && Player.hacking_skill >= 900) {
sendMessage(jumper5);
- Player.getHomeComputer.programs.push(Programs.Flight);
+ Player.getHomeComputer().programs.push(Programs.Flight);
}
}
diff --git a/src/SaveObject.js b/src/SaveObject.js
index 8d701dfca..a1ee2ba88 100644
--- a/src/SaveObject.js
+++ b/src/SaveObject.js
@@ -33,19 +33,13 @@ BitburnerSaveObject.prototype.saveGame = function() {
Engine.createStatusText("Game saved!");
}
-loadGame = function(saveObj, imported=false) {
- var saveString = "";
- if (imported) {
-
- } else {
- if (!window.localStorage.getItem("bitburnerSave")) {
- console.log("No save file to load");
- return false;
- }
- var saveString = decodeURIComponent(escape(atob(window.localStorage.getItem("bitburnerSave"))));
+loadGame = function(saveObj) {
+ if (!window.localStorage.getItem("bitburnerSave")) {
+ console.log("No save file to load");
+ return false;
}
-
- saveObj = JSON.parse(saveString, Reviver);
+ var saveString = decodeURIComponent(escape(atob(window.localStorage.getItem("bitburnerSave"))));
+ saveObj = JSON.parse(saveString, Reviver);
Player = JSON.parse(saveObj.PlayerSave, Reviver);
AllServers = JSON.parse(saveObj.AllServersSave, Reviver);
@@ -87,7 +81,119 @@ loadGame = function(saveObj, imported=false) {
return true;
}
+loadImportedGame = function(saveObj, saveString) {
+ var tempSaveObj = null;
+ var tempPlayer = null;
+ var tempAllServers = null;
+ var tempCompanies = null;
+ var tempFactions = null;
+ var tempSpecialServerIps = null;
+ var tempAugmentations = null;
+ var tempAliases = null;
+ var tempMessages = null;
+ try {
+ saveString = decodeURIComponent(escape(atob(saveString)));
+ tempSaveObj = new BitburnerSaveObject();
+ tempSaveObj = JSON.parse(saveString, Reviver);
+
+ tempPlayer = JSON.parse(tempSaveObj.PlayerSave, Reviver);
+ tempAllServers = JSON.parse(tempSaveObj.AllServersSave, Reviver);
+ tempCompanies = JSON.parse(tempSaveObj.CompaniesSave, Reviver);
+ tempFactions = JSON.parse(tempSaveObj.FactionsSave, Reviver);
+ tempSpecialServerIps = JSON.parse(tempSaveObj.SpecialServerIpsSave, Reviver);
+ tempAugmentations = JSON.parse(tempSaveObj.AugmentationsSave, Reviver);
+ if (tempSaveObj.hasOwnProperty("AliasesSave")) {
+ try {
+ tempAliases = JSON.parse(tempSaveObj.AliasesSave, Reviver);
+ } catch(e) {
+ tempAliases = {};
+ }
+ } else {
+ tempAliases = {};
+ }
+ if (tempSaveObj.hasOwnProperty("MessagesSave")) {
+ try {
+ tempMessages = JSON.parse(tempSaveObj.MessagesSave, Reviver);
+ } catch(e) {
+ initMessages();
+ }
+ } else {
+ initMessages();
+ }
+ if (tempSaveObj.hasOwnProperty("VersionSave")) {
+ try {
+ var ver = JSON.parse(tempSaveObj.VersionSave, Reviver);
+ if (ver != CONSTANTS.Version) {
+ createNewUpdateText();
+ }
+ } catch(e) {
+ createNewUpdateText();
+ }
+ } else {
+ createNewUpdateText();
+ }
+ } catch(e) {
+ dialogBoxCreate("Error importing game");
+ return false;
+ }
+
+ saveObj = tempSaveObj;
+ Player = tempPlayer;
+ AllServers = tempAllServers;
+ Companies = tempCompanies;
+ Factions = tempFactions;
+ SpecialServerIps = tempSpecialServerIps;
+ Augmentations = tempAugmentations;
+ if (tempAliases) {
+ Aliases = tempAliases;
+ }
+
+ if (tempMessages) {
+ Messages = tempMessages;
+ }
+
+ dialogBoxCreate("Imported game");
+ return true;
+}
+
BitburnerSaveObject.prototype.exportGame = function() {
+ this.PlayerSave = JSON.stringify(Player);
+ this.AllServersSave = JSON.stringify(AllServers);
+ this.CompaniesSave = JSON.stringify(Companies);
+ this.FactionsSave = JSON.stringify(Factions);
+ this.SpecialServerIpsSave = JSON.stringify(SpecialServerIps);
+ this.AugmentationsSave = JSON.stringify(Augmentations);
+ this.AliasesSave = JSON.stringify(Aliases);
+ this.MessagesSave = JSON.stringify(Messages);
+ this.VersionSave = JSON.stringify(CONSTANTS.Version);
+
+ var saveString = btoa(unescape(encodeURIComponent(JSON.stringify(this))));
+
+ var file = new Blob([saveString], {type: 'text/plain'});
+ if (window.navigator.msSaveOrOpenBlob) {// IE10+
+ window.navigator.msSaveOrOpenBlob(file, filename);
+ } else { // Others
+ var a = document.createElement("a"),
+ url = URL.createObjectURL(file);
+ a.href = url;
+ a.download = "bitburnerSave.json";
+ document.body.appendChild(a);
+ a.click();
+ setTimeout(function() {
+ document.body.removeChild(a);
+ window.URL.revokeObjectURL(url);
+ }, 0);
+ }
+}
+
+BitburnerSaveObject.prototype.importGame = function() {
+ if (window.File && window.FileReader && window.FileList && window.Blob) {
+ var fileSelector = clearEventListeners("import-game-file-selector");
+ fileSelector.addEventListener("change", openImportFileHandler, false);
+ $("#import-game-file-selector").click();
+ } else {
+ dialogBoxCreate("ERR: Your browser does not support HTML5 File API. Cannot import.");
+ }
}
@@ -114,4 +220,21 @@ BitburnerSaveObject.fromJSON = function(value) {
return Generic_fromJSON(BitburnerSaveObject, value.data);
}
-Reviver.constructors.BitburnerSaveObject = BitburnerSaveObject;
\ No newline at end of file
+Reviver.constructors.BitburnerSaveObject = BitburnerSaveObject;
+
+//Import game
+
+function openImportFileHandler(evt) {
+ var file = evt.target.files[0];
+ if (!file) {
+ dialogBoxCreate("Invalid file selected");
+ return;
+ }
+
+ var reader = new FileReader();
+ reader.onload = function(e) {
+ var contents = e.target.result;
+ loadImportedGame(saveObject, contents);
+ };
+ reader.readAsText(file);
+}
\ No newline at end of file
diff --git a/src/engine.js b/src/engine.js
index f96c399eb..e27f86a84 100644
--- a/src/engine.js
+++ b/src/engine.js
@@ -890,7 +890,7 @@ var Engine = {
//Active scripts list
Engine.ActiveScriptsList = document.getElementById("active-scripts-list");
- //Save and Delete buttons
+ //Save, Delete, Import/Export buttons
Engine.Clickables.saveMainMenuButton = document.getElementById("save-game-link");
Engine.Clickables.saveMainMenuButton.addEventListener("click", function() {
saveObject.saveGame();
@@ -903,6 +903,11 @@ var Engine = {
return false;
});
+ document.getElementById("export-game-link").addEventListener("click", function() {
+ saveObject.exportGame();
+ return false;
+ });
+
//Character Overview Save button
var charOverviewSaveButton = document.getElementById("character-overview-save-button");
charOverviewSaveButton.addEventListener("click", function() {