diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java index 02c575027..052ff8d37 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java @@ -138,6 +138,36 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { .weight(CodeCurrency.Weights.COMMON) .build(this); + public ExileKey REROLL_ALL_AFFIXES = ExileCurrency.Builder.of("affix_reroll_all", "Orb of Rebirth", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.RARE_ID) + .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_ALL_AFFIXES) + .potentialCost(10) + .weight(CodeCurrency.Weights.COMMON) + .build(this); + + public ExileKey REROLL_ALL_PREFIXES = ExileCurrency.Builder.of("prefix_reroll_all", "Orb of Sinistral Rebirth", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.EPIC_ID) + .addRequirement(ItemReqs.INSTANCE.HAS_PREFIXES) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_ALL_PREFIXES) + .potentialCost(20) + .weight(CodeCurrency.Weights.RARE) + .build(this); + + public ExileKey REROLL_ALL_SUFFIXES = ExileCurrency.Builder.of("suffix_reroll_all", "Orb of Dextral Rebirth", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.EPIC_ID) + .addRequirement(ItemReqs.INSTANCE.HAS_SUFFIXES) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_ALL_SUFFIXES) + .potentialCost(20) + .weight(CodeCurrency.Weights.RARE) + .build(this); + public ExileKey REROLL_RANDOM_AFFIX_TO_MYTHIC = ExileCurrency.Builder.of("affix_random_mythic_reroll", "Orb of Divine Benevolence", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.MYTHIC_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) @@ -216,6 +246,26 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { .weight(CodeCurrency.Weights.COMMON) .build(this); + public ExileKey REROLL_PREFIX_NUMBERS = ExileCurrency.Builder.of("prefix_number_reroll", "Orb of Western Ciphers", ItemReqs.INSTANCE.IS_GEAR) + .rarity(IRarity.EPIC_ID) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .addRequirement(ItemReqs.INSTANCE.HAS_PREFIXES) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_PREFIX_NUMBERS) + .potentialCost(10) + .weight(CodeCurrency.Weights.RARE) + .build(this); + + public ExileKey REROLL_SUFFIX_NUMBERS = ExileCurrency.Builder.of("suffix_number_reroll", "Orb of Eastern Ciphers", ItemReqs.INSTANCE.IS_GEAR) + .rarity(IRarity.EPIC_ID) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .addRequirement(ItemReqs.INSTANCE.HAS_SUFFIXES) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_SUFFIX_NUMBERS) + .potentialCost(10) + .weight(CodeCurrency.Weights.RARE) + .build(this); + public ExileKey REROLL_IMPLICIT_NUMBERS = ExileCurrency.Builder.of("implicit_number_reroll", "Orb of Genesis", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) @@ -226,6 +276,16 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { .weight(CodeCurrency.Weights.RARE) .build(this); + public ExileKey REROLL_IMPLICIT_AFFIX = ExileCurrency.Builder.of("implicit_affix_reroll", "Orb of Revelation", ItemReqs.INSTANCE.IS_GEAR) + .rarity(IRarity.MYTHIC_ID) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .addRequirement(ItemReqs.INSTANCE.HAS_OTHER_IMPLICIT) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_IMPLICIT_AFFIX) + .potentialCost(15) + .weight(CodeCurrency.Weights.UBER) + .build(this); + public ExileKey UPGRADE_CORRUPTION_AFFIX = ExileCurrency.Builder.of("up_corrupt_affix", "Orb of Foolish Risk", ItemReqs.INSTANCE.IS_GEAR, ItemReqs.INSTANCE.IS_JEWEL) .rarity(IRarity.EPIC_ID) @@ -268,6 +328,46 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { .weight(CodeCurrency.Weights.RARE) .build(this); + public ExileKey UPGRADE_GEAR_RARITY = ExileCurrency.Builder.of("gear_rarity_upgrade", "Orb of Ascension", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.MYTHIC_ID) + .addRequirement(ItemReqs.INSTANCE.HAS_HIGHER_RARITY) + .addAlwaysUseModification(ItemMods.INSTANCE.UPGRADE_GEAR_RARITY) + .potentialCost(35) + .weight(CodeCurrency.Weights.UBER) + .build(this); + + public ExileKey RANDOMIZE_GEAR_RARITY = ExileCurrency.Builder.of("gear_rarity_random", "Orb of Colors", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.UNCOMMON) + .addRequirement(ItemReqs.INSTANCE.IS_RARITY.get(new RarityKeyInfo(IRarity.COMMON_ID))) + .addAlwaysUseModification(ItemMods.INSTANCE.RANDOMIZE_GEAR_RARITY) + .potentialCost(1) + .weight(CodeCurrency.Weights.COMMON) + .build(this); + + public ExileKey COMMON_TO_RUNED = ExileCurrency.Builder.of("common_to_runed", "Orb of Runic Invocation", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.RUNEWORD_ID) + .addRequirement(ItemReqs.INSTANCE.IS_RARITY.get(new RarityKeyInfo(IRarity.COMMON_ID))) + .addModification(ItemMods.INSTANCE.COMMON_TO_RUNED, 75) + .addModification(Modifications.INSTANCE.DESTROY_ITEM, 25) + .potentialCost(20) + .weight(CodeCurrency.Weights.RARE) + .build(this); + + public ExileKey REROLL_BASE_NUMBERS = ExileCurrency.Builder.of("base_number_reroll", "Orb of Introspection", ItemReqs.INSTANCE.IS_GEAR) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.LEGENDARY_ID) + .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_BASE_NUMBERS) + .potentialCost(15) + .weight(CodeCurrency.Weights.UBER) + .build(this); + public ExileKey UPGRADE_MAP_RARITY = ExileCurrency.Builder.of("map_rarity_upgrade", "Orb of Map Rarity", ItemReqs.INSTANCE.IS_MAP) .rarity(IRarity.EPIC_ID) .addAlwaysUseModification(ItemMods.INSTANCE.UPGRADE_MAP_RARITY) diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java index a29a4ecc5..420ca1d1c 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java @@ -12,6 +12,8 @@ public class ItemModificationSers { public static String UPGRADE_JEWEL_AFFIX_RARITY = "upgrade_jewel_affix_rarity"; public static String SET_AFFIX_RARITY = "set_affix_rarity"; public static String DOWNGRADE_AFFIX_RARITY = "downgrade_affix_rarity"; + public static String UPGRADE_GEAR_RARITY = "upgrade_gear_rarity"; + public static String COMMON_TO_RUNED = "common_to_runed"; public static String CORRUPT_GEAR = "corrupt_gear"; public static String MIRROR = "mirror"; @@ -22,6 +24,8 @@ public class ItemModificationSers { public static String JEWEL_CORRUPT = "corrupt_jewel"; public static String REROLL_AFFIX_NUMBERS = "reroll_affix_numbers"; public static String REROLL_IMPLICIT_NUMBERS = "reroll_implicit_numbers"; + public static String REROLL_IMPLICIT_AFFIX = "reroll_implicit_affix"; + public static String REROLL_BASE_NUMBERS = "reroll_base_numbers"; public static String EXTRACT_SOCKET = "extract_socket"; public static String FORCE_SOUL_TAG = "force_soul_tag"; diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java index 48ea8cfe2..8e4349dc1 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java @@ -72,12 +72,22 @@ public ItemMods(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_RANDOM_AFFIX = ExileKey.ofId(this, "reroll_random_affix", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.RANDOM_AFFIX.get(), "random"), "")); public ExileKey REROLL_LOWEST_AFFIX = ExileKey.ofId(this, "reroll_lowest_affix", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.LOWEST_RARITY_AFFIX.get(), "random"), "")); public ExileKey REROLL_RANDOM_AFFIX_INTO_MYTHIC = ExileKey.ofId(this, "reroll_random_affix_to_mythic", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.RANDOM_AFFIX.get(), IRarity.MYTHIC_ID), "Mythic")); + public ExileKey REROLL_ALL_AFFIXES = ExileKey.ofId(this, "reroll_all_affixes", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.ALL_AFFIXES.get(), "random"), "")); + public ExileKey REROLL_ALL_PREFIXES = ExileKey.ofId(this, "reroll_all_prefixes", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.ALL_PREFIXES.get(), "random"), "")); + public ExileKey REROLL_ALL_SUFFIXES = ExileKey.ofId(this, "reroll_all_suffixes", x -> new RerollAffixItemMod(x.GUID(), new RerollAffixItemMod.Data(UpgradeAffixItemMod.AffixFinder.ALL_SUFFIXES.get(), "random"), "")); public ExileKey REROLL_INFUSION = ExileKey.ofId(this, "reroll_infusion", x -> new RerollInfusionItemMod(x.GUID())); public ExileKey UPGRADE_MAP_RARITY = ExileKey.ofId(this, "map_rarity_upgrade", x -> new UpgradeMapRarityItemMod(x.GUID())); + public ExileKey UPGRADE_GEAR_RARITY = ExileKey.ofId(this, "gear_rarity_upgrade", x -> new UpgradeRarityItemMod(x.GUID(), UpgradeRarityItemMod.UpgradeType.UPGRADE)); + public ExileKey RANDOMIZE_GEAR_RARITY = ExileKey.ofId(this, "gear_rarity_random", x -> new UpgradeRarityItemMod(x.GUID(), UpgradeRarityItemMod.UpgradeType.RANDOMIZE)); + public ExileKey COMMON_TO_RUNED = ExileKey.ofId(this, "common_to_runed", x -> new CommonToRunedItemMod(x.GUID())); public ExileKey ADD_25_POTENTIAL = ExileKey.ofId(this, "add_potential", x -> new AddPotentialItemMod(x.GUID(), new AddPotentialItemMod.Data(25))); public ExileKey JEWEL_CORRUPTION = ExileKey.ofId(this, "jewel_corrupt", x -> new CorruptJewelItemMod(x.GUID())); - public ExileKey REROLL_AFFIX_NUMBERS = ExileKey.ofId(this, "affix_number_reroll", x -> new RerollAffixNumbersItemMod(x.GUID())); + public ExileKey REROLL_AFFIX_NUMBERS = ExileKey.ofId(this, "affix_number_reroll", x -> new RerollAffixNumbersItemMod(x.GUID(), RerollAffixNumbersItemMod.AffixFinder.AFFIX)); + public ExileKey REROLL_PREFIX_NUMBERS = ExileKey.ofId(this, "prefix_number_reroll", x -> new RerollAffixNumbersItemMod(x.GUID(), RerollAffixNumbersItemMod.AffixFinder.PREFIX)); + public ExileKey REROLL_SUFFIX_NUMBERS = ExileKey.ofId(this, "suffix_number_reroll", x -> new RerollAffixNumbersItemMod(x.GUID(), RerollAffixNumbersItemMod.AffixFinder.SUFFIX)); public ExileKey REROLL_IMPLICIT_NUMBERS = ExileKey.ofId(this, "implicit_number_reroll", x -> new RerollImplicitNumbersItemMod(x.GUID())); + public ExileKey REROLL_IMPLICIT_AFFIX = ExileKey.ofId(this, "implicit_affix_reroll", x -> new RerollImplicitAffixItemMod(x.GUID())); + public ExileKey REROLL_BASE_NUMBERS = ExileKey.ofId(this, "base_number_reroll", x -> new RerollBaseNumbersItemMod(x.GUID())); public ExileKey EXTRACT_GEM = ExileKey.ofId(this, "extract_gem", x -> new ExtractSocketItemMod(x.GUID(), ExtractSocketItemMod.SocketedType.GEM)); public ExileKey EXTRACT_RUNE = ExileKey.ofId(this, "extract_rune", x -> new ExtractSocketItemMod(x.GUID(), ExtractSocketItemMod.SocketedType.RUNE)); public ExileKey MIRROR = ExileKey.ofId(this, "mirror", x -> new MirrorItemMod(x.GUID())); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/all/UpgradeCorruptionAffixMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/all/UpgradeCorruptionAffixMod.java index 842b58c62..d37804ac7 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/all/UpgradeCorruptionAffixMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/all/UpgradeCorruptionAffixMod.java @@ -33,12 +33,12 @@ public void applyINTERNAL(StackHolder stack, ItemModificationResult r) { ExileStack ex = ExileStack.of(stack.stack); ex.get(StackKeys.GEAR).editIfHas(gear -> { - data.finder().getAffix(gear.affixes.cor, data).ifPresent(affix -> { + data.finder().getAffixes(gear.affixes.cor, data).forEach(affix -> { affix.upgradeRarity(); }); }); ex.get(StackKeys.JEWEL).editIfHas(jewel -> { - data.finder().getAffix(jewel.cor, data).ifPresent(affix -> { + data.finder().getAffixes(jewel.cor, data).forEach(affix -> { affix.upgradeRarity(); }); }); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/CommonToRunedItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/CommonToRunedItemMod.java new file mode 100644 index 000000000..e07b6fa24 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/CommonToRunedItemMod.java @@ -0,0 +1,66 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.GearModification; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.database.data.rarities.GearRarity; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.mine_and_slash.uncommon.interfaces.data_items.IRarity; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; +import net.minecraft.network.chat.MutableComponent; + +public class CommonToRunedItemMod extends GearModification { + public CommonToRunedItemMod(String id) { + super(ItemModificationSers.COMMON_TO_RUNED, id); + } + + @Override + public void modifyGear(ExileStack stack, ItemModificationResult r) { + stack.get(StackKeys.GEAR).edit(gear -> { + GearRarity oldRarity = gear.getRarity(); + gear.rar = IRarity.RUNEWORD_ID; + GearRarity newRarity = gear.getRarity(); + + // Remove affixes + gear.affixes.pre.clear(); + gear.affixes.suf.clear(); + + // Rescale base stats to upgraded roll range + gear.baseStats.p = UpgradeRarityItemMod.uniformRescaleInt(gear.baseStats.p, oldRarity.base_stat_percents, newRarity.base_stat_percents); + + // Add rune sockets + int sockets = newRarity.sockets.random(); + + for (int index = gear.sockets.getTotalSockets(); index < sockets; index++) { + gear.sockets.addSocket(); + } + }); + } + + @Override + public OutcomeType getOutcomeType() { + return OutcomeType.GOOD; + } + + @Override + public Class getClassForSerialization() { + return CommonToRunedItemMod.class; + } + + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Turns Common Item into Runed Item, adding sockets")); + } + +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/DowngradeAffixItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/DowngradeAffixItemMod.java index 37657d5dd..f3bc6b3be 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/DowngradeAffixItemMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/DowngradeAffixItemMod.java @@ -27,7 +27,7 @@ public DowngradeAffixItemMod(String id, Data data) { @Override public void modifyGear(ExileStack stack, ItemModificationResult r) { stack.get(StackKeys.GEAR).edit(gear -> { - data.finder_data.finder().getAffix(gear.affixes.getPrefixesAndSuffixes(), data.finder_data).ifPresent(affix -> { + data.finder_data.finder().getAffixes(gear.affixes.getPrefixesAndSuffixes(), data.finder_data).forEach(affix -> { affix.downgradeRarity(); }); }); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixItemMod.java index ce6d46ed9..823e4a665 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixItemMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixItemMod.java @@ -9,7 +9,6 @@ import com.robertx22.mine_and_slash.itemstack.ExileStack; import com.robertx22.mine_and_slash.itemstack.StackKeys; import com.robertx22.mine_and_slash.mmorpg.SlashRef; -import com.robertx22.mine_and_slash.saveclasses.gearitem.gear_parts.AffixData; import com.robertx22.mine_and_slash.uncommon.localization.Words; import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; import net.minecraft.network.chat.MutableComponent; @@ -35,17 +34,14 @@ public RerollAffixItemMod(String id, Data data, String rarname) { @Override public void modifyGear(ExileStack stack, ItemModificationResult r) { stack.get(StackKeys.GEAR).edit(gear -> { - var opt = data.finder_data.finder().getAffix(gear.affixes.getPrefixesAndSuffixes(), data.finder_data); - - if (opt.isPresent()) { - AffixData affixData = opt.get(); - affixData.RerollFully(gear); + data.finder_data.finder().getAffixes(gear.affixes.getPrefixesAndSuffixes(), data.finder_data).forEach(affix -> { + affix.RerollFully(gear); if (ExileDB.GearRarities().isRegistered(data.result_rar)) { - affixData.rar = data.result_rar; - affixData.RerollNumbers(); + affix.rar = data.result_rar; + affix.RerollNumbers(); } - } + }); }); } diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixNumbersItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixNumbersItemMod.java index a823252dc..124ea351f 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixNumbersItemMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollAffixNumbersItemMod.java @@ -1,5 +1,7 @@ package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; +import java.util.List; + import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.GearModification; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; import com.robertx22.library_of_exile.localization.ExileTranslation; @@ -9,22 +11,61 @@ import com.robertx22.mine_and_slash.itemstack.StackKeys; import com.robertx22.mine_and_slash.mmorpg.SlashRef; import com.robertx22.mine_and_slash.saveclasses.gearitem.gear_parts.AffixData; +import com.robertx22.mine_and_slash.uncommon.localization.Words; import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; import net.minecraft.network.chat.MutableComponent; public class RerollAffixNumbersItemMod extends GearModification { + public enum AffixFinder { + AFFIX(Words.AFFIX) { + @Override + public List getAffixes(List affixes) { + return affixes; + } + }, + PREFIX(Words.PREFIX) { + @Override + public List getAffixes(List affixes) { + return affixes.stream().filter(x -> x.ty.isPrefix()).toList(); + } + }, + SUFFIX(Words.SUFFIX) { + @Override + public List getAffixes(List affixes) { + return affixes.stream().filter(x -> x.ty.isSuffix()).toList(); + } + }; + + AffixFinder(Words word) { + this.word = word; + } + + private Words word; + + protected Words getWordINTERNAL() { + return word; + } + public MutableComponent getTooltip() { + return word.locName(); + } - public RerollAffixNumbersItemMod(String id) { + public abstract List getAffixes(List affixes); + } + + public AffixFinder data; + + public RerollAffixNumbersItemMod(String id, AffixFinder data) { super(ItemModificationSers.REROLL_AFFIX_NUMBERS, id); + this.data = data; } @Override public void modifyGear(ExileStack stack, ItemModificationResult r) { stack.get(StackKeys.GEAR).edit(gear -> { - for (AffixData affix : gear.affixes.getPrefixesAndSuffixes()) { + getData().getAffixes(gear.affixes.getPrefixesAndSuffixes()).forEach(affix -> { affix.RerollNumbers(); - } + }); }); } @@ -36,7 +77,7 @@ public OutcomeType getOutcomeType() { @Override public MutableComponent getDescWithParams() { - return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(getData().getTooltip()); } @@ -48,6 +89,12 @@ public Class getClassForSerialization() { @Override public TranslationBuilder createTranslationBuilder() { return TranslationBuilder.of(SlashRef.MODID) - .desc(ExileTranslation.registry(this, "Re-rolls Affix Numbers")); + .desc(ExileTranslation.registry(this, "Re-rolls %1$s Numbers")); + } + + protected AffixFinder getData() + { + // Legacy support + return data != null ? data : AffixFinder.AFFIX; } } diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollBaseNumbersItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollBaseNumbersItemMod.java new file mode 100644 index 000000000..cd802eaa2 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollBaseNumbersItemMod.java @@ -0,0 +1,48 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.GearModification; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; +import net.minecraft.network.chat.MutableComponent; + +public class RerollBaseNumbersItemMod extends GearModification { + public RerollBaseNumbersItemMod(String id) { + super(ItemModificationSers.REROLL_BASE_NUMBERS, id); + } + + @Override + public void modifyGear(ExileStack stack, ItemModificationResult r) { + stack.get(StackKeys.GEAR).edit(gear -> { + gear.baseStats.RerollFully(gear); + }); + } + + @Override + public OutcomeType getOutcomeType() { + return OutcomeType.GOOD; + } + + @Override + public Class getClassForSerialization() { + return RerollBaseNumbersItemMod.class; + } + + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Re-rolls Base Numbers")); + } + +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollImplicitAffixItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollImplicitAffixItemMod.java new file mode 100644 index 000000000..29f2a5f52 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/RerollImplicitAffixItemMod.java @@ -0,0 +1,63 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.GearModification; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.database.data.affixes.Affix; +import com.robertx22.mine_and_slash.database.data.requirements.bases.GearRequestedFor; +import com.robertx22.mine_and_slash.database.registry.ExileDB; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; +import net.minecraft.network.chat.MutableComponent; + +public class RerollImplicitAffixItemMod extends GearModification { + + + public RerollImplicitAffixItemMod(String id) { + super(ItemModificationSers.REROLL_IMPLICIT_AFFIX, id); + } + + @Override + public void modifyGear(ExileStack stack, ItemModificationResult r) { + stack.get(StackKeys.GEAR).edit(gear -> { + // Don't roll the same implicit we already have + var opt = ExileDB.Affixes().getFilterWrapped(x -> + x.GUID() != gear.imp.imp && + x.type == Affix.AffixSlot.implicit && + x.meetsRequirements(new GearRequestedFor(gear))); + + if (!opt.list.isEmpty()) { + gear.imp.imp = opt.random().GUID(); + } + + gear.imp.RerollNumbers(gear); + }); + } + + + @Override + public OutcomeType getOutcomeType() { + return OutcomeType.GOOD; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + + @Override + public Class getClassForSerialization() { + return RerollImplicitAffixItemMod.class; + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Re-rolls Implicit Affix")); + } +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/SetAffixRarityItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/SetAffixRarityItemMod.java index aa2b6c830..e530931d7 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/SetAffixRarityItemMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/SetAffixRarityItemMod.java @@ -28,7 +28,7 @@ public SetAffixRarityItemMod(String id, Data data) { @Override public void modifyGear(ExileStack stack, ItemModificationResult r) { stack.get(StackKeys.GEAR).edit(gear -> { - data.finder_data.finder().getAffix(gear.affixes.getPrefixesAndSuffixes(), data.finder_data).ifPresent(affix -> { + data.finder_data.finder().getAffixes(gear.affixes.getPrefixesAndSuffixes(), data.finder_data).forEach(affix -> { affix.rar = data.rar; affix.RerollNumbers(); }); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeAffixItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeAffixItemMod.java index 82ad1e59f..50a417fc0 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeAffixItemMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeAffixItemMod.java @@ -27,8 +27,8 @@ public class UpgradeAffixItemMod extends GearModification { public enum AffixFinder { SPECIFIC_RARITY(Words.SPECIFIC_RARITY_AFFIX) { @Override - public Optional getAffix(List affixes, AffixFinderData data) { - return affixes.stream().filter(x -> x.rar.equals(data.target_rar)).findAny(); + public List getAffixes(List affixes, AffixFinderData data) { + return optionalToList(affixes.stream().filter(x -> x.rar.equals(data.target_rar)).findAny()); } @Override @@ -38,17 +38,39 @@ public MutableComponent getTooltip(AffixFinderData data) { }, RANDOM_AFFIX(Words.RANDOM_AFFIX) { @Override - public Optional getAffix(List affixes, AffixFinderData data) { - return Optional.of(RandomUtils.randomFromList(affixes)); + public List getAffixes(List affixes, AffixFinderData data) { + return List.of(RandomUtils.randomFromList(affixes)); } }, LOWEST_RARITY_AFFIX(Words.LOWEST_RARITY_AFFIX) { @Override - public Optional getAffix(List affixes, AffixFinderData data) { - return affixes.stream().min(Comparator.comparingInt(x -> x.getRarity().item_tier)); + public List getAffixes(List affixes, AffixFinderData data) { + return optionalToList(affixes.stream().min(Comparator.comparingInt(x -> x.getRarity().item_tier))); + } + }, + ALL_AFFIXES(Words.ALL_AFFIXES) { + @Override + public List getAffixes(List affixes, AffixFinderData data) { + return affixes; + } + }, + ALL_PREFIXES(Words.ALL_PREFIXES) { + @Override + public List getAffixes(List affixes, AffixFinderData data) { + return affixes.stream().filter(x -> x.ty.isPrefix()).toList(); + } + }, + ALL_SUFFIXES(Words.ALL_SUFFIXES) { + @Override + public List getAffixes(List affixes, AffixFinderData data) { + return affixes.stream().filter(x -> x.ty.isSuffix()).toList(); } }; + private static List optionalToList(Optional optional) { + return optional.isPresent() ? List.of(optional.get()) : List.of(); + } + public AffixFinderData get() { return new AffixFinderData(this, ""); } @@ -71,7 +93,8 @@ public MutableComponent getTooltip(AffixFinderData data) { return word.locName(); } - public abstract Optional getAffix(List affixes, AffixFinderData data); + public abstract List getAffixes(List affixes, AffixFinderData data); + } @@ -90,7 +113,7 @@ public UpgradeAffixItemMod(String id, AffixFinderData data) { @Override public void modifyGear(ExileStack stack, ItemModificationResult r) { stack.get(StackKeys.GEAR).edit(gear -> { - data.finder.getAffix(gear.affixes.getPrefixesAndSuffixes(), data).ifPresent(affix -> { + data.finder.getAffixes(gear.affixes.getPrefixesAndSuffixes(), data).forEach(affix -> { affix.upgradeRarity(); }); }); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeRarityItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeRarityItemMod.java new file mode 100644 index 000000000..40d308674 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/UpgradeRarityItemMod.java @@ -0,0 +1,139 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.GearModification; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.database.data.MinMax; +import com.robertx22.mine_and_slash.database.data.rarities.GearRarity; +import com.robertx22.mine_and_slash.database.data.rarities.GearRarityType; +import com.robertx22.mine_and_slash.database.registry.ExileDB; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.mine_and_slash.saveclasses.gearitem.gear_parts.SocketData; +import com.robertx22.mine_and_slash.saveclasses.item_classes.GearItemData; +import com.robertx22.mine_and_slash.uncommon.localization.Words; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; +import net.minecraft.network.chat.MutableComponent; + +public class UpgradeRarityItemMod extends GearModification { + public static enum UpgradeType { + UPGRADE(Words.UPGRADE_RARITY, Words.AN_AFFIX) { + @Override + public GearRarity getNewRarity(GearItemData gear) { + return gear.getRarity().getHigherRarity(); + } + }, + + RANDOMIZE(Words.RANDOMIZE_RARITY, Words.AFFIXES) { + @Override + public GearRarity getNewRarity(GearItemData gear) { + GearRarity oldRarity = gear.getRarity(); + return ExileDB.GearRarities().getFilterWrapped(x -> { + if (x == oldRarity) { + return false; + } + if (gear.lvl < x.min_lvl) { + return false; + } + if (x.type != GearRarityType.NORMAL) { + return false; + } + return true; + }).random(); + } + }; + + public Words action; + public Words affixPlural; + + UpgradeType(Words action, Words affixPlural) { + this.action = action; + this.affixPlural = affixPlural; + } + + public abstract GearRarity getNewRarity(GearItemData gear); + } + + public UpgradeType type; + + public UpgradeRarityItemMod(String id, UpgradeType type) { + super(ItemModificationSers.UPGRADE_GEAR_RARITY, id); + this.type = type; + } + + public static int uniformRescaleInt(int x, MinMax from, MinMax to) { + return Math.min(to.min + (x - from.min) * (to.max - to.min + 1) / (from.max - from.min), to.max); + } + + @Override + public void modifyGear(ExileStack stack, ItemModificationResult r) { + stack.get(StackKeys.GEAR).edit(gear -> { + GearRarity oldRarity = gear.getRarity(); + GearRarity newRarity = type.getNewRarity(gear); + gear.rar = newRarity.GUID(); + + // Rescale affix values to upgraded roll range + MinMax oldRange = oldRarity.stat_percents; + MinMax newRange = newRarity.stat_percents; + + gear.affixes.getPrefixesAndSuffixes().forEach(affix -> { + if (affix.p < oldRange.max) { + affix.p = uniformRescaleInt(affix.p, new MinMax(0, oldRange.max), new MinMax(0, newRange.max)); + } else { + // The affix was already at or above the top of the range, just make sure it stays there + affix.p = Math.max(affix.p, newRange.max); + } + + while (affix.p > affix.getRarity().stat_percents.max) { + // New affix value requires rarity upgrade + affix.rar = affix.getRarity().getHigherRarity().GUID(); + } + }); + + // Rescale base stats to upgraded roll range + gear.baseStats.p = uniformRescaleInt(gear.baseStats.p, oldRarity.base_stat_percents, newRarity.base_stat_percents); + + // Add new affix + for (int affixesToAdd = newRarity.getAffixAmount() - gear.affixes.getNumberOfAffixes(); affixesToAdd > 0; affixesToAdd--) { + gear.affixes.addOneRandomAffix(gear); + } + + // Pop out runes/gems and remove sockets if needed + for (int index = gear.sockets.getSocketedGemsCount() - 1; index >= newRarity.sockets.max; index--) { + SocketData socket = gear.sockets.getSocketed().get(index); + r.extraItemsCreated.add(socket.getOriginalItemStack()); + gear.sockets.getSocketed().remove(index); + } + + for (int index = gear.sockets.getTotalSockets() - 1; index >= newRarity.sockets.max; index--) { + gear.sockets.removeSocket(); + } + }); + } + + @Override + public OutcomeType getOutcomeType() { + return OutcomeType.GOOD; + } + + @Override + public Class getClassForSerialization() { + return UpgradeRarityItemMod.class; + } + + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(type.action.locName(), type.affixPlural.locName()); + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "%1$s, increasing Numbers and adding %2$s")); + } + +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/jewel/UpgradeJewelAffixRarityMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/jewel/UpgradeJewelAffixRarityMod.java index fcd9f9af3..56267631d 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/jewel/UpgradeJewelAffixRarityMod.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/jewel/UpgradeJewelAffixRarityMod.java @@ -25,7 +25,7 @@ public UpgradeJewelAffixRarityMod(String id, UpgradeAffixItemMod.AffixFinderData @Override public void modifyJewel(ExileStack stack) { stack.get(StackKeys.JEWEL).edit(x -> { - data.finder().getAffix(x.affixes, data).ifPresent(affix -> { + data.finder().getAffixes(x.affixes, data).forEach(affix -> { affix.upgradeRarity(); }); }); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java index 79a23832d..329f2b655 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java @@ -6,7 +6,10 @@ public class ItemReqSers { public static String MAX_USES = "max_uses"; public static String IS_RARITY = "is_rarity"; public static String HAS_AFFIXES = "has_affixes"; + public static String HAS_PREFIXES = "has_prefixes"; + public static String HAS_SUFFIXES = "has_suffixes"; public static String HAS_IMPLICIT = "has_implicit"; + public static String HAS_OTHER_IMPLICIT = "has_other_implicit"; public static String HAS_CORRUPTION_AFFIXES = "has_corrupt_affixes"; public static String IS_NOT_CORRUPTED = "is_not_corrupted"; public static String IS_NOT_MIRRORED = "is_not_mirrored"; @@ -14,6 +17,7 @@ public class ItemReqSers { public static String CAN_ADD_SOCKETS = "can_add_sockets"; public static String IS_UNDER_QUALITY = "is_under_quality"; public static String MAP_HAS_HIGHER_RAR = "map_has_higher_rar"; + public static String HAS_HIGHER_RAR = "has_higher_rar"; public static String HAS_RARITY_AFFIX = "has_affix_of_rar"; public static String NOT_CRAFTED_GEAR = "not_crafted_gear"; public static String JEWEL_HAS_AFFIXES = "jewel_has_affixes"; diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java index b805a0564..28924b092 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java @@ -71,7 +71,10 @@ public static List allMaxUses() { public ExileKey LEVEL_NOT_MAX = ExileKey.ofId(this, "lvl_not_max", x -> new LevelNotMaxReq(x.GUID())); public ExileKey HAS_AFFIXES = ExileKey.ofId(this, "has_affixes", x -> new MustHaveAffixesReq(x.GUID())); + public ExileKey HAS_PREFIXES = ExileKey.ofId(this, "has_prefixes", x -> new MustHavePrefixesReq(x.GUID())); + public ExileKey HAS_SUFFIXES = ExileKey.ofId(this, "has_suffixes", x -> new MustHaveSuffixesReq(x.GUID())); public ExileKey HAS_IMPLICIT = ExileKey.ofId(this, "has_implicit", x -> new MustHaveImplicitReq(x.GUID())); + public ExileKey HAS_OTHER_IMPLICIT = ExileKey.ofId(this, "has_other_implicit", x -> new MustHaveOtherPossibleImplicitReq(x.GUID())); public ExileKey HAS_CORRUPTION_AFFIXES = ExileKey.ofId(this, "has_corrupt_affixes", x -> new HasCorruptAffixes(x.GUID())); public ExileKey IS_NOT_CORRUPTED = ExileKey.ofId(this, "is_not_corrupted", x -> new IsNotCorruptedReq(x.GUID())); public ExileKey IS_NOT_MIRRORED = ExileKey.ofId(this, "is_not_mirrored", x -> new IsNotMirroredReq(x.GUID())); @@ -82,6 +85,7 @@ public static List allMaxUses() { public ExileKey NOT_CRAFTED = ExileKey.ofId(this, "not_crafted_gear", x -> new IsGearNotCraftedReq(x.GUID())); public ExileKey HAS_GEM_SOCKETED = ExileKey.ofId(this, "has_socketed_gem", x -> new HasSocketedReq(x.GUID(), ExtractSocketItemMod.SocketedType.GEM)); public ExileKey HAS_RUNE_SOCKETED = ExileKey.ofId(this, "has_socketed_rune", x -> new HasSocketedReq(x.GUID(), ExtractSocketItemMod.SocketedType.RUNE)); + public ExileKey HAS_HIGHER_RARITY = ExileKey.ofId(this, "has_higher_rar", x -> new HasHigherRarityReq(x.GUID())); // maps diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/HasHigherRarityReq.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/HasHigherRarityReq.java new file mode 100644 index 000000000..fb2a1f164 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/HasHigherRarityReq.java @@ -0,0 +1,45 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.GearRequirement; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.ItemReqSers; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.MapRequirement; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.database.data.rarities.GearRarity; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; + +public class HasHigherRarityReq extends GearRequirement { + + public HasHigherRarityReq(String id) { + super(ItemReqSers.HAS_HIGHER_RAR, id); + } + + @Override + public Class getClassForSerialization() { + return HasHigherRarityReq.class; + } + + @Override + public MutableComponent getDescWithParams() { + return getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + @Override + public boolean isGearValid(ItemStack stack) { + var data = ExileStack.of(stack).get(StackKeys.GEAR).get(); + return data.getRarity().hasHigherRarity() && data.lvl >= data.getRarity().getHigherRarity().min_lvl; + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Must be below maximum Rarity") + ); + } + +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveOtherPossibleImplicitReq.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveOtherPossibleImplicitReq.java new file mode 100644 index 000000000..0a709e666 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveOtherPossibleImplicitReq.java @@ -0,0 +1,54 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.GearRequirement; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.ItemReqSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.database.data.affixes.Affix; +import com.robertx22.mine_and_slash.database.data.requirements.bases.GearRequestedFor; +import com.robertx22.mine_and_slash.database.registry.ExileDB; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.mine_and_slash.saveclasses.gearitem.gear_parts.ImplicitStatsData; + +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; + +public class MustHaveOtherPossibleImplicitReq extends GearRequirement { + + public MustHaveOtherPossibleImplicitReq(String id) { + super(ItemReqSers.HAS_IMPLICIT, id); + } + + @Override + public Class getClassForSerialization() { + return MustHaveOtherPossibleImplicitReq.class; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Must have another possible implicit") + ); + } + + @Override + public boolean isGearValid(ItemStack stack) { + ExileStack ex = ExileStack.of(stack); + + var gear = ex.get(StackKeys.GEAR).get(); + + return gear.imp != null && !ExileDB.Affixes().getFilterWrapped(x -> + x.GUID() != gear.imp.imp && + x.type == Affix.AffixSlot.implicit && + x.meetsRequirements(new GearRequestedFor(gear))).list.isEmpty(); + } +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHavePrefixesReq.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHavePrefixesReq.java new file mode 100644 index 000000000..3264e7755 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHavePrefixesReq.java @@ -0,0 +1,45 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.GearRequirement; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.ItemReqSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; + +public class MustHavePrefixesReq extends GearRequirement { + + public MustHavePrefixesReq(String id) { + super(ItemReqSers.HAS_PREFIXES, id); + } + + @Override + public Class getClassForSerialization() { + return MustHavePrefixesReq.class; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Must have prefixes") + ); + } + + @Override + public boolean isGearValid(ItemStack stack) { + ExileStack ex = ExileStack.of(stack); + + var gear = ex.get(StackKeys.GEAR).get(); + return gear.affixes != null && gear.affixes.getNumberOfPrefixes() > 0; + } +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveSuffixesReq.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveSuffixesReq.java new file mode 100644 index 000000000..67f660c6f --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/gear/MustHaveSuffixesReq.java @@ -0,0 +1,45 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.GearRequirement; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.ItemReqSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; + +public class MustHaveSuffixesReq extends GearRequirement { + + public MustHaveSuffixesReq(String id) { + super(ItemReqSers.HAS_SUFFIXES, id); + } + + @Override + public Class getClassForSerialization() { + return MustHaveSuffixesReq.class; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Must have suffixes") + ); + } + + @Override + public boolean isGearValid(ItemStack stack) { + ExileStack ex = ExileStack.of(stack); + + var gear = ex.get(StackKeys.GEAR).get(); + return gear.affixes != null && gear.affixes.getNumberOfSuffixes() > 0; + } +} diff --git a/src/main/java/com/robertx22/mine_and_slash/saveclasses/gearitem/gear_parts/GearSocketsData.java b/src/main/java/com/robertx22/mine_and_slash/saveclasses/gearitem/gear_parts/GearSocketsData.java index 60859a544..1e65902a0 100644 --- a/src/main/java/com/robertx22/mine_and_slash/saveclasses/gearitem/gear_parts/GearSocketsData.java +++ b/src/main/java/com/robertx22/mine_and_slash/saveclasses/gearitem/gear_parts/GearSocketsData.java @@ -81,6 +81,10 @@ public void addSocket() { sl++; } + public void removeSocket() { + sl--; + } + public void removeRune() { so.removeIf(x -> x.isRune()); } diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java index fc04f9471..bf7556cac 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java @@ -69,8 +69,13 @@ public enum Words implements IAutoLocName { RANDOM_AFFIX("Random Affix"), RANDOM_RARITY("Random Rarity"), AFFIX("Affix"), + PREFIX("Prefix"), + SUFFIX("Suffix"), SPECIFIC_RARITY_AFFIX("%1$s Affix"), LOWEST_RARITY_AFFIX("Lowest Rarity Affix"), + ALL_AFFIXES("All Affixes"), + ALL_PREFIXES("All Prefixes"), + ALL_SUFFIXES("All Suffixes"), PRIMARY_TIER_MAT("Primary Tier/Level Material"), PRIMARY_RARITY_MAT("Primary Rarity Material"), @@ -230,6 +235,10 @@ public enum Words implements IAutoLocName { DestroysItem("DESTROYS the Item"), UpgradesUniqueStats("Adds 10% to unique stats"), + UPGRADE_RARITY("Upgrades Item Rarity"), + RANDOMIZE_RARITY("Upgrades Item to a Random Rarity"), + AN_AFFIX("an Affix"), + Soul("Soul"), GEAR_SOUL("Gear Soul"), GEAR_SOUL_DESC("Souls are one way of adding Mine and Slash stats to Gear."), diff --git a/src/main/resources/assets/mmorpg/lang/en_us.json b/src/main/resources/assets/mmorpg/lang/en_us.json index 4658ffce0..bfce23d38 100644 --- a/src/main/resources/assets/mmorpg/lang/en_us.json +++ b/src/main/resources/assets/mmorpg/lang/en_us.json @@ -549,7 +549,13 @@ "_comment": " [CATEGORY]: CURRENCY ITEMS - NAMES", "item.mmorpg.currency.affix_common_reroll": "Orb of New Beginnings", + "item.mmorpg.currency.affix_reroll_all": "Orb of Rebirth", + "item.mmorpg.currency.prefix_reroll_all": "Orb of Sinistral Rebirth", + "item.mmorpg.currency.suffix_reroll_all": "Orb of Dextral Rebirth", "item.mmorpg.currency.affix_number_reroll": "Orb of Ciphers", + "item.mmorpg.currency.prefix_number_reroll": "Orb of Western Ciphers", + "item.mmorpg.currency.suffix_number_reroll": "Orb of Eastern Ciphers", + "item.mmorpg.currency.base_number_reroll": "Orb of Introspection", "item.mmorpg.currency.affix_random_mythic_reroll": "Orb of Divine Benevolence", "item.mmorpg.currency.affix_tier_up_down": "Orb of Imbalance", "item.mmorpg.currency.chaos_orb": "Orb of Chaos", @@ -570,11 +576,15 @@ "item.mmorpg.currency.harvest_essence_3": "Harvested Angelic Essence", "item.mmorpg.currency.harvest_essence_4": "Harvested Divine Essence", "item.mmorpg.currency.implicit_number_reroll": "Orb of Genesis", + "item.mmorpg.currency.implicit_affix_reroll": "Orb of Revelation", "item.mmorpg.currency.jewel_corrupt": "Orb of Mesmerizing Chaos", "item.mmorpg.currency.jewel_sure_upgrade": "Orb of Mystery", "item.mmorpg.currency.jewel_upgrade_affix": "Orb of Glimmering Light", "item.mmorpg.currency.level_up_orb": "Orb of Infinity", "item.mmorpg.currency.map_rarity_upgrade": "Orb of Map Rarity", + "item.mmorpg.currency.gear_rarity_upgrade": "Orb of Ascension", + "item.mmorpg.currency.gear_rarity_random": "Orb of Colors", + "item.mmorpg.currency.common_to_runed": "Orb of Runic Invocation", "item.mmorpg.currency.orb_of_quality": "Orb of Quality", "item.mmorpg.currency.orb_of_relief": "Orb of Relief", "item.mmorpg.currency.sharpening_stone_0": "Spiritual Sharpening Stone", @@ -2563,6 +2573,8 @@ "mmorpg.word.addpotential": "Add Potential", "mmorpg.word.addsocket": "Adds a socket", "mmorpg.word.affix": "Affix", + "mmorpg.word.prefix": "Prefix", + "mmorpg.word.suffix": "Suffix", "mmorpg.word.affix_types": "Affix Types", "mmorpg.word.affixes": "Affixes", "mmorpg.word.affixes_affecting_all": "All", @@ -2706,6 +2718,9 @@ "mmorpg.word.loot_modifier": "Loot Modifier", "mmorpg.word.loot_modifiers_info": "Modifiers:", "mmorpg.word.lowest_rarity_affix": "Lowest Rarity Affix", + "mmorpg.word.all_affixes": "All Affixes", + "mmorpg.word.all_prefixes": "All Prefixes", + "mmorpg.word.all_suffixes": "All Suffixes", "mmorpg.word.lvl_exponent_mob_dmg": "Leveled Exponent Mob DMG", "mmorpg.word.major": "Major", "mmorpg.word.mana_cost": "Mana Cost: %1$s", @@ -2836,6 +2851,9 @@ "mmorpg.word.upgradeinfusion": "Upgrades the Infusion", "mmorpg.word.upgradequality": "Upgrade Quality", "mmorpg.word.upgradesuniquestats": "Adds 10% to unique stats", + "mmorpg.word.upgrade_rarity": "Upgrades Item Rarity", + "mmorpg.word.randomize_rarity": "Upgrades Item to a Random Rarity", + "mmorpg.word.an_affix": "an Affix", "mmorpg.word.usable_on": "Usable On:", "mmorpg.word.usableon": "Usable On: ", "mmorpg.word.usablevalueinfo": "Usable Value of the stat. This is used for stuff like Armor to turn it into % damage reduction. \nthe higher level your target, the more value you need to protect against it.", @@ -3501,7 +3519,10 @@ "library_of_exile.item_modification.add_gear_quality": "Add %1$s Quality", "library_of_exile.item_modification.add_potential": "Add %1$s Potential", "library_of_exile.item_modification.add_socket": "Adds %1$s Socket", - "library_of_exile.item_modification.affix_number_reroll": "Re-rolls Affix Numbers", + "library_of_exile.item_modification.affix_number_reroll": "Re-rolls %1$s Numbers", + "library_of_exile.item_modification.prefix_number_reroll": "Re-rolls %1$s Numbers", + "library_of_exile.item_modification.suffix_number_reroll": "Re-rolls %1$s Numbers", + "library_of_exile.item_modification.base_number_reroll": "Re-rolls Base Numbers", "library_of_exile.item_modification.corrupt_gear": "Corrupts the Item, making it unmodifiable and adds a Random amount of Corruption Affixes", "library_of_exile.item_modification.corrupt_gear_no_affix": "Corrupts the Item, making it unmodifiable", "library_of_exile.item_modification.mirror": "Creates an unmodifiable Mirrored copy of the Item", @@ -3512,6 +3533,7 @@ "library_of_exile.item_modification.force_soul_tag_dodge_stat": "Forces Soul to Produce %1$s", "library_of_exile.item_modification.force_soul_tag_magic_shield_stat": "Forces Soul to Produce %1$s", "library_of_exile.item_modification.implicit_number_reroll": "Re-rolls Implicit Numbers", + "library_of_exile.item_modification.implicit_affix_reroll": "Re-rolls Implicit Affix", "library_of_exile.item_modification.increment_uses_level_up": "Increments Uses", "library_of_exile.item_modification.increment_uses_random_mythic_affix": "Increments Uses", "library_of_exile.item_modification.increment_uses_relief": "Increments Uses", @@ -3519,10 +3541,16 @@ "library_of_exile.item_modification.increment_uses_sure_jewel_up": "Increments Uses", "library_of_exile.item_modification.jewel_corrupt": "Corrupts the Jewel", "library_of_exile.item_modification.map_rarity_upgrade": "Upgrades Map Rarity", + "library_of_exile.item_modification.gear_rarity_upgrade": "%1$s, increasing Numbers and adding %2$s", + "library_of_exile.item_modification.gear_rarity_random": "%1$s, increasing Numbers and adding %2$s", + "library_of_exile.item_modification.common_to_runed": "Turns Common Item into Runed Item, adding sockets", "library_of_exile.item_modification.reduce_5_perc_unique_stats": "Reduces %1$s Percent to Unique Stats", "library_of_exile.item_modification.reroll_infusion": "Re-rolls Infusion Affix", "library_of_exile.item_modification.reroll_lowest_affix": "Rerolls %1$s into a new %2$s", "library_of_exile.item_modification.reroll_random_affix": "Rerolls %1$s into a new %2$s", + "library_of_exile.item_modification.reroll_all_affixes": "Rerolls %1$s into new %2$ses", + "library_of_exile.item_modification.reroll_all_prefixes": "Rerolls %1$s into new %2$ses", + "library_of_exile.item_modification.reroll_all_suffixes": "Rerolls %1$s into new %2$ses", "library_of_exile.item_modification.reroll_random_affix_to_mythic": "Rerolls %1$s into a new %2$s", "library_of_exile.item_modification.set_lowest_affix_rar_common": "Upgrades %1$s to %2$s Rarity", "library_of_exile.item_modification.set_lowest_affix_rar_epic": "Upgrades %1$s to %2$s Rarity", @@ -3568,8 +3596,11 @@ "library_of_exile.item_requirement.has_affix_uncommon": "Must have %1$s Affix", "library_of_exile.item_requirement.has_affix_unique": "Must have %1$s Affix", "library_of_exile.item_requirement.has_affixes": "Must have affixes", + "library_of_exile.item_requirement.has_prefixes": "Must have prefixes", + "library_of_exile.item_requirement.has_suffixes": "Must have suffixes", "library_of_exile.item_requirement.has_corrupt_affixes": "Must have Corruption affixes", "library_of_exile.item_requirement.has_implicit": "Must have implicit", + "library_of_exile.item_requirement.has_other_implicit": "Must have another possible implicit", "library_of_exile.item_requirement.has_infusion": "Must have Infusion", "library_of_exile.item_requirement.has_socketed_gem": "Must have a Socketed %1$s", "library_of_exile.item_requirement.has_socketed_rune": "Must have a Socketed %1$s", @@ -3591,6 +3622,7 @@ "library_of_exile.item_requirement.jewel_has_affixes": "Jewel Has Affixes", "library_of_exile.item_requirement.lvl_not_max": "Level must be below %1$s", "library_of_exile.item_requirement.map_has_higher_rar": "Map Rarity Must be lower than Mythic", + "library_of_exile.item_requirement.has_higher_rar": "Must be below maximum Rarity", "library_of_exile.item_requirement.map_is_mythic": "Map Rarity Must be %1$s", "library_of_exile.item_requirement.max_uses_level_up": "Maximum %1$s uses", "library_of_exile.item_requirement.max_uses_random_mythic_affix": "Maximum %1$s uses", diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/affix_reroll_all.png b/src/main/resources/assets/mmorpg/textures/item/currency/affix_reroll_all.png new file mode 100644 index 000000000..2088cbf6d Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/affix_reroll_all.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/base_number_reroll.png b/src/main/resources/assets/mmorpg/textures/item/currency/base_number_reroll.png new file mode 100644 index 000000000..77fe6148b Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/base_number_reroll.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/common_to_runed.png b/src/main/resources/assets/mmorpg/textures/item/currency/common_to_runed.png new file mode 100644 index 000000000..e6ce09d43 Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/common_to_runed.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_random.png b/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_random.png new file mode 100644 index 000000000..bd42f2235 Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_random.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_upgrade.png b/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_upgrade.png new file mode 100644 index 000000000..349394911 Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/gear_rarity_upgrade.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/implicit_affix_reroll.png b/src/main/resources/assets/mmorpg/textures/item/currency/implicit_affix_reroll.png new file mode 100644 index 000000000..6dd6c0e59 Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/implicit_affix_reroll.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/prefix_number_reroll.png b/src/main/resources/assets/mmorpg/textures/item/currency/prefix_number_reroll.png new file mode 100644 index 000000000..d02349320 Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/prefix_number_reroll.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/prefix_reroll_all.png b/src/main/resources/assets/mmorpg/textures/item/currency/prefix_reroll_all.png new file mode 100644 index 000000000..f7ef3db3b Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/prefix_reroll_all.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/suffix_number_reroll.png b/src/main/resources/assets/mmorpg/textures/item/currency/suffix_number_reroll.png new file mode 100644 index 000000000..2e0d2fefc Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/suffix_number_reroll.png differ diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/suffix_reroll_all.png b/src/main/resources/assets/mmorpg/textures/item/currency/suffix_reroll_all.png new file mode 100644 index 000000000..1f9e4b7fa Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/suffix_reroll_all.png differ