From f6d187274ce4cccfda35ef9d2e382ccea05cc2c6 Mon Sep 17 00:00:00 2001 From: Niko Date: Fri, 21 Nov 2025 23:31:03 +0000 Subject: [PATCH] Added Trident of the Sunken --- Assets/PlaceholderEntity.png | Bin 0 -> 17131 bytes Assets/PlaceholderItem.png | Bin 0 -> 4309 bytes Assets/PlaceholderProj.png | Bin 0 -> 2547 bytes Assets/PlaceholderTile.png | Bin 0 -> 4839 bytes .../Items/Weapons/Magic/TridentOfTheSunken.cs | 48 +++++ .../Weapons/Magic/TridentOfTheSunken.png | Bin 0 -> 34484 bytes .../TridentOfTheSunkenBlast.cs | 51 +++++ .../TridentOfTheSunkenHoldout.cs | 181 ++++++++++++++++++ .../TridentOfTheSunkenShot.cs | 106 ++++++++++ .../TridentOfTheSunkenShot.png | Bin 0 -> 1767 bytes .../en-US_Mods.ForgottenWawiTech.hjson | 13 ++ SPRITES_TODO.md | 7 + description.txt | 1 + description_workshop.txt | 1 + 14 files changed, 408 insertions(+) create mode 100644 Assets/PlaceholderEntity.png create mode 100644 Assets/PlaceholderItem.png create mode 100644 Assets/PlaceholderProj.png create mode 100644 Assets/PlaceholderTile.png create mode 100644 Content/Items/Weapons/Magic/TridentOfTheSunken.cs create mode 100644 Content/Items/Weapons/Magic/TridentOfTheSunken.png create mode 100644 Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenBlast.cs create mode 100644 Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenHoldout.cs create mode 100644 Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.cs create mode 100644 Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.png diff --git a/Assets/PlaceholderEntity.png b/Assets/PlaceholderEntity.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc2600fd740bd624cab8cac7a421c233eb4bb46 GIT binary patch literal 17131 zcmeI4L2FY%5Xa}0YPF#v6t##*K@bE558|PCNl0mONU*^kyj27}=%Jws;-#T@um|xf z($64x75V{s>D`+i1ob0`pu4S8UdC)^Hko~SYTb)xZ0`$e0*E^{osV@&p&K*S^zJv z0`y)1{4$q%-vOTA1o*iMu<#Dx!rJzy#!z8xOLsZ#_|Xze zg=tTf(D4$n&VVr1*m9{WT z#x^A2YfD?0Zz0s*dsn0?(ltoOX+qlfy&wI#Jkb&>U164pZAjLVu?_oDTe`xe56<~H z*H~UP8)O*Oxa9e`G@s<&qkN7Zv7^)&$C&SoDKoK+*|X-`2nXK<7>AZAXS@p7ozFI| z!UHefkBfujWnORij6+%PPj}xel$L9!lln>XCt^~is2?SP#!z8xOLsZ#_|Xzeg=tTf(D4$n&7vC zNR=Cvkn4VFe(F~Yv8S)Q<~IW-uG!xOa8(fS`r!`g%0X43bY1spU-x~EV(4jCDTsGz V?@Ra1*776k+FWecKh#z?{{kZ;4*LKA literal 0 HcmV?d00001 diff --git a/Assets/PlaceholderItem.png b/Assets/PlaceholderItem.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1129715be47431e9492dc3d95ade0bbc55fe58 GIT binary patch literal 4309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NSwSk3J%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10g0sLQ zvY3H^TNs2H8D`Cq01C2~c>21szvLDbQ(>NaNV0>0K|tHn#W5s;lTkt7{(DBC65_xH zhX2GVgsKW)Aj)hek_@GRV#2P3`P`pG+cy#y5`#Dd$n`mTKoJOuK^Owm@;Q+qF^EEd zRz4>X5`!QFi1hh?XhF!x2rW9$%0)u*=mEh1%^d?C0xTFV!yy3oIhpb}v@r~w5Fl6= zqNNF3K1LTG@DLbvz-R~%4gpZXN4VXDp12`;h|ova0hmTpRRrNiLUjU6C87LINF7=W zX%K|~EMSQZ37C3x8dnIR`5dNg5QYHEX@o)orj8Je!{;z2Xk{16BM jm{VaP0pk;*hf44GZm;G?ui5U$LH_Y{^>bP0l+XkK3Aj{u literal 0 HcmV?d00001 diff --git a/Assets/PlaceholderProj.png b/Assets/PlaceholderProj.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb1f3122c10a9b5019665ad22a04eb28ee30f54 GIT binary patch literal 2547 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRl!3HEF|MgV^DaPU;cPGZ1Cw1z99F}xPUq=Rp zjs4tz5?O(Kg=CK)Uj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C-z_ z@Q5sCVBi)8VMc~ob0mO*>?NMQuIw+lMa5La+a=C^1uFCOba4#v;AOPqJot_AKLZ00 z0bKz`U=ElM5*tVWa}Uf7Ofbe^r&(YQtb&FtjL)zM&Vn%f(D>-`Flm@Nm^_($^q3xc zAqoo+3>sI6z!bvdVSFmnu#g=_A&Q>X&_fI+4-=zopr E0DM|TE&u=k literal 0 HcmV?d00001 diff --git a/Assets/PlaceholderTile.png b/Assets/PlaceholderTile.png new file mode 100644 index 0000000000000000000000000000000000000000..fe84a3271803271be81ac6b1d35dde10936dd49d GIT binary patch literal 4839 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hP^M$BMf5HFasE6@fg!CBxD zSp1Vdg;jLnuVheE{Kg`^r8zN{vAesvcAsitAGiT7G5k^>94|5r*G^MpK%)UVrA}|My(y$O1O(U?7 zfYG=UD=6P%%lo8?!)(H(4=Rt_Aut2zMB{Fcz#ISz6<7%gqha!dXqbMOIv5|#oIxBS zFqh(RIXvCK)WLj8h$f(Z5QhjMpW%{+`4~MUafzduGiX9&v}8q#8HPaEYxaY ip$9dwe3<=%CPY||IOUzXIv+GR#o+1c=d#Wzp$PzTeQX~9 literal 0 HcmV?d00001 diff --git a/Content/Items/Weapons/Magic/TridentOfTheSunken.cs b/Content/Items/Weapons/Magic/TridentOfTheSunken.cs new file mode 100644 index 0000000..0c8f9b9 --- /dev/null +++ b/Content/Items/Weapons/Magic/TridentOfTheSunken.cs @@ -0,0 +1,48 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.ID; +using Terraria.ModLoader; +using ForgottenWawiTech.Content.Projectiles.TridentOfTheSunken; + +namespace ForgottenWawiTech.Content.Items.Weapons.Magic +{ + public class TridentOfTheSunken : ModItem + { + public override void SetStaticDefaults() + { + Item.ResearchUnlockCount = 1; + } + + public override void SetDefaults() + { + Item.damage = 5000; + Item.DamageType = DamageClass.Magic; + Item.knockBack = 6f; + Item.width = 64; + Item.height = 64; + Item.useStyle = ItemUseStyleID.Shoot; + Item.useAnimation = 30; + Item.useTime = 30; + Item.noMelee = true; + Item.noUseGraphic = true; + Item.channel = true; + Item.mana = 24; + Item.rare = ItemRarityID.Red; + Item.value = Item.buyPrice(platinum: 3); + Item.UseSound = SoundID.Item43; + Item.shoot = ModContent.ProjectileType(); + Item.shootSpeed = 0f; + } + + public override bool CanUseItem(Player player) + { + return player.ownedProjectileCounts[Item.shoot] == 0; + } + + public override void HoldItem(Player player) + { + Lighting.AddLight(player.Center, new Vector3(0.05f, 0.12f, 0.2f)); + } + } +} diff --git a/Content/Items/Weapons/Magic/TridentOfTheSunken.png b/Content/Items/Weapons/Magic/TridentOfTheSunken.png new file mode 100644 index 0000000000000000000000000000000000000000..67c90380d94eacacc2818e0c2a71a0c109995eca GIT binary patch literal 34484 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 literal 0 HcmV?d00001 diff --git a/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenBlast.cs b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenBlast.cs new file mode 100644 index 0000000..79b6d56 --- /dev/null +++ b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenBlast.cs @@ -0,0 +1,51 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; + +namespace ForgottenWawiTech.Content.Projectiles.TridentOfTheSunken +{ + public class TridentOfTheSunkenBlast : ModProjectile + { + public override string Texture => "Terraria/Images/Projectile_647"; // Duke Fishron bubble burst as placeholder + + public override void SetDefaults() + { + Projectile.width = 10; + Projectile.height = 10; + Projectile.friendly = true; + Projectile.hostile = false; + Projectile.DamageType = DamageClass.Magic; + Projectile.timeLeft = 2; + Projectile.penetrate = -1; + Projectile.tileCollide = false; + Projectile.ignoreWater = true; + Projectile.usesLocalNPCImmunity = true; + Projectile.localNPCHitCooldown = -1; + Projectile.alpha = 255; + } + + public override void AI() + { + if (Projectile.localAI[0] <= 0f) + { + Projectile.localAI[0] = 320f; // default radius if not provided + } + + float radius = Projectile.localAI[0]; + Projectile.position = Projectile.Center - new Vector2(radius); + Projectile.width = Projectile.height = (int)(radius * 2f); + Projectile.Center = Projectile.position + new Vector2(radius); + + Lighting.AddLight(Projectile.Center, 0.2f, 0.35f, 0.8f); + } + + public override void OnHitNPC(NPC target, NPC.HitInfo hit, int damageDone) + { + target.AddBuff(BuffID.Suffocation, 600); + } + + public override bool? CanDamage() => true; + } +} diff --git a/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenHoldout.cs b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenHoldout.cs new file mode 100644 index 0000000..89a0479 --- /dev/null +++ b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenHoldout.cs @@ -0,0 +1,181 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; + +namespace ForgottenWawiTech.Content.Projectiles.TridentOfTheSunken +{ + public class TridentOfTheSunkenHoldout : ModProjectile + { + private const int MaxChargeTime = 60; + private const int RequiredChargeTime = 60; + // Slight offsets so the player grips the center of the sprite instead of the trident hovering ahead. + private const float HoldoutForwardOffset = 12f; + private const float HoldoutVerticalOffset = -6f; + + private ref float Charge => ref Projectile.ai[0]; + private ref float HasFired => ref Projectile.ai[1]; + + public override string Texture => "ForgottenWawiTech/Content/Items/Weapons/Magic/TridentOfTheSunken"; + + public override void SetDefaults() + { + Projectile.width = 30; + Projectile.height = 256; + Projectile.friendly = false; + Projectile.hostile = false; + Projectile.penetrate = -1; + Projectile.tileCollide = false; + Projectile.ignoreWater = true; + } + + public override void AI() + { + Player player = Main.player[Projectile.owner]; + int tridentType = ModContent.ItemType(); + if (player.dead || player.HeldItem.type != tridentType) + { + Projectile.Kill(); + return; + } + + Vector2 handPosition = player.RotatedRelativePoint(player.MountedCenter, true); + player.heldProj = Projectile.whoAmI; + player.itemAnimation = player.itemTime = 2; + + Vector2 aim = Projectile.velocity; + if (Main.myPlayer == player.whoAmI) + { + aim = Main.MouseWorld - handPosition; + if (aim.LengthSquared() < 0.01f) + { + aim = new Vector2(player.direction, 0f); + } + aim.Normalize(); + + player.ChangeDir(aim.X >= 0f ? 1 : -1); + Projectile.velocity = aim; + } + + Vector2 anchorOffset = new Vector2(player.direction * HoldoutForwardOffset, HoldoutVerticalOffset * player.gravDir); + Projectile.Center = handPosition + anchorOffset; + + Projectile.direction = player.direction; + Projectile.spriteDirection = player.direction; + Projectile.rotation = 0f; + + if (player.channel) + { + Charge = MathHelper.Clamp(Charge + 1f, 0f, MaxChargeTime); + if (Charge == RequiredChargeTime) + { + ReadyFeedback(player); + } + else if (Charge % 15f == 0f) + { + SoundEngine.PlaySound(SoundID.Item15 with { Volume = 0.3f }, player.Center); + } + } + else if (HasFired == 0f) + { + if (Main.myPlayer == player.whoAmI && Charge >= RequiredChargeTime) + { + FireProjectile(player, handPosition); + } + else + { + CancelCharge(player); + } + } + + Projectile.timeLeft = 2; + } + + public override void Kill(int timeLeft) + { + if (HasFired == 0f && Main.player[Projectile.owner] is Player player && player.active && !player.dead) + { + Vector2 handPosition = player.RotatedRelativePoint(player.MountedCenter, true); + if (Main.myPlayer == player.whoAmI && Charge >= RequiredChargeTime) + { + FireProjectile(player, handPosition); + } + else if (Charge < RequiredChargeTime) + { + CancelCharge(player, false); + } + } + } + + private void FireProjectile(Player player, Vector2 spawnPosition) + { + if (Charge < RequiredChargeTime) + { + CancelCharge(player); + return; + } + + Vector2 aim = Projectile.velocity; + if (aim.LengthSquared() < 0.01f) + { + aim = new Vector2(player.direction, 0f); + } + aim.Normalize(); + + float chargeProgress = MathHelper.Clamp(Charge / MaxChargeTime, 0f, 1f); + float speed = MathHelper.Lerp(7f, 12f, chargeProgress); + + int baseDamage = player.GetWeaponDamage(player.HeldItem); + int damage = (int)(baseDamage * MathHelper.Lerp(1f, 1.6f, chargeProgress)); + float knockBack = player.GetWeaponKnockback(player.HeldItem, player.HeldItem.knockBack) * MathHelper.Lerp(1f, 1.2f, chargeProgress); + + IEntitySource source = player.GetSource_ItemUse(player.HeldItem); + int proj = Projectile.NewProjectile(source, spawnPosition, aim * speed, ModContent.ProjectileType(), damage, knockBack, player.whoAmI, chargeProgress); + + if (Main.projectile.IndexInRange(proj)) + { + Main.projectile[proj].localAI[0] = chargeProgress; + } + + SoundEngine.PlaySound(SoundID.Item72 with { Volume = 0.8f }, spawnPosition); + HasFired = 1f; + Projectile.netUpdate = true; + Projectile.Kill(); + } + + private void ReadyFeedback(Player player) + { + if (Main.dedServ) + { + return; + } + + SoundEngine.PlaySound(SoundID.Item33 with { Volume = 0.6f, Pitch = -0.1f }, Projectile.Center); + + for (int i = 0; i < 8; i++) + { + Vector2 velocity = Main.rand.NextVector2Circular(1.2f, 1.2f) * Main.rand.NextFloat(0.8f, 1.4f); + Dust dust = Dust.NewDustDirect(Projectile.Center - new Vector2(5f, 85f), 16, 16, DustID.BlueFairy, velocity.X, velocity.Y, 100, default, 1.1f); + dust.noGravity = true; + } + } + + private void CancelCharge(Player player, bool killProjectile = true) + { + if (HasFired != 0f) + { + return; + } + + HasFired = -1f; + Projectile.netUpdate = true; + SoundEngine.PlaySound(SoundID.MenuClose with { Volume = 0.6f }, player.Center); + if (killProjectile && Projectile.active) + { + Projectile.Kill(); + } + } + } +} diff --git a/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.cs b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.cs new file mode 100644 index 0000000..f0921c7 --- /dev/null +++ b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.cs @@ -0,0 +1,106 @@ +using System; +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.ID; +using Terraria.ModLoader; + +namespace ForgottenWawiTech.Content.Projectiles.TridentOfTheSunken +{ + public class TridentOfTheSunkenShot : ModProjectile + { + private const float ExplosionRadiusBlocks = 20f; + private const int ExplosionDamage = 5000; + private const int DrownDuration = 600; // 10 seconds + + private bool HasDetonated + { + get => Projectile.localAI[1] == 1f; + set => Projectile.localAI[1] = value ? 1f : 0f; + } + + public override void SetDefaults() + { + Projectile.width = 256; + Projectile.height = 30; + Projectile.friendly = true; + Projectile.hostile = false; + Projectile.DamageType = DamageClass.Magic; + Projectile.penetrate = 1; + Projectile.aiStyle = 0; + Projectile.tileCollide = true; + Projectile.ignoreWater = false; + Projectile.extraUpdates = 1; + Projectile.timeLeft = 180; + } + + public override void AI() + { + if (Projectile.velocity.LengthSquared() > 0.0001f) + { + Projectile.direction = Projectile.spriteDirection = Projectile.velocity.X >= 0f ? 1 : -1; + Projectile.rotation = Projectile.velocity.ToRotation(); + if (Projectile.spriteDirection == -1) + { + Projectile.rotation += MathHelper.Pi; + } + } + Lighting.AddLight(Projectile.Center, 0.1f, 0.2f, 0.6f); + + if (Main.rand.NextBool(3)) + { + Dust dust = Dust.NewDustDirect(Projectile.position, Projectile.width, Projectile.height, DustID.WaterCandle, 0f, 0f, 150, default, 1.1f); + dust.velocity *= 0.3f; + dust.noGravity = true; + } + } + + public override bool OnTileCollide(Vector2 oldVelocity) + { + Detonate(); + return true; + } + + public override void OnHitNPC(NPC target, NPC.HitInfo hit, int damageDone) + { + target.AddBuff(BuffID.Suffocation, DrownDuration); + Detonate(); + Projectile.Kill(); + } + + public override void Kill(int timeLeft) + { + Detonate(); + } + + private void Detonate() + { + if (HasDetonated) + { + return; + } + + HasDetonated = true; + + if (Projectile.owner == Main.myPlayer) + { + float radiusPixels = ExplosionRadiusBlocks * 16f; + int explosion = Projectile.NewProjectile(Projectile.GetSource_Death(), Projectile.Center, Vector2.Zero, ModContent.ProjectileType(), ExplosionDamage, 8f, Projectile.owner, radiusPixels); + if (Main.projectile.IndexInRange(explosion)) + { + Main.projectile[explosion].localAI[0] = radiusPixels; + } + } + + SoundEngine.PlaySound(SoundID.Item14 with { Volume = 1f, Pitch = -0.2f }, Projectile.Center); + + for (int i = 0; i < 20; i++) + { + Vector2 velocity = Main.rand.NextVector2Unit() * Main.rand.NextFloat(2f, 6f); + Dust dust = Dust.NewDustDirect(Projectile.position, Projectile.width, Projectile.height, DustID.BlueCrystalShard, velocity.X, velocity.Y, 150, default, 1.2f); + dust.noGravity = true; + } + Projectile.timeLeft = Math.Min(Projectile.timeLeft, 2); + } + } +} diff --git a/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.png b/Content/Projectiles/TridentOfTheSunken/TridentOfTheSunkenShot.png new file mode 100644 index 0000000000000000000000000000000000000000..342a7d9fb9533bbc98f5b140ada5608da43214e4 GIT binary patch literal 1767 zcmah~c{CgN8vR9rG(}@8LA6CXG_`azRT)OAj5VbTsR^P>Y^~VW*s9Ag9ow{{cIu3$ zt+i^6AxukCQd0OTF) zZ7u=;*`ojtm)V<}Ue7xA79{+loi(WG*ZK^A%o7KjvzKEEc^uL$Ra^y2k^VdbNU(%4NpCl^%QjvAm7U(S8u}{5J88ljv>qCAv!+r(ch1E zmvLs?VShCw>%&tyw`RBN5($2}9>^zk$wwR40p% zFz(CGQVQi-y~HRjO1j*yibHe|#DYCV<*xKYS#{muPZ`$@sJo}b3eydT`C3Jbp>smG zH4BytL84Fkf(VyEU19EvTIZP~d{n{-r>@Y{~pDPBlB57Hky!i1HWGEJ4M4#J6@a>chsWG}g#+&1K?B z*+#|3MSlyb_Yl0);kBBQV8B!TszuGMYqawAna;-@Jq2E2vY;+@(VqMUi@U7KoM*}< z>!(ddx~5!e4;=TlAQ9_tKO}LZBz}uRn%hE zaFcCD&bQ0r<(l1_qDX@a^8&8?Nk=ZBM6woZ!xcmhnf6-Pa zsZC^-zT50bgc81myajsovb-AB(eo&XDJat$jZw{JmTWoytNvA{UE)b?|H_<+rTBoR z;T$IUx5^*pQiNR{{j^&1B+K04ZdR}(1Y9~OCk>XwH>`k<%Va!-aW#Mo0gnR*o9FA%)tW0464D&CyvXaK95`bZpbUK0PDOgI_QL;j4L9ZS z1F(p&OthOwa7koKO%st2MS)cunv?H~zy)>kypu}bbA?mf?S%b)uY*nys+SX71Ds@B zC&%(is82s20P~Co44h#{8-Y?g9Fvt0(l!fF zsfmJaM>YmJRJq-xk$eNzB!}k@HCp|`Hp@U!ImI2EXKobBKgK>7>nS7u>yYcFGcgX{ zstC`UkQIae(2=wl7z=S^r#>(G>oKt##$EdK!H1_AiM0)AXcluSFzyhTW_26~_{o%c z2*|rf0>Hz(6(mn|_w#oyQQC(kam$XS4l}hztqOqYZv_u|b|~%pJ8}9vqIQh_+|-C( zu-m=Rwqlh1F`oiSaFx7BO@OYSC>E1ie9MN#*LbnyzeoLyf2clH>o01kcMN!wuV?~2 z;&|=k7}!WVRb5uj`}ODqEjm7Rl6w^cf#jFxLn?C>hw-|&2Fu# zAM}18BkQ@ONd7PYKfa5Hez~wY)i#+XvTM#KUJ;H^vSMc!`hu-08~!d*jPWSuRu$B} zBeYrNcQaJULCh zGR7`m^DXSw&p2^u!|b{i z15(HfoW^a_8KGr+;!4ec%yt6KWT@nE=3~3?39<21^fZyz!8Qn)ThUGZWG?b2K3c>e zcV^WpI`a%uJ5Bmtw$OhJVEcYIvof*ra$oeP9gwR3(fYy9aY3D1bETyp)otE(yI;z- zU+K=-x3Iy&FJQCsd;9jS@>yTI3jNv*Zp2kk7Z_yQA43{?T=h=~KFiDlUn`_%!BOQ1 lsRtP~qs9WM{|`z`#^JlyLsy<0So-?M9Bj|q)L8qZ`~$>bOAn expansion to pre-hardmode and endgame technology

