From 2613948bad9f92f6354f2a7dec4057b7ee285005 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:40:59 -0400 Subject: [PATCH 01/17] Add bladeburner actions to sleeves This adds bladeburner actions to sleeves. In addition this bulked out the IPerson functionality and updated bladeburner functions to be more sleeve compatible --- package-lock.json | 4 +- src/Bladeburner/Action.tsx | 21 +- src/Bladeburner/Bladeburner.tsx | 298 ++++++++++-------- src/Bladeburner/IAction.tsx | 9 +- src/Bladeburner/IBladeburner.ts | 23 +- src/Bladeburner/ui/BlackOpElem.tsx | 2 +- src/Bladeburner/ui/ContractElem.tsx | 2 +- src/Bladeburner/ui/OperationElem.tsx | 2 +- src/Bladeburner/ui/SuccessChance.tsx | 3 +- src/Crime/Crime.ts | 4 +- src/Hospital/Hospital.ts | 6 +- src/NetscriptFunctions/Bladeburner.ts | 18 +- src/PersonObjects/IPerson.ts | 64 ++++ src/PersonObjects/IPlayer.ts | 15 +- src/PersonObjects/IPlayerOrSleeve.ts | 26 -- src/PersonObjects/ITaskTracker.ts | 25 ++ src/PersonObjects/Person.ts | 64 ++-- src/PersonObjects/Player/PlayerObject.ts | 6 + .../Player/PlayerObjectGeneralMethods.tsx | 30 +- src/PersonObjects/Sleeve/Sleeve.ts | 272 ++++++++++++++-- .../Sleeve/SleeveTaskTypesEnum.ts | 1 + src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 18 +- src/PersonObjects/Sleeve/ui/TaskSelector.tsx | 40 +++ src/PersonObjects/Sleeve/ui/TravelModal.tsx | 2 +- 24 files changed, 687 insertions(+), 268 deletions(-) create mode 100644 src/PersonObjects/IPerson.ts delete mode 100644 src/PersonObjects/IPlayerOrSleeve.ts create mode 100644 src/PersonObjects/ITaskTracker.ts diff --git a/package-lock.json b/package-lock.json index b7c794026..79a902002 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitburner", - "version": "1.5.0", + "version": "1.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitburner", - "version": "1.5.0", + "version": "1.6.0", "hasInstallScript": true, "license": "SEE LICENSE IN license.txt", "dependencies": { diff --git a/src/Bladeburner/Action.tsx b/src/Bladeburner/Action.tsx index c166ef567..b05eac04d 100644 --- a/src/Bladeburner/Action.tsx +++ b/src/Bladeburner/Action.tsx @@ -5,6 +5,7 @@ import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver" import { BladeburnerConstants } from "./data/Constants"; import { IBladeburner } from "./IBladeburner"; import { IAction, ISuccessChanceParams } from "./IAction"; +import { IPerson } from "../PersonObjects/IPerson"; class StatsMultiplier { [key: string]: number; @@ -154,8 +155,8 @@ export class Action implements IAction { * Tests for success. Should be called when an action has completed * @param inst {Bladeburner} - Bladeburner instance */ - attempt(inst: IBladeburner): boolean { - return Math.random() < this.getSuccessChance(inst); + attempt(inst: IBladeburner, person: IPerson): boolean { + return Math.random() < this.getSuccessChance(inst, person); } // To be implemented by subtypes @@ -163,13 +164,13 @@ export class Action implements IAction { return 1; } - getActionTime(inst: IBladeburner): number { + getActionTime(inst: IBladeburner, person: IPerson): number { const difficulty = this.getDifficulty(); let baseTime = difficulty / BladeburnerConstants.DifficultyToTimeFactor; const skillFac = inst.skillMultipliers.actionTime; // Always < 1 - const effAgility = Player.agility * inst.skillMultipliers.effAgi; - const effDexterity = Player.dexterity * inst.skillMultipliers.effDex; + const effAgility = person.agility * inst.skillMultipliers.effAgi; + const effDexterity = person.dexterity * inst.skillMultipliers.effDex; const statFac = 0.5 * (Math.pow(effAgility, BladeburnerConstants.EffAgiExponentialFactor) + @@ -213,12 +214,12 @@ export class Action implements IAction { return 1; } - getEstSuccessChance(inst: IBladeburner): [number, number] { + getEstSuccessChance(inst: IBladeburner, person: IPerson): [number, number] { function clamp(x: number): number { return Math.max(0, Math.min(x, 1)); } - const est = this.getSuccessChance(inst, { est: true }); - const real = this.getSuccessChance(inst); + const est = this.getSuccessChance(inst, person, { est: true }); + const real = this.getSuccessChance(inst, person); const diff = Math.abs(real - est); let low = real - diff; let high = real + diff; @@ -234,7 +235,7 @@ export class Action implements IAction { * @params - options: * est (bool): Get success chance estimate instead of real success chance */ - getSuccessChance(inst: IBladeburner, params: ISuccessChanceParams = { est: false }): number { + getSuccessChance(inst: IBladeburner, person: IPerson, params: ISuccessChanceParams = { est: false }): number { if (inst == null) { throw new Error("Invalid Bladeburner instance passed into Action.getSuccessChance"); } @@ -242,7 +243,7 @@ export class Action implements IAction { let competence = 0; for (const stat of Object.keys(this.weights)) { if (this.weights.hasOwnProperty(stat)) { - const playerStatLvl = Player.queryStatFromString(stat); + const playerStatLvl = person.queryStatFromString(stat); const key = "eff" + stat.charAt(0).toUpperCase() + stat.slice(1); let effMultiplier = inst.skillMultipliers[key]; if (effMultiplier == null) { diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 11ebf3122..7dee7aae3 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -15,6 +15,8 @@ import { Skill } from "./Skill"; import { City } from "./City"; import { IAction } from "./IAction"; import { IPlayer } from "../PersonObjects/IPlayer"; +import { createTaskTracker, ITaskTracker } from "../PersonObjects/ITaskTracker"; +import { IPerson } from "../PersonObjects/IPerson"; import { IRouter, Page } from "../ui/Router"; import { ConsoleHelpText } from "./data/Help"; import { exceptionAlert } from "../utils/helpers/exceptionAlert"; @@ -36,6 +38,7 @@ import { WorkerScript } from "../Netscript/WorkerScript"; import { FactionNames } from "../Faction/data/FactionNames"; import { BlackOperationNames } from "./data/BlackOperationNames"; import { KEY } from "../utils/helpers/keyCodes"; +import { Player } from "src/Player"; interface BlackOpsAttempt { error?: string; @@ -53,6 +56,7 @@ export class Bladeburner implements IBladeburner { totalSkillPoints = 0; teamSize = 0; + sleeveSize = 0; teamLost = 0; hpLost = 0; @@ -159,7 +163,7 @@ export class Bladeburner implements IBladeburner { return { isAvailable: true, action }; } - startAction(player: IPlayer, actionId: IActionIdentifier): void { + startAction(person: IPerson, actionId: IActionIdentifier): void { if (actionId == null) return; this.action = actionId; this.actionTimeCurrent = 0; @@ -176,7 +180,7 @@ export class Bladeburner implements IBladeburner { if (action.count < 1) { return this.resetAction(); } - this.actionTimeToComplete = action.getActionTime(this); + this.actionTimeToComplete = action.getActionTime(this, person); } catch (e: any) { exceptionAlert(e); } @@ -193,7 +197,7 @@ export class Bladeburner implements IBladeburner { if (actionId.name === "Raid" && this.getCurrentCity().comms === 0) { return this.resetAction(); } - this.actionTimeToComplete = action.getActionTime(this); + this.actionTimeToComplete = action.getActionTime(this, person); } catch (e: any) { exceptionAlert(e); } @@ -211,14 +215,14 @@ export class Bladeburner implements IBladeburner { if (testBlackOp.action === undefined) { throw new Error("action should not be null"); } - this.actionTimeToComplete = testBlackOp.action.getActionTime(this); + this.actionTimeToComplete = testBlackOp.action.getActionTime(this, person); } catch (e: any) { exceptionAlert(e); } break; } case ActionTypes["Recruitment"]: - this.actionTimeToComplete = this.getRecruitmentTime(player); + this.actionTimeToComplete = this.getRecruitmentTime(person); break; case ActionTypes["Training"]: case ActionTypes["FieldAnalysis"]: @@ -997,11 +1001,11 @@ export class Bladeburner implements IBladeburner { } /** - * Process stat gains from Contracts, Operations, and Black Operations + * Return stat to be gained from Contracts, Operations, and Black Operations * @param action(Action obj) - Derived action class * @param success(bool) - Whether action was successful */ - gainActionStats(player: IPlayer, action: IAction, success: boolean): void { + getActionStats(action: IAction, success: boolean): ITaskTracker { const difficulty = action.getDifficulty(); /** @@ -1018,34 +1022,48 @@ export class Bladeburner implements IBladeburner { const unweightedGain = time * BladeburnerConstants.BaseStatGain * successMult * difficultyMult; const unweightedIntGain = time * BladeburnerConstants.BaseIntGain * successMult * difficultyMult; const skillMult = this.skillMultipliers.expGain; - player.gainHackingExp(unweightedGain * action.weights.hack * player.hacking_exp_mult * skillMult); - player.gainStrengthExp(unweightedGain * action.weights.str * player.strength_exp_mult * skillMult); - player.gainDefenseExp(unweightedGain * action.weights.def * player.defense_exp_mult * skillMult); - player.gainDexterityExp(unweightedGain * action.weights.dex * player.dexterity_exp_mult * skillMult); - player.gainAgilityExp(unweightedGain * action.weights.agi * player.agility_exp_mult * skillMult); - player.gainCharismaExp(unweightedGain * action.weights.cha * player.charisma_exp_mult * skillMult); - player.gainIntelligenceExp(unweightedIntGain * action.weights.int * skillMult); + + return { + hack: unweightedGain * action.weights.hack * skillMult, + str: unweightedGain * action.weights.str * skillMult, + def: unweightedGain * action.weights.def * skillMult, + dex: unweightedGain * action.weights.dex * skillMult, + agi: unweightedGain * action.weights.agi * skillMult, + cha: unweightedGain * action.weights.cha * skillMult, + int: unweightedIntGain * action.weights.int * skillMult, + money: 0, + } } - getDiplomacyEffectiveness(player: IPlayer): number { + getDiplomacyEffectiveness(person: IPerson): number { // Returns a decimal by which the city's chaos level should be multiplied (e.g. 0.98) const CharismaLinearFactor = 1e3; const CharismaExponentialFactor = 0.045; - const charismaEff = Math.pow(player.charisma, CharismaExponentialFactor) + player.charisma / CharismaLinearFactor; + const charismaEff = Math.pow(person.charisma, CharismaExponentialFactor) + person.charisma / CharismaLinearFactor; return (100 - charismaEff) / 100; } - getRecruitmentSuccessChance(player: IPlayer): number { - return Math.pow(player.charisma, 0.45) / (this.teamSize + 1); + getRecruitmentSuccessChance(person: IPerson): number { + return Math.pow(person.charisma, 0.45) / (this.teamSize - this.sleeveSize + 1); } - getRecruitmentTime(player: IPlayer): number { - const effCharisma = player.charisma * this.skillMultipliers.effCha; + getRecruitmentTime(person: IPerson): number { + const effCharisma = person.charisma * this.skillMultipliers.effCha; const charismaFactor = Math.pow(effCharisma, 0.81) + effCharisma / 90; return Math.max(10, Math.round(BladeburnerConstants.BaseRecruitmentTimeNeeded - charismaFactor)); } + sleeveSupport(joining: boolean): void { + if(joining){ + this.sleeveSize += 1; + this.teamSize += 1; + } else { + this.sleeveSize -= 1; + this.teamSize -= 1; + } + } + resetSkillMultipliers(): void { this.skillMultipliers = { successChanceAll: 1, @@ -1097,7 +1115,7 @@ export class Bladeburner implements IBladeburner { } } - completeOperation(success: boolean): void { + completeOperation(success: boolean, player: IPlayer): void { if (this.action.type !== ActionTypes.Operation) { throw new Error("completeOperation() called even though current action is not an Operation"); } @@ -1117,6 +1135,15 @@ export class Bladeburner implements IBladeburner { } const losses = getRandomInt(0, max); this.teamSize -= losses; + if(this.teamSize < this.sleeveSize) { + let sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); + for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ + const r = Math.floor(Math.random() * sup.length); + sup[r].takeDamage(sup[r].max_hp); + sup.splice(r, 1); + } + this.teamSize += this.sleeveSize; + } this.teamLost += losses; if (this.logging.ops && losses > 0) { this.log("Lost " + formatNumber(losses, 0) + " team members during this " + action.name); @@ -1214,13 +1241,13 @@ export class Bladeburner implements IBladeburner { } } - completeContract(success: boolean): void { - if (this.action.type !== ActionTypes.Contract) { + completeContract(success: boolean, actionIdent: IActionIdentifier): void { + if (actionIdent.type !== ActionTypes.Contract) { throw new Error("completeContract() called even though current action is not a Contract"); } const city = this.getCurrentCity(); if (success) { - switch (this.action.name) { + switch (actionIdent.name) { case "Tracking": // Increase estimate accuracy by a relatively small amount city.improvePopulationEstimateByCount(getRandomInt(100, 1e3)); @@ -1234,20 +1261,21 @@ export class Bladeburner implements IBladeburner { city.changeChaosByCount(0.04); break; default: - throw new Error("Invalid Action name in completeContract: " + this.action.name); + throw new Error("Invalid Action name in completeContract: " + actionIdent.name); } } } - completeAction(router: IRouter, player: IPlayer): void { - switch (this.action.type) { + completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier): ITaskTracker { + let retValue = createTaskTracker(); + switch (actionIdent.type) { case ActionTypes["Contract"]: case ActionTypes["Operation"]: { try { - const isOperation = this.action.type === ActionTypes["Operation"]; - const action = this.getActionObject(this.action); + const isOperation = actionIdent.type === ActionTypes["Operation"]; + const action = this.getActionObject(actionIdent); if (action == null) { - throw new Error("Failed to get Contract/Operation Object for: " + this.action.name); + throw new Error("Failed to get Contract/Operation Object for: " + actionIdent.name); } const difficulty = action.getDifficulty(); const difficultyMultiplier = @@ -1262,8 +1290,8 @@ export class Bladeburner implements IBladeburner { } // Process Contract/Operation success/failure - if (action.attempt(this)) { - this.gainActionStats(player, action, true); + if (action.attempt(this, person)) { + retValue = this.getActionStats(action, true); ++action.successes; --action.count; @@ -1271,7 +1299,7 @@ export class Bladeburner implements IBladeburner { let moneyGain = 0; if (!isOperation) { moneyGain = BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * this.skillMultipliers.money; - player.gainMoney(moneyGain, "bladeburner"); + retValue.money = moneyGain; } if (isOperation) { @@ -1281,11 +1309,12 @@ export class Bladeburner implements IBladeburner { } if (action.rankGain) { const gain = addOffset(action.rankGain * rewardMultiplier * BitNodeMultipliers.BladeburnerRank, 10); - this.changeRank(player, gain); + this.changeRank(person, gain); if (isOperation && this.logging.ops) { - this.log(action.name + " successfully completed! Gained " + formatNumber(gain, 3) + " rank"); + this.log(`${person.whoAmI()}: ` + action.name + " successfully completed! Gained " + formatNumber(gain, 3) + " rank"); } else if (!isOperation && this.logging.contracts) { this.log( + `${person.whoAmI()}: ` + action.name + " contract successfully completed! Gained " + formatNumber(gain, 3) + @@ -1294,22 +1323,22 @@ export class Bladeburner implements IBladeburner { ); } } - isOperation ? this.completeOperation(true) : this.completeContract(true); + isOperation ? this.completeOperation(true, player) : this.completeContract(true, actionIdent); } else { - this.gainActionStats(player, action, false); + retValue = this.getActionStats(action, false); ++action.failures; let loss = 0, damage = 0; if (action.rankLoss) { loss = addOffset(action.rankLoss * rewardMultiplier, 10); - this.changeRank(player, -1 * loss); + this.changeRank(person, -1 * loss); } if (action.hpLoss) { damage = action.hpLoss * difficultyMultiplier; damage = Math.ceil(addOffset(damage, 10)); this.hpLost += damage; - const cost = calculateHospitalizationCost(player, damage); - if (player.takeDamage(damage)) { + const cost = calculateHospitalizationCost(person, damage); + if (person.takeDamage(damage)) { ++this.numHosp; this.moneyLost += cost; } @@ -1322,16 +1351,15 @@ export class Bladeburner implements IBladeburner { logLossText += "Took " + formatNumber(damage, 0) + " damage."; } if (isOperation && this.logging.ops) { - this.log(action.name + " failed! " + logLossText); + this.log(`${person.whoAmI()}: ` + action.name + " failed! " + logLossText); } else if (!isOperation && this.logging.contracts) { - this.log(action.name + " contract failed! " + logLossText); + this.log(`${person.whoAmI()}: ` + action.name + " contract failed! " + logLossText); } - isOperation ? this.completeOperation(false) : this.completeContract(false); + isOperation ? this.completeOperation(false, player) : this.completeContract(false, actionIdent); } if (action.autoLevel) { action.level = action.maxLevel; } // Autolevel - this.startAction(player, this.action); // Repeat action } catch (e: any) { exceptionAlert(e); } @@ -1340,9 +1368,9 @@ export class Bladeburner implements IBladeburner { case ActionTypes["BlackOp"]: case ActionTypes["BlackOperation"]: { try { - const action = this.getActionObject(this.action); + const action = this.getActionObject(actionIdent); if (action == null || !(action instanceof BlackOperation)) { - throw new Error("Failed to get BlackOperation Object for: " + this.action.name); + throw new Error("Failed to get BlackOperation Object for: " + actionIdent.name); } const difficulty = action.getDifficulty(); const difficultyMultiplier = @@ -1359,39 +1387,33 @@ export class Bladeburner implements IBladeburner { const teamCount = action.teamCount; let teamLossMax; - if (action.attempt(this)) { - this.gainActionStats(player, action, true); + if (action.attempt(this, person)) { + retValue = this.getActionStats(action, true); action.count = 0; this.blackops[action.name] = true; let rankGain = 0; if (action.rankGain) { rankGain = addOffset(action.rankGain * BitNodeMultipliers.BladeburnerRank, 10); - this.changeRank(player, rankGain); + this.changeRank(person, rankGain); } teamLossMax = Math.ceil(teamCount / 2); - // Operation Daedalus - if (action.name === BlackOperationNames.OperationDaedalus) { - this.resetAction(); - return router.toBitVerse(false, false); - } - if (this.logging.blackops) { - this.log(action.name + " successful! Gained " + formatNumber(rankGain, 1) + " rank"); + this.log(`${person.whoAmI()}: ` + action.name + " successful! Gained " + formatNumber(rankGain, 1) + " rank"); } } else { - this.gainActionStats(player, action, false); + retValue = this.getActionStats(action, false); let rankLoss = 0; let damage = 0; if (action.rankLoss) { rankLoss = addOffset(action.rankLoss, 10); - this.changeRank(player, -1 * rankLoss); + this.changeRank(person, -1 * rankLoss); } if (action.hpLoss) { damage = action.hpLoss * difficultyMultiplier; damage = Math.ceil(addOffset(damage, 10)); - const cost = calculateHospitalizationCost(player, damage); - if (player.takeDamage(damage)) { + const cost = calculateHospitalizationCost(person, damage); + if (person.takeDamage(damage)) { ++this.numHosp; this.moneyLost += cost; } @@ -1400,6 +1422,7 @@ export class Bladeburner implements IBladeburner { if (this.logging.blackops) { this.log( + `${person.whoAmI()}: ` + action.name + " failed! Lost " + formatNumber(rankLoss, 1) + @@ -1416,9 +1439,18 @@ export class Bladeburner implements IBladeburner { if (teamCount >= 1) { const losses = getRandomInt(1, teamLossMax); this.teamSize -= losses; + if(this.teamSize < this.sleeveSize) { + let sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); + for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ + const r = Math.floor(Math.random() * sup.length); + sup[r].takeDamage(sup[r].max_hp); + sup.splice(r, 1); + } + this.teamSize += this.sleeveSize; + } this.teamLost += losses; if (this.logging.blackops) { - this.log("You lost " + formatNumber(losses, 0) + " team members during " + action.name); + this.log(`${person.whoAmI()}: ` + "You lost " + formatNumber(losses, 0) + " team members during " + action.name); } } } catch (e: any) { @@ -1428,18 +1460,19 @@ export class Bladeburner implements IBladeburner { } case ActionTypes["Training"]: { this.stamina -= 0.5 * BladeburnerConstants.BaseStaminaLoss; - const strExpGain = 30 * player.strength_exp_mult, - defExpGain = 30 * player.defense_exp_mult, - dexExpGain = 30 * player.dexterity_exp_mult, - agiExpGain = 30 * player.agility_exp_mult, + const strExpGain = 30 * person.strength_exp_mult, + defExpGain = 30 * person.defense_exp_mult, + dexExpGain = 30 * person.dexterity_exp_mult, + agiExpGain = 30 * person.agility_exp_mult, staminaGain = 0.04 * this.skillMultipliers.stamina; - player.gainStrengthExp(strExpGain); - player.gainDefenseExp(defExpGain); - player.gainDexterityExp(dexExpGain); - player.gainAgilityExp(agiExpGain); + retValue.str = strExpGain; + retValue.def = defExpGain; + retValue.dex = dexExpGain; + retValue.agi = agiExpGain; this.staminaBonus += staminaGain; if (this.logging.general) { this.log( + `${person.whoAmI()}: ` + "Training completed. Gained: " + formatNumber(strExpGain, 1) + " str exp, " + @@ -1453,80 +1486,77 @@ export class Bladeburner implements IBladeburner { " max stamina", ); } - this.startAction(player, this.action); // Repeat action break; } case ActionTypes["FieldAnalysis"]: case ActionTypes["Field Analysis"]: { // Does not use stamina. Effectiveness depends on hacking, int, and cha let eff = - 0.04 * Math.pow(player.hacking, 0.3) + - 0.04 * Math.pow(player.intelligence, 0.9) + - 0.02 * Math.pow(player.charisma, 0.3); - eff *= player.bladeburner_analysis_mult; + 0.04 * Math.pow(person.hacking, 0.3) + + 0.04 * Math.pow(person.intelligence, 0.9) + + 0.02 * Math.pow(person.charisma, 0.3); + eff *= person.bladeburner_analysis_mult; if (isNaN(eff) || eff < 0) { throw new Error("Field Analysis Effectiveness calculated to be NaN or negative"); } - const hackingExpGain = 20 * player.hacking_exp_mult; - const charismaExpGain = 20 * player.charisma_exp_mult; + const hackingExpGain = 20 * person.hacking_exp_mult; + const charismaExpGain = 20 * person.charisma_exp_mult; const rankGain = 0.1 * BitNodeMultipliers.BladeburnerRank; - player.gainHackingExp(hackingExpGain); - player.gainIntelligenceExp(BladeburnerConstants.BaseIntGain); - player.gainCharismaExp(charismaExpGain); - this.changeRank(player, rankGain); + retValue.hack = hackingExpGain; + retValue.cha = charismaExpGain; + retValue.int = BladeburnerConstants.BaseIntGain; + this.changeRank(person, rankGain); this.getCurrentCity().improvePopulationEstimateByPercentage(eff * this.skillMultipliers.successChanceEstimate); if (this.logging.general) { this.log( + `${person.whoAmI()}: ` + `Field analysis completed. Gained ${formatNumber(rankGain, 2)} rank, ` + `${formatNumber(hackingExpGain, 1)} hacking exp, and ` + `${formatNumber(charismaExpGain, 1)} charisma exp`, ); } - this.startAction(player, this.action); // Repeat action break; } case ActionTypes["Recruitment"]: { - const successChance = this.getRecruitmentSuccessChance(player); + const successChance = this.getRecruitmentSuccessChance(person); + const recruitTime = this.getRecruitmentTime(person) * 1000; if (Math.random() < successChance) { - const expGain = 2 * BladeburnerConstants.BaseStatGain * this.actionTimeToComplete; - player.gainCharismaExp(expGain); + const expGain = 2 * BladeburnerConstants.BaseStatGain * recruitTime; + retValue.cha = expGain; ++this.teamSize; if (this.logging.general) { - this.log("Successfully recruited a team member! Gained " + formatNumber(expGain, 1) + " charisma exp"); + this.log(`${person.whoAmI()}: ` + "Successfully recruited a team member! Gained " + formatNumber(expGain, 1) + " charisma exp"); } } else { - const expGain = BladeburnerConstants.BaseStatGain * this.actionTimeToComplete; - player.gainCharismaExp(expGain); + const expGain = BladeburnerConstants.BaseStatGain * recruitTime; + retValue.cha = expGain; if (this.logging.general) { - this.log("Failed to recruit a team member. Gained " + formatNumber(expGain, 1) + " charisma exp"); + this.log(`${person.whoAmI()}: ` + "Failed to recruit a team member. Gained " + formatNumber(expGain, 1) + " charisma exp"); } } - this.startAction(player, this.action); // Repeat action break; } case ActionTypes["Diplomacy"]: { - const eff = this.getDiplomacyEffectiveness(player); + const eff = this.getDiplomacyEffectiveness(person); this.getCurrentCity().chaos *= eff; if (this.getCurrentCity().chaos < 0) { this.getCurrentCity().chaos = 0; } if (this.logging.general) { this.log( - `Diplomacy completed. Chaos levels in the current city fell by ${numeralWrapper.formatPercentage(1 - eff)}`, + `${person.whoAmI()}: Diplomacy completed. Chaos levels in the current city fell by ${numeralWrapper.formatPercentage(1 - eff)}`, ); } - this.startAction(player, this.action); // Repeat Action break; } case ActionTypes["Hyperbolic Regeneration Chamber"]: { - player.regenerateHp(BladeburnerConstants.HrcHpGain); + person.regenerateHp(BladeburnerConstants.HrcHpGain); const staminaGain = this.maxStamina * (BladeburnerConstants.HrcStaminaGain / 100); this.stamina = Math.min(this.maxStamina, this.stamina + staminaGain); - this.startAction(player, this.action); if (this.logging.general) { this.log( - `Rested in Hyperbolic Regeneration Chamber. Restored ${ + `${person.whoAmI()}: Rested in Hyperbolic Regeneration Chamber. Restored ${ BladeburnerConstants.HrcHpGain } HP and gained ${numeralWrapper.formatStamina(staminaGain)} stamina`, ); @@ -1545,24 +1575,35 @@ export class Bladeburner implements IBladeburner { this.operations[operation].count += (60 * 3 * growthF()) / BladeburnerConstants.ActionCountGrowthPeriod; } if (this.logging.general) { - this.log(`Incited violence in the synthoid communities.`); + this.log(`${person.whoAmI()}: ` + `Incited violence in the synthoid communities.`); } for (const cityName of Object.keys(this.cities)) { const city = this.cities[cityName]; city.chaos += 10; city.chaos += city.chaos / (Math.log(city.chaos) / Math.log(10)); } - - this.startAction(player, this.action); break; } default: - console.error(`Bladeburner.completeAction() called for invalid action: ${this.action.type}`); + console.error(`Bladeburner.completeAction() called for invalid action: ${actionIdent.type}`); break; } + return retValue; } - changeRank(player: IPlayer, change: number): void { + infiltrateSynthoidCommunities(): void { + for (const contract of Object.keys(this.contracts)) { + this.contracts[contract].count += 1; + } + for (const operation of Object.keys(this.operations)) { + this.operations[operation].count += 1; + } + if (this.logging.general) { + this.log(`Sleeve: Infiltrate the synthoid communities.`); + } + } + + changeRank(person: IPerson, change: number): void { if (isNaN(change)) { throw new Error("NaN passed into Bladeburner.changeRank()"); } @@ -1583,7 +1624,7 @@ export class Bladeburner implements IBladeburner { if (bladeburnerFac.isMember) { const favorBonus = 1 + bladeburnerFac.favor / 100; bladeburnerFac.playerReputation += - BladeburnerConstants.RankToFactionRepFactor * change * player.faction_rep_mult * favorBonus; + BladeburnerConstants.RankToFactionRepFactor * change * person.faction_rep_mult * favorBonus; } } @@ -1614,7 +1655,19 @@ export class Bladeburner implements IBladeburner { this.actionTimeOverflow = 0; if (this.actionTimeCurrent >= this.actionTimeToComplete) { this.actionTimeOverflow = this.actionTimeCurrent - this.actionTimeToComplete; - return this.completeAction(router, player); + let retValue = this.completeAction(player, player, this.action); + player.gainMoney(retValue.money, "bladeburner"); + player.gainStats(retValue); + // Operation Daedalus + const action = this.getActionObject(this.action); + if (action == null || !(action instanceof BlackOperation)) { + throw new Error("Failed to get BlackOperation Object for: " + this.action.name); + } else if (action.name === BlackOperationNames.OperationDaedalus && this.blackops[action.name]) { + this.resetAction(); + router.toBitVerse(false, false); + } else if(this.action.type != ActionTypes["BlackOperation"] && this.action.type != ActionTypes["BlackOp"]) { + this.startAction(player, this.action); // Repeat action + } } } @@ -2093,67 +2146,57 @@ export class Bladeburner implements IBladeburner { } } - getActionTimeNetscriptFn(player: IPlayer, type: string, name: string, workerScript: WorkerScript): number { - const errorLogText = `Invalid action: type='${type}' name='${name}'`; + getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number|string { const actionId = this.getActionIdFromTypeAndName(type, name); if (actionId == null) { - workerScript.log("bladeburner.getActionTime", () => errorLogText); - return -1; + return "bladeburner.getActionTime"; } const actionObj = this.getActionObject(actionId); if (actionObj == null) { - workerScript.log("bladeburner.getActionTime", () => errorLogText); - return -1; + return "bladeburner.getActionTime"; } - switch (actionId.type) { case ActionTypes["Contract"]: case ActionTypes["Operation"]: case ActionTypes["BlackOp"]: case ActionTypes["BlackOperation"]: - return actionObj.getActionTime(this) * 1000; + return actionObj.getActionTime(this, person) * 1000; case ActionTypes["Training"]: case ActionTypes["Field Analysis"]: case ActionTypes["FieldAnalysis"]: return 30000; case ActionTypes["Recruitment"]: - return this.getRecruitmentTime(player) * 1000; + return this.getRecruitmentTime(person) * 1000; case ActionTypes["Diplomacy"]: case ActionTypes["Hyperbolic Regeneration Chamber"]: case ActionTypes["Incite Violence"]: return 60000; default: - workerScript.log("bladeburner.getActionTime", () => errorLogText); - return -1; + return "bladeburner.getActionTime"; } } getActionEstimatedSuccessChanceNetscriptFn( - player: IPlayer, + person: IPerson, type: string, name: string, - workerScript: WorkerScript, - ): [number, number] { - const errorLogText = `Invalid action: type='${type}' name='${name}'`; + ): [number, number]|string { const actionId = this.getActionIdFromTypeAndName(type, name); if (actionId == null) { - workerScript.log("bladeburner.getActionEstimatedSuccessChance", () => errorLogText); - return [-1, -1]; + return "bladeburner.getActionEstimatedSuccessChance"; } const actionObj = this.getActionObject(actionId); if (actionObj == null) { - workerScript.log("bladeburner.getActionEstimatedSuccessChance", () => errorLogText); - return [-1, -1]; + return "bladeburner.getActionEstimatedSuccessChance"; } - switch (actionId.type) { case ActionTypes["Contract"]: case ActionTypes["Operation"]: case ActionTypes["BlackOp"]: case ActionTypes["BlackOperation"]: - return actionObj.getEstSuccessChance(this); + return actionObj.getEstSuccessChance(this, person); case ActionTypes["Training"]: case ActionTypes["Field Analysis"]: case ActionTypes["FieldAnalysis"]: @@ -2162,12 +2205,11 @@ export class Bladeburner implements IBladeburner { case ActionTypes["Incite Violence"]: return [1, 1]; case ActionTypes["Recruitment"]: { - const recChance = this.getRecruitmentSuccessChance(player); - return [recChance, recChance]; - } + const recChance = this.getRecruitmentSuccessChance(person); + return [recChance, recChance]; + } default: - workerScript.log("bladeburner.getActionEstimatedSuccessChance", () => errorLogText); - return [-1, -1]; + return "bladeburner.getActionEstimatedSuccessChance"; } } diff --git a/src/Bladeburner/IAction.tsx b/src/Bladeburner/IAction.tsx index 274bae4c9..666ffbfe9 100644 --- a/src/Bladeburner/IAction.tsx +++ b/src/Bladeburner/IAction.tsx @@ -1,3 +1,4 @@ +import { IPerson } from "../PersonObjects/IPerson"; import { IBladeburner } from "./IBladeburner"; interface IStatsMultiplier { @@ -55,15 +56,15 @@ export interface IAction { teamCount: number; getDifficulty(): number; - attempt(inst: IBladeburner): boolean; + attempt(inst: IBladeburner, person: IPerson): boolean; getActionTimePenalty(): number; - getActionTime(inst: IBladeburner): number; + getActionTime(inst: IBladeburner, person: IPerson): number; getTeamSuccessBonus(inst: IBladeburner): number; getActionTypeSkillSuccessBonus(inst: IBladeburner): number; getChaosCompetencePenalty(inst: IBladeburner, params: ISuccessChanceParams): number; getChaosDifficultyBonus(inst: IBladeburner): number; - getEstSuccessChance(inst: IBladeburner): [number, number]; - getSuccessChance(inst: IBladeburner, params: ISuccessChanceParams): number; + getEstSuccessChance(inst: IBladeburner, person: IPerson): [number, number]; + getSuccessChance(inst: IBladeburner, person: IPerson, params: ISuccessChanceParams): number; getSuccessesNeededForNextLevel(baseSuccessesPerLevel: number): number; setMaxLevel(baseSuccessesPerLevel: number): void; toJSON(): any; diff --git a/src/Bladeburner/IBladeburner.ts b/src/Bladeburner/IBladeburner.ts index 840ed20f4..f757f9d66 100644 --- a/src/Bladeburner/IBladeburner.ts +++ b/src/Bladeburner/IBladeburner.ts @@ -3,6 +3,8 @@ import { City } from "./City"; import { Skill } from "./Skill"; import { IAction } from "./IAction"; import { IPlayer } from "../PersonObjects/IPlayer"; +import { IPerson } from "../PersonObjects/IPerson"; +import { ITaskTracker } from "../PersonObjects/ITaskTracker"; import { IRouter } from "../ui/Router"; import { WorkerScript } from "../Netscript/WorkerScript"; @@ -70,13 +72,12 @@ export interface IBladeburner { getGeneralActionNamesNetscriptFn(): string[]; getSkillNamesNetscriptFn(): string[]; startActionNetscriptFn(player: IPlayer, type: string, name: string, workerScript: WorkerScript): boolean; - getActionTimeNetscriptFn(player: IPlayer, type: string, name: string, workerScript: WorkerScript): number; + getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number|string; getActionEstimatedSuccessChanceNetscriptFn( - player: IPlayer, + person: IPerson, type: string, name: string, - workerScript: WorkerScript, - ): [number, number]; + ): [number, number]|string; getActionCountRemainingNetscriptFn(type: string, name: string, workerScript: WorkerScript): number; getSkillLevelNetscriptFn(skillName: string, workerScript: WorkerScript): number; getSkillUpgradeCostNetscriptFn(skillName: string, workerScript: WorkerScript): number; @@ -95,20 +96,22 @@ export interface IBladeburner { triggerMigration(sourceCityName: string): void; triggerPotentialMigration(sourceCityName: string, chance: number): void; randomEvent(): void; - gainActionStats(player: IPlayer, action: IAction, success: boolean): void; getDiplomacyEffectiveness(player: IPlayer): number; - getRecruitmentSuccessChance(player: IPlayer): number; - getRecruitmentTime(player: IPlayer): number; + getRecruitmentSuccessChance(player: IPerson): number; + getRecruitmentTime(player: IPerson): number; resetSkillMultipliers(): void; updateSkillMultipliers(): void; - completeOperation(success: boolean): void; + completeOperation(success: boolean, player: IPlayer): void; getActionObject(actionId: IActionIdentifier): IAction | null; - completeContract(success: boolean): void; - completeAction(router: IRouter, player: IPlayer): void; + completeContract(success: boolean, actionIdent: IActionIdentifier): void; + completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier): ITaskTracker; + infiltrateSynthoidCommunities(): void; changeRank(player: IPlayer, change: number): void; processAction(router: IRouter, player: IPlayer, seconds: number): void; calculateStaminaGainPerSecond(player: IPlayer): number; calculateMaxStamina(player: IPlayer): void; create(): void; process(router: IRouter, player: IPlayer): void; + getActionStats(action: IAction, success: boolean): ITaskTracker; + sleeveSupport(joining: boolean): void; } diff --git a/src/Bladeburner/ui/BlackOpElem.tsx b/src/Bladeburner/ui/BlackOpElem.tsx index ae406f14d..7c45836c3 100644 --- a/src/Bladeburner/ui/BlackOpElem.tsx +++ b/src/Bladeburner/ui/BlackOpElem.tsx @@ -37,7 +37,7 @@ export function BlackOpElem(props: IProps): React.ReactElement { const isActive = props.bladeburner.action.type === ActionTypes["BlackOperation"] && props.action.name === props.bladeburner.action.name; - const actionTime = props.action.getActionTime(props.bladeburner); + const actionTime = props.action.getActionTime(props.bladeburner, props.player); const hasReqdRank = props.bladeburner.rank >= props.action.reqdRank; const computedActionTimeCurrent = Math.min( props.bladeburner.actionTimeCurrent + props.bladeburner.actionTimeOverflow, diff --git a/src/Bladeburner/ui/ContractElem.tsx b/src/Bladeburner/ui/ContractElem.tsx index fad0865df..5edf04842 100644 --- a/src/Bladeburner/ui/ContractElem.tsx +++ b/src/Bladeburner/ui/ContractElem.tsx @@ -32,7 +32,7 @@ export function ContractElem(props: IProps): React.ReactElement { props.bladeburner.actionTimeCurrent + props.bladeburner.actionTimeOverflow, props.bladeburner.actionTimeToComplete, ); - const actionTime = props.action.getActionTime(props.bladeburner); + const actionTime = props.action.getActionTime(props.bladeburner, props.player); const actionData = Contracts[props.action.name]; if (actionData === undefined) { diff --git a/src/Bladeburner/ui/OperationElem.tsx b/src/Bladeburner/ui/OperationElem.tsx index 6e50fd547..e217e4225 100644 --- a/src/Bladeburner/ui/OperationElem.tsx +++ b/src/Bladeburner/ui/OperationElem.tsx @@ -33,7 +33,7 @@ export function OperationElem(props: IProps): React.ReactElement { props.bladeburner.actionTimeCurrent + props.bladeburner.actionTimeOverflow, props.bladeburner.actionTimeToComplete, ); - const actionTime = props.action.getActionTime(props.bladeburner); + const actionTime = props.action.getActionTime(props.bladeburner, props.player); const actionData = Operations[props.action.name]; if (actionData === undefined) { diff --git a/src/Bladeburner/ui/SuccessChance.tsx b/src/Bladeburner/ui/SuccessChance.tsx index 934b8338c..285a730d6 100644 --- a/src/Bladeburner/ui/SuccessChance.tsx +++ b/src/Bladeburner/ui/SuccessChance.tsx @@ -4,6 +4,7 @@ import { StealthIcon } from "./StealthIcon"; import { KillIcon } from "./KillIcon"; import { IAction } from "../IAction"; import { IBladeburner } from "../IBladeburner"; +import { Player } from "../../Player"; interface IProps { bladeburner: IBladeburner; @@ -11,7 +12,7 @@ interface IProps { } export function SuccessChance(props: IProps): React.ReactElement { - const estimatedSuccessChance = props.action.getEstSuccessChance(props.bladeburner); + const estimatedSuccessChance = props.action.getEstSuccessChance(props.bladeburner, Player); let chance = <>; if (estimatedSuccessChance[0] === estimatedSuccessChance[1]) { diff --git a/src/Crime/Crime.ts b/src/Crime/Crime.ts index 4551677a2..94820e466 100644 --- a/src/Crime/Crime.ts +++ b/src/Crime/Crime.ts @@ -1,6 +1,6 @@ import { CONSTANTS } from "../Constants"; import { IPlayer } from "../PersonObjects/IPlayer"; -import { IPlayerOrSleeve } from "../PersonObjects/IPlayerOrSleeve"; +import { IPerson } from "../PersonObjects/IPerson"; import { IRouter } from "../ui/Router"; import { WorkerScript } from "../Netscript/WorkerScript"; @@ -108,7 +108,7 @@ export class Crime { return this.time; } - successRate(p: IPlayerOrSleeve): number { + successRate(p: IPerson): number { let chance: number = this.hacking_success_weight * p.hacking + this.strength_success_weight * p.strength + diff --git a/src/Hospital/Hospital.ts b/src/Hospital/Hospital.ts index d811cae54..4122d9f03 100644 --- a/src/Hospital/Hospital.ts +++ b/src/Hospital/Hospital.ts @@ -1,7 +1,7 @@ import { CONSTANTS } from "../Constants"; -import { IPlayer } from "../PersonObjects/IPlayer"; +import { IPerson } from "../PersonObjects/IPerson"; -export function getHospitalizationCost(p: IPlayer): number { +export function getHospitalizationCost(p: IPerson): number { if (p.money < 0) { return 0; } @@ -9,7 +9,7 @@ export function getHospitalizationCost(p: IPlayer): number { return Math.min(p.money * 0.1, (p.max_hp - p.hp) * CONSTANTS.HospitalCostPerHp); } -export function calculateHospitalizationCost(p: IPlayer, damage: number): number { +export function calculateHospitalizationCost(p: IPerson, damage: number): number { const oldhp = p.hp; p.hp -= damage; const cost = getHospitalizationCost(p); diff --git a/src/NetscriptFunctions/Bladeburner.ts b/src/NetscriptFunctions/Bladeburner.ts index e6da8bbed..1692b124f 100644 --- a/src/NetscriptFunctions/Bladeburner.ts +++ b/src/NetscriptFunctions/Bladeburner.ts @@ -134,7 +134,14 @@ export function NetscriptBladeburner( const bladeburner = player.bladeburner; if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { - return bladeburner.getActionTimeNetscriptFn(player, type, name, workerScript); + let time = bladeburner.getActionTimeNetscriptFn(player, type, name); + if(typeof time === 'string'){ + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + workerScript.log("bladeburner.getActionTime", () => errorLogText); + return -1; + } else { + return time; + } } catch (e: any) { throw helper.makeRuntimeErrorMsg("bladeburner.getActionTime", e); } @@ -150,7 +157,14 @@ export function NetscriptBladeburner( const bladeburner = player.bladeburner; if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { - return bladeburner.getActionEstimatedSuccessChanceNetscriptFn(player, type, name, workerScript); + let chance = bladeburner.getActionEstimatedSuccessChanceNetscriptFn(player, type, name); + if(typeof chance === 'string'){ + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + workerScript.log("bladeburner.getActionTime", () => errorLogText); + return [-1, -1]; + } else { + return chance; + } } catch (e: any) { throw helper.makeRuntimeErrorMsg("bladeburner.getActionEstimatedSuccessChance", e); } diff --git a/src/PersonObjects/IPerson.ts b/src/PersonObjects/IPerson.ts new file mode 100644 index 000000000..ab51f85c0 --- /dev/null +++ b/src/PersonObjects/IPerson.ts @@ -0,0 +1,64 @@ +// Interface that represents either the player (PlayerObject) or +// a Sleeve. Used for functions that need to take in both. + +import { ITaskTracker } from "./ITaskTracker"; + +export interface IPerson { + // Stats + hacking: number; + strength: number; + defense: number; + dexterity: number; + agility: number; + charisma: number; + intelligence: number; + hp: number; + max_hp: number; + money: number; + + // Experience + hacking_exp: number; + strength_exp: number; + defense_exp: number; + dexterity_exp: number; + agility_exp: number; + charisma_exp: number; + intelligence_exp: number; + + // Multipliers + hacking_exp_mult: number; + strength_exp_mult: number; + defense_exp_mult: number; + dexterity_exp_mult: number; + agility_exp_mult: number; + charisma_exp_mult: number; + hacking_mult: number; + strength_mult: number; + defense_mult: number; + dexterity_mult: number; + agility_mult: number; + charisma_mult: number; + + company_rep_mult: number; + faction_rep_mult: number; + + crime_money_mult: number; + crime_success_mult: number; + + bladeburner_analysis_mult: number; + + getIntelligenceBonus(weight: number): number; + gainHackingExp(exp: number): void; + gainStrengthExp(exp: number): void; + gainDefenseExp(exp: number): void; + gainDexterityExp(exp: number): void; + gainAgilityExp(exp: number): void; + gainCharismaExp(exp: number): void; + gainIntelligenceExp(exp: number): void; + gainStats(retValue: ITaskTracker): void; + calculateSkill(exp: number, mult?: number): number; + takeDamage(amt: number): boolean; + regenerateHp: (amt: number) => void; + queryStatFromString: (str: string) => number; + whoAmI: () => string; + } \ No newline at end of file diff --git a/src/PersonObjects/IPlayer.ts b/src/PersonObjects/IPlayer.ts index ca1f2940a..b4ca6c20f 100644 --- a/src/PersonObjects/IPlayer.ts +++ b/src/PersonObjects/IPlayer.ts @@ -30,8 +30,9 @@ import { WorkerScript } from "../Netscript/WorkerScript"; import { HacknetServer } from "../Hacknet/HacknetServer"; import { ISkillProgress } from "./formulas/skill"; import { PlayerAchievement } from "../Achievements/Achievements"; +import { IPerson } from "./IPerson"; -export interface IPlayer { +export interface IPlayer extends IPerson { // Class members augmentations: IPlayerOwnedAugmentation[]; bitNodeN: number; @@ -185,13 +186,6 @@ export interface IPlayer { canAccessGang(): boolean; canAccessGrafting(): boolean; canAfford(cost: number): boolean; - gainHackingExp(exp: number): void; - gainStrengthExp(exp: number): void; - gainDefenseExp(exp: number): void; - gainDexterityExp(exp: number): void; - gainAgilityExp(exp: number): void; - gainCharismaExp(exp: number): void; - gainIntelligenceExp(exp: number): void; gainMoney(money: number, source: string): void; getCurrentServer(): BaseServer; getGangFaction(): Faction; @@ -213,7 +207,6 @@ export interface IPlayer { process(router: IRouter, numCycles?: number): void; reapplyAllAugmentations(resetMultipliers?: boolean): void; reapplyAllSourceFiles(): void; - regenerateHp(amt: number): void; setMoney(amt: number): void; singularityStopWork(): string; startBladeburner(p: any): void; @@ -240,12 +233,9 @@ export interface IPlayer { startGang(facName: string, isHacking: boolean): void; startWork(companyName: string): void; startWorkPartTime(companyName: string): void; - takeDamage(amt: number): boolean; travel(to: CityName): boolean; giveExploit(exploit: Exploit): void; giveAchievement(achievementId: string): void; - queryStatFromString(str: string): number; - getIntelligenceBonus(weight: number): number; getCasinoWinnings(): number; quitJob(company: string): void; hasJob(): boolean; @@ -266,7 +256,6 @@ export interface IPlayer { resetMultipliers(): void; prestigeAugmentation(): void; prestigeSourceFile(): void; - calculateSkill(exp: number, mult?: number): number; calculateSkillProgress(exp: number, mult?: number): ISkillProgress; resetWorkStatus(generalType?: string, group?: string, workType?: string): void; getWorkHackExpGain(): number; diff --git a/src/PersonObjects/IPlayerOrSleeve.ts b/src/PersonObjects/IPlayerOrSleeve.ts deleted file mode 100644 index 366c31dde..000000000 --- a/src/PersonObjects/IPlayerOrSleeve.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Interface that represents either the player (PlayerObject) or -// a Sleeve. Used for functions that need to take in both. - -export interface IPlayerOrSleeve { - // Stats - hacking: number; - strength: number; - defense: number; - dexterity: number; - agility: number; - charisma: number; - intelligence: number; - - // Experience - hacking_exp: number; - strength_exp: number; - defense_exp: number; - dexterity_exp: number; - agility_exp: number; - charisma_exp: number; - - // Multipliers - crime_success_mult: number; - - getIntelligenceBonus(weight: number): number; -} diff --git a/src/PersonObjects/ITaskTracker.ts b/src/PersonObjects/ITaskTracker.ts new file mode 100644 index 000000000..8b2d92efa --- /dev/null +++ b/src/PersonObjects/ITaskTracker.ts @@ -0,0 +1,25 @@ +// Interface that defines a generic object used to track experience/money +// earnings for tasks +export interface ITaskTracker { + hack: number; + str: number; + def: number; + dex: number; + agi: number; + cha: number; + int: number; + money: number; + } + + export function createTaskTracker(): ITaskTracker { + return { + hack: 0, + str: 0, + def: 0, + dex: 0, + agi: 0, + cha: 0, + int: 0, + money: 0, + }; + } \ No newline at end of file diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 18c39a2ed..0bee0658a 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -1,4 +1,4 @@ -// Base class representing a person-like object +import * as generalMethods from "./Player/PlayerObjectGeneralMethods"; import { Augmentation } from "../Augmentation/Augmentation"; import { IPlayerOwnedAugmentation } from "../Augmentation/PlayerOwnedAugmentation"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; @@ -6,32 +6,12 @@ import { CityName } from "../Locations/data/CityNames"; import { CONSTANTS } from "../Constants"; import { calculateSkill } from "./formulas/skill"; import { calculateIntelligenceBonus } from "./formulas/intelligence"; +import { IPerson } from "./IPerson"; +import { Reviver } from "../utils/JSONReviver"; +import { ITaskTracker } from "./ITaskTracker"; -// Interface that defines a generic object used to track experience/money -// earnings for tasks -export interface ITaskTracker { - hack: number; - str: number; - def: number; - dex: number; - agi: number; - cha: number; - money: number; -} - -export function createTaskTracker(): ITaskTracker { - return { - hack: 0, - str: 0, - def: 0, - dex: 0, - agi: 0, - cha: 0, - money: 0, - }; -} - -export abstract class Person { +// Base class representing a person-like object +export abstract class Person implements IPerson { /** * Stats */ @@ -44,6 +24,7 @@ export abstract class Person { intelligence = 1; hp = 10; max_hp = 10; + money = 0; /** * Experience @@ -240,4 +221,35 @@ export abstract class Person { getIntelligenceBonus(weight: number): number { return calculateIntelligenceBonus(this.intelligence, weight); } + + abstract takeDamage(amt: number): boolean; + + abstract whoAmI(): string; + + gainHackingExp: (exp: number) => void; + gainStrengthExp: (exp: number) => void; + gainDefenseExp: (exp: number) => void; + gainDexterityExp: (exp: number) => void; + gainAgilityExp: (exp: number) => void; + gainCharismaExp: (exp: number) => void; + gainIntelligenceExp: (exp: number) => void; + gainStats: (retValue: ITaskTracker) => void; + calculateSkill: (exp: number, mult: number) => number; + regenerateHp: (amt: number) => void; + queryStatFromString: (str: string) => number; + constructor() { + this.gainHackingExp = generalMethods.gainHackingExp; + this.gainStrengthExp = generalMethods.gainStrengthExp; + this.gainDefenseExp = generalMethods.gainDefenseExp; + this.gainDexterityExp = generalMethods.gainDexterityExp; + this.gainAgilityExp = generalMethods.gainAgilityExp; + this.gainCharismaExp = generalMethods.gainCharismaExp; + this.gainIntelligenceExp = generalMethods.gainIntelligenceExp; + this.gainStats = generalMethods.gainStats; + this.calculateSkill = generalMethods.calculateSkill; + this.regenerateHp = generalMethods.regenerateHp; + this.queryStatFromString = generalMethods.queryStatFromString; + } } + +Reviver.constructors.Person = Person; \ No newline at end of file diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts index 943598b60..fec5ae596 100644 --- a/src/PersonObjects/Player/PlayerObject.ts +++ b/src/PersonObjects/Player/PlayerObject.ts @@ -37,6 +37,7 @@ import { ISkillProgress } from "../formulas/skill"; import { PlayerAchievement } from "../../Achievements/Achievements"; import { cyrb53 } from "../../utils/StringHelperFunctions"; import { getRandomInt } from "../../utils/helpers/getRandomInt"; +import { ITaskTracker } from "../ITaskTracker"; export class PlayerObject implements IPlayer { // Class members @@ -201,6 +202,7 @@ export class PlayerObject implements IPlayer { gainAgilityExp: (exp: number) => void; gainCharismaExp: (exp: number) => void; gainIntelligenceExp: (exp: number) => void; + gainStats: (retValue: ITaskTracker) => void; gainMoney: (money: number, source: string) => void; getCurrentServer: () => BaseServer; getGangFaction: () => Faction; @@ -302,6 +304,9 @@ export class PlayerObject implements IPlayer { graftAugmentationWork: (numCycles: number) => boolean; finishGraftAugmentationWork: (cancelled: boolean) => string; applyEntropy: (stacks?: number) => void; + whoAmI(): string{ + return 'Player'; + } constructor() { //Skills and stats @@ -521,6 +526,7 @@ export class PlayerObject implements IPlayer { this.gainAgilityExp = generalMethods.gainAgilityExp; this.gainCharismaExp = generalMethods.gainCharismaExp; this.gainIntelligenceExp = generalMethods.gainIntelligenceExp; + this.gainStats = generalMethods.gainStats; this.queryStatFromString = generalMethods.queryStatFromString; this.resetWorkStatus = generalMethods.resetWorkStatus; this.processWorkEarnings = generalMethods.processWorkEarnings; diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx index 00f0acbd7..d28850706 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx @@ -66,6 +66,8 @@ import { SnackbarEvents } from "../../ui/React/Snackbar"; import { calculateClassEarnings } from "../formulas/work"; import { achievements } from "../../Achievements/Achievements"; import { FactionNames } from "../../Faction/data/FactionNames"; +import { ITaskTracker } from "../ITaskTracker"; +import { IPerson } from "../IPerson"; export function init(this: IPlayer): void { /* Initialize Player's home computer */ @@ -227,7 +229,7 @@ export function receiveInvite(this: IPlayer, factionName: string): void { } //Calculates skill level based on experience. The same formula will be used for every skill -export function calculateSkill(this: IPlayer, exp: number, mult = 1): number { +export function calculateSkill(this: IPerson, exp: number, mult = 1): number { return calculateSkillF(exp, mult); } @@ -391,7 +393,7 @@ export function gainHackingExp(this: IPlayer, exp: number): void { this.hacking = calculateSkillF(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier); } -export function gainStrengthExp(this: IPlayer, exp: number): void { +export function gainStrengthExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into Player.gainStrengthExp()"); return; @@ -404,7 +406,7 @@ export function gainStrengthExp(this: IPlayer, exp: number): void { this.strength = calculateSkillF(this.strength_exp, this.strength_mult * BitNodeMultipliers.StrengthLevelMultiplier); } -export function gainDefenseExp(this: IPlayer, exp: number): void { +export function gainDefenseExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into player.gainDefenseExp()"); return; @@ -420,7 +422,7 @@ export function gainDefenseExp(this: IPlayer, exp: number): void { this.hp = Math.round(this.max_hp * ratio); } -export function gainDexterityExp(this: IPlayer, exp: number): void { +export function gainDexterityExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into Player.gainDexterityExp()"); return; @@ -436,7 +438,7 @@ export function gainDexterityExp(this: IPlayer, exp: number): void { ); } -export function gainAgilityExp(this: IPlayer, exp: number): void { +export function gainAgilityExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into Player.gainAgilityExp()"); return; @@ -449,7 +451,7 @@ export function gainAgilityExp(this: IPlayer, exp: number): void { this.agility = calculateSkillF(this.agility_exp, this.agility_mult * BitNodeMultipliers.AgilityLevelMultiplier); } -export function gainCharismaExp(this: IPlayer, exp: number): void { +export function gainCharismaExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into Player.gainCharismaExp()"); return; @@ -462,17 +464,27 @@ export function gainCharismaExp(this: IPlayer, exp: number): void { this.charisma = calculateSkillF(this.charisma_exp, this.charisma_mult * BitNodeMultipliers.CharismaLevelMultiplier); } -export function gainIntelligenceExp(this: IPlayer, exp: number): void { +export function gainIntelligenceExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERROR: NaN passed into Player.gainIntelligenceExp()"); return; } if (SourceFileFlags[5] > 0 || this.intelligence > 0) { this.intelligence_exp += exp; - this.intelligence = Math.floor(this.calculateSkill(this.intelligence_exp)); + this.intelligence = Math.floor(this.calculateSkill(this.intelligence_exp, 1)); } } +export function gainStats(this: IPerson, retValue: ITaskTracker): void { + this.gainHackingExp(retValue.hack * this.hacking_exp_mult); + this.gainStrengthExp(retValue.str * this.strength_exp_mult); + this.gainDefenseExp(retValue.def * this.defense_exp_mult); + this.gainDexterityExp(retValue.dex * this.dexterity_exp_mult); + this.gainAgilityExp(retValue.agi * this.agility_exp_mult); + this.gainCharismaExp(retValue.cha * this.charisma_exp_mult); + this.gainIntelligenceExp(retValue.int); +} + //Given a string expression like "str" or "strength", returns the given stat export function queryStatFromString(this: IPlayer, str: string): number { const tempStr = str.toLowerCase(); @@ -1718,7 +1730,7 @@ export function takeDamage(this: IPlayer, amt: number): boolean { } } -export function regenerateHp(this: IPlayer, amt: number): void { +export function regenerateHp(this: IPerson, amt: number): void { if (typeof amt !== "number") { console.warn(`Player.regenerateHp() called without a numeric argument: ${amt}`); return; diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 2b931d37f..74103f5dc 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -9,7 +9,8 @@ import { SleeveTaskType } from "./SleeveTaskTypesEnum"; import { IPlayer } from "../IPlayer"; -import { Person, ITaskTracker, createTaskTracker } from "../Person"; +import { Person } from "../Person"; +import { ITaskTracker, createTaskTracker } from "../ITaskTracker"; import { Augmentation } from "../../Augmentation/Augmentation"; @@ -33,6 +34,7 @@ import { CityName } from "../../Locations/data/CityNames"; import { LocationName } from "../../Locations/data/LocationNames"; import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver"; +import { BladeburnerConstants } from "../../Bladeburner/data/Constants"; export class Sleeve extends Person { /** @@ -58,6 +60,7 @@ export class Sleeve extends Person { * Faction/Company Work: Name of Faction/Company * Crime: Money earned if successful * Class/Gym: Name of university/gym + * Bladeburner: success chance */ currentTaskLocation = ""; @@ -101,6 +104,16 @@ export class Sleeve extends Person { */ gymStatType = ""; + /** + * String that stores what stat the sleeve is training at the gym + */ + bbAction = ""; + + /** + * String that stores what stat the sleeve is training at the gym + */ + bbContract = ""; + /** * Keeps track of events/notifications for this sleeve */ @@ -151,7 +164,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } this.gainRatesForTask.hack = crime.hacking_exp * this.hacking_exp_mult * BitNodeMultipliers.CrimeExpGain; @@ -160,6 +173,7 @@ export class Sleeve extends Person { this.gainRatesForTask.dex = crime.dexterity_exp * this.dexterity_exp_mult * BitNodeMultipliers.CrimeExpGain; this.gainRatesForTask.agi = crime.agility_exp * this.agility_exp_mult * BitNodeMultipliers.CrimeExpGain; this.gainRatesForTask.cha = crime.charisma_exp * this.charisma_exp_mult * BitNodeMultipliers.CrimeExpGain; + this.gainRatesForTask.int = crime.intelligence_exp; this.gainRatesForTask.money = crime.money * this.crime_money_mult * BitNodeMultipliers.CrimeMoney; this.currentTaskLocation = String(this.gainRatesForTask.money); @@ -175,14 +189,14 @@ export class Sleeve extends Person { */ finishTask(p: IPlayer): ITaskTracker { let retValue: ITaskTracker = createTaskTracker(); // Amount of exp to be gained by other sleeves - + if (this.currentTask === SleeveTaskType.Crime) { // For crimes, all experience and money is gained at the end if (this.currentTaskTime >= this.currentTaskMaxTime) { const crime: Crime | undefined = Object.values(Crimes).find((crime) => crime.name === this.crimeType); if (!crime) { console.error(`Invalid data stored in sleeve.crimeType: ${this.crimeType}`); - this.resetTaskStatus(); + this.resetTaskStatus(p); return retValue; } if (Math.random() < crime.successRate(this)) { @@ -206,11 +220,57 @@ export class Sleeve extends Person { this.currentTaskTime = 0; return retValue; } - } else { - // For other crimes... I dont think anything else needs to be done + } else if (this.currentTask === SleeveTaskType.Bladeburner) { + // For bladeburner, all experience and money is gained at the end + const bb = p.bladeburner; + if (bb === null) { + const errorLogText = `bladeburner is null`; + console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`) + this.resetTaskStatus(p); + return retValue; + } + + if (this.currentTaskTime >= this.currentTaskMaxTime) { + if (this.bbAction === "Infiltrate synthoids") { + bb.infiltrateSynthoidCommunities(); + this.currentTaskTime = 0; + return retValue; + } + + let type: string; + let name: string; + if (this.bbAction === "Take on Contracts") { + type = 'Contracts'; + name = this.bbContract; + } else { + type = 'General'; + name = this.bbAction; + } + + const actionIdent = bb.getActionIdFromTypeAndName(type, name); + if(actionIdent === null) { + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`) + this.resetTaskStatus(p); + return retValue; + } + + const action = bb.getActionObject(actionIdent); + if((action?.count ?? 0) > 0) { + const bbRetValue = bb.completeAction(p, this, actionIdent); + if(bbRetValue) { + retValue = this.gainExperience(p, bbRetValue); + this.gainMoney(p, bbRetValue); + + // Do not reset task to IDLE + this.currentTaskTime = 0; + return retValue; + } + } + } } - this.resetTaskStatus(); + this.resetTaskStatus(p); return retValue; } @@ -260,50 +320,56 @@ export class Sleeve extends Person { const pDexExp = exp.dex * multFac; const pAgiExp = exp.agi * multFac; const pChaExp = exp.cha * multFac; + const pIntExp = exp.int * multFac; // Experience is gained by both this sleeve and player if (pHackExp > 0) { - this.hacking_exp += pHackExp; + this.gainHackingExp(pHackExp); p.gainHackingExp(pHackExp); this.earningsForPlayer.hack += pHackExp; this.earningsForTask.hack += pHackExp; } if (pStrExp > 0) { - this.strength_exp += pStrExp; + this.gainStrengthExp(pStrExp); p.gainStrengthExp(pStrExp); this.earningsForPlayer.str += pStrExp; this.earningsForTask.str += pStrExp; } if (pDefExp > 0) { - this.defense_exp += pDefExp; + this.gainDefenseExp(pDefExp); p.gainDefenseExp(pDefExp); this.earningsForPlayer.def += pDefExp; this.earningsForTask.def += pDefExp; } if (pDexExp > 0) { - this.dexterity_exp += pDexExp; + this.gainDexterityExp(pDexExp); p.gainDexterityExp(pDexExp); this.earningsForPlayer.dex += pDexExp; this.earningsForTask.dex += pDexExp; } if (pAgiExp > 0) { - this.agility_exp += pAgiExp; + this.gainAgilityExp(pAgiExp); p.gainAgilityExp(pAgiExp); this.earningsForPlayer.agi += pAgiExp; this.earningsForTask.agi += pAgiExp; } if (pChaExp > 0) { - this.charisma_exp += pChaExp; + this.gainCharismaExp(pChaExp); p.gainCharismaExp(pChaExp); this.earningsForPlayer.cha += pChaExp; this.earningsForTask.cha += pChaExp; } + if (pIntExp > 0) { + this.gainIntelligenceExp(pIntExp); + p.gainIntelligenceExp(pIntExp); + } + // Record earnings for other sleeves this.earningsForSleeves.hack += pHackExp * (this.sync / 100); this.earningsForSleeves.str += pStrExp * (this.sync / 100); @@ -320,7 +386,8 @@ export class Sleeve extends Person { dex: pDexExp * (this.sync / 100), agi: pAgiExp * (this.sync / 100), cha: pChaExp * (this.sync / 100), - money: 0, + int: pIntExp * (this.sync / 100), + money: exp.money, }; } @@ -445,7 +512,7 @@ export class Sleeve extends Person { this.charisma_exp = 0; // Reset task-related stuff - this.resetTaskStatus(); + this.resetTaskStatus(p); this.earningsForSleeves = createTaskTracker(); this.earningsForPlayer = createTaskTracker(); this.shockRecovery(p); @@ -537,18 +604,18 @@ export class Sleeve extends Person { } case SleeveTaskType.Recovery: this.shock = Math.min(100, this.shock + 0.0002 * cyclesUsed); - if (this.shock >= 100) this.resetTaskStatus(); + if (this.shock >= 100) this.resetTaskStatus(p); break; case SleeveTaskType.Synchro: this.sync = Math.min(100, this.sync + p.getIntelligenceBonus(0.5) * 0.0002 * cyclesUsed); - if (this.sync >= 100) this.resetTaskStatus(); + if (this.sync >= 100) this.resetTaskStatus(p); break; default: break; } if (this.currentTaskMaxTime !== 0 && this.currentTaskTime >= this.currentTaskMaxTime) { - if (this.currentTask === SleeveTaskType.Crime) { + if (this.currentTask === SleeveTaskType.Crime || this.currentTask === SleeveTaskType.Bladeburner) { retValue = this.finishTask(p); } else { this.finishTask(p); @@ -565,7 +632,15 @@ export class Sleeve extends Person { /** * Resets all parameters used to keep information about the current task */ - resetTaskStatus(): void { + resetTaskStatus(p: IPlayer): void { + if (this.bbAction == 'Support main sleeve') { + p.bladeburner?.sleeveSupport(false); + } + if (this.currentTask == SleeveTaskType.Class) { + let retVal = createTaskTracker(); + retVal.int = CONSTANTS.IntelligenceClassBaseExpGain * Math.round(this.currentTaskTime / 1000); + this.gainExperience(p, retVal);//Wont be shared with other sleeves + } this.earningsForTask = createTaskTracker(); this.gainRatesForTask = createTaskTracker(); this.currentTask = SleeveTaskType.Idle; @@ -576,13 +651,15 @@ export class Sleeve extends Person { this.currentTaskLocation = ""; this.gymStatType = ""; this.className = ""; + this.bbAction = ""; + this.bbContract = ""; } shockRecovery(p: IPlayer): boolean { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } this.currentTask = SleeveTaskType.Recovery; @@ -593,7 +670,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } this.currentTask = SleeveTaskType.Synchro; @@ -607,7 +684,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } // Set exp/money multipliers based on which university. @@ -801,7 +878,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } const company: Company | null = Companies[companyName]; @@ -867,7 +944,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } const factionInfo = faction.getInfo(); @@ -918,7 +995,7 @@ export class Sleeve extends Person { if (this.currentTask !== SleeveTaskType.Idle) { this.finishTask(p); } else { - this.resetTaskStatus(); + this.resetTaskStatus(p); } // Set exp/money multipliers based on which university. @@ -986,6 +1063,151 @@ export class Sleeve extends Person { return true; } + /** + * Begin a bladeburner task + */ + bladeburner(p: IPlayer, action: string, contract: string): boolean { + if (this.currentTask !== SleeveTaskType.Idle) { + this.finishTask(p); + } else { + this.resetTaskStatus(p); + } + + this.gainRatesForTask.hack = 0; + this.gainRatesForTask.str = 0; + this.gainRatesForTask.def = 0; + this.gainRatesForTask.dex = 0; + this.gainRatesForTask.agi = 0; + this.gainRatesForTask.cha = 0; + this.gainRatesForTask.money = 0; + this.currentTaskLocation = ''; + + let time = 0; + switch (action) { + case "Field Analysis": + time = this.getBladeburnerActionTime(p, 'General', action); + this.gainRatesForTask.hack = 20 * this.hacking_exp_mult; + this.gainRatesForTask.cha = 20 * this.charisma_exp_mult; + break; + case "Recruitment": + time = this.getBladeburnerActionTime(p, 'General', action); + const recruitTime = p.bladeburner?.getRecruitmentTime(this) ?? 0 * 1000; + this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * recruitTime; + this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + '%'; + break; + case "Diplomacy": + time = this.getBladeburnerActionTime(p, 'General', action); + break; + case "Infiltrate synthoids": + time = 60000; + break; + case "Support main sleeve": + p.bladeburner?.sleeveSupport(true); + time = 0; + break; + case "Take on Contracts": + time = this.getBladeburnerActionTime(p, 'Contracts', contract); + this.contractGainRates(p, 'Contracts', contract); + this.currentTaskLocation = this.contractSuccessChance(p, 'Contracts', contract); + break; + } + + this.bbAction = action; + this.bbContract = contract; + this.currentTaskMaxTime = time; + this.currentTask = SleeveTaskType.Bladeburner; + return true; + } + + contractSuccessChance(p: IPlayer, type: string, name: string): string { + const bb = p.bladeburner; + if(bb === null){ + const errorLogText = `bladeburner is null`; + console.error(`Function: sleeves.contractSuccessChance; Message: '${errorLogText}'`) + return '0%'; + } + const chances = bb.getActionEstimatedSuccessChanceNetscriptFn(this, type, name); + if(typeof chances === 'string'){ + console.error(`Function: sleeves.contractSuccessChance; Message: '${chances}'`) + return '0%'; + } + if(chances[0] >= 1) { + return '100%'; + } else { + return `${chances[0]*100}% - ${chances[1]*100}%`; + } + } + + contractGainRates(p: IPlayer, type: string, name: string): void { + const bb = p.bladeburner; + if(bb === null){ + const errorLogText = `bladeburner is null`; + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + return; + } + const actionIdent = bb.getActionIdFromTypeAndName(type, name); + if(actionIdent === null) { + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + this.resetTaskStatus(p); + return; + } + const action = bb.getActionObject(actionIdent); + if(action === null) { + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + this.resetTaskStatus(p); + return; + } + const retValue = bb.getActionStats(action, true); + this.gainRatesForTask.hack = retValue.hack; + this.gainRatesForTask.str = retValue.str; + this.gainRatesForTask.def = retValue.def; + this.gainRatesForTask.dex = retValue.dex; + this.gainRatesForTask.agi = retValue.agi; + this.gainRatesForTask.cha = retValue.cha; + const rewardMultiplier = Math.pow(action.rewardFac, action.level - 1); + this.gainRatesForTask.money = BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * bb.skillMultipliers.money;; + } + + getBladeburnerActionTime(p: IPlayer, type: string, name: string): number{//Maybe find workerscript and use original + const bb = p.bladeburner; + if(bb === null){ + const errorLogText = `bladeburner is null`; + console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`) + return -1; + } + + const time = bb.getActionTimeNetscriptFn(this, type, name); + if(typeof time === 'string'){ + const errorLogText = `Invalid action: type='${type}' name='${name}'`; + console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`) + return -1; + } else { + return time; + } + } + + takeDamage(amt: number):boolean { + if (typeof amt !== "number") { + console.warn(`Player.takeDamage() called without a numeric argument: ${amt}`); + return false; + } + + this.hp -= amt; + if (this.hp <= 0) { + this.shock += 0.5; + this.hp = this.max_hp; + return true; + } else { + return false; + } + } + + whoAmI(): string { + return 'Sleeve'; + } + /** * Serialize the current object to a JSON save state. */ diff --git a/src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts b/src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts index 61f216d03..68881383f 100644 --- a/src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts +++ b/src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts @@ -9,6 +9,7 @@ export enum SleeveTaskType { Crime, Class, Gym, + Bladeburner, Recovery, Synchro, } diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index 5d73a762d..f45e7a0d5 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -40,7 +40,7 @@ export function SleeveElem(props: IProps): React.ReactElement { const [abc, setABC] = useState(["------", "------", "------"]); function setTask(): void { - props.sleeve.resetTaskStatus(); // sets to idle + props.sleeve.resetTaskStatus(player); // sets to idle switch (abc[0]) { case "------": break; @@ -59,6 +59,9 @@ export function SleeveElem(props: IProps): React.ReactElement { case "Workout at Gym": props.sleeve.workoutAtGym(player, abc[2], abc[1]); break; + case "Perform Bladeburner Actions": + props.sleeve.bladeburner(player, abc[1], abc[2]); + break; case "Shock Recovery": props.sleeve.shockRecovery(player); break; @@ -116,6 +119,13 @@ export function SleeveElem(props: IProps): React.ReactElement { case SleeveTaskType.Gym: desc = <>This sleeve is currently working out at {props.sleeve.currentTaskLocation}.; break; + case SleeveTaskType.Bladeburner: + let contract = ''; + if (props.sleeve.bbContract !== '------') { + contract = ` - ${props.sleeve.bbContract} (Success Rate: ${props.sleeve.currentTaskLocation})`; + } + desc = <>This sleeve is currently attempting to {props.sleeve.bbAction}{contract} + break; case SleeveTaskType.Recovery: desc = ( <> @@ -178,8 +188,10 @@ export function SleeveElem(props: IProps): React.ReactElement { {desc} - {props.sleeve.currentTask === SleeveTaskType.Crime && - createProgressBarText({ + {(props.sleeve.currentTask === SleeveTaskType.Crime + || props.sleeve.currentTask === SleeveTaskType.Bladeburner) + && props.sleeve.currentTaskMaxTime > 0 + && createProgressBarText({ progress: props.sleeve.currentTaskTime / props.sleeve.currentTaskMaxTime, totalTicks: 25, })} diff --git a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx index 70d5aac15..383a586e1 100644 --- a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx +++ b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx @@ -10,6 +10,7 @@ import { FactionWorkType } from "../../../Faction/FactionWorkTypeEnum"; import Select, { SelectChangeEvent } from "@mui/material/Select"; import MenuItem from "@mui/material/MenuItem"; import { FactionNames } from "../../../Faction/data/FactionNames"; +import { Contract } from "../../../Bladeburner/Contract"; const universitySelectorOptions: string[] = [ "Study Computer Science", @@ -22,6 +23,8 @@ const universitySelectorOptions: string[] = [ const gymSelectorOptions: string[] = ["Train Strength", "Train Defense", "Train Dexterity", "Train Agility"]; +const bladeburnerSelectorOptions: string[] = ["Field Analysis", "Recruitment", "Diplomacy", "Infiltrate synthoids", "Support main sleeve", "Take on Contracts"]; + interface IProps { sleeve: Sleeve; player: IPlayer; @@ -82,6 +85,27 @@ function possibleFactions(player: IPlayer, sleeve: Sleeve): string[] { }); } +function possibleContracts(player: IPlayer, sleeve: Sleeve): string[] { + const bb = player.bladeburner; + if(bb === null){ + return ["------"]; + } + let contracts = bb.getContractNamesNetscriptFn(); + for (const otherSleeve of player.sleeves) { + if (sleeve === otherSleeve) { + continue; + } + if (otherSleeve.currentTask === SleeveTaskType.Bladeburner + && otherSleeve.bbAction == 'Take on Contracts') { + contracts = contracts.filter(x => x != otherSleeve.bbContract); + } + } + if(contracts.length === 0){ + return ["------"]; + } + return contracts; +} + const tasks: { [key: string]: undefined | ((player: IPlayer, sleeve: Sleeve) => ITaskDetails); ["------"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; @@ -90,6 +114,7 @@ const tasks: { ["Commit Crime"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; ["Take University Course"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; ["Workout at Gym"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; + ["Perform Bladeburner Actions"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; ["Shock Recovery"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; ["Synchronize"]: (player: IPlayer, sleeve: Sleeve) => ITaskDetails; } = { @@ -166,6 +191,17 @@ const tasks: { return { first: gymSelectorOptions, second: () => gyms }; }, + "Perform Bladeburner Actions": (player: IPlayer, sleeve: Sleeve): ITaskDetails => { + return { + first: bladeburnerSelectorOptions, + second: (s1: string) => { + if(s1 === "Take on Contracts"){ + return possibleContracts(player, sleeve); + } else { + return ["------"]; + } + } }; + }, "Shock Recovery": (): ITaskDetails => { return { first: ["------"], second: () => ["------"] }; }, @@ -182,6 +218,7 @@ const canDo: { ["Commit Crime"]: (player: IPlayer, sleeve: Sleeve) => boolean; ["Take University Course"]: (player: IPlayer, sleeve: Sleeve) => boolean; ["Workout at Gym"]: (player: IPlayer, sleeve: Sleeve) => boolean; + ["Perform Bladeburner Actions"]: (player: IPlayer, sleeve: Sleeve) => boolean; ["Shock Recovery"]: (player: IPlayer, sleeve: Sleeve) => boolean; ["Synchronize"]: (player: IPlayer, sleeve: Sleeve) => boolean; } = { @@ -193,6 +230,7 @@ const canDo: { [CityName.Aevum, CityName.Sector12, CityName.Volhaven].includes(sleeve.city), "Workout at Gym": (player: IPlayer, sleeve: Sleeve) => [CityName.Aevum, CityName.Sector12, CityName.Volhaven].includes(sleeve.city), + "Perform Bladeburner Actions": (player: IPlayer, sleeve: Sleeve) => player.inBladeburner(), "Shock Recovery": (player: IPlayer, sleeve: Sleeve) => sleeve.shock < 100, Synchronize: (player: IPlayer, sleeve: Sleeve) => sleeve.sync < 100, }; @@ -224,6 +262,8 @@ function getABC(sleeve: Sleeve): [string, string, string] { return ["Take University Course", sleeve.className, sleeve.currentTaskLocation]; case SleeveTaskType.Gym: return ["Workout at Gym", sleeve.gymStatType, sleeve.currentTaskLocation]; + case SleeveTaskType.Bladeburner: + return ["Perform Bladeburner Actions", sleeve.bbAction, sleeve.bbContract]; case SleeveTaskType.Recovery: return ["Shock Recovery", "------", "------"]; case SleeveTaskType.Synchro: diff --git a/src/PersonObjects/Sleeve/ui/TravelModal.tsx b/src/PersonObjects/Sleeve/ui/TravelModal.tsx index 0883b1a8d..6bc4af1be 100644 --- a/src/PersonObjects/Sleeve/ui/TravelModal.tsx +++ b/src/PersonObjects/Sleeve/ui/TravelModal.tsx @@ -26,7 +26,7 @@ export function TravelModal(props: IProps): React.ReactElement { } props.sleeve.city = city as CityName; player.loseMoney(CONSTANTS.TravelCost, "sleeve"); - props.sleeve.resetTaskStatus(); + props.sleeve.resetTaskStatus(player); props.rerender(); props.onClose(); } From 04062729423f2de35d173236467f3644a8ec5dfe Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:57:01 -0400 Subject: [PATCH 02/17] Clean up linter --- src/Bladeburner/Bladeburner.tsx | 17 +++++++------ src/NetscriptFunctions/Bladeburner.ts | 4 ++-- src/PersonObjects/IPerson.ts | 8 +++---- src/PersonObjects/ITaskTracker.ts | 4 ++-- src/PersonObjects/Person.ts | 25 ++++++++++---------- src/PersonObjects/Sleeve/Sleeve.ts | 12 +++++----- src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 4 ++-- src/PersonObjects/Sleeve/ui/TaskSelector.tsx | 7 +++--- 8 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 7dee7aae3..8294114bd 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -38,7 +38,6 @@ import { WorkerScript } from "../Netscript/WorkerScript"; import { FactionNames } from "../Faction/data/FactionNames"; import { BlackOperationNames } from "./data/BlackOperationNames"; import { KEY } from "../utils/helpers/keyCodes"; -import { Player } from "src/Player"; interface BlackOpsAttempt { error?: string; @@ -1022,7 +1021,7 @@ export class Bladeburner implements IBladeburner { const unweightedGain = time * BladeburnerConstants.BaseStatGain * successMult * difficultyMult; const unweightedIntGain = time * BladeburnerConstants.BaseIntGain * successMult * difficultyMult; const skillMult = this.skillMultipliers.expGain; - + return { hack: unweightedGain * action.weights.hack * skillMult, str: unweightedGain * action.weights.str * skillMult, @@ -1136,7 +1135,7 @@ export class Bladeburner implements IBladeburner { const losses = getRandomInt(0, max); this.teamSize -= losses; if(this.teamSize < this.sleeveSize) { - let sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); + const sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ const r = Math.floor(Math.random() * sup.length); sup[r].takeDamage(sup[r].max_hp); @@ -1314,7 +1313,7 @@ export class Bladeburner implements IBladeburner { this.log(`${person.whoAmI()}: ` + action.name + " successfully completed! Gained " + formatNumber(gain, 3) + " rank"); } else if (!isOperation && this.logging.contracts) { this.log( - `${person.whoAmI()}: ` + + `${person.whoAmI()}: ` + action.name + " contract successfully completed! Gained " + formatNumber(gain, 3) + @@ -1422,7 +1421,7 @@ export class Bladeburner implements IBladeburner { if (this.logging.blackops) { this.log( - `${person.whoAmI()}: ` + + `${person.whoAmI()}: ` + action.name + " failed! Lost " + formatNumber(rankLoss, 1) + @@ -1440,7 +1439,7 @@ export class Bladeburner implements IBladeburner { const losses = getRandomInt(1, teamLossMax); this.teamSize -= losses; if(this.teamSize < this.sleeveSize) { - let sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); + const sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ const r = Math.floor(Math.random() * sup.length); sup[r].takeDamage(sup[r].max_hp); @@ -1472,7 +1471,7 @@ export class Bladeburner implements IBladeburner { this.staminaBonus += staminaGain; if (this.logging.general) { this.log( - `${person.whoAmI()}: ` + + `${person.whoAmI()}: ` + "Training completed. Gained: " + formatNumber(strExpGain, 1) + " str exp, " + @@ -1509,7 +1508,7 @@ export class Bladeburner implements IBladeburner { this.getCurrentCity().improvePopulationEstimateByPercentage(eff * this.skillMultipliers.successChanceEstimate); if (this.logging.general) { this.log( - `${person.whoAmI()}: ` + + `${person.whoAmI()}: ` + `Field analysis completed. Gained ${formatNumber(rankGain, 2)} rank, ` + `${formatNumber(hackingExpGain, 1)} hacking exp, and ` + `${formatNumber(charismaExpGain, 1)} charisma exp`, @@ -1655,7 +1654,7 @@ export class Bladeburner implements IBladeburner { this.actionTimeOverflow = 0; if (this.actionTimeCurrent >= this.actionTimeToComplete) { this.actionTimeOverflow = this.actionTimeCurrent - this.actionTimeToComplete; - let retValue = this.completeAction(player, player, this.action); + const retValue = this.completeAction(player, player, this.action); player.gainMoney(retValue.money, "bladeburner"); player.gainStats(retValue); // Operation Daedalus diff --git a/src/NetscriptFunctions/Bladeburner.ts b/src/NetscriptFunctions/Bladeburner.ts index 73ea9756a..e3bc2281e 100644 --- a/src/NetscriptFunctions/Bladeburner.ts +++ b/src/NetscriptFunctions/Bladeburner.ts @@ -137,7 +137,7 @@ export function NetscriptBladeburner( const bladeburner = player.bladeburner; if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { - let time = bladeburner.getActionTimeNetscriptFn(player, type, name); + const time = bladeburner.getActionTimeNetscriptFn(player, type, name); if(typeof time === 'string'){ const errorLogText = `Invalid action: type='${type}' name='${name}'`; workerScript.log("bladeburner.getActionTime", () => errorLogText); @@ -157,7 +157,7 @@ export function NetscriptBladeburner( const bladeburner = player.bladeburner; if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { - let chance = bladeburner.getActionEstimatedSuccessChanceNetscriptFn(player, type, name); + const chance = bladeburner.getActionEstimatedSuccessChanceNetscriptFn(player, type, name); if(typeof chance === 'string'){ const errorLogText = `Invalid action: type='${type}' name='${name}'`; workerScript.log("bladeburner.getActionTime", () => errorLogText); diff --git a/src/PersonObjects/IPerson.ts b/src/PersonObjects/IPerson.ts index ab51f85c0..fbafd3505 100644 --- a/src/PersonObjects/IPerson.ts +++ b/src/PersonObjects/IPerson.ts @@ -15,7 +15,7 @@ export interface IPerson { hp: number; max_hp: number; money: number; - + // Experience hacking_exp: number; strength_exp: number; @@ -24,7 +24,7 @@ export interface IPerson { agility_exp: number; charisma_exp: number; intelligence_exp: number; - + // Multipliers hacking_exp_mult: number; strength_exp_mult: number; @@ -46,7 +46,7 @@ export interface IPerson { crime_success_mult: number; bladeburner_analysis_mult: number; - + getIntelligenceBonus(weight: number): number; gainHackingExp(exp: number): void; gainStrengthExp(exp: number): void; @@ -61,4 +61,4 @@ export interface IPerson { regenerateHp: (amt: number) => void; queryStatFromString: (str: string) => number; whoAmI: () => string; - } \ No newline at end of file + } diff --git a/src/PersonObjects/ITaskTracker.ts b/src/PersonObjects/ITaskTracker.ts index 8b2d92efa..91bbad453 100644 --- a/src/PersonObjects/ITaskTracker.ts +++ b/src/PersonObjects/ITaskTracker.ts @@ -10,7 +10,7 @@ export interface ITaskTracker { int: number; money: number; } - + export function createTaskTracker(): ITaskTracker { return { hack: 0, @@ -22,4 +22,4 @@ export interface ITaskTracker { int: 0, money: 0, }; - } \ No newline at end of file + } diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 0bee0658a..3b87840af 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -89,6 +89,18 @@ export abstract class Person implements IPerson { */ city: CityName = CityName.Sector12; + gainHackingExp: (exp: number) => void; + gainStrengthExp: (exp: number) => void; + gainDefenseExp: (exp: number) => void; + gainDexterityExp: (exp: number) => void; + gainAgilityExp: (exp: number) => void; + gainCharismaExp: (exp: number) => void; + gainIntelligenceExp: (exp: number) => void; + gainStats: (retValue: ITaskTracker) => void; + calculateSkill: (exp: number, mult: number) => number; + regenerateHp: (amt: number) => void; + queryStatFromString: (str: string) => number; + /** * Updates this object's multipliers for the given augmentation */ @@ -226,17 +238,6 @@ export abstract class Person implements IPerson { abstract whoAmI(): string; - gainHackingExp: (exp: number) => void; - gainStrengthExp: (exp: number) => void; - gainDefenseExp: (exp: number) => void; - gainDexterityExp: (exp: number) => void; - gainAgilityExp: (exp: number) => void; - gainCharismaExp: (exp: number) => void; - gainIntelligenceExp: (exp: number) => void; - gainStats: (retValue: ITaskTracker) => void; - calculateSkill: (exp: number, mult: number) => number; - regenerateHp: (amt: number) => void; - queryStatFromString: (str: string) => number; constructor() { this.gainHackingExp = generalMethods.gainHackingExp; this.gainStrengthExp = generalMethods.gainStrengthExp; @@ -252,4 +253,4 @@ export abstract class Person implements IPerson { } } -Reviver.constructors.Person = Person; \ No newline at end of file +Reviver.constructors.Person = Person; diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 364e0f57f..6de0e5c49 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -189,7 +189,7 @@ export class Sleeve extends Person { */ finishTask(p: IPlayer): ITaskTracker { let retValue: ITaskTracker = createTaskTracker(); // Amount of exp to be gained by other sleeves - + if (this.currentTask === SleeveTaskType.Crime) { // For crimes, all experience and money is gained at the end if (this.currentTaskTime >= this.currentTaskMaxTime) { @@ -229,7 +229,7 @@ export class Sleeve extends Person { this.resetTaskStatus(p); return retValue; } - + if (this.currentTaskTime >= this.currentTaskMaxTime) { if (this.bbAction === "Infiltrate synthoids") { bb.infiltrateSynthoidCommunities(); @@ -637,7 +637,7 @@ export class Sleeve extends Person { p.bladeburner?.sleeveSupport(false); } if (this.currentTask == SleeveTaskType.Class) { - let retVal = createTaskTracker(); + const retVal = createTaskTracker(); retVal.int = CONSTANTS.IntelligenceClassBaseExpGain * Math.round(this.currentTaskTime / 1000); this.gainExperience(p, retVal);//Wont be shared with other sleeves } @@ -1091,7 +1091,7 @@ export class Sleeve extends Person { break; case "Recruitment": time = this.getBladeburnerActionTime(p, 'General', action); - const recruitTime = p.bladeburner?.getRecruitmentTime(this) ?? 0 * 1000; + const recruitTime = (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * recruitTime; this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + '%'; break; @@ -1167,7 +1167,7 @@ export class Sleeve extends Person { this.gainRatesForTask.agi = retValue.agi; this.gainRatesForTask.cha = retValue.cha; const rewardMultiplier = Math.pow(action.rewardFac, action.level - 1); - this.gainRatesForTask.money = BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * bb.skillMultipliers.money;; + this.gainRatesForTask.money = BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * bb.skillMultipliers.money; } getBladeburnerActionTime(p: IPlayer, type: string, name: string): number{//Maybe find workerscript and use original @@ -1177,7 +1177,7 @@ export class Sleeve extends Person { console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`) return -1; } - + const time = bb.getActionTimeNetscriptFn(this, type, name); if(typeof time === 'string'){ const errorLogText = `Invalid action: type='${type}' name='${name}'`; diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index 734d45522..ec288ff34 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -186,8 +186,8 @@ export function SleeveElem(props: IProps): React.ReactElement { {desc} - {(props.sleeve.currentTask === SleeveTaskType.Crime - || props.sleeve.currentTask === SleeveTaskType.Bladeburner) + {(props.sleeve.currentTask === SleeveTaskType.Crime + || props.sleeve.currentTask === SleeveTaskType.Bladeburner) && props.sleeve.currentTaskMaxTime > 0 && createProgressBarText({ progress: props.sleeve.currentTaskTime / props.sleeve.currentTaskMaxTime, diff --git a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx index 574115770..7d8086817 100644 --- a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx +++ b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx @@ -10,7 +10,6 @@ import { FactionWorkType } from "../../../Faction/FactionWorkTypeEnum"; import Select, { SelectChangeEvent } from "@mui/material/Select"; import MenuItem from "@mui/material/MenuItem"; import { FactionNames } from "../../../Faction/data/FactionNames"; -import { Contract } from "../../../Bladeburner/Contract"; const universitySelectorOptions: string[] = [ "Study Computer Science", @@ -95,7 +94,7 @@ function possibleContracts(player: IPlayer, sleeve: Sleeve): string[] { if (sleeve === otherSleeve) { continue; } - if (otherSleeve.currentTask === SleeveTaskType.Bladeburner + if (otherSleeve.currentTask === SleeveTaskType.Bladeburner && otherSleeve.bbAction == 'Take on Contracts') { contracts = contracts.filter(x => x != otherSleeve.bbContract); } @@ -192,8 +191,8 @@ const tasks: { return { first: gymSelectorOptions, second: () => gyms }; }, "Perform Bladeburner Actions": (player: IPlayer, sleeve: Sleeve): ITaskDetails => { - return { - first: bladeburnerSelectorOptions, + return { + first: bladeburnerSelectorOptions, second: (s1: string) => { if(s1 === "Take on Contracts"){ return possibleContracts(player, sleeve); From 3886e31a45d5941b95a863ea150b14a2ba1ac186 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:59:49 -0400 Subject: [PATCH 03/17] Format --- src/Bladeburner/Bladeburner.tsx | 92 ++++++++++++++++++++------------- src/Bladeburner/IBladeburner.ts | 8 +-- 2 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 66d0ef2db..4dd630242 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -1030,7 +1030,7 @@ export class Bladeburner implements IBladeburner { cha: unweightedGain * action.weights.cha * skillMult, int: unweightedIntGain * action.weights.int * skillMult, money: 0, - } + }; } getDiplomacyEffectiveness(person: IPerson): number { @@ -1053,7 +1053,7 @@ export class Bladeburner implements IBladeburner { } sleeveSupport(joining: boolean): void { - if(joining){ + if (joining) { this.sleeveSize += 1; this.teamSize += 1; } else { @@ -1133,9 +1133,9 @@ export class Bladeburner implements IBladeburner { } const losses = getRandomInt(0, max); this.teamSize -= losses; - if(this.teamSize < this.sleeveSize) { - const sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); - for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ + if (this.teamSize < this.sleeveSize) { + const sup = player.sleeves.filter((x) => x.bbAction == "Support main sleeve"); + for (let i = 0; i > this.teamSize - this.sleeveSize; i--) { const r = Math.floor(Math.random() * sup.length); sup[r].takeDamage(sup[r].max_hp); sup.splice(r, 1); @@ -1309,11 +1309,17 @@ export class Bladeburner implements IBladeburner { const gain = addOffset(action.rankGain * rewardMultiplier * BitNodeMultipliers.BladeburnerRank, 10); this.changeRank(person, gain); if (isOperation && this.logging.ops) { - this.log(`${person.whoAmI()}: ` + action.name + " successfully completed! Gained " + formatNumber(gain, 3) + " rank"); + this.log( + `${person.whoAmI()}: ` + + action.name + + " successfully completed! Gained " + + formatNumber(gain, 3) + + " rank", + ); } else if (!isOperation && this.logging.contracts) { this.log( `${person.whoAmI()}: ` + - action.name + + action.name + " contract successfully completed! Gained " + formatNumber(gain, 3) + " rank and " + @@ -1397,7 +1403,9 @@ export class Bladeburner implements IBladeburner { teamLossMax = Math.ceil(teamCount / 2); if (this.logging.blackops) { - this.log(`${person.whoAmI()}: ` + action.name + " successful! Gained " + formatNumber(rankGain, 1) + " rank"); + this.log( + `${person.whoAmI()}: ` + action.name + " successful! Gained " + formatNumber(rankGain, 1) + " rank", + ); } } else { retValue = this.getActionStats(action, false); @@ -1421,7 +1429,7 @@ export class Bladeburner implements IBladeburner { if (this.logging.blackops) { this.log( `${person.whoAmI()}: ` + - action.name + + action.name + " failed! Lost " + formatNumber(rankLoss, 1) + " rank and took " + @@ -1437,9 +1445,9 @@ export class Bladeburner implements IBladeburner { if (teamCount >= 1) { const losses = getRandomInt(1, teamLossMax); this.teamSize -= losses; - if(this.teamSize < this.sleeveSize) { - const sup = player.sleeves.filter(x => x.bbAction == 'Support main sleeve'); - for(let i = 0; i > (this.teamSize-this.sleeveSize); i--){ + if (this.teamSize < this.sleeveSize) { + const sup = player.sleeves.filter((x) => x.bbAction == "Support main sleeve"); + for (let i = 0; i > this.teamSize - this.sleeveSize; i--) { const r = Math.floor(Math.random() * sup.length); sup[r].takeDamage(sup[r].max_hp); sup.splice(r, 1); @@ -1448,7 +1456,9 @@ export class Bladeburner implements IBladeburner { } this.teamLost += losses; if (this.logging.blackops) { - this.log(`${person.whoAmI()}: ` + "You lost " + formatNumber(losses, 0) + " team members during " + action.name); + this.log( + `${person.whoAmI()}: ` + "You lost " + formatNumber(losses, 0) + " team members during " + action.name, + ); } } } catch (e: any) { @@ -1471,7 +1481,7 @@ export class Bladeburner implements IBladeburner { if (this.logging.general) { this.log( `${person.whoAmI()}: ` + - "Training completed. Gained: " + + "Training completed. Gained: " + formatNumber(strExpGain, 1) + " str exp, " + formatNumber(defExpGain, 1) + @@ -1508,7 +1518,7 @@ export class Bladeburner implements IBladeburner { if (this.logging.general) { this.log( `${person.whoAmI()}: ` + - `Field analysis completed. Gained ${formatNumber(rankGain, 2)} rank, ` + + `Field analysis completed. Gained ${formatNumber(rankGain, 2)} rank, ` + `${formatNumber(hackingExpGain, 1)} hacking exp, and ` + `${formatNumber(charismaExpGain, 1)} charisma exp`, ); @@ -1523,13 +1533,23 @@ export class Bladeburner implements IBladeburner { retValue.cha = expGain; ++this.teamSize; if (this.logging.general) { - this.log(`${person.whoAmI()}: ` + "Successfully recruited a team member! Gained " + formatNumber(expGain, 1) + " charisma exp"); + this.log( + `${person.whoAmI()}: ` + + "Successfully recruited a team member! Gained " + + formatNumber(expGain, 1) + + " charisma exp", + ); } } else { const expGain = BladeburnerConstants.BaseStatGain * recruitTime; retValue.cha = expGain; if (this.logging.general) { - this.log(`${person.whoAmI()}: ` + "Failed to recruit a team member. Gained " + formatNumber(expGain, 1) + " charisma exp"); + this.log( + `${person.whoAmI()}: ` + + "Failed to recruit a team member. Gained " + + formatNumber(expGain, 1) + + " charisma exp", + ); } } break; @@ -1542,7 +1562,9 @@ export class Bladeburner implements IBladeburner { } if (this.logging.general) { this.log( - `${person.whoAmI()}: Diplomacy completed. Chaos levels in the current city fell by ${numeralWrapper.formatPercentage(1 - eff)}`, + `${person.whoAmI()}: Diplomacy completed. Chaos levels in the current city fell by ${numeralWrapper.formatPercentage( + 1 - eff, + )}`, ); } break; @@ -1590,15 +1612,15 @@ export class Bladeburner implements IBladeburner { } infiltrateSynthoidCommunities(): void { - for (const contract of Object.keys(this.contracts)) { - this.contracts[contract].count += 1; - } - for (const operation of Object.keys(this.operations)) { - this.operations[operation].count += 1; - } - if (this.logging.general) { - this.log(`Sleeve: Infiltrate the synthoid communities.`); - } + for (const contract of Object.keys(this.contracts)) { + this.contracts[contract].count += 1; + } + for (const operation of Object.keys(this.operations)) { + this.operations[operation].count += 1; + } + if (this.logging.general) { + this.log(`Sleeve: Infiltrate the synthoid communities.`); + } } changeRank(person: IPerson, change: number): void { @@ -1663,7 +1685,7 @@ export class Bladeburner implements IBladeburner { } else if (action.name === BlackOperationNames.OperationDaedalus && this.blackops[action.name]) { this.resetAction(); router.toBitVerse(false, false); - } else if(this.action.type != ActionTypes["BlackOperation"] && this.action.type != ActionTypes["BlackOp"]) { + } else if (this.action.type != ActionTypes["BlackOperation"] && this.action.type != ActionTypes["BlackOp"]) { this.startAction(player, this.action); // Repeat action } } @@ -2144,7 +2166,7 @@ export class Bladeburner implements IBladeburner { } } - getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number|string { + getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number | string { const actionId = this.getActionIdFromTypeAndName(type, name); if (actionId == null) { return "bladeburner.getActionTime"; @@ -2175,11 +2197,7 @@ export class Bladeburner implements IBladeburner { } } - getActionEstimatedSuccessChanceNetscriptFn( - person: IPerson, - type: string, - name: string, - ): [number, number]|string { + getActionEstimatedSuccessChanceNetscriptFn(person: IPerson, type: string, name: string): [number, number] | string { const actionId = this.getActionIdFromTypeAndName(type, name); if (actionId == null) { return "bladeburner.getActionEstimatedSuccessChance"; @@ -2203,9 +2221,9 @@ export class Bladeburner implements IBladeburner { case ActionTypes["Incite Violence"]: return [1, 1]; case ActionTypes["Recruitment"]: { - const recChance = this.getRecruitmentSuccessChance(person); - return [recChance, recChance]; - } + const recChance = this.getRecruitmentSuccessChance(person); + return [recChance, recChance]; + } default: return "bladeburner.getActionEstimatedSuccessChance"; } diff --git a/src/Bladeburner/IBladeburner.ts b/src/Bladeburner/IBladeburner.ts index f757f9d66..65ecff71c 100644 --- a/src/Bladeburner/IBladeburner.ts +++ b/src/Bladeburner/IBladeburner.ts @@ -72,12 +72,8 @@ export interface IBladeburner { getGeneralActionNamesNetscriptFn(): string[]; getSkillNamesNetscriptFn(): string[]; startActionNetscriptFn(player: IPlayer, type: string, name: string, workerScript: WorkerScript): boolean; - getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number|string; - getActionEstimatedSuccessChanceNetscriptFn( - person: IPerson, - type: string, - name: string, - ): [number, number]|string; + getActionTimeNetscriptFn(person: IPerson, type: string, name: string): number | string; + getActionEstimatedSuccessChanceNetscriptFn(person: IPerson, type: string, name: string): [number, number] | string; getActionCountRemainingNetscriptFn(type: string, name: string, workerScript: WorkerScript): number; getSkillLevelNetscriptFn(skillName: string, workerScript: WorkerScript): number; getSkillUpgradeCostNetscriptFn(skillName: string, workerScript: WorkerScript): number; From 9d181182084e71cd7f1cd5604fa4717692774f69 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 12:00:17 -0400 Subject: [PATCH 04/17] Format, but git forgot this last time --- src/NetscriptFunctions/Bladeburner.ts | 4 +- src/PersonObjects/IPerson.ts | 104 +++++++++---------- src/PersonObjects/ITaskTracker.ts | 42 ++++---- src/PersonObjects/Player/PlayerObject.ts | 4 +- src/PersonObjects/Sleeve/Sleeve.ts | 82 ++++++++------- src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 19 ++-- src/PersonObjects/Sleeve/ui/TaskSelector.tsx | 23 ++-- 7 files changed, 146 insertions(+), 132 deletions(-) diff --git a/src/NetscriptFunctions/Bladeburner.ts b/src/NetscriptFunctions/Bladeburner.ts index e3bc2281e..8d9598496 100644 --- a/src/NetscriptFunctions/Bladeburner.ts +++ b/src/NetscriptFunctions/Bladeburner.ts @@ -138,7 +138,7 @@ export function NetscriptBladeburner( if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { const time = bladeburner.getActionTimeNetscriptFn(player, type, name); - if(typeof time === 'string'){ + if (typeof time === "string") { const errorLogText = `Invalid action: type='${type}' name='${name}'`; workerScript.log("bladeburner.getActionTime", () => errorLogText); return -1; @@ -158,7 +158,7 @@ export function NetscriptBladeburner( if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); try { const chance = bladeburner.getActionEstimatedSuccessChanceNetscriptFn(player, type, name); - if(typeof chance === 'string'){ + if (typeof chance === "string") { const errorLogText = `Invalid action: type='${type}' name='${name}'`; workerScript.log("bladeburner.getActionTime", () => errorLogText); return [-1, -1]; diff --git a/src/PersonObjects/IPerson.ts b/src/PersonObjects/IPerson.ts index fbafd3505..25cb9b9cc 100644 --- a/src/PersonObjects/IPerson.ts +++ b/src/PersonObjects/IPerson.ts @@ -4,61 +4,61 @@ import { ITaskTracker } from "./ITaskTracker"; export interface IPerson { - // Stats - hacking: number; - strength: number; - defense: number; - dexterity: number; - agility: number; - charisma: number; - intelligence: number; - hp: number; - max_hp: number; - money: number; + // Stats + hacking: number; + strength: number; + defense: number; + dexterity: number; + agility: number; + charisma: number; + intelligence: number; + hp: number; + max_hp: number; + money: number; - // Experience - hacking_exp: number; - strength_exp: number; - defense_exp: number; - dexterity_exp: number; - agility_exp: number; - charisma_exp: number; - intelligence_exp: number; + // Experience + hacking_exp: number; + strength_exp: number; + defense_exp: number; + dexterity_exp: number; + agility_exp: number; + charisma_exp: number; + intelligence_exp: number; - // Multipliers - hacking_exp_mult: number; - strength_exp_mult: number; - defense_exp_mult: number; - dexterity_exp_mult: number; - agility_exp_mult: number; - charisma_exp_mult: number; - hacking_mult: number; - strength_mult: number; - defense_mult: number; - dexterity_mult: number; - agility_mult: number; - charisma_mult: number; + // Multipliers + hacking_exp_mult: number; + strength_exp_mult: number; + defense_exp_mult: number; + dexterity_exp_mult: number; + agility_exp_mult: number; + charisma_exp_mult: number; + hacking_mult: number; + strength_mult: number; + defense_mult: number; + dexterity_mult: number; + agility_mult: number; + charisma_mult: number; - company_rep_mult: number; - faction_rep_mult: number; + company_rep_mult: number; + faction_rep_mult: number; - crime_money_mult: number; - crime_success_mult: number; + crime_money_mult: number; + crime_success_mult: number; - bladeburner_analysis_mult: number; + bladeburner_analysis_mult: number; - getIntelligenceBonus(weight: number): number; - gainHackingExp(exp: number): void; - gainStrengthExp(exp: number): void; - gainDefenseExp(exp: number): void; - gainDexterityExp(exp: number): void; - gainAgilityExp(exp: number): void; - gainCharismaExp(exp: number): void; - gainIntelligenceExp(exp: number): void; - gainStats(retValue: ITaskTracker): void; - calculateSkill(exp: number, mult?: number): number; - takeDamage(amt: number): boolean; - regenerateHp: (amt: number) => void; - queryStatFromString: (str: string) => number; - whoAmI: () => string; - } + getIntelligenceBonus(weight: number): number; + gainHackingExp(exp: number): void; + gainStrengthExp(exp: number): void; + gainDefenseExp(exp: number): void; + gainDexterityExp(exp: number): void; + gainAgilityExp(exp: number): void; + gainCharismaExp(exp: number): void; + gainIntelligenceExp(exp: number): void; + gainStats(retValue: ITaskTracker): void; + calculateSkill(exp: number, mult?: number): number; + takeDamage(amt: number): boolean; + regenerateHp: (amt: number) => void; + queryStatFromString: (str: string) => number; + whoAmI: () => string; +} diff --git a/src/PersonObjects/ITaskTracker.ts b/src/PersonObjects/ITaskTracker.ts index 91bbad453..f6acc8799 100644 --- a/src/PersonObjects/ITaskTracker.ts +++ b/src/PersonObjects/ITaskTracker.ts @@ -1,25 +1,25 @@ // Interface that defines a generic object used to track experience/money // earnings for tasks export interface ITaskTracker { - hack: number; - str: number; - def: number; - dex: number; - agi: number; - cha: number; - int: number; - money: number; - } + hack: number; + str: number; + def: number; + dex: number; + agi: number; + cha: number; + int: number; + money: number; +} - export function createTaskTracker(): ITaskTracker { - return { - hack: 0, - str: 0, - def: 0, - dex: 0, - agi: 0, - cha: 0, - int: 0, - money: 0, - }; - } +export function createTaskTracker(): ITaskTracker { + return { + hack: 0, + str: 0, + def: 0, + dex: 0, + agi: 0, + cha: 0, + int: 0, + money: 0, + }; +} diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts index fec5ae596..b2c089c6b 100644 --- a/src/PersonObjects/Player/PlayerObject.ts +++ b/src/PersonObjects/Player/PlayerObject.ts @@ -304,8 +304,8 @@ export class PlayerObject implements IPlayer { graftAugmentationWork: (numCycles: number) => boolean; finishGraftAugmentationWork: (cancelled: boolean) => string; applyEntropy: (stacks?: number) => void; - whoAmI(): string{ - return 'Player'; + whoAmI(): string { + return "Player"; } constructor() { diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 6de0e5c49..9d80e01e2 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -225,7 +225,7 @@ export class Sleeve extends Person { const bb = p.bladeburner; if (bb === null) { const errorLogText = `bladeburner is null`; - console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`) + console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`); this.resetTaskStatus(p); return retValue; } @@ -240,25 +240,25 @@ export class Sleeve extends Person { let type: string; let name: string; if (this.bbAction === "Take on Contracts") { - type = 'Contracts'; + type = "Contracts"; name = this.bbContract; } else { - type = 'General'; + type = "General"; name = this.bbAction; } const actionIdent = bb.getActionIdFromTypeAndName(type, name); - if(actionIdent === null) { + if (actionIdent === null) { const errorLogText = `Invalid action: type='${type}' name='${name}'`; - console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`) + console.error(`Function: sleeves.finishTask; Message: '${errorLogText}'`); this.resetTaskStatus(p); return retValue; } const action = bb.getActionObject(actionIdent); - if((action?.count ?? 0) > 0) { + if ((action?.count ?? 0) > 0) { const bbRetValue = bb.completeAction(p, this, actionIdent); - if(bbRetValue) { + if (bbRetValue) { retValue = this.gainExperience(p, bbRetValue); this.gainMoney(p, bbRetValue); @@ -633,13 +633,13 @@ export class Sleeve extends Person { * Resets all parameters used to keep information about the current task */ resetTaskStatus(p: IPlayer): void { - if (this.bbAction == 'Support main sleeve') { + if (this.bbAction == "Support main sleeve") { p.bladeburner?.sleeveSupport(false); } if (this.currentTask == SleeveTaskType.Class) { const retVal = createTaskTracker(); retVal.int = CONSTANTS.IntelligenceClassBaseExpGain * Math.round(this.currentTaskTime / 1000); - this.gainExperience(p, retVal);//Wont be shared with other sleeves + this.gainExperience(p, retVal); //Wont be shared with other sleeves } this.earningsForTask = createTaskTracker(); this.gainRatesForTask = createTaskTracker(); @@ -1080,23 +1080,23 @@ export class Sleeve extends Person { this.gainRatesForTask.agi = 0; this.gainRatesForTask.cha = 0; this.gainRatesForTask.money = 0; - this.currentTaskLocation = ''; + this.currentTaskLocation = ""; let time = 0; switch (action) { case "Field Analysis": - time = this.getBladeburnerActionTime(p, 'General', action); + time = this.getBladeburnerActionTime(p, "General", action); this.gainRatesForTask.hack = 20 * this.hacking_exp_mult; this.gainRatesForTask.cha = 20 * this.charisma_exp_mult; break; case "Recruitment": - time = this.getBladeburnerActionTime(p, 'General', action); + time = this.getBladeburnerActionTime(p, "General", action); const recruitTime = (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * recruitTime; - this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + '%'; + this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + "%"; break; case "Diplomacy": - time = this.getBladeburnerActionTime(p, 'General', action); + time = this.getBladeburnerActionTime(p, "General", action); break; case "Infiltrate synthoids": time = 60000; @@ -1106,9 +1106,9 @@ export class Sleeve extends Person { time = 0; break; case "Take on Contracts": - time = this.getBladeburnerActionTime(p, 'Contracts', contract); - this.contractGainRates(p, 'Contracts', contract); - this.currentTaskLocation = this.contractSuccessChance(p, 'Contracts', contract); + time = this.getBladeburnerActionTime(p, "Contracts", contract); + this.contractGainRates(p, "Contracts", contract); + this.currentTaskLocation = this.contractSuccessChance(p, "Contracts", contract); break; } @@ -1121,41 +1121,41 @@ export class Sleeve extends Person { contractSuccessChance(p: IPlayer, type: string, name: string): string { const bb = p.bladeburner; - if(bb === null){ + if (bb === null) { const errorLogText = `bladeburner is null`; - console.error(`Function: sleeves.contractSuccessChance; Message: '${errorLogText}'`) - return '0%'; + console.error(`Function: sleeves.contractSuccessChance; Message: '${errorLogText}'`); + return "0%"; } const chances = bb.getActionEstimatedSuccessChanceNetscriptFn(this, type, name); - if(typeof chances === 'string'){ - console.error(`Function: sleeves.contractSuccessChance; Message: '${chances}'`) - return '0%'; + if (typeof chances === "string") { + console.error(`Function: sleeves.contractSuccessChance; Message: '${chances}'`); + return "0%"; } - if(chances[0] >= 1) { - return '100%'; + if (chances[0] >= 1) { + return "100%"; } else { - return `${chances[0]*100}% - ${chances[1]*100}%`; + return `${chances[0] * 100}% - ${chances[1] * 100}%`; } } contractGainRates(p: IPlayer, type: string, name: string): void { const bb = p.bladeburner; - if(bb === null){ + if (bb === null) { const errorLogText = `bladeburner is null`; - console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`); return; } const actionIdent = bb.getActionIdFromTypeAndName(type, name); - if(actionIdent === null) { + if (actionIdent === null) { const errorLogText = `Invalid action: type='${type}' name='${name}'`; - console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`); this.resetTaskStatus(p); return; } const action = bb.getActionObject(actionIdent); - if(action === null) { + if (action === null) { const errorLogText = `Invalid action: type='${type}' name='${name}'`; - console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`) + console.error(`Function: sleeves.contractGainRates; Message: '${errorLogText}'`); this.resetTaskStatus(p); return; } @@ -1167,28 +1167,30 @@ export class Sleeve extends Person { this.gainRatesForTask.agi = retValue.agi; this.gainRatesForTask.cha = retValue.cha; const rewardMultiplier = Math.pow(action.rewardFac, action.level - 1); - this.gainRatesForTask.money = BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * bb.skillMultipliers.money; + this.gainRatesForTask.money = + BladeburnerConstants.ContractBaseMoneyGain * rewardMultiplier * bb.skillMultipliers.money; } - getBladeburnerActionTime(p: IPlayer, type: string, name: string): number{//Maybe find workerscript and use original + getBladeburnerActionTime(p: IPlayer, type: string, name: string): number { + //Maybe find workerscript and use original const bb = p.bladeburner; - if(bb === null){ + if (bb === null) { const errorLogText = `bladeburner is null`; - console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`) + console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`); return -1; } const time = bb.getActionTimeNetscriptFn(this, type, name); - if(typeof time === 'string'){ + if (typeof time === "string") { const errorLogText = `Invalid action: type='${type}' name='${name}'`; - console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`) + console.error(`Function: sleeves.getBladeburnerActionTime; Message: '${errorLogText}'`); return -1; } else { return time; } } - takeDamage(amt: number):boolean { + takeDamage(amt: number): boolean { if (typeof amt !== "number") { console.warn(`Player.takeDamage() called without a numeric argument: ${amt}`); return false; @@ -1205,7 +1207,7 @@ export class Sleeve extends Person { } whoAmI(): string { - return 'Sleeve'; + return "Sleeve"; } /** diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index ec288ff34..355f17f43 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -114,11 +114,16 @@ export function SleeveElem(props: IProps): React.ReactElement { desc = <>This sleeve is currently working out at {props.sleeve.currentTaskLocation}.; break; case SleeveTaskType.Bladeburner: - let contract = ''; - if (props.sleeve.bbContract !== '------') { + let contract = ""; + if (props.sleeve.bbContract !== "------") { contract = ` - ${props.sleeve.bbContract} (Success Rate: ${props.sleeve.currentTaskLocation})`; } - desc = <>This sleeve is currently attempting to {props.sleeve.bbAction}{contract} + desc = ( + <> + This sleeve is currently attempting to {props.sleeve.bbAction} + {contract} + + ); break; case SleeveTaskType.Recovery: desc = ( @@ -186,10 +191,10 @@ export function SleeveElem(props: IProps): React.ReactElement { {desc} - {(props.sleeve.currentTask === SleeveTaskType.Crime - || props.sleeve.currentTask === SleeveTaskType.Bladeburner) - && props.sleeve.currentTaskMaxTime > 0 - && createProgressBarText({ + {(props.sleeve.currentTask === SleeveTaskType.Crime || + props.sleeve.currentTask === SleeveTaskType.Bladeburner) && + props.sleeve.currentTaskMaxTime > 0 && + createProgressBarText({ progress: props.sleeve.currentTaskTime / props.sleeve.currentTaskMaxTime, totalTicks: 25, })} diff --git a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx index 7d8086817..0e81213f5 100644 --- a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx +++ b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx @@ -22,7 +22,14 @@ const universitySelectorOptions: string[] = [ const gymSelectorOptions: string[] = ["Train Strength", "Train Defense", "Train Dexterity", "Train Agility"]; -const bladeburnerSelectorOptions: string[] = ["Field Analysis", "Recruitment", "Diplomacy", "Infiltrate synthoids", "Support main sleeve", "Take on Contracts"]; +const bladeburnerSelectorOptions: string[] = [ + "Field Analysis", + "Recruitment", + "Diplomacy", + "Infiltrate synthoids", + "Support main sleeve", + "Take on Contracts", +]; interface IProps { sleeve: Sleeve; @@ -86,7 +93,7 @@ function possibleFactions(player: IPlayer, sleeve: Sleeve): string[] { function possibleContracts(player: IPlayer, sleeve: Sleeve): string[] { const bb = player.bladeburner; - if(bb === null){ + if (bb === null) { return ["------"]; } let contracts = bb.getContractNamesNetscriptFn(); @@ -94,12 +101,11 @@ function possibleContracts(player: IPlayer, sleeve: Sleeve): string[] { if (sleeve === otherSleeve) { continue; } - if (otherSleeve.currentTask === SleeveTaskType.Bladeburner - && otherSleeve.bbAction == 'Take on Contracts') { - contracts = contracts.filter(x => x != otherSleeve.bbContract); + if (otherSleeve.currentTask === SleeveTaskType.Bladeburner && otherSleeve.bbAction == "Take on Contracts") { + contracts = contracts.filter((x) => x != otherSleeve.bbContract); } } - if(contracts.length === 0){ + if (contracts.length === 0) { return ["------"]; } return contracts; @@ -194,12 +200,13 @@ const tasks: { return { first: bladeburnerSelectorOptions, second: (s1: string) => { - if(s1 === "Take on Contracts"){ + if (s1 === "Take on Contracts") { return possibleContracts(player, sleeve); } else { return ["------"]; } - } }; + }, + }; }, "Shock Recovery": (): ITaskDetails => { return { first: ["------"], second: () => ["------"] }; From 332b8033327adb3ec4ae32a79bb5c07a5121aa4d Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 15:28:13 -0400 Subject: [PATCH 05/17] Fmt and lint --- src/Bladeburner/Bladeburner.tsx | 6 +- src/PersonObjects/Person.ts | 203 ++++++++++++------ src/PersonObjects/Player/PlayerObject.ts | 7 +- .../Player/PlayerObjectGeneralMethods.tsx | 4 +- src/PersonObjects/Sleeve/Sleeve.ts | 4 +- src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 3 +- src/PersonObjects/Sleeve/ui/TaskSelector.tsx | 2 +- 7 files changed, 154 insertions(+), 75 deletions(-) diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 4dd630242..b7fa6664e 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -1456,9 +1456,7 @@ export class Bladeburner implements IBladeburner { } this.teamLost += losses; if (this.logging.blackops) { - this.log( - `${person.whoAmI()}: ` + "You lost " + formatNumber(losses, 0) + " team members during " + action.name, - ); + this.log(`${person.whoAmI()}: You lost ${formatNumber(losses, 0)} team members during ${action.name}`); } } } catch (e: any) { @@ -1595,7 +1593,7 @@ export class Bladeburner implements IBladeburner { this.operations[operation].count += (60 * 3 * growthF()) / BladeburnerConstants.ActionCountGrowthPeriod; } if (this.logging.general) { - this.log(`${person.whoAmI()}: ` + `Incited violence in the synthoid communities.`); + this.log(`${person.whoAmI()}: Incited violence in the synthoid communities.`); } for (const cityName of Object.keys(this.cities)) { const city = this.cities[cityName]; diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 3b87840af..70daf5ba2 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -15,74 +15,74 @@ export abstract class Person implements IPerson { /** * Stats */ - hacking = 1; - strength = 1; - defense = 1; - dexterity = 1; - agility = 1; - charisma = 1; - intelligence = 1; - hp = 10; - max_hp = 10; - money = 0; + hacking; + strength; + defense; + dexterity; + agility; + charisma; + intelligence; + hp; + max_hp; + money; /** * Experience */ - hacking_exp = 0; - strength_exp = 0; - defense_exp = 0; - dexterity_exp = 0; - agility_exp = 0; - charisma_exp = 0; - intelligence_exp = 0; + hacking_exp; + strength_exp; + defense_exp; + dexterity_exp; + agility_exp; + charisma_exp; + intelligence_exp; /** * Multipliers */ - hacking_mult = 1; - strength_mult = 1; - defense_mult = 1; - dexterity_mult = 1; - agility_mult = 1; - charisma_mult = 1; + hacking_mult; + strength_mult; + defense_mult; + dexterity_mult; + agility_mult; + charisma_mult; - hacking_exp_mult = 1; - strength_exp_mult = 1; - defense_exp_mult = 1; - dexterity_exp_mult = 1; - agility_exp_mult = 1; - charisma_exp_mult = 1; + hacking_exp_mult; + strength_exp_mult; + defense_exp_mult; + dexterity_exp_mult; + agility_exp_mult; + charisma_exp_mult; - hacking_chance_mult = 1; - hacking_speed_mult = 1; - hacking_money_mult = 1; - hacking_grow_mult = 1; + hacking_chance_mult; + hacking_speed_mult; + hacking_money_mult; + hacking_grow_mult; - company_rep_mult = 1; - faction_rep_mult = 1; + company_rep_mult; + faction_rep_mult; - crime_money_mult = 1; - crime_success_mult = 1; + crime_money_mult; + crime_success_mult; - work_money_mult = 1; + work_money_mult; - hacknet_node_money_mult = 1; - hacknet_node_purchase_cost_mult = 1; - hacknet_node_ram_cost_mult = 1; - hacknet_node_core_cost_mult = 1; - hacknet_node_level_cost_mult = 1; + hacknet_node_money_mult; + hacknet_node_purchase_cost_mult; + hacknet_node_ram_cost_mult; + hacknet_node_core_cost_mult; + hacknet_node_level_cost_mult; - bladeburner_max_stamina_mult = 1; - bladeburner_stamina_gain_mult = 1; - bladeburner_analysis_mult = 1; - bladeburner_success_chance_mult = 1; + bladeburner_max_stamina_mult; + bladeburner_stamina_gain_mult; + bladeburner_analysis_mult; + bladeburner_success_chance_mult; /** * Augmentations */ - augmentations: IPlayerOwnedAugmentation[] = []; - queuedAugmentations: IPlayerOwnedAugmentation[] = []; + augmentations: IPlayerOwnedAugmentation[]; + queuedAugmentations: IPlayerOwnedAugmentation[]; /** * City that the person is in @@ -101,6 +101,97 @@ export abstract class Person implements IPerson { regenerateHp: (amt: number) => void; queryStatFromString: (str: string) => number; + constructor() { + /** + * Stats + */ + this.hacking = 1; + this.strength = 1; + this.defense = 1; + this.dexterity = 1; + this.agility = 1; + this.charisma = 1; + this.intelligence = 1; + this.hp = 10; + this.max_hp = 10; + this.money = 0; + + /** + * Experience + */ + this.hacking_exp = 0; + this.strength_exp = 0; + this.defense_exp = 0; + this.dexterity_exp = 0; + this.agility_exp = 0; + this.charisma_exp = 0; + this.intelligence_exp = 0; + + /** + * Multipliers + */ + this.hacking_mult = 1; + this.strength_mult = 1; + this.defense_mult = 1; + this.dexterity_mult = 1; + this.agility_mult = 1; + this.charisma_mult = 1; + + this.hacking_exp_mult = 1; + this.strength_exp_mult = 1; + this.defense_exp_mult = 1; + this.dexterity_exp_mult = 1; + this.agility_exp_mult = 1; + this.charisma_exp_mult = 1; + + this.hacking_chance_mult = 1; + this.hacking_speed_mult = 1; + this.hacking_money_mult = 1; + this.hacking_grow_mult = 1; + + this.company_rep_mult = 1; + this.faction_rep_mult = 1; + + this.crime_money_mult = 1; + this.crime_success_mult = 1; + + this.work_money_mult = 1; + + this.hacknet_node_money_mult = 1; + this.hacknet_node_purchase_cost_mult = 1; + this.hacknet_node_ram_cost_mult = 1; + this.hacknet_node_core_cost_mult = 1; + this.hacknet_node_level_cost_mult = 1; + + this.bladeburner_max_stamina_mult = 1; + this.bladeburner_stamina_gain_mult = 1; + this.bladeburner_analysis_mult = 1; + this.bladeburner_success_chance_mult = 1; + + /** + * Augmentations + */ + this.augmentations = []; + this.queuedAugmentations = []; + + /** + * City that the person is in + */ + this.city = CityName.Sector12; + + this.gainHackingExp = generalMethods.gainHackingExp; + this.gainStrengthExp = generalMethods.gainStrengthExp; + this.gainDefenseExp = generalMethods.gainDefenseExp; + this.gainDexterityExp = generalMethods.gainDexterityExp; + this.gainAgilityExp = generalMethods.gainAgilityExp; + this.gainCharismaExp = generalMethods.gainCharismaExp; + this.gainIntelligenceExp = generalMethods.gainIntelligenceExp; + this.gainStats = generalMethods.gainStats; + this.calculateSkill = generalMethods.calculateSkill; + this.regenerateHp = generalMethods.regenerateHp; + this.queryStatFromString = generalMethods.queryStatFromString; + } + /** * Updates this object's multipliers for the given augmentation */ @@ -237,20 +328,6 @@ export abstract class Person implements IPerson { abstract takeDamage(amt: number): boolean; abstract whoAmI(): string; - - constructor() { - this.gainHackingExp = generalMethods.gainHackingExp; - this.gainStrengthExp = generalMethods.gainStrengthExp; - this.gainDefenseExp = generalMethods.gainDefenseExp; - this.gainDexterityExp = generalMethods.gainDexterityExp; - this.gainAgilityExp = generalMethods.gainAgilityExp; - this.gainCharismaExp = generalMethods.gainCharismaExp; - this.gainIntelligenceExp = generalMethods.gainIntelligenceExp; - this.gainStats = generalMethods.gainStats; - this.calculateSkill = generalMethods.calculateSkill; - this.regenerateHp = generalMethods.regenerateHp; - this.queryStatFromString = generalMethods.queryStatFromString; - } } Reviver.constructors.Person = Person; diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts index b2c089c6b..d420ddce0 100644 --- a/src/PersonObjects/Player/PlayerObject.ts +++ b/src/PersonObjects/Player/PlayerObject.ts @@ -304,9 +304,6 @@ export class PlayerObject implements IPlayer { graftAugmentationWork: (numCycles: number) => boolean; finishGraftAugmentationWork: (cancelled: boolean) => string; applyEntropy: (stacks?: number) => void; - whoAmI(): string { - return "Player"; - } constructor() { //Skills and stats @@ -634,6 +631,10 @@ export class PlayerObject implements IPlayer { this.applyEntropy = augmentationMethods.applyEntropy; } + whoAmI(): string { + return "Player"; + } + /** * Serialize the current object to a JSON save state. */ diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx index d14b2b81e..493af8a1c 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx @@ -67,6 +67,7 @@ import { achievements } from "../../Achievements/Achievements"; import { FactionNames } from "../../Faction/data/FactionNames"; import { ITaskTracker } from "../ITaskTracker"; import { IPerson } from "../IPerson"; +import { use } from "../../ui/Context"; export function init(this: IPlayer): void { /* Initialize Player's home computer */ @@ -468,7 +469,8 @@ export function gainIntelligenceExp(this: IPerson, exp: number): void { console.error("ERROR: NaN passed into Player.gainIntelligenceExp()"); return; } - if (this.sourceFileLvl(5) > 0 || this.intelligence > 0) { + const player = use.Player(); + if (player.sourceFileLvl(5) > 0 || this.intelligence > 0) { this.intelligence_exp += exp; this.intelligence = Math.floor(this.calculateSkill(this.intelligence_exp, 1)); } diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 9d80e01e2..52a27dd69 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -1091,8 +1091,8 @@ export class Sleeve extends Person { break; case "Recruitment": time = this.getBladeburnerActionTime(p, "General", action); - const recruitTime = (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; - this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * recruitTime; + this.gainRatesForTask.cha = + 2 * BladeburnerConstants.BaseStatGain * (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + "%"; break; case "Diplomacy": diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index 355f17f43..2c5cba2c4 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -113,7 +113,7 @@ export function SleeveElem(props: IProps): React.ReactElement { case SleeveTaskType.Gym: desc = <>This sleeve is currently working out at {props.sleeve.currentTaskLocation}.; break; - case SleeveTaskType.Bladeburner: + case SleeveTaskType.Bladeburner: { let contract = ""; if (props.sleeve.bbContract !== "------") { contract = ` - ${props.sleeve.bbContract} (Success Rate: ${props.sleeve.currentTaskLocation})`; @@ -125,6 +125,7 @@ export function SleeveElem(props: IProps): React.ReactElement { ); break; + } case SleeveTaskType.Recovery: desc = ( <> diff --git a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx index 0e81213f5..a5fb04c59 100644 --- a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx +++ b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx @@ -236,7 +236,7 @@ const canDo: { [CityName.Aevum, CityName.Sector12, CityName.Volhaven].includes(sleeve.city), "Workout at Gym": (player: IPlayer, sleeve: Sleeve) => [CityName.Aevum, CityName.Sector12, CityName.Volhaven].includes(sleeve.city), - "Perform Bladeburner Actions": (player: IPlayer, sleeve: Sleeve) => player.inBladeburner(), + "Perform Bladeburner Actions": (player: IPlayer, _: Sleeve) => player.inBladeburner(), "Shock Recovery": (player: IPlayer, sleeve: Sleeve) => sleeve.shock < 100, Synchronize: (player: IPlayer, sleeve: Sleeve) => sleeve.sync < 100, }; From 9e6e97d1fb17df2650934f68196cad9d9818b9e5 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Thu, 14 Apr 2022 15:49:21 -0400 Subject: [PATCH 06/17] fmt and merge upstream --- src/PersonObjects/Player/PlayerObject.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts index 0e9563f3b..e09d82c5f 100644 --- a/src/PersonObjects/Player/PlayerObject.ts +++ b/src/PersonObjects/Player/PlayerObject.ts @@ -636,8 +636,7 @@ export class PlayerObject implements IPlayer { return "Player"; } - - /** + /** * Serialize the current object to a JSON save state. */ toJSON(): any { From 5f467759509bcdc7051f0f583fc2783f963eb9bc Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Mon, 25 Apr 2022 13:41:43 -0400 Subject: [PATCH 07/17] Cant stop wont stop studying Correct merge, and known bug that prevents stopping studying --- src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx | 5 ++--- src/PersonObjects/Sleeve/Sleeve.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx index c7287064e..d293117de 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx @@ -67,7 +67,7 @@ import { achievements } from "../../Achievements/Achievements"; import { FactionNames } from "../../Faction/data/FactionNames"; import { ITaskTracker } from "../ITaskTracker"; import { IPerson } from "../IPerson"; -import { use } from "../../ui/Context"; +import { Player } from "../../Player"; import { graftingIntBonus } from "../Grafting/GraftingHelpers"; export function init(this: IPlayer): void { @@ -470,8 +470,7 @@ export function gainIntelligenceExp(this: IPerson, exp: number): void { console.error("ERROR: NaN passed into Player.gainIntelligenceExp()"); return; } - const player = use.Player(); - if (player.sourceFileLvl(5) > 0 || this.intelligence > 0) { + if (Player.sourceFileLvl(5) > 0 || this.intelligence > 0) { this.intelligence_exp += exp; this.intelligence = Math.floor(this.calculateSkill(this.intelligence_exp, 1)); } diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 918ca11d7..335abeb5c 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -590,7 +590,7 @@ export class Sleeve extends Person { // for, we need to reset the sleeve's task if (p.gang) { if (fac.name === p.gang.facName) { - this.resetTaskStatus(); + this.resetTaskStatus(p); } } From d345188ccea73920cd162af80a41c90a41daeb60 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Mon, 25 Apr 2022 13:57:54 -0400 Subject: [PATCH 08/17] Address blackops error Address blackops error by removing incorrect check for type --- src/Bladeburner/Bladeburner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index b7fa6664e..4ef0074bf 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -1678,7 +1678,7 @@ export class Bladeburner implements IBladeburner { player.gainStats(retValue); // Operation Daedalus const action = this.getActionObject(this.action); - if (action == null || !(action instanceof BlackOperation)) { + if (action == null) { throw new Error("Failed to get BlackOperation Object for: " + this.action.name); } else if (action.name === BlackOperationNames.OperationDaedalus && this.blackops[action.name]) { this.resetAction(); From 46c6884c89c53f23b9bfc885ff8bf9fa7e363443 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:48:02 -0400 Subject: [PATCH 09/17] Make Infiltrate synthoids a little more clear By adding a short description --- src/PersonObjects/Player/PlayerObjectGangMethods.ts | 4 +--- src/PersonObjects/Sleeve/Sleeve.ts | 1 + src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 8 +++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/PersonObjects/Player/PlayerObjectGangMethods.ts b/src/PersonObjects/Player/PlayerObjectGangMethods.ts index 02242d5ff..77568ee60 100644 --- a/src/PersonObjects/Player/PlayerObjectGangMethods.ts +++ b/src/PersonObjects/Player/PlayerObjectGangMethods.ts @@ -2,9 +2,7 @@ import { Factions } from "../../Faction/Factions"; import { Faction } from "../../Faction/Faction"; import { Gang } from "../../Gang/Gang"; import { IPlayer } from "../IPlayer"; -import { GangConstants } from "../../Gang/data/Constants" - - +import { GangConstants } from "../../Gang/data/Constants"; export function canAccessGang(this: IPlayer): boolean { if (this.bitNodeN === 2) { diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 335abeb5c..e3088fe0f 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -1108,6 +1108,7 @@ export class Sleeve extends Person { break; case "Infiltrate synthoids": time = 60000; + this.currentTaskLocation = "This will generate additional contracts and operations"; break; case "Support main sleeve": p.bladeburner?.sleeveSupport(true); diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index 2c5cba2c4..024d14830 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -114,14 +114,16 @@ export function SleeveElem(props: IProps): React.ReactElement { desc = <>This sleeve is currently working out at {props.sleeve.currentTaskLocation}.; break; case SleeveTaskType.Bladeburner: { - let contract = ""; + let message = ""; if (props.sleeve.bbContract !== "------") { - contract = ` - ${props.sleeve.bbContract} (Success Rate: ${props.sleeve.currentTaskLocation})`; + message = ` - ${props.sleeve.bbContract} (Success Rate: ${props.sleeve.currentTaskLocation})`; + } else if (props.sleeve.currentTaskLocation !== "") { + message = props.sleeve.currentTaskLocation; } desc = ( <> This sleeve is currently attempting to {props.sleeve.bbAction} - {contract} + {message} ); break; From 7cf21629a7361cbc95fe2ba082c77c022be0b13f Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Sat, 30 Apr 2022 15:25:36 -0400 Subject: [PATCH 10/17] Address review Add ns function setToBladeburnerAction Formatting updates fix sleeves using player stamina Correct supporting sleeve causing error --- src/Bladeburner/Bladeburner.tsx | 12 ++++--- src/Bladeburner/IBladeburner.ts | 2 +- src/Netscript/RamCostGenerator.ts | 1 + src/NetscriptFunctions/Sleeve.ts | 31 +++++++++++++++++ src/PersonObjects/Sleeve/Sleeve.ts | 36 ++++++++++++++------ src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 3 +- src/PersonObjects/Sleeve/ui/TaskSelector.tsx | 8 ++--- src/ScriptEditor/NetscriptDefinitions.d.ts | 14 ++++++++ src/utils/StringHelperFunctions.ts | 13 +++++++ 9 files changed, 97 insertions(+), 23 deletions(-) diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 4ef0074bf..1dca43922 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -1264,7 +1264,7 @@ export class Bladeburner implements IBladeburner { } } - completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier): ITaskTracker { + completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier, isPlayer = true): ITaskTracker { let retValue = createTaskTracker(); switch (actionIdent.type) { case ActionTypes["Contract"]: @@ -1281,10 +1281,12 @@ export class Bladeburner implements IBladeburner { difficulty / BladeburnerConstants.DiffMultLinearFactor; const rewardMultiplier = Math.pow(action.rewardFac, action.level - 1); - // Stamina loss is based on difficulty - this.stamina -= BladeburnerConstants.BaseStaminaLoss * difficultyMultiplier; - if (this.stamina < 0) { - this.stamina = 0; + if (isPlayer) { + // Stamina loss is based on difficulty + this.stamina -= BladeburnerConstants.BaseStaminaLoss * difficultyMultiplier; + if (this.stamina < 0) { + this.stamina = 0; + } } // Process Contract/Operation success/failure diff --git a/src/Bladeburner/IBladeburner.ts b/src/Bladeburner/IBladeburner.ts index 65ecff71c..71849aac6 100644 --- a/src/Bladeburner/IBladeburner.ts +++ b/src/Bladeburner/IBladeburner.ts @@ -100,7 +100,7 @@ export interface IBladeburner { completeOperation(success: boolean, player: IPlayer): void; getActionObject(actionId: IActionIdentifier): IAction | null; completeContract(success: boolean, actionIdent: IActionIdentifier): void; - completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier): ITaskTracker; + completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier, isPlayer?: boolean): ITaskTracker; infiltrateSynthoidCommunities(): void; changeRank(player: IPlayer, change: number): void; processAction(router: IRouter, player: IPlayer, seconds: number): void; diff --git a/src/Netscript/RamCostGenerator.ts b/src/Netscript/RamCostGenerator.ts index 9d9eef719..6cba2d99d 100644 --- a/src/Netscript/RamCostGenerator.ts +++ b/src/Netscript/RamCostGenerator.ts @@ -282,6 +282,7 @@ const sleeve: IMap = { getSleeveAugmentations: RamCostConstants.ScriptSleeveBaseRamCost, getSleevePurchasableAugs: RamCostConstants.ScriptSleeveBaseRamCost, purchaseSleeveAug: RamCostConstants.ScriptSleeveBaseRamCost, + setToBladeburnerAction: RamCostConstants.ScriptSleeveBaseRamCost, }; // Stanek API diff --git a/src/NetscriptFunctions/Sleeve.ts b/src/NetscriptFunctions/Sleeve.ts index ed58bbfdc..fa5575b0a 100644 --- a/src/NetscriptFunctions/Sleeve.ts +++ b/src/NetscriptFunctions/Sleeve.ts @@ -310,5 +310,36 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel return player.sleeves[sleeveNumber].tryBuyAugmentation(player, aug); }, + setToBladeburnerAction: function (_sleeveNumber: unknown, _action: unknown, _contract?: unknown): boolean { + updateRam("setToBladeburnerAction"); + const sleeveNumber = helper.number("setToBladeburnerAction", "sleeveNumber", _sleeveNumber); + const action = helper.string("setToBladeburnerAction", "action", _action); + let contract: string; + if (typeof _contract === "undefined") { + contract = "------"; + } else { + contract = helper.string("setToBladeburnerAction", "contract", _contract); + } + checkSleeveAPIAccess("setToBladeburnerAction"); + checkSleeveNumber("setToBladeburnerAction", sleeveNumber); + + // Cannot Take on Contracts if another sleeve is performing that action + if (action === "Take on contracts") { + for (let i = 0; i < player.sleeves.length; ++i) { + if (i === sleeveNumber) { + continue; + } + const other = player.sleeves[i]; + if (other.currentTask === SleeveTaskType.Bladeburner && other.bbAction === action) { + throw helper.makeRuntimeErrorMsg( + "sleeve.setToBladeburnerAction", + `Sleeve ${sleeveNumber} cannot take of contracts because Sleeve ${i} is already performing that action.`, + ); + } + } + } + + return player.sleeves[sleeveNumber].bladeburner(player, action, contract); + }, }; } diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index e3088fe0f..52285a8af 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -35,6 +35,8 @@ import { LocationName } from "../../Locations/data/LocationNames"; import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver"; import { BladeburnerConstants } from "../../Bladeburner/data/Constants"; +import { numeralWrapper } from "../../ui/numeralFormat"; +import { capitalizeFirstLetter, capitalizeEachWord } from "../../utils/StringHelperFunctions"; export class Sleeve extends Person { /** @@ -221,6 +223,10 @@ export class Sleeve extends Person { return retValue; } } else if (this.currentTask === SleeveTaskType.Bladeburner) { + if (this.currentTaskMaxTime === 0) { + this.currentTaskTime = 0; + return retValue; + } // For bladeburner, all experience and money is gained at the end const bb = p.bladeburner; if (bb === null) { @@ -236,10 +242,9 @@ export class Sleeve extends Person { this.currentTaskTime = 0; return retValue; } - let type: string; let name: string; - if (this.bbAction === "Take on Contracts") { + if (this.bbAction === "Take on contracts") { type = "Contracts"; name = this.bbContract; } else { @@ -257,7 +262,7 @@ export class Sleeve extends Person { const action = bb.getActionObject(actionIdent); if ((action?.count ?? 0) > 0) { - const bbRetValue = bb.completeAction(p, this, actionIdent); + const bbRetValue = bb.completeAction(p, this, actionIdent, false); if (bbRetValue) { retValue = this.gainExperience(p, bbRetValue); this.gainMoney(p, bbRetValue); @@ -647,7 +652,8 @@ export class Sleeve extends Person { if (this.currentTask == SleeveTaskType.Class) { const retVal = createTaskTracker(); retVal.int = CONSTANTS.IntelligenceClassBaseExpGain * Math.round(this.currentTaskTime / 1000); - this.gainExperience(p, retVal); //Wont be shared with other sleeves + const r = this.gainExperience(p, retVal); + p.sleeves.filter((s) => s != this).forEach((s) => s.gainExperience(p, r, 1, true)); } this.earningsForTask = createTaskTracker(); this.gainRatesForTask = createTaskTracker(); @@ -660,7 +666,7 @@ export class Sleeve extends Person { this.gymStatType = ""; this.className = ""; this.bbAction = ""; - this.bbContract = ""; + this.bbContract = "------"; } shockRecovery(p: IPlayer): boolean { @@ -1091,8 +1097,10 @@ export class Sleeve extends Person { this.currentTaskLocation = ""; let time = 0; + + this.bbContract = "------"; switch (action) { - case "Field Analysis": + case "Field analysis": time = this.getBladeburnerActionTime(p, "General", action); this.gainRatesForTask.hack = 20 * this.hacking_exp_mult; this.gainRatesForTask.cha = 20 * this.charisma_exp_mult; @@ -1101,7 +1109,9 @@ export class Sleeve extends Person { time = this.getBladeburnerActionTime(p, "General", action); this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; - this.currentTaskLocation = (p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0).toString() + "%"; + this.currentTaskLocation = `(Success Rate: ${numeralWrapper.formatPercentage( + this.recrutmentSuccessChance(p), + )})`; break; case "Diplomacy": time = this.getBladeburnerActionTime(p, "General", action); @@ -1114,20 +1124,24 @@ export class Sleeve extends Person { p.bladeburner?.sleeveSupport(true); time = 0; break; - case "Take on Contracts": + case "Take on contracts": time = this.getBladeburnerActionTime(p, "Contracts", contract); this.contractGainRates(p, "Contracts", contract); this.currentTaskLocation = this.contractSuccessChance(p, "Contracts", contract); + this.bbContract = capitalizeEachWord(contract.toLowerCase()); break; } - this.bbAction = action; - this.bbContract = contract; + this.bbAction = capitalizeFirstLetter(action.toLowerCase()); this.currentTaskMaxTime = time; this.currentTask = SleeveTaskType.Bladeburner; return true; } + recrutmentSuccessChance(p: IPlayer): number { + return Math.max(0, Math.min(1, p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0)); + } + contractSuccessChance(p: IPlayer, type: string, name: string): string { const bb = p.bladeburner; if (bb === null) { @@ -1143,7 +1157,7 @@ export class Sleeve extends Person { if (chances[0] >= 1) { return "100%"; } else { - return `${chances[0] * 100}% - ${chances[1] * 100}%`; + return `${numeralWrapper.formatPercentage(chances[0])} - ${numeralWrapper.formatPercentage(chances[1])}`; } } diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index 024d14830..21fb8ed92 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -122,8 +122,7 @@ export function SleeveElem(props: IProps): React.ReactElement { } desc = ( <> - This sleeve is currently attempting to {props.sleeve.bbAction} - {message} + This sleeve is currently attempting to {props.sleeve.bbAction}. {message} ); break; diff --git a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx index 2218bdef8..fbd40e280 100644 --- a/src/PersonObjects/Sleeve/ui/TaskSelector.tsx +++ b/src/PersonObjects/Sleeve/ui/TaskSelector.tsx @@ -23,12 +23,12 @@ const universitySelectorOptions: string[] = [ const gymSelectorOptions: string[] = ["Train Strength", "Train Defense", "Train Dexterity", "Train Agility"]; const bladeburnerSelectorOptions: string[] = [ - "Field Analysis", + "Field analysis", "Recruitment", "Diplomacy", "Infiltrate synthoids", "Support main sleeve", - "Take on Contracts", + "Take on contracts", ]; interface IProps { @@ -101,7 +101,7 @@ function possibleContracts(player: IPlayer, sleeve: Sleeve): string[] { if (sleeve === otherSleeve) { continue; } - if (otherSleeve.currentTask === SleeveTaskType.Bladeburner && otherSleeve.bbAction == "Take on Contracts") { + if (otherSleeve.currentTask === SleeveTaskType.Bladeburner && otherSleeve.bbAction == "Take on contracts") { contracts = contracts.filter((x) => x != otherSleeve.bbContract); } } @@ -202,7 +202,7 @@ const tasks: { return { first: bladeburnerSelectorOptions, second: (s1: string) => { - if (s1 === "Take on Contracts") { + if (s1 === "Take on contracts") { return possibleContracts(player, sleeve); } else { return ["------"]; diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts index e98b03557..cc649032a 100644 --- a/src/ScriptEditor/NetscriptDefinitions.d.ts +++ b/src/ScriptEditor/NetscriptDefinitions.d.ts @@ -3777,6 +3777,20 @@ export interface Sleeve { * @returns True if the aug was purchased and installed on the sleeve, false otherwise. */ purchaseSleeveAug(sleeveNumber: number, augName: string): boolean; + + /** + * Set a sleeve to perform bladeburner actions. + * @remarks + * RAM cost: 4 GB + * + * Return a boolean indicating whether or not the sleeve started working out. + * + * @param sleeveNumber - Index of the sleeve to workout at the gym. + * @param action - Name of the action to be performed. + * @param contract - Name of the contract if applicable. + * @returns True if the sleeve started working out, false otherwise. + */ + setToBladeburnerAction(sleeveNumber: number, action: string, contract?: string): boolean; } /** diff --git a/src/utils/StringHelperFunctions.ts b/src/utils/StringHelperFunctions.ts index 58c685871..60bc09d6e 100644 --- a/src/utils/StringHelperFunctions.ts +++ b/src/utils/StringHelperFunctions.ts @@ -117,6 +117,17 @@ function cyrb53(str: string, seed = 0): string { return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16); } +function capitalizeFirstLetter(s: string): string { + return s.charAt(0).toUpperCase() + s.slice(1); +} + +function capitalizeEachWord(s: string): string { + return s + .split(" ") + .map((word) => capitalizeFirstLetter(word)) + .join(" "); +} + export { convertTimeMsToTimeElapsedString, longestCommonStart, @@ -124,4 +135,6 @@ export { formatNumber, generateRandomString, cyrb53, + capitalizeFirstLetter, + capitalizeEachWord, }; From e12bb6cf4bc466a2c716989c71e8f0e5354787b4 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Sat, 30 Apr 2022 15:31:36 -0400 Subject: [PATCH 11/17] Make lint happy --- src/Faction/ui/FactionRoot.tsx | 5 +---- src/index.tsx | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Faction/ui/FactionRoot.tsx b/src/Faction/ui/FactionRoot.tsx index 4410e5bdb..bcb37a563 100644 --- a/src/Faction/ui/FactionRoot.tsx +++ b/src/Faction/ui/FactionRoot.tsx @@ -16,12 +16,10 @@ import { BitNodeMultipliers } from "../../BitNode/BitNodeMultipliers"; import { Faction } from "../Faction"; import { use } from "../../ui/Context"; -import { CreateGangModal } from "./CreateGangModal"; -import { Box, Paper, Typography, Button, Tooltip } from "@mui/material"; +import { Typography, Button } from "@mui/material"; import { CovenantPurchasesRoot } from "../../PersonObjects/Sleeve/ui/CovenantPurchasesRoot"; import { FactionNames } from "../data/FactionNames"; -import { GangConstants } from "../../Gang/data/Constants"; import { GangButton } from "./GangButton"; type IProps = { @@ -30,7 +28,6 @@ type IProps = { }; // Info text for all options on the UI -const gangInfo = "Create and manage a gang for this Faction. Gangs will earn you money and faction reputation"; const hackingContractsInfo = "Complete hacking contracts for your faction. " + "Your effectiveness, which determines how much " + diff --git a/src/index.tsx b/src/index.tsx index 38aba9a58..db30c785c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,7 +4,6 @@ import ReactDOM from "react-dom"; import { TTheme as Theme, ThemeEvents, refreshTheme } from "./Themes/ui/Theme"; import { LoadingScreen } from "./ui/LoadingScreen"; import { initElectron } from "./Electron"; -import { AlertEvents } from "./ui/React/AlertManager"; initElectron(); globalThis["React"] = React; globalThis["ReactDOM"] = ReactDOM; From 30521468fc695c39d81f4bb9d2dbf494b747a9a5 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Fri, 6 May 2022 22:44:37 -0400 Subject: [PATCH 12/17] Merge dev --- package-lock.json | 1373 +++++++++++++++------------------------------ 1 file changed, 465 insertions(+), 908 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77b1d9de3..d753cff81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,8 +17,7 @@ "@mui/icons-material": "^5.0.3", "@mui/material": "^5.0.3", "@mui/styles": "^5.0.1", - "@types/bcrypt": "^5.0.0", - "@types/bcryptjs": "^2.4.2", + "@mui/system": "^5.0.3", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^5.0.0", @@ -26,10 +25,8 @@ "better-react-mathjax": "^1.0.3", "clsx": "^1.1.1", "date-fns": "^2.25.0", - "electron-config": "^2.0.0", "escodegen": "^1.11.0", "file-saver": "^1.3.8", - "fs": "^0.0.1-security", "jquery": "^3.5.0", "js-sha256": "^0.9.0", "jszip": "^3.7.0", @@ -56,22 +53,24 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", "@testing-library/cypress": "^8.0.1", "@types/acorn": "^4.0.6", + "@types/bcryptjs": "^2.4.2", "@types/escodegen": "^0.0.7", "@types/file-saver": "^2.0.3", + "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.168", - "@types/numeral": "0.0.25", + "@types/numeral": "^2.0.2", "@types/react": "^17.0.21", "@types/react-beautiful-dnd": "^13.1.2", "@types/react-dom": "^17.0.9", "@types/react-resizable": "^1.7.3", - "@typescript-eslint/eslint-plugin": "^4.22.0", - "@typescript-eslint/parser": "^4.22.0", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", "babel-jest": "^27.0.6", "babel-loader": "^8.0.5", "cypress": "^8.3.1", "electron": "^14.2.4", "electron-packager": "^15.4.0", - "eslint": "^7.24.0", + "eslint": "^8.13.0", "file-loader": "^6.2.0", "fork-ts-checker-webpack-plugin": "^6.3.3", "html-webpack-plugin": "^3.2.0", @@ -83,17 +82,15 @@ "prettier": "^2.3.2", "raw-loader": "^4.0.2", "react-refresh": "^0.10.0", - "regenerator-runtime": "^0.13.9", "source-map": "^0.7.3", "start-server-and-test": "^1.14.0", "typescript": "^4.2.4", "webpack": "^4.46.0", "webpack-cli": "^3.3.12", - "webpack-dev-middleware": "^3.7.3", "webpack-dev-server": "^3.11.2" }, "engines": { - "node": ">=8 || <=9" + "node": ">=14" } }, "node_modules/@babel/code-frame": { @@ -2071,29 +2068,35 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", + "debug": "^4.3.2", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2105,13 +2108,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">= 4" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { @@ -2142,12 +2148,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -2156,9 +2162,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3980,18 +3986,11 @@ "@babel/types": "^7.3.0" } }, - "node_modules/@types/bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", - "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true }, "node_modules/@types/escodegen": { "version": "0.0.7", @@ -4063,6 +4062,15 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jquery": { + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", + "dev": true, + "dependencies": { + "@types/sizzle": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -4084,12 +4092,13 @@ "node_modules/@types/node": { "version": "16.10.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.4.tgz", - "integrity": "sha512-EITwVTX5B4nDjXjGeQAfXOrm+Jn+qNjDmyDRtWoD+wZsl/RDPRTFRKivs4Mt74iOFlLOrE5+Kf+p5yjyhm3+cA==" + "integrity": "sha512-EITwVTX5B4nDjXjGeQAfXOrm+Jn+qNjDmyDRtWoD+wZsl/RDPRTFRKivs4Mt74iOFlLOrE5+Kf+p5yjyhm3+cA==", + "dev": true }, "node_modules/@types/numeral": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.25.tgz", - "integrity": "sha512-ShHzHkYD+Ldw3eyttptCpUhF1/mkInWwasQkCNXZHOsJMJ/UMa8wXrxSrTJaVk0r4pLK/VnESVM0wFsfQzNEKQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.2.tgz", + "integrity": "sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA==", "dev": true }, "node_modules/@types/parse-json": { @@ -4221,30 +4230,31 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", + "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/type-utils": "5.21.0", + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", - "regexpp": "^3.1.0", + "regexpp": "^3.2.0", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4267,50 +4277,26 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", + "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4319,29 +4305,55 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", + "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", + "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", + "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -4349,21 +4361,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", + "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -4376,9 +4388,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4390,17 +4402,41 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "node_modules/@typescript-eslint/utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", + "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", + "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.21.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -4614,9 +4650,9 @@ } }, "node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "bin": { "acorn": "bin/acorn" }, @@ -6509,58 +6545,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/conf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", - "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", - "dependencies": { - "dot-prop": "^4.1.0", - "env-paths": "^1.0.0", - "make-dir": "^1.0.0", - "pkg-up": "^2.0.0", - "write-file-atomic": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conf/node_modules/env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", - "engines": { - "node": ">=4" - } - }, - "node_modules/conf/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conf/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/conf/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -7745,17 +7729,6 @@ "webidl-conversions": "^4.0.2" } }, - "node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -7844,15 +7817,6 @@ "node": ">= 8.6" } }, - "node_modules/electron-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-config/-/electron-config-2.0.0.tgz", - "integrity": "sha512-5mGwRK4lsAo6tiy4KNF/zUInYpUGr7JJzLA8FHOoqBWV3kkKJWSrDXo4Uk2Ffm5aeQ1o73XuorfkYhaWFV2O4g==", - "deprecated": "Renamed to `electron-store`.", - "dependencies": { - "conf": "^1.0.0" - } - }, "node_modules/electron-notarize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.1.1.tgz", @@ -8280,49 +8244,44 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.2.2", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -8330,7 +8289,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -8367,7 +8326,7 @@ "eslint": ">=5" } }, - "node_modules/eslint-visitor-keys": { + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", @@ -8376,13 +8335,13 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -8400,6 +8359,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8434,28 +8399,38 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { @@ -8482,13 +8457,16 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">= 4" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/optionator": { @@ -8508,21 +8486,6 @@ "node": ">= 0.8.0" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8556,38 +8519,17 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "dependencies": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -9139,9 +9081,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9151,7 +9093,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -9961,11 +9903,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -10360,16 +10297,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -10416,7 +10353,8 @@ "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true }, "node_modules/handle-thing": { "version": "2.0.1", @@ -11172,9 +11110,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -11237,6 +11175,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -11612,14 +11551,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -14554,12 +14485,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -14596,12 +14521,6 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -16417,78 +16336,6 @@ "node": ">=8" } }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, "node_modules/plist": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", @@ -17581,15 +17428,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -18217,7 +18055,8 @@ "node_modules/signal-exit": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -19292,95 +19131,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -24014,36 +23764,45 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", + "debug": "^4.3.2", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } }, "type-fest": { "version": "0.20.2", @@ -24069,20 +23828,20 @@ } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -25370,18 +25129,11 @@ "@babel/types": "^7.3.0" } }, - "@types/bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", - "requires": { - "@types/node": "*" - } - }, "@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", - "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true }, "@types/escodegen": { "version": "0.0.7", @@ -25453,6 +25205,15 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jquery": { + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -25474,12 +25235,13 @@ "@types/node": { "version": "16.10.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.4.tgz", - "integrity": "sha512-EITwVTX5B4nDjXjGeQAfXOrm+Jn+qNjDmyDRtWoD+wZsl/RDPRTFRKivs4Mt74iOFlLOrE5+Kf+p5yjyhm3+cA==" + "integrity": "sha512-EITwVTX5B4nDjXjGeQAfXOrm+Jn+qNjDmyDRtWoD+wZsl/RDPRTFRKivs4Mt74iOFlLOrE5+Kf+p5yjyhm3+cA==", + "dev": true }, "@types/numeral": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.25.tgz", - "integrity": "sha512-ShHzHkYD+Ldw3eyttptCpUhF1/mkInWwasQkCNXZHOsJMJ/UMa8wXrxSrTJaVk0r4pLK/VnESVM0wFsfQzNEKQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.2.tgz", + "integrity": "sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA==", "dev": true }, "@types/parse-json": { @@ -25611,17 +25373,18 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", + "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/type-utils": "5.21.0", + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", - "regexpp": "^3.1.0", + "regexpp": "^3.2.0", "semver": "^7.3.5", "tsutils": "^3.21.0" }, @@ -25637,82 +25400,93 @@ } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "@typescript-eslint/parser": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", + "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", + "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", + "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", + "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", + "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", + "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", + "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.21.0", + "eslint-visitor-keys": "^3.0.0" } }, "@webassemblyjs/ast": { @@ -25919,9 +25693,9 @@ } }, "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "acorn-globals": { "version": "4.3.4", @@ -27447,48 +27221,6 @@ } } }, - "conf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", - "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", - "requires": { - "dot-prop": "^4.1.0", - "env-paths": "^1.0.0", - "make-dir": "^1.0.0", - "pkg-up": "^2.0.0", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -28440,14 +28172,6 @@ "webidl-conversions": "^4.0.2" } }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -28566,14 +28290,6 @@ } } }, - "electron-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-config/-/electron-config-2.0.0.tgz", - "integrity": "sha512-5mGwRK4lsAo6tiy4KNF/zUInYpUGr7JJzLA8FHOoqBWV3kkKJWSrDXo4Uk2Ffm5aeQ1o73XuorfkYhaWFV2O4g==", - "requires": { - "conf": "^1.0.0" - } - }, "electron-notarize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.1.1.tgz", @@ -28890,62 +28606,48 @@ } }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.2.2", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -28955,6 +28657,12 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -28980,21 +28688,29 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" } }, "globals": { @@ -29012,11 +28728,14 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } }, "optionator": { "version": "0.9.1", @@ -29032,15 +28751,6 @@ "word-wrap": "^1.2.3" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -29075,12 +28785,20 @@ "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "esm": { @@ -29089,28 +28807,14 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -29558,9 +29262,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -30206,11 +29910,6 @@ } } }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -30533,16 +30232,16 @@ } }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -30579,7 +30278,8 @@ "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true }, "handle-thing": { "version": "2.0.1", @@ -31196,9 +30896,9 @@ "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "immediate": { @@ -31241,7 +30941,8 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "4.0.0", @@ -31503,11 +31204,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -33746,12 +33442,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -33788,12 +33478,6 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -35216,59 +34900,6 @@ } } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, "plist": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", @@ -36116,12 +35747,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -36635,7 +36260,8 @@ "signal-exit": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true }, "sisteransi": { "version": "1.0.5", @@ -37529,75 +37155,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", From b683bc0340805c59b471cdac0838bc54b8edc503 Mon Sep 17 00:00:00 2001 From: rderfler <44448965+rderfler@users.noreply.github.com> Date: Sun, 8 May 2022 14:14:05 -0400 Subject: [PATCH 13/17] fmt --- src/PersonObjects/Sleeve/ui/SleeveElem.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx index f195bdb08..cc87927d3 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveElem.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveElem.tsx @@ -186,14 +186,14 @@ export function SleeveElem(props: IProps): React.ReactElement { {desc} {(props.sleeve.currentTask === SleeveTaskType.Crime || - props.sleeve.currentTask === SleeveTaskType.Bladeburner) && - props.sleeve.currentTaskMaxTime > 0 && ( - - )} + props.sleeve.currentTask === SleeveTaskType.Bladeburner) && + props.sleeve.currentTaskMaxTime > 0 && ( + + )} From 42dcbf889e62b30fa6ac49827827f462d6948608 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Fri, 20 May 2022 17:28:21 -0400 Subject: [PATCH 14/17] fix typo --- src/NetscriptFunctions/Singularity.ts | 12 ++---------- src/PersonObjects/Sleeve/Sleeve.ts | 4 ++-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts index aea458c1f..0d8c04e77 100644 --- a/src/NetscriptFunctions/Singularity.ts +++ b/src/NetscriptFunctions/Singularity.ts @@ -487,16 +487,8 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript } player.loseMoney(CONSTANTS.TorRouterCost, "other"); - const darkweb = safetlyCreateUniqueServer({ - ip: createUniqueRandomIp(), - hostname: "darkweb", - organizationName: "", - isConnectedTo: false, - adminRights: false, - purchasedByPlayer: false, - maxRam: 1, - }); - AddToAllServers(darkweb); + const darkweb = GetServer(SpecialServers.DarkWeb); + if (!darkweb) throw _ctx.makeRuntimeErrorMsg("DarkWeb was not a server but should have been"); player.getHomeComputer().serversOnNetwork.push(darkweb.hostname); darkweb.serversOnNetwork.push(player.getHomeComputer().hostname); diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index 55797c227..dd7312729 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -1110,7 +1110,7 @@ export class Sleeve extends Person { this.gainRatesForTask.cha = 2 * BladeburnerConstants.BaseStatGain * (p.bladeburner?.getRecruitmentTime(this) ?? 0) * 1000; this.currentTaskLocation = `(Success Rate: ${numeralWrapper.formatPercentage( - this.recrutmentSuccessChance(p), + this.recruitmentSuccessChance(p), )})`; break; case "Diplomacy": @@ -1138,7 +1138,7 @@ export class Sleeve extends Person { return true; } - recrutmentSuccessChance(p: IPlayer): number { + recruitmentSuccessChance(p: IPlayer): number { return Math.max(0, Math.min(1, p.bladeburner?.getRecruitmentSuccessChance(this) ?? 0)); } From 34b099c050a603b4d3835c7f8c2f1b4962a12cfa Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Fri, 20 May 2022 17:44:20 -0400 Subject: [PATCH 15/17] rm reviver from person --- src/PersonObjects/Person.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 560ad0d99..69b077843 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -354,5 +354,3 @@ export abstract class Person implements IPerson { abstract whoAmI(): string; } - -Reviver.constructors.Person = Person; From 27a8582df8863631d9215f5eefc2db2ab33fd736 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Fri, 20 May 2022 18:18:42 -0400 Subject: [PATCH 16/17] balance infiltrate synthoids --- package-lock.json | 312 +----------------- src/Bladeburner/Bladeburner.tsx | 12 +- src/Bladeburner/IBladeburner.ts | 2 +- src/Hospital/Hospital.ts | 5 +- src/PersonObjects/IPerson.ts | 4 +- src/PersonObjects/IPlayer.ts | 2 - src/PersonObjects/Person.ts | 223 ++++--------- .../Player/PlayerObjectGeneralMethods.tsx | 2 +- src/PersonObjects/Sleeve/Sleeve.ts | 2 +- 9 files changed, 76 insertions(+), 488 deletions(-) diff --git a/package-lock.json b/package-lock.json index 726c44698..4f90b38cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitburner", - "version": "1.6.4", + "version": "1.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitburner", - "version": "1.6.4", + "version": "1.7.0", "hasInstallScript": true, "license": "SEE LICENSE IN license.txt", "dependencies": { @@ -56,10 +56,7 @@ "@types/bcryptjs": "^2.4.2", "@types/escodegen": "^0.0.7", "@types/file-saver": "^2.0.3", -<<<<<<< HEAD -======= "@types/jest": "^27.4.1", ->>>>>>> dev "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.168", "@types/numeral": "^2.0.2", @@ -2072,33 +2069,19 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { -<<<<<<< HEAD - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", -======= "version": "1.2.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", ->>>>>>> dev "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", -<<<<<<< HEAD - "espree": "^9.3.1", -======= "espree": "^9.3.2", ->>>>>>> dev "globals": "^13.9.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", -<<<<<<< HEAD - "minimatch": "^3.0.4", -======= "minimatch": "^3.1.2", ->>>>>>> dev "strip-json-comments": "^3.1.1" }, "engines": { @@ -2112,15 +2095,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { -<<<<<<< HEAD - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", -======= "version": "13.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", ->>>>>>> dev "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4086,8 +4063,6 @@ "@types/istanbul-lib-report": "*" } }, -<<<<<<< HEAD -======= "node_modules/@types/jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", @@ -4098,7 +4073,6 @@ "pretty-format": "^27.0.0" } }, ->>>>>>> dev "node_modules/@types/jquery": { "version": "3.5.14", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", @@ -4267,21 +4241,6 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", - "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/type-utils": "5.21.0", - "@typescript-eslint/utils": "5.21.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz", "integrity": "sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==", @@ -4295,7 +4254,6 @@ "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", ->>>>>>> dev "tsutils": "^3.21.0" }, "engines": { @@ -4348,17 +4306,6 @@ } }, "node_modules/@typescript-eslint/parser": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", - "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/typescript-estree": "5.21.0", - "debug": "^4.3.2" -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.25.0.tgz", "integrity": "sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==", @@ -4368,7 +4315,6 @@ "@typescript-eslint/types": "5.25.0", "@typescript-eslint/typescript-estree": "5.25.0", "debug": "^4.3.4" ->>>>>>> dev }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4386,18 +4332,6 @@ } } }, -<<<<<<< HEAD - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", - "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/visitor-keys": "5.21.0" - }, - "engines": { -======= "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4443,38 +4377,11 @@ "tsutils": "^3.21.0" }, "engines": { ->>>>>>> dev "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" -<<<<<<< HEAD - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", - "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.21.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { -======= }, "peerDependencies": { "eslint": "*" @@ -4498,21 +4405,14 @@ }, "peerDependenciesMeta": { "supports-color": { ->>>>>>> dev "optional": true } } }, "node_modules/@typescript-eslint/types": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", - "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.25.0.tgz", "integrity": "sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA==", ->>>>>>> dev "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4523,19 +4423,6 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", - "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/visitor-keys": "5.21.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz", "integrity": "sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw==", @@ -4547,7 +4434,6 @@ "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", ->>>>>>> dev "tsutils": "^3.21.0" }, "engines": { @@ -4596,17 +4482,6 @@ } }, "node_modules/@typescript-eslint/utils": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", - "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/typescript-estree": "5.21.0", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.25.0.tgz", "integrity": "sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==", @@ -4616,7 +4491,6 @@ "@typescript-eslint/scope-manager": "5.25.0", "@typescript-eslint/types": "5.25.0", "@typescript-eslint/typescript-estree": "5.25.0", ->>>>>>> dev "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4632,15 +4506,6 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", - "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.21.0", - "eslint-visitor-keys": "^3.0.0" -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz", "integrity": "sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA==", @@ -4648,7 +4513,6 @@ "dependencies": { "@typescript-eslint/types": "5.25.0", "eslint-visitor-keys": "^3.3.0" ->>>>>>> dev }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4865,15 +4729,9 @@ } }, "node_modules/acorn": { -<<<<<<< HEAD - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", -======= "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", ->>>>>>> dev "bin": { "acorn": "bin/acorn" }, @@ -8465,21 +8323,12 @@ } }, "node_modules/eslint": { -<<<<<<< HEAD - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.2", -======= "version": "8.15.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.2.3", ->>>>>>> dev "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -8490,11 +8339,7 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", -<<<<<<< HEAD - "espree": "^9.3.1", -======= "espree": "^9.3.2", ->>>>>>> dev "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8753,15 +8598,6 @@ } }, "node_modules/espree": { -<<<<<<< HEAD - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", -======= "version": "9.3.2", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", @@ -8769,7 +8605,6 @@ "dependencies": { "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", ->>>>>>> dev "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -24008,33 +23843,19 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { -<<<<<<< HEAD - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", -======= "version": "1.2.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", ->>>>>>> dev "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", -<<<<<<< HEAD - "espree": "^9.3.1", -======= "espree": "^9.3.2", ->>>>>>> dev "globals": "^13.9.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", -<<<<<<< HEAD - "minimatch": "^3.0.4", -======= "minimatch": "^3.1.2", ->>>>>>> dev "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -24045,15 +23866,9 @@ "dev": true }, "globals": { -<<<<<<< HEAD - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", -======= "version": "13.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", ->>>>>>> dev "dev": true, "requires": { "type-fest": "^0.20.2" @@ -25469,8 +25284,6 @@ "@types/istanbul-lib-report": "*" } }, -<<<<<<< HEAD -======= "@types/jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", @@ -25481,7 +25294,6 @@ "pretty-format": "^27.0.0" } }, ->>>>>>> dev "@types/jquery": { "version": "3.5.14", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", @@ -25650,21 +25462,6 @@ } }, "@typescript-eslint/eslint-plugin": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", - "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/type-utils": "5.21.0", - "@typescript-eslint/utils": "5.21.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz", "integrity": "sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==", @@ -25678,7 +25475,6 @@ "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", ->>>>>>> dev "tsutils": "^3.21.0" }, "dependencies": { @@ -25703,58 +25499,6 @@ } }, "@typescript-eslint/parser": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", - "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/typescript-estree": "5.21.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", - "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/visitor-keys": "5.21.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", - "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.21.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", - "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", - "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/visitor-keys": "5.21.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.25.0.tgz", "integrity": "sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==", @@ -25827,7 +25571,6 @@ "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", ->>>>>>> dev "tsutils": "^3.21.0" }, "dependencies": { @@ -25852,17 +25595,6 @@ } }, "@typescript-eslint/utils": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", - "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.21.0", - "@typescript-eslint/types": "5.21.0", - "@typescript-eslint/typescript-estree": "5.21.0", -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.25.0.tgz", "integrity": "sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==", @@ -25872,21 +25604,11 @@ "@typescript-eslint/scope-manager": "5.25.0", "@typescript-eslint/types": "5.25.0", "@typescript-eslint/typescript-estree": "5.25.0", ->>>>>>> dev "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { -<<<<<<< HEAD - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", - "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.21.0", - "eslint-visitor-keys": "^3.0.0" -======= "version": "5.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz", "integrity": "sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA==", @@ -25894,7 +25616,6 @@ "requires": { "@typescript-eslint/types": "5.25.0", "eslint-visitor-keys": "^3.3.0" ->>>>>>> dev } }, "@webassemblyjs/ast": { @@ -26101,15 +25822,9 @@ } }, "acorn": { -<<<<<<< HEAD - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" -======= "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" ->>>>>>> dev }, "acorn-globals": { "version": "4.3.4", @@ -29020,21 +28735,12 @@ } }, "eslint": { -<<<<<<< HEAD - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.2", -======= "version": "8.15.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.2.3", ->>>>>>> dev "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -29045,11 +28751,7 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", -<<<<<<< HEAD - "espree": "^9.3.1", -======= "espree": "^9.3.2", ->>>>>>> dev "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -29234,15 +28936,6 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, "espree": { -<<<<<<< HEAD - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", -======= "version": "9.3.2", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", @@ -29250,7 +28943,6 @@ "requires": { "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", ->>>>>>> dev "eslint-visitor-keys": "^3.3.0" } }, diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 8bf1b9eac..7a043ea35 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -1343,7 +1343,7 @@ export class Bladeburner implements IBladeburner { damage = action.hpLoss * difficultyMultiplier; damage = Math.ceil(addOffset(damage, 10)); this.hpLost += damage; - const cost = calculateHospitalizationCost(person, damage); + const cost = calculateHospitalizationCost(player, damage); if (person.takeDamage(damage)) { ++this.numHosp; this.moneyLost += cost; @@ -1420,7 +1420,7 @@ export class Bladeburner implements IBladeburner { if (action.hpLoss) { damage = action.hpLoss * difficultyMultiplier; damage = Math.ceil(addOffset(damage, 10)); - const cost = calculateHospitalizationCost(person, damage); + const cost = calculateHospitalizationCost(player, damage); if (person.takeDamage(damage)) { ++this.numHosp; this.moneyLost += cost; @@ -1611,12 +1611,14 @@ export class Bladeburner implements IBladeburner { return retValue; } - infiltrateSynthoidCommunities(): void { + infiltrateSynthoidCommunities(p: IPlayer): void { + const infilSleeves = p.sleeves.filter((s) => s.bbAction === "Infiltrate synthoids").length; + const amt = Math.pow(infilSleeves, -0.5) / 2; for (const contract of Object.keys(this.contracts)) { - this.contracts[contract].count += 1; + this.contracts[contract].count += amt; } for (const operation of Object.keys(this.operations)) { - this.operations[operation].count += 1; + this.operations[operation].count += amt; } if (this.logging.general) { this.log(`Sleeve: Infiltrate the synthoid communities.`); diff --git a/src/Bladeburner/IBladeburner.ts b/src/Bladeburner/IBladeburner.ts index 71849aac6..66f97e0f7 100644 --- a/src/Bladeburner/IBladeburner.ts +++ b/src/Bladeburner/IBladeburner.ts @@ -101,7 +101,7 @@ export interface IBladeburner { getActionObject(actionId: IActionIdentifier): IAction | null; completeContract(success: boolean, actionIdent: IActionIdentifier): void; completeAction(player: IPlayer, person: IPerson, actionIdent: IActionIdentifier, isPlayer?: boolean): ITaskTracker; - infiltrateSynthoidCommunities(): void; + infiltrateSynthoidCommunities(p: IPlayer): void; changeRank(player: IPlayer, change: number): void; processAction(router: IRouter, player: IPlayer, seconds: number): void; calculateStaminaGainPerSecond(player: IPlayer): number; diff --git a/src/Hospital/Hospital.ts b/src/Hospital/Hospital.ts index 4122d9f03..057afcbef 100644 --- a/src/Hospital/Hospital.ts +++ b/src/Hospital/Hospital.ts @@ -1,7 +1,8 @@ +import { IPlayer } from "../PersonObjects/IPlayer"; import { CONSTANTS } from "../Constants"; import { IPerson } from "../PersonObjects/IPerson"; -export function getHospitalizationCost(p: IPerson): number { +export function getHospitalizationCost(p: IPlayer): number { if (p.money < 0) { return 0; } @@ -9,7 +10,7 @@ export function getHospitalizationCost(p: IPerson): number { return Math.min(p.money * 0.1, (p.max_hp - p.hp) * CONSTANTS.HospitalCostPerHp); } -export function calculateHospitalizationCost(p: IPerson, damage: number): number { +export function calculateHospitalizationCost(p: IPlayer, damage: number): number { const oldhp = p.hp; p.hp -= damage; const cost = getHospitalizationCost(p); diff --git a/src/PersonObjects/IPerson.ts b/src/PersonObjects/IPerson.ts index 25cb9b9cc..18b697de2 100644 --- a/src/PersonObjects/IPerson.ts +++ b/src/PersonObjects/IPerson.ts @@ -1,6 +1,7 @@ // Interface that represents either the player (PlayerObject) or // a Sleeve. Used for functions that need to take in both. +import { IPlayerOwnedAugmentation } from "../Augmentation/PlayerOwnedAugmentation"; import { ITaskTracker } from "./ITaskTracker"; export interface IPerson { @@ -14,7 +15,6 @@ export interface IPerson { intelligence: number; hp: number; max_hp: number; - money: number; // Experience hacking_exp: number; @@ -47,6 +47,8 @@ export interface IPerson { bladeburner_analysis_mult: number; + augmentations: IPlayerOwnedAugmentation[]; + getIntelligenceBonus(weight: number): number; gainHackingExp(exp: number): void; gainStrengthExp(exp: number): void; diff --git a/src/PersonObjects/IPlayer.ts b/src/PersonObjects/IPlayer.ts index a328d4799..be62e8283 100644 --- a/src/PersonObjects/IPlayer.ts +++ b/src/PersonObjects/IPlayer.ts @@ -34,8 +34,6 @@ import { IPerson } from "./IPerson"; import { WorkType, ClassType, CrimeType } from "../utils/WorkType"; export interface IPlayer extends IPerson { - // Class members - augmentations: IPlayerOwnedAugmentation[]; bitNodeN: number; city: CityName; companyName: string; diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 69b077843..82f208c1d 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -15,189 +15,89 @@ export abstract class Person implements IPerson { /** * Stats */ - hacking; - strength; - defense; - dexterity; - agility; - charisma; - intelligence; - hp; - max_hp; - money; + hacking = 1; + strength = 1; + defense = 1; + dexterity = 1; + agility = 1; + charisma = 1; + intelligence = 0; + hp = 10; + max_hp = 10; /** * Experience */ - hacking_exp; - strength_exp; - defense_exp; - dexterity_exp; - agility_exp; - charisma_exp; - intelligence_exp; + hacking_exp = 0; + strength_exp = 0; + defense_exp = 0; + dexterity_exp = 0; + agility_exp = 0; + charisma_exp = 0; + intelligence_exp = 0; /** * Multipliers */ - hacking_mult; - strength_mult; - defense_mult; - dexterity_mult; - agility_mult; - charisma_mult; + hacking_mult = 1; + strength_mult = 1; + defense_mult = 1; + dexterity_mult = 1; + agility_mult = 1; + charisma_mult = 1; - hacking_exp_mult; - strength_exp_mult; - defense_exp_mult; - dexterity_exp_mult; - agility_exp_mult; - charisma_exp_mult; + hacking_exp_mult = 1; + strength_exp_mult = 1; + defense_exp_mult = 1; + dexterity_exp_mult = 1; + agility_exp_mult = 1; + charisma_exp_mult = 1; - hacking_chance_mult; - hacking_speed_mult; - hacking_money_mult; - hacking_grow_mult; + hacking_chance_mult = 1; + hacking_speed_mult = 1; + hacking_money_mult = 1; + hacking_grow_mult = 1; - company_rep_mult; - faction_rep_mult; + company_rep_mult = 1; + faction_rep_mult = 1; - crime_money_mult; - crime_success_mult; + crime_money_mult = 1; + crime_success_mult = 1; - work_money_mult; + work_money_mult = 1; - hacknet_node_money_mult; - hacknet_node_purchase_cost_mult; - hacknet_node_ram_cost_mult; - hacknet_node_core_cost_mult; - hacknet_node_level_cost_mult; + hacknet_node_money_mult = 1; + hacknet_node_purchase_cost_mult = 1; + hacknet_node_ram_cost_mult = 1; + hacknet_node_core_cost_mult = 1; + hacknet_node_level_cost_mult = 1; - bladeburner_max_stamina_mult; - bladeburner_stamina_gain_mult; - bladeburner_analysis_mult; - bladeburner_success_chance_mult; - - infiltration_base_rep_increase = 0; - infiltration_rep_mult = 1; - infiltration_trade_mult = 1; - infiltration_sell_mult = 1; - infiltration_timer_mult = 1; - infiltration_damage_reduction_mult = 1; + bladeburner_max_stamina_mult = 1; + bladeburner_stamina_gain_mult = 1; + bladeburner_analysis_mult = 1; + bladeburner_success_chance_mult = 1; /** * Augmentations */ - augmentations: IPlayerOwnedAugmentation[]; - queuedAugmentations: IPlayerOwnedAugmentation[]; + augmentations: IPlayerOwnedAugmentation[] = []; /** * City that the person is in */ city: CityName = CityName.Sector12; - gainHackingExp: (exp: number) => void; - gainStrengthExp: (exp: number) => void; - gainDefenseExp: (exp: number) => void; - gainDexterityExp: (exp: number) => void; - gainAgilityExp: (exp: number) => void; - gainCharismaExp: (exp: number) => void; - gainIntelligenceExp: (exp: number) => void; - gainStats: (retValue: ITaskTracker) => void; - calculateSkill: (exp: number, mult: number) => number; - regenerateHp: (amt: number) => void; - queryStatFromString: (str: string) => number; - - constructor() { - /** - * Stats - */ - this.hacking = 1; - this.strength = 1; - this.defense = 1; - this.dexterity = 1; - this.agility = 1; - this.charisma = 1; - this.intelligence = 1; - this.hp = 10; - this.max_hp = 10; - this.money = 0; - - /** - * Experience - */ - this.hacking_exp = 0; - this.strength_exp = 0; - this.defense_exp = 0; - this.dexterity_exp = 0; - this.agility_exp = 0; - this.charisma_exp = 0; - this.intelligence_exp = 0; - - /** - * Multipliers - */ - this.hacking_mult = 1; - this.strength_mult = 1; - this.defense_mult = 1; - this.dexterity_mult = 1; - this.agility_mult = 1; - this.charisma_mult = 1; - - this.hacking_exp_mult = 1; - this.strength_exp_mult = 1; - this.defense_exp_mult = 1; - this.dexterity_exp_mult = 1; - this.agility_exp_mult = 1; - this.charisma_exp_mult = 1; - - this.hacking_chance_mult = 1; - this.hacking_speed_mult = 1; - this.hacking_money_mult = 1; - this.hacking_grow_mult = 1; - - this.company_rep_mult = 1; - this.faction_rep_mult = 1; - - this.crime_money_mult = 1; - this.crime_success_mult = 1; - - this.work_money_mult = 1; - - this.hacknet_node_money_mult = 1; - this.hacknet_node_purchase_cost_mult = 1; - this.hacknet_node_ram_cost_mult = 1; - this.hacknet_node_core_cost_mult = 1; - this.hacknet_node_level_cost_mult = 1; - - this.bladeburner_max_stamina_mult = 1; - this.bladeburner_stamina_gain_mult = 1; - this.bladeburner_analysis_mult = 1; - this.bladeburner_success_chance_mult = 1; - - /** - * Augmentations - */ - this.augmentations = []; - this.queuedAugmentations = []; - - /** - * City that the person is in - */ - this.city = CityName.Sector12; - - this.gainHackingExp = generalMethods.gainHackingExp; - this.gainStrengthExp = generalMethods.gainStrengthExp; - this.gainDefenseExp = generalMethods.gainDefenseExp; - this.gainDexterityExp = generalMethods.gainDexterityExp; - this.gainAgilityExp = generalMethods.gainAgilityExp; - this.gainCharismaExp = generalMethods.gainCharismaExp; - this.gainIntelligenceExp = generalMethods.gainIntelligenceExp; - this.gainStats = generalMethods.gainStats; - this.calculateSkill = generalMethods.calculateSkill; - this.regenerateHp = generalMethods.regenerateHp; - this.queryStatFromString = generalMethods.queryStatFromString; - } + gainHackingExp = generalMethods.gainHackingExp; + gainStrengthExp = generalMethods.gainStrengthExp; + gainDefenseExp = generalMethods.gainDefenseExp; + gainDexterityExp = generalMethods.gainDexterityExp; + gainAgilityExp = generalMethods.gainAgilityExp; + gainCharismaExp = generalMethods.gainCharismaExp; + gainIntelligenceExp = generalMethods.gainIntelligenceExp; + gainStats = generalMethods.gainStats; + calculateSkill = generalMethods.calculateSkill; + regenerateHp = generalMethods.regenerateHp; + queryStatFromString = generalMethods.queryStatFromString; /** * Updates this object's multipliers for the given augmentation @@ -297,13 +197,6 @@ export abstract class Person implements IPerson { this.bladeburner_stamina_gain_mult = 1; this.bladeburner_analysis_mult = 1; this.bladeburner_success_chance_mult = 1; - - this.infiltration_base_rep_increase = 0; - this.infiltration_rep_mult = 1; - this.infiltration_trade_mult = 1; - this.infiltration_sell_mult = 1; - this.infiltration_timer_mult = 1; - this.infiltration_damage_reduction_mult = 1; } /** diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx index 9623108ec..b44ec6516 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx @@ -382,7 +382,7 @@ export function recordMoneySource(this: PlayerObject, amt: number, source: strin this.moneySourceB.record(amt, source); } -export function gainHackingExp(this: IPlayer, exp: number): void { +export function gainHackingExp(this: IPerson, exp: number): void { if (isNaN(exp)) { console.error("ERR: NaN passed into Player.gainHackingExp()"); return; diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index dd7312729..9b49e6e22 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -238,7 +238,7 @@ export class Sleeve extends Person { if (this.currentTaskTime >= this.currentTaskMaxTime) { if (this.bbAction === "Infiltrate synthoids") { - bb.infiltrateSynthoidCommunities(); + bb.infiltrateSynthoidCommunities(p); this.currentTaskTime = 0; return retValue; } From 0d437e5b7302fe20b53dfbffe53dc6c78337c3fa Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Fri, 20 May 2022 18:20:04 -0400 Subject: [PATCH 17/17] lint --- src/Hospital/Hospital.ts | 1 - src/NetscriptFunctions/Singularity.ts | 4 ++-- src/PersonObjects/Person.ts | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Hospital/Hospital.ts b/src/Hospital/Hospital.ts index 057afcbef..c392df19c 100644 --- a/src/Hospital/Hospital.ts +++ b/src/Hospital/Hospital.ts @@ -1,6 +1,5 @@ import { IPlayer } from "../PersonObjects/IPlayer"; import { CONSTANTS } from "../Constants"; -import { IPerson } from "../PersonObjects/IPerson"; export function getHospitalizationCost(p: IPlayer): number { if (p.money < 0) { diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts index 0d8c04e77..8cf3ffc5a 100644 --- a/src/NetscriptFunctions/Singularity.ts +++ b/src/NetscriptFunctions/Singularity.ts @@ -29,7 +29,7 @@ import { Router } from "../ui/GameRoot"; import { SpecialServers } from "../Server/data/SpecialServers"; import { Page } from "../ui/Router"; import { Locations } from "../Locations/Locations"; -import { GetServer, AddToAllServers, createUniqueRandomIp } from "../Server/AllServers"; +import { GetServer } from "../Server/AllServers"; import { Programs } from "../Programs/Programs"; import { numeralWrapper } from "../ui/numeralFormat"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; @@ -39,7 +39,7 @@ import { Factions, factionExists } from "../Faction/Factions"; import { Faction } from "../Faction/Faction"; import { netscriptDelay } from "../NetscriptEvaluator"; import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions"; -import { getServerOnNetwork, safetlyCreateUniqueServer } from "../Server/ServerHelpers"; +import { getServerOnNetwork } from "../Server/ServerHelpers"; import { Terminal } from "../Terminal"; import { calculateHackingTime } from "../Hacking"; import { Server } from "../Server/Server"; diff --git a/src/PersonObjects/Person.ts b/src/PersonObjects/Person.ts index 82f208c1d..8790a26b8 100644 --- a/src/PersonObjects/Person.ts +++ b/src/PersonObjects/Person.ts @@ -7,8 +7,6 @@ import { CONSTANTS } from "../Constants"; import { calculateSkill } from "./formulas/skill"; import { calculateIntelligenceBonus } from "./formulas/intelligence"; import { IPerson } from "./IPerson"; -import { Reviver } from "../utils/JSONReviver"; -import { ITaskTracker } from "./ITaskTracker"; // Base class representing a person-like object export abstract class Person implements IPerson {