diff --git a/src/Bladeburner/Bladeburner.tsx b/src/Bladeburner/Bladeburner.tsx index 0de36795a..72bbf3628 100644 --- a/src/Bladeburner/Bladeburner.tsx +++ b/src/Bladeburner/Bladeburner.tsx @@ -23,7 +23,7 @@ import { BladeburnerConstants } from "./data/Constants"; import { formatExp, formatMoney, formatPercent, formatBigNumber, formatStamina } from "../ui/formatNumber"; import { currentNodeMults } from "../BitNode/BitNodeMultipliers"; import { addOffset } from "../utils/helpers/addOffset"; -import { Factions, factionExists } from "../Faction/Factions"; +import { Factions } from "../Faction/Factions"; import { calculateHospitalizationCost } from "../Hospital/Hospital"; import { dialogBoxCreate } from "../ui/React/DialogBox"; import { Settings } from "../Settings/Settings"; @@ -1608,18 +1608,11 @@ export class Bladeburner { this.maxRank = Math.max(this.rank, this.maxRank); const bladeburnersFactionName = FactionName.Bladeburners; - if (factionExists(bladeburnersFactionName)) { - const bladeburnerFac = Factions[bladeburnersFactionName]; - if (!bladeburnerFac) { - throw new Error( - `Could not properly get ${FactionName.Bladeburners} Faction object in ${FactionName.Bladeburners} UI Overview Faction button`, - ); - } - if (bladeburnerFac.isMember) { - const favorBonus = 1 + bladeburnerFac.favor / 100; - bladeburnerFac.playerReputation += - BladeburnerConstants.RankToFactionRepFactor * change * person.mults.faction_rep * favorBonus; - } + const bladeburnerFac = Factions[bladeburnersFactionName]; + if (bladeburnerFac.isMember) { + const favorBonus = 1 + bladeburnerFac.favor / 100; + bladeburnerFac.playerReputation += + BladeburnerConstants.RankToFactionRepFactor * change * person.mults.faction_rep * favorBonus; } // Gain skill points diff --git a/src/CodingContractGenerator.ts b/src/CodingContractGenerator.ts index c82147b2c..0b9174e52 100644 --- a/src/CodingContractGenerator.ts +++ b/src/CodingContractGenerator.ts @@ -124,38 +124,29 @@ function getRandomProblemType(): string { } function getRandomReward(): ICodingContractReward { - const reward: ICodingContractReward = { - name: "", - type: getRandomInt(0, CodingContractRewardType.Money), - }; - reward.type = sanitizeRewardType(reward.type); + const rewardType = sanitizeRewardType(getRandomInt(0, CodingContractRewardType.Money)); // Add additional information based on the reward type const factionsThatAllowHacking = Player.factions.filter((fac) => Factions[fac].getInfo().offerHackingWork); - switch (reward.type) { + switch (rewardType) { case CodingContractRewardType.FactionReputation: { // Get a random faction that player is a part of. That // faction must allow hacking contracts const numFactions = factionsThatAllowHacking.length; const randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)]; - reward.name = randFaction; - break; + return { type: rewardType, name: randFaction }; } case CodingContractRewardType.CompanyReputation: { const allJobs = Object.keys(Player.jobs); if (allJobs.length > 0) { - reward.name = allJobs[getRandomInt(0, allJobs.length - 1)]; - } else { - reward.type = CodingContractRewardType.Money; + return { type: CodingContractRewardType.CompanyReputation, name: allJobs[getRandomInt(0, allJobs.length - 1)] }; } - break; + return { type: CodingContractRewardType.Money }; } default: - break; + return { type: rewardType }; } - - return reward; } function getRandomServer(): BaseServer { @@ -182,7 +173,7 @@ function getRandomServer(): BaseServer { function getRandomFilename( server: BaseServer, - reward: ICodingContractReward = { name: "", type: 0 }, + reward: ICodingContractReward = { type: CodingContractRewardType.Money }, ): ContractFilePath { let contractFn = `contract-${getRandomInt(0, 1e6)}`; @@ -197,7 +188,7 @@ function getRandomFilename( contractFn = `contract-${getRandomInt(0, 1e6)}`; } - if (reward.name) { + if ("name" in reward) { // Only alphanumeric characters in the reward name. contractFn += `-${reward.name.replace(/[^a-zA-Z0-9]/g, "")}`; } diff --git a/src/CodingContracts.ts b/src/CodingContracts.ts index f46d412ee..fbbd6cb17 100644 --- a/src/CodingContracts.ts +++ b/src/CodingContracts.ts @@ -1,3 +1,4 @@ +import type { FactionName } from "@enums"; import { codingContractTypesMetadata, DescriptionFunc, GeneratorFunc, SolverFunc } from "./data/codingcontracttypes"; import { Generic_fromJSON, Generic_toJSON, IReviverValue, constructorsForReviver } from "./utils/JSONReviver"; @@ -73,11 +74,21 @@ export enum CodingContractResult { } /** A class that represents the type of reward a contract gives */ -export interface ICodingContractReward { - /* Name of Company/Faction name for reward, if applicable */ - name?: string; - type: CodingContractRewardType; -} +export type ICodingContractReward = + | { + type: CodingContractRewardType.Money; + } + | { + type: CodingContractRewardType.FactionReputationAll; + } + | { + type: CodingContractRewardType.CompanyReputation; + name: string; + } + | { + type: CodingContractRewardType.FactionReputation; + name: FactionName; + }; /** * A Coding Contract is a file that poses a programming-related problem to the Player. diff --git a/src/Corporation/ui/modals/BribeFactionModal.tsx b/src/Corporation/ui/modals/BribeFactionModal.tsx index 1af4e993c..7cc4541e7 100644 --- a/src/Corporation/ui/modals/BribeFactionModal.tsx +++ b/src/Corporation/ui/modals/BribeFactionModal.tsx @@ -1,17 +1,17 @@ +import type { FactionName } from "@enums"; + import React, { useState } from "react"; +import { Box, Button, MenuItem, Select, SelectChangeEvent, Typography } from "@mui/material"; + +import { Player } from "@player"; import { Factions } from "../../../Faction/Factions"; import * as corpConstants from "../../data/Constants"; import { formatReputation } from "../../../ui/formatNumber"; import { dialogBoxCreate } from "../../../ui/React/DialogBox"; import { Modal } from "../../../ui/React/Modal"; -import { Player } from "@player"; import { useCorporation } from "../Context"; -import Typography from "@mui/material/Typography"; -import Button from "@mui/material/Button"; -import MenuItem from "@mui/material/MenuItem"; import { NumberInput } from "../../../ui/React/NumberInput"; -import Box from "@mui/material/Box"; -import Select, { SelectChangeEvent } from "@mui/material/Select"; +import { getEnumHelper } from "../../../utils/EnumHelper"; interface IProps { open: boolean; @@ -19,7 +19,7 @@ interface IProps { } export function BribeFactionModal(props: IProps): React.ReactElement { - const factions = Player.factions.filter((name: string) => { + const factions = Player.factions.filter((name) => { const info = Factions[name].getInfo(); if (!info.offersWork()) return false; if (Player.hasGangWith(name)) return false; @@ -27,10 +27,11 @@ export function BribeFactionModal(props: IProps): React.ReactElement { }); const corp = useCorporation(); const [money, setMoney] = useState(NaN); - const [selectedFaction, setSelectedFaction] = useState(factions.length > 0 ? factions[0] : ""); + const [selectedFaction, setSelectedFaction] = useState(factions.length > 0 ? factions[0] : ""); const disabled = money === 0 || isNaN(money) || money < 0 || corp.funds < money; function changeFaction(event: SelectChangeEvent): void { + if (!getEnumHelper("FactionName").isMember(event.target.value)) return; setSelectedFaction(event.target.value); } @@ -52,6 +53,7 @@ export function BribeFactionModal(props: IProps): React.ReactElement { } function bribe(money: number): void { + if (!selectedFaction) return; const fac = Factions[selectedFaction]; if (disabled) return; const rep = repGain(money); @@ -69,7 +71,7 @@ export function BribeFactionModal(props: IProps): React.ReactElement { Faction: +