Make the Avalian Trader less robotic, add Avali Feather
This commit is contained in:
@@ -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<AvalianItem>();
|
||||||
|
Item.value = Item.buyPrice(gold: 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 504 B |
@@ -1,4 +1,5 @@
|
|||||||
// Animated by British_Raccoon
|
// Animated by British_Raccoon
|
||||||
|
// and then Axl_The_Protogen
|
||||||
using Terraria.ID;
|
using Terraria.ID;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
using Terraria.ModLoader;
|
using Terraria.ModLoader;
|
||||||
@@ -13,7 +14,7 @@ namespace ForgottenWawiTech.Content.Items.Materials
|
|||||||
{
|
{
|
||||||
public class RGBAlloy : ModItem
|
public class RGBAlloy : ModItem
|
||||||
{
|
{
|
||||||
private const int FRAME_COUNT = 5;
|
private const int FRAME_COUNT = 7;
|
||||||
private const int TICKS_PER_FRAME = 10;
|
private const int TICKS_PER_FRAME = 10;
|
||||||
|
|
||||||
public override void SetStaticDefaults()
|
public override void SetStaticDefaults()
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 28 KiB |
@@ -1,6 +1,8 @@
|
|||||||
using Terraria.ID;
|
using Terraria.ID;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
using Terraria.ModLoader;
|
using Terraria.ModLoader;
|
||||||
|
using Terraria.DataStructures;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
namespace ForgottenWawiTech.Content.Items.Materials
|
namespace ForgottenWawiTech.Content.Items.Materials
|
||||||
{
|
{
|
||||||
@@ -12,8 +14,37 @@ namespace ForgottenWawiTech.Content.Items.Materials
|
|||||||
Item.width = 20;
|
Item.width = 20;
|
||||||
Item.height = 20;
|
Item.height = 20;
|
||||||
Item.maxStack = 9999;
|
Item.maxStack = 9999;
|
||||||
Item.rare = ItemRarityID.White;
|
Item.rare = ItemRarityID.Expert; // temp rarity until custom rarity is added
|
||||||
Item.value = Item.buyPrice(gold: 10);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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<RGBass>();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
using Terraria.ID;
|
using Terraria.ID;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
using Terraria.ModLoader;
|
using Terraria.ModLoader;
|
||||||
|
using ForgottenWawiTech.Content.Rarities;
|
||||||
|
|
||||||
namespace ForgottenWawiTech.Content.Items.Materials
|
namespace ForgottenWawiTech.Content.Items.Materials
|
||||||
{
|
{
|
||||||
@@ -12,7 +13,7 @@ namespace ForgottenWawiTech.Content.Items.Materials
|
|||||||
Item.width = 20;
|
Item.width = 20;
|
||||||
Item.height = 20;
|
Item.height = 20;
|
||||||
Item.maxStack = 9999;
|
Item.maxStack = 9999;
|
||||||
Item.rare = ItemRarityID.White;
|
Item.rare = ModContent.RarityType<ProtogenItem>();
|
||||||
Item.value = Item.buyPrice(gold: 1);
|
Item.value = Item.buyPrice(gold: 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs
|
|||||||
NPC.width = 18;
|
NPC.width = 18;
|
||||||
NPC.height = 40;
|
NPC.height = 40;
|
||||||
NPC.aiStyle = 7;
|
NPC.aiStyle = 7;
|
||||||
NPC.damage = 10;
|
NPC.damage = 30;
|
||||||
NPC.defense = 15;
|
NPC.defense = 10;
|
||||||
NPC.lifeMax = 250;
|
NPC.lifeMax = 500;
|
||||||
NPC.HitSound = SoundID.NPCHit1;
|
NPC.HitSound = SoundID.NPCHit1;
|
||||||
NPC.DeathSound = SoundID.NPCDeath1;
|
NPC.DeathSound = SoundID.NPCDeath6;
|
||||||
NPC.knockBackResist = 0.5f;
|
NPC.knockBackResist = 0.5f;
|
||||||
|
|
||||||
AnimationType = NPCID.Guide;
|
AnimationType = NPCID.Guide;
|
||||||
@@ -50,8 +50,8 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs
|
|||||||
|
|
||||||
public override bool CanTownNPCSpawn(int numTownNPCs)
|
public override bool CanTownNPCSpawn(int numTownNPCs)
|
||||||
{
|
{
|
||||||
// Example: Always spawn if there's room
|
// Only spawn if a player has obtained RGBass in this world
|
||||||
return true;
|
return ForgottenWawiTechSystem.hasObtainedRGBass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override List<string> SetNPCNameList()
|
public override List<string> SetNPCNameList()
|
||||||
@@ -92,23 +92,47 @@ namespace ForgottenWawiTech.Content.NPCs.TownNPCs
|
|||||||
|
|
||||||
public override void AddShops()
|
public override void AddShops()
|
||||||
{
|
{
|
||||||
var npcShop = new NPCShop(Type)
|
new NPCShop(Type)
|
||||||
.Add<Items.Materials.RGBass>()
|
.Add<Items.Materials.RGBass>()
|
||||||
.Add<Items.Materials.VisorShard>()
|
.Add<Items.Materials.VisorShard>()
|
||||||
.Add<Items.Materials.RGBAlloy>()
|
.Add(ItemID.RainbowBrick) // TODO: Force Rainbow Brick to not have No Value.
|
||||||
.Add<Items.Accessories.DevInfiniteMana>();
|
.Add<Items.Materials.AvaliFeather>()
|
||||||
|
.Register();
|
||||||
|
|
||||||
npcShop.Register();
|
|
||||||
}
|
}
|
||||||
public override string GetChat()
|
public override string GetChat()
|
||||||
{
|
{
|
||||||
switch (0)
|
switch (Main.rand.Next(15))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
return "*avalian chirping*";
|
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:
|
default:
|
||||||
return "I have no idea what to say.";
|
return "Need something? My shop is always open!";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -183,45 +183,52 @@ Items: {
|
|||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
|
||||||
SingularityAxe: {
|
|
||||||
DisplayName: Singularity Axe
|
|
||||||
Tooltip: ""
|
|
||||||
}
|
|
||||||
|
|
||||||
SingularityHammer: {
|
SingularityHammer: {
|
||||||
DisplayName: Singularity Hammer
|
DisplayName: Singularity Hammer
|
||||||
Tooltip: ""
|
Tooltip: ""
|
||||||
}
|
}
|
||||||
|
|
||||||
SingularityPickaxe: {
|
|
||||||
DisplayName: Singularity Pickaxe
|
|
||||||
Tooltip: ""
|
|
||||||
}
|
|
||||||
|
|
||||||
SingularityMultitool: {
|
SingularityMultitool: {
|
||||||
Tooltip: ""
|
Tooltip: ""
|
||||||
DisplayName: Singularity Multitool
|
DisplayName: Singularity Multitool
|
||||||
}
|
}
|
||||||
|
|
||||||
ContainmentUnit: {
|
ContainmentUnit: {
|
||||||
Tooltip: ""
|
Tooltip:
|
||||||
|
'''
|
||||||
|
A high-tech containment unit for stabilizing singularities.
|
||||||
|
Essential for advanced singularity research and applications.
|
||||||
|
'''
|
||||||
DisplayName: Containment Unit
|
DisplayName: Containment Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
SingularitySealingUnitItem: {
|
SingularitySealingUnitItem: {
|
||||||
Tooltip: ""
|
Tooltip:
|
||||||
|
'''
|
||||||
|
A specialized device used to seal and stabilize singularities.
|
||||||
|
Used for singularity crafting.
|
||||||
|
'''
|
||||||
DisplayName: Singularity Sealing Unit Item
|
DisplayName: Singularity Sealing Unit Item
|
||||||
}
|
}
|
||||||
|
|
||||||
EnergyCore: {
|
EnergyCore: {
|
||||||
Tooltip: ""
|
Tooltip:
|
||||||
|
'''
|
||||||
|
A core pulsating with concentrated energy.
|
||||||
|
Used in high-tech crafting and energy applications.
|
||||||
|
'''
|
||||||
DisplayName: Energy Core
|
DisplayName: Energy Core
|
||||||
}
|
}
|
||||||
|
|
||||||
SingularityAlloy: {
|
SingularityAlloy: {
|
||||||
Tooltip: ""
|
Tooltip: A singularity formed into a stable, sturdy alloy.
|
||||||
DisplayName: Singularity Alloy
|
DisplayName: Singularity Alloy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AvaliFeather: {
|
||||||
|
Tooltip: A feather from an Avali.
|
||||||
|
DisplayName: Avali Feather
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NPCs: {
|
NPCs: {
|
||||||
@@ -300,14 +307,14 @@ NPCs: {
|
|||||||
DisplayName: Avalian Trader
|
DisplayName: Avalian Trader
|
||||||
|
|
||||||
TownNPCMood: {
|
TownNPCMood: {
|
||||||
Content: I am content.
|
Content: "*chirps contentedly* Life here is good!
|
||||||
NoHome: I hate not having a home.
|
NoHome: *distressed chirping* I need a proper nest to store my wares!
|
||||||
FarFromHome: I am too far from home.
|
FarFromHome: I've wandered too far from my shop... this feels wrong.
|
||||||
LoveSpace: I love having so much space.
|
LoveSpace: *happy chirps* So much room for my inventory!
|
||||||
DislikeCrowded: I dislike how crowded I am.
|
DislikeCrowded: *agitated chirping* Too many bodies, not enough space...
|
||||||
HateCrowded: I hate how crowded I am.
|
HateCrowded: *stressed chirping* I can barely spread my wings in here!
|
||||||
LikeNPC_Princess: I like {NPCName}.
|
LikeNPC_Princess: I like {NPCName}. She appreciates quality craftsmanship!
|
||||||
Princess_LovesNPC: I like {NPCName}.
|
Princess_LovesNPC: I like {NPCName}. They remind me of traders back on Avalon.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +1,6 @@
|
|||||||
# The Forgotten Wawi Tech Mod
|
# The Forgotten Wawi Tech Mod
|
||||||
## A Terraria Mod
|
## 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.
|
||||||
Reference in New Issue
Block a user