Add utilities for making common cost requirement pay functions

This commit is contained in:
thepaperpilot 2023-02-15 13:05:43 -06:00
parent 3dd2d96567
commit fe25ea71b6

View file

@ -17,6 +17,7 @@ import Formula, {
GenericFormula, GenericFormula,
InvertibleFormula InvertibleFormula
} from "./formulas"; } from "./formulas";
import { DefaultValue, Persistent } from "./persistence";
/** /**
* An object that can be used to describe a requirement to perform some purchase or other action. * An object that can be used to describe a requirement to perform some purchase or other action.
@ -89,13 +90,15 @@ export interface CostRequirementOptions {
pay?: (amount?: DecimalSource) => void; pay?: (amount?: DecimalSource) => void;
} }
export type CostRequirement = Requirement & CostRequirementOptions;
/** /**
* Lazily creates a requirement with the given options, that is based on meeting an amount of a resource. * Lazily creates a requirement with the given options, that is based on meeting an amount of a resource.
* @param optionsFunc Cost requirement options. * @param optionsFunc Cost requirement options.
*/ */
export function createCostRequirement<T extends CostRequirementOptions>( export function createCostRequirement<T extends CostRequirementOptions>(
optionsFunc: () => T optionsFunc: () => T
): Requirement { ): CostRequirement {
return createLazyProxy(() => { return createLazyProxy(() => {
const req = optionsFunc() as T & Partial<Requirement>; const req = optionsFunc() as T & Partial<Requirement>;
@ -181,7 +184,7 @@ export function createCostRequirement<T extends CostRequirementOptions>(
}); });
} }
return req as Requirement; return req as CostRequirement;
}); });
} }
@ -300,3 +303,24 @@ export function payRequirements(requirements: Requirements, amount: DecimalSourc
requirements.pay?.(amount); requirements.pay?.(amount);
} }
} }
export function payByDivision(this: CostRequirement, amount?: DecimalSource) {
const cost =
this.cost instanceof Formula
? calculateCost(
this.cost,
amount ?? 1,
unref(this.spendResources as ProcessedComputable<boolean> | undefined) ?? true
)
: unref(this.cost as ProcessedComputable<DecimalSource>);
this.resource.value = Decimal.div(this.resource.value, cost);
}
export function payByReset(overrideDefaultValue?: DecimalSource) {
return function (this: CostRequirement) {
this.resource.value =
overrideDefaultValue ??
(this.resource as Resource & Persistent<DecimalSource>)[DefaultValue] ??
0;
};
}