public static void AddDebugMagicEffects(MagicItem item) { if (!string.IsNullOrEmpty(ForcedMagicEffect) && !item.HasEffect(ForcedMagicEffect)) { EpicLoot.Log($"AddDebugMagicEffect {ForcedMagicEffect}"); item.Effects.Add(RollEffect(MagicItemEffectDefinitions.Get(ForcedMagicEffect), item.Rarity)); } }
public static bool CanBeAugmented(this ItemDrop.ItemData itemData) { if (!itemData.IsMagic()) { return(false); } return(itemData.GetMagicItem().Effects.Select(effect => MagicItemEffectDefinitions.Get(effect.EffectType)).Any(effectDef => effectDef.CanBeAugmented)); }
public static void AddMagicEffectsPage(TextsDialog textsDialog, Player player) { var magicEffects = new Dictionary <string, List <KeyValuePair <MagicItemEffect, ItemDrop.ItemData> > >(); var allEquipment = player.GetEquipment(); foreach (var item in allEquipment) { if (item.IsMagic()) { foreach (var effect in item.GetMagicItem().Effects) { if (!magicEffects.TryGetValue(effect.EffectType, out var effectList)) { effectList = new List <KeyValuePair <MagicItemEffect, ItemDrop.ItemData> >(); magicEffects.Add(effect.EffectType, effectList); } effectList.Add(new KeyValuePair <MagicItemEffect, ItemDrop.ItemData>(effect, item)); } } } var t = new StringBuilder(); foreach (var entry in magicEffects) { var effectType = entry.Key; var effectDef = MagicItemEffectDefinitions.Get(effectType); var sum = entry.Value.Sum(x => x.Key.EffectValue); var totalEffectText = MagicItem.GetEffectText(effectDef, sum); var highestRarity = (ItemRarity)entry.Value.Max(x => (int)x.Value.GetRarity()); t.AppendLine($"<size=20><color={EpicLoot.GetRarityColor(highestRarity)}>{totalEffectText}</color></size>"); foreach (var entry2 in entry.Value) { var effect = entry2.Key; var item = entry2.Value; t.AppendLine($" <color=silver>- {MagicItem.GetEffectText(effect, item.GetRarity(), false)} ({item.GetDecoratedName()})</color>"); } t.AppendLine(); } textsDialog.m_texts.Insert(EpicLoot.HasAuga ? 0 : 2, new TextsDialog.TextInfo( Localization.instance.Localize($"{EpicLoot.GetMagicEffectPip(false)} $mod_epicloot_active_magic_effects"), Localization.instance.Localize(t.ToString()))); }
private static string GetEffectText(MagicItemEffect effect, ItemRarity rarity, bool showRange) { var effectDef = MagicItemEffectDefinitions.Get(effect.EffectType); var result = string.Format(effectDef.DisplayText, effect.EffectValue); var values = effectDef.GetValuesForRarity(rarity); if (showRange && values != null) { if (!Mathf.Approximately(values.MinValue, values.MaxValue)) { result += $" [{values.MinValue}-{values.MaxValue}]"; } } return(result); }
public string GetFirstEquipEffect(out FxAttachMode mode) { foreach (var effect in Effects) { var effectDef = MagicItemEffectDefinitions.Get(effect.EffectType); if (effectDef != null && !string.IsNullOrEmpty(effectDef.EquipFx)) { mode = effectDef.EquipFxMode; return(effectDef.EquipFx); } } mode = FxAttachMode.None; return(null); }
public static string GetEffectText(MagicItemEffect effect, ItemRarity rarity, bool showRange, string legendaryID, MagicItemEffectDefinition.ValueDef valuesOverride) { var effectDef = MagicItemEffectDefinitions.Get(effect.EffectType); var result = GetEffectText(effectDef, effect.EffectValue); var values = valuesOverride ?? (string.IsNullOrEmpty(legendaryID) ? effectDef.GetValuesForRarity(rarity) : UniqueLegendaryHelper.GetLegendaryEffectValues(legendaryID, effect.EffectType)); if (showRange && values != null) { if (!Mathf.Approximately(values.MinValue, values.MaxValue)) { result += $" [{values.MinValue}-{values.MaxValue}]"; } } return(result); }
public static string GetSetTooltip(this ItemDrop.ItemData item) { var text = new StringBuilder(); var setID = item.GetSetID(out var isMundane); var setSize = item.GetSetSize(); var setPieces = ItemDataExtensions.GetSetPieces(setID); var currentSetEquipped = Player.m_localPlayer.GetEquippedSetPieces(setID); var setDisplayName = GetSetDisplayName(item, isMundane); text.Append($"\n\n<color={EpicLoot.GetSetItemColor()}> $mod_epicloot_set: {setDisplayName} ({currentSetEquipped.Count}/{setSize}):</color>"); foreach (var setItemName in setPieces) { var isEquipped = IsSetItemEquipped(currentSetEquipped, setItemName, isMundane); var color = isEquipped ? "white" : "grey"; var displayName = GetSetItemDisplayName(setItemName, isMundane); text.Append($"\n <color={color}>{displayName}</color>"); } if (isMundane) { var setEffectColor = currentSetEquipped.Count == setSize?EpicLoot.GetSetItemColor() : "grey"; text.Append($"\n<color={setEffectColor}>({setSize}) ‣ {item.GetSetStatusEffectTooltip().Replace("\n", " ")}</color>"); } else { var setInfo = item.GetLegendarySetInfo(); foreach (var setBonusInfo in setInfo.SetBonuses.OrderBy(x => x.Count)) { var hasEquipped = currentSetEquipped.Count >= setBonusInfo.Count; var effectDef = MagicItemEffectDefinitions.Get(setBonusInfo.Effect.Type); if (effectDef == null) { EpicLoot.LogError($"Set Tooltip: Could not find effect ({setBonusInfo.Effect.Type}) for set ({setInfo.ID}) bonus ({setBonusInfo.Count})!"); continue; } var display = MagicItem.GetEffectText(effectDef, setBonusInfo.Effect.Values?.MinValue ?? 0); text.Append($"\n<color={(hasEquipped ? EpicLoot.GetSetItemColor() : "grey")}>({setBonusInfo.Count}) ‣ {display}</color>"); } } return(text.ToString()); }
public static object GetPrefix(MagicItem magicItem) { if (magicItem.Effects.Count == 0) { return(null); } var firstEffect = magicItem.Effects[0]; var effectDef = MagicItemEffectDefinitions.Get(firstEffect.EffectType); if (effectDef == null) { return(null); } var prefixes = effectDef.Prefixes ?? Config.Rare.GenericPrefixes; var randomPrefix = GetRandomStringFromList(prefixes); // Include trailing space return(string.IsNullOrEmpty(randomPrefix) ? null : $"{randomPrefix} "); }
public static object GetSuffix(MagicItem magicItem) { if (magicItem.Effects.Count < 2) { return(null); } var secondEffect = magicItem.Effects[1]; var effectDef = MagicItemEffectDefinitions.Get(secondEffect.EffectType); if (effectDef == null) { return(null); } var suffixes = effectDef.Suffixes ?? Config.Rare.GenericSuffixes; var randomSuffix = GetRandomStringFromList(suffixes); // Include " of " return(string.IsNullOrEmpty(randomSuffix) ? null : $" of {randomSuffix}"); }
private static MagicItemEffectDefinition GetReplacementEffectDef(MagicItemEffect effect) { switch (effect.EffectType) { case "AddFireResistance": return(MagicItemEffectDefinitions.Get(MagicEffectType.AddFireResistancePercentage)); case "AddFrostResistance": return(MagicItemEffectDefinitions.Get(MagicEffectType.AddFrostResistancePercentage)); case "AddLightningResistance": return(MagicItemEffectDefinitions.Get(MagicEffectType.AddLightningResistancePercentage)); case "AddPoisonResistance": return(MagicItemEffectDefinitions.Get(MagicEffectType.AddPoisonResistancePercentage)); case "AddSpiritResistance": return(MagicItemEffectDefinitions.Get(MagicEffectType.AddElementalResistancePercentage)); } return(null); }
public static object GetPrefix(MagicItem magicItem) { if (magicItem.Effects.Count == 0) { return(null); } var firstEffect = magicItem.Effects[0]; var effectDef = MagicItemEffectDefinitions.Get(firstEffect.EffectType); if (effectDef == null) { return(null); } var prefixes = effectDef.Prefixes ?? Config.Rare.GenericPrefixes; var randomPrefix = GetRandomStringFromList(prefixes); // Include trailing space var format = Localization.instance.Localize("$mod_epicloot_prefixformat"); return(string.IsNullOrEmpty(randomPrefix) ? null : string.Format(format, randomPrefix)); }
public static object GetSuffix(MagicItem magicItem) { if (magicItem.Effects.Count < 2) { return(null); } var secondEffect = magicItem.Effects[1]; var effectDef = MagicItemEffectDefinitions.Get(secondEffect.EffectType); if (effectDef == null) { return(null); } var suffixes = effectDef.Suffixes ?? Config.Rare.GenericSuffixes; var randomSuffix = GetRandomStringFromList(suffixes); // Include " of " var format = Localization.instance.Localize("$mod_epicloot_suffixformat"); return(string.IsNullOrEmpty(randomSuffix) ? null : string.Format(format, randomSuffix)); }
public static void SpawnMagicItemWithEffect(Console __instance, string[] args) { if (args.Length < 3) { EpicLoot.LogError("Specify effect and item name"); return; } if (Player.m_localPlayer == null) { return; } var effectArg = args[1]; var itemPrefabNameArg = args[2]; __instance.AddString($"magicitem - {itemPrefabNameArg} with effect: {effectArg}"); var magicItemEffectDef = MagicItemEffectDefinitions.Get(effectArg); if (magicItemEffectDef == null) { __instance.AddString($"> Could not find effect: {effectArg}"); return; } var itemPrefab = ObjectDB.instance.GetItemPrefab(itemPrefabNameArg); if (itemPrefab == null) { __instance.AddString($"> Could not find item: {itemPrefabNameArg}"); return; } var fromItemData = itemPrefab.GetComponent <ItemDrop>().m_itemData; if (!EpicLoot.CanBeMagicItem(fromItemData)) { __instance.AddString($"> Can't be magic item: {itemPrefabNameArg}"); return; } var effectRequirements = magicItemEffectDef.Requirements; var itemRarity = effectRequirements.AllowedRarities.Count == 0 ? ItemRarity.Legendary : effectRequirements.AllowedRarities.First(); var rarityTable = GetRarityTable(itemRarity.ToString()); var loot = new LootTable { Object = "Console", Drops = new[] { new[] { 1, 1 } }, Loot = new[] { new LootDrop { Item = itemPrefab.name, Rarity = rarityTable } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; // TODO add better hook for desired effect - currently effect will be discarded on next game load // if effect was added when magicItem had maximum of available effect // however still good for debug LootRoller.CheatForceMagicEffect = true; LootRoller.ForcedMagicEffect = effectArg; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); LootRoller.CheatForceMagicEffect = false; LootRoller.ForcedMagicEffect = string.Empty; }
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); }
public static void SpawnMagicItemWithEffect(Terminal context, string[] args) { if (args.Length < 3) { EpicLoot.LogError("Specify effect and item name"); return; } if (Player.m_localPlayer == null) { return; } var effectArg = args[1]; var itemPrefabNameArg = args[2]; context.AddString($"magicitem - {itemPrefabNameArg} with effect: {effectArg}"); var magicItemEffectDef = MagicItemEffectDefinitions.Get(effectArg); if (magicItemEffectDef == null) { context.AddString($"> Could not find effect: {effectArg}"); return; } var itemPrefab = ObjectDB.instance.GetItemPrefab(itemPrefabNameArg); if (itemPrefab == null) { context.AddString($"> Could not find item: {itemPrefabNameArg}"); return; } var fromItemData = itemPrefab.GetComponent <ItemDrop>().m_itemData; if (!EpicLoot.CanBeMagicItem(fromItemData)) { context.AddString($"> Can't be magic item: {itemPrefabNameArg}"); return; } var effectRequirements = magicItemEffectDef.Requirements; var itemRarity = effectRequirements.AllowedRarities.Count == 0 ? ItemRarity.Magic : effectRequirements.AllowedRarities.First(); var rarityTable = GetRarityTable(itemRarity.ToString()); var loot = new LootTable { Object = "Console", Drops = new[] { new float[] { 1, 1 } }, Loot = new[] { new LootDrop { Item = itemPrefab.name, Rarity = rarityTable } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; LootRoller.CheatForceMagicEffect = true; LootRoller.ForcedMagicEffect = effectArg; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); LootRoller.CheatForceMagicEffect = false; LootRoller.ForcedMagicEffect = string.Empty; }