From 988ca3776482771d83575d15ea879320cc20d6c4 Mon Sep 17 00:00:00 2001
From: Olivier Gagnon
+ Black Operations (Black Ops) are special, one-time covert operations.
+ Each Black Op must be unlocked successively by completing
+ the one before it.
+
+ Complete contracts in order to increase your Bladeburner rank and earn money.
+ Failing a contract will cause you to lose HP, which can lead to hospitalization.
+
+ These are generic actions that will assist you in your Bladeburner
+ duties. They will not affect your Bladeburner rank in any way.
+
+ Carry out operations for the Bladeburner division.
+ Failing an operation will reduce your Bladeburner rank. It will also
+ cause you to lose HP, which can lead to hospitalization. In general,
+ operations are harder and more punishing than contracts,
+ but are also more rewarding.
+
+ You will gain one skill point every {BladeburnerConstants.RanksPerSkillPoint} ranks.
+
+ Rank: {formatNumber(props.bladeburner.rank, 2)}
" +
- "You can unlock higher-level contracts by successfully completing them. " +
- "Higher-level contracts are more difficult, but grant more rank, experience, and money.";
-
- for (var contractName in this.contracts) {
- if (this.contracts.hasOwnProperty(contractName)) {
- DomElems.contracts[contractName] = createElement("div", {
- class:"bladeburner-action", name:contractName,
- });
- DomElems.actionsAndSkillsList.appendChild(DomElems.contracts[contractName]);
- }
- }
-}
-
-Bladeburner.prototype.createOperationsContent = function() {
- if (DomElems.actionsAndSkillsList == null || DomElems.actionsAndSkillsDesc == null) {
- throw new Error("Bladeburner.createOperationsContent called with either " +
- "DomElems.actionsAndSkillsList or DomElems.actionsAndSkillsDesc = null");
- }
-
- DomElems.actionsAndSkillsDesc.innerHTML =
- "Carry out operations for the Bladeburner division. " +
- "Failing an operation will reduce your Bladeburner rank. It will also " +
- "cause you to lose HP, which can lead to hospitalization. In general, " +
- "operations are harder and more punishing than contracts, " +
- "but are also more rewarding.
" +
- "Operations can affect the chaos level and Synthoid population of your " +
- "current city. The exact effects vary between different Operations.
" +
- "For operations, you can use a team. You must first recruit team members. " +
- "Having a larger team will improves your chances of success.
" +
- "You can unlock higher-level operations by successfully completing them. " +
- "Higher-level operations are more difficult, but grant more rank and experience.";
-
- for (var operationName in this.operations) {
- if (this.operations.hasOwnProperty(operationName)) {
- DomElems.operations[operationName] = createElement("div", {
- class:"bladeburner-action", name:operationName,
- });
- DomElems.actionsAndSkillsList.appendChild(DomElems.operations[operationName]);
- }
- }
-}
-
-Bladeburner.prototype.createBlackOpsContent = function() {
-
- if (DomElems.actionsAndSkillsList == null || DomElems.actionsAndSkillsDesc == null) {
- throw new Error("Bladeburner.createBlackOpsContent called with either " +
- "DomElems.actionsAndSkillsList or DomElems.actionsAndSkillsDesc = null");
- }
-
-
- DomElems.actionsAndSkillsDesc.innerHTML =
- "Black Operations (Black Ops) are special, one-time covert operations. " +
- "Each Black Op must be unlocked successively by completing " +
- "the one before it.
" +
- "Your ultimate goal to climb through the ranks of Bladeburners is to complete " +
- "all of the Black Ops.
" +
- "Like normal operations, you may use a team for Black Ops. Failing " +
- "a black op will incur heavy HP and rank losses.";
-
- // Put Black Operations in sequence of required rank
- var blackops = [];
- for (var blackopName in BlackOperations) {
- if (BlackOperations.hasOwnProperty(blackopName)) {
- blackops.push(BlackOperations[blackopName]);
- }
- }
- blackops.sort(function(a, b) {
- return (a.reqdRank - b.reqdRank);
- });
-
- for (var i = blackops.length-1; i >= 0 ; --i) {
- if (this.blackops[[blackops[i].name]] == null && i !== 0 && this.blackops[[blackops[i-1].name]] == null) {continue;} // If this one nor the next are completed then this isn't unlocked yet.
- DomElems.blackops[blackops[i].name] = createElement("div", {
- class:"bladeburner-action", name:blackops[i].name,
- });
- DomElems.actionsAndSkillsList.appendChild(DomElems.blackops[blackops[i].name]);
- }
-}
-
-Bladeburner.prototype.createSkillsContent = function() {
- if (DomElems.actionsAndSkillsList == null || DomElems.actionsAndSkillsDesc == null) {
- throw new Error("Bladeburner.createSkillsContent called with either " +
- "DomElems.actionsAndSkillsList or DomElems.actionsAndSkillsDesc = null");
- }
-
- // Display Current multipliers
- DomElems.actionsAndSkillsDesc.innerHTML =
- "You will gain one skill point every " + BladeburnerConstants.RanksPerSkillPoint + " ranks.
" +
- "Note that when upgrading a skill, the benefit for that skill is additive. " +
- "However, the effects of different skills with each other is multiplicative.
"
- var multKeys = Object.keys(this.skillMultipliers);
- for (var i = 0; i < multKeys.length; ++i) {
- var mult = this.skillMultipliers[multKeys[i]];
- if (mult && mult !== 1) {
- mult = formatNumber(mult, 3);
- switch(multKeys[i]) {
- case "successChanceAll":
- DomElems.actionsAndSkillsDesc.innerHTML += "Total Success Chance: x" + mult + "
";
- break;
- case "successChanceStealth":
- DomElems.actionsAndSkillsDesc.innerHTML += "Stealth Success Chance: x" + mult + "
";
- break;
- case "successChanceKill":
- DomElems.actionsAndSkillsDesc.innerHTML += "Retirement Success Chance: x" + mult + "
";
- break;
- case "successChanceContract":
- DomElems.actionsAndSkillsDesc.innerHTML += "Contract Success Chance: x" + mult + "
";
- break;
- case "successChanceOperation":
- DomElems.actionsAndSkillsDesc.innerHTML += "Operation Success Chance: x" + mult + "
";
- break;
- case "successChanceEstimate":
- DomElems.actionsAndSkillsDesc.innerHTML += "Synthoid Data Estimate: x" + mult + "
";
- break;
- case "actionTime":
- DomElems.actionsAndSkillsDesc.innerHTML += "Action Time: x" + mult + "
";
- break;
- case "effHack":
- DomElems.actionsAndSkillsDesc.innerHTML += "Hacking Skill: x" + mult + "
";
- break;
- case "effStr":
- DomElems.actionsAndSkillsDesc.innerHTML += "Strength: x" + mult + "
";
- break;
- case "effDef":
- DomElems.actionsAndSkillsDesc.innerHTML += "Defense: x" + mult + "
";
- break;
- case "effDex":
- DomElems.actionsAndSkillsDesc.innerHTML += "Dexterity: x" + mult + "
";
- break;
- case "effAgi":
- DomElems.actionsAndSkillsDesc.innerHTML += "Agility: x" + mult + "
";
- break;
- case "effCha":
- DomElems.actionsAndSkillsDesc.innerHTML += "Charisma: x" + mult + "
";
- break;
- case "effInt":
- DomElems.actionsAndSkillsDesc.innerHTML += "Intelligence: x" + mult + "
";
- break;
- case "stamina":
- DomElems.actionsAndSkillsDesc.innerHTML += "Stamina: x" + mult + "
";
- break;
- case "money":
- DomElems.actionsAndSkillsDesc.innerHTML += "Contract Money: x" + mult + "
";
- break;
- case "expGain":
- DomElems.actionsAndSkillsDesc.innerHTML += "Exp Gain: x" + mult + "
";
- break;
- default:
- console.warn(`Unrecognized SkillMult Key: ${multKeys[i]}`);
- break;
- }
- }
- }
-
- // Skill Points
- DomElems.skillPointsDisplay = createElement("p", {
- innerHTML:"
Skill Points: " + formatNumber(this.skillPoints, 0) + "",
- });
- DomElems.actionAndSkillsDiv.appendChild(DomElems.skillPointsDisplay);
-
- // UI Element for each skill
- for (var skillName in Skills) {
- if (Skills.hasOwnProperty(skillName)) {
- DomElems.skills[skillName] = createElement("div", {
- class:"bladeburner-action", name:skillName,
- });
- DomElems.actionsAndSkillsList.appendChild(DomElems.skills[skillName]);
- }
- }
-}
-
Bladeburner.prototype.updateContent = function() {
this.updateOverviewContent();
- this.updateActionAndSkillsContent();
}
Bladeburner.prototype.updateOverviewContent = function() {
- if (!routing.isOn(Page.Bladeburner)) {return;}
- DomElems.overviewRank.childNodes[0].nodeValue = "Rank: " + formatNumber(this.rank, 2);
- DomElems.overviewStamina.innerText = "Stamina: " + formatNumber(this.stamina, 3) + " / " + formatNumber(this.maxStamina, 3);
- ReactDOM.render(<>
- Stamina Penalty: {formatNumber((1-this.calculateStaminaPenalty())*100, 1)}%
- Team Size: {formatNumber(this.teamSize, 0)}
- Team Members Lost: {formatNumber(this.teamLost, 0)}
- Num Times Hospitalized: {this.numHosp}
- Money Lost From Hospitalizations: {Money(this.moneyLost)}
- Current City: {this.city}
- >, DomElems.overviewGen1);
-
- DomElems.overviewEstPop.childNodes[0].nodeValue = "Est. Synthoid Population: " + numeralWrapper.formatPopulation(this.getCurrentCity().popEst);
- DomElems.overviewEstComms.childNodes[0].nodeValue = "Est. Synthoid Communities: " + formatNumber(this.getCurrentCity().comms, 0);
- DomElems.overviewChaos.childNodes[0].nodeValue = "City Chaos: " + formatNumber(this.getCurrentCity().chaos);
- DomElems.overviewSkillPoints.innerText = "Skill Points: " + formatNumber(this.skillPoints, 0);
- DomElems.overviewBonusTime.childNodes[0].nodeValue = "Bonus time: " + convertTimeMsToTimeElapsedString(this.storedCycles/BladeburnerConstants.CyclesPerSecond*1000);
- ReactDOM.render(StatsTable([
- ["Aug. Success Chance mult: ", formatNumber(Player.bladeburner_success_chance_mult*100, 1) + "%"],
- ["Aug. Max Stamina mult: ", formatNumber(Player.bladeburner_max_stamina_mult*100, 1) + "%"],
- ["Aug. Stamina Gain mult: ", formatNumber(Player.bladeburner_stamina_gain_mult*100, 1) + "%"],
- ["Aug. Field Analysis mult: ", formatNumber(Player.bladeburner_analysis_mult*100, 1) + "%"],
- ]), DomElems.overviewAugMults);
+ if (!routing.isOn(Page.Bladeburner)) return;
+ ReactDOM.render(
Skill Points: " + formatNumber(this.skillPoints, 0) + "";
-
- var skillElems = Object.keys(DomElems.skills);
- for (var i = 0; i < skillElems.length; ++i) {
- var skillElem = DomElems.skills[skillElems[i]];
- var name = skillElem.name;
- var skill = Skills[name];
- if (skill == null) {
- throw new Error("Could not find Skill " + name + " in Bladeburner.updateActionAndSkillsContent()");
- }
- this.updateSkillsUIElement(skillElem, skill);
- }
- break;
- default:
- throw new Error("Invalid value for DomElems.currentTab in Bladeburner.createActionAndSkillsContent");
- }
-}
-
-Bladeburner.prototype.updateGeneralActionsUIElement = function(el, action) {
- ReactDOM.unmountComponentAtNode(el);
- ReactDOM.render(
+
+ Your ultimate goal to climb through the ranks of Bladeburners is to complete
+ all of the Black Ops.
+
+
+ Like normal operations, you may use a team for Black Ops. Failing
+ a black op will incur heavy HP and rank losses.
+
+
+ You can unlock higher-level contracts by successfully completing them.
+ Higher-level contracts are more difficult, but grant more rank, experience, and money.
+
+
+ Operations can affect the chaos level and Synthoid population of your
+ current city. The exact effects vary between different Operations.
+
+
+ For operations, you can use a team. You must first recruit team members.
+ Having a larger team will improves your chances of success.
+
+
+ You can unlock higher-level operations by successfully completing them.
+ Higher-level operations are more difficult, but grant more rank and experience.
+
+
+ Note that when upgrading a skill, the benefit for that skill is additive.
+ However, the effects of different skills with each other is multiplicative.
+
+
+
>}
+ {valid(mults["successChanceStealth"]) && <>Stealth Success Chance: x{formatNumber(mults["successChanceStealth"], 3)}
>}
+ {valid(mults["successChanceKill"]) && <>Retirement Success Chance: x{formatNumber(mults["successChanceKill"], 3)}
>}
+ {valid(mults["successChanceContract"]) && <>Contract Success Chance: x{formatNumber(mults["successChanceContract"], 3)}
>}
+ {valid(mults["successChanceOperation"]) && <>Operation Success Chance: x{formatNumber(mults["successChanceOperation"], 3)}
>}
+ {valid(mults["successChanceEstimate"]) && <>Synthoid Data Estimate: x{formatNumber(mults["successChanceEstimate"], 3)}
>}
+ {valid(mults["actionTime"]) && <>Action Time: x{formatNumber(mults["actionTime"], 3)}
>}
+ {valid(mults["effHack"]) && <>Hacking Skill: x{formatNumber(mults["effHack"], 3)}
>}
+ {valid(mults["effStr"]) && <>Strength: x{formatNumber(mults["effStr"], 3)}
>}
+ {valid(mults["effDef"]) && <>Defense: x{formatNumber(mults["effDef"], 3)}
>}
+ {valid(mults["effDex"]) && <>Dexterity: x{formatNumber(mults["effDex"], 3)}
>}
+ {valid(mults["effAgi"]) && <>Agility: x{formatNumber(mults["effAgi"], 3)}
>}
+ {valid(mults["effCha"]) && <>Charisma: x{formatNumber(mults["effCha"], 3)}
>}
+ {valid(mults["effInt"]) && <>Intelligence: x{formatNumber(mults["effInt"], 3)}
>}
+ {valid(mults["stamina"]) && <>Stamina: x{formatNumber(mults["stamina"], 3)}
>}
+ {valid(mults["money"]) && <>Contract Money: x{formatNumber(mults["money"], 3)}
>}
+ {valid(mults["expGain"]) && <>Exp Gain: x{formatNumber(mults["expGain"], 3)}
>}
+
+
" +
+ "Your max stamina is determined primarily by your agility stat.
" +
+ "Your stamina gain rate is determined by both your agility and your " +
+ "max stamina. Higher max stamina leads to a higher gain rate.
" +
+ "Once your " +
+ "stamina falls below 50% of its max value, it begins to negatively " +
+ "affect the success rate of your contracts/operations. This penalty " +
+ "is shown in the overview panel. If the penalty is 15%, then this means " +
+ "your success rate would be multipled by 85% (100 - 15).
" +
+ "Your max stamina and stamina gain rate can also be increased by " +
+ "training, or through skills and Augmentation upgrades.");
+ }
+
+ function openPopulationHelp(): void {
+ dialogBoxCreate("The success rate of your contracts/operations depends on " +
+ "the population of Synthoids in your current city. " +
+ "The success rate that is shown to you is only an estimate, " +
+ "and it is based on your Synthoid population estimate.
" +
+ "Therefore, it is important that this Synthoid population estimate " +
+ "is accurate so that you have a better idea of your " +
+ "success rate for contracts/operations. Certain " +
+ "actions will increase the accuracy of your population " +
+ "estimate.
" +
+ "The Synthoid populations of cities can change due to your " +
+ "actions or random events. If random events occur, they will " +
+ "be logged in the Bladeburner Console.");
+ }
+
+ return (
+ Stamina: {formatNumber(props.bladeburner.stamina, 3)} / {formatNumber(props.bladeburner.maxStamina, 3)}
+
+ Est. Synthoid Population: {numeralWrapper.formatPopulation(props.bladeburner.getCurrentCity().popEst)}
+
+ Est. Synthoid Communities: {formatNumber(props.bladeburner.getCurrentCity().comms, 0)}
+ City Chaos: {formatNumber(props.bladeburner.getCurrentCity().chaos)}
+ Skill Points: {formatNumber(props.bladeburner.skillPoints, 0)}
+ Bonus time: {convertTimeMsToTimeElapsedString(props.bladeburner.storedCycles/BladeburnerConstants.CyclesPerSecond*1000)}
+ Stamina Penalty: {formatNumber((1-props.bladeburner.calculateStaminaPenalty())*100, 1)}%
+ Team Size: {formatNumber(props.bladeburner.teamSize, 0)}
+ Team Members Lost: {formatNumber(props.bladeburner.teamLost, 0)}
+ Num Times Hospitalized: {props.bladeburner.numHosp}
+ Money Lost From Hospitalizations: {Money(props.bladeburner.moneyLost)}
+ Current City: {props.bladeburner.city}
+ {StatsTable([
+ ["Aug. Success Chance mult: ", formatNumber(props.player.bladeburner_success_chance_mult*100, 1) + "%"],
+ ["Aug. Max Stamina mult: ", formatNumber(props.player.bladeburner_max_stamina_mult*100, 1) + "%"],
+ ["Aug. Stamina Gain mult: ", formatNumber(props.player.bladeburner_stamina_gain_mult*100, 1) + "%"],
+ ["Aug. Field Analysis mult: ", formatNumber(props.player.bladeburner_analysis_mult*100, 1) + "%"],
+ ])}
+