The Forgotten Wawi Tech is a Terraria mod that introduces advanced technology and weaponry inspired by the Avali and Protogen species. This mod adds a variety of new items, weapons, armor, and crafting materials that allow players to harness the power of futuristic technology in their adventures. +Calamity is not required, but highly recommended for the full experience. Aliquip veniam nulla nisi minim do elit dolor. Ea mollit ea velit est incididunt veniam irure commodo sit irure ad eu elit. Quis occaecat dolore dolore id tempor tempor consequat dolor velit sunt ipsum. Ad quis nisi nisi laboris non commodo eu officia.

diff --git a/description_workshop.txt b/description_workshop.txt index 16b1871..55a9fa6 100644 --- a/description_workshop.txt +++ b/description_workshop.txt @@ -2,6 +2,7 @@

An expansion to pre-hardmode and endgame technology

The Forgotten Wawi Tech is a Terraria mod that introduces advanced technology and weaponry inspired by the Avali and Protogen species. This mod adds a variety of new items, weapons, armor, and crafting materials that allow players to harness the power of futuristic technology in their adventures. +Calamity is not required, but highly recommended for the full experience. Aliquip veniam nulla nisi minim do elit dolor. Ea mollit ea velit est incididunt veniam irure commodo sit irure ad eu elit. Quis occaecat dolore dolore id tempor tempor consequat dolor velit sunt ipsum. Ad quis nisi nisi laboris non commodo eu officia.