diff --git a/src/Faction/ui/FactionRoot.tsx b/src/Faction/ui/FactionRoot.tsx
index 151d58687..dbcc34b22 100644
--- a/src/Faction/ui/FactionRoot.tsx
+++ b/src/Faction/ui/FactionRoot.tsx
@@ -18,8 +18,7 @@ import { Faction } from "../Faction";
import { use } from "../../ui/Context";
import { CreateGangModal } from "./CreateGangModal";
-import Typography from "@mui/material/Typography";
-import Button from "@mui/material/Button";
+import { Box, Paper, Typography, Button, Tooltip } from "@mui/material";
import { CovenantPurchasesRoot } from "../../PersonObjects/Sleeve/ui/CovenantPurchasesRoot";
import { FactionNames } from "../data/FactionNames";
import { GangConstants } from "../../Gang/data/Constants";
@@ -105,12 +104,17 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
const canPurchaseSleeves = faction.name === FactionNames.TheCovenant && player.bitNodeN === 10;
- let canAccessGang = player.canAccessGang() && GangConstants.Names.includes(faction.name);
+ // Note : For future-proofing sake, an assumption is made that player is intended to retain access to his gang if his karma were to somehow increases.
+ let isManageGangVisible = GangConstants.Names.includes(faction.name) && player.isAwareOfGang();
+ // karma threshold is only checked at that point, via canAccessGang(). No further check is made.
+ let isManageGangClickable = player.canAccessGang();
if (player.inGang()) {
if (player.getGangName() !== faction.name) {
- canAccessGang = false;
+ isManageGangVisible = false;
} else if (player.getGangName() === faction.name) {
- canAccessGang = true;
+ isManageGangVisible = true;
+ // The following line will enable the button, without checking for karma threshold.
+ isManageGangClickable = true;
}
}
@@ -121,9 +125,23 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
{faction.name}
- {canAccessGang && (
+ {isManageGangVisible && (
<>
-
+
+
+ Unlocked when reaching {GangConstants.GangKarmaRequirement} karma : ""}
+ >
+
+
+ {gangInfo}
+
+
+
+
+
setGangOpen(false)} />
>
)}
diff --git a/src/Gang/data/Constants.ts b/src/Gang/data/Constants.ts
index 73a938090..6d3ada486 100644
--- a/src/Gang/data/Constants.ts
+++ b/src/Gang/data/Constants.ts
@@ -6,6 +6,7 @@ export const GangConstants: {
CyclesPerTerritoryAndPowerUpdate: number;
AscensionMultiplierRatio: number;
Names: string[];
+ GangKarmaRequirement: number;
} = {
// Respect is divided by this to get rep gain
GangRespectToReputationRatio: 75,
@@ -23,4 +24,5 @@ export const GangConstants: {
FactionNames.NiteSec,
FactionNames.TheBlackHand,
],
+ GangKarmaRequirement: -54000,
};
diff --git a/src/PersonObjects/IPlayer.ts b/src/PersonObjects/IPlayer.ts
index ca1f2940a..1341e8c33 100644
--- a/src/PersonObjects/IPlayer.ts
+++ b/src/PersonObjects/IPlayer.ts
@@ -208,6 +208,7 @@ export interface IPlayer {
hasProgram(program: string): boolean;
inBladeburner(): boolean;
inGang(): boolean;
+ isAwareOfGang(): boolean;
isQualified(company: Company, position: CompanyPosition): boolean;
loseMoney(money: number, source: string): void;
process(router: IRouter, numCycles?: number): void;
diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts
index 72d15e3c1..b61c3b72c 100644
--- a/src/PersonObjects/Player/PlayerObject.ts
+++ b/src/PersonObjects/Player/PlayerObject.ts
@@ -218,6 +218,7 @@ export class PlayerObject implements IPlayer {
hasProgram: (program: string) => boolean;
inBladeburner: () => boolean;
inGang: () => boolean;
+ isAwareOfGang: () => boolean;
isQualified: (company: Company, position: CompanyPosition) => boolean;
loseMoney: (money: number, source: string) => void;
reapplyAllAugmentations: (resetMultipliers?: boolean) => void;
@@ -604,6 +605,7 @@ export class PlayerObject implements IPlayer {
this.hasCorporation = corporationMethods.hasCorporation;
this.startCorporation = corporationMethods.startCorporation;
this.canAccessGang = gangMethods.canAccessGang;
+ this.isAwareOfGang = gangMethods.isAwareOfGang;
this.getGangFaction = gangMethods.getGangFaction;
this.getGangName = gangMethods.getGangName;
this.hasGangWith = gangMethods.hasGangWith;
diff --git a/src/PersonObjects/Player/PlayerObjectGangMethods.ts b/src/PersonObjects/Player/PlayerObjectGangMethods.ts
index b9c781fb2..02242d5ff 100644
--- a/src/PersonObjects/Player/PlayerObjectGangMethods.ts
+++ b/src/PersonObjects/Player/PlayerObjectGangMethods.ts
@@ -2,9 +2,9 @@ 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"
+
-// Amount of negative karma needed to manage a gang in BitNodes other than 2
-const GangKarmaRequirement = -54000;
export function canAccessGang(this: IPlayer): boolean {
if (this.bitNodeN === 2) {
@@ -14,7 +14,11 @@ export function canAccessGang(this: IPlayer): boolean {
return false;
}
- return this.karma <= GangKarmaRequirement;
+ return this.karma <= GangConstants.GangKarmaRequirement;
+}
+
+export function isAwareOfGang(this: IPlayer): boolean {
+ return this.bitNodeN === 2 || this.sourceFileLvl(2) >= 1;
}
export function getGangFaction(this: IPlayer): Faction {