From 4aebc3a2614b16ec6de9c40f2e50b03e1d38fc5a Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Wed, 28 Jan 2026 18:22:14 +0100 Subject: [PATCH] warrior's ambition item setup and locale --- Buffs/WarriorAmbitionBuff.cs | 31 ++++++ Buffs/WarriorAmbitionBuff.png | Bin 0 -> 3266 bytes Changes/BossKillListener.cs | 6 ++ Items/SummonersAmbition.cs | 5 + Items/WarriorsAmbition.cs | 151 +++++++++++++++++++++++++++ Items/WarriorsAmbition.png | Bin 0 -> 1605 bytes Localization/en-US_Mods.YHTMod.hjson | 34 ++++++ YhtPlayer.cs | 34 +++++- 8 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 Buffs/WarriorAmbitionBuff.cs create mode 100644 Buffs/WarriorAmbitionBuff.png create mode 100644 Items/WarriorsAmbition.cs create mode 100644 Items/WarriorsAmbition.png 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 0000000000000000000000000000000000000000..3677becad61d5f9fc73a57a12771e267009ef1a5 GIT binary patch literal 3266 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 zegr}jL(); + 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 0000000000000000000000000000000000000000..8e27abd25ffe5a235cd453245f769665207c24f3 GIT binary patch literal 1605 zcmV-L2DCXyg~w8X4Jtb%_#arXV8H@SX2p^PtoRSu zfP@MX1>`XxN}GyJ8|6nsX&c#OJf2C$^XvV*k9%e`$cgQVs}{JL^X_}^+;hI)bMC$8 zzA^bfxBm%&*VY^5)8hQx35>y{AIl$ZFVy7zBod!1fukT^YE(pA#rD_N>(_vf-;G6)74@}3FpQxgzS5doH{Wq!THM8I>Y!D`cE z{V;_llu z(NB^y6Oe@^QQCI4?dHsiqbM)8UCswyW#y5}tF0m%%Hv^QadWv(oHuGMFDgr>J`(|n zTGAZn+4K{$Jlk-#to)*2>ok~E!Wv=bO zsI0au~@n4QG6bWj6ogt8;U_*@gNt|@lytNQVnc{*nS#tjn6Rx@=^|w#VA+F z87Xr*rPCL|Er|xwaMatn(z!Y_sm_2z9foRCGAAU)G8#GgdW?Xn50gUQDlbP4i@_AL zUxdO6*i)nQt90bBZ>M@!xJ+dhg~Z%0ICi<|B^9w3Icp|No@ldyTkH90Z4hU8p+VAP znEKot!^JoIG89dd3#rS6j!UU$laEaL&x@N8l8|UxGEg1uwL6OzY@Zx*^Z>EaroO&WMAX8H~?{vt+^4?jQS&jU=)xfp)u1 z{VfRFPr6FMSVIUx$^;C5kPBQj(AhdiaMHrP$dNUy@bn zPZRT~LZTOgC^0tY2M&9=n0uv^NJlS)r}Z9K9!%?EH1`z^{2F}e2O}aEFVAtloWr@E7pWFCo^1Y`q@5MaXG6 z{|&hMV_3ZGF&AVQHX`M0z_2zjp&cV2V`U-6rXsWy{esOyU6@+VArEiy9}>NPLQhYL z5V5Bi?hyaH-XSbuWKari5>q|3B%eq?NZ5*Mm}LZ{bUmA%qd0I{LlW=(1m5}KC>#5K z8D+#N!3*C8PjA_4YL?l2P$@nwTdk#OT-e7OqQ)?bR{_%)aX4 zGWM# zh$H`js~#k^=5);7OvoK?z^)Yy<>TU@x;qu}aVcQei)tN1ZHfID=(K(!0RbNy z%FdAc$Vzv*MpFINojF4Yz46ifu$Srj?cD_6`!n00v1!K~w_(OjopDbuN 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; + } }