few stanek improvements.

This commit is contained in:
Olivier Gagnon 2022-04-12 17:18:36 -04:00
parent 48ee6ac82e
commit de8b38b299
6 changed files with 251 additions and 370 deletions

@ -81,7 +81,6 @@ export function hasAugmentationPrereqs(aug: Augmentation): boolean {
}
export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = false): string {
const factionInfo = fac.getInfo();
const hasPrereqs = hasAugmentationPrereqs(aug);
if (!hasPrereqs) {
const txt = `You must first purchase or install ${aug.prereqs.join(",")} before you can purchase this one.`;
@ -90,7 +89,7 @@ export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = fal
} else {
dialogBoxCreate(txt);
}
} else if (aug.baseCost !== 0 && Player.money < aug.baseCost * factionInfo.augmentationPriceMult) {
} else if (aug.baseCost !== 0 && Player.money < aug.baseCost) {
const txt = "You don't have enough money to purchase " + aug.name;
if (sing) {
return txt;
@ -102,14 +101,14 @@ export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = fal
return txt;
}
dialogBoxCreate(txt);
} else if (aug.baseCost === 0 || Player.money >= aug.baseCost * factionInfo.augmentationPriceMult) {
} else if (aug.baseCost === 0 || Player.money >= aug.baseCost) {
const queuedAugmentation = new PlayerOwnedAugmentation(aug.name);
if (aug.name == AugmentationNames.NeuroFluxGovernor) {
queuedAugmentation.level = getNextNeurofluxLevel();
}
Player.queuedAugmentations.push(queuedAugmentation);
Player.loseMoney(aug.baseCost * factionInfo.augmentationPriceMult, "augmentations");
Player.loseMoney(aug.baseCost, "augmentations");
// If you just purchased Neuroflux Governor, recalculate the cost
if (aug.name == AugmentationNames.NeuroFluxGovernor) {

@ -2,20 +2,20 @@ import React from "react";
import { IMap } from "../types";
import { FactionNames } from "./data/FactionNames";
interface FactionInfoParams {
infoText?: JSX.Element;
enemies?: string[];
offerHackingWork?: boolean;
offerFieldWork?: boolean;
offerSecurityWork?: boolean;
special?: boolean;
keepOnInstall?: boolean;
}
/**
* Contains the "information" property for all the Factions, which is just a description of each faction
*/
export class FactionInfo {
/**
* The multiplier to apply to augmentation base purchase price.
*/
augmentationPriceMult: number;
/**
* The multiplier to apply to augmentation reputation base requirement.
*/
augmentationRepRequirementMult: number;
/**
* The names of all other factions considered to be enemies to this faction.
*/
@ -31,11 +31,6 @@ export class FactionInfo {
*/
offerFieldWork: boolean;
/**
* A flag indicating if the faction supports hacking missions to earn reputation.
*/
offerHackingMission: boolean;
/**
* A flag indicating if the faction supports hacking work to earn reputation.
*/
@ -56,32 +51,19 @@ export class FactionInfo {
*/
special: boolean;
constructor(
infoText: JSX.Element,
enemies: string[],
offerHackingMission: boolean,
offerHackingWork: boolean,
offerFieldWork: boolean,
offerSecurityWork: boolean,
special: boolean,
keep: boolean,
) {
this.infoText = infoText;
this.enemies = enemies;
this.offerHackingMission = offerHackingMission;
this.offerHackingWork = offerHackingWork;
this.offerFieldWork = offerFieldWork;
this.offerSecurityWork = offerSecurityWork;
constructor(params: FactionInfoParams) {
this.infoText = params.infoText ?? <></>;
this.enemies = params.enemies ?? [];
this.offerHackingWork = params.offerHackingWork ?? false;
this.offerFieldWork = params.offerFieldWork ?? false;
this.offerSecurityWork = params.offerSecurityWork ?? false;
// These are always all 1 for now.
this.augmentationPriceMult = 1;
this.augmentationRepRequirementMult = 1;
this.keep = keep;
this.special = special;
this.keep = params.keepOnInstall ?? false;
this.special = params.special ?? false;
}
offersWork(): boolean {
return this.offerFieldWork || this.offerHackingMission || this.offerHackingWork || this.offerSecurityWork;
return this.offerFieldWork || this.offerHackingWork || this.offerSecurityWork;
}
}
@ -91,35 +73,25 @@ export class FactionInfo {
// tslint:disable-next-line:variable-name
export const FactionInfos: IMap<FactionInfo> = {
// Endgame
[FactionNames.Illuminati]: new FactionInfo(
(
[FactionNames.Illuminati]: new FactionInfo({
infoText: (
<>
Humanity never changes. No matter how civilized society becomes, it will eventually fall back into chaos. And
from this chaos, we are the invisible hand that guides them to order.{" "}
</>
),
[],
true,
true,
true,
false,
false,
false,
),
offerHackingWork: true,
offerFieldWork: true,
}),
[FactionNames.Daedalus]: new FactionInfo(
<>Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.</>,
[],
true,
true,
true,
false,
false,
false,
),
[FactionNames.Daedalus]: new FactionInfo({
infoText: <>Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.</>,
offerHackingWork: true,
offerFieldWork: true,
}),
[FactionNames.TheCovenant]: new FactionInfo(
(
[FactionNames.TheCovenant]: new FactionInfo({
infoText: (
<>
Surrender yourself. Give up your empty individuality to become part of something great, something eternal.
Become a slave. Submit your mind, body, and soul. Only then can you set yourself free.
@ -128,35 +100,27 @@ export const FactionInfos: IMap<FactionInfo> = {
Only then can you discover immortality.
</>
),
[],
true,
true,
true,
false,
false,
false,
),
offerHackingWork: true,
offerFieldWork: true,
}),
// Megacorporations, each forms its own faction
[FactionNames.ECorp]: new FactionInfo(
(
[FactionNames.ECorp]: new FactionInfo({
infoText: (
<>
{FactionNames.ECorp}'s mission is simple: to connect the world of today with the technology of tomorrow. With
our wide range of Internet-related software and commercial hardware, {FactionNames.ECorp} makes the world's
information universally accessible.
</>
),
[],
true,
true,
true,
true,
false,
true,
),
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.MegaCorp]: new FactionInfo(
(
[FactionNames.MegaCorp]: new FactionInfo({
infoText: (
<>
{FactionNames.MegaCorp} does what no other dares to do. We imagine. We create. We invent. We create what others
have never even dreamed of. Our work fills the world's needs for food, water, power, and transportation on an
@ -167,17 +131,14 @@ export const FactionInfos: IMap<FactionInfo> = {
the world.
</>
),
[],
true,
true,
true,
true,
false,
true,
),
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.BachmanAssociates]: new FactionInfo(
(
[FactionNames.BachmanAssociates]: new FactionInfo({
infoText: (
<>
Where Law and Business meet - thats where we are.
<br />
@ -185,112 +146,87 @@ export const FactionInfos: IMap<FactionInfo> = {
Legal Insight - Business Instinct - Innovative Experience.
</>
),
[],
true,
true,
true,
true,
false,
true,
),
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.BladeIndustries]: new FactionInfo(
<>Augmentation is Salvation.</>,
[],
true,
true,
true,
true,
false,
true,
),
[FactionNames.BladeIndustries]: new FactionInfo({
infoText: <>Augmentation is Salvation.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.NWO]: new FactionInfo(
(
[FactionNames.NWO]: new FactionInfo({
infoText: (
<>
Humans don't truly desire freedom. They want to be observed, understood, and judged. They want to be given
purpose and direction in life. That is why they created God. And that is why they created civilization - not
because of willingness, but because of a need to be incorporated into higher orders of structure and meaning.
</>
),
[],
true,
true,
true,
true,
false,
true,
),
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.ClarkeIncorporated]: new FactionInfo(
<>The Power of the Genome - Unlocked.</>,
[],
true,
true,
true,
true,
false,
true,
),
[FactionNames.ClarkeIncorporated]: new FactionInfo({
infoText: <>The Power of the Genome - Unlocked.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.OmniTekIncorporated]: new FactionInfo(
<>Simply put, our mission is to design and build robots that make a difference.</>,
[],
true,
true,
true,
true,
false,
true,
),
[FactionNames.OmniTekIncorporated]: new FactionInfo({
infoText: <>Simply put, our mission is to design and build robots that make a difference.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.FourSigma]: new FactionInfo(
(
[FactionNames.FourSigma]: new FactionInfo({
infoText: (
<>
The scientific method is the best way to approach investing. Big strategies backed up with big data. Driven by
deep learning and innovative ideas. And improved by iteration. That's {FactionNames.FourSigma}.
</>
),
[],
true,
true,
true,
true,
false,
true,
),
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
[FactionNames.KuaiGongInternational]: new FactionInfo(
<>Dream big. Work hard. Make history.</>,
[],
true,
true,
true,
true,
false,
true,
),
[FactionNames.KuaiGongInternational]: new FactionInfo({
infoText: <>Dream big. Work hard. Make history.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
// Other Corporations
[FactionNames.FulcrumSecretTechnologies]: new FactionInfo(
(
[FactionNames.FulcrumSecretTechnologies]: new FactionInfo({
infoText: (
<>
The human organism has an innate desire to worship. That is why they created gods. If there were no gods, it
would be necessary to create them. And now we can.
</>
),
[],
true,
true,
false,
true,
false,
true,
),
offerHackingWork: true,
offerSecurityWork: true,
keepOnInstall: true,
}),
// Hacker groups
[FactionNames.BitRunners]: new FactionInfo(
(
[FactionNames.BitRunners]: new FactionInfo({
infoText: (
<>
Our entire lives are controlled by bits. All of our actions, our thoughts, our personal information. It's all
transformed into bits, stored in bits, communicated through bits. Its impossible for any person to move, to
@ -302,17 +238,11 @@ export const FactionInfos: IMap<FactionInfo> = {
Those who run the bits, run the world.
</>
),
[],
true,
true,
false,
false,
false,
false,
),
offerHackingWork: true,
}),
[FactionNames.TheBlackHand]: new FactionInfo(
(
[FactionNames.TheBlackHand]: new FactionInfo({
infoText: (
<>
The world, so afraid of strong government, now has no government. Only power - Digital power. Financial power.
Technological power. And those at the top rule with an invisible hand. They built a society where the rich get
@ -322,17 +252,13 @@ export const FactionInfos: IMap<FactionInfo> = {
So much pain. So many lives. Their darkness must end.
</>
),
[],
true,
true,
true,
false,
false,
false,
),
offerHackingWork: true,
offerFieldWork: true,
}),
// prettier-ignore
[FactionNames.NiteSec]: new FactionInfo(<>
[FactionNames.NiteSec]: new FactionInfo({
infoText:(<>
{" __..__ "}<br />
{" _.nITESECNIt. "}<br />
{" .-'NITESECNITESEc. "}<br />
@ -367,105 +293,87 @@ export const FactionInfos: IMap<FactionInfo> = {
{" / .d/$/$; , ; "}<br />
{" d .dNITESEC $ | "}<br />
{" :bp.__.gNITESEC/$ :$ ; "}<br />
{" NITESECNITESECNIT /$b : "}<br /></>,
[],
true,
true,
false,
false,
false,
false,
),
{" NITESECNITESECNIT /$b : "}<br /></>),
offerHackingWork: true,
offerFieldWork: false,
offerSecurityWork: false,
special: false,
keepOnInstall: false,
}),
// City factions, essentially governments
[FactionNames.Aevum]: new FactionInfo(
<>The Silicon City.</>,
[FactionNames.Chongqing, FactionNames.NewTokyo, FactionNames.Ishima, FactionNames.Volhaven],
true,
true,
true,
true,
false,
false,
),
[FactionNames.Chongqing]: new FactionInfo(
<>Serve the People.</>,
[FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
true,
true,
true,
true,
false,
false,
),
[FactionNames.Ishima]: new FactionInfo(
<>The East Asian Order of the Future.</>,
[FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
true,
true,
true,
true,
false,
false,
),
[FactionNames.NewTokyo]: new FactionInfo(
<>Asia's World City.</>,
[FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
true,
true,
true,
true,
false,
false,
),
[FactionNames.Sector12]: new FactionInfo(
<>The City of the Future.</>,
[FactionNames.Chongqing, FactionNames.NewTokyo, FactionNames.Ishima, FactionNames.Volhaven],
true,
true,
true,
true,
false,
false,
),
[FactionNames.Volhaven]: new FactionInfo(
<>Benefit, Honor, and Glory.</>,
[FactionNames.Chongqing, FactionNames.Sector12, FactionNames.NewTokyo, FactionNames.Aevum, FactionNames.Ishima],
true,
true,
true,
true,
false,
false,
),
[FactionNames.Aevum]: new FactionInfo({
infoText: <>The Silicon City.</>,
enemies: [FactionNames.Chongqing, FactionNames.NewTokyo, FactionNames.Ishima, FactionNames.Volhaven],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.Chongqing]: new FactionInfo({
infoText: <>Serve the People.</>,
enemies: [FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.Ishima]: new FactionInfo({
infoText: <>The East Asian Order of the Future.</>,
enemies: [FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.NewTokyo]: new FactionInfo({
infoText: <>Asia's World City.</>,
enemies: [FactionNames.Sector12, FactionNames.Aevum, FactionNames.Volhaven],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.Sector12]: new FactionInfo({
infoText: <>The City of the Future.</>,
enemies: [FactionNames.Chongqing, FactionNames.NewTokyo, FactionNames.Ishima, FactionNames.Volhaven],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.Volhaven]: new FactionInfo({
infoText: <>Benefit, Honor, and Glory.</>,
enemies: [
FactionNames.Chongqing,
FactionNames.Sector12,
FactionNames.NewTokyo,
FactionNames.Aevum,
FactionNames.Ishima,
],
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
// Criminal Organizations/Gangs
[FactionNames.SpeakersForTheDead]: new FactionInfo(
<>It is better to reign in Hell than to serve in Heaven.</>,
[],
true,
true,
true,
true,
false,
false,
),
[FactionNames.SpeakersForTheDead]: new FactionInfo({
infoText: <>It is better to reign in Hell than to serve in Heaven.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.TheDarkArmy]: new FactionInfo(
<>The World doesn't care about right or wrong. It only cares about power.</>,
[],
true,
true,
true,
false,
false,
false,
),
[FactionNames.TheDarkArmy]: new FactionInfo({
infoText: <>The World doesn't care about right or wrong. It only cares about power.</>,
offerHackingWork: true,
offerFieldWork: true,
}),
[FactionNames.TheSyndicate]: new FactionInfo(<>Honor holds you back.</>, [], true, true, true, true, false, false),
[FactionNames.TheSyndicate]: new FactionInfo({
infoText: <>Honor holds you back.</>,
offerHackingWork: true,
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.Silhouette]: new FactionInfo(
(
[FactionNames.Silhouette]: new FactionInfo({
infoText: (
<>
Corporations have filled the void of power left behind by the collapse of Western government. The issue is
they've become so big that you don't know who they're working for. And if you're employed at one of these
@ -475,80 +383,51 @@ export const FactionInfos: IMap<FactionInfo> = {
That's terror. Terror, fear, and corruption. All born into the system, all propagated by the system.
</>
),
[],
true,
true,
true,
false,
false,
false,
),
offerHackingWork: true,
offerFieldWork: true,
}),
[FactionNames.Tetrads]: new FactionInfo(
<>Following the mandate of Heaven and carrying out the way.</>,
[],
false,
false,
true,
true,
false,
false,
),
[FactionNames.Tetrads]: new FactionInfo({
infoText: <>Following the mandate of Heaven and carrying out the way.</>,
[FactionNames.SlumSnakes]: new FactionInfo(
<>{FactionNames.SlumSnakes} rule!</>,
[],
false,
false,
true,
true,
false,
false,
),
offerFieldWork: true,
offerSecurityWork: true,
}),
[FactionNames.SlumSnakes]: new FactionInfo({
infoText: <>{FactionNames.SlumSnakes} rule!</>,
offerFieldWork: true,
offerSecurityWork: true,
}),
// Earlygame factions - factions the player will prestige with early on that don't belong in other categories.
[FactionNames.Netburners]: new FactionInfo(
<>{"~~//*>H4CK||3T 8URN3R5**>?>\\~~"}</>,
[],
true,
true,
false,
false,
false,
false,
),
[FactionNames.Netburners]: new FactionInfo({
infoText: <>{"~~//*>H4CK||3T 8URN3R5**>?>\\~~"}</>,
offerHackingWork: true,
}),
[FactionNames.TianDiHui]: new FactionInfo(
<>Obey Heaven and work righteously.</>,
[],
true,
true,
false,
true,
false,
false,
),
[FactionNames.TianDiHui]: new FactionInfo({
infoText: <>Obey Heaven and work righteously.</>,
offerHackingWork: true,
[FactionNames.CyberSec]: new FactionInfo(
(
offerSecurityWork: true,
}),
[FactionNames.CyberSec]: new FactionInfo({
infoText: (
<>
The Internet is the first thing that was built that we don't fully understand, the largest experiment in anarchy
that we have ever had. And as the world becomes increasingly dominated by it, society approaches the brink of
total chaos. We serve only to protect society, to protect humanity, to protect the world from imminent collapse.
</>
),
[],
true,
true,
false,
false,
false,
false,
),
offerHackingWork: true,
}),
// Special Factions
[FactionNames.Bladeburners]: new FactionInfo(
(
[FactionNames.Bladeburners]: new FactionInfo({
infoText: (
<>
It's too bad they won't live. But then again, who does?
<br />
@ -557,17 +436,13 @@ export const FactionInfos: IMap<FactionInfo> = {
Completing {FactionNames.Bladeburners} contracts/operations will increase your reputation.
</>
),
[],
false,
false,
false,
false,
true,
false,
),
special: true,
}),
// prettier-ignore
[FactionNames.ChurchOfTheMachineGod]: new FactionInfo(<>
[FactionNames.ChurchOfTheMachineGod]: new FactionInfo({
infoText:(<>
{" `` "}<br />
{" -odmmNmds: "}<br />
{" `hNmo:..-omNh. "}<br />
@ -599,13 +474,11 @@ export const FactionInfos: IMap<FactionInfo> = {
Many cultures predict an end to humanity in the near future, a final
Armageddon that will end the world; but we disagree.
<br /><br />Note that for this faction, reputation can
only be gained by charging Stanek's gift.</>,
[],
false,
false,
false,
false,
true,
true,
),
only be gained by charging Stanek's gift.</>),
offerHackingWork: false,
offerFieldWork: false,
offerSecurityWork: false,
special: true,
keepOnInstall: true,
}),
};

@ -78,10 +78,10 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
const augs = getAugs();
function canBuy(augName: string): boolean {
const aug = Augmentations[augName];
const repCost = aug.baseRepRequirement * props.faction.getInfo().augmentationRepRequirementMult;
const repCost = aug.baseRepRequirement;
const hasReq = props.faction.playerReputation >= repCost;
const hasRep = hasAugmentationPrereqs(aug);
const hasCost = aug.baseCost !== 0 && player.money > aug.baseCost * props.faction.getInfo().augmentationPriceMult;
const hasCost = aug.baseCost !== 0 && player.money > aug.baseCost;
return hasCost && hasReq && hasRep;
}
const buy = augs.filter(canBuy).sort((augName1, augName2) => {

@ -20,7 +20,6 @@ interface IProps {
export function PurchaseAugmentationModal(props: IProps): React.ReactElement {
const player = use.Player();
const factionInfo = props.faction.getInfo();
function buy(): void {
if (!isRepeatableAug(props.aug) && player.hasAugmentation(props.aug)) {
@ -43,7 +42,7 @@ export function PurchaseAugmentationModal(props: IProps): React.ReactElement {
<br />
<br />
Would you like to purchase the {props.aug.name} Augmentation for&nbsp;
<Money money={props.aug.baseCost * factionInfo.augmentationPriceMult} />?
<Money money={props.aug.baseCost} />?
<br />
<br />
</Typography>

@ -84,11 +84,11 @@ export function PurchaseableAugmentation(props: IProps): React.ReactElement {
return <></>;
}
const moneyCost = aug.baseCost * props.faction.getInfo().augmentationPriceMult;
const repCost = aug.baseRepRequirement * props.faction.getInfo().augmentationRepRequirementMult;
const moneyCost = aug.baseCost;
const repCost = aug.baseRepRequirement;
const hasReq = hasAugmentationPrereqs(aug);
const hasRep = props.faction.playerReputation >= repCost;
const hasCost = aug.baseCost === 0 || props.p.money > aug.baseCost * props.faction.getInfo().augmentationPriceMult;
const hasCost = aug.baseCost === 0 || props.p.money > aug.baseCost;
// Determine UI properties
const color: "error" | "primary" = !hasReq || !hasRep || !hasCost ? "error" : "primary";

@ -174,10 +174,11 @@ export function SpecialLocation(props: IProps): React.ReactElement {
applyAugmentation({ name: AugmentationNames.StaneksGift1, level: 1 });
}
router.toFaction(faction);
router.toStaneksGift();
}
function renderCotMG(): React.ReactElement {
const toStanek = <Button onClick={() => router.toStaneksGift()}>Open Stanek's Gift</Button>;
// prettier-ignore
const symbol = <Typography sx={{ lineHeight: '1em', whiteSpace: 'pre' }}>
{" `` "}<br />
@ -218,6 +219,9 @@ export function SpecialLocation(props: IProps): React.ReactElement {
seems. Curious, Just how much of a machine's soul do you house in that body?
</i>
</Typography>
<br />
{toStanek}
<br />
{symbol}
</>
);
@ -232,6 +236,9 @@ export function SpecialLocation(props: IProps): React.ReactElement {
mastery of the gift clearly demonstrates that. My hopes are climbing by the day for you.
</i>
</Typography>
<br />
{toStanek}
<br />
{symbol}
</>
);
@ -242,6 +249,9 @@ export function SpecialLocation(props: IProps): React.ReactElement {
<Typography>
<i>Allison "Mother" Stanek: Welcome back my child!</i>
</Typography>
<br />
{toStanek}
<br />
{symbol}
</>
);