mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-09-23 06:10:56 +02:00
112 lines
3.6 KiB
TypeScript
112 lines
3.6 KiB
TypeScript
|
import { ipExists } from "../../utils/IPAddress";
|
||
|
|
||
|
// Map of all Servers that exist in the game
|
||
|
// Key (string) = IP
|
||
|
// Value = Server object
|
||
|
let AllServers = {};
|
||
|
|
||
|
// Saftely add a Server to the AllServers map
|
||
|
export function AddToAllServers(server) {
|
||
|
var serverIp = server.ip;
|
||
|
if (ipExists(serverIp)) {
|
||
|
console.log("IP of server that's being added: " + serverIp);
|
||
|
console.log("Hostname of the server thats being added: " + server.hostname);
|
||
|
console.log("The server that already has this IP is: " + AllServers[serverIp].hostname);
|
||
|
throw new Error("Error: Trying to add a server with an existing IP");
|
||
|
return;
|
||
|
}
|
||
|
AllServers[serverIp] = server;
|
||
|
}
|
||
|
|
||
|
export function initForeignServers() {
|
||
|
/* Create a randomized network for all the foreign servers */
|
||
|
//Groupings for creating a randomized network
|
||
|
const networkLayers = [];
|
||
|
for (let i = 0; i < 15; i++) {
|
||
|
networkLayers.push([]);
|
||
|
}
|
||
|
|
||
|
// Essentially any property that is of type 'number | IMinMaxRange'
|
||
|
const propertiesToPatternMatch = [
|
||
|
"hackDifficulty",
|
||
|
"moneyAvailable",
|
||
|
"requiredHackingSkill",
|
||
|
"serverGrowth"
|
||
|
];
|
||
|
|
||
|
const toNumber = (value) => {
|
||
|
switch (typeof value) {
|
||
|
case 'number':
|
||
|
return value;
|
||
|
case 'object':
|
||
|
return getRandomInt(value.min, value.max);
|
||
|
default:
|
||
|
throw Error(`Do not know how to convert the type '${typeof value}' to a number`);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (const metadata of serverMetadata) {
|
||
|
const serverParams = {
|
||
|
hostname: metadata.hostname,
|
||
|
ip: createRandomIp(),
|
||
|
numOpenPortsRequired: metadata.numOpenPortsRequired,
|
||
|
organizationName: metadata.organizationName
|
||
|
};
|
||
|
|
||
|
if (metadata.maxRamExponent !== undefined) {
|
||
|
serverParams.maxRam = Math.pow(2, toNumber(metadata.maxRamExponent));
|
||
|
}
|
||
|
|
||
|
for (const prop of propertiesToPatternMatch) {
|
||
|
if (metadata[prop] !== undefined) {
|
||
|
serverParams[prop] = toNumber(metadata[prop]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const server = new Server(serverParams);
|
||
|
for (const filename of (metadata.literature || [])) {
|
||
|
server.messages.push(filename);
|
||
|
}
|
||
|
|
||
|
if (metadata.specialName !== undefined) {
|
||
|
SpecialServerIps.addIp(metadata.specialName, server.ip);
|
||
|
}
|
||
|
|
||
|
AddToAllServers(server);
|
||
|
if (metadata.networkLayer !== undefined) {
|
||
|
networkLayers[toNumber(metadata.networkLayer) - 1].push(server);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create a randomized network for all the foreign servers */
|
||
|
const linkComputers = (server1, server2) => {
|
||
|
server1.serversOnNetwork.push(server2.ip);
|
||
|
server2.serversOnNetwork.push(server1.ip);
|
||
|
};
|
||
|
|
||
|
const getRandomArrayItem = (arr) => arr[Math.floor(Math.random() * arr.length)];
|
||
|
|
||
|
const linkNetworkLayers = (network1, selectServer) => {
|
||
|
for (const server of network1) {
|
||
|
linkComputers(server, selectServer());
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Connect the first tier of servers to the player's home computer
|
||
|
linkNetworkLayers(networkLayers[0], () => Player.getHomeComputer());
|
||
|
for (let i = 1; i < networkLayers.length; i++) {
|
||
|
linkNetworkLayers(networkLayers[i], () => getRandomArrayItem(networkLayers[i - 1]));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function prestigeAllServers() {
|
||
|
for (var member in AllServers) {
|
||
|
delete AllServers[member];
|
||
|
}
|
||
|
AllServers = {};
|
||
|
}
|
||
|
|
||
|
export function loadAllServers(saveString) {
|
||
|
AllServers = JSON.parse(saveString, Reviver);
|
||
|
}
|