public static List <MagicItemEffect> RollAugmentEffects(ExtendedItemData item, MagicItem magicItem, int effectIndex) { var results = new List <MagicItemEffect>(); var rarity = magicItem.Rarity; var currentEffect = magicItem.Effects[effectIndex]; results.Add(currentEffect); var valuelessEffect = MagicItemEffectDefinitions.IsValuelessEffect(currentEffect.EffectType, rarity); var availableEffects = MagicItemEffectDefinitions.GetAvailableEffects(item, magicItem, valuelessEffect ? -1 : effectIndex); for (var i = 0; i < 2 && i < availableEffects.Count; i++) { var newEffect = RollEffects(availableEffects, rarity, 1, false).FirstOrDefault(); if (newEffect == null) { EpicLoot.LogError($"Rolled a null effect: item:{item.m_shared.m_name}, index:{effectIndex}"); continue; } results.Add(newEffect); var newEffectIsValueless = MagicItemEffectDefinitions.IsValuelessEffect(newEffect.EffectType, rarity); if (newEffectIsValueless) { availableEffects.RemoveAll(x => x.Type == newEffect.EffectType); } } return(results); }
public static MagicItem RollMagicItem(ItemRarity rarity, ExtendedItemData baseItem, float luckFactor) { var cheatLegendary = !string.IsNullOrEmpty(CheatForceLegendary); if (cheatLegendary) { rarity = ItemRarity.Legendary; } var magicItem = new MagicItem { Rarity = rarity }; var effectCount = CheatEffectCount >= 1 ? CheatEffectCount : RollEffectCountPerRarity(magicItem.Rarity); if (rarity == ItemRarity.Legendary) { LegendaryInfo legendary = null; if (cheatLegendary) { UniqueLegendaryHelper.TryGetLegendaryInfo(CheatForceLegendary, out legendary); } if (legendary == null) { var roll = Random.Range(0.0f, 1.0f); var rollSetItem = roll < EpicLoot.SetItemDropChance.Value; Debug.LogWarning($"Rolling Legendary: set={rollSetItem} ({roll}/{EpicLoot.SetItemDropChance.Value})"); var availableLegendaries = UniqueLegendaryHelper.GetAvailableLegendaries(baseItem, magicItem, rollSetItem); Debug.LogWarning($"Available Legendaries: {string.Join(", ", availableLegendaries.Select(x => x.ID))}"); _weightedLegendaryTable.Setup(availableLegendaries, x => x.SelectionWeight); legendary = _weightedLegendaryTable.Roll(); } if (legendary.IsSetItem) { var setID = UniqueLegendaryHelper.GetSetForLegendaryItem(legendary); magicItem.SetID = setID; } if (!UniqueLegendaryHelper.IsGenericLegendary(legendary)) { magicItem.LegendaryID = legendary.ID; magicItem.DisplayName = legendary.Name; if (legendary.GuaranteedEffectCount > 0) { effectCount = legendary.GuaranteedEffectCount; } foreach (var guaranteedMagicEffect in legendary.GuaranteedMagicEffects) { var effectDef = MagicItemEffectDefinitions.Get(guaranteedMagicEffect.Type); if (effectDef == null) { EpicLoot.LogError($"Could not find magic effect (Type={guaranteedMagicEffect.Type}) while creating legendary item (ID={legendary.ID})"); continue; } var effect = RollEffect(effectDef, ItemRarity.Legendary, guaranteedMagicEffect.Values); magicItem.Effects.Add(effect); effectCount--; } } } for (var i = 0; i < effectCount; i++) { var availableEffects = MagicItemEffectDefinitions.GetAvailableEffects(baseItem, magicItem); if (availableEffects.Count == 0) { EpicLoot.LogWarning($"Tried to add more effects to magic item ({baseItem.m_shared.m_name}) but there were no more available effects. " + $"Current Effects: {(string.Join(", ", magicItem.Effects.Select(x => x.EffectType.ToString())))}"); break; } _weightedEffectTable.Setup(availableEffects, x => x.SelectionWeight); var effectDef = _weightedEffectTable.Roll(); var effect = RollEffect(effectDef, magicItem.Rarity); magicItem.Effects.Add(effect); } if (string.IsNullOrEmpty(magicItem.DisplayName)) { magicItem.DisplayName = MagicItemNames.GetNameForItem(baseItem, magicItem); } return(magicItem); }