2022-02-04 17:06:44 -05:00
/ * *
* Manages hacknet nodes , purchasing nodes to reach the desired amount .
* Upgrades ( Level , RAM , Cores & Cache ) will be automatically purchased .
* /
2022-02-04 11:49:05 -05:00
export async function main ( ns ) {
2022-02-04 17:06:44 -05:00
/ * *
* How to use this script
* message - optional message to add
* /
2022-02-04 16:17:48 -05:00
function help ( message ) {
2022-02-09 22:18:01 -05:00
ns . tprint ( ` \n \n ${ ! message ? '' : ` ${ message } \n \n ` } Usage: run node-manager.js [OPTION] LIMIT \n \n \t Limit - Limit the number of nodes the script will buy \n \n Options: \n \t Help - Displays this help message \n \t Balance - Prevent spending bellow this point \n \n ` ) ;
2022-02-04 16:17:48 -05:00
ns . exit ( ) ;
}
2022-02-04 17:06:44 -05:00
/ * *
* Print header with logs
* message - message to append to logs
* /
2022-02-04 16:17:48 -05:00
function log ( message ) {
ns . clearLog ( ) ;
ns . print ( '===================================================' ) ;
2022-02-09 22:18:01 -05:00
ns . print ( ` 🖥️ Node Manager: ${ nodeCount } / ${ limit } Nodes ` ) ;
2022-02-04 16:17:48 -05:00
ns . print ( '===================================================' ) ;
2022-02-09 22:18:01 -05:00
if ( message != null ) messageHistory . push ( message ) ;
messageHistory . splice ( 0 , messageHistory . length - historyLength ) ;
messageHistory . forEach ( m => ns . print ( m ) ) ;
2022-02-04 16:17:48 -05:00
}
2022-02-04 17:06:44 -05:00
// Setup
2022-02-04 11:49:05 -05:00
ns . disableLog ( 'ALL' ) ;
2022-02-09 22:18:01 -05:00
if ( ns . args . length == 0 ) help ( 'Missing number of nodes' ) ;
2022-02-04 16:17:48 -05:00
if ( ns . args [ 0 ] == 'help' ) help ( ) ;
2022-02-09 22:18:01 -05:00
const historyLength = 17 ;
const messageHistory = Array ( historyLength ) . fill ( '' ) ;
let limit , savings , nodeCount = ns . hacknet . numNodes ( ) ;
if ( ns . args . length == 1 ) {
if ( isNaN ( ns . args [ 0 ] ) ) help ( 'Limit must be a number' ) ;
limit = ns . args [ 0 ] ;
savings = 0 ;
} else if ( ns . args . length == 2 ) {
if ( isNaN ( ns . args [ 1 ] ) ) help ( 'Limit must be a number' ) ;
limit = ns . args [ 1 ] ;
if ( isNaN ( ns . args [ 0 ] ) ) help ( 'Balance must be a number' ) ;
savings = ns . args [ 0 ] ;
}
2022-02-04 11:49:05 -05:00
2022-02-04 16:17:48 -05:00
log ( ) ;
2022-02-04 11:49:05 -05:00
while ( true ) {
2022-02-09 22:18:01 -05:00
const balance = ns . getServerMoneyAvailable ( 'home' ) ;
2022-02-04 11:49:05 -05:00
2022-02-04 17:06:44 -05:00
// Check if we should buy a new node
2022-02-09 22:18:01 -05:00
if ( nodeCount < limit && balance - ns . hacknet . getPurchaseNodeCost ( ) >= savings ) {
2022-02-04 14:29:15 -05:00
nodeCount ++ ;
ns . hacknet . purchaseNode ( ) ;
2022-02-04 16:17:48 -05:00
log ( ` Buying Node ${ nodeCount } ` ) ;
2022-02-04 14:29:15 -05:00
} else {
2022-02-04 17:06:44 -05:00
// Create an ordered list of nodes by their cheapest upgrade
2022-02-09 22:18:01 -05:00
const nodes = Array ( nodeCount ) . fill ( null )
2022-02-04 17:06:44 -05:00
. map ( ( ignore , i ) => ( { // Gather information
2022-02-04 14:29:15 -05:00
index : i ,
cacheCost : ns . hacknet . getCacheUpgradeCost ( i ) ,
coreCost : ns . hacknet . getCoreUpgradeCost ( i ) ,
levelCost : ns . hacknet . getLevelUpgradeCost ( i ) ,
ramCost : ns . hacknet . getRamUpgradeCost ( i ) ,
... ns . hacknet . getNodeStats ( i )
2022-02-04 17:06:44 -05:00
} ) ) . map ( node => { // Figure out cheapest upgrade
2022-02-04 14:29:15 -05:00
if ( node . cacheCost != 0 && node . cacheCost != Infinity && node . cacheCost <= node . coreCost && node . cacheCost <= node . levelCost && node . cacheCost <= node . ramCost ) {
node . bestUpgrade = {
name : 'Cache' ,
cost : node . cacheCost ,
purchase : ( ) => ns . hacknet . upgradeCache ( node . index )
} ;
} else if ( node . coreCost != 0 && node . coreCost != Infinity && node . coreCost <= node . cacheCost && node . coreCost <= node . levelCost && node . coreCost <= node . ramCost ) {
node . bestUpgrade = {
name : 'Core' ,
cost : node . coreCost ,
purchase : ( ) => ns . hacknet . upgradeCore ( node . index )
} ;
} else if ( node . ramCost != 0 && node . ramCost != Infinity && node . ramCost <= node . cacheCost && node . ramCost <= node . levelCost && node . ramCost <= node . coreCost ) {
node . bestUpgrade = {
name : 'RAM' ,
cost : node . ramCost ,
purchase : ( ) => ns . hacknet . upgradeRam ( node . index )
} ;
} else {
node . bestUpgrade = {
name : 'Level' ,
cost : node . levelCost ,
purchase : ( ) => ns . hacknet . upgradeLevel ( node . index )
} ;
}
return node ;
2022-02-04 17:06:44 -05:00
} ) . sort ( ( a , b ) => { // Sort by cheapest upgrade
2022-02-04 14:29:15 -05:00
if ( a . bestUpgrade . cost > b . bestUpgrade . cost ) return 1 ;
if ( a . bestUpgrade . cost < b . bestUpgrade . cost ) return - 1 ;
return 0 ;
} ) ;
2022-02-04 17:06:44 -05:00
// Apply the cheapest upgrade
2022-02-09 22:18:01 -05:00
if ( nodes . length && balance - nodes [ 0 ] . bestUpgrade . cost >= savings ) {
const cost = Math . round ( nodes [ 0 ] . bestUpgrade . cost * 100 ) / 100 ;
log ( ` Upgrading Node ${ nodes [ 0 ] . index } ${ nodes [ 0 ] . bestUpgrade . name } : $ ${ cost } ` ) ;
nodes [ 0 ] . bestUpgrade . purchase ( ) ;
2022-02-04 14:29:15 -05:00
}
}
2022-02-04 11:49:05 -05:00
2022-02-04 17:06:44 -05:00
// Check again in 1s
2022-02-04 14:29:15 -05:00
await ns . sleep ( 1000 ) ;
2022-02-04 11:49:05 -05:00
}
}