diff --git a/src/Faction/formulas/donation.ts b/src/Faction/formulas/donation.ts index a0225528f..9441f58b2 100644 --- a/src/Faction/formulas/donation.ts +++ b/src/Faction/formulas/donation.ts @@ -1,7 +1,31 @@ +import { Person as IPerson } from "@nsdefs"; +import { Player } from "@player"; + import { CONSTANTS } from "../../Constants"; import { currentNodeMults } from "../../BitNode/BitNodeMultipliers"; -import { Person as IPerson } from "@nsdefs"; +import { Faction } from "../Faction"; export function repFromDonation(amt: number, person: IPerson): number { return (amt / CONSTANTS.DonateMoneyToRepDivisor) * person.mults.faction_rep * currentNodeMults.FactionWorkRepGain; } + +export function repNeededToDonate(): number { + return Math.floor(CONSTANTS.BaseFavorToDonate * currentNodeMults.RepToDonateToFaction); +} + +export function canDonate(amt: number): boolean { + return !isNaN(amt) && amt > 0 && Player.money >= amt; +} + +/** Donates money to the faction provided and returns repuation gained */ +export function donate(amt: number, faction: Faction) { + if (!canDonate(amt)) { + return 0; + } + + const repGain = repFromDonation(amt, Player); + Player.loseMoney(amt, "other"); + faction.playerReputation += repGain; + + return repGain; +} diff --git a/src/Faction/ui/DonateOption.tsx b/src/Faction/ui/DonateOption.tsx index cb6f43dc0..6ac24a9f8 100644 --- a/src/Faction/ui/DonateOption.tsx +++ b/src/Faction/ui/DonateOption.tsx @@ -3,7 +3,7 @@ import React, { useState } from "react"; import { CONSTANTS } from "../../Constants"; import { Faction } from "../Faction"; import { Player } from "@player"; -import { repFromDonation } from "../formulas/donation"; +import { canDonate, donate, repFromDonation } from "../formulas/donation"; import { Favor } from "../../ui/React/Favor"; import { Money } from "../../ui/React/Money"; @@ -17,44 +17,34 @@ import Paper from "@mui/material/Paper"; import Button from "@mui/material/Button"; import { NumberInput } from "../../ui/React/NumberInput"; -interface IProps { +type DonateOptionProps = { faction: Faction; disabled: boolean; favorToDonate: number; rerender: () => void; -} +}; /** React component for a donate option on the Faction UI */ -export function DonateOption(props: IProps): React.ReactElement { +export function DonateOption({ faction, favorToDonate, disabled, rerender }: DonateOptionProps): React.ReactElement { const [donateAmt, setDonateAmt] = useState(NaN); const digits = (CONSTANTS.DonateMoneyToRepDivisor + "").length - 1; - function canDonate(): boolean { - if (isNaN(donateAmt)) return false; - if (isNaN(donateAmt) || donateAmt <= 0) return false; - if (Player.money < donateAmt) return false; - return true; - } - - function donate(): void { - const fac = props.faction; - const amt = donateAmt; - if (isNaN(amt)) return; - if (!canDonate()) return; - Player.loseMoney(amt, "other"); - const repGain = repFromDonation(amt, Player); - props.faction.playerReputation += repGain; - dialogBoxCreate( - <> - You just donated to {fac.name} to gain reputation. - , - ); - props.rerender(); + function onDonate(): void { + const repGain = donate(donateAmt, faction); + if (repGain > 0) { + dialogBoxCreate( + <> + You just donated to {faction.name} to gain {" "} + reputation. + , + ); + rerender(); + } } function Status(): React.ReactElement { if (isNaN(donateAmt)) return <>; - if (!canDonate()) { + if (!canDonate(donateAmt)) { if (Player.money < donateAmt) return Insufficient funds; return Invalid donate amount entered!; } @@ -68,19 +58,19 @@ export function DonateOption(props: IProps): React.ReactElement { return ( - {props.disabled ? ( + {disabled ? ( - Unlock donations at favor with {props.faction.name} + Unlock donations at favor with {faction.name} ) : ( <> + ), diff --git a/src/Faction/ui/FactionRoot.tsx b/src/Faction/ui/FactionRoot.tsx index 989392405..88e1a3c03 100644 --- a/src/Faction/ui/FactionRoot.tsx +++ b/src/Faction/ui/FactionRoot.tsx @@ -10,21 +10,19 @@ import { DonateOption } from "./DonateOption"; import { Info } from "./Info"; import { Option } from "./Option"; -import { CONSTANTS } from "../../Constants"; - -import { currentNodeMults } from "../../BitNode/BitNodeMultipliers"; import { Faction } from "../Faction"; import { Router } from "../../ui/GameRoot"; 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 { GangButton } from "./GangButton"; import { FactionWork } from "../../Work/FactionWork"; import { useRerender } from "../../ui/React/hooks"; +import { repNeededToDonate } from "../formulas/donation"; interface IProps { faction: Faction; @@ -107,9 +105,8 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea // Flags for whether special options (gang, sleeve purchases, donate, etc.) // should be shown - const favorToDonate = Math.floor(CONSTANTS.BaseFavorToDonate * currentNodeMults.RepToDonateToFaction); + const favorToDonate = repNeededToDonate(); const canDonate = faction.favor >= favorToDonate; - const canPurchaseSleeves = faction.name === FactionName.TheCovenant && Player.bitNodeN === 10; return ( diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts index ec2941dd6..d8db5bb8c 100644 --- a/src/NetscriptFunctions/Singularity.ts +++ b/src/NetscriptFunctions/Singularity.ts @@ -42,6 +42,7 @@ import { calculateHackingTime } from "../Hacking"; import { Server } from "../Server/Server"; import { netscriptCanHack } from "../Hacking/netscriptCanHack"; import { FactionInfos } from "../Faction/FactionInfo"; +import { donate, repNeededToDonate } from "../Faction/formulas/donation"; import { InternalAPI, NetscriptContext, removedFunction } from "../Netscript/APIWrapper"; import { enterBitNode } from "../RedPill"; import { ClassWork } from "../Work/ClassWork"; @@ -1027,18 +1028,18 @@ export function NetscriptSingularity(): InternalAPI { helpers.log(ctx, () => `You do not have enough money to donate ${formatMoney(amt)} to '${facName}'`); return false; } - const repNeededToDonate = Math.floor(CONSTANTS.BaseFavorToDonate * currentNodeMults.RepToDonateToFaction); - if (faction.favor < repNeededToDonate) { + + if (faction.favor < repNeededToDonate()) { helpers.log( ctx, () => - `You do not have enough favor to donate to this faction. Have ${faction.favor}, need ${repNeededToDonate}`, + `You do not have enough favor to donate to this faction. Have ${ + faction.favor + }, need ${repNeededToDonate()}`, ); return false; } - const repGain = (amt / CONSTANTS.DonateMoneyToRepDivisor) * Player.mults.faction_rep; - faction.playerReputation += repGain; - Player.loseMoney(amt, "other"); + const repGain = donate(amt, faction); helpers.log(ctx, () => `${formatMoney(amt)} donated to '${facName}' for ${formatReputation(repGain)} reputation`); return true; },