2016-10-17 10:24:39 +02:00
|
|
|
var Engine = {
|
2017-06-07 02:04:18 +02:00
|
|
|
version: "",
|
2017-01-31 04:41:42 +01:00
|
|
|
Debug: true,
|
2017-05-05 03:08:44 +02:00
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
//Clickable objects
|
2017-01-09 23:14:18 +01:00
|
|
|
Clickables: {
|
2016-10-17 10:24:39 +02:00
|
|
|
//Main menu buttons
|
2017-01-31 04:41:42 +01:00
|
|
|
terminalMainMenuButton: null,
|
|
|
|
characterMainMenuButton: null,
|
|
|
|
scriptEditorMainMenuButton: null,
|
|
|
|
activeScriptsMainMenuButton: null,
|
2017-04-27 22:02:58 +02:00
|
|
|
hacknetNodesMainMenuButton: null,
|
2017-01-31 04:41:42 +01:00
|
|
|
worldMainMenuButton: null,
|
|
|
|
createProgramMainMenuButton: null,
|
|
|
|
factionsMainMenuButton: null,
|
|
|
|
augmentationsMainMenuButton: null,
|
|
|
|
tutorialMainMenuButton: null,
|
|
|
|
saveMainMenuButton: null,
|
|
|
|
deleteMainMenuButton: null,
|
2017-03-31 23:47:06 +02:00
|
|
|
|
|
|
|
//Tutorial buttons
|
|
|
|
tutorialGettingStartedButton: null,
|
|
|
|
tutorialNetworkingButton: null,
|
|
|
|
tutorialHackingButton: null,
|
|
|
|
tutorialScriptsButton: null,
|
2017-05-07 00:19:18 +02:00
|
|
|
tutorialNetscriptButton: null,
|
2017-03-31 23:47:06 +02:00
|
|
|
tutorialTravelingButton: null,
|
|
|
|
tutorialJobsButton: null,
|
|
|
|
tutorialFactionsButton: null,
|
|
|
|
tutorialAugmentationsButton: null,
|
|
|
|
tutorialBackButton: null,
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
//Display objects
|
|
|
|
Display: {
|
|
|
|
//Progress bar
|
2017-01-31 04:41:42 +01:00
|
|
|
progress: null,
|
2016-10-17 10:24:39 +02:00
|
|
|
|
|
|
|
//Display for status text (such as "Saved" or "Loaded")
|
2017-01-31 04:41:42 +01:00
|
|
|
statusText: null,
|
|
|
|
|
|
|
|
hacking_skill: null,
|
2016-10-17 10:24:39 +02:00
|
|
|
|
|
|
|
//Main menu content
|
2017-02-28 18:10:35 +01:00
|
|
|
terminalContent: null,
|
|
|
|
characterContent: null,
|
|
|
|
scriptEditorContent: null,
|
|
|
|
activeScriptsContent: null,
|
2017-04-27 22:02:58 +02:00
|
|
|
hacknetNodesContent: null,
|
2017-02-28 18:10:35 +01:00
|
|
|
worldContent: null,
|
|
|
|
createProgramContent: null,
|
|
|
|
factionsContent: null,
|
|
|
|
factionContent: null,
|
|
|
|
factionAugmentationsContent: null,
|
|
|
|
augmentationsContent: null,
|
|
|
|
tutorialContent: null,
|
2017-06-28 22:53:12 +02:00
|
|
|
infiltrationContent: null,
|
2017-02-28 18:10:35 +01:00
|
|
|
locationContent: null,
|
|
|
|
workInProgressContent: null,
|
2016-10-17 10:24:39 +02:00
|
|
|
|
|
|
|
//Character info
|
2017-02-28 18:10:35 +01:00
|
|
|
characterInfo: null,
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
//Script editor text
|
2017-02-28 18:10:35 +01:00
|
|
|
scriptEditorText: null,
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
//Current page status
|
|
|
|
Page: {
|
|
|
|
Terminal: "Terminal",
|
|
|
|
CharacterInfo: "CharacterInfo",
|
|
|
|
ScriptEditor: "ScriptEditor",
|
|
|
|
ActiveScripts: "ActiveScripts",
|
2017-04-27 22:02:58 +02:00
|
|
|
HacknetNodes: "HacknetNodes",
|
2017-01-31 04:41:42 +01:00
|
|
|
World: "World",
|
|
|
|
CreateProgram: "CreateProgram",
|
|
|
|
Factions: "Factions",
|
2017-01-28 04:10:16 +01:00
|
|
|
Faction: "Faction",
|
2017-01-31 04:41:42 +01:00
|
|
|
Augmentations: "Augmentations",
|
|
|
|
Tutorial: "Tutorial",
|
|
|
|
Location: "Location",
|
2017-02-16 19:52:11 +01:00
|
|
|
workInProgress: "WorkInProgress",
|
2017-01-31 04:41:42 +01:00
|
|
|
},
|
|
|
|
currentPage: null,
|
2016-11-24 23:30:33 +01:00
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
//Time variables (milliseconds unix epoch time)
|
|
|
|
_lastUpdate: new Date().getTime(),
|
|
|
|
_idleSpeed: 200, //Speed (in ms) at which the main loop is updated
|
2016-10-17 10:24:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* Load content when a main menu button is clicked */
|
|
|
|
loadTerminalContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.terminalContent.style.visibility = "visible";
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.currentPage = Engine.Page.Terminal;
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
loadCharacterContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.characterContent.style.visibility = "visible";
|
|
|
|
Engine.displayCharacterInfo();
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.currentPage = Engine.Page.CharacterInfo;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadScriptEditorContent: function(filename = "", code = "") {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.scriptEditorContent.style.visibility = "visible";
|
2017-06-02 19:18:53 +02:00
|
|
|
if (filename != "") {
|
2017-01-31 04:41:42 +01:00
|
|
|
document.getElementById("script-editor-filename").value = filename;
|
2017-06-02 19:18:53 +02:00
|
|
|
document.getElementById("script-editor-text").value = code;
|
2017-01-31 04:41:42 +01:00
|
|
|
}
|
2017-05-16 05:06:25 +02:00
|
|
|
document.getElementById("script-editor-text").focus();
|
2017-05-15 03:43:10 +02:00
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.currentPage = Engine.Page.ScriptEditor;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadActiveScriptsContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.activeScriptsContent.style.visibility = "visible";
|
2017-06-06 23:22:57 +02:00
|
|
|
setActiveScriptsClickHandlers();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.ActiveScripts;
|
|
|
|
},
|
|
|
|
|
2017-04-27 22:02:58 +02:00
|
|
|
loadHacknetNodesContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.hacknetNodesContent.style.visibility = "visible";
|
|
|
|
displayHacknetNodesContent();
|
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.HacknetNodes;
|
|
|
|
},
|
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
loadWorldContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.worldContent.style.visibility = "visible";
|
|
|
|
Engine.displayWorldInfo();
|
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.World;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadCreateProgramContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.createProgramContent.style.visibility = "visible";
|
2017-02-28 22:20:37 +01:00
|
|
|
displayCreateProgramContent();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.CreateProgram;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadFactionsContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.factionsContent.style.visibility = "visible";
|
2017-02-20 23:45:36 +01:00
|
|
|
Engine.displayFactionsInfo();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.Factions;
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
2017-01-28 04:10:16 +01:00
|
|
|
|
|
|
|
loadFactionContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.factionContent.style.visibility = "visible";
|
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.Faction;
|
|
|
|
},
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
loadAugmentationsContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.augmentationsContent.style.visibility = "visible";
|
2017-02-20 23:45:36 +01:00
|
|
|
Engine.displayAugmentationsContent();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.Augmentations;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadTutorialContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.tutorialContent.style.visibility = "visible";
|
2017-03-31 23:47:06 +02:00
|
|
|
Engine.displayTutorialContent();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.Tutorial;
|
|
|
|
},
|
|
|
|
|
|
|
|
loadLocationContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
Engine.Display.locationContent.style.visibility = "visible";
|
2017-01-31 05:43:33 +01:00
|
|
|
displayLocationContent();
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
Engine.currentPage = Engine.Page.Location;
|
|
|
|
},
|
2016-10-17 10:24:39 +02:00
|
|
|
|
2017-02-08 01:27:11 +01:00
|
|
|
loadWorkInProgressContent: function() {
|
|
|
|
Engine.hideAllContent();
|
|
|
|
|
|
|
|
var mainMenu = document.getElementById("mainmenu-container");
|
|
|
|
mainMenu.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.workInProgressContent.style.visibility = "visible";
|
|
|
|
|
2017-02-16 19:52:11 +01:00
|
|
|
Engine.currentPage = Engine.Page.WorkInProgress;
|
2017-02-08 01:27:11 +01:00
|
|
|
},
|
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
//Helper function that hides all content
|
|
|
|
hideAllContent: function() {
|
|
|
|
Engine.Display.terminalContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.characterContent.style.visibility = "hidden";
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Display.scriptEditorContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.activeScriptsContent.style.visibility = "hidden";
|
2017-04-27 22:02:58 +02:00
|
|
|
Engine.Display.hacknetNodesContent.style.visibility = "hidden";
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Display.worldContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.createProgramContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.factionsContent.style.visibility = "hidden";
|
2017-01-28 04:10:16 +01:00
|
|
|
Engine.Display.factionContent.style.visibility = "hidden";
|
2017-02-28 18:10:35 +01:00
|
|
|
Engine.Display.factionAugmentationsContent.style.visibility = "hidden";
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Display.augmentationsContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.tutorialContent.style.visibility = "hidden";
|
|
|
|
Engine.Display.locationContent.style.visibility = "hidden";
|
2017-02-08 01:27:11 +01:00
|
|
|
Engine.Display.workInProgressContent.style.visibility = "hidden";
|
2017-01-28 04:10:16 +01:00
|
|
|
|
|
|
|
//Location lists
|
|
|
|
Engine.aevumLocationsList.style.display = "none";
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.chongqingLocationsList.style.display = "none";
|
|
|
|
Engine.sector12LocationsList.style.display = "none";
|
|
|
|
Engine.newTokyoLocationsList.style.display = "none";
|
|
|
|
Engine.ishimaLocationsList.style.display = "none";
|
|
|
|
Engine.volhavenLocationsList.style.display = "none";
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
|
|
|
|
2017-05-20 09:33:33 +02:00
|
|
|
displayCharacterOverviewInfo: function() {
|
|
|
|
document.getElementById("character-overview-text").innerHTML =
|
|
|
|
("Money: $" + formatNumber(Player.money, 2) + "<br>" +
|
|
|
|
"Hack: " + (Player.hacking_skill).toLocaleString() + "<br>" +
|
|
|
|
"Str: " + (Player.strength).toLocaleString() + "<br>" +
|
|
|
|
"Def: " + (Player.defense).toLocaleString() + "<br>" +
|
|
|
|
"Dex: " + (Player.dexterity).toLocaleString() + "<br>" +
|
|
|
|
"Agi: " + (Player.agility).toLocaleString() + "<br>" +
|
|
|
|
"Cha: " + (Player.charisma).toLocaleString()
|
|
|
|
).replace( / /g, " " );
|
|
|
|
},
|
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
/* Display character info */
|
|
|
|
displayCharacterInfo: function() {
|
2017-02-03 23:05:59 +01:00
|
|
|
var companyPosition = "";
|
|
|
|
if (Player.companyPosition != "") {
|
|
|
|
companyPosition = Player.companyPosition.positionName;
|
|
|
|
}
|
2017-05-04 22:50:17 +02:00
|
|
|
Engine.Display.characterInfo.innerHTML =
|
2017-05-05 03:08:44 +02:00
|
|
|
('<b>General</b><br><br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Current City: ' + Player.city + '<br><br>' +
|
|
|
|
'Employer: ' + Player.companyName + '<br>' +
|
|
|
|
'Job Title: ' + companyPosition + '<br><br>' +
|
|
|
|
'Money: $' + formatNumber(Player.money, 2)+ '<br><br><br>' +
|
|
|
|
'<b>Stats</b><br><br>' +
|
|
|
|
'Hacking Level: ' + (Player.hacking_skill).toLocaleString() +
|
|
|
|
" (" + formatNumber(Player.hacking_exp, 4) + ' experience)<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Strength: ' + (Player.strength).toLocaleString() +
|
2017-05-04 22:50:17 +02:00
|
|
|
" (" + formatNumber(Player.strength_exp, 4) + ' experience)<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Defense: ' + (Player.defense).toLocaleString() +
|
2017-05-04 22:50:17 +02:00
|
|
|
" (" + formatNumber(Player.defense_exp, 4) + ' experience)<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Dexterity: ' + (Player.dexterity).toLocaleString() +
|
2017-05-04 22:50:17 +02:00
|
|
|
" (" + formatNumber(Player.dexterity_exp, 4) + ' experience)<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Agility: ' + (Player.agility).toLocaleString() +
|
2017-05-04 22:50:17 +02:00
|
|
|
" (" + formatNumber(Player.agility_exp, 4) + ' experience)<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Charisma: ' + (Player.charisma).toLocaleString() +
|
2017-05-04 22:50:17 +02:00
|
|
|
" (" + formatNumber(Player.charisma_exp, 4) + ' experience)<br><br><br>' +
|
|
|
|
'<b>Multipliers</b><br><br>' +
|
|
|
|
'Hacking Chance multiplier: ' + formatNumber(Player.hacking_chance_mult * 100, 2) + '%<br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Hacking Speed multiplier: ' + formatNumber(Player.hacking_speed_mult * 100, 2) + '%<br>' +
|
2017-05-31 18:02:40 +02:00
|
|
|
'Hacking Money multiplier: ' + formatNumber(Player.hacking_money_mult * 100, 2) + '%<br>' +
|
|
|
|
'Hacking Growth multiplier: ' + formatNumber(Player.hacking_grow_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Hacking Level multiplier: ' + formatNumber(Player.hacking_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Hacking Experience multiplier: ' + formatNumber(Player.hacking_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Strength Level multiplier: ' + formatNumber(Player.strength_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Strength Experience multiplier: ' + formatNumber(Player.strength_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Defense Level multiplier: ' + formatNumber(Player.defense_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Defense Experience multiplier: ' + formatNumber(Player.defense_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Dexterity Level multiplier: ' + formatNumber(Player.dexterity_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Dexterity Experience multiplier: ' + formatNumber(Player.dexterity_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Agility Level multiplier: ' + formatNumber(Player.agility_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Agility Experience multiplier: ' + formatNumber(Player.agility_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Charisma Level multiplier: ' + formatNumber(Player.charisma_mult * 100, 2) + '%<br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'Charisma Experience multiplier: ' + formatNumber(Player.charisma_exp_mult * 100, 2) + '%<br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Hacknet Node production multiplier: ' + formatNumber(Player.hacknet_node_money_mult * 100, 2) + '%<br>' +
|
|
|
|
'Hacknet Node purchase cost multiplier: ' + formatNumber(Player.hacknet_node_purchase_cost_mult * 100, 2) + '%<br>' +
|
2017-05-30 00:37:38 +02:00
|
|
|
'Hacknet Node RAM upgrade cost multiplier: ' + formatNumber(Player.hacknet_node_ram_cost_mult * 100, 2) + '%<br>' +
|
|
|
|
'Hacknet Node Core purchase cost multiplier: ' + formatNumber(Player.hacknet_node_core_cost_mult * 100, 2) + '%<br>' +
|
|
|
|
'Hacknet Node level upgrade cost multiplier: ' + formatNumber(Player.hacknet_node_level_cost_mult * 100, 2) + '%<br><br>' +
|
|
|
|
'Company reputation gain multiplier: ' + formatNumber(Player.company_rep_mult * 100, 2) + '%<br>' +
|
|
|
|
'Faction reputation gain multiplier: ' + formatNumber(Player.faction_rep_mult * 100, 2) + '%<br>' +
|
|
|
|
'Salary multiplier: ' + formatNumber(Player.work_money_mult * 100, 2) + '%<br>' +
|
|
|
|
'Crime success multiplier: ' + formatNumber(Player.crime_success_mult * 100, 2) + '%<br>' +
|
2017-05-12 20:12:32 +02:00
|
|
|
'Crime money multiplier: ' + formatNumber(Player.crime_money_mult * 100, 2) + '%<br><br><br>' +
|
2017-05-04 22:50:17 +02:00
|
|
|
'<b>Misc</b><br><br>' +
|
2017-05-05 03:08:44 +02:00
|
|
|
'Servers owned: ' + Player.purchasedServers.length + '<br>' +
|
2017-05-15 16:15:59 +02:00
|
|
|
'Hacknet Nodes owned: ' + Player.hacknetNodes.length + '<br>' +
|
2017-06-17 19:47:04 +02:00
|
|
|
'Time played since last Augmentation: ' + convertTimeMsToTimeElapsedString(Player.playtimeSinceLastAug) + '<br>' +
|
2017-05-15 16:15:59 +02:00
|
|
|
'Time played: ' + convertTimeMsToTimeElapsedString(Player.totalPlaytime) + '<br><br><br>').replace( / /g, " " );
|
2016-10-17 10:24:39 +02:00
|
|
|
},
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
/* Display locations in the world*/
|
|
|
|
aevumLocationsList: null,
|
|
|
|
chongqingLocationsList: null,
|
|
|
|
sector12LocationsList: null,
|
|
|
|
newTokyoLocationsList: null,
|
|
|
|
ishimaLocationsList: null,
|
|
|
|
volhavenLocationsList: null,
|
|
|
|
|
|
|
|
displayWorldInfo: function() {
|
|
|
|
Engine.aevumLocationsList.style.display = "none";
|
|
|
|
Engine.chongqingLocationsList.style.display = "none";
|
|
|
|
Engine.sector12LocationsList.style.display = "none";
|
|
|
|
Engine.newTokyoLocationsList.style.display = "none";
|
|
|
|
Engine.ishimaLocationsList.style.display = "none";
|
|
|
|
Engine.volhavenLocationsList.style.display = "none";
|
|
|
|
|
2017-05-06 21:12:45 +02:00
|
|
|
document.getElementById("world-city-name").innerHTML = Player.city;
|
|
|
|
var cityDesc = document.getElementById("world-city-desc"); //TODO
|
2017-01-31 04:41:42 +01:00
|
|
|
switch(Player.city) {
|
2017-05-06 21:12:45 +02:00
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
case Locations.Aevum:
|
|
|
|
Engine.aevumLocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
case Locations.Chongqing:
|
|
|
|
Engine.chongqingLocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
case Locations.Sector12:
|
|
|
|
Engine.sector12LocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
case Locations.NewTokyo:
|
|
|
|
Engine.newTokyoLocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
case Locations.Ishima:
|
|
|
|
Engine.ishimaLocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
case Locations.Volhaven:
|
|
|
|
Engine.volhavenLocationsList.style.display = "inline";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
console.log("Invalid city value in Player object!");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-02-20 23:45:36 +01:00
|
|
|
displayFactionsInfo: function() {
|
|
|
|
var factionsList = document.getElementById("factions-list");
|
|
|
|
|
2017-04-19 07:02:40 +02:00
|
|
|
//Clear the list
|
|
|
|
while (factionsList.firstChild) {
|
|
|
|
factionsList.removeChild(factionsList.firstChild);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Re-add a link for each faction you are a member of
|
2017-02-20 23:45:36 +01:00
|
|
|
for (var i = 0; i < Player.factions.length; ++i) {
|
2017-05-04 21:29:50 +02:00
|
|
|
(function () {
|
|
|
|
var factionName = Player.factions[i];
|
|
|
|
|
|
|
|
//Add the faction to the Factions page content
|
|
|
|
var item = document.createElement("li");
|
|
|
|
var aElem = document.createElement("a");
|
|
|
|
aElem.setAttribute("href", "#");
|
|
|
|
aElem.setAttribute("class", "a-link-button");
|
|
|
|
aElem.innerHTML = factionName;
|
|
|
|
aElem.addEventListener("click", function() {
|
|
|
|
Engine.loadFactionContent();
|
|
|
|
displayFactionContent(factionName);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
item.appendChild(aElem);
|
|
|
|
|
|
|
|
factionsList.appendChild(item);
|
|
|
|
}()); //Immediate invocation
|
2017-02-20 23:45:36 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
displayAugmentationsContent: function() {
|
2017-06-26 01:39:17 +02:00
|
|
|
//Purchased/queued augmentations
|
|
|
|
var queuedAugmentationsList = document.getElementById("queued-augmentations-list");
|
|
|
|
|
|
|
|
while (queuedAugmentationsList.firstChild) {
|
|
|
|
queuedAugmentationsList.removeChild(queuedAugmentationsList.firstChild);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var i = 0; i < Player.queuedAugmentations.length; ++i) {
|
|
|
|
var augName = Player.queuedAugmentations[i].name;
|
|
|
|
var aug = Augmentations[augName];
|
|
|
|
|
|
|
|
var item = document.createElement("li");
|
|
|
|
var hElem = document.createElement("h2");
|
|
|
|
var pElem = document.createElement("p");
|
|
|
|
|
|
|
|
item.setAttribute("class", "installed-augmentation");
|
|
|
|
hElem.innerHTML = augName;
|
|
|
|
if (augName == AugmentationNames.NeuroFluxGovernor) {
|
|
|
|
hElem.innerHTML += " - Level " + (Player.queuedAugmentations[i].level);
|
|
|
|
}
|
|
|
|
pElem.innerHTML = aug.info;
|
|
|
|
|
|
|
|
item.appendChild(hElem);
|
|
|
|
item.appendChild(pElem);
|
|
|
|
|
|
|
|
queuedAugmentationsList.appendChild(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Install Augmentations button
|
|
|
|
var installButton = clearEventListeners("install-augmentations-button");
|
|
|
|
installButton.addEventListener("click", function() {
|
|
|
|
installAugmentations();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
//Installed augmentations
|
2017-02-20 23:45:36 +01:00
|
|
|
var augmentationsList = document.getElementById("augmentations-list");
|
|
|
|
|
2017-05-05 20:13:31 +02:00
|
|
|
while (augmentationsList.firstChild) {
|
|
|
|
augmentationsList.removeChild(augmentationsList.firstChild);
|
|
|
|
}
|
|
|
|
|
2017-02-20 23:45:36 +01:00
|
|
|
for (var i = 0; i < Player.augmentations.length; ++i) {
|
2017-06-24 23:33:44 +02:00
|
|
|
var augName = Player.augmentations[i].name;
|
2017-02-20 23:45:36 +01:00
|
|
|
var aug = Augmentations[augName];
|
|
|
|
|
|
|
|
var item = document.createElement("li");
|
|
|
|
var hElem = document.createElement("h2");
|
|
|
|
var pElem = document.createElement("p");
|
|
|
|
|
|
|
|
item.setAttribute("class", "installed-augmentation");
|
|
|
|
hElem.innerHTML = augName;
|
2017-05-07 12:04:54 +02:00
|
|
|
if (augName == AugmentationNames.NeuroFluxGovernor) {
|
2017-06-26 01:39:17 +02:00
|
|
|
hElem.innerHTML += " - Level " + (Player.augmentations[i].level);
|
2017-05-07 12:04:54 +02:00
|
|
|
}
|
2017-02-20 23:45:36 +01:00
|
|
|
pElem.innerHTML = aug.info;
|
|
|
|
|
|
|
|
item.appendChild(hElem);
|
|
|
|
item.appendChild(pElem);
|
|
|
|
|
|
|
|
augmentationsList.appendChild(item);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-03-31 23:47:06 +02:00
|
|
|
displayTutorialContent: function() {
|
|
|
|
Engine.Clickables.tutorialGettingStartedButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialNetworkingButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialHackingButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialScriptsButton.style.display = "block";
|
2017-05-07 00:19:18 +02:00
|
|
|
Engine.Clickables.tutorialNetscriptButton.style.display = "block";
|
2017-03-31 23:47:06 +02:00
|
|
|
Engine.Clickables.tutorialTravelingButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialJobsButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialFactionsButton.style.display = "block";
|
|
|
|
Engine.Clickables.tutorialAugmentationsButton.style.display = "block";
|
|
|
|
|
2017-04-13 19:33:34 +02:00
|
|
|
Engine.Clickables.tutorialBackButton.style.display = "none";
|
2017-03-31 23:47:06 +02:00
|
|
|
document.getElementById("tutorial-text").style.display = "none";
|
|
|
|
},
|
|
|
|
|
|
|
|
//Displays the text when a section of the Tutorial is opened
|
|
|
|
displayTutorialPage: function(text) {
|
|
|
|
Engine.Clickables.tutorialGettingStartedButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialNetworkingButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialHackingButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialScriptsButton.style.display = "none";
|
2017-05-07 00:19:18 +02:00
|
|
|
Engine.Clickables.tutorialNetscriptButton.style.display = "none";
|
2017-03-31 23:47:06 +02:00
|
|
|
Engine.Clickables.tutorialTravelingButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialJobsButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialFactionsButton.style.display = "none";
|
|
|
|
Engine.Clickables.tutorialAugmentationsButton.style.display = "none";
|
|
|
|
|
2017-04-13 19:33:34 +02:00
|
|
|
Engine.Clickables.tutorialBackButton.style.display = "inline-block";
|
2017-03-31 23:47:06 +02:00
|
|
|
document.getElementById("tutorial-text").style.display = "block";
|
|
|
|
document.getElementById("tutorial-text").innerHTML = text;
|
|
|
|
},
|
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
/* Main Event Loop */
|
|
|
|
idleTimer: function() {
|
|
|
|
//Get time difference
|
|
|
|
var _thisUpdate = new Date().getTime();
|
|
|
|
var diff = _thisUpdate - Engine._lastUpdate;
|
2016-12-02 22:57:20 +01:00
|
|
|
var offset = diff % Engine._idleSpeed;
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2016-11-21 07:11:14 +01:00
|
|
|
//Divide this by cycle time to determine how many cycles have elapsed since last update
|
2016-12-01 23:39:13 +01:00
|
|
|
diff = Math.floor(diff / Engine._idleSpeed);
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2016-11-21 07:11:14 +01:00
|
|
|
if (diff > 0) {
|
|
|
|
//Update the game engine by the calculated number of cycles
|
2016-12-02 22:57:20 +01:00
|
|
|
Engine._lastUpdate = _thisUpdate - offset;
|
2017-01-31 04:41:42 +01:00
|
|
|
Player.lastUpdate = _thisUpdate - offset;
|
2017-05-15 22:12:19 +02:00
|
|
|
Engine.updateGame(diff);
|
2016-11-21 07:11:14 +01:00
|
|
|
}
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
window.requestAnimationFrame(Engine.idleTimer);
|
|
|
|
},
|
2016-11-21 07:11:14 +01:00
|
|
|
|
2016-12-15 23:22:42 +01:00
|
|
|
updateGame: function(numCycles = 1) {
|
2017-05-15 16:15:59 +02:00
|
|
|
//Update total playtime
|
|
|
|
var time = numCycles * Engine._idleSpeed;
|
|
|
|
if (Player.totalPlaytime == null) {Player.totalPlaytime = 0;}
|
2017-06-17 19:47:04 +02:00
|
|
|
if (Player.playtimeSinceLastAug == null) {Player.playtimeSinceLastAug = 0;}
|
2017-05-15 16:15:59 +02:00
|
|
|
Player.totalPlaytime += time;
|
2017-06-17 19:47:04 +02:00
|
|
|
Player.playtimeSinceLastAug += time;
|
2017-05-15 16:15:59 +02:00
|
|
|
|
2017-02-08 05:48:50 +01:00
|
|
|
//Start Manual hack
|
2017-01-31 04:41:42 +01:00
|
|
|
if (Player.startAction == true) {
|
|
|
|
Engine._totalActionTime = Player.actionTime;
|
|
|
|
Engine._actionTimeLeft = Player.actionTime;
|
|
|
|
Engine._actionInProgress = true;
|
|
|
|
Engine._actionProgressBarCount = 1;
|
|
|
|
Engine._actionProgressStr = "[ ]";
|
|
|
|
Engine._actionTimeStr = "Time left: ";
|
|
|
|
Player.startAction = false;
|
|
|
|
}
|
|
|
|
|
2017-04-24 21:10:35 +02:00
|
|
|
//Working
|
2017-02-06 06:01:01 +01:00
|
|
|
if (Player.isWorking) {
|
2017-04-24 21:10:35 +02:00
|
|
|
if (Player.workType == CONSTANTS.WorkTypeFaction) {
|
2017-04-13 22:21:03 +02:00
|
|
|
Player.workForFaction(numCycles);
|
2017-04-24 21:10:35 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCreateProgram) {
|
2017-04-13 22:21:03 +02:00
|
|
|
Player.createProgramWork(numCycles);
|
2017-04-24 21:10:35 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeStudyClass) {
|
2017-05-04 07:27:22 +02:00
|
|
|
Player.takeClass(numCycles);
|
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCrime) {
|
|
|
|
Player.commitCrime(numCycles);
|
2017-05-10 22:21:15 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCompanyPartTime) {
|
|
|
|
Player.workPartTime(numCycles);
|
2017-04-13 22:21:03 +02:00
|
|
|
} else {
|
|
|
|
Player.work(numCycles);
|
|
|
|
}
|
2017-02-06 06:01:01 +01:00
|
|
|
}
|
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
//Counters
|
|
|
|
Engine.decrementAllCounters(numCycles);
|
|
|
|
Engine.checkCounters();
|
|
|
|
|
|
|
|
//Manual hacks
|
|
|
|
if (Engine._actionInProgress == true) {
|
|
|
|
Engine.updateHackProgress(numCycles);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Update the running time of all active scripts
|
|
|
|
updateOnlineScriptTimes(numCycles);
|
2017-04-27 22:02:58 +02:00
|
|
|
|
|
|
|
//Hacknet Nodes
|
|
|
|
processAllHacknetNodeEarnings(numCycles);
|
2016-12-15 23:22:42 +01:00
|
|
|
},
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2016-12-02 22:57:20 +01:00
|
|
|
//Counters for the main event loop. Represent the number of game cycles are required
|
|
|
|
//for something to happen.
|
|
|
|
Counters: {
|
2017-01-31 04:41:42 +01:00
|
|
|
autoSaveCounter: 300, //Autosave every minute
|
2017-02-16 19:52:11 +01:00
|
|
|
updateSkillLevelsCounter: 10, //Only update skill levels every 2 seconds. Might improve performance
|
2017-05-04 07:27:22 +02:00
|
|
|
updateDisplays: 3, //Update displays such as Active Scripts display and character display
|
2017-05-05 18:52:48 +02:00
|
|
|
createProgramNotifications: 10, //Checks whether any programs can be created and notifies
|
2017-06-11 05:45:06 +02:00
|
|
|
checkFactionInvitations: 100, //Check whether you qualify for any faction invitations every 5 minutes
|
2017-05-04 07:05:48 +02:00
|
|
|
passiveFactionGrowth: 600,
|
2017-06-02 06:15:45 +02:00
|
|
|
messages: 300,
|
2016-12-02 22:57:20 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
decrementAllCounters: function(numCycles = 1) {
|
|
|
|
for (var counter in Engine.Counters) {
|
|
|
|
if (Engine.Counters.hasOwnProperty(counter)) {
|
|
|
|
Engine.Counters[counter] = Engine.Counters[counter] - numCycles;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
//Checks if any counters are 0 and if they are, executes whatever
|
|
|
|
//is necessary and then resets the counter
|
|
|
|
checkCounters: function() {
|
|
|
|
if (Engine.Counters.autoSaveCounter <= 0) {
|
2017-05-05 03:08:44 +02:00
|
|
|
saveObject.saveGame();
|
2016-12-02 22:57:20 +01:00
|
|
|
Engine.Counters.autoSaveCounter = 300;
|
|
|
|
}
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
if (Engine.Counters.updateSkillLevelsCounter <= 0) {
|
|
|
|
Player.updateSkillLevels();
|
|
|
|
Engine.Counters.updateSkillLevelsCounter = 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Engine.Counters.updateDisplays <= 0) {
|
2017-05-20 09:33:33 +02:00
|
|
|
Engine.displayCharacterOverviewInfo();
|
2017-01-31 04:41:42 +01:00
|
|
|
if (Engine.currentPage == Engine.Page.ActiveScripts) {
|
2017-06-06 23:22:57 +02:00
|
|
|
updateActiveScriptsItems();
|
2017-01-31 04:41:42 +01:00
|
|
|
} else if (Engine.currentPage == Engine.Page.CharacterInfo) {
|
|
|
|
Engine.displayCharacterInfo();
|
2017-04-27 22:02:58 +02:00
|
|
|
} else if (Engine.currentPage == Engine.Page.HacknetNodes) {
|
|
|
|
updateHacknetNodesContent();
|
2017-05-12 20:12:32 +02:00
|
|
|
} else if (Engine.currentPage == Engine.Page.CreateProgram) {
|
|
|
|
displayCreateProgramContent();
|
2017-04-27 22:02:58 +02:00
|
|
|
}
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2017-06-15 03:19:52 +02:00
|
|
|
if (logBoxOpened) {
|
|
|
|
logBoxUpdateText();
|
|
|
|
}
|
|
|
|
|
2017-05-04 07:27:22 +02:00
|
|
|
Engine.Counters.updateDisplays = 3;
|
2017-01-31 04:41:42 +01:00
|
|
|
}
|
|
|
|
|
2017-05-05 18:52:48 +02:00
|
|
|
if (Engine.Counters.createProgramNotifications <= 0) {
|
|
|
|
var num = getNumAvailableCreateProgram();
|
|
|
|
var elem = document.getElementById("create-program-notification");
|
|
|
|
if (num > 0) {
|
|
|
|
elem.innerHTML = num;
|
|
|
|
elem.setAttribute("class", "notification-on");
|
|
|
|
} else {
|
|
|
|
elem.innerHTML = "";
|
|
|
|
elem.setAttribute("class", "notification-off");
|
|
|
|
}
|
|
|
|
Engine.Counters.createProgramNotifications = 10;
|
|
|
|
}
|
|
|
|
|
2017-02-16 19:52:11 +01:00
|
|
|
if (Engine.Counters.checkFactionInvitations <= 0) {
|
|
|
|
var invitedFactions = Player.checkForFactionInvitations();
|
|
|
|
if (invitedFactions.length > 0) {
|
|
|
|
var randFaction = invitedFactions[Math.floor(Math.random() * invitedFactions.length)];
|
|
|
|
inviteToFaction(randFaction);
|
|
|
|
}
|
2017-06-11 05:45:06 +02:00
|
|
|
Engine.Counters.checkFactionInvitations = 100;
|
2017-02-16 19:52:11 +01:00
|
|
|
}
|
2017-05-04 07:05:48 +02:00
|
|
|
|
|
|
|
if (Engine.Counters.passiveFactionGrowth <= 0) {
|
|
|
|
var adjustedCycles = Math.floor((600 - Engine.Counters.passiveFactionGrowth));
|
|
|
|
processPassiveFactionRepGain(adjustedCycles);
|
|
|
|
Engine.Counters.passiveFactionGrowth = 600;
|
|
|
|
}
|
2017-06-02 06:15:45 +02:00
|
|
|
|
|
|
|
if (Engine.Counters.messages <= 0) {
|
|
|
|
checkForMessagesToSend();
|
|
|
|
Engine.Counters.messages = 300;
|
|
|
|
}
|
2017-01-31 04:41:42 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
/* Calculates the hack progress for a manual (non-scripted) hack and updates the progress bar/time accordingly */
|
|
|
|
_totalActionTime: 0,
|
|
|
|
_actionTimeLeft: 0,
|
|
|
|
_actionTimeStr: "Time left: ",
|
|
|
|
_actionProgressStr: "[ ]",
|
|
|
|
_actionProgressBarCount: 1,
|
|
|
|
_actionInProgress: false,
|
|
|
|
updateHackProgress: function(numCycles = 1) {
|
|
|
|
var timeElapsedMilli = numCycles * Engine._idleSpeed;
|
|
|
|
Engine._actionTimeLeft -= (timeElapsedMilli/ 1000); //Substract idle speed (ms)
|
2017-04-18 06:32:17 +02:00
|
|
|
Engine._actionTimeLeft = Math.max(Engine._actionTimeLeft, 0);
|
2017-01-31 04:41:42 +01:00
|
|
|
|
|
|
|
//Calculate percent filled
|
|
|
|
var percent = Math.round((1 - Engine._actionTimeLeft / Engine._totalActionTime) * 100);
|
|
|
|
|
|
|
|
//Update progress bar
|
|
|
|
while (Engine._actionProgressBarCount * 2 <= percent) {
|
|
|
|
Engine._actionProgressStr = Engine._actionProgressStr.replaceAt(Engine._actionProgressBarCount, "|");
|
|
|
|
Engine._actionProgressBarCount += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Update hack time remaining
|
|
|
|
Engine._actionTimeStr = "Time left: " + Math.max(0, Math.round(Engine._actionTimeLeft)).toString() + "s";
|
|
|
|
document.getElementById("hack-progress").innerHTML = Engine._actionTimeStr;
|
|
|
|
|
|
|
|
//Dynamically update progress bar
|
|
|
|
document.getElementById("hack-progress-bar").innerHTML = Engine._actionProgressStr.replace( / /g, " " );
|
|
|
|
|
|
|
|
//Once percent is 100, the hack is completed
|
|
|
|
if (percent >= 100) {
|
|
|
|
Engine._actionInProgress = false;
|
|
|
|
Terminal.finishAction();
|
|
|
|
}
|
2016-11-21 07:11:14 +01:00
|
|
|
},
|
2016-12-15 23:22:42 +01:00
|
|
|
|
2017-05-15 18:54:23 +02:00
|
|
|
_prevTimeout: null,
|
|
|
|
createStatusText: function(txt) {
|
|
|
|
if (Engine._prevTimeout != null) {
|
|
|
|
clearTimeout(Engine._prevTimeout);
|
|
|
|
Engine._prevTimeout = null;
|
|
|
|
}
|
|
|
|
var statusText = document.getElementById("status-text")
|
2017-05-15 19:23:20 +02:00
|
|
|
statusText.style.display = "inline-block";
|
2017-05-15 18:54:23 +02:00
|
|
|
statusText.setAttribute("class", "status-text");
|
|
|
|
statusText.innerHTML = txt;
|
|
|
|
Engine._prevTimeout = setTimeout(function() {
|
2017-05-15 19:23:20 +02:00
|
|
|
statusText.style.display = "none";
|
2017-05-15 18:54:23 +02:00
|
|
|
statusText.removeAttribute("class");
|
|
|
|
statusText.innerHTML = "";
|
|
|
|
}, 3000);
|
|
|
|
},
|
|
|
|
|
2017-05-05 23:27:35 +02:00
|
|
|
load: function() {
|
|
|
|
//Load game from save or create new game
|
|
|
|
if (loadGame(saveObject)) {
|
|
|
|
console.log("Loaded game from save");
|
|
|
|
Engine.setDisplayElements(); //Sets variables for important DOM elements
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.init(); //Initialize buttons, work, etc.
|
2017-05-05 23:27:35 +02:00
|
|
|
CompanyPositions.init();
|
2017-06-28 22:53:12 +02:00
|
|
|
initAugmentations(); //Also calls Player.reapplyAllAugmentations()
|
2017-05-05 23:27:35 +02:00
|
|
|
|
|
|
|
//Calculate the number of cycles have elapsed while offline
|
2017-05-15 21:11:40 +02:00
|
|
|
Engine._lastUpdate = new Date().getTime();
|
2017-05-05 23:27:35 +02:00
|
|
|
var lastUpdate = Player.lastUpdate;
|
2017-05-15 21:11:40 +02:00
|
|
|
var numCyclesOffline = Math.floor((Engine._lastUpdate - lastUpdate) / Engine._idleSpeed);
|
2017-05-15 21:30:08 +02:00
|
|
|
|
2017-05-05 23:27:35 +02:00
|
|
|
/* Process offline progress */
|
2017-05-20 11:27:42 +02:00
|
|
|
var offlineProductionFromScripts = loadAllRunningScripts(); //This also takes care of offline production for those scripts
|
2017-05-05 23:27:35 +02:00
|
|
|
if (Player.isWorking) {
|
2017-05-15 21:30:08 +02:00
|
|
|
console.log("work() called in load() for " + numCyclesOffline * Engine._idleSpeed + " milliseconds");
|
2017-05-05 23:27:35 +02:00
|
|
|
if (Player.workType == CONSTANTS.WorkTypeFaction) {
|
|
|
|
Player.workForFaction(numCyclesOffline);
|
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCreateProgram) {
|
|
|
|
Player.createProgramWork(numCyclesOffline);
|
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeStudyClass) {
|
|
|
|
Player.takeClass(numCyclesOffline);
|
2017-05-10 22:21:15 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCrime) {
|
|
|
|
Player.commitCrime(numCyclesOffline);
|
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCompanyPartTime) {
|
2017-05-12 20:52:02 +02:00
|
|
|
Player.workPartTime(numCyclesOffline);
|
2017-05-05 23:27:35 +02:00
|
|
|
} else {
|
|
|
|
Player.work(numCyclesOffline);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//Hacknet Nodes offline progress
|
2017-05-20 11:27:42 +02:00
|
|
|
var offlineProductionFromHacknetNodes = processAllHacknetNodeEarnings(numCyclesOffline);
|
2017-05-05 23:27:35 +02:00
|
|
|
|
|
|
|
//Passive faction rep gain offline
|
|
|
|
processPassiveFactionRepGain(numCyclesOffline);
|
2017-05-15 18:54:23 +02:00
|
|
|
|
|
|
|
//Update total playtime
|
|
|
|
var time = numCyclesOffline * Engine._idleSpeed;
|
|
|
|
if (Player.totalPlaytime == null) {Player.totalPlaytime = 0;}
|
2017-06-17 19:47:04 +02:00
|
|
|
if (Player.playtimeSinceLastAug == null) {Player.playtimeSinceLastAug = 0;}
|
2017-05-15 18:54:23 +02:00
|
|
|
Player.totalPlaytime += time;
|
2017-06-17 19:47:04 +02:00
|
|
|
Player.playtimeSinceLastAug += time;
|
2017-05-15 21:11:40 +02:00
|
|
|
|
2017-05-15 21:30:08 +02:00
|
|
|
Player.lastUpdate = Engine._lastUpdate;
|
2017-05-15 21:11:40 +02:00
|
|
|
Engine.start(); //Run main game loop and Scripts loop
|
2017-05-20 11:27:42 +02:00
|
|
|
dialogBoxCreate("While you were offline, your scripts generated $" +
|
|
|
|
formatNumber(offlineProductionFromScripts, 2) + " and your Hacknet Nodes generated $" +
|
|
|
|
formatNumber(offlineProductionFromHacknetNodes, 2));
|
2017-05-05 23:27:35 +02:00
|
|
|
} else {
|
|
|
|
//No save found, start new game
|
|
|
|
console.log("Initializing new game");
|
2017-05-07 12:04:54 +02:00
|
|
|
SpecialServerIps = new SpecialServerIpsMap();
|
2017-05-05 23:27:35 +02:00
|
|
|
Engine.setDisplayElements(); //Sets variables for important DOM elements
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.start(); //Run main game loop and Scripts loop
|
2017-05-05 23:27:35 +02:00
|
|
|
Player.init();
|
|
|
|
initForeignServers();
|
|
|
|
initCompanies();
|
|
|
|
initFactions();
|
|
|
|
CompanyPositions.init();
|
|
|
|
initAugmentations();
|
2017-06-20 22:36:48 +02:00
|
|
|
initMessages();
|
2017-05-05 23:27:35 +02:00
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
//Start interactive tutorial
|
2017-06-07 02:04:18 +02:00
|
|
|
iTutorialStart();
|
2017-05-05 23:27:35 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
setDisplayElements: function() {
|
|
|
|
//Content elements
|
|
|
|
Engine.Display.terminalContent = document.getElementById("terminal-container");
|
|
|
|
Engine.currentPage = Engine.Page.Terminal;
|
|
|
|
|
|
|
|
Engine.Display.characterContent = document.getElementById("character-container");
|
|
|
|
Engine.Display.characterContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.scriptEditorContent = document.getElementById("script-editor-container");
|
|
|
|
Engine.Display.scriptEditorContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.activeScriptsContent = document.getElementById("active-scripts-container");
|
|
|
|
Engine.Display.activeScriptsContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.hacknetNodesContent = document.getElementById("hacknet-nodes-container");
|
|
|
|
Engine.Display.hacknetNodesContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.worldContent = document.getElementById("world-container");
|
|
|
|
Engine.Display.worldContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.createProgramContent = document.getElementById("create-program-container");
|
|
|
|
Engine.Display.createProgramContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.factionsContent = document.getElementById("factions-container");
|
|
|
|
Engine.Display.factionsContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
|
|
|
|
Engine.Display.factionContent = document.getElementById("faction-container");
|
|
|
|
Engine.Display.factionContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.factionAugmentationsContent = document.getElementById("faction-augmentations-container");
|
|
|
|
Engine.Display.factionAugmentationsContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.augmentationsContent = document.getElementById("augmentations-container");
|
|
|
|
Engine.Display.augmentationsContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
Engine.Display.tutorialContent = document.getElementById("tutorial-container");
|
|
|
|
Engine.Display.tutorialContent.style.visibility = "hidden";
|
|
|
|
|
2017-06-28 22:53:12 +02:00
|
|
|
Engine.Display.infiltrationContent = document.getElementById("infiltration-container");
|
|
|
|
Engine.Display.infiltrationContent.style.visibility = "hidden";
|
|
|
|
|
2017-05-05 23:27:35 +02:00
|
|
|
//Character info
|
|
|
|
Engine.Display.characterInfo = document.getElementById("character-info");
|
|
|
|
|
|
|
|
//Location lists
|
|
|
|
Engine.aevumLocationsList = document.getElementById("aevum-locations-list");
|
|
|
|
Engine.chongqingLocationsList = document.getElementById("chongqing-locations-list");
|
|
|
|
Engine.sector12LocationsList = document.getElementById("sector12-locations-list");
|
|
|
|
Engine.newTokyoLocationsList = document.getElementById("newtokyo-locations-list");
|
|
|
|
Engine.ishimaLocationsList = document.getElementById("ishima-locations-list");
|
|
|
|
Engine.volhavenLocationsList = document.getElementById("volhaven-locations-list");
|
|
|
|
|
|
|
|
//Location page (page that shows up when you visit a specific location in World)
|
|
|
|
Engine.Display.locationContent = document.getElementById("location-container");
|
|
|
|
Engine.Display.locationContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
//Work In Progress
|
|
|
|
Engine.Display.workInProgressContent = document.getElementById("work-in-progress-container");
|
|
|
|
Engine.Display.workInProgressContent.style.visibility = "hidden";
|
|
|
|
|
|
|
|
//Init Location buttons
|
|
|
|
initLocationButtons();
|
|
|
|
|
|
|
|
//Script editor
|
|
|
|
Engine.Display.scriptEditorText = document.getElementById("script-editor-text");
|
2017-05-06 08:24:01 +02:00
|
|
|
|
|
|
|
//Tutorial buttons
|
|
|
|
Engine.Clickables.tutorialGettingStartedButton = document.getElementById("tutorial-getting-started-link");
|
|
|
|
Engine.Clickables.tutorialGettingStartedButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialGettingStartedText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialNetworkingButton = document.getElementById("tutorial-networking-link");
|
|
|
|
Engine.Clickables.tutorialNetworkingButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialNetworkingText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialHackingButton = document.getElementById("tutorial-hacking-link");
|
|
|
|
Engine.Clickables.tutorialHackingButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialHackingText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialScriptsButton = document.getElementById("tutorial-scripts-link");
|
|
|
|
Engine.Clickables.tutorialScriptsButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialScriptsText);
|
|
|
|
});
|
|
|
|
|
2017-05-07 00:19:18 +02:00
|
|
|
Engine.Clickables.tutorialNetscriptButton = document.getElementById("tutorial-netscript-link");
|
|
|
|
Engine.Clickables.tutorialNetscriptButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialNetscriptText);
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.tutorialTravelingButton = document.getElementById("tutorial-traveling-link");
|
|
|
|
Engine.Clickables.tutorialTravelingButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialTravelingText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialJobsButton = document.getElementById("tutorial-jobs-link");
|
|
|
|
Engine.Clickables.tutorialJobsButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialJobsText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialFactionsButton = document.getElementById("tutorial-factions-link");
|
|
|
|
Engine.Clickables.tutorialFactionsButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialFactionsText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialAugmentationsButton = document.getElementById("tutorial-augmentations-link");
|
|
|
|
Engine.Clickables.tutorialAugmentationsButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialAugmentationsText);
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.tutorialBackButton = document.getElementById("tutorial-back-button");
|
|
|
|
Engine.Clickables.tutorialBackButton.addEventListener("click", function() {
|
|
|
|
Engine.displayTutorialContent();
|
|
|
|
});
|
2017-05-06 21:12:45 +02:00
|
|
|
|
|
|
|
//If DarkWeb already purchased, disable the button
|
|
|
|
if (SpecialServerIps.hasOwnProperty("Darkweb Server")) {
|
|
|
|
document.getElementById("location-purchase-tor").setAttribute("class", "a-link-button-inactive");
|
|
|
|
}
|
2017-05-06 08:24:01 +02:00
|
|
|
},
|
2017-05-05 23:27:35 +02:00
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
/* Initialization */
|
2017-01-31 04:41:42 +01:00
|
|
|
init: function() {
|
2016-10-17 10:24:39 +02:00
|
|
|
//Main menu buttons and content
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.terminalMainMenuButton = clearEventListeners("terminal-menu-link");
|
2016-10-17 10:24:39 +02:00
|
|
|
Engine.Clickables.terminalMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadTerminalContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.characterMainMenuButton = clearEventListeners("character-menu-link");
|
2016-10-17 10:24:39 +02:00
|
|
|
Engine.Clickables.characterMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadCharacterContent();
|
|
|
|
return false;
|
|
|
|
});
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.scriptEditorMainMenuButton = clearEventListeners("create-script-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.scriptEditorMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadScriptEditorContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.activeScriptsMainMenuButton = clearEventListeners("active-scripts-menu-link");
|
2016-12-19 19:20:19 +01:00
|
|
|
Engine.Clickables.activeScriptsMainMenuButton.addEventListener("click", function() {
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.loadActiveScriptsContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.hacknetNodesMainMenuButton = clearEventListeners("hacknet-nodes-menu-link");
|
2017-04-27 22:02:58 +02:00
|
|
|
Engine.Clickables.hacknetNodesMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadHacknetNodesContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.worldMainMenuButton = clearEventListeners("world-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.worldMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadWorldContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.createProgramMainMenuButton = clearEventListeners("create-program-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.createProgramMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadCreateProgramContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.factionsMainMenuButton = clearEventListeners("factions-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.factionsMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadFactionsContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.augmentationsMainMenuButton = clearEventListeners("augmentations-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.augmentationsMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadAugmentationsContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-06 08:24:01 +02:00
|
|
|
Engine.Clickables.tutorialMainMenuButton = clearEventListeners("tutorial-menu-link");
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.Clickables.tutorialMainMenuButton.addEventListener("click", function() {
|
|
|
|
Engine.loadTutorialContent();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
//Active scripts list
|
|
|
|
Engine.ActiveScriptsList = document.getElementById("active-scripts-list");
|
|
|
|
|
2017-06-08 06:57:40 +02:00
|
|
|
//Save, Delete, Import/Export buttons
|
2016-12-01 23:18:18 +01:00
|
|
|
Engine.Clickables.saveMainMenuButton = document.getElementById("save-game-link");
|
|
|
|
Engine.Clickables.saveMainMenuButton.addEventListener("click", function() {
|
2017-05-05 03:08:44 +02:00
|
|
|
saveObject.saveGame();
|
2016-12-01 23:18:18 +01:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
Engine.Clickables.deleteMainMenuButton = document.getElementById("delete-game-link");
|
|
|
|
Engine.Clickables.deleteMainMenuButton.addEventListener("click", function() {
|
2017-05-05 03:08:44 +02:00
|
|
|
saveObject.deleteGame();
|
2016-12-01 23:18:18 +01:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-06-08 06:57:40 +02:00
|
|
|
document.getElementById("export-game-link").addEventListener("click", function() {
|
|
|
|
saveObject.exportGame();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-06-13 17:58:31 +02:00
|
|
|
//Character Overview buttons
|
|
|
|
document.getElementById("character-overview-save-button").addEventListener("click", function() {
|
2017-05-25 16:50:58 +02:00
|
|
|
saveObject.saveGame();
|
|
|
|
return false;
|
|
|
|
});
|
2017-05-15 04:21:22 +02:00
|
|
|
|
2017-06-13 17:58:31 +02:00
|
|
|
document.getElementById("character-overview-options-button").addEventListener("click", function() {
|
|
|
|
gameOptionsBoxOpen();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-15 04:21:22 +02:00
|
|
|
//Script Editor Netscript documentation button
|
|
|
|
var netscriptDocButton = document.getElementById("script-editor-netscript-doc-button");
|
|
|
|
netscriptDocButton.addEventListener("click", function() {
|
|
|
|
Engine.loadTutorialContent();
|
|
|
|
Engine.displayTutorialContent();
|
|
|
|
Engine.displayTutorialPage(CONSTANTS.TutorialNetscriptText);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-05 18:52:48 +02:00
|
|
|
//Create Program buttons
|
2017-06-23 16:23:35 +02:00
|
|
|
initCreateProgramButtons();
|
2017-02-16 19:52:11 +01:00
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
//Message at the top of terminal
|
2017-01-31 04:41:42 +01:00
|
|
|
postNetburnerText();
|
2016-10-17 10:24:39 +02:00
|
|
|
|
2017-05-10 22:21:15 +02:00
|
|
|
//Player was working cancel button
|
2017-02-16 19:52:11 +01:00
|
|
|
if (Player.isWorking) {
|
|
|
|
var cancelButton = document.getElementById("work-in-progress-cancel-button");
|
|
|
|
cancelButton.addEventListener("click", function() {
|
2017-04-24 21:10:35 +02:00
|
|
|
if (Player.workType == CONSTANTS.WorkTypeFaction) {
|
2017-04-24 03:43:41 +02:00
|
|
|
var fac = Factions[Player.currentWorkFactionName];
|
|
|
|
Player.finishFactionWork(true, fac);
|
2017-05-15 17:28:59 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCreateProgram) {
|
2017-04-24 03:43:41 +02:00
|
|
|
Player.finishCreateProgramWork(true, Player.createProgramName);
|
2017-04-24 21:10:35 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeStudyClass) {
|
|
|
|
Player.finishClass();
|
2017-05-10 22:21:15 +02:00
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCrime) {
|
|
|
|
Player.finishCrime(true);
|
|
|
|
} else if (Player.workType == CONSTANTS.WorkTypeCompanyPartTime) {
|
|
|
|
Player.finishWorkPartTime();
|
2017-04-24 03:43:41 +02:00
|
|
|
} else {
|
|
|
|
Player.finishWork(true);
|
|
|
|
}
|
2017-02-16 19:52:11 +01:00
|
|
|
});
|
|
|
|
Engine.loadWorkInProgressContent();
|
|
|
|
}
|
2017-05-15 16:15:59 +02:00
|
|
|
|
2017-05-20 11:27:42 +02:00
|
|
|
//character overview screen
|
|
|
|
document.getElementById("character-overview-container").style.display = "block";
|
|
|
|
|
|
|
|
//Remove classes from links (they might be set from tutorial)
|
|
|
|
document.getElementById("terminal-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("character-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("create-script-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("active-scripts-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("hacknet-nodes-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("world-menu-link").removeAttribute("class");
|
|
|
|
document.getElementById("tutorial-menu-link").removeAttribute("class");
|
|
|
|
|
2017-06-03 22:51:18 +02:00
|
|
|
//Changelog
|
|
|
|
document.getElementById("changelog-link").addEventListener("click", function() {
|
|
|
|
gameOptionsBoxClose();
|
|
|
|
dialogBoxCreate(CONSTANTS.Changelog);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2017-05-31 17:58:09 +02:00
|
|
|
//DEBUG Delete active Scripts on home
|
2017-05-15 16:15:59 +02:00
|
|
|
document.getElementById("debug-delete-scripts-link").addEventListener("click", function() {
|
2017-05-25 14:18:34 +02:00
|
|
|
console.log("Deleting running scripts on home computer");
|
2017-05-15 16:15:59 +02:00
|
|
|
Player.getHomeComputer().runningScripts = [];
|
2017-05-31 17:58:09 +02:00
|
|
|
dialogBoxCreate("Forcefully deleted all running scripts on home computer. Please save and refresh page");
|
2017-06-08 07:08:53 +02:00
|
|
|
gameOptionsBoxClose();
|
2017-05-31 17:58:09 +02:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
//DEBUG Soft Reset
|
|
|
|
document.getElementById("debug-soft-reset").addEventListener("click", function() {
|
|
|
|
dialogBoxCreate("Soft Reset!");
|
|
|
|
prestigeAugmentation();
|
2017-06-08 07:08:53 +02:00
|
|
|
gameOptionsBoxClose();
|
2017-05-15 16:15:59 +02:00
|
|
|
return false;
|
|
|
|
});
|
2017-05-06 08:24:01 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
start: function() {
|
2016-10-17 10:24:39 +02:00
|
|
|
//Run main loop
|
2017-01-31 04:41:42 +01:00
|
|
|
Engine.idleTimer();
|
|
|
|
|
2017-02-16 19:52:11 +01:00
|
|
|
//Scripts
|
2017-01-31 04:41:42 +01:00
|
|
|
runScriptsLoop();
|
|
|
|
}
|
2016-10-17 10:24:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
window.onload = function() {
|
2017-05-05 23:27:35 +02:00
|
|
|
Engine.load();
|
2016-10-17 10:24:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
|
2016-10-17 10:24:39 +02:00
|
|
|
|
2017-01-31 04:41:42 +01:00
|
|
|
|