gave some love to the donations

This commit is contained in:
Olivier Gagnon 2021-09-04 01:39:34 -04:00
parent e1cb0e529c
commit f2edb42aca
3 changed files with 71 additions and 78 deletions

@ -0,0 +1,6 @@
import { CONSTANTS } from "../../Constants";
import { IPlayer } from "../../PersonObjects/IPlayer";
export function repFromDonation(amt: number, player: IPlayer): number {
return amt / CONSTANTS.DonateMoneyToRepDivisor * player.faction_rep_mult;
}

@ -1,11 +1,12 @@
/** /**
* React component for a donate option on the Faction UI * React component for a donate option on the Faction UI
*/ */
import * as React from "react"; import React, { useState } from "react";
import { CONSTANTS } from "../../Constants"; import { CONSTANTS } from "../../Constants";
import { Faction } from "../../Faction/Faction"; import { Faction } from "../../Faction/Faction";
import { IPlayer } from "../../PersonObjects/IPlayer"; import { IPlayer } from "../../PersonObjects/IPlayer";
import { repFromDonation } from "../formulas/donation";
import { Money } from "../../ui/React/Money"; import { Money } from "../../ui/React/Money";
import { Reputation } from "../../ui/React/Reputation"; import { Reputation } from "../../ui/React/Reputation";
@ -15,6 +16,7 @@ import { StdButton } from "../../ui/React/StdButton";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { dialogBoxCreate } from "../../../utils/DialogBox"; import { dialogBoxCreate } from "../../../utils/DialogBox";
import { MathComponent } from 'mathjax-react';
type IProps = { type IProps = {
faction: Faction; faction: Faction;
@ -24,93 +26,78 @@ type IProps = {
rerender: () => void; rerender: () => void;
} }
type IState = {
donateAmt: number;
status: JSX.Element;
}
const inputStyleMarkup = { const inputStyleMarkup = {
margin: "5px", margin: "5px",
height: "26px", height: "26px",
} }
export class DonateOption extends React.Component<IProps, IState> { const blockStyle = { display: "block" };
// Style markup for block elements. Stored as property
blockStyle: any = { display: "block" };
constructor(props: IProps) { export function DonateOption(props: IProps): React.ReactElement {
super(props); const [donateAmt, setDonateAmt] = useState<number | null>(null);
const digits = (CONSTANTS.DonateMoneyToRepDivisor+'').length-1;
function canDonate(): boolean {
this.state = { if(donateAmt === null) return false;
donateAmt: 0, if (isNaN(donateAmt) || donateAmt <= 0) return false;
status: props.disabled ? <>Unlocked at {props.favorToDonate} favor with {props.faction.name}</> : <></>, if(props.p.money.lt(donateAmt)) return false;
return true;
} }
this.calculateRepGain = this.calculateRepGain.bind(this); function onChange(event: React.ChangeEvent<HTMLInputElement>): void {
this.donate = this.donate.bind(this); const amt = numeralWrapper.parseMoney(event.target.value);
this.handleChange = this.handleChange.bind(this); if(event.target.value === "" || isNaN(amt)) setDonateAmt(null);
else setDonateAmt(amt);
} }
// Returns rep gain for a given donation amount function donate(): void {
calculateRepGain(amt: number): number { const fac = props.faction;
return amt / CONSTANTS.DonateMoneyToRepDivisor * this.props.p.faction_rep_mult; const amt = donateAmt;
} if(amt === null) return;
if(!canDonate()) return;
donate(): void { props.p.loseMoney(amt);
const fac = this.props.faction; const repGain = repFromDonation(amt, props.p);
const amt = this.state.donateAmt; props.faction.playerReputation += repGain;
if (isNaN(amt) || amt <= 0) {
dialogBoxCreate(`Invalid amount entered!`);
} else if (!this.props.p.canAfford(amt)) {
dialogBoxCreate(`You cannot afford to donate this much money!`);
} else {
this.props.p.loseMoney(amt);
const repGain = this.calculateRepGain(amt);
this.props.faction.playerReputation += repGain;
dialogBoxCreate(<> dialogBoxCreate(<>
You just donated {Money(amt)} to {fac.name} to gain {Reputation(repGain)} reputation You just donated {Money(amt)} to {fac.name} to gain {Reputation(repGain)} reputation.
</>); </>);
this.props.rerender(); props.rerender();
}
} }
handleChange(e: React.ChangeEvent<HTMLInputElement>): void { function Status(): React.ReactElement {
const amt = numeralWrapper.parseMoney(e.target.value); if(donateAmt === null) return (<></>);
if(!canDonate()) {
if (isNaN(amt)) { if(props.p.money.lt(donateAmt))
this.setState({ return (<p>Insufficient funds</p>);
donateAmt: 0, return (<p>Invalid donate amount entered!</p>);
status: <>Invalid donate amount entered!</>,
});
} else {
const repGain = this.calculateRepGain(amt);
this.setState({
donateAmt: amt,
status: <>This donation will result in {Reputation(repGain)} reputation gain</>,
});
} }
return (<p>This donation will result in {Reputation(repFromDonation(donateAmt, props.p))} reputation gain</p>);
} }
render(): React.ReactNode {
return ( return (<div className={"faction-work-div"}>
<div className={"faction-work-div"}>
<div className={"faction-work-div-wrapper"}> <div className={"faction-work-div-wrapper"}>
<input <input
className="text-input" className="text-input"
onChange={this.handleChange} onChange={onChange}
placeholder={"Donation amount"} placeholder={"Donation amount"}
style={inputStyleMarkup} style={inputStyleMarkup}
disabled={this.props.disabled} disabled={props.disabled}
/> />
<StdButton <StdButton
onClick={this.donate} onClick={donate}
text={"Donate Money"} text={"Donate Money"}
disabled={this.props.disabled} disabled={props.disabled || !canDonate()}
/> />
<p style={this.blockStyle}>{this.state.status}</p> <Status />
{
props.disabled ?
<p>Unlocked at {props.favorToDonate} favor with {props.faction.name}</p> :
<div className="text">
<MathComponent tex={String.raw`reputation = \frac{\text{donation amount} \times \text{reputation multiplier}}{10^{${digits}}}`} />
</div> </div>
}
</div> </div>
) </div>);
}
} }

@ -11,7 +11,7 @@ import { AutoupdatingParagraph } from "../../ui/React/AutoupdatingParagraph";
import { ParagraphWithTooltip } from "../../ui/React/ParagraphWithTooltip"; import { ParagraphWithTooltip } from "../../ui/React/ParagraphWithTooltip";
import { Reputation } from "../../ui/React/Reputation"; import { Reputation } from "../../ui/React/Reputation";
import { Favor } from "../../ui/React/Favor"; import { Favor } from "../../ui/React/Favor";
import { MathComponent } from 'mathjax-react' import { MathComponent } from 'mathjax-react';
type IProps = { type IProps = {
faction: Faction; faction: Faction;