From 4ed651e6c4ef2840c369297274db49c59193f9d9 Mon Sep 17 00:00:00 2001 From: XxFran10xX <318299142+XxFran10xX@users.noreply.github.com> Date: Sun, 27 Sep 2026 09:51:11 +0200 Subject: [PATCH] feat: add per-base success bonus to the alloy forge scrap roll Higher-tier base ingots now lower the scrap chance of a new alloy discovery through a flat, configurable bonus (alloy-forge.base-bonus-percent). It only applies to the base, so ingots used as catalysts gain nothing, and it does not touch ingredient values, which also drive stat rolls, revisions and Thievery totals. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../net/tfminecraft/advancedcrafting/cache/Cache.java | 8 ++++++++ .../advancedcrafting/loaders/ConfigLoader.java | 9 +++++++++ .../advancedcrafting/objects/alloys/AlloyForger.java | 3 ++- src/main/resources/config.yml | 8 +++++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/tfminecraft/advancedcrafting/cache/Cache.java b/src/main/java/net/tfminecraft/advancedcrafting/cache/Cache.java index c2a18f5..ca81af3 100644 --- a/src/main/java/net/tfminecraft/advancedcrafting/cache/Cache.java +++ b/src/main/java/net/tfminecraft/advancedcrafting/cache/Cache.java @@ -5,6 +5,7 @@ import java.util.Map; import net.tfminecraft.advancedcrafting.objects.data.PermissionNamespace; +import net.tfminecraft.advancedcrafting.objects.ingredients.Ingredient; import net.tfminecraft.advancedcrafting.objects.ingredients.IngredientType; public class Cache { @@ -17,6 +18,8 @@ public class Cache { public static double alloyForgeBaseSuccess = 2.0; public static double alloyForgeBonusPerSqrtValue = 4.0; public static double alloyForgeMaxSuccess = 85.0; + /** Flat success% added when the ingredient (lowercase id) is the alloy base. Catalysts never get it. */ + public static Map alloyForgeBaseBonus = new HashMap<>(); public static String brandingTool; @@ -42,4 +45,9 @@ public static boolean canCombine(IngredientType base, IngredientType type){ if(!combinations.containsKey(base)) return true; return combinations.get(base).contains(type); } + + public static double getAlloyForgeBaseBonus(Ingredient base) { + if(base == null) return 0.0; + return alloyForgeBaseBonus.getOrDefault(base.getId().toLowerCase(), 0.0); + } } diff --git a/src/main/java/net/tfminecraft/advancedcrafting/loaders/ConfigLoader.java b/src/main/java/net/tfminecraft/advancedcrafting/loaders/ConfigLoader.java index acf3ffd..1fbd356 100644 --- a/src/main/java/net/tfminecraft/advancedcrafting/loaders/ConfigLoader.java +++ b/src/main/java/net/tfminecraft/advancedcrafting/loaders/ConfigLoader.java @@ -40,6 +40,15 @@ public void load(File configFile) { if (Cache.alloyForgeMaxSuccess < Cache.alloyForgeBaseSuccess) { Cache.alloyForgeMaxSuccess = Cache.alloyForgeBaseSuccess; } + Cache.alloyForgeBaseBonus.clear(); + if (config.isConfigurationSection("alloy-forge.base-bonus-percent")) { + for (String ingredientId : config.getConfigurationSection("alloy-forge.base-bonus-percent").getKeys(false)) { + double bonus = clampPercent(config.getDouble("alloy-forge.base-bonus-percent." + ingredientId, 0.0)); + if (bonus > 0.0) { + Cache.alloyForgeBaseBonus.put(ingredientId.toLowerCase(), bonus); + } + } + } Cache.brandingTool = config.getString("branding-tool", null); diff --git a/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/AlloyForger.java b/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/AlloyForger.java index 8c58241..ac6e710 100644 --- a/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/AlloyForger.java +++ b/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/AlloyForger.java @@ -132,7 +132,8 @@ public String getXP() { private boolean isScrap() { double chance = Math.min( Cache.alloyForgeMaxSuccess, - Cache.alloyForgeBaseSuccess + Cache.alloyForgeBonusPerSqrtValue * Math.sqrt(value)); + Cache.alloyForgeBaseSuccess + Cache.alloyForgeBonusPerSqrtValue * Math.sqrt(value) + + Cache.getAlloyForgeBaseBonus(station.getBaseItem())); return ThreadLocalRandom.current().nextDouble(100.0) >= chance; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0ac2419..db6e024 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -6,11 +6,17 @@ crafting-station: v(ANVIL) alloy-station: iaf(tfmc:alloy_forge) ingredient-station: iaf(tfmc:ingredient_converter) -# New alloy discovery roll: success% = min(max, base + sqrt(totalValue) * bonus). totalValue = sum of ingredient value fields (base + catalysts). +# New alloy discovery roll: success% = min(max, base + sqrt(totalValue) * bonus + base-bonus). totalValue = sum of ingredient value fields (base + catalysts). alloy-forge: base-success-percent: 2.0 success-bonus-per-sqrt-value: 4.0 max-success-percent: 85.0 + # Flat success% added when this ingredient is the base. Catalysts never get it; unlisted ingredients get 0. + base-bonus-percent: + steel_ingot: 10.0 + bronze_ingot: 15.0 + abyssalite_ingot: 20.0 + mythril_ingot: 25.0 max-factor: 1.2