mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-24 07:02:26 +01:00
Added grow() command - it is untested and does not worki n offline yet. Some small rebalancing and UI changes
This commit is contained in:
parent
097807282d
commit
6edd7f1a49
@ -82,7 +82,7 @@
|
|||||||
float: right;
|
float: right;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 6px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
border: 1px solid white;
|
border: 1px solid white;
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@
|
|||||||
float: right;
|
float: right;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 6px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
border: 1px solid white;
|
border: 1px solid white;
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@
|
|||||||
float: right;
|
float: right;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 6px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
border: 1px solid white;
|
border: 1px solid white;
|
||||||
}
|
}
|
||||||
@ -229,12 +229,16 @@
|
|||||||
color: #66ff33;
|
color: #66ff33;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#faction-invitation-box-warning {
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
#faction-invitation-box-yes,
|
#faction-invitation-box-yes,
|
||||||
#faction-invitation-box-no {
|
#faction-invitation-box-no {
|
||||||
color: #aaa;
|
color: #aaa;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 6px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
border: 1px solid white;
|
border: 1px solid white;
|
||||||
}
|
}
|
||||||
@ -285,7 +289,7 @@
|
|||||||
color: #aaa;
|
color: #aaa;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 6px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
border: 1px solid white;
|
border: 1px solid white;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,10 @@
|
|||||||
<div id="terminal-container">
|
<div id="terminal-container">
|
||||||
<table id="terminal">
|
<table id="terminal">
|
||||||
<tr id="terminal-input">
|
<tr id="terminal-input">
|
||||||
<td id="terminal-input-td" tabindex="2">$ <input type="text" id="terminal-input-text-box" class="terminal-input" tabindex="1"/></td>
|
<td id="terminal-input-td" tabindex="2">$
|
||||||
|
<input type="text" id="terminal-input-text-box" class="terminal-input" tabindex="1"
|
||||||
|
onfocus="this.value = this.value;"/>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
@ -28,6 +28,9 @@ CONSTANTS = {
|
|||||||
//Time (seconds) it takes to run one operation in Netscript OFFLINE
|
//Time (seconds) it takes to run one operation in Netscript OFFLINE
|
||||||
CodeOfflineExecutionTime: 10,
|
CodeOfflineExecutionTime: 10,
|
||||||
|
|
||||||
|
//Server growth rate
|
||||||
|
ServerGrowthRate: 1.00075,
|
||||||
|
|
||||||
//Maximum number of log entries for a script
|
//Maximum number of log entries for a script
|
||||||
MaxLogCapacity: 20,
|
MaxLogCapacity: 20,
|
||||||
|
|
||||||
|
@ -136,6 +136,9 @@ initFactions = function() {
|
|||||||
|
|
||||||
//Earlygame factions - factions the player will prestige with early on that don't
|
//Earlygame factions - factions the player will prestige with early on that don't
|
||||||
//belong in other categories
|
//belong in other categories
|
||||||
|
var Netburners = new Faction("Netburners");
|
||||||
|
Netburners.setInfo(FactionInfo.NetburnersInfo);
|
||||||
|
AddToFactions(Netburners);
|
||||||
var TianDiHui = new Faction("Tian Di Hui"); //Society of the Heaven and Earth
|
var TianDiHui = new Faction("Tian Di Hui"); //Society of the Heaven and Earth
|
||||||
TianDiHui.setInfo(FactionInfo.TianDiHuiInfo);
|
TianDiHui.setInfo(FactionInfo.TianDiHuiInfo);
|
||||||
AddToFactions(TianDiHui);
|
AddToFactions(TianDiHui);
|
||||||
@ -380,6 +383,23 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
invitedFactions.push(silhouetteFac);
|
invitedFactions.push(silhouetteFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Netburners
|
||||||
|
/*
|
||||||
|
var netburnersFac = Factions["Netburners"];
|
||||||
|
var totalHacknetRam = 0;
|
||||||
|
var totalHacknetCores = 0;
|
||||||
|
var totalHacknetLevels = 0;
|
||||||
|
for (var i = 0; i < Player.hacknetNodes.length; ++i) {
|
||||||
|
totalHacknetLevels += Player.hacknetNodes[i].level;
|
||||||
|
totalHacknetRam += Player.hacknetNodes[i].ram;
|
||||||
|
totalHacknetCores += Player.hacknetNodes[i].numCores;
|
||||||
|
}
|
||||||
|
if (netburnersFac.isBanned == false && netburnersFac.isMember == false &&
|
||||||
|
this.hacking_skill >= 100 && totalHacknetRam >= 10 &&
|
||||||
|
totalHacknetCores >= 5 && totalHacknetLevels >= 100) {
|
||||||
|
invitedFactions.push(netburnersFac);
|
||||||
|
}*/
|
||||||
|
|
||||||
//Tian Di Hui
|
//Tian Di Hui
|
||||||
var tiandihuiFac = Factions["Tian Di Hui"];
|
var tiandihuiFac = Factions["Tian Di Hui"];
|
||||||
if (tiandihuiFac.isBanned == false && tiandihuiFac.isMember == false &&
|
if (tiandihuiFac.isBanned == false && tiandihuiFac.isMember == false &&
|
||||||
|
@ -115,6 +115,7 @@ FactionInfo = {
|
|||||||
|
|
||||||
//Earlygame factions - factions the player will prestige with early on that don't
|
//Earlygame factions - factions the player will prestige with early on that don't
|
||||||
//belong in other categories
|
//belong in other categories
|
||||||
|
NetburnersInfo: "~~HACKNET BURNERS~~",
|
||||||
TianDiHuiInfo: "Obey Heaven and Work Righteousness",
|
TianDiHuiInfo: "Obey Heaven and Work Righteousness",
|
||||||
|
|
||||||
CyberSecInfo: "The Internet is the first thing that humanity has built that humanity doesn’t understand,\n" +
|
CyberSecInfo: "The Internet is the first thing that humanity has built that humanity doesn’t understand,\n" +
|
||||||
|
@ -281,7 +281,7 @@ function evaluate(exp, workerScript) {
|
|||||||
|
|
||||||
} else if (exp.func.value == "sleep") {
|
} else if (exp.func.value == "sleep") {
|
||||||
if (exp.args.length != 1) {
|
if (exp.args.length != 1) {
|
||||||
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|Sleep() call has incorrect number of arguments. Takes 1 argument.");
|
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|sleep() call has incorrect number of arguments. Takes 1 argument.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,11 +302,9 @@ function evaluate(exp, workerScript) {
|
|||||||
}, function(e) {
|
}, function(e) {
|
||||||
reject(e)
|
reject(e)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
} else if (exp.func.value == "print") {
|
} else if (exp.func.value == "print") {
|
||||||
if (exp.args.length != 1) {
|
if (exp.args.length != 1) {
|
||||||
reject("|" + workerScript.serverIp + "|" + workerScript.name + "| Print() call has incorrect number of arguments. Takes 1 argument");
|
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|print() call has incorrect number of arguments. Takes 1 argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
var p = new Promise(function(resolve, reject) {
|
var p = new Promise(function(resolve, reject) {
|
||||||
@ -321,11 +319,60 @@ function evaluate(exp, workerScript) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
p.then(function(res) {
|
p.then(function(res) {
|
||||||
post(res.toString());
|
workerScript.scriptRef.log(res.toString());
|
||||||
resolve("printExecuted");
|
resolve("printExecuted");
|
||||||
}, function(e) {
|
}, function(e) {
|
||||||
reject(e);
|
reject(e);
|
||||||
});
|
});
|
||||||
|
} else if (exp.func.value == "grow") {
|
||||||
|
if (exp.args.length != 1) {
|
||||||
|
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|grow() call has incorrect number of arguments. Takes 1 argument");
|
||||||
|
}
|
||||||
|
|
||||||
|
//IP/hostname of server to hack
|
||||||
|
var ipPromise = evaluate(exp.args[0], workerScript);
|
||||||
|
|
||||||
|
ipPromise.then(function(ip) {
|
||||||
|
//Check if its a valid IP address. If it's not, assume its a hostname and
|
||||||
|
//try to get the server. If its not a server, there is an error
|
||||||
|
var server = null;
|
||||||
|
if (!isValidIPAddress(ip)) {
|
||||||
|
//It's not an IP address, so see if its a hostanme
|
||||||
|
server = GetServerByHostname(ip);
|
||||||
|
} else {
|
||||||
|
server = AllServers[ip];
|
||||||
|
}
|
||||||
|
if (server == null) {
|
||||||
|
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|Invalid IP or hostname passed into grow() command");
|
||||||
|
workerScript.scriptRef.log("Cannot grow(). Invalid IP or hostname passed in: " + ip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//No root access or skill level too low
|
||||||
|
if (server.hasAdminRights == false) {
|
||||||
|
workerScript.scriptRef.log("Cannot grow this server (" + server.hostname + ") because user does not have root access");
|
||||||
|
reject("|" + workerScript.serverIp + "|" + workerScript.name + "|Script crashed because it did not have root access to " + server.hostname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var p = new Promise(function(resolve, reject) {
|
||||||
|
if (env.stopFlag) {reject(workerScript);}
|
||||||
|
console.log("Executing grow on " + server.hostname + " in 2 minutes ");
|
||||||
|
setTimeout(function() {
|
||||||
|
var growthPercentage = processSingleServerGrowth(server, 450);
|
||||||
|
resolve(growthPercentage);
|
||||||
|
}, 120 * 1000); //grow() takes flat 2 minutes right now
|
||||||
|
});
|
||||||
|
|
||||||
|
p.then(function(growthPercentage) {
|
||||||
|
resolve("hackExecuted");
|
||||||
|
workerScript.scriptRef.log("Using grow(), the money available on " + server.hostname + " was grown by " + growthPercentage + "%");
|
||||||
|
}, function(e) {
|
||||||
|
reject(e);
|
||||||
|
});
|
||||||
|
}, function(e) {
|
||||||
|
reject(e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}, CONSTANTS.CodeInstructionRunTime);
|
}, CONSTANTS.CodeInstructionRunTime);
|
||||||
});
|
});
|
||||||
|
@ -191,12 +191,12 @@ PlayerObject.prototype.calculateHackingChance = function() {
|
|||||||
|
|
||||||
//Calculate the time it takes to hack a server in seconds. Returns the time
|
//Calculate the time it takes to hack a server in seconds. Returns the time
|
||||||
//The formula is:
|
//The formula is:
|
||||||
// (requiredLevel * difficulty)
|
// (requiredLevel * difficulty + 500)
|
||||||
// ------------------------------- * hacking_speed_multiplier
|
// ----------------------------------- * hacking_speed_multiplier
|
||||||
// hacking_skill
|
// hacking_skill + 100
|
||||||
PlayerObject.prototype.calculateHackingTime = function() {
|
PlayerObject.prototype.calculateHackingTime = function() {
|
||||||
var difficultyMult = this.getCurrentServer().requiredHackingSkill * this.getCurrentServer().hackDifficulty;
|
var difficultyMult = this.getCurrentServer().requiredHackingSkill * this.getCurrentServer().hackDifficulty;
|
||||||
var skillFactor = (difficultyMult + 500) / (this.hacking_skill + 100);
|
var skillFactor = (2 * difficultyMult + 300) / (this.hacking_skill + 100);
|
||||||
return skillFactor * this.hacking_speed_mult;
|
return skillFactor * this.hacking_speed_mult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,11 +626,12 @@ initForeignServers = function() {
|
|||||||
Player.getHomeComputer().serversOnNetwork.push(NetworkGroup1[i].ip);
|
Player.getHomeComputer().serversOnNetwork.push(NetworkGroup1[i].ip);
|
||||||
NetworkGroup1[i].serversOnNetwork.push(Player.homeComputer);
|
NetworkGroup1[i].serversOnNetwork.push(Player.homeComputer);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
|
|
||||||
//Server growth
|
//Server growth
|
||||||
processServerGrowth = function(numCycles) {
|
processServerGrowth = function(numCycles) {
|
||||||
|
//Server growth processed once every 450 game cycles
|
||||||
var numServerGrowthCycles = Math.max(Math.floor(numCycles / 450), 0);
|
var numServerGrowthCycles = Math.max(Math.floor(numCycles / 450), 0);
|
||||||
|
|
||||||
for (var ip in AllServers) {
|
for (var ip in AllServers) {
|
||||||
@ -643,13 +644,30 @@ processServerGrowth = function(numCycles) {
|
|||||||
var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage;
|
var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage;
|
||||||
|
|
||||||
//Apply serverGrowth for the calculated number of growth cycles
|
//Apply serverGrowth for the calculated number of growth cycles
|
||||||
var serverGrowth = Math.pow(1.00075, numServerGrowthCyclesAdjusted);
|
var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted);
|
||||||
//console.log("serverGrowth ratio: " + serverGrowth);
|
//console.log("serverGrowth ratio: " + serverGrowth);
|
||||||
server.moneyAvailable *= serverGrowth;
|
server.moneyAvailable *= serverGrowth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("Server growth processed for " + numServerGrowthCycles + " cycles");
|
console.log("Server growth processed for " + numServerGrowthCycles + " cycles");
|
||||||
},
|
}
|
||||||
|
|
||||||
|
//Applied server growth for a single server. Returns the percentage growth
|
||||||
|
processSingleServerGrowth = function(server, numCycles) {
|
||||||
|
//Server growth processed once every 450 game cycles
|
||||||
|
var numServerGrowthCycles = Math.max(Math.floor(numCycles / 450), 0);
|
||||||
|
|
||||||
|
//Get the number of server growth cycles that will be applied based on the
|
||||||
|
//server's serverGrowth property
|
||||||
|
var serverGrowthPercentage = server.serverGrowth / 100;
|
||||||
|
var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage;
|
||||||
|
|
||||||
|
//Apply serverGrowth for the calculated number of growth cycles
|
||||||
|
var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted);
|
||||||
|
server.moneyAvailable *= serverGrowth;
|
||||||
|
|
||||||
|
return serverGrowth;
|
||||||
|
}
|
||||||
|
|
||||||
//List of all servers that exist in the game, indexed by their ip
|
//List of all servers that exist in the game, indexed by their ip
|
||||||
AllServers = {};
|
AllServers = {};
|
||||||
|
@ -31,6 +31,12 @@ var postNetburnerText = function() {
|
|||||||
$(document).keydown(function(event) {
|
$(document).keydown(function(event) {
|
||||||
//Terminal
|
//Terminal
|
||||||
if (Engine.currentPage == Engine.Page.Terminal) {
|
if (Engine.currentPage == Engine.Page.Terminal) {
|
||||||
|
var terminalInput = document.getElementById("terminal-input-text-box");
|
||||||
|
if (terminalInput == null) {return;}
|
||||||
|
|
||||||
|
//Keep terminal input in focus
|
||||||
|
terminalInput.focus();
|
||||||
|
|
||||||
//Enter
|
//Enter
|
||||||
if (event.keyCode == 13) {
|
if (event.keyCode == 13) {
|
||||||
var command = $('input[class=terminal-input]').val();
|
var command = $('input[class=terminal-input]').val();
|
||||||
@ -64,9 +70,8 @@ $(document).keydown(function(event) {
|
|||||||
--Terminal.commandHistoryIndex;
|
--Terminal.commandHistoryIndex;
|
||||||
}
|
}
|
||||||
var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
|
var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
|
||||||
document.getElementById("terminal-input-text-box").value = prevCommand;
|
terminalInput.value = prevCommand;
|
||||||
|
setTimeout(function(){terminalInput.selectionStart = terminalInput.selectionEnd = 10000; }, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Down key
|
//Down key
|
||||||
@ -82,17 +87,17 @@ $(document).keydown(function(event) {
|
|||||||
//Latest command, put nothing
|
//Latest command, put nothing
|
||||||
if (i == len || i == len-1) {
|
if (i == len || i == len-1) {
|
||||||
Terminal.commandHistoryIndex = len;
|
Terminal.commandHistoryIndex = len;
|
||||||
document.getElementById("terminal-input-text-box").value = "";
|
terminalInput.value = "";
|
||||||
} else {
|
} else {
|
||||||
++Terminal.commandHistoryIndex;
|
++Terminal.commandHistoryIndex;
|
||||||
var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
|
var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
|
||||||
document.getElementById("terminal-input-text-box").value = prevCommand;
|
terminalInput.value = prevCommand;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Tab (autocomplete)
|
//Tab (autocomplete)
|
||||||
if (event.keyCode == 9) {
|
if (event.keyCode == 9) {
|
||||||
var input = document.getElementById("terminal-input-text-box").value;
|
var input = terminalInput.value;
|
||||||
if (input == "") {return;}
|
if (input == "") {return;}
|
||||||
input = input.trim();
|
input = input.trim();
|
||||||
input = input.replace(/\s\s+/g, ' ');
|
input = input.replace(/\s\s+/g, ' ');
|
||||||
@ -158,7 +163,9 @@ function tabCompletion(command, arg, allPossibilities) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allPossibilities.length == 1) {
|
if (allPossibilities.length == 0) {
|
||||||
|
return;
|
||||||
|
} else if (allPossibilities.length == 1) {
|
||||||
document.getElementById("terminal-input-text-box").value = command + " " + allPossibilities[0];
|
document.getElementById("terminal-input-text-box").value = command + " " + allPossibilities[0];
|
||||||
document.getElementById("terminal-input-text-box").focus();
|
document.getElementById("terminal-input-text-box").focus();
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,6 +46,7 @@ function convertTimeMsToTimeElapsedString(time) {
|
|||||||
//Finds the longest common starting substring in a set of strings
|
//Finds the longest common starting substring in a set of strings
|
||||||
function longestCommonStart(strings) {
|
function longestCommonStart(strings) {
|
||||||
if (!containsAllStrings(strings)) {return;}
|
if (!containsAllStrings(strings)) {return;}
|
||||||
|
if (strings.length == 0) {return;}
|
||||||
|
|
||||||
var A = strings.concat().sort(),
|
var A = strings.concat().sort(),
|
||||||
a1= A[0], a2= A[A.length-1], L= a1.length, i= 0;
|
a1= A[0], a2= A[A.length-1], L= a1.length, i= 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user