Sleeve: Duplicate your consciousness into Synthoids, allowing you to perform different tasks asynchronously.
- You cannot buy Sleeves outside this BitNode.
+ You cannot buy Sleeves or upgrade them outside this BitNode.
Grafting: Visit VitaLife in New Tokyo to get access to this technology. It allows you to graft
diff --git a/src/Documentation/doc/en/advanced/bitnodes.md b/src/Documentation/doc/en/advanced/bitnodes.md
index d0d00f6b6..0f631a7c5 100644
--- a/src/Documentation/doc/en/advanced/bitnodes.md
+++ b/src/Documentation/doc/en/advanced/bitnodes.md
@@ -196,7 +196,7 @@ achieved immortality - at least for those that could afford it.
This BitNode unlocks Sleeve and Grafting technology:
-- Sleeve: Duplicate your consciousness into Synthoids, allowing you to perform different tasks asynchronously. You cannot buy Sleeves outside this BitNode.
+- Sleeve: Duplicate your consciousness into Synthoids, allowing you to perform different tasks asynchronously. You cannot buy Sleeves or upgrade them outside this BitNode.
- Grafting: Visit VitaLife in New Tokyo to get access to this technology. It allows you to graft augmentations, which is an alternative way of installing augmentations.
Destroying this BitNode will give you Source-File 10, or if you already have this Source-File, it will upgrade its level up to a maximum of 3. This Source-File unlocks Sleeve and Grafting API in other BitNodes. Each level of this Source-File also grants you a Sleeve.
diff --git a/src/Faction/FactionInfo.tsx b/src/Faction/FactionInfo.tsx
index 2ba25af81..75372fb5b 100644
--- a/src/Faction/FactionInfo.tsx
+++ b/src/Faction/FactionInfo.tsx
@@ -39,6 +39,7 @@ import { SpecialServers } from "../Server/data/SpecialServers";
import { CONSTANTS } from "../Constants";
import { BladeburnerConstants } from "../Bladeburner/data/Constants";
import type { PlayerObject } from "../PersonObjects/Player/PlayerObject";
+import { CovenantCampaign } from "./ui/CovenantCampaign";
interface FactionInfoParams {
infoText?: JSX.Element;
@@ -51,7 +52,7 @@ interface FactionInfoParams {
offerSecurityWork?: boolean;
special?: boolean;
keepOnInstall?: boolean;
- assignment?: () => React.ReactElement;
+ campaign?: () => React.ReactElement;
}
/** Contains the "information" property for all the Factions, which is just a description of each faction */
@@ -65,10 +66,10 @@ export class FactionInfo {
/** The hint to show about how to get invited to this faction. */
rumorText: JSX.Element;
- /** Conditions for being automatically inivited to this facton. */
+ /** Conditions for being automatically invited to this faction. */
inviteReqs: CompoundPlayerCondition;
- /** Conditions for automatically hearing a rumor about this facton. */
+ /** Conditions for automatically hearing a rumor about this faction. */
rumorReqs: CompoundPlayerCondition;
/** A flag indicating if the faction supports field work to earn reputation. */
@@ -87,7 +88,7 @@ export class FactionInfo {
special: boolean;
/** The data to display on the faction screen. */
- assignment?: () => React.ReactElement;
+ campaign?: () => React.ReactElement;
constructor(params: FactionInfoParams) {
this.infoText = params.infoText ?? <>>;
@@ -101,7 +102,7 @@ export class FactionInfo {
this.keep = params.keepOnInstall ?? false;
this.special = params.special ?? false;
- this.assignment = params.assignment;
+ this.campaign = params.campaign;
}
offersWork(): boolean {
@@ -170,6 +171,9 @@ export const FactionInfos: Record = {
],
offerHackingWork: true,
offerFieldWork: true,
+ campaign: () => {
+ return ;
+ },
}),
// Megacorporations, each forms its own faction
@@ -706,7 +710,7 @@ export const FactionInfos: Record = {
offerFieldWork: false,
offerSecurityWork: false,
special: true,
- assignment: (): React.ReactElement => {
+ campaign: (): React.ReactElement => {
return (
+ setOpen(false)}>
+
+ You tried your best to help the research team, but this research isn't making any progress.
+
+
+ {knowAboutBitverse() ? (
+ "Maybe this research can only be completed in BitNode 10?"
+ ) : (
+ <>
+ Research data is always randomly corrupted for unknown reasons, and a weird message is sent to you every
+ time it happens:
+
+
+ #@)($*&@__Y0U__^%$#@&*()__HAV3__(&@#*$%(@
+
+ ()@#*$%(__N0T__@&$#)@*(__S33N__)(*@#&$)(
+
+ @&*($#@&__TH3__#@A@*)(@$#@)*
+
+ %$#@&()@__TRU1H__()*@#$&()@#$
+ >
+ )}
+
+
+ >
+ );
+}
+
+export function CovenantCampaign() {
+ const [open, setOpen] = useState(false);
+
+ if (Player.bitNodeN !== 10) {
+ return ;
+ }
+
+ return (
+ <>
+
+ setOpen(false)} />
+ >
+ );
+}
diff --git a/src/Faction/ui/FactionRoot.tsx b/src/Faction/ui/FactionRoot.tsx
index 8a549a21a..bcb2a607a 100644
--- a/src/Faction/ui/FactionRoot.tsx
+++ b/src/Faction/ui/FactionRoot.tsx
@@ -3,7 +3,7 @@
* This is the component for displaying a single faction's UI, not the list of all
* accessible factions
*/
-import React, { useState } from "react";
+import React from "react";
import { DonateOption } from "./DonateOption";
import { Info } from "./Info";
@@ -16,12 +16,12 @@ import { Page } from "../../ui/Router";
import { Player } from "@player";
import { Typography, Button } from "@mui/material";
-import { CovenantPurchasesRoot } from "../../PersonObjects/Sleeve/ui/CovenantPurchasesRoot";
-import { FactionName, FactionWorkType } from "@enums";
+import { FactionWorkType } from "@enums";
import { GangButton } from "./GangButton";
import { FactionWork } from "../../Work/FactionWork";
import { useCycleRerender } from "../../ui/React/hooks";
import { favorNeededToDonate } from "../formulas/donation";
+import { knowAboutBitverse } from "../../BitNode/BitNodeUtils";
type FactionRootProps = {
faction: Faction;
@@ -47,7 +47,6 @@ const augmentationsInfo =
"As your reputation with this faction rises, you will " +
"unlock augmentations, which you can purchase to enhance " +
"your abilities.";
-const sleevePurchasesInfo = "Purchase Duplicate Sleeves and upgrades. These are permanent!";
interface IMainProps {
faction: Faction;
@@ -56,7 +55,6 @@ interface IMainProps {
}
function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.ReactElement {
- const [sleevesOpen, setSleevesOpen] = useState(false);
const factionInfo = faction.getInfo();
function startWork(): void {
@@ -105,7 +103,6 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
// should be shown
const favorToDonate = favorNeededToDonate();
const canDonate = faction.favor >= favorToDonate;
- const canPurchaseSleeves = faction.name === FactionName.TheCovenant && Player.bitNodeN === 10;
return (
<>
@@ -115,33 +112,41 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
- {!isPlayersGang && factionInfo.offerHackingWork && (
-
- {canPurchaseSleeves && (
+ {!isPlayersGang && (
<>
-