This is a shortish 500+ line all-in-one Gang script I cobbled together. List of main features:
- Small memory footprint (فقط 3 غيغابايت)
- 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!
مقدمة
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 ل 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
ل 💪 قوة, 🦴 Defense, 👀 Dexterity, 🦶 خفة الحركة, 🧠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: إعدادات
// GANG V5 – Requires 3 GB RAM by Troff//Note: This is a NON-HACK (i.e. combat gang) gang script.
//إصدار 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 {ن.س} نانوثانية **/
وظيفة التصدير غير المتزامنة الرئيسية(نانوثانية) {
// ===============================================
// 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 (تقصير: 2)
let defaulttask = “Traffick Illegal Arms”; //Default task if no criteria met
let sleepdelay = 16000; // Pause in milliseconds between each loop
// War team (e.g. 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 & ملحوظة
// your own rules/levels etc- we use rank numbers to track ascension level,
// e.g. 4=934 stats, 5=56k. Insert more if needed, but need adjust some code
let ascend = true; // do we check ascensions?
let rnk1 = 98; // رتبة 1 (gives a x2 multiplier)
let rnk2 = 274; // رتبة 2 (gives a x4 multiplier, +0.25 rate)
let rnk3 = 550; // رتبة 3 (gives x6 multiplier)
let rnk4 = 934; // رتبة 4 (x8 multiplier)
let rnk5 = 56000; // رتبة 5 (x19 multiplier with mods)
let rnk6 = 145111; // رتبة 6 (x36 multiplier with mods)
let rnk7 = 380111; // رتبة 7 (x80-82 multiplier with mods)
//let rnk8 = 1256111; // رتبة 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, إلخ
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(“ينام”); 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
لو ( ns.fileExists(“/Temp/gang-cfg.txt”, “home”) ){
ns.print(“INFO ## Gang txt file EXISTS ##”)
let listnames = [];
var datadump = JSON.parse(ns.read(“/Temp/gang-cfg.txt”));
لو (datadump.length > 0) {
lengthdump = datadump.length; // Transfer value for checking later
ل (var ij = 0; ij < datadump.length; ij++) {
listnames[ij] = datadump[ij].اسم;
ascmem[ij] = datadump[ij].ascmem;
ns.print(“ن: “, 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.
لو (lengthdump < 4) {
const resetconfig = await resetGangFile(نانوثانية);
//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
بينما (حقيقي) {
// 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.gang.getGangInformation()’, ‘getGangInfo’);
let curCash=await runCom1(نانوثانية, ‘ns.getServerMoneyAvailable(ns.args[0])’,’getSerMon’, [“home”]);
let allEquipment = await runCom1(نانوثانية, ‘ns.gang.getEquipmentNames()’, ‘getEqName’);
var curResp = ns.nFormat(myGang.respect, “0,0.أ”);
var curResp2 = myGang.respect;
//ns.print(“Respect: ” + curResp2); // DEBUG
// Recruit members if possible
var canrecruit = await runCom1(نانوثانية, ‘ns.gang.canRecruitMember()’, ‘canRecr’);
//ns.print(“INFO Can recruit: ” + canrecruit); // DEBUG
بينما ( canrecruit == true ) {
ل (let ij = 0; ij < 30; ++ij) {
var canrecruit=await runCom1(نانوثانية,’ns.gang.canRecruitMember()’,’canRecr’);
//ns.print(“INFO Can recruit: ” + canrecruit); // DEBUG
لو (canrecruit == true) {
ns.print(“🔴RECRUITED: ” + ij + “🔴”);
}
}
}
// Get gang member names
let members = await runCom1(نانوثانية, ‘ns.gang.getMemberNames()’,’getMemNam’);
// Get Territory % and get ‘wanted over respect’ مستوى
var ganginfo = await runCom1(نانوثانية,’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
ل (let ij = 0; ij < members.length; ++ij) {
var member = members[ij];
var memberInfo = await runCom1(نانوثانية, ‘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
لو (buyStuff==1) {
ل (var j = 0; j < allEquipment.length; ++j) {
var equipment = allEquipment[j];
//var eqdebug=equipment.toString(); ns.print(eqdebug); //DEBUG
//ns.print(“Chk”,معدات,memberInfo.upgrades.indexOf(معدات));
//Above returns AWM Sniper Rifle 12, Graphene Armor -1 etc //DEBUG
//ns.print(“Checking: “,معدات); // DEBUG
//If guy at certain rank & doesn’t have NON-HACKING stuff, buy it
لو ( (memberInfo.upgrades.indexOf(معدات) == -1) && (memberInfo.augmentations.indexOf(معدات) == -1) && ascmem[ij] >= equiprank && معدات != “NUKE Rootkit” && معدات != “Soulstealer Rootkit” && معدات != “Demon Rootkit” && معدات != “Hmap Node” && معدات != “Jack the Ripper” && معدات != “DataJack” && معدات != “Neuralstimulator” && معدات != “BitWire”) {
var cost = await runCom1(نانوثانية, ‘ns.gang.getEquipmentCost(ns.args[0])’,’getEqCost’, [معدات]);
لو ( (يكلف + minCash) < curCash ) {
var gangbuy = await runCom1(نانوثانية, ‘ns.gang.purchaseEquipment(ns.args[0], ns.args[1])’,’getEqCost’, [member, معدات]);
//ns.print(“gangbuy: ” + gangbuy); // DEBUG
لو (gangbuy == true) {
cashSpen = cashSpen + يكلف;
ns.print(“👜: ” + معدات + ” @” + member);
curCash=await runCom1(نانوثانية, ‘ns.getServerMoneyAvailable(ns.args[0])’,’getSerMon’, [“home”]);
}
}
}
}
}
// @@@@@@@@@@ Check Equipment END @@@@@@@@@@@
// Get member variables
var memstr = memberInfo.str; // قوة
var memdef = memberInfo.def; // Defence
var memdex = memberInfo.dex; // Dexterity
var memagi = memberInfo.agi; // خفة الحركة
//##############################################################
//ASSIGN Tasks (series of “if else” statements, edit as desired)
//█Wanted status: If too high then go vigilante to lower it
لو (curResp>minVResp && curPena2b>minVPen && curWant>minVWant && memstr>minVRank) {
var gangtask = “Vigilante Justice”;
await runCom1(نانوثانية,’ns.gang.setMemberTask(ns.args[0], ns.args[1])’,’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r0🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█رتبة 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.gang.setMemberTask(ns.args[0], ns.args[1])’,’setGnTask’, [member, gangtask]);
ns.print(“📱”+ij +”. r1🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█رتبة 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.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.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.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.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(نانوثانية, warchance);//Warcheck function
لو (dowewar == true) {
warfare = true;
await runCom1(نانوثانية, ‘ns.gang.setTerritoryWarfare(ns.args[0])’,’setWar’, [حقيقي]);
//ns.print(“WARN War status changed: “+ warfare ); //DEBUG
} else {
await runCom1(نانوثانية, ‘ns.gang.setTerritoryWarfare(ns.args[0])’,’setWar’, [false]);
}
}
//█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.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.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”); // 💪 قوة (muscle icon)
var mdef = ns.nFormat(memdef, “00000”); // 🦴 Defense (bone emoji)
var mdex = ns.nFormat(memdex, “00000”); // 👀 Dexterity (eyes emoji)
var magi = ns.nFormat(memagi, “00000”); // 🦶 خفة الحركة (feet icon)
ns.print(” 💪”+mstr+” 🦴”+mdef+” 👀”+mdex+” 🦶”+magi+” 🧠” +ascmem[ij]);
}
// ###### MAIN FOR LOOP END #####
Code Part 3: الصعود + Misc
لو (ascensionCounter != 50) { ascend = true } // Check every 50 loops//Note we need to check current rankings (ascmem[ij]) every time
//in order not to encounter duplications in rulesets
لو (ascend == true) {
ل (let ij = 0; ij < members.length; ++ij) {
let member = members[ij];
//// Get member stats again
var memberInfo = await runCom1(نانوثانية, ‘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]
لو (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
لو (memstr>=rnk7 && ascmem[ij]==6 && maxrank >=7 ){
await runCom1(نانوثانية,’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
لو (memstr>=rnk6 && ascmem[ij]==5 && maxrank >=6 ){
await runCom1(نانوثانية,’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
لو (memstr>=rnk5 && ascmem[ij]==4 && maxrank >=5 ){
await runCom1(نانوثانية,’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.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 mins
else if (memstr>=rnk3 && memagi>=rnk3 && ascmem[ij]==2){
await runCom1(نانوثانية,’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.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 mins
else if (memstr>=rnk1 && memagi>=rnk1 && ascmem[ij]==0){
await runCom1(نانوثانية,’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.gang.getMemberNames()’,’getMemNam’);
ل (let ij = 0; ij < members3.length; ++ij) {
var member = members3[ij];
var myGang2 = await runCom1(نانوثانية, ‘ns.gang.getMemberInformation(ns.args[0])’,’getMemInf’, [member]);
txtstring = txtstring + ‘{\”name\”:\”‘ + myGang2.name + ‘\”, ‘;
txtstring = txtstring + ‘\”ascmem\”:’ + ascmem[ij] + ‘}’;
لو (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.0أ”); //Money in hand: 💰Cur
var minCash2 = ns.nFormat(minCash, “0,0.0أ”); //Minimum cash level: 💰Min
var getGang = await runCom1(نانوثانية, ‘ns.gang.getGangInformation()’, ‘getGangInfo’);
var curResp = ns.nFormat(getGang.respect, “0,0.0أ”); // Respect: 🩸Res
var curWant =ns.nFormat(getGang.wantedLevel, “0,0.0أ”);//Wanted level: 🔥W
var curPena =ns.nFormat(myGang.wantedPenalty,”0.00أ”);//Penalty level: W
var curPenaRatio =getGang.wantedLevel/getGang.respect *100;//Penalty ratio
var curPenaRatio2 = ns.nFormat( curPenaRatio , “0.00أ”) ; //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 $” +مال);
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
لو (members3.length < 4 && ascmem[0]>2 && ascmem[1]>2 && ascmem[2]>2) {
const resetconfig = await resetGangFile(نانوثانية);
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(آنسة) {
return new Promise(resolve => setTimeout(resolve, آنسة));
}// Function: Check chances of war against other gangs
export async function checkgangwar(نانوثانية, 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(“اسم : “+JSON.stringify(othergang[‘Tetrads’]) ); //DEBUG
//ns.print(“قوة: “+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.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“Tetrads”]);
var chansynd = await runCom1(نانوثانية, ‘ns.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“The Syndicate”]);
var chanspea = await runCom1(نانوثانية, ‘ns.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“Speakers for the Dead”]);
var chanblac = await runCom1(نانوثانية, ‘ns.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“The Black Hand”]);
var chandark = await runCom1(نانوثانية, ‘ns.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“The Dark Army”]);
var channite = await runCom1(نانوثانية, ‘ns.gang.getChanceToWinClash(ns.args[0])’,’getChanWin’, [“NiteSec”]);
//ns.print(“Tetrads %: ” + ns.nFormat(chantetr, “0.00%”)); //DEBUG
//ns.print(“Syndicate %: ” + 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
لو (chantetr < winchance) { gangresult = false; }
لو (chansynd < winchance) { gangresult = false; }
لو (chanspea < winchance) { gangresult = false; }
لو (chanblac < winchance) { gangresult = false; }
لو (chandark < winchance) { gangresult = false; }
لو (channite < winchance) { gangresult = false; }
//ns.print(“INFO GangResult : ” + gangresult ); //DEBUG
لو (gangresult == true) { return true; }
لو (gangresult == false) { return false; }
}
// Function: Reset Gang File
// Contents of new default gang-cfg.txt file are as follows:
// [{“اسم”:”0″,”ascmem”:0},{“اسم”:”1″,”ascmem”:0},{“اسم”:”2″,”ascmem”:0}]
function resetGangFile(نانوثانية) {
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(نانوثانية, يأمر, fileName, args = []) {
var precursor = “gang5-“; // Could be gang-, blade-, إلخ
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(نانوثانية) {` +
`let r;try{r=JSON.stringify(\n` +
` ${يأمر}\n` +
`);}catch(ه){r=”ERROR: “+(typeof e==’string’?ه:e.message||JSON.stringify(ه));}\n` +
`const f=”${fileName}”; لو(ns.read(f)!==r) await ns.write(f,ص,’w’) } `;
var oldContents = ns.read(fileName2);
بينما (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
ل (var ij = 0; ij < 5; ij++) { لو (args[ij] == null) args[ij] = “0”;
//ns.print (“args[“,ij,”] = “, args[ij]) // DEBUG
};
//Run the script!
await ns.exec(fileName2,”home”,1,args[0],args[1],args[2],args[3]);
//انتظر 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(ه) {
console.log(‘Unable to parse the string.’)
}
return fileData2;
}
// External SCRIPT RUNNER END
//=============================================================================
//End Of Line
خاتمة
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)!
هذا كل ما نشاركه اليوم من أجل هذا بيتبورنر مرشد. تم إنشاء هذا الدليل وكتابته في الأصل بواسطة Troff. في حالة فشلنا في تحديث هذا الدليل, يمكنك العثور على آخر تحديث باتباع هذا وصلة.