+ >
+ )}
+
{Player.inGang() && (
-
- Your Gang
-
- )}
- {Player.inGang() && (
-
-
-
+ <>
+
+ Your Gang
+
+
+
+
+ >
)}
Your Factions
{allJoinedFactions.length > 0 ? (
- allJoinedFactions.map((facName) => {
- if (!Object.hasOwn(Factions, facName) || Player.getGangName() === facName) return null;
- return ;
+ allJoinedFactions.map((faction) => {
+ if (Player.getGangName() === faction.name) return null;
+ return ;
})
) : (
You have not yet joined any Factions.
diff --git a/src/Infiltration/ui/Game.tsx b/src/Infiltration/ui/Game.tsx
index 0d028a9e5..855d80961 100644
--- a/src/Infiltration/ui/Game.tsx
+++ b/src/Infiltration/ui/Game.tsx
@@ -1,6 +1,6 @@
import { Button, Container, Paper, Typography } from "@mui/material";
import React, { useCallback, useState } from "react";
-import { AugmentationName } from "@enums";
+import { AugmentationName, FactionName } from "@enums";
import { Router } from "../../ui/GameRoot";
import { Page } from "../../ui/Router";
import { Player } from "@player";
@@ -89,6 +89,7 @@ export function Game(props: GameProps): React.ReactElement {
(options?: { automated: boolean }) => {
setStage(Stage.Countdown);
pushResult(false);
+ Player.receiveRumor(FactionName.ShadowsOfAnarchy);
// Kill the player immediately if they use automation, so
// it's clear they're not meant to
const damage = options?.automated
diff --git a/src/Literature/Literature.ts b/src/Literature/Literature.ts
index 579e51cb8..2ff2d1466 100644
--- a/src/Literature/Literature.ts
+++ b/src/Literature/Literature.ts
@@ -1,9 +1,10 @@
import { FilePath, asFilePath } from "../Paths/FilePath";
-import type { LiteratureName } from "@enums";
+import type { LiteratureName, FactionName } from "@enums";
interface LiteratureConstructorParams {
title: string;
filename: LiteratureName;
+ factionRumors?: FactionName[];
text: string;
}
/**
@@ -13,11 +14,13 @@ interface LiteratureConstructorParams {
export class Literature {
title: string;
filename: LiteratureName & FilePath;
+ factionRumors: FactionName[];
text: string;
- constructor({ title, filename, text }: LiteratureConstructorParams) {
+ constructor({ title, filename, factionRumors, text }: LiteratureConstructorParams) {
this.title = title;
this.filename = asFilePath(filename);
+ this.factionRumors = factionRumors || [];
this.text = text;
}
}
diff --git a/src/Literature/LiteratureHelpers.ts b/src/Literature/LiteratureHelpers.ts
index dff34e4ca..0bbbfbc88 100644
--- a/src/Literature/LiteratureHelpers.ts
+++ b/src/Literature/LiteratureHelpers.ts
@@ -1,12 +1,16 @@
import { Literatures } from "./Literatures";
import { dialogBoxCreate } from "../ui/React/DialogBox";
import { LiteratureName } from "@enums";
+import { Player } from "@player";
export function showLiterature(fn: LiteratureName): void {
const litObj = Literatures[fn];
if (litObj == null) {
return;
}
+ for (const factionName of litObj.factionRumors) {
+ Player.receiveRumor(factionName);
+ }
const txt = `${litObj.title}
${litObj.text}`;
dialogBoxCreate(txt, true);
}
diff --git a/src/Literature/Literatures.ts b/src/Literature/Literatures.ts
index b54a82241..c498fec1a 100644
--- a/src/Literature/Literatures.ts
+++ b/src/Literature/Literatures.ts
@@ -1,4 +1,4 @@
-import { CityName, FactionName, LiteratureName } from "@enums";
+import { CityName, FactionName, CompanyName, LiteratureName } from "@enums";
import { Literature } from "./Literature";
export const Literatures: Record = {
@@ -77,6 +77,7 @@ export const Literatures: Record = {
[LiteratureName.HistoryOfSynthoids]: new Literature({
title: "A Brief History of Synthoids",
filename: LiteratureName.HistoryOfSynthoids,
+ factionRumors: [FactionName.OmniTekIncorporated, FactionName.Bladeburners],
text:
"Synthetic androids, or Synthoids for short, are genetically engineered robots and, short of Augmentations, " +
"are composed entirely of organic substances. For this reason, Synthoids are virtually identical to " +
@@ -195,10 +196,11 @@ export const Literatures: Record = {
[LiteratureName.BrighterThanTheSun]: new Literature({
title: "Brighter than the Sun",
filename: LiteratureName.BrighterThanTheSun,
+ factionRumors: [FactionName.KuaiGongInternational, FactionName.OmniTekIncorporated],
text:
- `When people think about the corporations that dominate the East, they typically think of ${FactionName.KuaiGongInternational}, which ` +
- "holds a complete monopoly for manufacturing and commerce in Asia, or Global Pharmaceuticals, the world's largest " +
- `drug company, or ${FactionName.OmniTekIncorporated}, the global leader in intelligent and autonomous robots. But there's one company ` +
+ `When people think about the corporations that dominate the East, they typically think of ${CompanyName.KuaiGongInternational}, which ` +
+ `holds a complete monopoly for manufacturing and commerce in Asia, or ${CompanyName.GlobalPharmaceuticals}, the world's largest ` +
+ `drug company, or ${CompanyName.OmniTekIncorporated}, the global leader in intelligent and autonomous robots. But there's one company ` +
"that has seen a rapid rise in the last year and is poised to dominate not only the East, but the entire world: TaiYang Digital.
" +
"TaiYang Digital is a Chinese internet-technology corporation that provides services such as " +
"online advertising, search engines, gaming, media, entertainment, and cloud computing/storage. Its name TaiYang comes from the Chinese word " +
@@ -210,7 +212,7 @@ export const Literatures: Record = {
"TaiYang Digital's meteoric rise is extremely surprising in modern society. This sort of growth is " +
"something you'd commonly see in the first half of the century, especially for tech companies. However in " +
"the last two decades the number of corporations has significantly declined as the largest entities " +
- `quickly took over the economy. Corporations such as ${FactionName.ECorp}, ${FactionName.MegaCorp}, and ${FactionName.KuaiGongInternational} have established ` +
+ `quickly took over the economy. Corporations such as ${CompanyName.ECorp}, ${CompanyName.MegaCorp}, and ${CompanyName.KuaiGongInternational} have established ` +
"such strong monopolies in their market sectors that they have effectively killed off all " +
"of the smaller and new corporations that have tried to start up over the years. This is what makes " +
"the rise of TaiYang Digital so impressive. And if TaiYang continues down this path, then they have " +
@@ -233,6 +235,7 @@ export const Literatures: Record = {
[LiteratureName.Sector12Crime]: new Literature({
title: `Figures Show Rising Crime Rates in ${CityName.Sector12}`,
filename: LiteratureName.Sector12Crime,
+ factionRumors: [FactionName.TheSyndicate, FactionName.SlumSnakes],
text:
"A recent study by analytics company Wilson Inc. shows a significant rise " +
`in criminal activity in ${CityName.Sector12}. Perhaps the most alarming part of the statistic ` +
@@ -267,6 +270,7 @@ export const Literatures: Record = {
[LiteratureName.SecretSocieties]: new Literature({
title: "Secret Societies",
filename: LiteratureName.SecretSocieties,
+ factionRumors: [FactionName.TheBlackHand, FactionName.NiteSec, FactionName.BitRunners],
text:
"The idea of secret societies has long intrigued the general public by inspiring curiosity, fascination, and " +
"distrust. People have long wondered about who these secret society members are and what they do, with the " +
@@ -304,13 +308,14 @@ export const Literatures: Record = {
[LiteratureName.CodedIntelligence]: new Literature({
title: "Coded Intelligence: Myth or Reality?",
filename: LiteratureName.CodedIntelligence,
+ factionRumors: [FactionName.OmniTekIncorporated],
text:
"Tremendous progress has been made in the field of Artificial Intelligence over the past few decades. " +
"Our autonomous vehicles and transportation systems. The electronic personal assistants that control our everyday lives. " +
"Medical, service, and manufacturing robots. All of these are examples of how far AI has come and how much it has " +
"improved our daily lives. However, the question still remains of whether AI will ever be advanced enough to re-create " +
"human intelligence.
" +
- `We've certainly come close to artificial intelligence that is similar to humans. For example ${FactionName.OmniTekIncorporated}'s ` +
+ `We've certainly come close to artificial intelligence that is similar to humans. For example ${CompanyName.OmniTekIncorporated}'s ` +
"CompanionBot, a robot meant to act as a comforting friend for lonely and grieving people, is eerily human-like " +
"in its appearance, speech, mannerisms, and even movement. However its artificial intelligence isn't the same as " +
"that of humans. Not yet. It doesn't have sentience or self-awareness or consciousness.
" +
@@ -335,14 +340,15 @@ export const Literatures: Record = {
[LiteratureName.TensionsInTechRace]: new Literature({
title: "Tensions rise in global tech race",
filename: LiteratureName.TensionsInTechRace,
+ factionRumors: [FactionName.OmniTekIncorporated, FactionName.MegaCorp, FactionName.ECorp],
text:
"Have we entered a new Cold War? Is WWIII just beyond the horizon?
" +
- `After rumors came out that ${FactionName.OmniTekIncorporated} had begun developing advanced robotic supersoldiers, ` +
+ `After rumors came out that ${CompanyName.OmniTekIncorporated} had begun developing advanced robotic supersoldiers, ` +
"geopolitical tensions quickly flared between the USA, Russia, and several Asian superpowers. " +
- `In a rare show of cooperation between corporations, ${FactionName.MegaCorp} and ${FactionName.ECorp} have ` +
+ `In a rare show of cooperation between corporations, ${CompanyName.MegaCorp} and ${CompanyName.ECorp} have ` +
"reportedly launched hundreds of new surveillance and espionage satellites. " +
"Defense contractors such as " +
- "DeltaOne and AeroCorp have been working with the CIA and NSA to prepare " +
+ `${CompanyName.DeltaOne} and ${CompanyName.AeroCorp} have been working with the CIA and NSA to prepare ` +
"for conflict. Meanwhile, the rest of the world sits in earnest " +
"hoping that it never reaches full-scale war. With today's technology " +
"and firepower, a World War would assuredly mean the end of human civilization.",
@@ -375,6 +381,7 @@ export const Literatures: Record = {
[LiteratureName.TheHiddenWorld]: new Literature({
title: "The Hidden World",
filename: LiteratureName.TheHiddenWorld,
+ factionRumors: [FactionName.Illuminati],
text:
"WAKE UP SHEEPLE
" +
"THE GOVERNMENT DOES NOT EXIST. CORPORATIONS DO NOT RUN SOCIETY
" +
@@ -394,6 +401,7 @@ export const Literatures: Record = {
[LiteratureName.TheNewGod]: new Literature({
title: "The New God",
filename: LiteratureName.TheNewGod,
+ factionRumors: [FactionName.ChurchOfTheMachineGod],
text:
"Everyone has a moment in their life when they wonder about the bigger questions.
" +
"What's the point of all this? What is my purpose?
" +
@@ -408,6 +416,7 @@ export const Literatures: Record = {
[LiteratureName.NewTriads]: new Literature({
title: "The New Triads",
filename: LiteratureName.NewTriads,
+ factionRumors: [FactionName.Tetrads],
text:
"The Triads were an ancient transnational crime syndicate based in China, Hong Kong, and other Asian " +
"territories. They were often considered one of the first and biggest criminal secret societies. " +
diff --git a/src/Message/Message.ts b/src/Message/Message.ts
index 8fea986c5..0bd99914d 100644
--- a/src/Message/Message.ts
+++ b/src/Message/Message.ts
@@ -1,5 +1,5 @@
import { FilePath, asFilePath } from "../Paths/FilePath";
-import { MessageFilename } from "@enums";
+import { MessageFilename, FactionName } from "@enums";
export class Message {
// Name of Message file
@@ -8,8 +8,12 @@ export class Message {
// The text contains in the Message
msg: string;
- constructor(filename: MessageFilename, msg: string) {
+ // Faction hinted at by the message
+ factionRumors: FactionName[];
+
+ constructor(filename: MessageFilename, msg: string, factionRumor?: FactionName) {
this.filename = asFilePath(filename);
this.msg = msg;
+ this.factionRumors = factionRumor ? [factionRumor] : [];
}
}
diff --git a/src/Message/MessageHelpers.tsx b/src/Message/MessageHelpers.tsx
index 2eff254b5..077b03337 100644
--- a/src/Message/MessageHelpers.tsx
+++ b/src/Message/MessageHelpers.tsx
@@ -12,10 +12,14 @@ import { Server } from "../Server/Server";
//Sends message to player, including a pop up
function sendMessage(name: MessageFilename, forced = false): void {
+ const msg = Messages[name];
if (forced || !Settings.SuppressMessages) {
showMessage(name);
}
addMessageToServer(name);
+ for (const factionName of msg.factionRumors) {
+ Player.receiveRumor(factionName);
+ }
}
function showMessage(name: MessageFilename): void {
@@ -113,6 +117,7 @@ const Messages: Record = {
"exploit them for their Augmentations. But do not trust them. " +
"They are not what they seem. No one is.\n\n" +
"-jump3R",
+ FactionName.CyberSec,
),
[MessageFilename.Jumper2]: new Message(
@@ -121,6 +126,7 @@ const Messages: Record = {
"you want to find the truth, worry only about yourself. Ethics and " +
`morals will get you killed. \n\nWatch out for a hacking group known as ${FactionName.NiteSec}.` +
"\n\n-jump3R",
+ FactionName.NiteSec,
),
[MessageFilename.Jumper3]: new Message(
@@ -128,6 +134,7 @@ const Messages: Record = {
"You must learn to walk before you can run. And you must " +
`run before you can fly. Look for ${FactionName.TheBlackHand}. \n\n` +
"I.I.I.I \n\n-jump3R",
+ FactionName.TheBlackHand,
),
[MessageFilename.Jumper4]: new Message(
@@ -135,6 +142,7 @@ const Messages: Record = {
"To find what you are searching for, you must understand the bits. " +
"The bits are all around us. The runners will help you.\n\n" +
"-jump3R",
+ FactionName.BitRunners,
),
//Messages from hacking factions
@@ -145,6 +153,7 @@ const Messages: Record = {
"the world for the better. If you join us, we can unlock your full potential. \n\n" +
"But first, you must pass our test. Find and install the backdoor on our server. \n\n" +
`-${FactionName.CyberSec}`,
+ FactionName.CyberSec,
),
[MessageFilename.NiteSecTest]: new Message(
@@ -156,6 +165,7 @@ const Messages: Record = {
"Join us, and people will fear you, too. \n\n" +
"Find and install the backdoor on our server, avmnite-02h. Then, we will contact you again." +
`\n\n-${FactionName.NiteSec}`,
+ FactionName.NiteSec,
),
[MessageFilename.BitRunnersTest]: new Message(
@@ -164,6 +174,7 @@ const Messages: Record = {
"what you are looking for. \n\n " +
"We can help you find the answers.\n\n" +
"run4theh111z",
+ FactionName.BitRunners,
),
//Messages to guide players to the daemon
@@ -174,6 +185,7 @@ const Messages: Record = {
"%@*$^$()@&$)$*@__CAN__()(@^#)@&@)#__N0__(#@)@&@&(\n" +
"*(__LON6ER__^#)@)(()*#@)@__ESCAP3__)#(@(#@*@()@(#*$\n" +
"()@)#$*%)$#()$#__Y0UR__(*)$#()%(&(%)*!)($__GAZ3__#(",
+ FactionName.Daedalus,
),
[MessageFilename.RedPill]: new Message(
@@ -183,6 +195,7 @@ const Messages: Record = {
")@B(*#%)@)M#B*%V)____FIND___#$@)#%(B*)@#(*%B)\n" +
"@_#(%_@#M(BDSPOMB__THE-CAVE_#)$(*@#$)@#BNBEGB\n" +
"DFLSMFVMV)#@($*)@#*$MV)@#(*$V)M#(*$)M@(#*VM$)",
+ FactionName.Daedalus,
),
};
diff --git a/src/Netscript/RamCostGenerator.ts b/src/Netscript/RamCostGenerator.ts
index f39ee4376..e410562e3 100644
--- a/src/Netscript/RamCostGenerator.ts
+++ b/src/Netscript/RamCostGenerator.ts
@@ -181,6 +181,7 @@ const singularity = {
getCompanyRep: SF4Cost(RamCostConstants.SingularityFn2 / 3),
getCompanyFavor: SF4Cost(RamCostConstants.SingularityFn2 / 3),
getCompanyFavorGain: SF4Cost(RamCostConstants.SingularityFn2 / 4),
+ getFactionInviteRequirements: SF4Cost(RamCostConstants.SingularityFn2),
checkFactionInvitations: SF4Cost(RamCostConstants.SingularityFn2),
joinFaction: SF4Cost(RamCostConstants.SingularityFn2),
workForFaction: SF4Cost(RamCostConstants.SingularityFn2),
diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts
index 8616612d6..7f8c79cef 100644
--- a/src/NetscriptFunctions/Singularity.ts
+++ b/src/NetscriptFunctions/Singularity.ts
@@ -816,6 +816,12 @@ export function NetscriptSingularity(): InternalAPI {
const companyName = getEnumHelper("CompanyName").nsGetMember(ctx, _companyName);
return Companies[companyName].getFavorGain();
},
+ getFactionInviteRequirements: (ctx) => (_facName) => {
+ helpers.checkSingularityAccess(ctx);
+ const facName = getEnumHelper("FactionName").nsGetMember(ctx, _facName);
+ const fac = Factions[facName];
+ return fac.getInfo().inviteReqs.map((condition) => condition.toString());
+ },
checkFactionInvitations: (ctx) => () => {
helpers.checkSingularityAccess(ctx);
// Manually trigger a check for faction invites
@@ -835,13 +841,6 @@ export function NetscriptSingularity(): InternalAPI {
const fac = Factions[facName];
joinFaction(fac);
- // Update Faction Invitation list to account for joined + banned factions
- for (let i = 0; i < Player.factionInvitations.length; ++i) {
- if (Player.factionInvitations[i] == facName || Factions[Player.factionInvitations[i]].isBanned) {
- Player.factionInvitations.splice(i, 1);
- i--;
- }
- }
Player.gainIntelligenceExp(CONSTANTS.IntelligenceSingFnBaseExpGain * 5);
helpers.log(ctx, () => `Joined the '${facName}' faction.`);
return true;
diff --git a/src/PersonObjects/Player/PlayerObject.ts b/src/PersonObjects/Player/PlayerObject.ts
index 52ceb31ea..95b66b378 100644
--- a/src/PersonObjects/Player/PlayerObject.ts
+++ b/src/PersonObjects/Player/PlayerObject.ts
@@ -38,6 +38,7 @@ export class PlayerObject extends Person implements IPlayer {
currentServer = "";
factions: FactionName[] = [];
factionInvitations: FactionName[] = [];
+ factionRumors: FactionName[] = [];
hacknetNodes: (HacknetNode | string)[] = []; // HacknetNode object or hostname of Hacknet Server
has4SData = false;
has4SDataTixApi = false;
@@ -131,6 +132,7 @@ export class PlayerObject extends Person implements IPlayer {
createHacknetServer = serverMethods.createHacknetServer;
queueAugmentation = generalMethods.queueAugmentation;
receiveInvite = generalMethods.receiveInvite;
+ receiveRumor = generalMethods.receiveRumor;
gainCodingContractReward = generalMethods.gainCodingContractReward;
stopFocusing = generalMethods.stopFocusing;
prestigeAugmentation = generalMethods.prestigeAugmentation;
diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts
index 00de0d37a..89f6e7f73 100644
--- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts
+++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts
@@ -4,6 +4,7 @@ import {
CompanyName,
CompletedProgramName,
FactionName,
+ FactionDiscovery,
JobName,
LocationName,
ToastVariant,
@@ -33,8 +34,7 @@ import { Locations } from "../../Locations/Locations";
import { Sleeve } from "../Sleeve/Sleeve";
import { isSleeveCompanyWork } from "../Sleeve/Work/SleeveCompanyWork";
import { calculateSkillProgress as calculateSkillProgressF, ISkillProgress } from "../formulas/skill";
-import { GetServer, AddToAllServers, createUniqueRandomIp } from "../../Server/AllServers";
-import { Server } from "../../Server/Server";
+import { AddToAllServers, createUniqueRandomIp } from "../../Server/AllServers";
import { safelyCreateUniqueServer } from "../../Server/ServerHelpers";
import { SpecialServers } from "../../Server/data/SpecialServers";
@@ -42,7 +42,6 @@ import { applySourceFile } from "../../SourceFile/applySourceFile";
import { applyExploit } from "../../Exploits/applyExploits";
import { SourceFiles } from "../../SourceFile/SourceFiles";
import { getHospitalizationCost } from "../../Hospital/Hospital";
-import { HacknetServer } from "../../Hacknet/HacknetServer";
import { formatMoney } from "../../ui/formatNumber";
import { MoneySource, MoneySourceTracker } from "../../utils/MoneySourceTracker";
@@ -52,7 +51,6 @@ import { SnackbarEvents } from "../../ui/React/Snackbar";
import { achievements } from "../../Achievements/Achievements";
import { isCompanyWork } from "../../Work/CompanyWork";
-import { serverMetadata } from "../../Server/data/servers";
import { getEnumHelper, isMember } from "../../utils/EnumHelper";
export function init(this: PlayerObject): void {
@@ -105,6 +103,7 @@ export function prestigeAugmentation(this: PlayerObject): void {
this.factions = [];
this.factionInvitations = [];
+ this.factionRumors = [];
// Clear any pending invitation modals
InvitationEvent.emit(null);
@@ -171,10 +170,37 @@ export function prestigeSourceFile(this: PlayerObject): void {
}
export function receiveInvite(this: PlayerObject, factionName: FactionName): void {
- if (this.factionInvitations.includes(factionName) || this.factions.includes(factionName)) {
+ if (
+ this.factionInvitations.includes(factionName) ||
+ Factions[factionName].isMember ||
+ Factions[factionName].isBanned
+ ) {
return;
}
this.factionInvitations.push(factionName);
+ if (this.factionRumors.includes(factionName)) {
+ this.factionRumors.splice(this.factionRumors.indexOf(factionName), 1);
+ }
+ Factions[factionName].discovery = FactionDiscovery.known;
+}
+
+export function receiveRumor(
+ this: PlayerObject,
+ factionName: FactionName,
+ discovery?: FactionDiscovery | undefined,
+): void {
+ if (Factions[factionName].discovery == FactionDiscovery.unknown) {
+ Factions[factionName].discovery = discovery || FactionDiscovery.rumored;
+ }
+ if (
+ this.factionRumors.includes(factionName) ||
+ this.factionInvitations.includes(factionName) ||
+ Factions[factionName].isMember ||
+ Factions[factionName].isBanned
+ ) {
+ return;
+ }
+ this.factionRumors.push(factionName);
}
//Calculates skill level progress based on experience. The same formula will be used for every skill
@@ -609,478 +635,11 @@ export function reapplyAllSourceFiles(this: PlayerObject): void {
//those requirements and will return an array of all factions that the Player should
//receive an invitation to
export function checkForFactionInvitations(this: PlayerObject): Faction[] {
- const invitedFactions: Faction[] = []; //Array which will hold all Factions the player should be invited to
-
- const numAugmentations = this.augmentations.length;
-
- const allCompanies = Object.keys(this.jobs);
- const allPositions = Object.values(this.jobs);
-
- // Given a company name, safely returns the reputation (returns 0 if invalid company is specified)
- function getCompanyRep(companyName: CompanyName): number {
- const company = Companies[companyName];
- return company.playerReputation;
+ const invitedFactions = [];
+ for (const faction of Object.values(Factions)) {
+ if (faction.checkForInvite(this)) invitedFactions.push(faction);
+ if (faction.checkForRumor(this)) this.receiveRumor(faction.name);
}
-
- // Helper function that returns a boolean indicating whether the Player meets
- // the requirements for the specified company. There are two requirements:
- // 1. High enough reputation
- // 2. Player is employed at the company
- function checkMegacorpRequirements(companyName: CompanyName): boolean {
- const serverMeta = serverMetadata.find((s) => s.specialName === companyName);
- const server = GetServer(serverMeta ? serverMeta.hostname : "");
- const bonus = (server as Server).backdoorInstalled ? -100e3 : 0;
- return (
- allCompanies.includes(companyName) && getCompanyRep(companyName) > CONSTANTS.CorpFactionRepRequirement + bonus
- );
- }
-
- //Illuminati
- const illuminatiFac = Factions[FactionName.Illuminati];
- if (
- !illuminatiFac.isBanned &&
- !illuminatiFac.isMember &&
- !illuminatiFac.alreadyInvited &&
- numAugmentations >= 30 &&
- this.money >= 150000000000 &&
- this.skills.hacking >= 1500 &&
- this.skills.strength >= 1200 &&
- this.skills.defense >= 1200 &&
- this.skills.dexterity >= 1200 &&
- this.skills.agility >= 1200
- ) {
- invitedFactions.push(illuminatiFac);
- }
-
- //Daedalus
- const daedalusFac = Factions[FactionName.Daedalus];
- if (
- !daedalusFac.isBanned &&
- !daedalusFac.isMember &&
- !daedalusFac.alreadyInvited &&
- numAugmentations >= currentNodeMults.DaedalusAugsRequirement &&
- this.money >= 100000000000 &&
- (this.skills.hacking >= 2500 ||
- (this.skills.strength >= 1500 &&
- this.skills.defense >= 1500 &&
- this.skills.dexterity >= 1500 &&
- this.skills.agility >= 1500))
- ) {
- invitedFactions.push(daedalusFac);
- }
-
- //The Covenant
- const covenantFac = Factions[FactionName.TheCovenant];
- if (
- !covenantFac.isBanned &&
- !covenantFac.isMember &&
- !covenantFac.alreadyInvited &&
- numAugmentations >= 20 &&
- this.money >= 75000000000 &&
- this.skills.hacking >= 850 &&
- this.skills.strength >= 850 &&
- this.skills.defense >= 850 &&
- this.skills.dexterity >= 850 &&
- this.skills.agility >= 850
- ) {
- invitedFactions.push(covenantFac);
- }
-
- //ECorp
- const ecorpFac = Factions[FactionName.ECorp];
- if (
- !ecorpFac.isBanned &&
- !ecorpFac.isMember &&
- !ecorpFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.ECorp)
- ) {
- invitedFactions.push(ecorpFac);
- }
-
- //MegaCorp
- const megacorpFac = Factions[FactionName.MegaCorp];
- if (
- !megacorpFac.isBanned &&
- !megacorpFac.isMember &&
- !megacorpFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.MegaCorp)
- ) {
- invitedFactions.push(megacorpFac);
- }
-
- //Bachman & Associates
- const bachmanandassociatesFac = Factions[FactionName.BachmanAssociates];
- if (
- !bachmanandassociatesFac.isBanned &&
- !bachmanandassociatesFac.isMember &&
- !bachmanandassociatesFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.BachmanAndAssociates)
- ) {
- invitedFactions.push(bachmanandassociatesFac);
- }
-
- //Blade Industries
- const bladeindustriesFac = Factions[FactionName.BladeIndustries];
- if (
- !bladeindustriesFac.isBanned &&
- !bladeindustriesFac.isMember &&
- !bladeindustriesFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.BladeIndustries)
- ) {
- invitedFactions.push(bladeindustriesFac);
- }
-
- //NWO
- const nwoFac = Factions[FactionName.NWO];
- if (!nwoFac.isBanned && !nwoFac.isMember && !nwoFac.alreadyInvited && checkMegacorpRequirements(CompanyName.NWO)) {
- invitedFactions.push(nwoFac);
- }
-
- //Clarke Incorporated
- const clarkeincorporatedFac = Factions[FactionName.ClarkeIncorporated];
- if (
- !clarkeincorporatedFac.isBanned &&
- !clarkeincorporatedFac.isMember &&
- !clarkeincorporatedFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.ClarkeIncorporated)
- ) {
- invitedFactions.push(clarkeincorporatedFac);
- }
-
- //OmniTek Incorporated
- const omnitekincorporatedFac = Factions[FactionName.OmniTekIncorporated];
- if (
- !omnitekincorporatedFac.isBanned &&
- !omnitekincorporatedFac.isMember &&
- !omnitekincorporatedFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.OmniTekIncorporated)
- ) {
- invitedFactions.push(omnitekincorporatedFac);
- }
-
- //Four Sigma
- const foursigmaFac = Factions[FactionName.FourSigma];
- if (
- !foursigmaFac.isBanned &&
- !foursigmaFac.isMember &&
- !foursigmaFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.FourSigma)
- ) {
- invitedFactions.push(foursigmaFac);
- }
-
- //KuaiGong International
- const kuaigonginternationalFac = Factions[FactionName.KuaiGongInternational];
- if (
- !kuaigonginternationalFac.isBanned &&
- !kuaigonginternationalFac.isMember &&
- !kuaigonginternationalFac.alreadyInvited &&
- checkMegacorpRequirements(CompanyName.KuaiGongInternational)
- ) {
- invitedFactions.push(kuaigonginternationalFac);
- }
-
- //Fulcrum Secret Technologies - If you've unlocked fulcrum secret technologies server and have a high rep with the company
- const fulcrumsecrettechonologiesFac = Factions[FactionName.FulcrumSecretTechnologies];
- const fulcrumSecretServer = GetServer(SpecialServers.FulcrumSecretTechnologies);
- if (!(fulcrumSecretServer instanceof Server))
- throw new Error(`${FactionName.FulcrumSecretTechnologies} should be normal server`);
- if (fulcrumSecretServer == null) {
- console.error(`Could not find ${FactionName.FulcrumSecretTechnologies} Server`);
- } else if (
- !fulcrumsecrettechonologiesFac.isBanned &&
- !fulcrumsecrettechonologiesFac.isMember &&
- !fulcrumsecrettechonologiesFac.alreadyInvited &&
- fulcrumSecretServer.backdoorInstalled &&
- checkMegacorpRequirements(CompanyName.FulcrumTechnologies)
- ) {
- invitedFactions.push(fulcrumsecrettechonologiesFac);
- }
-
- //BitRunners
- const bitrunnersFac = Factions[FactionName.BitRunners];
- const bitrunnersServer = GetServer(SpecialServers.BitRunnersServer);
- if (!(bitrunnersServer instanceof Server)) throw new Error(`${FactionName.BitRunners} should be normal server`);
- if (bitrunnersServer == null) {
- console.error(`Could not find ${FactionName.BitRunners} Server`);
- } else if (
- !bitrunnersFac.isBanned &&
- !bitrunnersFac.isMember &&
- bitrunnersServer.backdoorInstalled &&
- !bitrunnersFac.alreadyInvited
- ) {
- invitedFactions.push(bitrunnersFac);
- }
-
- //The Black Hand
-
- const theblackhandFac = Factions[FactionName.TheBlackHand];
- const blackhandServer = GetServer(SpecialServers.TheBlackHandServer);
- if (!(blackhandServer instanceof Server)) throw new Error(`${FactionName.TheBlackHand} should be normal server`);
- if (blackhandServer == null) {
- console.error(`Could not find ${FactionName.TheBlackHand} Server`);
- } else if (
- !theblackhandFac.isBanned &&
- !theblackhandFac.isMember &&
- blackhandServer.backdoorInstalled &&
- !theblackhandFac.alreadyInvited
- ) {
- invitedFactions.push(theblackhandFac);
- }
-
- //NiteSec
- const nitesecFac = Factions[FactionName.NiteSec];
- const nitesecServer = GetServer(SpecialServers.NiteSecServer);
- if (!(nitesecServer instanceof Server)) throw new Error(`${FactionName.NiteSec} should be normal server`);
- if (nitesecServer == null) {
- console.error(`Could not find ${FactionName.NiteSec} Server`);
- } else if (
- !nitesecFac.isBanned &&
- !nitesecFac.isMember &&
- nitesecServer.backdoorInstalled &&
- !nitesecFac.alreadyInvited
- ) {
- invitedFactions.push(nitesecFac);
- }
-
- //Chongqing
- const chongqingFac = Factions[FactionName.Chongqing];
- if (
- !chongqingFac.isBanned &&
- !chongqingFac.isMember &&
- !chongqingFac.alreadyInvited &&
- this.money >= 20000000 &&
- this.city == CityName.Chongqing
- ) {
- invitedFactions.push(chongqingFac);
- }
-
- //Sector-12
- const sector12Fac = Factions[FactionName.Sector12];
- if (
- !sector12Fac.isBanned &&
- !sector12Fac.isMember &&
- !sector12Fac.alreadyInvited &&
- this.money >= 15000000 &&
- this.city == CityName.Sector12
- ) {
- invitedFactions.push(sector12Fac);
- }
-
- //New Tokyo
- const newtokyoFac = Factions[FactionName.NewTokyo];
- if (
- !newtokyoFac.isBanned &&
- !newtokyoFac.isMember &&
- !newtokyoFac.alreadyInvited &&
- this.money >= 20000000 &&
- this.city == CityName.NewTokyo
- ) {
- invitedFactions.push(newtokyoFac);
- }
-
- //Aevum
- const aevumFac = Factions[FactionName.Aevum];
- if (
- !aevumFac.isBanned &&
- !aevumFac.isMember &&
- !aevumFac.alreadyInvited &&
- this.money >= 40000000 &&
- this.city == CityName.Aevum
- ) {
- invitedFactions.push(aevumFac);
- }
-
- //Ishima
- const ishimaFac = Factions[FactionName.Ishima];
- if (
- !ishimaFac.isBanned &&
- !ishimaFac.isMember &&
- !ishimaFac.alreadyInvited &&
- this.money >= 30000000 &&
- this.city == CityName.Ishima
- ) {
- invitedFactions.push(ishimaFac);
- }
-
- //Volhaven
- const volhavenFac = Factions[FactionName.Volhaven];
- if (
- !volhavenFac.isBanned &&
- !volhavenFac.isMember &&
- !volhavenFac.alreadyInvited &&
- this.money >= 50000000 &&
- this.city == CityName.Volhaven
- ) {
- invitedFactions.push(volhavenFac);
- }
-
- //Speakers for the Dead
- const speakersforthedeadFac = Factions[FactionName.SpeakersForTheDead];
- if (
- !speakersforthedeadFac.isBanned &&
- !speakersforthedeadFac.isMember &&
- !speakersforthedeadFac.alreadyInvited &&
- this.skills.hacking >= 100 &&
- this.skills.strength >= 300 &&
- this.skills.defense >= 300 &&
- this.skills.dexterity >= 300 &&
- this.skills.agility >= 300 &&
- this.numPeopleKilled >= 30 &&
- this.karma <= -45 &&
- !allCompanies.includes(LocationName.Sector12CIA) &&
- !allCompanies.includes(LocationName.Sector12NSA)
- ) {
- invitedFactions.push(speakersforthedeadFac);
- }
-
- //The Dark Army
- const thedarkarmyFac = Factions[FactionName.TheDarkArmy];
- if (
- !thedarkarmyFac.isBanned &&
- !thedarkarmyFac.isMember &&
- !thedarkarmyFac.alreadyInvited &&
- this.skills.hacking >= 300 &&
- this.skills.strength >= 300 &&
- this.skills.defense >= 300 &&
- this.skills.dexterity >= 300 &&
- this.skills.agility >= 300 &&
- this.city == CityName.Chongqing &&
- this.numPeopleKilled >= 5 &&
- this.karma <= -45 &&
- !allCompanies.includes(LocationName.Sector12CIA) &&
- !allCompanies.includes(LocationName.Sector12NSA)
- ) {
- invitedFactions.push(thedarkarmyFac);
- }
-
- //The Syndicate
- const thesyndicateFac = Factions[FactionName.TheSyndicate];
- if (
- !thesyndicateFac.isBanned &&
- !thesyndicateFac.isMember &&
- !thesyndicateFac.alreadyInvited &&
- this.skills.hacking >= 200 &&
- this.skills.strength >= 200 &&
- this.skills.defense >= 200 &&
- this.skills.dexterity >= 200 &&
- this.skills.agility >= 200 &&
- (this.city == CityName.Aevum || this.city == CityName.Sector12) &&
- this.money >= 10000000 &&
- this.karma <= -90 &&
- !allCompanies.includes(LocationName.Sector12CIA) &&
- !allCompanies.includes(LocationName.Sector12NSA)
- ) {
- invitedFactions.push(thesyndicateFac);
- }
-
- //Silhouette
- const silhouetteFac = Factions[FactionName.Silhouette];
- if (
- !silhouetteFac.isBanned &&
- !silhouetteFac.isMember &&
- !silhouetteFac.alreadyInvited &&
- (allPositions.includes(JobName.software7) || // CTO
- allPositions.includes(JobName.business4) || // CFO
- allPositions.includes(JobName.business5)) && // CEO
- this.money >= 15000000 &&
- this.karma <= -22
- ) {
- invitedFactions.push(silhouetteFac);
- }
-
- //Tetrads
- const tetradsFac = Factions[FactionName.Tetrads];
- if (
- !tetradsFac.isBanned &&
- !tetradsFac.isMember &&
- !tetradsFac.alreadyInvited &&
- (this.city == CityName.Chongqing || this.city == CityName.NewTokyo || this.city == CityName.Ishima) &&
- this.skills.strength >= 75 &&
- this.skills.defense >= 75 &&
- this.skills.dexterity >= 75 &&
- this.skills.agility >= 75 &&
- this.karma <= -18
- ) {
- invitedFactions.push(tetradsFac);
- }
-
- //SlumSnakes
- const slumsnakesFac = Factions[FactionName.SlumSnakes];
- if (
- !slumsnakesFac.isBanned &&
- !slumsnakesFac.isMember &&
- !slumsnakesFac.alreadyInvited &&
- this.skills.strength >= 30 &&
- this.skills.defense >= 30 &&
- this.skills.dexterity >= 30 &&
- this.skills.agility >= 30 &&
- this.karma <= -9 &&
- this.money >= 1000000
- ) {
- invitedFactions.push(slumsnakesFac);
- }
-
- //Netburners
- const netburnersFac = Factions[FactionName.Netburners];
- let totalHacknetRam = 0;
- let totalHacknetCores = 0;
- let totalHacknetLevels = 0;
- for (let i = 0; i < this.hacknetNodes.length; ++i) {
- const v = this.hacknetNodes[i];
- if (typeof v === "string") {
- const hserver = GetServer(v);
- if (hserver === null || !(hserver instanceof HacknetServer))
- throw new Error("player hacknet server was not HacknetServer");
- totalHacknetLevels += hserver.level;
- totalHacknetRam += hserver.maxRam;
- totalHacknetCores += hserver.cores;
- } else {
- totalHacknetLevels += v.level;
- totalHacknetRam += v.ram;
- totalHacknetCores += v.cores;
- }
- }
- if (
- !netburnersFac.isBanned &&
- !netburnersFac.isMember &&
- !netburnersFac.alreadyInvited &&
- this.skills.hacking >= 80 &&
- totalHacknetRam >= 8 &&
- totalHacknetCores >= 4 &&
- totalHacknetLevels >= 100
- ) {
- invitedFactions.push(netburnersFac);
- }
-
- //Tian Di Hui
- const tiandihuiFac = Factions[FactionName.TianDiHui];
- if (
- !tiandihuiFac.isBanned &&
- !tiandihuiFac.isMember &&
- !tiandihuiFac.alreadyInvited &&
- this.money >= 1000000 &&
- this.skills.hacking >= 50 &&
- (this.city == CityName.Chongqing || this.city == CityName.NewTokyo || this.city == CityName.Ishima)
- ) {
- invitedFactions.push(tiandihuiFac);
- }
-
- //CyberSec
- const cybersecFac = Factions[FactionName.CyberSec];
- const cybersecServer = GetServer(SpecialServers.CyberSecServer);
- if (!(cybersecServer instanceof Server)) throw new Error(`${FactionName.CyberSec} should be normal server`);
- if (cybersecServer == null) {
- console.error(`Could not find ${FactionName.CyberSec} Server`);
- } else if (
- !cybersecFac.isBanned &&
- !cybersecFac.isMember &&
- cybersecServer.backdoorInstalled &&
- !cybersecFac.alreadyInvited
- ) {
- invitedFactions.push(cybersecFac);
- }
-
return invitedFactions;
}
diff --git a/src/Prestige.ts b/src/Prestige.ts
index d8e60cfce..9afb20595 100755
--- a/src/Prestige.ts
+++ b/src/Prestige.ts
@@ -1,4 +1,4 @@
-import { AugmentationName, CityName, CompletedProgramName, FactionName, LiteratureName } from "@enums";
+import { AugmentationName, CityName, CompletedProgramName, FactionName, LiteratureName, CompanyName } from "@enums";
import { initBitNodeMultipliers } from "./BitNode/BitNode";
import { Companies } from "./Company/Companies";
import { resetIndustryResearchTrees } from "./Corporation/data/IndustryData";
@@ -34,9 +34,17 @@ function delayedDialog(message: string) {
export function prestigeAugmentation(): void {
initBitNodeMultipliers();
- const maintainMembership = Player.factions.concat(Player.factionInvitations).filter(function (faction) {
- return Factions[faction].getInfo().keep;
- });
+ // Maintain invites to factions with the 'keepOnInstall' flag, and rumors about others
+ const maintainInvites = [];
+ const maintainRumors = [];
+ for (const facName of [...Player.factions, ...Player.factionInvitations]) {
+ if (Factions[facName].getInfo().keep) {
+ maintainInvites.push(facName);
+ } else {
+ maintainRumors.push(facName);
+ }
+ }
+
Player.prestigeAugmentation();
// Delete all Worker Scripts objects
@@ -84,8 +92,8 @@ export function prestigeAugmentation(): void {
// Recalculate the bonus for circadian modulator aug
initCircadianModulator();
- Player.factionInvitations = Player.factionInvitations.concat(maintainMembership);
- for (const factionName of maintainMembership) Factions[factionName].alreadyInvited = true;
+ Player.factionInvitations = Player.factionInvitations.concat(maintainInvites);
+ for (const factionName of maintainInvites) Factions[factionName].alreadyInvited = true;
Player.reapplyAllAugmentations();
Player.reapplyAllSourceFiles();
Player.hp.current = Player.hp.max;
@@ -144,12 +152,19 @@ export function prestigeAugmentation(): void {
}
}
+ // Bitnode 13: Church of the Machine God
if (Player.hasAugmentation(AugmentationName.StaneksGift1, true)) {
joinFaction(Factions[FactionName.ChurchOfTheMachineGod]);
+ } else if (Player.bitNodeN != 13) {
+ if (Player.augmentations.some((a) => a.name !== AugmentationName.NeuroFluxGovernor)) {
+ Factions[FactionName.ChurchOfTheMachineGod].isBanned = true;
+ }
}
-
staneksGift.prestigeAugmentation();
+ // Hear rumors after all invites/bans
+ for (const factionName of maintainRumors) Player.receiveRumor(factionName);
+
resetPidCounter();
ProgramsSeen.clear();
InvitationsSeen.clear();
@@ -230,7 +245,7 @@ export function prestigeSourceFile(isFlume: boolean): void {
// BitNode 6: Bladeburners and BitNode 7: Bladeburners 2079
if (Player.bitNodeN === 6 || Player.bitNodeN === 7) {
- delayedDialog("NSA would like to have a word with you once you're ready.");
+ delayedDialog(`The ${CompanyName.NSA} would like to have a word with you once you're ready.`);
}
// BitNode 8: Ghost of Wall Street
@@ -245,7 +260,7 @@ export function prestigeSourceFile(isFlume: boolean): void {
// BitNode 10: Digital Carbon
if (Player.bitNodeN === 10) {
delayedDialog(
- "Seek out The Covenant if you'd like to purchase a new sleeve or two! And see what VitaLife in New Tokyo has to offer for you",
+ `Seek out ${FactionName.TheCovenant} if you'd like to purchase a new sleeve or two! And see what ${CompanyName.VitaLife} in ${CityName.NewTokyo} has to offer for you`,
);
}
diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts
index dcd0c8969..dce05292d 100644
--- a/src/ScriptEditor/NetscriptDefinitions.d.ts
+++ b/src/ScriptEditor/NetscriptDefinitions.d.ts
@@ -1934,6 +1934,31 @@ export interface Singularity {
*/
getCompanyFavorGain(companyName: CompanyName | `${CompanyName}`): number;
+ /**
+ * List conditions for being invited to a faction.
+ * @remarks
+ * RAM cost: 3 GB * 16/4/1
+ *
+ *
+ * @param faction - Name of the faction.
+ * @returns Array of strings describing conditions for receiving an invitation to the faction.
+ *
+ * @example
+ * ```js
+ * ns.singularity.getFactionInviteRequirements("The Syndicate")
+ * [
+ * "Located in Aevum or Sector-12",
+ * "Not working for the Central Intelligence Agency",
+ * "Not working for the National Security Agency",
+ * "-90 karma",
+ * "Have $10.000m",
+ * "Hacking level 200",
+ * "All combat skills level 200"
+ * ]
+ * ```
+ */
+ getFactionInviteRequirements(faction: string): string[];
+
/**
* List all current faction invitations.
* @remarks
diff --git a/src/ui/Components/Requirement.tsx b/src/ui/Components/Requirement.tsx
new file mode 100644
index 000000000..29db8d91e
--- /dev/null
+++ b/src/ui/Components/Requirement.tsx
@@ -0,0 +1,27 @@
+import { CheckBox, CheckBoxOutlineBlank } from "@mui/icons-material";
+import { Typography } from "@mui/material";
+import React from "react";
+import { Settings } from "../../Settings/Settings";
+
+Settings.theme.primary;
+
+export interface IReqProps {
+ value: string;
+ color?: string;
+ incompleteColor?: string;
+ fulfilled: boolean;
+}
+
+export const Requirement = (props: IReqProps): React.ReactElement => {
+ const completeColor = props.color || Settings.theme.primary;
+ const incompleteColor = props.incompleteColor || Settings.theme.primarydark;
+
+ return (
+
+ {props.fulfilled ? : }
+ {props.value}
+
+ );
+};
diff --git a/test/jest/__snapshots__/FullSave.test.ts.snap b/test/jest/__snapshots__/FullSave.test.ts.snap
index 8e4c78a7f..43775f50c 100644
--- a/test/jest/__snapshots__/FullSave.test.ts.snap
+++ b/test/jest/__snapshots__/FullSave.test.ts.snap
@@ -277,6 +277,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -287,6 +288,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -297,6 +299,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -307,6 +310,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -317,6 +321,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": true,
@@ -327,6 +332,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -337,6 +343,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -347,6 +354,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -357,6 +365,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 20,
"isBanned": false,
"isMember": true,
@@ -367,6 +376,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -377,6 +387,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -387,6 +398,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -397,6 +409,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -407,6 +420,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -417,6 +431,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -427,6 +442,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -437,6 +453,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -447,6 +464,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -457,6 +475,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -467,6 +486,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -477,6 +497,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -487,6 +508,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -497,6 +519,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -507,6 +530,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -517,6 +541,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -527,6 +552,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": true,
@@ -537,6 +563,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -547,6 +574,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -557,6 +585,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -567,6 +596,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -577,6 +607,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -587,6 +618,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -597,6 +629,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -607,6 +640,7 @@ exports[`Check Save File Continuity FactionsSave continuity 1`] = `
"ctor": "Faction",
"data": {
"alreadyInvited": false,
+ "discovery": "unknown",
"favor": 0,
"isBanned": false,
"isMember": false,
@@ -1238,6 +1272,7 @@ exports[`Check Save File Continuity PlayerSave continuity 1`] = `
},
"exploits": [],
"factionInvitations": [],
+ "factionRumors": [],
"factions": [
"Slum Snakes",
"CyberSec",