From 65690a59f59b632edf1e3b10702dd36a2d4cde25 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Sat, 3 Jan 2026 03:42:54 +0100 Subject: [PATCH] test implementation of ambition upgrade system --- Buffs/SummonerAmbitionBuff.cs | 37 +++++++++ Buffs/SummonerAmbitionBuff.png | Bin 0 -> 3266 bytes Changes/BossKillListener.cs | 58 ++++++++++++++ Items/SummonersAmbition.cs | 115 +++++++++++++++++++++++++++ Items/SummonersAmbition.png | Bin 0 -> 1605 bytes Localization/en-US_Mods.YHTMod.hjson | 39 +++++++++ YhtPlayer.cs | 48 ++++++++++- 7 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 Buffs/SummonerAmbitionBuff.cs create mode 100644 Buffs/SummonerAmbitionBuff.png create mode 100644 Changes/BossKillListener.cs create mode 100644 Items/SummonersAmbition.cs create mode 100644 Items/SummonersAmbition.png diff --git a/Buffs/SummonerAmbitionBuff.cs b/Buffs/SummonerAmbitionBuff.cs new file mode 100644 index 0000000..4dea666 --- /dev/null +++ b/Buffs/SummonerAmbitionBuff.cs @@ -0,0 +1,37 @@ +using Terraria; +using Terraria.Localization; +using Terraria.ModLoader; + +namespace YHTMod.Buffs; + +public class SummonerAmbitionBuff : 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) + { + var modPlayer = Main.LocalPlayer.TryGetModPlayer(out var mp) ? mp : null; + if (modPlayer == null) return; + + tip = Language.GetTextValue("Mods.YHTMod.Buffs.SummonerAmbitionBuff.Description", modPlayer.SummonerAmbitionCrafts.Count); + } + + public override void Update(Player player, ref int buffIndex) + { + var modPlayer = player.GetModPlayer(); + + if (modPlayer.SummonerAmbition) + { + player.buffTime[buffIndex] = 18000; + } + else + { + player.DelBuff(buffIndex); + buffIndex--; + } + } +} diff --git a/Buffs/SummonerAmbitionBuff.png b/Buffs/SummonerAmbitionBuff.png new file mode 100644 index 0000000000000000000000000000000000000000..3677becad61d5f9fc73a57a12771e267009ef1a5 GIT binary patch literal 3266 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 zegr}jL(); + if (!npc.playerInteraction[player.whoAmI]) continue; + if (modPlayer.KilledBosses.Add(bossKey)) + { + ChatHelper.SendChatMessageToClient( + NetworkText.FromLiteral("Your Ambition's potential grows stronger!"), + Color.MediumPurple, + player.whoAmI + ); + } + } + } +} diff --git a/Items/SummonersAmbition.cs b/Items/SummonersAmbition.cs new file mode 100644 index 0000000..e0c01ee --- /dev/null +++ b/Items/SummonersAmbition.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using Terraria; +using Terraria.GameContent.Creative; +using Terraria.ID; +using Terraria.Localization; +using Terraria.ModLoader; + +namespace YHTMod.Items; + +public class SummonersAmbition : 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 void UpdateAccessory(Player player, bool hideVisual) + { + var modPlayer = player.GetModPlayer(); + modPlayer.SummonerAmbition = true; + modPlayer.HasAmbition = true; + } + + public override void ModifyTooltips(List tooltips) + { + var player = Main.LocalPlayer.GetModPlayer(); + tooltips.Add(new TooltipLine(Mod, "SummonerAmbition", Language.GetTextValue("Mods.YHTMod.Items.SummonersAmbition.Tooltip", player.GetSummonersAmbitionMinionBonus()))); + + if (player.KilledBosses.Contains("king_slime")) + { + tooltips.Add(new TooltipLine(Mod, "SummonerAmbitionKingSlime", Language.GetTextValue("Mods.YHTMod.Items.SummonersAmbition.KingSlime"))); + } + + } + + public override void AddRecipes() + { + CreateRecipe() + .AddIngredient(ItemID.Rope, 5) + .AddIngredient(ItemID.Squirrel) + .AddIngredient(ItemID.Acorn, 25) + .AddTile(TileID.WorkBenches) + .Register(); + + #region Upgrades + + CreateRecipe() + .AddIngredient(this) + .AddTile(TileID.DemonAltar) + .AddIngredient(ItemID.Gel, 250) + .AddCondition(new Condition( + Language.GetText("Mods.YHTMod.Recipes.Ambitions.KingSlimeDead"), + () => + { + var player = Main.LocalPlayer.GetModPlayer(); + return player.KilledBosses.Contains("king_slime") && !player.SummonerAmbitionCrafts.Contains("king_slime"); + }) + ) + .AddOnCraftCallback((recipe, item, consumed, destination) => + { + Main.LocalPlayer.GetModPlayer().SummonerAmbitionCrafts.Add("king_slime"); + }) + .Register(); + + CreateRecipe() + .AddIngredient(this) + .AddTile(TileID.DemonAltar) + .AddIngredient(ItemID.Lens, 100) + .AddCondition(new Condition(Language.GetText( + "Mods.YHTMod.Recipes.Ambitions.EyeOfCthulhuDead"), + () => + { + var player = Main.LocalPlayer.GetModPlayer(); + return player.KilledBosses.Contains("eye_of_cthulhu") && !player.SummonerAmbitionCrafts.Contains("eye_of_cthulhu"); + }) + ) + .AddOnCraftCallback((recipe, item, consumed, destination) => + { + Main.LocalPlayer.GetModPlayer().SummonerAmbitionCrafts.Add("eye_of_cthulhu"); + }) + .Register(); + + CreateRecipe() + .AddIngredient(this) + .AddTile(TileID.DemonAltar) + .AddIngredient(ItemID.Bone, 250) + .AddCondition(new Condition(Language.GetText( + "Mods.YHTMod.Recipes.Ambitions.SkeletronDead"), + () => { + var player = Main.LocalPlayer.GetModPlayer(); + return player.KilledBosses.Contains("skeletron") && !player.SummonerAmbitionCrafts.Contains("skeletron"); + }) + ) + .AddOnCraftCallback((recipe, item, consumed, destination) => + { + Main.LocalPlayer.GetModPlayer().SummonerAmbitionCrafts.Add("skeletron"); + }) + .Register(); + + #endregion + } +} diff --git a/Items/SummonersAmbition.png b/Items/SummonersAmbition.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 KilledBosses = []; + + public HashSet SummonerAmbitionCrafts = []; + public override void PreUpdate() { KatanaTeleportCooldown = Math.Max(KatanaTeleportCooldown - 1, 0); } + public override void PostUpdateMiscEffects() + { + if (SummonerAmbition) + { + Player.AddBuff(ModContent.BuffType(), 1); + Player.maxMinions += GetSummonersAmbitionMinionBonus(); + } + } + public override void ResetEffects() { ArcaneMissile = 0; + HasAmbition = false; + SummonerAmbition = false; base.ResetEffects(); } -} \ No newline at end of file + + public override void SaveData(TagCompound tag) + { + tag["killedBosses"] = new List(KilledBosses); + tag["summonerAmbitions"] = new List(SummonerAmbitionCrafts); + } + + public override void LoadData(TagCompound tag) + { + if (tag.ContainsKey("killedBosses")) + { + var list = tag.GetList("killedBosses"); + KilledBosses = new HashSet(list); + } + if (tag.ContainsKey("summonerAmbitions")) + { + var list = tag.GetList("summonerAmbitions"); + SummonerAmbitionCrafts = new HashSet(list); + } + } + + public int GetSummonersAmbitionMinionBonus() + { + return SummonerAmbitionCrafts.Count / 3 + 1; + } +}