Это короткий 500+ Линия All-in-One Gang Script я собрался вместе. Список основных функций:
- Небольшой след (только 3 ГБ)
- Сингл содержал скрипт (Никаких других сценариев не требуется)
- Обрабатывает все действия банды (Прокомментируйте мне больше функций)
- Nice HUD for at-a-glance status of gang stuff
- Manages recruitment, вознесение, 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. Каждый
member name
and what
current task
they’re engaged in
2.
Member stats
для 💪 Сила, 🦴 Оборона, 👀 Ловкость, 🦶 Ловкость, 🧠Ascension rank
3. #
Times looped
, 👜
Buy stuff setting
, 👜$
Cash spent on equipment
, 💰
Current Money
4. 💰
Minimum money setting
, 🩸
Respect owned
, 🔥
Wanted level
5. Вт
Penalty percent
, Wan/Resp:
Wanted/Respect ratio
6. 🗡🗡
Engaged in warfare?
✊🗡
Members in war
, 🥥
Территория % принадлежащий + история
Code Part 1: Настройки
// GANG V5 – Требует 3 GB RAM by Troff//Note: This is a NON-HACK (то есть. 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)
/** @парам {НС} нс **/
экспортировать асинхронную функцию main(нс) {
// ===============================================
// 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 (например. первый 6) stop automatically once we hit 100% территория
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,
// например. 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 ставка)
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 (грубо $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(“DINSABLELOG”); 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
нс.хвост();
нс.принт(“🔥 GANG SCRIPT START 🔥”);
// Attempt to read current gang member ranks from text config file
//нс.принт(“Starting to read gang txt file… “); // DEBUG
если ( NS.FileExists(“/Temp/gang-cfg.txt”, “дом”) ){
нс.принт(“ИНФОРМАЦИЯ ## 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;
нс.принт(“Н: “, 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 ребята)
// 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); // Чтобы быть в безопасности, delay a bit when writing file
нс.принт (“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
нс.принт(” “); // Blank line to seperate loops
нс.принт(“🔴🔴🔴🔴🔴🔴🔴 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’, [“дом”]);
let allEquipment = await runCom1(нс, ‘ns.gang.getEquipmentNames()', ‘getEqName’);
var curResp = ns.nFormat(myGang.respect, “0,0.а”);
var curResp2 = myGang.respect;
//нс.принт(“Уважать: ” + curResp2); // DEBUG
// Recruit members if possible
var canrecruit = await runCom1(нс, ‘ns.gang.canRecruitMember()', ‘canRecr’);
//нс.принт(“INFO Can recruit: ” + canrecruit); // DEBUG
пока ( canrecruit == true ) {
для (let ij = 0; ij < 30; ++ij) {
var canrecruit=await runCom1(нс,’ns.gang.canRecruitMember()',’canRecr’);
//нс.принт(“INFO Can recruit: ” + canrecruit); // DEBUG
если (canrecruit == true) {
нс.принт(“🔴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;
//нс.принт(“🔴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’, [член]);// @@@@@@@@ Check Equipment START @@@@@@@@@@@
var cashSpen = 0; // Track cash spent in loop
//нс.принт(“👜BUYSTUFF: ” + buyStuff); // DEBUG
//нс.принт(“*members.length: ” + members.length); // DEBUG
если (buyStuff==1) {
для (var j = 0; дж < allEquipment.length; ++дж) {
var equipment = allEquipment[дж];
//var eqdebug=equipment.toString(); нс.принт(eqdebug); //DEBUG
//нс.принт(“Chk”,оборудование,memberInfo.upgrades.indexOf(оборудование));
//Above returns AWM Sniper Rifle 12, Graphene Armor -1 etc //DEBUG
//нс.принт(“Проверка: “,оборудование); // DEBUG
//If guy at certain rank & doesn’t have NON-HACKING stuff, купи это
если ( (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’, [член, оборудование]);
//нс.принт(“gangbuy: ” + gangbuy); // DEBUG
если (gangbuy == true) {
cashSpen = cashSpen + расходы;
нс.принт(“👜: ” + оборудование + ” @” + член);
curCash=await runCom1(нс, ‘ns.getServerMoneyAvailable(ns.args[0])',’getSerMon’, [“дом”]);
}
}
}
}
}
// @@@@@@@@@@ Check Equipment END @@@@@@@@@@@
// Get member variables
var memstr = memberInfo.str; // Сила
var memdef = memberInfo.def; // Оборона
var memdex = memberInfo.dex; // Ловкость
var memagi = memberInfo.agi; // Ловкость
//##############################################################
//ASSIGN Tasks (series of “если еще” 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’, [член, gangtask]);
нс.принт(“📱”+ij +”. r0🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█Классифицировать 1: If guy is not rank 2, train Combat until all stats are Ranked 2
еще если (memstr<rnk2 ||memdef<rnk2 ||memdex<rnk2 ||memagi<rnk2) {
var gangtask = “Train Combat”;
await runCom1(нс,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [член, gangtask]);
нс.принт(“📱”+ij +”. r1🚶:”+member+” >”+gangtask.substring(0,lenCom) );
}
//█Классифицировать 3: If ranked 1-4, train Combat until combat stats Ranked 4
еще если ( (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’, [член, gangtask]);
нс.принт(“📱”+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
/* еще если ( (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’, [член, gangtask]);
нс.принт(ij +”. r3🚶:” + член + ” >” + gangtask.substring(0,lenCom) );
} */
//█Terrorism: Do until Respect reaches 10 миллион (for ascension use)
еще если (curResp2 < 10111222) {
var gangtask = “Terrorism”;
await runCom1(нс,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [член, gangtask]);
нс.принт(“📱”+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)
еще если(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’, [член, gangtask]);
//нс.принт(“DEBUG Territory Gangtx = “+ gangtx ); // DEBUG
//нс.принт(“DEBUG ganginwar = “+ ganginwar ); // DEBUG
нс.принт(“📱”+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’, [истинный]);
//нс.принт(“WARN War status changed: “+ warfare ); //DEBUG
} еще {
await runCom1(нс, ‘ns.gang.setTerritoryWarfare(ns.args[0])',’setWar’, [ЛОЖЬ]);
}
}
//█Trafficking/Illegal Arms: (money making actions here!)
//If we have enough respect, do money gathering task
еще если (curResp2 > 10111222) {
var gangtask = “Traffick Illegal Arms”;
//var gangtask = “Торговля людьми”; // Change to this if desired
await runCom1(нс,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [член, gangtask]);
нс.принт(“📱”+ij +”. r4🚶:”+member+” > “+gangtask.substring(0,lenCom) );
}
//█ПО УМОЛЧАНИЮ: If all else above fails, set the guy to default task
еще {
var gangtask = defaulttask; // Default task
await runCom1(нс,’ns.gang.setMemberTask(ns.args[0], ns.args[1])',’setGnTask’, [член, gangtask]);
нс.принт(“📱”+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”); // 🦴 Оборона (bone emoji)
var mdex = ns.nFormat(memdex, “00000”); // 👀 Ловкость (eyes emoji)
var magi = ns.nFormat(memagi, “00000”); // 🦶 Ловкость (feet icon)
нс.принт(” 💪”+mstr+” 🦴”+mdef+” 👀”+mdex+” 🦶”+magi+” 🧠” +ascmem[ij]);
}
// ###### MAIN FOR LOOP END #####
Code Part 3: Вознесение + Разное
если (ascensionCounter != 50) { ascend = true } // Check every 50 loops//Note we need to check current rankings (ascmem[ij]) каждый раз
//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’, [член]);
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(член);
нс.принт(“🌟Rank 4>5, ” + член + ” вознесся! 🌟”);
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’, [член]);
нс.принт(“🌟Rank 6>7, ” + член + ” вознесся! 🌟”);
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’, [член]);
нс.принт(“🌟Rank 5>6, ” + член + ” вознесся! 🌟”);
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’, [член]);
нс.принт(“🌟Rank 4>5, ” + член + ” вознесся! 🌟”);
ascmem[ij] = 5; // Set ascension status rank to 3
}
//█ Ascend to rank 4
еще если (memstr>=rnk4 && ascmem[ij]==3 && maxrank >= 4 ){
await runCom1(нс,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [член]);
нс.принт(“🌟Rank 3>4, ” + член + ” вознесся! 🌟”);
ascmem[ij] = 4; // Set ascension status rank to 4
}
//█ Ascend to Rank 3 to boost xp on way to rank 4, приблизительно 25 минут
еще если (memstr>=rnk3 && memagi>=rnk3 && ascmem[ij]==2){
await runCom1(нс,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [член]);
нс.принт(“🌟Rank 2>3, ” + член + ” вознесся! 🌟”);
ascmem[ij] = 3; // Set ascension status rank to 3
}
//█ Ascend to rank 2
еще если(memstr>=rnk2 && memagi>=rnk2 && ascmem[ij]==1) {
await runCom1(нс,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [член]);
нс.принт(“🌟Rank 1>2, ” + член + ” вознесся! 🌟”);
ascmem[ij] = 2; // Set ascension status rank to 2
}
//█ Ascend Rank 1 early to ‘boost’ xp gain, приблизительно 25 минут
еще если (memstr>=rnk1 && memagi>=rnk1 && ascmem[ij]==0){
await runCom1(нс,’ns.gang.ascendMember(ns.args[0])',’ascMem’, [член]);
нс.принт(“🌟Rank 0>1, ” + член + ” вознесся! 🌟”);
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’, [член]);
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, “ш”);
// #### 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: 💰Мин
var getGang = await runCom1(нс, ‘ns.gang.getGangInformation()', ‘getGangInfo’);
var curResp = ns.nFormat(getGang.respect, “0,0.0а”); // Уважать: 🩸Рез
var curWant =ns.nFormat(getGang.wantedLevel, “0,0.0а”);//Wanted level: 🔥Вт
var curPena =ns.nFormat(myGang.wantedPenalty,”0.00а”);//Penalty level: Вт
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
нс.принт(“#: “+loops+” 👜:” +buyStuff+” 👜:$” +cashSpen+” 💰Cur $” +деньги);
нс.принт(“💰Мин: $” + minCash2 +” 🩸Рез: ” +curResp + ” 🔥Вт: ” +curWant);
нс.принт(“W Pen:” +curPena +”%” +” Wan/Resp:” +curPenaRatio2 +”%”);
нс.принт(“🗡🗡:”+warfare+” ✊🗡:”+warguys +” 🥥: “+gangt2 +” > “+ gangtx);
нс.принт(“🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴”);//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(нс);
нс.принт (“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: Функции
function sleep(РС) {
return new Promise(решить => setTimeout(решать, РС));
}// Функция: 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
//нс.принт(“Имя : “+JSON.stringify(othergang[‘Tetrads’]) ); //DEBUG
//нс.принт(“Власть: “+JSON.stringify(othergang[‘Tetrads’].власть) ); //DEBUG
//нс.принт(“Terro: “+JSON.stringify(othergang[‘Tetrads’].территория));//DEB
//нс.принт(“Столкновение: “+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”]);
//нс.принт(“Tetrads %: ” + ns.nFormat(chantetr, “0.00%”)); //DEBUG
//нс.принт(“Синдикат %: ” + ns.nFormat(chansynd, “0.00%”)); //DEBUG
//нс.принт(“Speakers %: ” + ns.nFormat(chanspea, “0.00%”)); //DEBUG
//нс.принт(“Black Hand%: ” + ns.nFormat(chanblac, “0.00%”)); //DEBUG
//нс.принт(“Dark Army %: ” + ns.nFormat(chandark, “0.00%”)); //DEBUG
//нс.принт(“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; }
//нс.принт(“INFO GangResult : ” + gangresult ); //DEBUG
если (gangresult == true) { вернуть истину; }
если (gangresult == false) { вернуть ложь; }
}
// Функция: 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(нс) {
нс.принт(“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, “ш”);
вернуть истину;
}
//=============================================================================
// 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 + “.текст”;
var fileName2 = fileName + “.js”;
//нс.принт (” fileName = “, fileName) // DEBUG
//нс.принт (” fileName2 = “, fileName2) // DEBUG
// COMPLEX SCRIPT
let script = `export async function main(нс) {` +
`let r;пытаться{r=JSON.stringify(\n` +
` ${команда}\n` +
`);}ловить(е){r=”ERROR: “+(typeof e==’string’?е:e.message||JSON.stringify(е));}\n` +
`const f=”${fileName}”; если(ns.read(ж)!==r) жду ns.write(ж,р,’w’) } `;
var oldContents = ns.read(fileName2);
пока (oldContents != script) {
жду ns.write(fileName2, сценарий, “ш”);
// Wait for script to appear readable (can be finicky on write)
var oldContents = ns.read(fileName2);
}
//нс.принт (“args = “, args) // DEBUG
для (var ij = 0; ij < 5; ij++) { если (args[ij] == null) args[ij] = “0”;
//нс.принт (“args[“,ij,”] = “, args[ij]) // DEBUG
};
//Run the script!
await ns.exec(fileName2,”дом”,1,args[0],args[1],args[2],args[3]);
//жду нс.сон(50);
// We ‘try’ to catch JSON errors (they vanish after 1-2 петли)
const fileData = await ns.read(fileName);
пытаться {
var fileData2 = JSON.parse(fileData);
} ловить(е) {
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)!
Это все, чем мы делимся сегодня для этого. Битбернер гид. Это руководство было первоначально создано и написано Трафф. На случай, если нам не удастся обновить это руководство, вы можете найти последнее обновление, следуя этому связь.