diff --git a/src/main/java/it/hurts/sskirillss/relics/config/data/StatConfigData.java b/src/main/java/it/hurts/sskirillss/relics/config/data/StatConfigData.java index c2fd02bd..98147198 100644 --- a/src/main/java/it/hurts/sskirillss/relics/config/data/StatConfigData.java +++ b/src/main/java/it/hurts/sskirillss/relics/config/data/StatConfigData.java @@ -28,6 +28,7 @@ public class StatConfigData { MULTIPLY_BASE: x + ((x * y) * z), MULTIPLY_TOTAL: x * (y + 1)^z, ADD: x + (y * z). + CUSTOM: logic is overwritten in code, can't be changed via configs ...where x - Base stat value, y - Value of [upgradeModifier], z - Current relic level """) diff --git a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/IRelicItem.java b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/IRelicItem.java index 4dab5fb1..d3853b2e 100644 --- a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/IRelicItem.java +++ b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/IRelicItem.java @@ -43,6 +43,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static it.hurts.sskirillss.relics.items.relics.base.data.leveling.misc.UpgradeOperation.*; + + public interface IRelicItem { @Nullable default Item getItem() { @@ -886,13 +889,7 @@ default double getRelativeStatValue(String ability, String stat, double value, i if (data == null) return result; - var step = data.getUpgradeModifier().getValue(); - - switch (data.getUpgradeModifier().getKey()) { - case ADD -> result = value + (points * step); - case MULTIPLY_BASE -> result = value + ((value * step) * points); - case MULTIPLY_TOTAL -> result = value * Math.pow(step + 1, points); - } + result = data.getNewUpgradeModifier().apply(value, points); var threshold = data.getThresholdValue(); diff --git a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/StatData.java b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/StatData.java index 5afeabc1..8832a02e 100644 --- a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/StatData.java +++ b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/StatData.java @@ -6,8 +6,11 @@ import lombok.Data; import org.apache.commons.lang3.tuple.Pair; +import java.util.function.BiFunction; import java.util.function.Function; +import static it.hurts.sskirillss.relics.items.relics.base.data.leveling.misc.UpgradeOperation.CUSTOM; + @Data @Builder public class StatData { @@ -24,10 +27,11 @@ public static StatDataBuilder builder(String id) { @Builder.Default private Pair upgradeModifier; @Builder.Default + private BiFunction newUpgradeModifier; + @Builder.Default private Pair initialValue; @Builder.Default private Pair thresholdValue; - @Builder.Default private Function formatValue = Double::doubleValue; @@ -35,8 +39,18 @@ public StatConfigData toConfigData() { return new StatConfigData(initialValue.getKey(), initialValue.getValue(), thresholdValue.getKey(), thresholdValue.getValue(), upgradeModifier.getKey(), upgradeModifier.getValue()); } + public void setUpgradeModifier(Pair upgradeModifier) { + this.upgradeModifier = upgradeModifier; + switch (upgradeModifier.getKey()) { + case ADD -> newUpgradeModifier = (current, points) -> current + points * upgradeModifier.getValue(); + case MULTIPLY_BASE -> newUpgradeModifier = (current, points) -> current + ((current * upgradeModifier.getValue()) * points); + case MULTIPLY_TOTAL -> newUpgradeModifier = (current, points) -> current * Math.pow(upgradeModifier.getValue() + 1, points); + } + } + public static class StatDataBuilder { - private Pair upgradeModifier = Pair.of(UpgradeOperation.ADD, 0D); + private Pair upgradeModifier = Pair.of(CUSTOM, 0D); + private BiFunction newUpgradeModifier = null; private Pair initialValue = Pair.of(0D, 0D); private Pair thresholdValue = Pair.of(Double.MIN_VALUE, Double.MAX_VALUE); @@ -58,9 +72,27 @@ public StatDataBuilder thresholdValue(double min, double max) { return this; } + private StatDataBuilder newUpgradeModifier(BiFunction function) { + return this; + } + + /** + * @deprecated Use {@code upgradeModifier(BiFunction function)} instead + */ + @Deprecated public StatDataBuilder upgradeModifier(UpgradeOperation operation, double step) { upgradeModifier = Pair.of(operation, step); + switch (operation) { + case ADD -> newUpgradeModifier = (current, points) -> current + points * step; + case MULTIPLY_BASE -> newUpgradeModifier = (current, points) -> current + ((current * step) * points); + case MULTIPLY_TOTAL -> newUpgradeModifier = (current, points) -> current * Math.pow(step + 1, points); + } + + return this; + } + public StatDataBuilder upgradeModifier(BiFunction function) { + newUpgradeModifier = function; return this; } } diff --git a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/misc/UpgradeOperation.java b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/misc/UpgradeOperation.java index d902ad1f..9bac95f9 100644 --- a/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/misc/UpgradeOperation.java +++ b/src/main/java/it/hurts/sskirillss/relics/items/relics/base/data/leveling/misc/UpgradeOperation.java @@ -1,7 +1,15 @@ package it.hurts.sskirillss.relics.items.relics.base.data.leveling.misc; +import lombok.AllArgsConstructor; + +/** + * @deprecated Use BiFunctions instead + */ +@Deprecated +@AllArgsConstructor public enum UpgradeOperation { ADD, MULTIPLY_BASE, - MULTIPLY_TOTAL + MULTIPLY_TOTAL, + CUSTOM; } \ No newline at end of file diff --git a/src/main/java/it/hurts/sskirillss/relics/items/relics/belt/LeatherBeltItem.java b/src/main/java/it/hurts/sskirillss/relics/items/relics/belt/LeatherBeltItem.java index b4279957..d5fecd21 100644 --- a/src/main/java/it/hurts/sskirillss/relics/items/relics/belt/LeatherBeltItem.java +++ b/src/main/java/it/hurts/sskirillss/relics/items/relics/belt/LeatherBeltItem.java @@ -39,7 +39,8 @@ public RelicData constructDefaultRelicData() { .requiredPoints(2) .stat(StatData.builder("charm") .initialValue(1D, 3D) - .upgradeModifier(UpgradeOperation.ADD, 1D) + //.upgradeModifier(UpgradeOperation.ADD, 1D) // Deprecated + .upgradeModifier(Double::sum) .formatValue(value -> (int) (MathUtils.round(value, 1))) .build()) .build())