diff --git a/Ramses/home/CorpControl.js b/Ramses/home/CorpControl.js index 8d24578..20650b3 100644 --- a/Ramses/home/CorpControl.js +++ b/Ramses/home/CorpControl.js @@ -84,7 +84,6 @@ export async function main(ns) { nListenPID = ns.run("/corp/GetOfficeData.js", 1, sDivisionName, sCity); await ns.nextPortWrite(nListenPID); oOfficeData = ns.readPort(nListenPID); - ns.tprint(oOfficeData); nListenPID = ns.run("/corp/HireWorkers.js", 1, sDivisionName, sCity, JSON.stringify(oOfficeData)); await ns.nextPortWrite(nListenPID); } @@ -92,19 +91,18 @@ export async function main(ns) { break; case 50: let aCurrentGoods = [ - {"sMaterialName":"Food","yAmount":"MAX","yPrice":"MP"}, - {"sMaterialName":"Plants","yAmount":"MAX","yPrice":"MP"} + { "sMaterialName": "Food", "yAmount": "MAX", "yPrice": "MP-5" }, + { "sMaterialName": "Plants", "yAmount": "MAX", "yPrice": "MP-5" } ] - aCurrentGoods.forEach(async (entry) =>{ for (let sCity of aCitites) { - forEach - nListenPID = ns.run("/corp/SetSalePrices.js", 1, sDivisionName, sCity, oCurrentGoods); - await ns.nextPortWrite(nListenPID); - oOfficeData = ns.readPort(nListenPID); - ns.tprint(oOfficeData); - nListenPID = ns.run("/corp/HireWorkers.js", 1, sDivisionName, sCity, JSON.stringify(oOfficeData)); - await ns.nextPortWrite(nListenPID); - }}) + aCurrentGoods.forEach(async (entry) => { + + nListenPID = ns.run("/corp/SetSalePrices.js", 1, sDivisionName, sCity, JSON.stringify(entry)); + nListenPID = ns.run("/corp/SetMaterialLimit.js", 1, sDivisionName, sCity, JSON.stringify(entry)); + + ns.tprint(sCity, entry) + }) + } oCorpStatus.nStep = 200; break; case 60: diff --git a/Ramses/home/Library.js b/Ramses/home/Library.js index 3770479..a76e0a3 100644 --- a/Ramses/home/Library.js +++ b/Ramses/home/Library.js @@ -262,29 +262,69 @@ export function listWorkServers(ns) { const sFileName = "serverList.txt"; if (!ns.fileExists(sFileName, "home")) { ns.print(`ERROR ${sFileName} does not exist.`); return false; }; let serverList = JSON.parse(ns.read(sFileName)); + let sortedList = sortJsonArrayByKey(serverList, "serverCores", "maxRam").reverse(); let nTotalWorkerRAM = 0; let nTotalFreeRAM = 0; const nServerColumnWidth = 20; - const nValueColumnWidth = 8; + const nValueColumnWidth = 10; const nCoresWidth = 5; - ns.printRaw("┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓"); - ns.printRaw("┃ Server ┃ Free / Max RAM ┃ Cores ┃"); - ns.printRaw("┣━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫"); - serverList.forEach((entry) => { + ns.printRaw("┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓"); + ns.printRaw("┃ Server ┃ Free / Max RAM ┃ Cores ┃"); + ns.printRaw("┣━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫"); + sortedList.forEach((entry) => { if (entry.rootAccess && entry.maxRam >= 1) { let sServerName = entry.serverName.padEnd(nServerColumnWidth, ' '); let nFreeRAM = entry.maxRam - ns.getServerUsedRam(entry.serverName); - let sFreeRAM = nFreeRAM.toLocaleString().padStart(nValueColumnWidth, ' '); - let sMaxRam = entry.maxRam.toLocaleString().padStart(nValueColumnWidth, ' '); - let sCores = entry.serverCores.toLocaleString().padStart(nCoresWidth, ' '); + let sFreeRAM = Math.floor(nFreeRAM).toLocaleString("en-US").padStart(nValueColumnWidth, ' '); + let sMaxRam = entry.maxRam.toLocaleString("en-US").padStart(nValueColumnWidth, ' '); + let sCores = entry.serverCores.toLocaleString("en-US").padStart(nCoresWidth, ' '); ns.printRaw(`┃ ${sServerName} ┃ ${sFreeRAM} / ${sMaxRam} ┃ ${sCores} ┃`); nTotalWorkerRAM += entry.maxRam; nTotalFreeRAM += nFreeRAM; } }); - ns.printRaw("┗━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛"); - ns.printRaw(`Total Free: ${nTotalFreeRAM.toLocaleString()} / ${nTotalWorkerRAM.toLocaleString()} GB`); -} \ No newline at end of file + ns.printRaw("┗━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛"); + ns.printRaw(`Total Free: ${Math.floor(nTotalFreeRAM).toLocaleString("en-US")} / ${nTotalWorkerRAM.toLocaleString("en-US")} GB`); +} + +export function sortJsonArrayByKey(array, primaryKey, secondaryKey) { + return array.sort((a, b) => { + const xPrimary = a[primaryKey]; + const yPrimary = b[primaryKey]; + + // Handle null or undefined values for primary key + if (xPrimary === null || yPrimary === null || xPrimary === undefined || yPrimary === undefined) { + return 0; + } + + // Compare primary keys + const primaryComparison = compareValues(xPrimary, yPrimary); + if (primaryComparison !== 0) { + return primaryComparison; + } + + // If primary keys are equal, compare secondary keys + const xSecondary = a[secondaryKey]; + const ySecondary = b[secondaryKey]; + + // Handle null or undefined values for secondary key + if (xSecondary === null || ySecondary === null || xSecondary === undefined || ySecondary === undefined) { + return 0; + } + + return compareValues(xSecondary, ySecondary); + }); + + function compareValues(x, y) { + // Handle numeric and string comparisons differently + if (typeof x === 'string' && typeof y === 'string') { + return x.localeCompare(y); // For string comparison + } else { + return x - y; // For numeric comparison + } + } +} + diff --git a/Ramses/home/corp/SetMaterialLimit.js b/Ramses/home/corp/SetMaterialLimit.js new file mode 100644 index 0000000..2f3e7b0 --- /dev/null +++ b/Ramses/home/corp/SetMaterialLimit.js @@ -0,0 +1,7 @@ +/** @param {NS} ns */ +export async function main(ns) { + let [sDivName, sCity, oCurrentGoods] = ns.args; + oCurrentGoods = JSON.parse(oCurrentGoods); + ns.corporation.limitMaterialProduction(sDivName, sCity, oCurrentGoods.sMaterialName,50); + ns.writePort(ns.pid, true); + } \ No newline at end of file