이 스크립트를 사용하면 전투 갱단을 자동으로 관리할 수 있습니다.
상품 설명
이 스크립트를 사용하면 전투 갱단을 자동으로 관리할 수 있습니다.
32Gb 미만이 소요되므로 RAM 업그레이드 없이 집에서 시작할 수 있습니다.
BN2 노드를 획득하는 데 하루도 채 걸리지 않습니다.
그것은 손으로 조정할 수 있는 많은 상수를 가지고 있습니다.
갱 멤버 작업은 수동으로 전환할 수 있으며 스크립트는 이를 감지하고 다른 사람이 작업을 전환한 경우 다시 자동 전환하지 않습니다("할당되지 않음" 작업을 설정하거나 스크립트를 다시 시작하면 자동으로 다시 되돌릴 수 있음).
승천, 장비 및 영토 전쟁도 스크립트에서 관리합니다.
예, 코딩 스타일이 좋지 않습니다. "빠른 개발"입니다.
32Gb 미만이 소요되므로 RAM 업그레이드 없이 집에서 시작할 수 있습니다.
BN2 노드를 획득하는 데 하루도 채 걸리지 않습니다.
그것은 손으로 조정할 수 있는 많은 상수를 가지고 있습니다.
갱 멤버 작업은 수동으로 전환할 수 있으며 스크립트는 이를 감지하고 다른 사람이 작업을 전환한 경우 다시 자동 전환하지 않습니다("할당되지 않음" 작업을 설정하거나 스크립트를 다시 시작하면 자동으로 다시 되돌릴 수 있음).
승천, 장비 및 영토 전쟁도 스크립트에서 관리합니다.
예, 코딩 스타일이 좋지 않습니다. "빠른 개발"입니다.
코드
/* (do not copy this comment, it's a disclaimer for Russian laws only) * Перечисленная ниже деятельность запрещена на территории РФ и осуждается автором данного руководства. Данное руководство не имеет ничего общего с реальной жизнью, все выполняемые в нём действия влияют только на цифры в видеоигре и являются исключительно художественным вымыслом. */ const TASK_TRAIN = "Train Combat"; const TASK_VIGI = "Vigilante Justice"; const TASK_NOOB = String.fromCharCode(77) + "ug People"; const TASK_RESPECT = String.fromCharCode(84) + "errorism"; const TASK_MONEY = "Human " + String.fromCharCode(84) + "rafficking"; const TASK_WARFARE = "Territory Warfare"; const TASK_NULL = "Unassigned"; const TASK_MANUAL = "Manual/NotReallyTaskName"; const ASCEND_ON_MPL = 10; const EQUIP_AFFORD_COEFF = 100; const STATS_TRESHOLD = 0.7; const STATS_MIN = 4000; const STATS_HARD_MIN = 200; const TRAIN_CHANCE = 0.2; const RESPECT_MIN = 2e+6; const WANTED_PENALTY_TRESHOLD = 0.99; const WARFARE_TRESHOLD = 2; const MEMBERS_MIN = 6; const MEMBERS_MAX = 12; const SLEEP_TIME = 10000; /** @param {NS} ns **/ export async function main(ns) { const gang = ns.gang; // Get weighted stats sum (at this moment, sum of combat stats in eq proportions) function getStatsSum(member) { const info = gang.getMemberInformation(member); return info.str + info.def + info.dex + info.agi; } // Find the best gang power except our gang function maxEnemyPower(myGang) { const others = ns.gang.getOtherGangInformation(); let maxPower = 0; for (let name in others) { if (name === myGang.faction) continue; maxPower = Math.max(maxPower, others[name].power); } return maxPower; } // Set a task or not to set (if manually overridden) const autoTasks = {} function setAutoTask(member, task) { const info = gang.getMemberInformation(member); const lastTask = info.task; // Manual task: stored task mismatches real task and not unassigned if (lastTask !== TASK_NULL && autoTasks.hasOwnProperty(member) && autoTasks[member] !== lastTask) { autoTasks[member] = TASK_MANUAL; return; } // Automatic task: set it if differs from real one autoTasks[member] = task; if (lastTask !== task) { gang.setMemberTask(member, task); } } // The script accepts argument for default task override (optional) let defaultTask = null; if (ns.args[0] && gang.getTaskNames().includes(ns.args[0])) { defaultTask = ns.args[0]; } // Main loop for (;;) { // Recruit any member possible while (gang.canRecruitMember()) gang.recruitMember('member' + gang.getMemberNames().length); let bestStats = STATS_MIN / STATS_TRESHOLD; // minimum const members = gang.getMemberNames(); const info = gang.getGangInformation(); // Ascend if good enough for (let member of members) { const r = gang.getAscensionResult(member); if (!r) continue; const mpl = r.agi * r.def * r.dex * r.str; if (mpl > ASCEND_ON_MPL) { gang.ascendMember(member); ns.tprint(`Member ${member} ascended!`); } } // Purchase equipment const allEquip = gang.getEquipmentNames(); let money = ns.getServerMoneyAvailable('home'); for (let equip of allEquip) { const cost = gang.getEquipmentCost(equip); const amount = money/cost; if (amount < EQUIP_AFFORD_COEFF) continue; for (let member of members) { const info = gang.getMemberInformation(member); if (info.upgrades.includes(equip) || info.augmentations.includes(equip)) continue; if (gang.purchaseEquipment(member, equip)) { money -= cost; } } } // Find best stats for (let member of members) { let sum = getStatsSum(member); if (sum > bestStats) bestStats = sum; } // Check if we are powerful enough let powerfulEnough = info.power >= maxEnemyPower(info) * WARFARE_TRESHOLD; gang.setTerritoryWarfare(powerfulEnough); // Choose the default task for members let task = defaultTask; if (!defaultTask) { // If gang isn't full - gain respect if (members.length < MEMBERS_MAX) { task = (members.length < MEMBERS_MIN) ? TASK_NOOB : TASK_RESPECT; } else { // if respect too low - gain it first, power second, money last if (info.respect < RESPECT_MIN) { task = TASK_RESPECT; } else if (!powerfulEnough) { task = TASK_WARFARE; } else { task = TASK_MONEY; } } } // Assign tasks for (let member of members) { let sum = getStatsSum(member); // Train members, not acceptable in 'noob mode' if (sum < STATS_HARD_MIN || (members.length >= MEMBERS_MIN && sum < bestStats * STATS_TRESHOLD)) { setAutoTask(member, TASK_TRAIN); continue; } // Vigi if wanted penalty too large if (info.wantedLevel > 2 && info.wantedPenalty < WANTED_PENALTY_TRESHOLD) { setAutoTask(member, TASK_VIGI); continue; } // Do the default task (autoselected or called with args[0]) setAutoTask(member, Math.random() < TRAIN_CHANCE ? TASK_TRAIN : task); } await ns.sleep(SLEEP_TIME); } }
By 쇼갈
더 많은 가이드:
- Bitburner: Hacknet 노드 자동화
- Bitburner: HUD에 사용자 지정 통계를 추가하는 방법(헤드업 디스플레이)
- Bitburner: 초기 Hacknet 자동 관리 스크립트
- Bitburner: DevMenu 성취 가이드
- Bitburner: 초기 게임 가이드(스포일러 없음)
안녕하세요, 스크립트 주셔서 감사합니다.
실행할 때 다음 오류가 발생합니다.
런타임 에러
Gang.ns@home
멤버가 정의되지 않았습니다
스택:
ReferenceError: 멤버가 정의되지 않았습니다.
Module.main에서 (gang.ns:121:16)
at executeJSScript (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/main.bundle.js:19:83091)
"회원"을 선언하는 방법?
친절 감사합니다
} // Vigi 페널티가 너무 큰 경우(info.wantedLevel > 2 &&
이 줄에서 수정하려면 주석을 제거하십시오.
"// 원하는 경우 페널티가 너무 큰 경우 Vigi "