Added costModifier to conversions
This commit is contained in:
parent
90114f6eb3
commit
5b62080786
1 changed files with 46 additions and 13 deletions
|
@ -66,11 +66,19 @@ export interface ConversionOptions {
|
||||||
*/
|
*/
|
||||||
convert?: VoidFunction;
|
convert?: VoidFunction;
|
||||||
/**
|
/**
|
||||||
* An addition modifier that will be applied to the gain amounts.
|
* An additional modifier that will be applied to the gain amounts.
|
||||||
* Must be reversible in order to correctly calculate {@link nextAt}.
|
* Must be reversible in order to correctly calculate {@link nextAt}.
|
||||||
* @see {@link createSequentialModifier} if you want to apply multiple modifiers.
|
* @see {@link createSequentialModifier} if you want to apply multiple modifiers.
|
||||||
*/
|
*/
|
||||||
gainModifier?: WithRequired<Modifier, "revert">;
|
gainModifier?: WithRequired<Modifier, "revert">;
|
||||||
|
/**
|
||||||
|
* A modifier that will be applied to the cost amounts.
|
||||||
|
* That is to say, this modifier will be applied to the amount of baseResource before going into the scaling function.
|
||||||
|
* A cost modifier of x0.5 would give gain amounts equal to the player having half the baseResource they actually have.
|
||||||
|
* Must be reversible in order to correctly calculate {@link nextAt}.
|
||||||
|
* @see {@link createSequentialModifier} if you want to apply multiple modifiers.
|
||||||
|
*/
|
||||||
|
costModifier?: WithRequired<Modifier, "revert">;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -234,11 +242,15 @@ export function createLinearScaling(
|
||||||
const processedCoefficient = convertComputable(coefficient);
|
const processedCoefficient = convertComputable(coefficient);
|
||||||
return {
|
return {
|
||||||
currentGain(conversion) {
|
currentGain(conversion) {
|
||||||
if (Decimal.lt(conversion.baseResource.value, unref(processedBase))) {
|
let baseAmount: DecimalSource = unref(conversion.baseResource.value);
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
baseAmount = conversion.costModifier.apply(baseAmount);
|
||||||
|
}
|
||||||
|
if (Decimal.lt(baseAmount, unref(processedBase))) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Decimal.sub(conversion.baseResource.value, unref(processedBase))
|
return Decimal.sub(baseAmount, unref(processedBase))
|
||||||
.sub(1)
|
.sub(1)
|
||||||
.times(unref(processedCoefficient))
|
.times(unref(processedCoefficient))
|
||||||
.add(1);
|
.add(1);
|
||||||
|
@ -248,21 +260,29 @@ export function createLinearScaling(
|
||||||
if (conversion.gainModifier) {
|
if (conversion.gainModifier) {
|
||||||
current = conversion.gainModifier.revert(current);
|
current = conversion.gainModifier.revert(current);
|
||||||
}
|
}
|
||||||
current = Decimal.max(0, current);
|
current = Decimal.max(0, current)
|
||||||
return Decimal.sub(current, 1)
|
.sub(1)
|
||||||
.div(unref(processedCoefficient))
|
.div(unref(processedCoefficient))
|
||||||
.add(unref(processedBase));
|
.add(unref(processedBase));
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
current = conversion.costModifier.revert(current);
|
||||||
|
}
|
||||||
|
return current;
|
||||||
},
|
},
|
||||||
nextAt(conversion) {
|
nextAt(conversion) {
|
||||||
let next: DecimalSource = Decimal.add(unref(conversion.currentGain), 1);
|
let next: DecimalSource = Decimal.add(unref(conversion.currentGain), 1);
|
||||||
if (conversion.gainModifier) {
|
if (conversion.gainModifier) {
|
||||||
next = conversion.gainModifier.revert(next);
|
next = conversion.gainModifier.revert(next);
|
||||||
}
|
}
|
||||||
next = Decimal.max(0, next);
|
next = Decimal.max(0, next)
|
||||||
return Decimal.sub(next, 1)
|
.sub(1)
|
||||||
.div(unref(processedCoefficient))
|
.div(unref(processedCoefficient))
|
||||||
.add(unref(processedBase))
|
.add(unref(processedBase))
|
||||||
.max(unref(processedBase));
|
.max(unref(processedBase));
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
next = conversion.costModifier.revert(next);
|
||||||
|
}
|
||||||
|
return next;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -288,11 +308,15 @@ export function createPolynomialScaling(
|
||||||
const processedExponent = convertComputable(exponent);
|
const processedExponent = convertComputable(exponent);
|
||||||
return {
|
return {
|
||||||
currentGain(conversion) {
|
currentGain(conversion) {
|
||||||
if (Decimal.lt(conversion.baseResource.value, unref(processedBase))) {
|
let baseAmount: DecimalSource = unref(conversion.baseResource.value);
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
baseAmount = conversion.costModifier.apply(baseAmount);
|
||||||
|
}
|
||||||
|
if (Decimal.lt(baseAmount, unref(processedBase))) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const gain = Decimal.div(conversion.baseResource.value, unref(processedBase)).pow(
|
const gain = Decimal.div(baseAmount, unref(processedBase)).pow(
|
||||||
unref(processedExponent)
|
unref(processedExponent)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -306,18 +330,27 @@ export function createPolynomialScaling(
|
||||||
if (conversion.gainModifier) {
|
if (conversion.gainModifier) {
|
||||||
current = conversion.gainModifier.revert(current);
|
current = conversion.gainModifier.revert(current);
|
||||||
}
|
}
|
||||||
current = Decimal.max(0, current);
|
current = Decimal.max(0, current)
|
||||||
return Decimal.root(current, unref(processedExponent)).times(unref(processedBase));
|
.root(unref(processedExponent))
|
||||||
|
.times(unref(processedBase));
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
current = conversion.costModifier.revert(current);
|
||||||
|
}
|
||||||
|
return current;
|
||||||
},
|
},
|
||||||
nextAt(conversion) {
|
nextAt(conversion) {
|
||||||
let next: DecimalSource = Decimal.add(unref(conversion.currentGain), 1);
|
let next: DecimalSource = Decimal.add(unref(conversion.currentGain), 1);
|
||||||
if (conversion.gainModifier) {
|
if (conversion.gainModifier) {
|
||||||
next = conversion.gainModifier.revert(next);
|
next = conversion.gainModifier.revert(next);
|
||||||
}
|
}
|
||||||
next = Decimal.max(0, next);
|
next = Decimal.max(0, next)
|
||||||
return Decimal.root(next, unref(processedExponent))
|
.root(unref(processedExponent))
|
||||||
.times(unref(processedBase))
|
.times(unref(processedBase))
|
||||||
.max(unref(processedBase));
|
.max(unref(processedBase));
|
||||||
|
if (conversion.costModifier) {
|
||||||
|
next = conversion.costModifier.revert(next);
|
||||||
|
}
|
||||||
|
return next;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue