FIX: singularity faction donation formula (#619)

This commit is contained in:
Aleksei Bezrodnov 2023-06-19 09:55:03 +02:00 committed by GitHub
parent 08e3afd125
commit 78ca279df7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 43 deletions

@ -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;
}

@ -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<number>(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 <Money money={amt} /> to {fac.name} to gain <Reputation reputation={repGain} /> reputation.
</>,
);
props.rerender();
function onDonate(): void {
const repGain = donate(donateAmt, faction);
if (repGain > 0) {
dialogBoxCreate(
<>
You just donated <Money money={donateAmt} /> to {faction.name} to gain <Reputation reputation={repGain} />{" "}
reputation.
</>,
);
rerender();
}
}
function Status(): React.ReactElement {
if (isNaN(donateAmt)) return <></>;
if (!canDonate()) {
if (!canDonate(donateAmt)) {
if (Player.money < donateAmt) return <Typography>Insufficient funds</Typography>;
return <Typography>Invalid donate amount entered!</Typography>;
}
@ -68,19 +58,19 @@ export function DonateOption(props: IProps): React.ReactElement {
return (
<Paper sx={{ my: 1, p: 1 }}>
<Status />
{props.disabled ? (
{disabled ? (
<Typography>
Unlock donations at <Favor favor={props.favorToDonate} /> favor with {props.faction.name}
Unlock donations at <Favor favor={favorToDonate} /> favor with {faction.name}
</Typography>
) : (
<>
<NumberInput
onChange={setDonateAmt}
placeholder={"Donation amount"}
disabled={props.disabled}
disabled={disabled}
InputProps={{
endAdornment: (
<Button onClick={donate} disabled={props.disabled || !canDonate()}>
<Button onClick={onDonate} disabled={disabled || !canDonate(donateAmt)}>
donate
</Button>
),

@ -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 (

@ -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<ISingularity> {
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;
},