import { GetFlag, GetArg } from "gang/argFunctions.js"; function getRandomInt(max) { return Math.floor(Math.random() * Math.floor(max)); } // 30 possible gang members // create list of names let memberNamePool = [ "Thor", // 1 "Iron Man", // 2 "Starlord", // 3 "Thanos", // 4 "Groot", // 5 "Ant-Man", // 6 "Wasp", // 7 "Spiderman", // 8 "Loki", // 9 "Gamora", // 10 "Rocket Raccoon", // 11 "T'Challa", // 12 "Vision", // 13 "Scarlet Witch", // 14 "Winter Soldier", // 15 "Black Widow", // 16 "Hulk", // 17 "Bruce Banner", // 18 "Hawkeye", // 19 "Captain Marvel", // 20 "War Machine", // 21 "Nick Fury", // 22 "Nebula", // 23 "Drax", // 24 "Deadpool", // 25 "Cable", // 26 "Quicksilver", // 27 "Wolverine", // 28 "Adam Warlock", // 29 "Yondu", // 30 ]; export async function main(ns) { var buyAll = GetFlag(ns, "--buyAll"); var buyEquip = buyAll || GetFlag(ns, "--buyEquip"); var buyWeapon = buyAll || buyEquip || GetFlag(ns, "--buyWeapon"); var buyArmor = buyAll || buyEquip || GetFlag(ns, "--buyArmor"); var buyVehicle = buyAll || buyEquip || GetFlag(ns, "--buyVehicle"); var buyRoot = buyAll || buyEquip || GetFlag(ns, "--buyRoot"); var buyAug = buyAll || GetFlag(ns, "--buyAug"); var myGang = ns.gang.getGangInformation(); var possibleTasks = ns.gang.getTaskNames(); var unassignedTask = possibleTasks.shift(); var territoryTask = possibleTasks.pop(); var trainingTasks = possibleTasks.splice(possibleTasks.length - 3, 3); var wantedLevelLowerTask = possibleTasks.pop(); var desirableAugs = []; if (myGang.isHacking) { wantedLevelLowerTask = possibleTasks.pop(); // replace combat with hacking trainingTasks.splice(0, 1, trainingTasks[1]); desirableAugs.push("BitWire"); desirableAugs.push("Neuralstimulator"); desirableAugs.push("DataJack"); } else { // replace hacking with combat trainingTasks.splice(1, 1, trainingTasks[0]); desirableAugs.push("Bionic Arms"); desirableAugs.push("Bionic Legs"); desirableAugs.push("Bionic Spine"); desirableAugs.push("BrachiBlades"); desirableAugs.push("Nanofiber Weave"); desirableAugs.push("Synthetic Heart"); desirableAugs.push("Synfibril Muscle"); desirableAugs.push("Graphene Bone Lacings"); } var ascensionCycles = GetArg(ns, "--asc", 600000); var nextAscensionAttempt = 0; var cycleMs = 1100; var ascensionMultLimit = GetArg(ns, "--alim", 2); while (true) { myGang = ns.gang.getGangInformation(); var otherGangs = ns.gang.getOtherGangInformation(); var buyableEquipment = ns.gang.getEquipmentNames().filter(e => { return ns.gang.getEquipmentType(e) != "Augmentation" || desirableAugs.includes(e); }); var members = ns.gang.getMemberNames(); while (ns.gang.canRecruitMember()) { var possibleNames = memberNamePool.filter(name => !members.includes(name)); var toRecruit = possibleNames[getRandomInt(possibleNames.length)]; ns.gang.recruitMember(toRecruit); await ns.sleep(1); } members = ns.gang.getMemberNames(); var memInfo = null; members.sort((a, b) => { return Math.random() * 2 - 1; }); members.forEach((m) => { var didBuy = false; var hadAll = true; memInfo = ns.gang.getMemberInformation(m); ns.gang.setMemberTask(m, unassignedTask); buyableEquipment.forEach((e) => { if (memInfo.equipment.includes(e)) return; if (memInfo.augmentations.includes(e)) return; hadAll = false; var type = ns.gang.getEquipmentType(e); switch (type) { case "Weapon": if (buyWeapon) { didBuy |= ns.gang.purchaseEquipment(m, e); } break; case "Armor": if (buyArmor) { didBuy |= ns.gang.purchaseEquipment(m, e); } break; case "Vehicle": if (buyVehicle) { didBuy |= ns.gang.purchaseEquipment(m, e); } break; case "Rootkit": if (buyRoot) { didBuy |= ns.gang.purchaseEquipment(m, e); } break; case "Augmentation": if (buyAug) { didBuy |= ns.gang.purchaseEquipment(m, e); } break; default: break; } }); var wantsToAscend = hadAll; if (myGang.isHacking) { wantsToAscend &= memInfo.hackingAscensionMult < ascensionMultLimit; } else { wantsToAscend &= memInfo.hackingAscensionMult < ascensionMultLimit; wantsToAscend &= memInfo.strengthAscensionMult < ascensionMultLimit; wantsToAscend &= memInfo.agilityAscensionMult < ascensionMultLimit; wantsToAscend &= memInfo.dexterityAscensionMult < ascensionMultLimit; } if (wantsToAscend && nextAscensionAttempt <= 0) { ns.gang.ascendMember(m); } }); if (nextAscensionAttempt <= 0) { nextAscensionAttempt = ascensionCycles; } var member = ""; if (!myGang.isHacking) { var memCount = members.length; while (members.length > (memCount / 2)) { member = members.pop(); ns.gang.setMemberTask(member, territoryTask); } } while (members.length > 0) { var task = ""; member = members.pop(); memInfo = ns.gang.getMemberInformation(member); var statsTarget = 50; if ((myGang.isHacking && memInfo.hacking < statsTarget) || (!myGang.isHacking && memInfo.strength < statsTarget && memInfo.agility < statsTarget && memInfo.charisma < statsTarget && memInfo.defense < statsTarget)) { task = trainingTasks[getRandomInt(trainingTasks.length)]; } else if (myGang.wantedLevel > 1) { task = wantedLevelLowerTask; } else { if (Math.random() > 0.25) { task = possibleTasks[possibleTasks.length - getRandomInt(2) - 1]; } else { task = trainingTasks[getRandomInt(trainingTasks.length)]; } } ns.gang.setMemberTask(member, task); } await ns.sleep(cycleMs); nextAscensionAttempt -= cycleMs; } }