diff --git a/EMMItem.cs b/EMMItem.cs index c5dfe01b1..deeff132e 100644 --- a/EMMItem.cs +++ b/EMMItem.cs @@ -67,6 +67,7 @@ public override void Load(Item item, TagCompound tag) { if (tag.ContainsKey("Type")) ModifierPool = ModifierPool._Load(item, tag); + HasRolled = tag.GetBool("HasRolled"); ModifierPool?.ApplyModifiers(item); @@ -108,21 +109,13 @@ public override void NetSend(Item item, BinaryWriter writer) public override void OnCraft(Item item, Recipe recipe) { - ModifierContext ctx = new ModifierContext { Method = ModifierContextMethod.OnCraft, Item = item, Player = Main.LocalPlayer, Recipe = recipe }; - - ModifierPool pool = GetItemInfo(item).ModifierPool; - if (!HasRolled && pool == null) + ModifierContext ctx = new ModifierContext { - pool = RollNewPool(ctx); - pool?.ApplyModifiers(item); - } - - base.OnCraft(item, recipe); - } - - public override bool OnPickup(Item item, Player player) - { - ModifierContext ctx = new ModifierContext { Method = ModifierContextMethod.OnPickup, Item = item, Player = player }; + Method = ModifierContextMethod.OnCraft, + Item = item, + Player = Main.LocalPlayer, + Recipe = recipe + }; ModifierPool pool = GetItemInfo(item).ModifierPool; if (!HasRolled && pool == null) @@ -131,12 +124,17 @@ public override bool OnPickup(Item item, Player player) pool?.ApplyModifiers(item); } - return base.OnPickup(item, player); + base.OnCraft(item, recipe); } public override void PostReforge(Item item) { - ModifierContext ctx = new ModifierContext { Method = ModifierContextMethod.OnReforge, Item = item, Player = Main.LocalPlayer }; + ModifierContext ctx = new ModifierContext + { + Method = ModifierContextMethod.OnReforge, + Item = item, + Player = Main.LocalPlayer + }; ModifierPool pool = RollNewPool(ctx); pool?.ApplyModifiers(item); diff --git a/EMMLoader.cs b/EMMLoader.cs index aefacc868..26e3e1b5c 100644 --- a/EMMLoader.cs +++ b/EMMLoader.cs @@ -142,7 +142,7 @@ internal static uint ReserveGlobalModifierID() internal static ModifierPool GetWeightedPool(ModifierContext ctx) { var wr = new WeightedRandom(); - foreach (var m in Pools.Where(x => x.Value._CanApply(ctx))) + foreach (var m in Pools.Where(x => x.Value._CanRoll(ctx))) wr.Add(m.Value, m.Value.RollChance); var mod = wr.Get(); return (ModifierPool)mod?.Clone(); diff --git a/EMMWorld.cs b/EMMWorld.cs index 74bf0e918..cfa3d9b4d 100644 --- a/EMMWorld.cs +++ b/EMMWorld.cs @@ -6,12 +6,51 @@ using Loot.System; using Terraria; using Terraria.ModLoader; +using Terraria.ModLoader.IO; using Terraria.World.Generation; namespace Loot { public class EMMWorld : ModWorld { + // The world has not initialized yet, when it is first updated + public static bool Initialized { get; internal set; } + + public override void Initialize() + { + Initialized = false; + } + + public override TagCompound Save() + { + return new TagCompound + { + {"initialized", Initialized} + }; + } + + public override void Load(TagCompound tag) + { + try + { + Initialized = tag.GetBool("initialized"); + } + catch (Exception e) + { + ErrorLogger.Log($"Error on EMMWorld:Load: {e}"); + } + } + + public override void PostUpdate() + { + if (!Initialized) + { + Initialized = true; + foreach (var chest in Main.chest.Where(chest => chest != null && chest.x > 0 && chest.y > 0)) + WorldGenModifiersPass.GenerateModifiers(null, ModifierContextMethod.FirstLoad, chest.item.Where(x => !x.IsAir), chest); + } + } + // TODO hardmode task, generate better modifiers in new biomes etc. public override void ModifyWorldGenTasks(List tasks, ref float totalWeight) @@ -19,45 +58,55 @@ public override void ModifyWorldGenTasks(List tasks, ref float totalWei tasks.Add(new WorldGenModifiersPass("EvenMoreModifiers:WorldGenModifiersPass", 1)); } - private sealed class WorldGenModifiersPass : GenPass + internal sealed class WorldGenModifiersPass : GenPass { public WorldGenModifiersPass(string name, float loadWeight) : base(name, loadWeight) { } - public override void Apply(GenerationProgress progress) + // Attempt rolling modifiers on items + internal static void GenerateModifiers(GenerationProgress progress, ModifierContextMethod method, IEnumerable items, object obj = null) { - progress.Message = "Generating modifiers on generated items..."; + if (progress != null) + progress.Message = "Generating modifiers on generated items..."; - foreach (Chest chest in Main.chest) + foreach (var item in items) { - if (chest == null || chest.x <= 0 || chest.y <= 0) - continue; - - foreach (Item item in chest.item) + EMMItem itemInfo = EMMItem.GetItemInfo(item); + ModifierPool pool = itemInfo.ModifierPool; + if (pool == null && WorldGen._genRand.NextBool()) { - if (!item.IsAir) + ModifierContext ctx = new ModifierContext + { + Method = method, + Item = item + }; + + if (obj is Chest) { - EMMItem ItemInfo = EMMItem.GetItemInfo(item); - ModifierPool pool = ItemInfo.ModifierPool; - if (!ItemInfo.HasRolled && pool == null && WorldGen._genRand.NextBool()) + ctx.CustomData = new Dictionary { - ModifierContext ctx = new ModifierContext - { - Method = ModifierContextMethod.WorldGeneration, - Item = item, - CustomData = new Dictionary - { - {"chestData", new Tuple(chest.x, chest.y) } - } - }; - pool = ItemInfo.RollNewPool(ctx); - pool?.ApplyModifiers(item); - } + {"chestData", new Tuple(((Chest)obj).x, ((Chest)obj).y)} + }; } + else if (obj is Player) + { + ctx.Player = (Player)obj; + } + + itemInfo.HasRolled = true; + pool = itemInfo.RollNewPool(ctx); + pool?.ApplyModifiers(item); } } } + + public override void Apply(GenerationProgress progress) + { + Initialized = true; + foreach (var chest in Main.chest.Where(chest => chest != null && chest.x > 0 && chest.y > 0)) + GenerateModifiers(progress, ModifierContextMethod.WorldGeneration, chest.item.Where(x => !x.IsAir), chest); + } } } } diff --git a/ModifierPlayer.cs b/ModifierPlayer.cs index 1c3b66d46..dc178fb54 100644 --- a/ModifierPlayer.cs +++ b/ModifierPlayer.cs @@ -1,469 +1,24 @@ using System; using System.Collections.Generic; +using System.Linq; +using Loot.System; using Terraria; using Terraria.DataStructures; using Terraria.ModLoader; namespace Loot { - // TODO If we want ModPlayer code confined to Modifier classes, we will need to make a way to access it in Modifier - // We can do it similar to ModifierItem - - //public class ModifierPlayer2 : ModPlayer - //{ - // public override bool CloneNewInstances => base.CloneNewInstances; - - // public override void AnglerQuestReward(float rareMultiplier, List rewardItems) - // { - // base.AnglerQuestReward(rareMultiplier, rewardItems); - // } - - // public override bool Autoload(ref string name) - // { - // return base.Autoload(ref name); - // } - - // public override bool CanBeHitByNPC(NPC npc, ref int cooldownSlot) - // { - // return base.CanBeHitByNPC(npc, ref cooldownSlot); - // } - - // public override bool CanBeHitByProjectile(Projectile proj) - // { - // return base.CanBeHitByProjectile(proj); - // } - - // public override bool? CanHitNPC(Item item, NPC target) - // { - // return base.CanHitNPC(item, target); - // } - - // public override bool? CanHitNPCWithProj(Projectile proj, NPC target) - // { - // return base.CanHitNPCWithProj(proj, target); - // } - - // public override bool CanHitPvp(Item item, Player target) - // { - // return base.CanHitPvp(item, target); - // } - - // public override bool CanHitPvpWithProj(Projectile proj, Player target) - // { - // return base.CanHitPvpWithProj(proj, target); - // } - - // public override void CatchFish(Item fishingRod, Item bait, int power, int liquidType, int poolSize, int worldLayer, int questFish, ref int caughtType, ref bool junk) - // { - // base.CatchFish(fishingRod, bait, power, liquidType, poolSize, worldLayer, questFish, ref caughtType, ref junk); - // } - - // public override void clientClone(ModPlayer clientClone) - // { - // base.clientClone(clientClone); - // } - - // public override bool ConsumeAmmo(Item weapon, Item ammo) - // { - // return base.ConsumeAmmo(weapon, ammo); - // } - - // public override void CopyCustomBiomesTo(Player other) - // { - // base.CopyCustomBiomesTo(other); - // } - - // public override bool CustomBiomesMatch(Player other) - // { - // return base.CustomBiomesMatch(other); - // } - - // public override void DrawEffects(PlayerDrawInfo drawInfo, ref float r, ref float g, ref float b, ref float a, ref bool fullBright) - // { - // base.DrawEffects(drawInfo, ref r, ref g, ref b, ref a, ref fullBright); - // } - - // public override bool Equals(object obj) - // { - // return base.Equals(obj); - // } - - // public override void FrameEffects() - // { - // base.FrameEffects(); - // } - - // public override void GetDyeTraderReward(List rewardPool) - // { - // base.GetDyeTraderReward(rewardPool); - // } - - // public override void GetFishingLevel(Item fishingRod, Item bait, ref int fishingLevel) - // { - // base.GetFishingLevel(fishingRod, bait, ref fishingLevel); - // } - - // public override int GetHashCode() - // { - // return base.GetHashCode(); - // } - - // public override Texture2D GetMapBackgroundImage() - // { - // return base.GetMapBackgroundImage(); - // } - - // public override void GetWeaponCrit(Item item, ref int crit) - // { - // base.GetWeaponCrit(item, ref crit); - // } - - // public override void GetWeaponDamage(Item item, ref int damage) - // { - // base.GetWeaponDamage(item, ref damage); - // } - - // public override void GetWeaponKnockback(Item item, ref float knockback) - // { - // base.GetWeaponKnockback(item, ref knockback); - // } - - // public override void Hurt(bool pvp, bool quiet, double damage, int hitDirection, bool crit) - // { - // base.Hurt(pvp, quiet, damage, hitDirection, crit); - // } - - // public override void Initialize() - // { - // base.Initialize(); - // } - - // public override void Kill(double damage, int hitDirection, bool pvp, PlayerDeathReason damageSource) - // { - // base.Kill(damage, hitDirection, pvp, damageSource); - // } - - // public override void Load(TagCompound tag) - // { - // base.Load(tag); - // } - - // public override void LoadLegacy(BinaryReader reader) - // { - // base.LoadLegacy(reader); - // } - - // public override void MeleeEffects(Item item, Rectangle hitbox) - // { - // base.MeleeEffects(item, hitbox); - // } - - // public override float MeleeSpeedMultiplier(Item item) - // { - // return base.MeleeSpeedMultiplier(item); - // } - - // public override void ModifyDrawHeadLayers(List layers) - // { - // base.ModifyDrawHeadLayers(layers); - // } - - // public override void ModifyDrawInfo(ref PlayerDrawInfo drawInfo) - // { - // base.ModifyDrawInfo(ref drawInfo); - // } - - // public override void ModifyDrawLayers(List layers) - // { - // base.ModifyDrawLayers(layers); - // } - - // public override void ModifyHitByNPC(NPC npc, ref int damage, ref bool crit) - // { - // base.ModifyHitByNPC(npc, ref damage, ref crit); - // } - - // public override void ModifyHitByProjectile(Projectile proj, ref int damage, ref bool crit) - // { - // base.ModifyHitByProjectile(proj, ref damage, ref crit); - // } - - // public override void ModifyHitNPC(Item item, NPC target, ref int damage, ref float knockback, ref bool crit) - // { - // base.ModifyHitNPC(item, target, ref damage, ref knockback, ref crit); - // } - - // public override void ModifyHitNPCWithProj(Projectile proj, NPC target, ref int damage, ref float knockback, ref bool crit, ref int hitDirection) - // { - // base.ModifyHitNPCWithProj(proj, target, ref damage, ref knockback, ref crit, ref hitDirection); - // } - - // public override void ModifyHitPvp(Item item, Player target, ref int damage, ref bool crit) - // { - // base.ModifyHitPvp(item, target, ref damage, ref crit); - // } - - // public override void ModifyHitPvpWithProj(Projectile proj, Player target, ref int damage, ref bool crit) - // { - // base.ModifyHitPvpWithProj(proj, target, ref damage, ref crit); - // } - - // public override void ModifyScreenPosition() - // { - // base.ModifyScreenPosition(); - // } - - // public override void ModifyZoom(ref float zoom) - // { - // base.ModifyZoom(ref zoom); - // } - - // public override void NaturalLifeRegen(ref float regen) - // { - // base.NaturalLifeRegen(ref regen); - // } - - // public override void OnEnterWorld(Player player) - // { - // base.OnEnterWorld(player); - // } - - // public override void OnHitAnything(float x, float y, Entity victim) - // { - // base.OnHitAnything(x, y, victim); - // } - - // public override void OnHitByNPC(NPC npc, int damage, bool crit) - // { - // base.OnHitByNPC(npc, damage, crit); - // } - - // public override void OnHitByProjectile(Projectile proj, int damage, bool crit) - // { - // base.OnHitByProjectile(proj, damage, crit); - // } - - // public override void OnHitNPC(Item item, NPC target, int damage, float knockback, bool crit) - // { - // base.OnHitNPC(item, target, damage, knockback, crit); - // } - - // public override void OnHitNPCWithProj(Projectile proj, NPC target, int damage, float knockback, bool crit) - // { - // base.OnHitNPCWithProj(proj, target, damage, knockback, crit); - // } - - // public override void OnHitPvp(Item item, Player target, int damage, bool crit) - // { - // base.OnHitPvp(item, target, damage, crit); - // } - - // public override void OnHitPvpWithProj(Projectile proj, Player target, int damage, bool crit) - // { - // base.OnHitPvpWithProj(proj, target, damage, crit); - // } - - // public override void OnRespawn(Player player) - // { - // base.OnRespawn(player); - // } - - // public override void PlayerConnect(Player player) - // { - // base.PlayerConnect(player); - // } - - // public override void PlayerDisconnect(Player player) - // { - // base.PlayerDisconnect(player); - // } - - // public override void PostHurt(bool pvp, bool quiet, double damage, int hitDirection, bool crit) - // { - // base.PostHurt(pvp, quiet, damage, hitDirection, crit); - // } - - // public override void PostItemCheck() - // { - // base.PostItemCheck(); - // } - - // public override void PostSavePlayer() - // { - // base.PostSavePlayer(); - // } - - // public override void PostUpdate() - // { - // base.PostUpdate(); - // } - - // public override void PostUpdateBuffs() - // { - // base.PostUpdateBuffs(); - // } - - // public override void PostUpdateEquips() - // { - // base.PostUpdateEquips(); - // } - - // public override void PostUpdateMiscEffects() - // { - // base.PostUpdateMiscEffects(); - // } - - // public override void PostUpdateRunSpeeds() - // { - // base.PostUpdateRunSpeeds(); - // } - - // public override bool PreHurt(bool pvp, bool quiet, ref int damage, ref int hitDirection, ref bool crit, ref bool customDamage, ref bool playSound, ref bool genGore, ref PlayerDeathReason damageSource) - // { - // return base.PreHurt(pvp, quiet, ref damage, ref hitDirection, ref crit, ref customDamage, ref playSound, ref genGore, ref damageSource); - // } - - // public override bool PreItemCheck() - // { - // return base.PreItemCheck(); - // } - - // public override bool PreKill(double damage, int hitDirection, bool pvp, ref bool playSound, ref bool genGore, ref PlayerDeathReason damageSource) - // { - // return base.PreKill(damage, hitDirection, pvp, ref playSound, ref genGore, ref damageSource); - // } - - // public override void PreSaveCustomData() - // { - // base.PreSaveCustomData(); - // } - - // public override void PreSavePlayer() - // { - // base.PreSavePlayer(); - // } - - // public override void PreUpdate() - // { - // base.PreUpdate(); - // } - - // public override void PreUpdateBuffs() - // { - // base.PreUpdateBuffs(); - // } - - // public override void PreUpdateMovement() - // { - // base.PreUpdateMovement(); - // } - - // public override void ProcessTriggers(TriggersSet triggersSet) - // { - // base.ProcessTriggers(triggersSet); - // } - - // public override void ReceiveCustomBiomes(BinaryReader reader) - // { - // base.ReceiveCustomBiomes(reader); - // } - - // public override void ResetEffects() - // { - // base.ResetEffects(); - // } - - // public override TagCompound Save() - // { - // return base.Save(); - // } - - // public override void SendClientChanges(ModPlayer clientPlayer) - // { - // base.SendClientChanges(clientPlayer); - // } - - // public override void SendCustomBiomes(BinaryWriter writer) - // { - // base.SendCustomBiomes(writer); - // } - - // public override void SetControls() - // { - // base.SetControls(); - // } - - // public override void SetupStartInventory(IList items) - // { - // base.SetupStartInventory(items); - // } - - // public override bool ShiftClickSlot(Item[] inventory, int context, int slot) - // { - // return base.ShiftClickSlot(inventory, context, slot); - // } - - // public override bool Shoot(Item item, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack) - // { - // return base.Shoot(item, ref position, ref speedX, ref speedY, ref type, ref damage, ref knockBack); - // } - - // public override void SyncPlayer(int toWho, int fromWho, bool newPlayer) - // { - // base.SyncPlayer(toWho, fromWho, newPlayer); - // } - - // public override string ToString() - // { - // return base.ToString(); - // } - - // public override void UpdateBadLifeRegen() - // { - // base.UpdateBadLifeRegen(); - // } - - // public override void UpdateBiomes() - // { - // base.UpdateBiomes(); - // } - - // public override void UpdateBiomeVisuals() - // { - // base.UpdateBiomeVisuals(); - // } - - // public override void UpdateDead() - // { - // base.UpdateDead(); - // } - - // public override void UpdateEquips(ref bool wallSpeedBuff, ref bool tileSpeedBuff, ref bool tileRangeBuff) - // { - // base.UpdateEquips(ref wallSpeedBuff, ref tileSpeedBuff, ref tileRangeBuff); - // } - - // public override void UpdateLifeRegen() - // { - // base.UpdateLifeRegen(); - // } - - // public override void UpdateVanityAccessories() - // { - // base.UpdateVanityAccessories(); - // } - - // public override float UseTimeMultiplier(Item item) - // { - // return base.UseTimeMultiplier(item); - // } - //} - /// /// Holds player-entity data and handles it /// public class ModifierPlayer : ModPlayer { + // Attempt rolling modifiers on first load + public override void SetupStartInventory(IList items) + { + EMMWorld.WorldGenModifiersPass.GenerateModifiers(null, ModifierContextMethod.SetupStartInventory, items.Where(x => !x.IsAir), player); + } + public static ModifierPlayer PlayerInfo(Player player) => player.GetModPlayer(); // Globals for modifiers @@ -565,7 +120,7 @@ public override bool PreHurt(bool pvp, bool quiet, ref int damage, ref int hitDi // If we have a mana shield (% damage redirected to mana) // Then try to redirect the damage - int manaBlock = (int) Math.Ceiling(damage * ManaShield) * 2; + int manaBlock = (int)Math.Ceiling(damage * ManaShield) * 2; if (manaBlock > 0 && player.statMana > 0) { // We cannot block more than how much mana we have diff --git a/Modifiers/AccessoryModifiers/GodlyDefense.cs b/Modifiers/AccessoryModifiers/GodlyDefense.cs index 23f28a679..7c1ddc339 100644 --- a/Modifiers/AccessoryModifiers/GodlyDefense.cs +++ b/Modifiers/AccessoryModifiers/GodlyDefense.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.AccessoryModifiers { public class GodlyDefense : AccessoryModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = "Player has godly defense", Color = Color.SlateGray}, }; diff --git a/Modifiers/AccessoryModifiers/Inferno.cs b/Modifiers/AccessoryModifiers/Inferno.cs index aa3422efd..40ecabd8d 100644 --- a/Modifiers/AccessoryModifiers/Inferno.cs +++ b/Modifiers/AccessoryModifiers/Inferno.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.AccessoryModifiers { public class Inferno : AccessoryModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = "Player has inferno", Color = Color.IndianRed}, }; diff --git a/Modifiers/AccessoryModifiers/MoreDamage.cs b/Modifiers/AccessoryModifiers/MoreDamage.cs index 88b370ecb..a5c943ed9 100644 --- a/Modifiers/AccessoryModifiers/MoreDamage.cs +++ b/Modifiers/AccessoryModifiers/MoreDamage.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.AccessoryModifiers { public class MoreDamage : AccessoryModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = "Player deals 100% more damage", Color = Color.SlateGray}, }; diff --git a/Modifiers/EquipModifiers/CritDamagePlus.cs b/Modifiers/EquipModifiers/CritDamagePlus.cs index ef38ae3f5..03297b479 100644 --- a/Modifiers/EquipModifiers/CritDamagePlus.cs +++ b/Modifiers/EquipModifiers/CritDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class CritDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% crit damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/DodgeChance.cs b/Modifiers/EquipModifiers/DodgeChance.cs index 023322009..583d2f8a5 100644 --- a/Modifiers/EquipModifiers/DodgeChance.cs +++ b/Modifiers/EquipModifiers/DodgeChance.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class DodgeChance : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% dodge chance", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/FishingPlus.cs b/Modifiers/EquipModifiers/FishingPlus.cs index 3718cd8cc..0ed902581 100644 --- a/Modifiers/EquipModifiers/FishingPlus.cs +++ b/Modifiers/EquipModifiers/FishingPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class FishingPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} fishing skill", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/HealthPlus.cs b/Modifiers/EquipModifiers/HealthPlus.cs index 36ba71246..92f7a4063 100644 --- a/Modifiers/EquipModifiers/HealthPlus.cs +++ b/Modifiers/EquipModifiers/HealthPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class HealthPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} max life", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/HealthyFoesBonus.cs b/Modifiers/EquipModifiers/HealthyFoesBonus.cs index 5a58b57a8..4bd7c06c9 100644 --- a/Modifiers/EquipModifiers/HealthyFoesBonus.cs +++ b/Modifiers/EquipModifiers/HealthyFoesBonus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class HealthyFoesBonus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% damage vs max life foes", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/ImmunityTimePlus.cs b/Modifiers/EquipModifiers/ImmunityTimePlus.cs index 355cda22d..da9bd009e 100644 --- a/Modifiers/EquipModifiers/ImmunityTimePlus.cs +++ b/Modifiers/EquipModifiers/ImmunityTimePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class ImmunityTimePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} immunity frames", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/KnockbackImmunity.cs b/Modifiers/EquipModifiers/KnockbackImmunity.cs index 69a12e16d..47bb62e97 100644 --- a/Modifiers/EquipModifiers/KnockbackImmunity.cs +++ b/Modifiers/EquipModifiers/KnockbackImmunity.cs @@ -7,14 +7,14 @@ namespace Loot.Modifiers.EquipModifiers { public class KnockbackImmunity : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine {Text = $"Knockback immunity", Color = Color.LimeGreen}, }; public override ModifierProperties GetModifierProperties(Item item) { - return base.GetModifierProperties(item).Set(rollChance: .333f, rarityLevel: 3f); + return base.GetModifierProperties(item).Set(rollChance: .333f, rarityLevel: 3f, uniqueRoll: true); } public override bool CanRoll(ModifierContext ctx) @@ -35,5 +35,6 @@ public override void UpdateEquip(Item item, Player player) { player.noKnockback = true; } + } } diff --git a/Modifiers/EquipModifiers/LifeRegen.cs b/Modifiers/EquipModifiers/LifeRegen.cs index 307bc05ec..9572d5dd2 100644 --- a/Modifiers/EquipModifiers/LifeRegen.cs +++ b/Modifiers/EquipModifiers/LifeRegen.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class LifeRegen : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} life regen/minute", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/LightPlus.cs b/Modifiers/EquipModifiers/LightPlus.cs index d5c9fa727..10e4b9db7 100644 --- a/Modifiers/EquipModifiers/LightPlus.cs +++ b/Modifiers/EquipModifiers/LightPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class LightPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} light", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/LuckPlus.cs b/Modifiers/EquipModifiers/LuckPlus.cs index 834875420..b0bd1a157 100644 --- a/Modifiers/EquipModifiers/LuckPlus.cs +++ b/Modifiers/EquipModifiers/LuckPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class LuckPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} luck [WIP]", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MagicCritPlus.cs b/Modifiers/EquipModifiers/MagicCritPlus.cs index ff7d3a56d..19f50a12d 100644 --- a/Modifiers/EquipModifiers/MagicCritPlus.cs +++ b/Modifiers/EquipModifiers/MagicCritPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MagicCritPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% magic crit chance", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MagicDamagePlus.cs b/Modifiers/EquipModifiers/MagicDamagePlus.cs index 6951b2554..bddeb54e3 100644 --- a/Modifiers/EquipModifiers/MagicDamagePlus.cs +++ b/Modifiers/EquipModifiers/MagicDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MagicDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% magic damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/ManaPlus.cs b/Modifiers/EquipModifiers/ManaPlus.cs index aef4a843d..e99dd7945 100644 --- a/Modifiers/EquipModifiers/ManaPlus.cs +++ b/Modifiers/EquipModifiers/ManaPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class ManaPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower} max mana", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/ManaShield.cs b/Modifiers/EquipModifiers/ManaShield.cs index 31b1af610..f124d6759 100644 --- a/Modifiers/EquipModifiers/ManaShield.cs +++ b/Modifiers/EquipModifiers/ManaShield.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class ManaShield : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% of damage taken is redirected to mana", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MeleeCritPlus.cs b/Modifiers/EquipModifiers/MeleeCritPlus.cs index 0c4a3f216..ed18071db 100644 --- a/Modifiers/EquipModifiers/MeleeCritPlus.cs +++ b/Modifiers/EquipModifiers/MeleeCritPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MeleeCritPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% melee crit chance", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MeleeDamagePlus.cs b/Modifiers/EquipModifiers/MeleeDamagePlus.cs index 237a23c71..0b46ad6f8 100644 --- a/Modifiers/EquipModifiers/MeleeDamagePlus.cs +++ b/Modifiers/EquipModifiers/MeleeDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MeleeDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% melee damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MiningSpeedPlus.cs b/Modifiers/EquipModifiers/MiningSpeedPlus.cs index 18bb2f9bd..73a98119c 100644 --- a/Modifiers/EquipModifiers/MiningSpeedPlus.cs +++ b/Modifiers/EquipModifiers/MiningSpeedPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MiningSpeedPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% mining speed", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MinionDamagePlus.cs b/Modifiers/EquipModifiers/MinionDamagePlus.cs index 1358fc442..698f83506 100644 --- a/Modifiers/EquipModifiers/MinionDamagePlus.cs +++ b/Modifiers/EquipModifiers/MinionDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MinionDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% minion damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/MoveSpeedPlus.cs b/Modifiers/EquipModifiers/MoveSpeedPlus.cs index 21176ce9e..15152f4da 100644 --- a/Modifiers/EquipModifiers/MoveSpeedPlus.cs +++ b/Modifiers/EquipModifiers/MoveSpeedPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class MoveSpeedPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% movement speed", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/PercentDefenseBonus.cs b/Modifiers/EquipModifiers/PercentDefenseBonus.cs index 005230a8a..94a9d49f0 100644 --- a/Modifiers/EquipModifiers/PercentDefenseBonus.cs +++ b/Modifiers/EquipModifiers/PercentDefenseBonus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class PercentDefenseBonus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% defense", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/RangedCritPlus.cs b/Modifiers/EquipModifiers/RangedCritPlus.cs index b15064a25..9e047a56a 100644 --- a/Modifiers/EquipModifiers/RangedCritPlus.cs +++ b/Modifiers/EquipModifiers/RangedCritPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class RangedCritPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% ranged crit chance", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/RangedDamagePlus.cs b/Modifiers/EquipModifiers/RangedDamagePlus.cs index 8774a3059..81c6fce5b 100644 --- a/Modifiers/EquipModifiers/RangedDamagePlus.cs +++ b/Modifiers/EquipModifiers/RangedDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class RangedDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% ranged damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/SurvivalChance.cs b/Modifiers/EquipModifiers/SurvivalChance.cs index 291fb7079..dc16048a5 100644 --- a/Modifiers/EquipModifiers/SurvivalChance.cs +++ b/Modifiers/EquipModifiers/SurvivalChance.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class SurvivalChance : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% chance to survive lethal blows", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/Thorns.cs b/Modifiers/EquipModifiers/Thorns.cs index f8dc3d03d..cad03aa58 100644 --- a/Modifiers/EquipModifiers/Thorns.cs +++ b/Modifiers/EquipModifiers/Thorns.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class Thorns : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% thorns", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/ThrownCritPlus.cs b/Modifiers/EquipModifiers/ThrownCritPlus.cs index ff2c71239..2f4239f0e 100644 --- a/Modifiers/EquipModifiers/ThrownCritPlus.cs +++ b/Modifiers/EquipModifiers/ThrownCritPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class ThrownCritPlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% thrown crit chance", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/ThrownDamagePlus.cs b/Modifiers/EquipModifiers/ThrownDamagePlus.cs index c7efde421..4e18c1aa6 100644 --- a/Modifiers/EquipModifiers/ThrownDamagePlus.cs +++ b/Modifiers/EquipModifiers/ThrownDamagePlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.EquipModifiers { public class ThrownDamagePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% thrown damage", Color = Color.LimeGreen}, }; diff --git a/Modifiers/EquipModifiers/WingTimePlus.cs b/Modifiers/EquipModifiers/WingTimePlus.cs index 323d1261b..9b022e5ea 100644 --- a/Modifiers/EquipModifiers/WingTimePlus.cs +++ b/Modifiers/EquipModifiers/WingTimePlus.cs @@ -7,7 +7,7 @@ namespace Loot.Modifiers.EquipModifiers { public class WingTimePlus : EquipModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Math.Round(Properties.RoundedPower/60, 2)}s flight time", Color = Color.LimeGreen}, }; diff --git a/Modifiers/WeaponDebuffModifier.cs b/Modifiers/WeaponDebuffModifier.cs index 54e723aad..d281a4436 100644 --- a/Modifiers/WeaponDebuffModifier.cs +++ b/Modifiers/WeaponDebuffModifier.cs @@ -13,7 +13,7 @@ namespace Loot.Modifiers /// public abstract class WeaponDebuffModifier : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% chance to inflict {GetBuffName()} for {BuffTime/60f}s", Color = Color.Lime } }; diff --git a/Modifiers/WeaponModifiers/AmmoReduce.cs b/Modifiers/WeaponModifiers/AmmoReduce.cs index 56d270a45..d7406f080 100644 --- a/Modifiers/WeaponModifiers/AmmoReduce.cs +++ b/Modifiers/WeaponModifiers/AmmoReduce.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class AmmoReduce : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"{Properties.RoundedPower}% chance to not consume ammo", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/CritPlus.cs b/Modifiers/WeaponModifiers/CritPlus.cs index 5ebd58fd4..64f27a24a 100644 --- a/Modifiers/WeaponModifiers/CritPlus.cs +++ b/Modifiers/WeaponModifiers/CritPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class CritPlus : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% crit chance", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/CursedDamage.cs b/Modifiers/WeaponModifiers/CursedDamage.cs index 88946d883..c5c0f6a83 100644 --- a/Modifiers/WeaponModifiers/CursedDamage.cs +++ b/Modifiers/WeaponModifiers/CursedDamage.cs @@ -7,14 +7,14 @@ namespace Loot.Modifiers.WeaponModifiers { public class CursedDamage : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% damage, but you are cursed", Color = Color.Lime} }; public override ModifierProperties GetModifierProperties(Item item) { - return base.GetModifierProperties(item).Set(minMagnitude: 16f, maxMagnitude: 30f); + return base.GetModifierProperties(item).Set(minMagnitude: 16f, maxMagnitude: 30f, uniqueRoll: true); } public override void GetWeaponDamage(Item item, Player player, ref int damage) diff --git a/Modifiers/WeaponModifiers/DamagePlus.cs b/Modifiers/WeaponModifiers/DamagePlus.cs index 93e63174b..b551a2f0c 100644 --- a/Modifiers/WeaponModifiers/DamagePlus.cs +++ b/Modifiers/WeaponModifiers/DamagePlus.cs @@ -7,7 +7,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class DamagePlus : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% damage", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/DamagePlusDaytime.cs b/Modifiers/WeaponModifiers/DamagePlusDaytime.cs index b68331830..ee0313e18 100644 --- a/Modifiers/WeaponModifiers/DamagePlusDaytime.cs +++ b/Modifiers/WeaponModifiers/DamagePlusDaytime.cs @@ -9,7 +9,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class DamagePlusDaytime : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% damage during the {(_duringDay ? "day" : "night")}", Color = Color.Lime} }; @@ -21,9 +21,9 @@ public override ModifierProperties GetModifierProperties(Item item) private bool _duringDay; - public override void Roll(Item item) + public override void Roll(ModifierContext ctx) { - base.Roll(item); + base.Roll(ctx); _duringDay = Main.rand.NextBool(); } diff --git a/Modifiers/WeaponModifiers/DamageWithManaCost.cs b/Modifiers/WeaponModifiers/DamageWithManaCost.cs index 38a8eb9d3..3637403ff 100644 --- a/Modifiers/WeaponModifiers/DamageWithManaCost.cs +++ b/Modifiers/WeaponModifiers/DamageWithManaCost.cs @@ -7,7 +7,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class DamageWithManaCost : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% damage, but added mana cost", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/KnockbackPlus.cs b/Modifiers/WeaponModifiers/KnockbackPlus.cs index 83cd82adb..a5802a373 100644 --- a/Modifiers/WeaponModifiers/KnockbackPlus.cs +++ b/Modifiers/WeaponModifiers/KnockbackPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class KnockbackPlus : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% knockback", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/ManaReduce.cs b/Modifiers/WeaponModifiers/ManaReduce.cs index 88bafb69c..fc0ce13a7 100644 --- a/Modifiers/WeaponModifiers/ManaReduce.cs +++ b/Modifiers/WeaponModifiers/ManaReduce.cs @@ -7,7 +7,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class ManaReduce : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"-{Properties.RoundedPower}% mana cost", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/MissingHealthDamage.cs b/Modifiers/WeaponModifiers/MissingHealthDamage.cs index 0ecc5eac2..05c9efb29 100644 --- a/Modifiers/WeaponModifiers/MissingHealthDamage.cs +++ b/Modifiers/WeaponModifiers/MissingHealthDamage.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class MissingHealthDamage : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"Up to +{Properties.RoundedPower}% damage based on missing health", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/RandomDebuff.cs b/Modifiers/WeaponModifiers/RandomDebuff.cs index 9aa0006ca..5b5197e45 100644 --- a/Modifiers/WeaponModifiers/RandomDebuff.cs +++ b/Modifiers/WeaponModifiers/RandomDebuff.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Linq; using Loot.System; using Terraria; using Terraria.ID; @@ -49,12 +50,17 @@ public override void Load(TagCompound tag) _index = tag.GetAsInt("_index"); } - public override void Roll(Item item) + public override void Roll(ModifierContext ctx) { - base.Roll(item); + base.Roll(ctx); _index = Main.rand.Next(_len); } + public override bool PostRoll(ModifierContext ctx) + { + return !ModifierPlayer.PlayerInfo(ctx.Player).DebuffChances.Select(x => x.Item2).Contains(_index); + } + public override int BuffType => BuffPairs[_index, 0]; public override int BuffTime => BuffPairs[_index, 1]; diff --git a/Modifiers/WeaponModifiers/SpeedPlus.cs b/Modifiers/WeaponModifiers/SpeedPlus.cs index d48516fbd..f3d14d846 100644 --- a/Modifiers/WeaponModifiers/SpeedPlus.cs +++ b/Modifiers/WeaponModifiers/SpeedPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class SpeedPlus : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% speed", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/VelocityDamage.cs b/Modifiers/WeaponModifiers/VelocityDamage.cs index f5ddd5234..efc3463bc 100644 --- a/Modifiers/WeaponModifiers/VelocityDamage.cs +++ b/Modifiers/WeaponModifiers/VelocityDamage.cs @@ -7,7 +7,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class VelocityDamage : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"Added damage based on your velocity (multiplier: {Math.Round(Properties.RoundedPower/2, 1)}x)", Color = Color.Lime} }; diff --git a/Modifiers/WeaponModifiers/VelocityPlus.cs b/Modifiers/WeaponModifiers/VelocityPlus.cs index 0cccbcaee..1f03b4429 100644 --- a/Modifiers/WeaponModifiers/VelocityPlus.cs +++ b/Modifiers/WeaponModifiers/VelocityPlus.cs @@ -6,7 +6,7 @@ namespace Loot.Modifiers.WeaponModifiers { public class VelocityPlus : WeaponModifier { - public override ModifierTooltipLine[] Description => new[] + public override ModifierTooltipLine[] TooltipLines => new[] { new ModifierTooltipLine { Text = $"+{Properties.RoundedPower}% velocity", Color = Color.Lime} }; diff --git a/System/Modifier.cs b/System/Modifier.cs index abc0b552f..a3e3e2851 100644 --- a/System/Modifier.cs +++ b/System/Modifier.cs @@ -8,12 +8,19 @@ namespace Loot.System { + /// + /// Defines a tooltip line of a modifier + /// A modifier can have multiple lines + /// public struct ModifierTooltipLine { public string Text; public Color? Color; } + /// + /// Defines the properties of a modifier + /// public class ModifierProperties { public float MinMagnitude { get; private set; } @@ -39,13 +46,15 @@ public float RoundedPower get; private set; } + public bool UniqueRoll { get; private set; } + public bool MergeTooltips { get; private set; } - public ModifierProperties(float minMagnitude = 1f, float maxMagnitude = 1f, float magnitudeStrength = 1f, float basePower = 1f, float rarityLevel = 1f, float rollChance = 1f, int roundPrecision = 0) + public ModifierProperties(float minMagnitude = 1f, float maxMagnitude = 1f, float magnitudeStrength = 1f, float basePower = 1f, float rarityLevel = 1f, float rollChance = 1f, int roundPrecision = 0, bool uniqueRoll = false, bool mergeTooltips = false) { Set(minMagnitude, maxMagnitude, magnitudeStrength, basePower, rarityLevel, rollChance, roundPrecision); } - public ModifierProperties Set(float? minMagnitude = null, float? maxMagnitude = null, float? magnitudeStrength = null, float? basePower = null, float? rarityLevel = null, float? rollChance = null, int? roundPrecision = null) + public ModifierProperties Set(float? minMagnitude = null, float? maxMagnitude = null, float? magnitudeStrength = null, float? basePower = null, float? rarityLevel = null, float? rollChance = null, int? roundPrecision = null, bool? uniqueRoll = null, bool? mergeTooltips = null) { MinMagnitude = minMagnitude ?? MinMagnitude; MaxMagnitude = maxMagnitude ?? MaxMagnitude; @@ -54,6 +63,8 @@ public ModifierProperties Set(float? minMagnitude = null, float? maxMagnitude = RarityLevel = rarityLevel ?? RarityLevel; RollChance = rollChance ?? RollChance; RoundPrecision = roundPrecision ?? RoundPrecision; + UniqueRoll = uniqueRoll ?? UniqueRoll; + MergeTooltips = mergeTooltips ?? MergeTooltips; return this; } @@ -114,7 +125,7 @@ public abstract class Modifier : GlobalItem, ICloneable public ModifierProperties Properties { get; internal set; } // Must be getter due to various fields that can change interactively - public virtual ModifierTooltipLine[] Description { get; } + public virtual ModifierTooltipLine[] TooltipLines { get; } /// /// Returns the Modifier specified by type, null if not present @@ -130,59 +141,31 @@ public virtual ModifierProperties GetModifierProperties(Item item) /* Global For now: - We cannot roll on items that can stack - We cannot roll on coins + We cannot roll on items that can stack (stacking is undefined behavior) */ protected internal bool _CanRoll(ModifierContext ctx) { Properties = GetModifierProperties(ctx.Item); - return ctx.Item.maxStack == 1 && CanRoll(ctx); + return ctx.Item.maxStack <= 1 && CanRoll(ctx); } /// - /// If this Modifier can roll in the given context - /// - public virtual bool CanRoll(ModifierContext ctx) - => true; - - /// - /// Returns if this modifier can apply in the given context by craft - /// - public virtual bool CanRollCraft(ModifierContext ctx) - => true; - - /// - /// Returns if this modifier can apply in the given context by pickup - /// - public virtual bool CanRollPickup(ModifierContext ctx) - => true; - - /// - /// Returns if this modifier can apply in the given context by reforge + /// If this Modifier can roll at all in the given context + /// Properties are available here, apart from magnitude and power /// - public virtual bool CanRollReforge(ModifierContext ctx) - => true; + public virtual bool CanRoll(ModifierContext ctx) => true; /// - /// If the modifier is uniquely rolled in the given context - /// If true, the modifier cannot be rolled more than once on a given item + /// Allows modders to do something when the modifier is rolled in the given context /// - public virtual bool UniqueRoll(ModifierContext ctx) - => true; - - public sealed override void SetDefaults(Item item) + public virtual void Roll(ModifierContext ctx) { - base.SetDefaults(item); - Apply(item); } /// - /// Allows modders to do something when the modifier is rolled on the given item + /// Returns if the modifier can actually be rolled, after is called /// - /// Item this modifier is rolled on - public virtual void Roll(Item item) - { - } + public virtual bool PostRoll(ModifierContext ctx) => true; /// /// Allows modders to do something when this modifier is applied @@ -304,6 +287,11 @@ protected internal static TagCompound Save(Modifier modifier) public sealed override bool Autoload(ref string name) => false; public sealed override bool InstancePerEntity => true; public sealed override bool CloneNewInstances => true; + public sealed override void SetDefaults(Item item) + { + base.SetDefaults(item); + Apply(item); + } // The following hooks aren't applicable in instanced context, so we seal them here so they can't be used public sealed override GlobalItem Clone(Item item, Item itemClone) => base.Clone(item, itemClone); diff --git a/System/ModifierPool.cs b/System/ModifierPool.cs index f245e9b5e..c6211112d 100644 --- a/System/ModifierPool.cs +++ b/System/ModifierPool.cs @@ -10,14 +10,64 @@ namespace Loot.System { + /// + /// Defines a method for a context in which a Modifier might be rolled + /// Used in + /// public enum ModifierContextMethod { OnReforge, OnCraft, - OnPickup, - WorldGeneration + SetupStartInventory, + WorldGeneration, + FirstLoad } + /// + /// Defines a context in which a Modifier might be rolled + /// Which fields are available (not null) depends on the method + /// + /// + /// + /// Method + /// Available fields + /// + /// + /// + /// and + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// , + /// + /// + /// + /// + /// - The data available is "chestData" which holds a tuple of chest.x and chest.y position + /// + /// + /// + /// + /// public struct ModifierContext { public IDictionary CustomData; @@ -35,20 +85,31 @@ public struct ModifierContext /// public abstract class ModifierPool : ICloneable { - public uint Type { get; internal set; } - public Mod Mod { get; internal set; } - public ModifierRarity Rarity { get; internal set; } + public uint Type { get; protected internal set; } + public Mod Mod { get; protected internal set; } + public ModifierRarity Rarity { get; protected internal set; } protected internal Modifier[] Modifiers; - public Modifier[] ActiveModifiers { get; internal set; } + public Modifier[] ActiveModifiers { get; protected internal set; } - protected internal IEnumerable RollableModifiers(ModifierContext ctx) => - Modifiers.Where(x => x._CanRoll(ctx)); + /// + /// Returns an enumerable of the rollable modifiers in the given context + /// + /// + /// + protected internal IEnumerable RollableModifiers(ModifierContext ctx) + => Modifiers.Where(x => x._CanRoll(ctx)); - public float TotalRarityLevel => - ActiveModifiers.Select(m => m.Properties.RarityLevel).DefaultIfEmpty(0).Sum(); + /// + /// Returns the sum of the rarity levels of the active modifiers + /// + public float TotalRarityLevel + => ActiveModifiers.Select(m => m.Properties.RarityLevel).DefaultIfEmpty(0).Sum(); - public IEnumerable Description => - ActiveModifiers.Select(m => m.Description); + /// + /// Returns an enumerable of the tooltiplines of the active modifiers + /// + public IEnumerable Description + => ActiveModifiers.Select(m => m.TooltipLines); public virtual string Name => GetType().Name; public virtual float RollChance => 1f; @@ -84,22 +145,20 @@ internal bool RollModifiers(ModifierContext ctx) if (wr.elements.Count <= 0 || i > 0 && Main.rand.NextFloat() > ModifierRollChance(i)) break; - // TODO configurable if duplicates can be rolled? Modifier e = wr.Get(); - //if (e.UniqueRoll(ctx)) - // wr.elements.Remove(new Tuple(e, e.Properties.RollChance)); - // wr.needsRefresh = true; - - e = (Modifier)e.Clone(); - e.Properties = e.GetModifierProperties(ctx.Item).RollMagnitudeAndPower(); - e.Roll(ctx.Item); - list.Add(e); - - //Modifier eClone = (Modifier)e.Clone(); - //eClone.Roll(ctx.Item); - //list.Add(eClone); - //wr.elements.Remove(new Tuple(e, e.Properties.RollChance)); - //wr.needsRefresh = true; + Modifier eClone = (Modifier)e.Clone(); + eClone.Properties = eClone.GetModifierProperties(ctx.Item).RollMagnitudeAndPower(); + eClone.Roll(ctx); + + if (eClone.PostRoll(ctx)) + { + list.Add(eClone); + if (eClone.Properties.UniqueRoll) + { + wr.elements.Remove(new Tuple(eClone, eClone.Properties.RollChance)); + wr.needsRefresh = true; + } + } } ActiveModifiers = list.ToArray(); @@ -109,46 +168,29 @@ internal bool RollModifiers(ModifierContext ctx) //internal float ModifierRollChance(int len) => 0.5f / (float)Math.Pow(2, len); internal float ModifierRollChance(int len) => 0.5f; - /* Modder defined */ - public virtual bool CanApply(IEnumerable rollableModifiers, ModifierContext ctx) => true; - - /* Global */ - protected internal bool _CanApply(ModifierContext ctx) - { - var rollableModifiers = RollableModifiers(ctx); - - if (Modifiers.Length <= 0 - || !_CanRoll(rollableModifiers, ctx) - || !CanApply(rollableModifiers, ctx)) - return false; - - switch (ctx.Method) - { - case ModifierContextMethod.OnCraft: - return _CanRollCraft(rollableModifiers, ctx); - case ModifierContextMethod.OnPickup: - return _CanRollPickup(rollableModifiers, ctx); - case ModifierContextMethod.OnReforge: - return _CanRollReforge(rollableModifiers, ctx); - default: - return true; - } - } - - /* Modder defined */ - public virtual bool CanRollCraft(IEnumerable modifiers, ModifierContext ctx) => true; - public virtual bool CanRollPickup(IEnumerable modifiers, ModifierContext ctx) => true; - public virtual bool CanRollReforge(IEnumerable modifiers, ModifierContext ctx) => true; + /// + /// Returns if this pool can roll in the given context. + /// By default returns if any modifier's returns true, and this pool's returns true + /// + protected internal bool _CanRoll(ModifierContext ctx) + => Modifiers.Any(x => x._CanRoll(ctx)) && CanRoll(ctx); - /* Global */ - protected internal bool _CanRoll(IEnumerable modifiers, ModifierContext ctx) => Modifiers.Length > 0 && modifiers.Count() >= 0; - protected internal bool _CanRollCraft(IEnumerable modifiers, ModifierContext ctx) => modifiers.Any(x => x.CanRollCraft(ctx)) && CanRollCraft(modifiers, ctx); - protected internal bool _CanRollPickup(IEnumerable modifiers, ModifierContext ctx) => modifiers.Any(x => x.CanRollPickup(ctx)) && CanRollPickup(modifiers, ctx); - protected internal bool _CanRollReforge(IEnumerable modifiers, ModifierContext ctx) => modifiers.Any(x => x.CanRollReforge(ctx)) && CanRollReforge(modifiers, ctx); + /// + /// Returns if this pool can roll in the given context + /// Returns true by default + /// + public virtual bool CanRoll(ModifierContext ctx) + => true; - public virtual bool MatchesRarity(ModifierRarity rarity) - => TotalRarityLevel >= rarity.RequiredRarityLevel; + /// + /// By default returns if this pool matches the given 's + /// + public virtual bool MatchesRarity(ModifierRarity rarity) => TotalRarityLevel >= rarity.RequiredRarityLevel; + /// + /// Will run for all modifiers in + /// + /// The item to apply to, which is passed to internal void ApplyModifiers(Item item) { foreach (Modifier m in ActiveModifiers) diff --git a/UnitTests.cs b/UnitTests.cs index 869a42885..ddd803422 100644 --- a/UnitTests.cs +++ b/UnitTests.cs @@ -69,7 +69,7 @@ public void LogModifiers() f.SetValue(mod, false); Console.Write(string.Join("\n", EMMLoader.RequestModifierRarities().Select(x => x.Name))); - Console.Write(string.Join("\n", EMMLoader.RequestModifiers().Select(x => x.Description))); + Console.Write(string.Join("\n", EMMLoader.RequestModifiers().Select(x => x.TooltipLines))); } } }