Este es un guión corto de Gang todo en uno de más de 500 líneas que improvisé. Lista de características principales:
- Huella de memoria pequeña (solo 3 GB)
- SOLO script contenido (no se requieren otros scripts)
- Maneja todas las acciones de Gang (coméntame para más funciones)
- Buen HUD para ver el estado de las cosas de pandillas de un vistazo
- Gestiona el reclutamiento, la ascensión, los deberes de las tareas.
- Compra de equipos automatizados con presupuesto.
- Maneja la guerra territorial con parámetros personalizados
- Altamente personalizable para su propio estilo de juego
El funcionamiento del código debe ser evidente a través de los comentarios. También dejé líneas de código en DEBUG para que pueda aprender y ver lo que está sucediendo (siéntase libre de eliminarlas). ¡Los comentarios son bienvenidos!
Introducción
La última actualización utiliza un código de ejecución de script externo (adaptado del excelente Alain Bryden) para mantener una pequeña huella de memoria de 3.0 GB. ¡Ahora puede comenzar a ejecutar Gang Ops rápidamente!
* Cada miembro de la pandilla se nombra automáticamente del 0 al 11 (para facilitar la lista, la referencia y la programación, aunque puede programar nombres personalizados si lo desea).
* También he intentado usar el concepto de
'rango'
para administrar cuándo los miembros deben ascender: los rastrea a través de su nivel de estadísticas (incluso después de factorizar el equipo).
* La guerra se administra automáticamente y también se detendrá automáticamente cuando el territorio alcance el 100% (no subestimes la guerra ya que las ganancias son bastante exponenciales en el flujo de caja)
*
Hay muchas teorías y discusiones sobre cómo ascender, equipar y manejar a los pandilleros.
. Al revisar el código, espero haber creado la flexibilidad suficiente para que pueda modificar y configurar su propio estilo de agrupamiento.
La ventana de registro se usa como un HUD de tamaño pequeño para ver lo que sucede. Esto evita que tengas que desplazarte constantemente por los menús de Gang, y puedes minimizarlo y cambiar el HUD de registro a la esquina de la pantalla cuando no esté en uso.
Personalmente, me gusta mantener la ventana de registro minimizada que cubre la línea de estado de salud como se muestra a continuación (ya que no es importante, el nivel de salud no importa para la curación, ya que las tarifas del hospital aumentan linealmente) y expandirla cada vez que necesite controlar a la pandilla.
Brevemente, el HUD muestra:
1. Cada
nombre de miembro
y lo
tarea actual
están comprometidos en
2.
Estadísticas de miembros
para 💪 Fuerza, 🦴 Defensa, 👀 Destreza, 🦶 Agilidad, 🧠 Rango de Ascensión
3.#
tiempos en bucle
, 👜
Configuración de comprar cosas
, 👜$
Efectivo gastado en equipos
, 💰
Dinero actual
4. 💰
Configuración de dinero mínimo
, 🩸
respeto propiedad
, 🔥
Nivel requerido
5. W
Porcentaje de penalización
, Wan/Rep:
Proporción de búsqueda/respeto
6. 🗡🗡
¿Participar en la guerra?
✊🗡
Miembros en guerra
, 🥥
Territorio % propiedad + historia
Código Parte 1: Configuración
// GANG V5: requiere 3 GB de RAM de Troff//Nota: este es un script de pandillas NO HACK (es decir, pandilla de combate).
//Versión 5: se agregó el manejo automatizado de archivos de configuración (¡no más cosas manuales!)
// Hizo mejoras menores, estas incluyen una mejor gestión de la guerra y también
// excluyendo la compra de equipo que no sea de combate para ahorrar algo de dinero.
// Puede activar las líneas marcadas como "DEBUG" para obtener una mayor comprensión o
// para solucionar problemas. Siéntase libre de eliminarlos (ya que no son necesarios)
/** @parámetro {NS} ns **/
exportar función asíncrona principal(ns) {
// =================================================
// INICIO DE LA CONFIGURACIÓN (cambiar según sea necesario)
var lenCom = 21; //Se muestra la longitud del texto de la tarea del pandillero
let comprarCosas = 1; //¿Los pandilleros pueden comprar equipo? 1=Sí, 0=No
let minCash= 50111222; // Efectivo mínimo para mantener (el equipo de pandillas es costoso)
//let minCash= 52333111222; // Efectivo mínimo (25/50B para API bursátil)
//let minCash= 150333111222; // Efectivo mínimo (150B para iniciar un corp)
sea maxrank = 7; // Nivel máximo a clasificar para cada pandillero
let equiprank = 2; // Rango en el que los miembros pueden comprar equipo (predeterminado: 2)
let defaulttask = “Tráfico de armas ilegales”; //Tarea predeterminada si no se cumplen los criterios
let sleepdelay = 16000; // Pausa en milisegundos entre cada ciclo
// El equipo de guerra (por ejemplo, los primeros 6) se detiene automáticamente una vez que alcanzamos el 100% del territorio
sea warguys = 6; // Número de pandilleros para participar en la guerra territorial
Sea la probabilidad de guerra = 0.97; // Probabilidad mínima de ganar antes de que empecemos la guerra con las pandillas
// ### Configuración del nivel de Ascensión (ajustar según sea necesario) ###
// Lea sobre la progresión del nivel de pandillas. Deberías hacer una carrera limpia y anotar
// sus propias reglas/niveles, etc. Usamos números de rango para rastrear el nivel de ascensión,
// por ejemplo, 4=934 estadísticas, 5=56k. Inserte más si es necesario, pero necesita ajustar algún código
dejar ascender = verdadero; // ¿Comprobamos las ascensiones?
sea rnk1 = 98; // Rango 1 (da un multiplicador x2)
sea rnk2 = 274; // Rango 2 (da un multiplicador x4, tasa de +0.25)
sea rnk3 = 550; // Rango 3 (da multiplicador x6)
sea rnk4 = 934; // Rango 4 (multiplicador x8)
sea rnk5 = 56000; // Rango 5 (multiplicador x19 con mods)
sea rnk6 = 145111; // Rango 6 (multiplicador x36 con mods)
sea rnk7 = 380111; // Rango 7 (multiplicador x80-82 con mods)
//let rnk8 = 1256111; // Rango 8 (aproximadamente $1 mil millones/segundo ingreso)
//TO DO en v6: automatiza el rango 8 en adelante para acomodar niveles más altos
// Criterios sobre cuándo comenzar el trabajo de vigilante para bajar el nivel de búsqueda
sea minVResp = 1; // Mínimo respeto para hacer el trabajo de vigilante
sea minVPen = 10; // Si la penalización supera esto, entonces haz el trabajo de vigi
sea minVWant = 5; // Si se busca un nivel superior a este, haz vigi
sea minVRank = rnk2; // Rango mínimo de ascensión de miembros a vigi
// FIN DE LOS AJUSTES
// =================================================
// Establecer VARIABLES POR DEFECTO (no cambiar nada)
dejar bucles = 0; // realiza un seguimiento de los bucles
let ascensionCounter = 0; // ayuda a realizar un seguimiento de cuándo comprobar las ascensiones
// Establecer rangos de ascensión predeterminados de los miembros. Los miembros se nombran 0, 1, 2, etc.
sea 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, XNUMX];
dejar volcado de longitud = 0; // Tamaño de grupo predeterminado leído del archivo cfg
let guerra = falso; // Establecer la guerra territorial en falso
// Establecer territorio pandillero predeterminado (se necesitan más variables ya que la rotación es más larga)
var gangt0 = 0; var gangt1 = 0; var gangt2 = 0; sea gangtx = 0;
sea ganginwar = 0; // Establecer contador para el número de miembros en la guerra territorial
// Deshabilitar registros
ns.disableLog(“disableLog”); ns.disableLog(“dormir”); 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”);
// Abrir la ventana de registro y mostrar el inicio del script en los registros
ns.cola();
ns.print(“🔥 INICIO DEL GUIÓN DE PANDILLA 🔥”);
// Intento de leer los rangos actuales de los pandilleros del archivo de configuración de texto
//ns.print(“Comenzando a leer el archivo txt de pandillas... “); // DEPURAR
if ( ns.fileExists(“/Temp/gang-cfg.txt”, “inicio”)){
ns.print(“INFO ## Gang txt file EXISTE ##”)
let nombres de lista = [];
var datadump = JSON.parse(ns.read(“/Temp/gang-cfg.txt”));
if (volcado de datos.longitud > 0) {
volcado de longitud = volcado de datos.longitud; // Transferir valor para verificar más tarde
for (var ij = 0; ij < volcado de datos.longitud; ij++) {
nombres de lista[ij] = volcado de datos[ij].nombre;
ascmem[ij] = volcado de datos[ij].ascmem;
ns.print(“N: “, nombres de lista[ij], ” Asc: “, ascmem[ij])
}
}
}
// Si el número de pandilleros es demasiado bajo, necesitamos restablecer el archivo de configuración
// (esto supone que en lanzamientos posteriores tendrás más de 3 personas)
// Una vez que esté en funcionamiento con más de 3 personas, esto se ignora en
// paradas y reinicios posteriores de este script.
si (longitud de volcado < 4) {
const resetconfig = esperar resetGangFile(ns);
//ns.sleep(100); // Para estar seguro, retrase un poco al escribir el archivo
ns.print ("Restableciendo archivo de grupo: ", resetconfig);
// Mientras tanto aquí en el programa, cargue las variables de reinicio en la memoria
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 ,XNUMX];
}
// #################################
// PRINCIPAL MIENTRAS COMIENZA EL BUCLE
while (verdadero) {
// Cambiar el tamaño de la ventana de registro al ancho de los puntos rojos para un ajuste perfecto
ns.imprimir(" "); // Línea en blanco para separar bucles
ns.print(“🔴🔴🔴🔴🔴🔴🔴 PANDILLA 🔴🔴🔴🔴🔴🔴🔴”);
// Obtenga información de pandillas, dinero en efectivo y nombres de equipos
let myGang = await runCom1(ns, 'ns.gang.getGangInformation()', 'getGangInfo');
let curCash=await runCom1(ns, 'ns.getServerMoneyAvailable(ns.args[0])','getSerMon', [“home”]);
let allEquipment = await runCom1(ns, 'ns.gang.getEquipmentNames()', 'getEqName');
var curResp = ns.nFormat(myGang.respect, “0,0.a”);
var curResp2 = miGang.respect;
//ns.print(“Respeto: ” + curResp2); // DEPURAR
// Reclutar miembros si es posible
var canrecruit = await runCom1(ns, 'ns.gang.canRecruitMember()', 'canRecr');
//ns.print(“INFO Puede reclutar: ” + canrecruit); // DEPURAR
while (puedereclutar == verdadero) {
para (sea ij = 0; ij < 30; ++ij) {
var canrecruit=await runCom1(ns,'ns.gang.canRecruitMember()','canRecr');
//ns.print(“INFO Puede reclutar: ” + canrecruit); // DEPURAR
if (puede reclutar == verdadero) {
ns.print(“🔴RECLUTADO: ” + ij + “🔴”);
}
}
}
// Obtener nombres de pandilleros
let miembros = await runCom1(ns, 'ns.gang.getMemberNames()','getMemNam');
// Obtenga el % de territorio y obtenga el nivel de 'buscado por encima del respeto'
var ganginfo = await runCom1(ns,'ns.gang.getGangInformation()','getGangInfo');
gangtx = ganginfo.territorio;
var curResp = ganginfo.respeto;
var curWant = ganginfo.wantedLevel;
var curPena2b = ganginfo.wantedLevel/ganginfo.respect * 100;
//ns.print(“🔴Quiero/Respeto: ” + ns.nFormat(curPena2b, “0,0.00”) +” %” );
// //Restablecer verificación de pandilleros en guerra territorial y restablecer estado de guerra
guerra de pandillas = 0;
guerra = falso;
Parte 2 del código: bucle principal
for (sea ij = 0; ij < miembros.longitud; ++ij) {
var miembro = miembros[ij];
var memberInfo = await runCom1(ns, 'ns.gang.getMemberInformation(ns.args[0])','getMemInf', [member]);// @@@@@@@@ Comprobar equipo INICIO @@@@ @@@@@@@
var gasto en efectivo = 0; // Rastree el efectivo gastado en bucle
//ns.print(“👜COMPRA: ” + comprarCosas); // DEPURAR
//ns.print(“*miembros.longitud: ” + miembros.longitud); // DEPURAR
if (comprarcosas==1) {
for (var j = 0; j < allEquipment.length; ++j) {
var equipo = todoEquipo[j];
//var eqdebug=equipo.toString(); ns.print(eqdebug); //DEPURAR
//ns.print(“Chk”,equipo,memberInfo.upgrades.indexOf(equipo));
//Arriba devuelve AWM Sniper Rifle 12, Graphene Armor -1, etc. //DEBUG
//ns.print(“Comprobando: “,equipo); // DEPURAR
//Si un chico en cierto rango y no tiene cosas NO HACKING, cómpralo
if ( (memberInfo.upgrades.indexOf(equipo) == -1) && (memberInfo.augmentations.indexOf(equipo) == -1) && ascmem[ij] >= equiprank && equipo != “NUKE Rootkit” && equipo ! = “Soulstealer Rootkit” && equipo != “Demon Rootkit” && equipo != “Hmap Node” && equipo != “Jack the Ripper” && equipo != “DataJack” && equipo != “Neuralstimulator” && equipo != “BitWire ”) {
var cost = await runCom1(ns, 'ns.gang.getEquipmentCost(ns.args[0])','getEqCost', [equipo]);
if ((coste + minCash) <curCash) {
var gangbuy = await runCom1(ns, 'ns.gang.purchaseEquipment(ns.args[0], ns.args[1])','getEqCost', [miembro, equipo]);
//ns.print(“gangbuy: ” + gangbuy); // DEPURAR
if (gangbuy == verdadero) {
cashSpen = cashSpen + costo;
ns.print(“👜: ” + equipo + ” @” + miembro);
curCash=await runCom1(ns, 'ns.getServerMoneyAvailable(ns.args[0])','getSerMon', [“home”]);
}
}
}
}
}
// @@@@@@@@@@ Comprobar equipo FIN @@@@@@@@@@@
// Obtener variables miembro
var memstr = MemberInfo.str; // Fuerza
var memdef = miembroInfo.def; // Defensa
var memdex = miembroInfo.dex; // Destreza
var memagi = miembroInfo.agi; // Agilidad
//############################################ ##############
//ASSIGN Tareas (serie de declaraciones "if else", edítelas como desee)
//█Estado buscado: si es demasiado alto, vaya vigilante para bajarlo
if (curResp>minVResp && curPena2b>minVPen && curWant>minVWant && memstr>minVRank) {
var gangtask = “Justicia Vigilante”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. r0🚶:”+miembro+” >”+gangtask.substring(0,lenCom) );
}
//█Rango 1: si el chico no está en el rango 2, entrena Combate hasta que todas las estadísticas estén en el rango 2
otra cosa si (memstr
var gangtask = “Combate de trenes”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. r1🚶:”+miembro+” >”+gangtask.substring(0,lenCom) );
}
//█Rango 3: Si está en el rango 1-4, entrena el combate hasta que las estadísticas de combate estén en el rango 4
más si ((memstr
var gangtask = “Combate de trenes”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. r2🚶:”+miembro+” >”+gangtask.substring(0,lenCom) );
}
//EJEMPLO de criterios adicionales que se pueden insertar fácilmente usando if's
//█Rank5: Train Combat hasta que las estadísticas estén en el puesto 6 y los miembros del 3 al 11
/* else if ((memstr 5 && miembros.longitud < 5 && maxrank == 5 ){
var gangtask = “Combate de trenes”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(ij +”. r3🚶:” + miembro + ” >” + gangtask.substring(0,lenCom) );
} */
//█Terrorismo: hazlo hasta que el respeto alcance los 10 millones (para uso de ascensión)
si no (curResp2 < 10111222) {
var gangtask = “Terrorismo”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. r3🚶:”+miembro+” >”+gangtask.substring(0,lenCom) );
}
//█GUERRA DE TERRORIDAD: Establezca la tarea si el tipo está por encima del rango 2, los miembros son al menos 9,
// es parte del equipo de guerra (warguys) y territorio < 100% conquistado (gangtx)
else if(ascmem[ij]>2 && miembros.longitud>9 && (ij>=0 && ij
ganginwar = ganginwar + 1; // Contador de incrementos para bandas en guerra
var gangtask = “Guerra territorial”;
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
//ns.print(“DEBUG Territorio Gangtx = “+ gangtx ); // DEPURAR
//ns.print(“DEBUG ganginwar = “+ ganginwar ); // DEPURAR
ns.print(“📱”+ij +”. 🚶:”+miembro+” > “+gangtask.substring(0,lenCom) );
//Comprobar las posibilidades de guerra contra los clanes
const dowewar=esperar checkgangwar(ns, warchance);//función Warcheck
si (dowewar == verdadero) {
guerra = verdadero;
await runCom1(ns, 'ns.gang.setTerritoryWarfare(ns.args[0])','setWar', [true]);
//ns.print(“WARN Estado de guerra cambiado: “+ guerra); //DEPURAR
} Else {
await runCom1(ns, 'ns.gang.setTerritoryWarfare(ns.args[0])','setWar', [false]);
}
}
//█Tráfico/Armas Ilegales: (¡acciones para ganar dinero aquí!)
//Si tenemos suficiente respeto, haga la tarea de recolectar dinero
si no (curResp2 > 10111222) {
var gangtask = “Tráfico de armas ilegales”;
//var gangtask = “Trata de personas”; // Cambia a esto si lo deseas
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. r4🚶:”+miembro+” > “+gangtask.substring(0,lenCom) );
}
//█DEFAULT: si todo lo anterior falla, configura al chico a la tarea predeterminada
else {
var gangtarea = tarea predeterminada; // tarea por defecto
await runCom1(ns,'ns.gang.setMemberTask(ns.args[0], ns.args[1])','setGnTask', [miembro, gangtask]);
ns.print(“📱”+ij +”. 🚶:”+miembro+” > “+gangtask.substring(0,lenCom) );
}
// Imprimir estadísticas y rango (icono de cerebro) del miembro
// Establecer una longitud fija de 5 parece más agradable ya que los 0 iniciales facilitan la comparación
var mstr = ns.nFormat(memstr, “00000”); // 💪 Fuerza (icono de músculo)
var mdef = ns.nFormat(memdef, “00000”); // 🦴 Defensa (emoji de hueso)
var mdex = ns.nFormat(memdex, “00000”); // 👀 Destreza (emoji de ojos)
var magos = ns.nFormat(memagi, “00000”); // 🦶 Agilidad (icono de pies)
ns.print(” 💪”+mstr+” 🦴”+mdef+” 👀”+mdex+” 🦶”+magi+” 🧠” +ascmem[ij]);
}
// ###### PRINCIPAL PARA FINAL DEL BUCLE #####
Código Parte 3: Ascensión + Misc
if (ascensionCounter != 50) { ascend = true } // Comprobar cada 50 bucles//Tenga en cuenta que debemos comprobar las clasificaciones actuales (ascmem[ij]) cada vez
//para no encontrar duplicaciones en los conjuntos de reglas
si (ascender == verdadero) {
for (sea ij = 0; ij < miembros.longitud; ++ij) {
let miembro = miembros[ij];
//// Obtener estadísticas de miembros nuevamente
var memberInfo = await runCom1(ns, 'ns.gang.getMemberInformation(ns.args[0])','getMemInf', [member]);
var memstr = MemberInfo.str; var memdef = miembroInfo.def;
var memdex = miembroInfo.dex; var memagi = miembroInfo.agi;
/*
//█ Asciende al rango 8 [EJEMPLO DE Regla de Ascensión Personalizada]
if (memstr>=rnk8 && ascmem[ij]==7 && maxrank >= 8 ){
ns.gang.ascendMember(miembro);
ns.print(“🌟Rango 4>5, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 5; // Establecer rango de estado de ascensión a 5
}
*/
//█ Asciende al rango 7
if (memstr>=rnk7 && ascmem[ij]==6 && maxrank >=7 ){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 6>7, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 7; // Establecer rango de estado de ascensión a 5
}
//█ Asciende al rango 6
if (memstr>=rnk6 && ascmem[ij]==5 && maxrank >=6 ){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 5>6, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 6; // Establecer rango de estado de ascensión a 4
//contarrango2 = contarrango2 + 1;
}
//█ Asciende al rango 5
if (memstr>=rnk5 && ascmem[ij]==4 && maxrank >=5 ){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 4>5, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 5; // Establecer rango de estado de ascensión a 3
}
//█ Asciende al rango 4
else if (memstr>=rnk4 && ascmem[ij]==3 && maxrank >= 4 ){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 3>4, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 4; // Establecer rango de estado de ascensión a 4
}
//█ Asciende al rango 3 para aumentar XP en camino al rango 4, aproximadamente 25 minutos
else if (memstr>=rnk3 && memagi>=rnk3 && ascmem[ij]==2){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 2>3, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 3; // Establecer rango de estado de ascensión a 3
}
//█ Asciende al rango 2
else if(memstr>=rnk2 && memagi>=rnk2 && ascmem[ij]==1) {
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 1>2, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 2; // Establecer rango de estado de ascensión a 2
}
//█ Ascienda al rango 1 antes de tiempo para 'aumentar' la ganancia de XP, aproximadamente 25 minutos
else if (memstr>=rnk1 && memagi>=rnk1 && ascmem[ij]==0){
await runCom1(ns,'ns.gang.ascendMember(ns.args[0])','ascMem', [miembro]);
ns.print(“🌟Rango 0>1, ” + miembro + ” ascendido! 🌟”);
ascmem[ij] = 1; // Establecer rango de estado de ascensión a 1
}
}
}
// @@@@@@@@@ FIN DE LA SECCIÓN ASCENDENTE @@@@@@@@
bucles++; // Incrementa el contador de bucles
// #### COMENZAR Escribir el estado en el archivo txt ####
var cadena de texto = “[“;
letmembers3 = await runCom1(ns, 'ns.gang.getMemberNames()','getMemNam');
for (sea ij = 0; ij < miembros3.longitud; ++ij) {
var miembro = miembros3[ij];
var myGang2 = await runCom1(ns, 'ns.gang.getMemberInformation(ns.args[0])','getMemInf', [miembro]);
cadena de texto = cadena de texto + '{\”nombre\”:\”' + miGang2.nombre + '\”, ';
txtstring = txtstring + '\”ascmem\”:' + ascmem[ij] + '}';
if (ij!=miembros3.longitud-1) {txtstring = txtstring + ','}
}
cadena de texto = cadena de texto + ']';
var filewrite = await ns.write(“/Temp/gang-cfg.txt”, txtstring, “w”);
// #### FIN Escribe el estado en el archivo txt ####
// MOSTRAR ESTADO
var dinero = ns.nFormat(curCash, “0,0.0a”); //Dinero en mano: 💰Cur
var minCash2 = ns.nFormat(minCash, “0,0.0a”); //Nivel mínimo de efectivo: 💰Min
var getGang = await runCom1(ns, 'ns.gang.getGangInformation()', 'getGangInfo');
var curResp = ns.nFormat(getGang.respect, “0,0.0a”); // Respeto: 🩸Res
var curWant =ns.nFormat(getGang.wantedLevel, “0,0.0a”);//Nivel buscado: 🔥W
var curPena =ns.nFormat(myGang.wantedPenalty,”0.00a”);//Nivel de penalización: W
var curPenaRatio =getGang.wantedLevel/getGang.respect *100;//Ratio de penalización
var curPenaRatio2 = ns.nFormat(curPenaRatio, “0.00a”); //Mejor formato
gangt2 = gangt1; gangt1 = gangt0; gangt0 = gangtx;//Añadir historial de territorio
gangtx = getGang.territorio; // Obtener el historial del territorio actual
gangt2 = ns.nFormat(gangt2, “0.00%”); // Convertir a porcentaje
gangtx = ns.nFormat(gangtx, “0.00%”); // Convertir a porcentaje
ns.print(“#: “+loops+” 👜:” +buyStuff+” 👜:$” +cashSpen+” 💰Cur $” +dinero);
ns.print(“💰Min: $” + minCash2 +” 🩸Res: ” +curResp + ” 🔥W: ” +curWant);
ns.print(“W Pen:” +curPena +”%” +” Wan/Resp:” +curPenaRatio2 +”%”);
ns.print(“🗡🗡:”+warfare+” ✊🗡:”+warguys +” 🥥: “+gangt2 +” > “+ gangtx);
ns.print(“🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴”);//Pie de página inferior
esperar dormir (retraso del sueño);
// Verifique si la pandilla es solo 3 chicos + clasificado demasiado alto, luego reinicie el archivo de configuración
// Esto detecta un error si el script de pandilla falla/finaliza por alguna razón
if (miembros3.longitud < 4 && ascmem[0]>2 && ascmem[1]>2 && ascmem[2]>2) {
const resetconfig = esperar resetGangFile(ns);
ns.print ("Restableciendo archivo de grupo: ", 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 ,XNUMX];
}
}
// PRINCIPAL MIENTRAS FINAL DEL BUCLE
// #################################
}
Código Parte 4: Funciones
función dormir (ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}// Función: Comprueba las posibilidades de guerra contra otras bandas
exportar función asíncrona checkgangwar(ns, winchance) {
var gangresult = verdadero; // Por defecto, PODEMOS participar en la guerra
// Nombres de pandillas para referencia:
// Tétradas, El Sindicato, Portavoces de los Muertos
// La Mano Negra, El Ejército Oscuro, NiteSec
//const othergang = ns.gang.getOtherGangInformation(); // DEPURAR
//ns.print(“Nombre: “+JSON.stringify(othergang['Tetrads']) ); //DEPURAR
//ns.print(“Power: “+JSON.stringify(othergang['Tetrads'].power) ); //DEPURAR
//ns.print(“Terro: “+JSON.stringify(otrabanda['Tetrads'].territorio));//DEB
//ns.print(“Clash: “+ns.gang.getChanceToWinClash('Tetrads') ); //DEPURAR
// Obtenga oportunidades de ganar guerras para todas las demás bandas:
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%”)); //DEPURAR
//ns.print(“Sindicar %: ” + ns.nFormat(chansynd, “0.00%”)); //DEPURAR
//ns.print(“Hablantes %: ” + ns.nFormat(chanspea, “0.00%”)); //DEPURAR
//ns.print(“Mano negra%: ” + ns.nFormat(chanblac, “0.00%”)); //DEPURAR
//ns.print(“Ejército oscuro %: ” + ns.nFormat(chadark, “0.00%”)); //DEPURAR
//ns.print(“NiteSec %: ” + ns.nFormat(channite, “0.00%”)); //DEPURAR
// Verifique que las posibilidades sean buenas para la guerra, si no, no participe
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 ); //DEPURAR
if (gangresult == verdadero) { return verdadero; }
if (gangresult == false) { return false; }
}
// Función: Restablecer archivo de grupo
// El contenido del nuevo archivo gang-cfg.txt predeterminado es el siguiente:
// [{“name”:”0″,”ascmem”:0},{“name”:”1″,”ascmem”:0},{“name”:”2″,”ascmem”:0}]
función resetGangFile(ns) {
ns.print(“ADVERTENCIA Escribiendo nuevo archivo de configuración de grupo…”);
const cfgScriptContent = “[{\”nombre\”:\”0\”, \”ascmem\”:0},{\”nombre\”:\”1\”, \”ascmem\”:0},{ \”nombre\”:\”2\”, \”ascmem\”:0}]”;
const cfgScript = “/Temp/gang-cfg.txt”;
ns.write(cfgScript, cfgScriptContent, “w”);
return true;
}
//================================================ =============================
// SCRIPT RUNNER START externo (adaptado/acortado de los scripts de ALAIN BRYDEN)
exportar función asíncrona runCom1 (ns, comando, nombre de archivo, args = []) {
var precursor = “gang5-“; // Podría ser gang-, blade-, etc.
var nombre de archivo = “/Temp/” + precursor + nombre de archivo + “.txt”;
var nombre_archivo2 = nombre_archivo + “.js”;
//ns.print ("fileName = ", fileName) // DEBUG
//ns.print ("fileName2 = ", fileName2) // DEPURAR
// GUIÓN COMPLEJO
let script = `exportar función asíncrona main(ns) {` +
`dejar r;probar{r=JSON.stringify(\n` +
` ${comando}\n` +
`);}catch(e){r=”ERROR: “+(tipo de e=='cadena'?e:e.mensaje||JSON.stringify(e));}\n` +
`const f=”${nombreArchivo}”; if(ns.read(f)!==r) await ns.write(f,r,'w') } `;
var contenido antiguo = ns.read(fileName2);
while (contenidoantiguo!= script) {
esperar ns.write(fileName2, script, “w”);
// Espere a que el script parezca legible (puede ser complicado al escribir)
var contenido antiguo = ns.read(fileName2);
}
//ns.print (“argumentos = “, argumentos) // DEPURAR
for (var ij = 0; ij < 5; ij++) { if (args[ij] == null) args[ij] = “0”;
//ns.print (“argumentos[“,ij,”] = “, argumentos[ij]) // DEPURAR
};
// ¡Ejecuta el guión!
await ns.exec(fileName2,”home”,1,args[0],args[1],args[2],args[3]);
//esperar ns.sleep(50);
// 'Intentamos' detectar errores JSON (desaparecen después de 1-2 bucles)
const fileData = await ns.read(fileName);
tratar {
var fileData2 = JSON.parse(fileData);
} captura (e) {
console.log('No se pudo analizar la cadena.')
}
devolver archivoDatos2;
}
// EXTERNO SCRIPT RUNNER END
//================================================ =============================
//Fin de la línea
Conclusión
Iré actualizando este script a medida que pase el tiempo. Ya he recibido algunos comentarios de que algunas cosas pueden no ser óptimas. ¡Siéntase libre de comentar y canibalizar el código para sus propios scripts y funciones!
¡Saludos y espero que te ayude (en cualquier forma)!
Eso es todo lo que estamos compartiendo hoy para este Quemador de bits guía. Esta guía fue originalmente creada y escrita por troff. En caso de que no actualicemos esta guía, puede encontrar la última actualización siguiendo este liga.