This is a shortish 500+ line all-in-one Gang script I cobbled together. List of main features:
- Small memory footprint (alleen 3 GB)
- SINGLE contained script (no other scripts required)
- Handles all Gang actions (comment me for more features)
- Nice HUD for at-a-glance status of gang stuff
- Manages recruitment, ascension, task duties
- Automated equipment buying with budget
- Handles territory warfare with custom parameters
- Highly customisable to your own play-style
How the code works should be self evident via the comments. I’ve also left in DEBUG code lines so you can learn and see what’s happening (feel free to delete them). Comments are welcome!
Invoering
The latest update uses external script running code (adapted from the excellent Alain Bryden) to maintain a small 3.0 GB memory footprint – now you can start running Gang Ops fast!
* Each Gang member is automatically named 0 naar 11 (for ease of listing, reference and programming, though you could program in custom names if you want).
* I’ve also tried using the concept of
‘ranks’
to manage when members should ascend – it tracks them via their stats level (even after factoring equipment).
* Warfare is managed automatically, and will also stop automatically when territory reaches 100% (don’t underestimate warfare as the gains are quite exponential on cashflow)
*
There are many theories and discussions on how to ascend, equip and manage gang members
. By looking through the code, I hope I have made enough flexibility for you to modify and configure your own style of gang-ing.
The Log Window is used as a small-sized HUD to see what’s happening. This prevents you from having to scroll through the Gang menus constantly, and you can minimise it and shift the log HUD to the corner of the screen when not in use.
I personally like to keep the minimised log window covering the Health status line as shown below (as it’s not important, health level doesn’t matter for healing as hospital fees scale linearly) and expand it whenever you need to check on the gang.
Briefly the HUD shows:
1. Each
member name
and what
current task
they’re engaged in
2.
Member stats
voor 💪 Kracht, 🦴 Defense, 👀 Behendigheid, 🦶 Wendbaarheid, 🧠Ascension rank
3. #
Times looped
, 👜
Buy stuff setting
, 👜$
Cash spent on equipment
, 💰
Current Money
4. 💰
Minimum money setting
, 🩸
Respect owned
, 🔥
Wanted level
5. W
Penalty percent
, Wan/Resp:
Wanted/Respect ratio
6. 🗡🗡
Engaged in warfare?
✊🗡
Members in war
, 🥥
Territory % owned + history
Code Part 1: Instellingen
// GANG V5 – Requires 3 GB RAM by Troff//Note: This is a NON-HACK (d.w.z. combat gang) gang script.
//Versie 5 – added automated config file handling (no more manual stuff!)
// Made minor improvements, these include better war management and also
// excluding buying of non-combat equipment to save some money.
//You can turn ON lines marked “DEBUG” to get a further understanding or
// for troubleshooting. Feel free to delete them (as they’re not required)
/** @param {NS} ns **/
export async function main(ns) {
// ===============================================
// SETTINGS START (change as required)
var lenCom = 21; //Text length of gang member’s task displayed
let buyStuff = 1; //Can gang members buy equipment? 1=Yes, 0=No
let minCash= 50111222; //Min cash to keep (gang equipment is costly)
//let minCash= 52333111222; //Min cash (25/50B for Stock market API)
//let minCash= 150333111222; //Min cash (150B to start a corp)
let maxrank = 7; // Max level to rank for each gang member
let equiprank = 2; // Rank at which members can buy equipment (standaard: 2)
let defaulttask = “Traffick Illegal Arms”; //Default task if no criteria met
let sleepdelay = 16000; // Pause in milliseconds between each loop
// War team (bijv. the first 6) stop automatically once we hit 100% territory
let warguys = 6; // Number of gang members to engage in territory warfare
let warchance = 0.97; // Minimum win chance before we start war with gangs
// ### Ascension level settings (adjust as required) ###
// Read up on gang level progression. You should do a clean run & opmerking
// your own rules/levels etc- we use rank numbers to track ascension level,
// bijv. 4=934 stats, 5=56k. Insert more if needed, but need adjust some code
let ascend = true; // do we check ascensions?
let rnk1 = 98; // Rank 1 (gives a x2 multiplier)
let rnk2 = 274; // Rank 2 (gives a x4 multiplier, +0.25 tarief)
let rnk3 = 550; // Rank 3 (gives x6 multiplier)
let rnk4 = 934; // Rank 4 (x8 multiplier)
let rnk5 = 56000; // Rank 5 (x19 multiplier with mods)
let rnk6 = 145111; // Rank 6 (x36 multiplier with mods)
let rnk7 = 380111; // Rank 7 (x80-82 multiplier with mods)
//let rnk8 = 1256111; // Rank 8 (roughly $1 billion/second income)
//TO DO in v6 – automate rank 8 onwards to accomodate higher levels
// Criteria for when to start Vigilante work to lower Wanted level
let minVResp = 1; // Minimum respect to do vigilante work
let minVPen = 10; // If Penalty above this then do vigi work
let minVWant = 5; // If Wanted level above this then do vigi
let minVRank = rnk2; // Minimum member ascension rank to vigi
// SETTINGS END
// ===============================================
// Set DEFAULT VARIABLES (don’t change anything)
let loops = 0; // keeps track of loops
let ascensionCounter = 0; // helps keeps track when to check ascensions
// Set default ascension ranks of members. Members are named 0, 1, 2, enz
let ascmem = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
let lengthdump = 0; // Default gang size read from cfg file
let warfare = false; // Set territory warfare to false
// Set default gang territory (need more variables as turnover is longer)
var gangt0 = 0; var gangt1 = 0; var gangt2 = 0; let gangtx = 0;
let ganginwar = 0; // Set counter for number members in territory warfare
// Disable Logs
ns.disableLog(“disableLog”); ns.disableLog(“sleep”); ns.disableLog(“exec”);
ns.disableLog(“getServerMoneyAvailable”);ns.disableLog(“gang.ascendMember”);
ns.disableLog(“gang.setMemberTask”);ns.disableLog(“gang.purchaseEquipment”);
ns.disableLog(“gang.recruitMember”);ns.disableLog(“gang.setTerritoryWarfare”);
// Open log window and show start of script in logs
ns.tail();
ns.print(“🔥 GANG SCRIPT START 🔥”);
// Attempt to read current gang member ranks from text config file
//ns.print(“Starting to read gang txt file… “); // DEBUG
if ( ns.fileExists(“/Temp/gang-cfg.txt”, “thuis”) ){
ns.print(“INFO ## Gang txt file EXISTS ##”)
let listnames = [];
var datadump = JSON.parse(ns.read(“/Temp/gang-cfg.txt”));
if (datadump.length > 0) {
lengthdump = datadump.length; // Transfer value for checking later
voor (var ij = 0; ij < datadump.length; ij++) {
listnames[ij] = datadump[ij].naam;
ascmem[ij] = datadump[ij].ascmem;
ns.print(“N: “, listnames[ij], ” Asc: “, ascmem[ij])
}
}
}
// If number of gang members is too low, we need to reset the config file
// (this assumes in subsequent launches you’ll have more than 3 guys)
// Once you’re up and running with more than 3 guys this is ignored on
// subsequent stops and restarting of this script.
if (lengthdump < 4) {
const resetconfig = await resetGangFile(ns);
//ns.sleep(100); // To be safe, delay a bit when writing file
ns.print (“Resetting gang file: “, resetconfig);
// Meanwhile here in program, load the reset variables into memory
ascmem = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
}
// ###################################
// MAIN WHILE LOOP START
terwijl (WAAR) {
// Resize the log window to the width of the red dots for perfect fit
ns.print(” “); // Blank line to seperate loops
ns.print(“🔴🔴🔴🔴🔴🔴🔴 G A N G 🔴🔴🔴🔴🔴🔴🔴”);
// Get Gang info, cash and equipment names
let myGang = await runCom1(ns, ‘ns.gang.getGangInformation()', ‘getGangInfo’);
let curCash=await runCom1(ns, ‘ns.getServerMoneyAvailable(ns.args[0])',’getSerMon’, [“thuis”]);
let allEquipment = await runCom1(ns, ‘ns.gang.getEquipmentNames()', ‘getEqName’);
var curResp = ns.nFormat(myGang.respect, “0,0.A”);
var curResp2 = myGang.respect;
//ns.print(“Respect: ” + curResp2); // DEBUG
// Recruit members if possible
var canrecruit = await runCom1(ns, ‘ns.gang.canRecruitMember()', ‘canRecr’);
//ns.print(“INFO Can recruit: ” + canrecruit); // DEBUG
terwijl ( canrecruit == true ) {
voor (let ij = 0; ij < 30; ++ij) {
var canrecruit=await runCom1(ns,’ns.gang.canRecruitMember()',’canRecr’);
//ns.print(“INFO Can recruit: ” + canrecruit); // DEBUG
if (canrecruit == true) {
ns.print(“🔴RECRUITED: ” + ij + “🔴”);
}
}
}
// Get gang member names
let members = await runCom1(ns, ‘ns.gang.getMemberNames()',’getMemNam’);
// Get Territory % and get ‘wanted over respect’ niveau
var ganginfo = await runCom1(ns,’ns.gang.getGangInformation()',’getGangInfo’);
gangtx = ganginfo.territory;
var curResp = ganginfo.respect;
var curWant = ganginfo.wantedLevel;
var curPena2b = ganginfo.wantedLevel/ganginfo.respect * 100;
//ns.print(“🔴Want/Respect: ” + ns.nFormat(curPena2b, “0,0.00”) +” %” );
// //Reset check for gang members in territory warfare & reset warfare status
ganginwar = 0;
warfare = false;
Code Part 2: Main Loop
voor (let ij = 0; ij < members.length; ++ij) {
var member = members[ij];
var memberInfo = await runCom1(ns, ‘ns.gang.getMemberInformation(ns.args[0])',’getMemInf’, [member]);// @@@@@@@@ Check Equipment START @@@@@@@@@@@
var cashSpen = 0; // Track cash spent in loop
//ns.print(“👜BUYSTUFF: ” + buyStuff); // DEBUG
//ns.print(“*members.length: ” + members.length); // DEBUG
if (buyStuff==1) {
voor (var j = 0; J < allEquipment.length; ++J) {
var equipment = allEquipment[J];
//var eqdebug=equipment.toString(); ns.print(eqdebug); //DEBUG
//ns.print(“Chk”,equipment,memberInfo.upgrades.indexOf(equipment));
//Above returns AWM Sniper Rifle 12, Graphene Armor -1 etc //DEBUG
//ns.print(“Checking: “,equipment); // DEBUG
//If guy at certain rank & doesn’t have NON-HACKING stuff, koop het
if ( (memberInfo.upgrades.indexOf(equipment) == -1) && (memberInfo.augmentations.indexOf(equipment) == -1) && ascmem[ij] >= equiprank && equipment != “NUKE Rootkit” && equipment != “Soulstealer Rootkit” && equipment != “Demon Rootkit” && equipment != “Hmap Node” && equipment != “Jack the Ripper” && equipment != “DataJack” && equipment != “Neuralstimulator” && equipment != “BitWire”) {
var cost = await runCom1(ns, ‘ns.gang.getEquipmentCost(ns.args[0])',’getEqCost’, [equipment]);
if ( (cost + minCash) < curCash ) {
var gangbuy = await runCom1(ns, ‘ns.gang.purchaseEquipment(ns.args[0], ns.args[1])',’getEqCost’, [member, equipment]);
//ns.print(“gangbuy: ” + gangbuy); // DEBUG
if (gangbuy == true) {
cashSpen = cashSpen + cost;
ns.print(“👜: ” + equipment + ” @” + member);
curCash=await runCom1(ns, ‘ns.getServerMoneyAvailable(ns.args[0])',’getSerMon’, [“thuis”]);
}
}
}
}
}
// @@@@@@@@@@ Check Equipment END @@@@@@@@@@@
// Get member variables
var memstr = memberInfo.str; // Kracht
var memdef = memberInfo.def; // Defence
var memdex = memberInfo.dex; // Behendigheid
var memagi = memberInfo.agi; // Wendbaarheid
//##############################################################
//ASSIGN Tasks (series of “if else” statements, edit as desired)
//█Wanted status: If too high then go vigilante to lower it
if (curResp>minVResp && curPena2b>minVPen && curWant>minVWant && memstr>minVRank) {
var gangtask = “Vigilante Justice”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r0🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█Rank 1: If guy is not rank 2, train Combat until all stats are Ranked 2
else if (memstr<rnk2 ||memdef<rnk2 ||memdex<rnk2 ||memagi<rnk2) {
var gangtask = “Train Combat”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r1🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█Rank 3: If ranked 1-4, train Combat until combat stats Ranked 4
else if ( (memstr<rnk4 || memdef<rnk4 ||memagi<rnk4) && (ascmem[ij]==1 || ascmem[ij]==2 || ascmem[ij]==3 || ascmem[ij]==4) ) {
var gangtask = “Train Combat”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r2🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//EXAMPLE of further criteria that can be inserted easily using if’s
//█Rank5: Train Combat until stats ranked 6, and members 3-11
/* else if ( (memstr<rnk5 ||memdef<rnk5 ||memagi<rnk5) && (ascmem[ij]==2||ascmem[ij]==3 || ascmem[ij]==4 ) && members.length > 3 && members.length < 12 && maxrank == 3 ){
var gangtask = “Train Combat”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(ij +”. r3🚶:” + member + ” >” + gangtask.substring(0,lenCom) );
} */
//█Terrorism: Do until Respect reaches 10 million (for ascension use)
else if (curResp2 < 10111222) {
var gangtask = “Terrorism”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r3🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█TERRORITY WARFARE: Set task if guy is over rank 2, members at least 9,
// is part of war team (warguys) and territory < 100% conquered (gangtx)
else if(ascmem[ij]>2 && members.length>9 && (ij>=0 && ij<warguys) && gangtx<1){
ganginwar = ganginwar + 1; // Increment counter for gangs in warfare
var gangtask = “Territory Warfare”;
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
//ns.print(“DEBUG Territory Gangtx = “+ gangtx ); // DEBUG
//ns.print(“DEBUG ganginwar = “+ ganginwar ); // DEBUG
ns.print(“📱”+ij +”. 🚶:”+member+” > “+gangtask.substring(0,lenCom) );
//Check war chances against clans
const dowewar=await checkgangwar(ns, warchance);//Warcheck function
if (dowewar == true) {
warfare = true;
await runCom1(ns, ‘ns.gang.setTerritoryWarfare(ns.args[0])',’setWar’, [WAAR]);
//ns.print(“WARN War status changed: “+ warfare ); //DEBUG
} else {
await runCom1(ns, ‘ns.gang.setTerritoryWarfare(ns.args[0])',’setWar’, [vals]);
}
}
//█Trafficking/Illegal Arms: (money making actions here!)
//If we have enough respect, do money gathering task
else if (curResp2 > 10111222) {
var gangtask = “Traffick Illegal Arms”;
//var gangtask = “Human Trafficking”; // Change to this if desired
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r4🚶:”+member+” > “+gangtask.substring(0,lenCom) );
}
//█DEFAULT: If all else above fails, set the guy to default task
else {
var gangtask = defaulttask; // Default task
await runCom1(ns,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. 🚶:”+member+” > “+gangtask.substring(0,lenCom) );
}
// Print Stats and Rank (brain icon) of member
//Set fixed length of 5 appears nicer as leading 0s make comparison easier
var mstr = ns.nFormat(memstr, “00000”); // 💪 Kracht (muscle icon)
var mdef = ns.nFormat(memdef, “00000”); // 🦴 Defense (bone emoji)
var mdex = ns.nFormat(memdex, “00000”); // 👀 Behendigheid (eyes emoji)
var magi = ns.nFormat(memagi, “00000”); // 🦶 Wendbaarheid (feet icon)
ns.print(” 💪”+mstr+” 🦴”+mdef+” 👀”+mdex+” 🦶”+magi+” 🧠” +ascmem[ij]);
}
// ###### MAIN FOR LOOP END #####
Code Part 3: Hemelvaart + Diversen
if (ascensionCounter != 50) { ascend = true } // Check every 50 loops//Note we need to check current rankings (ascmem[ij]) elke keer
//in order not to encounter duplications in rulesets
if (ascend == true) {
voor (let ij = 0; ij < members.length; ++ij) {
let member = members[ij];
//// Get member stats again
var memberInfo = await runCom1(ns, ‘ns.gang.getMemberInformation(ns.args[0])',’getMemInf’, [member]);
var memstr = memberInfo.str; var memdef = memberInfo.def;
var memdex = memberInfo.dex; var memagi = memberInfo.agi;
/*
//█ Ascend to rank 8 [EXAMPLE OF Custom Ascension Rule]
if (memstr>=rnk8 && ascmem[ij]==7 && maxrank >= 8 ){
ns.gang.ascendMember(member);
ns.print(“🌟Rank 4>5, ” + member + ” ascended! 🌟”);
ascmem[ij] = 5; // Set ascension status rank to 5
}
*/
//█ Ascend to rank 7
if (memstr>=rnk7 && ascmem[ij]==6 && maxrank >=7 ){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 6>7, ” + member + ” ascended! 🌟”);
ascmem[ij] = 7; // Set ascension status rank to 5
}
//█ Ascend to rank 6
if (memstr>=rnk6 && ascmem[ij]==5 && maxrank >=6 ){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 5>6, ” + member + ” ascended! 🌟”);
ascmem[ij] = 6; // Set ascension status rank to 4
//countrank2 = countrank2 + 1;
}
//█ Ascend to rank 5
if (memstr>=rnk5 && ascmem[ij]==4 && maxrank >=5 ){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 4>5, ” + member + ” ascended! 🌟”);
ascmem[ij] = 5; // Set ascension status rank to 3
}
//█ Ascend to rank 4
else if (memstr>=rnk4 && ascmem[ij]==3 && maxrank >= 4 ){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 3>4, ” + member + ” ascended! 🌟”);
ascmem[ij] = 4; // Set ascension status rank to 4
}
//█ Ascend to Rank 3 to boost xp on way to rank 4, approx 25 min
else if (memstr>=rnk3 && memagi>=rnk3 && ascmem[ij]==2){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 2>3, ” + member + ” ascended! 🌟”);
ascmem[ij] = 3; // Set ascension status rank to 3
}
//█ Ascend to rank 2
else if(memstr>=rnk2 && memagi>=rnk2 && ascmem[ij]==1) {
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 1>2, ” + member + ” ascended! 🌟”);
ascmem[ij] = 2; // Set ascension status rank to 2
}
//█ Ascend Rank 1 early to ‘boost’ xp gain, approx 25 min
else if (memstr>=rnk1 && memagi>=rnk1 && ascmem[ij]==0){
await runCom1(ns,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [member]);
ns.print(“🌟Rank 0>1, ” + member + ” ascended! 🌟”);
ascmem[ij] = 1; // Set ascension status rank to 1
}
}
}
// @@@@@@@@@ END ASCEND SECTION @@@@@@@@
loops++; // Increment loop counter
// #### START Write status to txt file ####
var txtstring = “[“;
let members3 = await runCom1(ns, ‘ns.gang.getMemberNames()',’getMemNam’);
voor (let ij = 0; ij < members3.length; ++ij) {
var member = members3[ij];
var myGang2 = await runCom1(ns, ‘ns.gang.getMemberInformation(ns.args[0])',’getMemInf’, [member]);
txtstring = txtstring + ‘{\”name\”:\”‘ + myGang2.name + ‘\”, ‘;
txtstring = txtstring + ‘\”ascmem\”:’ + ascmem[ij] + ‘}';
if (ij!=members3.length-1) {txtstring = txtstring + ‘,'}
}
txtstring = txtstring + ‘]';
var filewrite = await ns.write(“/Temp/gang-cfg.txt”, txtstring, “w”);
// #### END Write status to txt file ####
// SHOW STATUS
var money = ns.nFormat(curCash, “0,0.0A”); //Money in hand: 💰Cur
var minCash2 = ns.nFormat(minCash, “0,0.0A”); //Minimum cash level: 💰Min
var getGang = await runCom1(ns, ‘ns.gang.getGangInformation()', ‘getGangInfo’);
var curResp = ns.nFormat(getGang.respect, “0,0.0A”); // Respect: 🩸Res
var curWant =ns.nFormat(getGang.wantedLevel, “0,0.0A”);//Wanted level: 🔥W
var curPena =ns.nFormat(myGang.wantedPenalty,”0.00A”);//Penalty level: W
var curPenaRatio =getGang.wantedLevel/getGang.respect *100;//Penalty ratio
var curPenaRatio2 = ns.nFormat( curPenaRatio , “0.00A”) ; //Nicer format
gangt2 = gangt1; gangt1 = gangt0; gangt0 = gangtx;//Add territory history
gangtx = getGang.territory; // Get current territory history
gangt2 = ns.nFormat(gangt2, “0.00%”); // Convert to percentage
gangtx = ns.nFormat(gangtx, “0.00%”); // Convert to percentage
ns.print(“#: “+loops+” 👜:” +buyStuff+” 👜:$” +cashSpen+” 💰Cur $” +geld);
ns.print(“💰Min: $” + minCash2 +” 🩸Res: ” +curResp + ” 🔥W: ” +curWant);
ns.print(“W Pen:” +curPena +”%” +” Wan/Resp:” +curPenaRatio2 +”%”);
ns.print(“🗡🗡:”+warfare+” ✊🗡:”+warguys +” 🥥: “+gangt2 +” > “+ gangtx);
ns.print(“🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴”);//Bottom footer
await sleep(sleepdelay);
//Check if gang is just 3 guys+ranked too high, then reset the config file
//This catches a bug if the gang script crashes/ends for some reason
if (members3.length < 4 && ascmem[0]>2 && ascmem[1]>2 && ascmem[2]>2) {
const resetconfig = await resetGangFile(ns);
ns.print (“Resetting gang file: “, resetconfig);
ascmem=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
}
}
// MAIN WHILE LOOP END
// ###################################
}
Code Part 4: Functions
function sleep(mevrouw) {
return new Promise(resolve => setTimeout(resolve, mevrouw));
}// Function: Check chances of war against other gangs
export async function checkgangwar(ns, winchance) {
var gangresult = true; // By default we CAN engage in warfare
// Gang names for reference:
// Tetrads, The Syndicate, Speakers for the Dead
// The Black Hand, The Dark Army, NiteSec
//const othergang = ns.gang.getOtherGangInformation(); // DEBUG
//ns.print(“Naam : “+JSON.stringify(othergang[‘Tetrads’]) ); //DEBUG
//ns.print(“Stroom: “+JSON.stringify(othergang[‘Tetrads’].power) ); //DEBUG
//ns.print(“Terro: “+JSON.stringify(othergang[‘Tetrads’].territory));//DEB
//ns.print(“Clash: “+ns.gang.getChanceToWinClash(‘Tetrads’) ); //DEBUG
// Get chances to win wars for all other gangs:
var chantetr = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“Tetrads”]);
var chansynd = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“The Syndicate”]);
var chanspea = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“Speakers for the Dead”]);
var chanblac = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“The Black Hand”]);
var chandark = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“The Dark Army”]);
var channite = await runCom1(ns, ‘ns.gang.getChanceToWinClash(ns.args[0])',’getChanWin’, [“NiteSec”]);
//ns.print(“Tetrads %: ” + ns.nFormat(chantetr, “0.00%”)); //DEBUG
//ns.print(“Syndicaat %: ” + ns.nFormat(chansynd, “0.00%”)); //DEBUG
//ns.print(“Speakers %: ” + ns.nFormat(chanspea, “0.00%”)); //DEBUG
//ns.print(“Black Hand%: ” + ns.nFormat(chanblac, “0.00%”)); //DEBUG
//ns.print(“Dark Army %: ” + ns.nFormat(chandark, “0.00%”)); //DEBUG
//ns.print(“NiteSec %: ” + ns.nFormat(channite, “0.00%”)); //DEBUG
// Check chances are good for warfare, if not then don’t engage
if (chantetr < winchance) { gangresult = false; }
if (chansynd < winchance) { gangresult = false; }
if (chanspea < winchance) { gangresult = false; }
if (chanblac < winchance) { gangresult = false; }
if (chandark < winchance) { gangresult = false; }
if (channite < winchance) { gangresult = false; }
//ns.print(“INFO GangResult : ” + gangresult ); //DEBUG
if (gangresult == true) { return true; }
if (gangresult == false) { return false; }
}
// Function: Reset Gang File
// Contents of new default gang-cfg.txt file are as follows:
// [{“naam”:”0″,”ascmem”:0},{“naam”:”1″,”ascmem”:0},{“naam”:”2″,”ascmem”:0}]
function resetGangFile(ns) {
ns.print(“WARN Writing new gang config file…”);
const cfgScriptContent = “[{\”name\”:\”0\”, \”ascmem\”:0},{\”name\”:\”1\”, \”ascmem\”:0},{\”name\”:\”2\”, \”ascmem\”:0}]”;
const cfgScript = “/Temp/gang-cfg.txt”;
ns.write(cfgScript, cfgScriptContent, “w”);
return true;
}
//=============================================================================
// External SCRIPT RUNNER START (adapted/shortened fr ALAIN BRYDEN’s scripts)
export async function runCom1(ns, command, fileName, args = []) {
var precursor = “gang5-“; // Could be gang-, blade-, enz
var fileName = “/Temp/” + precursor + fileName + “.txt”;
var fileName2 = fileName + “.js”;
//ns.print (” fileName = “, fileName) // DEBUG
//ns.print (” fileName2 = “, fileName2) // DEBUG
// COMPLEX SCRIPT
let script = `export async function main(ns) {` +
`let r;try{r=JSON.stringify(\n` +
` ${command}\n` +
`);}catch(e){r=”ERROR: “+(typeof e==’string’?e:e.message||JSON.stringify(e));}\n` +
`const f=”${fileName}”; if(ns.read(F)!==r) await ns.write(F,R,’w’) } `;
var oldContents = ns.read(fileName2);
terwijl (oldContents != script) {
await ns.write(fileName2, script, “w”);
// Wait for script to appear readable (can be finicky on write)
var oldContents = ns.read(fileName2);
}
//ns.print (“args = “, args) // DEBUG
voor (var ij = 0; ij < 5; ij++) { if (args[ij] == null) args[ij] = “0”;
//ns.print (“args[“,ij,”] = “, args[ij]) // DEBUG
};
//Run the script!
await ns.exec(fileName2,”thuis”,1,args[0],args[1],args[2],args[3]);
//await ns.sleep(50);
// We ‘try’ to catch JSON errors (they vanish after 1-2 loops)
const fileData = await ns.read(fileName);
try {
var fileData2 = JSON.parse(fileData);
} catch(e) {
console.log(‘Unable to parse the string.’)
}
return fileData2;
}
// External SCRIPT RUNNER END
//=============================================================================
//End Of Line
Conclusie
I’ll be updating this script as time goes. Already I’ve gotten some comments that some things may not be optimal – feel free to comment and cannibalize the code for your own scripts and functions!
Cheers and hope it helps you out (in any way)!
Dat is alles wat we vandaag hiervoor delen Bitburner gids. Deze handleiding is oorspronkelijk gemaakt en geschreven door Troff. Voor het geval we er niet in slagen deze handleiding bij te werken, U kunt de laatste update vinden door dit te volgen link.