diff --git a/Buffs/WarriorAmbitionBuff.cs b/Buffs/WarriorAmbitionBuff.cs new file mode 100644 index 0000000..1e54de7 --- /dev/null +++ b/Buffs/WarriorAmbitionBuff.cs @@ -0,0 +1,31 @@ +using Terraria; +using Terraria.Localization; +using Terraria.ModLoader; + +namespace YHTMod.Buffs; + +public class WarriorAmbitionBuff : ModBuff { + public override void SetStaticDefaults() { + Main.buffNoSave[Type] = true; + Main.buffNoTimeDisplay[Type] = true; + } + + public override void ModifyBuffText(ref string buffName, ref string tip, ref int rare) { + YhtPlayer modPlayer = Main.LocalPlayer.TryGetModPlayer(out YhtPlayer mp) ? mp : null; + if (modPlayer == null) return; + tip = Language.GetTextValue("Mods.YHTMod.Buffs.WarriorAmbitionBuff.Description", + modPlayer.WarriorAmbitions.Count); + } + + public override void Update(Player player, ref int buffIndex) { + YhtPlayer modPlayer = player.GetModPlayer(); + + if (modPlayer.WarriorAmbition) { + player.buffTime[buffIndex] = 18000; + } + else { + player.DelBuff(buffIndex); + buffIndex--; + } + } +} diff --git a/Buffs/WarriorAmbitionBuff.png b/Buffs/WarriorAmbitionBuff.png new file mode 100644 index 0000000..3677bec Binary files /dev/null and b/Buffs/WarriorAmbitionBuff.png differ diff --git a/Changes/BossKillListener.cs b/Changes/BossKillListener.cs index ff52c40..e43d4b1 100644 --- a/Changes/BossKillListener.cs +++ b/Changes/BossKillListener.cs @@ -83,6 +83,12 @@ public class BossKillListener : GlobalNPC { Color.MediumPurple, player.whoAmI ); + } else if (modPlayer.WarriorAmbition && modPlayer.WarriorAmbitions.Add(bossKey)) { + ChatHelper.SendChatMessageToClient( + NetworkText.FromLiteral("Your Warrior Ambition's potential grows stronger!"), + Color.OrangeRed, + player.whoAmI + ); } } } diff --git a/Items/SummonersAmbition.cs b/Items/SummonersAmbition.cs index 7252c8b..d322ea4 100644 --- a/Items/SummonersAmbition.cs +++ b/Items/SummonersAmbition.cs @@ -25,6 +25,11 @@ public class SummonersAmbition : ModItem { Item.noUseGraphic = true; ItemID.Sets.ShimmerTransformToItem[Type] = 0; } + + public override bool CanAccessoryBeEquippedWith(Item equippedItem, Item incomingItem, Player player) { + YhtPlayer modPlayer = player.GetModPlayer(); + return !modPlayer.hasAmbitionEquipped() && base.CanAccessoryBeEquippedWith(equippedItem, incomingItem, player); + } public override void UpdateAccessory(Player player, bool hideVisual) { YhtPlayer modPlayer = player.GetModPlayer(); diff --git a/Items/WarriorsAmbition.cs b/Items/WarriorsAmbition.cs new file mode 100644 index 0000000..c645566 --- /dev/null +++ b/Items/WarriorsAmbition.cs @@ -0,0 +1,151 @@ +using System.Collections.Generic; +using System.Linq; +using Terraria; +using Terraria.GameContent.Creative; +using Terraria.ID; +using Terraria.Localization; +using Terraria.ModLoader; +using YHTMod.Changes; + +namespace YHTMod.Items; + +public class WarriorsAmbition : ModItem { + public override void SetStaticDefaults() { + CreativeItemSacrificesCatalog.Instance.SacrificeCountNeededByItemId[Type] = 1; + } + + public override LocalizedText Tooltip => Language.GetText(""); + + public override void SetDefaults() { + Item.width = 32; + Item.height = 32; + Item.accessory = true; + Item.rare = ItemRarityID.White; + Item.noMelee = true; + Item.noUseGraphic = true; + ItemID.Sets.ShimmerTransformToItem[Type] = 0; + } + + public override bool CanAccessoryBeEquippedWith(Item equippedItem, Item incomingItem, Player player) { + YhtPlayer modPlayer = player.GetModPlayer(); + return !modPlayer.hasAmbitionEquipped() && base.CanAccessoryBeEquippedWith(equippedItem, incomingItem, player); + } + + public override void UpdateAccessory(Player player, bool hideVisual) { + YhtPlayer modPlayer = player.GetModPlayer(); + modPlayer.SummonerAmbition = true; + } + + public override void ModifyTooltips(List tooltips) { + YhtPlayer player = Main.LocalPlayer.GetModPlayer(); + tooltips.Add(new TooltipLine(Mod, "WarriorsAmbition", + Language.GetTextValue("Mods.YHTMod.Items.WarriorAmbition.Tooltip"))); + + if (player.SummonerAmbitions.Contains("king_slime")) { + float bonus = 5f; + if (ModLoader.HasMod("CalamityMod")) { + bonus = 2.5f; + } + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionKingSlime", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.KingSlime", bonus))); + } + + if (ModLoader.HasMod("CalamityMod") && player.WarriorAmbitions.Contains("desert_scourge")) { + int id = CalamityHelper.GetBossIconId("desert_scourge"); + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionDesertScourge", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.DesertScourge", "[i:" + id + "]"))); + } + + if (player.WarriorAmbitions.Contains("eye_of_cthulhu")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionEyeOfCthulhu", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.EyeOfCthulhu"))); + } + + if (ModLoader.HasMod("CalamityMod") && player.WarriorAmbitions.Contains("crabulon")) { + int id = CalamityHelper.GetBossIconId("crabulon"); + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionCrabulon", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.Crabulon", "[i:" + id + "]"))); + } + + if (player.WarriorAmbitions.Contains("deerclops")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionDeerclops", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.Deerclops"))); + } + + if (player.WarriorAmbitions.Contains("eater_of_worlds")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionEaterOfWorlds", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.EaterOfWorlds"))); + } + + if (player.WarriorAmbitions.Contains("brain_of_cthulhu")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionBrainOfCthulhu", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.BrainOfCthulhu"))); + } + + if (ModLoader.HasMod("CalamityMod") && player.WarriorAmbitions.Contains("perforators")) { + int id = CalamityHelper.GetBossIconId("perforators"); + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionPerforators", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.Perforators", "[i:" + id + "]"))); + } + + if (ModLoader.HasMod("CalamityMod") && player.WarriorAmbitions.Contains("hive_mind")) { + int id = CalamityHelper.GetBossIconId("hive_mind"); + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionHiveMind", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.HiveMind", "[i:" + id + "]"))); + } + + if (player.WarriorAmbitions.Contains("queen_bee")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionQueenBee", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.QueenBee"))); + } + + if (player.WarriorAmbitions.Contains("skeletron")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionSkeletron", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.Skeletron"))); + } + + if (player.WarriorAmbitions.Contains("wall_of_flesh")) { + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionWallOfFlesh", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.WallOfFlesh"))); + } + + if (ModLoader.HasMod("CalamityMod") && player.WarriorAmbitions.Contains("slime_god")) { + int id = CalamityHelper.GetBossIconId("slime_god"); + tooltips.Add(new TooltipLine(Mod, "WarriorAmbitionSlimeGod", + Language.GetTextValue("Mods.YHTMod.Items.WarriorsAmbition.SlimeGod", "[i:" + id + "]"))); + } + } + + public override void AddRecipes() { + + } + + private static bool IsPreHardmodeRealized(Player player) { + YhtPlayer modPlayer = player.GetModPlayer(); + + HashSet bossesToCheck = [ + "king_slime", + "eye_of_cthulhu", + "deerclops", + "queen_bee", + "skeletron", + "wall_of_flesh" + ]; + + if (!modPlayer.WarriorAmbitions.Contains("eater_of_worlds") && !modPlayer.WarriorAmbitions.Contains("brain_of_cthulhu")) { + return false; + } + + if (ModLoader.HasMod("CalamityMod")) { + bossesToCheck.Add("desert_scourge"); + bossesToCheck.Add("crabulon"); + bossesToCheck.Add("slime_god"); + + if (!modPlayer.WarriorAmbitions.Contains("perforators") && !modPlayer.WarriorAmbitions.Contains("hive_mind")) { + return false; + } + } + + return bossesToCheck.All(boss => modPlayer.WarriorAmbitions.Contains(boss)); + } +} diff --git a/Items/WarriorsAmbition.png b/Items/WarriorsAmbition.png new file mode 100644 index 0000000..8e27abd Binary files /dev/null and b/Items/WarriorsAmbition.png differ diff --git a/Localization/en-US_Mods.YHTMod.hjson b/Localization/en-US_Mods.YHTMod.hjson index 6cab375..04cc4a5 100644 --- a/Localization/en-US_Mods.YHTMod.hjson +++ b/Localization/en-US_Mods.YHTMod.hjson @@ -27,6 +27,16 @@ Buffs: { And smell like mushrooms. ''' } + + WarriorAmbitionBuff: { + DisplayName: Warrior's Ambition + Description: + ''' + Your power grows with your ambition + + Essences absorbed: {0} + ''' + } } Items: { @@ -97,6 +107,30 @@ Items: { SlimeGod: "{0} 10% increased whip size" PreHardmodeRealized: Fully realized. Seek greater heights. } + + WarriorsAmbition: { + DisplayName: Warriors Ambition + Tooltip: + ''' + Grants Warrior's Ambition. + "For those who wish to face enemy head on." + {0} defense + ''' + KingSlime: "[i:560] {0}% increased true melee weapon size" + DesertScourge: "{0} Increases maximum life by 10" + EyeOfCthulhu: "[i:43] Increases melee damage by 10%" + Crabulon: "{0} Enemies struck by whips glow slightly" + EaterOfWorlds: "[i:70] Melee damage penetrates 5 armor" + BrainOfCthulhu: "[i:1331] 5% increased true melee damage" + HiveMind: "{0} defense" + Perforators: "{0} defense" + QueenBee: "[i:1133] Damaging debuffs expire 5% faster on you" + Deerclops: "[i:5120] Melee hits can throw debris" + Skeletron: "[i:4801] Increases melee knockback" + WallOfFlesh: "[i:267] +5 defense" + SlimeGod: "{0} 2.5% increased true melee weapon size" + PreHardmodeRealized: Fully realized. Seek greater heights. + } } Projectiles: { diff --git a/YhtPlayer.cs b/YhtPlayer.cs index bd63f0f..0845082 100644 --- a/YhtPlayer.cs +++ b/YhtPlayer.cs @@ -15,11 +15,13 @@ public class YhtPlayer : ModPlayer { public bool SummonerAmbition = false; + public bool WarriorAmbition = false; /** * Set of boss and event ids for unlocking perks from Summoner's Ambition accessory */ public HashSet SummonerAmbitions = []; + public HashSet WarriorAmbitions = []; public override void PreUpdate() { KatanaTeleportCooldown = Math.Max(KatanaTeleportCooldown - 1, 0); @@ -61,23 +63,39 @@ public class YhtPlayer : ModPlayer { Player.whipRangeMultiplier += 0.1f; } } + if (WarriorAmbition) { + Player.AddBuff(ModContent.BuffType(), 1); + } + } + + public bool hasAmbitionEquipped() { + if (SummonerAmbition) return true; + if (WarriorAmbition) return true; + return false; } public override void ResetEffects() { ArcaneMissile = 0; SummonerAmbition = false; + WarriorAmbition = false; base.ResetEffects(); } public override void SaveData(TagCompound tag) { tag["summonerAmbitions"] = new List(SummonerAmbitions); + tag["warriorAmbitions"] = new List(WarriorAmbitions); } public override void LoadData(TagCompound tag) { - if (!tag.ContainsKey("summonerAmbitions")) return; - IList list = tag.GetList("summonerAmbitions"); - SummonerAmbitions = new HashSet(list); + if (tag.ContainsKey("summonerAmbitions")) { + IList list = tag.GetList("summonerAmbitions"); + SummonerAmbitions = new HashSet(list); + } + if (tag.ContainsKey("warriorAmbitions")) { + IList warriorList = tag.GetList("warriorAmbitions"); + WarriorAmbitions = new HashSet(warriorList); + } } public int GetSummonersAmbitionMinionBonus() { @@ -88,4 +106,14 @@ public class YhtPlayer : ModPlayer { return amount; } + + public int GetWarriorsAmbitionDefenseBonus() { + int amount = 2; + + if (WarriorAmbitions.Contains("wall_of_flesh")) { + amount += 5; + } + + return amount; + } }