diff --git a/Content/Items/Materials/AvaliFeather.cs b/Content/Items/Materials/AvaliFeather.cs new file mode 100644 index 0000000..575932a --- /dev/null +++ b/Content/Items/Materials/AvaliFeather.cs @@ -0,0 +1,21 @@ +using Terraria.ID; +using Terraria; +using Terraria.ModLoader; +using ForgottenWawiTech.Content.Rarities; + +namespace ForgottenWawiTech.Content.Items.Materials +{ + public class AvaliFeather : ModItem + { + + public override void SetDefaults() + { + Item.width = 20; + Item.height = 20; + Item.maxStack = 9999; + Item.rare = ModContent.RarityType(); + Item.value = Item.buyPrice(gold: 50); + } + + } +} \ No newline at end of file diff --git a/Content/Items/Materials/AvaliFeather.png b/Content/Items/Materials/AvaliFeather.png new file mode 100644 index 0000000..9e0cf81 Binary files /dev/null and b/Content/Items/Materials/AvaliFeather.png differ diff --git a/Content/Items/Materials/RGBAlloy.cs b/Content/Items/Materials/RGBAlloy.cs index b905168..db16e0f 100644 --- a/Content/Items/Materials/RGBAlloy.cs +++ b/Content/Items/Materials/RGBAlloy.cs @@ -1,4 +1,5 @@ // Animated by British_Raccoon +// and then Axl_The_Protogen using Terraria.ID; using Terraria; using Terraria.ModLoader; @@ -13,7 +14,7 @@ namespace ForgottenWawiTech.Content.Items.Materials { public class RGBAlloy : ModItem { - private const int FRAME_COUNT = 5; + private const int FRAME_COUNT = 7; private const int TICKS_PER_FRAME = 10; public override void SetStaticDefaults() diff --git a/Content/Items/Materials/RGBAlloy.png b/Content/Items/Materials/RGBAlloy.png index 4c9b7a3..5716bac 100644 Binary files a/Content/Items/Materials/RGBAlloy.png and b/Content/Items/Materials/RGBAlloy.png differ diff --git a/Content/Items/Materials/RGBass.cs b/Content/Items/Materials/RGBass.cs index ef4d68c..c7de6dc 100644 --- a/Content/Items/Materials/RGBass.cs +++ b/Content/Items/Materials/RGBass.cs @@ -1,6 +1,8 @@ using Terraria.ID; using Terraria; using Terraria.ModLoader; +using Terraria.DataStructures; +using Microsoft.Xna.Framework; namespace ForgottenWawiTech.Content.Items.Materials { @@ -12,8 +14,37 @@ namespace ForgottenWawiTech.Content.Items.Materials Item.width = 20; Item.height = 20; Item.maxStack = 9999; - Item.rare = ItemRarityID.White; + Item.rare = ItemRarityID.Expert; // temp rarity until custom rarity is added Item.value = Item.buyPrice(gold: 10); } + + public override void OnStack(Item source, int numTransfered) + { + // Mark that RGBass has been obtained in this world + ForgottenWawiTechSystem.hasObtainedRGBass = true; + } + + public override bool OnPickup(Player player) + { + // Mark that RGBass has been obtained in this world + ForgottenWawiTechSystem.hasObtainedRGBass = true; + return true; + } } -} \ No newline at end of file + public class RGBassFishingPlayer : ModPlayer + { + public override void CatchFish(FishingAttempt attempt, ref int itemDrop, ref int npcSpawn, ref AdvancedPopupRequest sonar, ref Vector2 sonarPosition) + { + // Only if Moon Lord has been defeated + if (!NPC.downedMoonlord) + return; + + bool inWater = !attempt.inLava && !attempt.inHoney; + + if (inWater && Main.rand.NextBool(20)) // 5% chance (1 in 20) + { + itemDrop = ModContent.ItemType(); + } + } + } +} diff --git a/Content/Items/Materials/VisorShard.cs b/Content/Items/Materials/VisorShard.cs index 3ce24aa..02eca15 100644 --- a/Content/Items/Materials/VisorShard.cs +++ b/Content/Items/Materials/VisorShard.cs @@ -1,6 +1,7 @@ using Terraria.ID; using Terraria; using Terraria.ModLoader; +using ForgottenWawiTech.Content.Rarities; namespace ForgottenWawiTech.Content.Items.Materials { @@ -12,7 +13,7 @@ namespace ForgottenWawiTech.Content.Items.Materials Item.width = 20; Item.height = 20; Item.maxStack = 9999; - Item.rare = ItemRarityID.White; + Item.rare = ModContent.RarityType(); Item.value = Item.buyPrice(gold: 1); } } diff --git a/Content/NPCs/TownNPCs/AvalianTrader.cs b/Content/NPCs/TownNPCs/AvalianTrader.cs index 5a5d604..d6795b6 100644 --- a/Content/NPCs/TownNPCs/AvalianTrader.cs +++ b/Content/NPCs/TownNPCs/AvalianTrader.cs @@ -38,11 +38,11 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs NPC.width = 18; NPC.height = 40; NPC.aiStyle = 7; - NPC.damage = 10; - NPC.defense = 15; - NPC.lifeMax = 250; + NPC.damage = 30; + NPC.defense = 10; + NPC.lifeMax = 500; NPC.HitSound = SoundID.NPCHit1; - NPC.DeathSound = SoundID.NPCDeath1; + NPC.DeathSound = SoundID.NPCDeath6; NPC.knockBackResist = 0.5f; AnimationType = NPCID.Guide; @@ -50,8 +50,8 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs public override bool CanTownNPCSpawn(int numTownNPCs) { - // Example: Always spawn if there's room - return true; + // Only spawn if a player has obtained RGBass in this world + return ForgottenWawiTechSystem.hasObtainedRGBass; } public override List SetNPCNameList() @@ -92,23 +92,47 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs public override void AddShops() { - var npcShop = new NPCShop(Type) + new NPCShop(Type) .Add() .Add() - .Add() - .Add(); - - - npcShop.Register(); + .Add(ItemID.RainbowBrick) // TODO: Force Rainbow Brick to not have No Value. + .Add() + .Register(); } public override string GetChat() { - switch (0) + switch (Main.rand.Next(15)) { case 0: return "*avalian chirping*"; + case 1: + return "Welcome! I've traveled far from Avalon to bring you the finest technology."; + case 2: + return "These feathers? They're not just for show - they're quite valuable!"; + case 3: + return "RGB technology is all the rage back home. Everything needs more colors!"; + case 4: + return "The visor shards I sell are fragments from our most advanced equipment."; + case 5: + return "My pack may be small, but I've traversed dimensions to get here."; + case 6: + return "*chirps excitedly* Oh, you're interested in our wares?"; + case 7: + return "Avalon sends its regards! And its finest materials."; + case 8: + return "Don't underestimate the power of a well-crafted alloy."; + case 9: + return "The journey here was long, but your world has such fascinating resources!"; + case 10: + return "*preens feathers* Presentation is important in any trade."; + case 11: + return "RGBass - it's not just a material, it's a lifestyle."; + case 12: + return "I wonder what the other traders back on Avalon would think of this place..."; + case 13: + return "My species may be small, but we're excellent engineers!"; default: - return "I have no idea what to say."; + return "Need something? My shop is always open!"; } } diff --git a/Content/Rarities/AvalianItem.cs b/Content/Rarities/AvalianItem.cs new file mode 100644 index 0000000..d5a9185 --- /dev/null +++ b/Content/Rarities/AvalianItem.cs @@ -0,0 +1,33 @@ +using Terraria.ModLoader; +using Terraria; +using Microsoft.Xna.Framework; +using System; + +namespace ForgottenWawiTech.Content.Rarities +{ + public class AvalianItem : ModRarity + { + public override Color RarityColor + { + get + { + float time = Main.GlobalTimeWrappedHourly; + + // Base color cycle: bright cyan <-> deep teal + const float cycleHz = 0.8f; // cycles per second + float t = (float)((Math.Sin(time * cycleHz * MathHelper.TwoPi) + 1f) * 0.5f); // 0..1 + + Color brightCyan = new Color(0, 255, 255); // Bright cyan + Color deepTeal = new Color(0, 128, 160); // Deep teal + Color baseColor = Color.Lerp(deepTeal, brightCyan, t); + + // Add a subtle shimmer effect (faster, gentler than pulse) + const float shimmerHz = 2.0f; + float shimmer = (float)((Math.Sin(time * shimmerHz * MathHelper.TwoPi) + 1f) * 0.5f); + float brightness = 1f + 0.15f * shimmer; // subtle +15% max brightness variation + + return baseColor * brightness; + } + } + } +} diff --git a/Content/Rarities/ProtogenItem.cs b/Content/Rarities/ProtogenItem.cs new file mode 100644 index 0000000..57b3a13 --- /dev/null +++ b/Content/Rarities/ProtogenItem.cs @@ -0,0 +1,36 @@ +using Terraria.ModLoader; +using Terraria; +using Microsoft.Xna.Framework; +using System; + +namespace ForgottenWawiTech.Content.Rarities +{ + public class ProtogenItem : ModRarity + { + // Cycles between bright neon blue and vibrant pink/magenta with digital-style pulses + // to represent Protogen visor displays and cybernetic aesthetic + public override Color RarityColor + { + get + { + float time = Main.GlobalTimeWrappedHourly; + + // Base color cycle: neon blue <-> vibrant pink + const float cycleHz = 0.9f; // cycles per second + float t = (float)((Math.Sin(time * cycleHz * MathHelper.TwoPi) + 1f) * 0.5f); // 0..1 + + Color neonBlue = new Color(0, 180, 255); // Bright neon blue + Color vibrantPink = new Color(255, 0, 180); // Vibrant pink/magenta + Color baseColor = Color.Lerp(neonBlue, vibrantPink, t); + + // Digital pulse effect (quick, sharp like LED displays) + const float pulseHz = 1.5f; + float s = (float)Math.Sin(time * pulseHz * MathHelper.TwoPi); + float pulse = (float)Math.Pow(Math.Max(0f, s), 2.5f); // sharper pulse + float brightness = 1f + 0.2f * pulse; // up to +20% brightness at pulse peak + + return baseColor * brightness; + } + } + } +} diff --git a/ForgottenWawiTechSystem.cs b/ForgottenWawiTechSystem.cs new file mode 100644 index 0000000..42b0e5c --- /dev/null +++ b/ForgottenWawiTechSystem.cs @@ -0,0 +1,30 @@ +using Terraria.ModLoader; +using Terraria.ModLoader.IO; + +namespace ForgottenWawiTech +{ + public class ForgottenWawiTechSystem : ModSystem + { + public static bool hasObtainedRGBass = false; + + public override void OnWorldLoad() + { + hasObtainedRGBass = false; + } + + public override void OnWorldUnload() + { + hasObtainedRGBass = false; + } + + public override void SaveWorldData(TagCompound tag) + { + tag["hasObtainedRGBass"] = hasObtainedRGBass; + } + + public override void LoadWorldData(TagCompound tag) + { + hasObtainedRGBass = tag.GetBool("hasObtainedRGBass"); + } + } +} diff --git a/Localization/en-US_Mods.ForgottenWawiTech.hjson b/Localization/en-US_Mods.ForgottenWawiTech.hjson index d4efd62..3c59879 100644 --- a/Localization/en-US_Mods.ForgottenWawiTech.hjson +++ b/Localization/en-US_Mods.ForgottenWawiTech.hjson @@ -4,8 +4,8 @@ Items: { Nyanageddon: { Tooltip: ''' - Mob the rainbow, taste the rainbow. - Ethically questionable. + Mob the rainbow, taste the rainbow. + Ethically questionable. ''' DisplayName: Nyanageddon } @@ -18,9 +18,9 @@ Items: { TrueNyanageddon: { Tooltip: ''' - The ultimate evolution of the Meowmere. - Mob the rainbow, taste the rainbow, transcend the rainbow. - Ethically questionable. + The ultimate evolution of the Meowmere. + Mob the rainbow, taste the rainbow, transcend the rainbow. + Ethically questionable. ''' DisplayName: True Nyanageddon } @@ -79,8 +79,8 @@ Items: { DisplayName: Singularity-Infused Tome Of Unyielding Tooltip: ''' - A tome radiating with the power of the void. - You probably shouldn't hold it so close. + A tome radiating with the power of the void. + You probably shouldn't hold it so close. ''' } @@ -88,8 +88,8 @@ Items: { DisplayName: Shattered Prism Tooltip: ''' - A Last Prism exposed to the power of several singularities. - The chaos within seems desperate to be released. + A Last Prism exposed to the power of several singularities. + The chaos within seems desperate to be released. ''' } @@ -97,9 +97,9 @@ Items: { DisplayName: Infinite Mana Tooltip: ''' - You shouldn't have this. - +1000 max mana. - Prevents mana from being drained. + You shouldn't have this. + +1000 max mana. + Prevents mana from being drained. ''' } @@ -112,8 +112,8 @@ Items: { DisplayName: RGB Alloy Tooltip: ''' - A high-tech alloy used in advanced crafting. - Shimmers with red, green, and blue hues. + A high-tech alloy used in advanced crafting. + Shimmers with red, green, and blue hues. ''' } @@ -121,16 +121,16 @@ Items: { DisplayName: Visor Shard Tooltip: ''' - A fragment of a high-tech visor. - Emits a faint glow. + A fragment of a high-tech visor. + Emits a faint glow. ''' } MiniSingularity: { Tooltip: ''' - A small, contained singularity. - Handle with care. + A small, contained singularity. + Handle with care. ''' DisplayName: Mini Singularity } @@ -138,8 +138,8 @@ Items: { ControlledSingularity: { Tooltip: ''' - A stabilized captive singularity for advanced applications. - Extremely volatile if mishandled. + A stabilized captive singularity for advanced applications. + Extremely volatile if mishandled. ''' DisplayName: Controlled Singularity } @@ -148,13 +148,13 @@ Items: { DisplayName: Singularity Chestplate Tooltip: ''' - +50% damage - +40 max mana - +10% damage reduction - -50% mana cost - +1000 max life - +20 max minions - 'You feel a strange power coursing through your veins.' + +50% damage + +40 max mana + +10% damage reduction + -50% mana cost + +1000 max life + +20 max minions + 'You feel a strange power coursing through your veins.' ''' } @@ -162,11 +162,11 @@ Items: { DisplayName: Singularity Helmet Tooltip: ''' - +50% damage - +100% critical strike chance - +10% damage reduction - +500 max life - 'Your mind feels sharper, as if touched by the void itself.' + +50% damage + +100% critical strike chance + +10% damage reduction + +500 max life + 'Your mind feels sharper, as if touched by the void itself.' ''' } @@ -174,54 +174,61 @@ Items: { DisplayName: Singularity Leggings Tooltip: ''' - +500% movement speed - +50% damage - +10% damage reduction - +500 max life - Allows infinite flight. - 'You feel lighter on your feet, as if gravity itself has less hold on you.' + +500% movement speed + +50% damage + +10% damage reduction + +500 max life + Allows infinite flight. + 'You feel lighter on your feet, as if gravity itself has less hold on you.' ''' } - SingularityAxe: { - DisplayName: Singularity Axe - Tooltip: "" - } - SingularityHammer: { DisplayName: Singularity Hammer Tooltip: "" } - SingularityPickaxe: { - DisplayName: Singularity Pickaxe - Tooltip: "" - } - SingularityMultitool: { Tooltip: "" DisplayName: Singularity Multitool } ContainmentUnit: { - Tooltip: "" + Tooltip: + ''' + A high-tech containment unit for stabilizing singularities. + Essential for advanced singularity research and applications. + ''' DisplayName: Containment Unit } SingularitySealingUnitItem: { - Tooltip: "" + Tooltip: + ''' + A specialized device used to seal and stabilize singularities. + Used for singularity crafting. + ''' DisplayName: Singularity Sealing Unit Item } EnergyCore: { - Tooltip: "" + Tooltip: + ''' + A core pulsating with concentrated energy. + Used in high-tech crafting and energy applications. + ''' DisplayName: Energy Core } SingularityAlloy: { - Tooltip: "" + Tooltip: A singularity formed into a stable, sturdy alloy. DisplayName: Singularity Alloy } + + AvaliFeather: { + Tooltip: A feather from an Avali. + DisplayName: Avali Feather + } } NPCs: { @@ -300,14 +307,14 @@ NPCs: { DisplayName: Avalian Trader TownNPCMood: { - Content: I am content. - NoHome: I hate not having a home. - FarFromHome: I am too far from home. - LoveSpace: I love having so much space. - DislikeCrowded: I dislike how crowded I am. - HateCrowded: I hate how crowded I am. - LikeNPC_Princess: I like {NPCName}. - Princess_LovesNPC: I like {NPCName}. + Content: "*chirps contentedly* Life here is good! + NoHome: *distressed chirping* I need a proper nest to store my wares! + FarFromHome: I've wandered too far from my shop... this feels wrong. + LoveSpace: *happy chirps* So much room for my inventory! + DislikeCrowded: *agitated chirping* Too many bodies, not enough space... + HateCrowded: *stressed chirping* I can barely spread my wings in here! + LikeNPC_Princess: I like {NPCName}. She appreciates quality craftsmanship! + Princess_LovesNPC: I like {NPCName}. They remind me of traders back on Avalon. } } } diff --git a/README.md b/README.md index 64afce3..282a188 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # The Forgotten Wawi Tech Mod -## A Terraria Mod \ No newline at end of file +## A Terraria Mod +This is the source code repository for the Forgotten Wawi Tech mod for Terraria. This mod adds a variety of new content, including items, bosses, and rarities, to enhance the gameplay experience. + +Depends on Calamity Mod for the best experience. +Not canon to Avali, Protogen or Calamity lore - we are just having fun. \ No newline at end of file diff --git a/build.txt b/build.txt index d3208ab..168f206 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ displayName = The Forgotten Wawi Tech -author = EclypsedMoonfall, Axl_the_Protogen +author = EclypsedMoonfall, Axl_the_Protogen, British_Raccoon version = 0.1 \ No newline at end of file