Files
2025-11-14 22:36:20 +00:00

95 lines
3.7 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.GameContent;
namespace ForgottenWawiTech.Content.Projectiles
{
// Short-lived beam projectile emitted rapidly by BeamAttackWand.
// Simple straight projectile with minor dust and fade-out.
public class BeamAttackWandBeam : ModProjectile
{
private const int FrameCount = 3;
public override void SetStaticDefaults()
{
Main.projFrames[Type] = FrameCount; // 3 vertical frames
}
public override void SetDefaults()
{
Projectile.width = 28; // frame width
Projectile.height = 28; // frame height
Projectile.friendly = true;
Projectile.penetrate = 1; // single hit per beam
Projectile.timeLeft = 15; // very short duration
Projectile.DamageType = DamageClass.Melee;
Projectile.tileCollide = true;
Projectile.light = 0.4f;
Projectile.alpha = 40;
}
public override void AI()
{
// Frame animation: advance every 4 ticks for subtle flicker
Projectile.frameCounter++;
if (Projectile.frameCounter >= 4)
{
Projectile.frameCounter = 0;
Projectile.frame = (Projectile.frame + 1) % FrameCount;
}
// Slight acceleration forward for a snappy feel
Projectile.velocity *= 1.02f;
// Simple fade: become more transparent near end
if (Projectile.timeLeft < 6)
Projectile.alpha += 25;
// Spawn light dust
if (Main.rand.NextBool(3))
{
int d = Dust.NewDust(Projectile.position, Projectile.width, Projectile.height, DustID.PurpleTorch,
Projectile.velocity.X * 0.2f, Projectile.velocity.Y * 0.2f, 150, default, 0.9f);
Main.dust[d].noGravity = true;
}
}
public override bool OnTileCollide(Vector2 oldVelocity)
{
// So beams feel crisp: slight bounce spark then die
Projectile.timeLeft = 5;
Projectile.velocity *= 0.4f;
return false; // don't kill immediately; fade
}
public override bool PreDraw(ref Color lightColor)
{
Texture2D tex = TextureAssets.Projectile[Type].Value;
int frameHeight = tex.Height / FrameCount;
Rectangle frameRect = new(0, frameHeight * Projectile.frame, tex.Width, frameHeight);
Vector2 origin = new(tex.Width / 2f, frameHeight / 2f);
float baseScale = 1f;
float stretchX = 0.6f + Projectile.velocity.Length() / 30f; // elongate horizontally
Color drawColor = Color.White * (1f - Projectile.alpha / 255f);
// Slight additive trail effect: draw faint previous frame positions
for (int i = 0; i < 3; i++)
{
Vector2 trailPos = Projectile.Center - Projectile.velocity * i * 0.8f;
float trailAlpha = (0.4f - i * 0.12f) * (1f - Projectile.alpha / 255f);
Main.EntitySpriteDraw(tex, trailPos - Main.screenPosition, frameRect,
drawColor * trailAlpha, Projectile.rotation, origin,
new Vector2(stretchX, baseScale), SpriteEffects.None);
}
// Main frame (bright)
Main.EntitySpriteDraw(tex, Projectile.Center - Main.screenPosition, frameRect,
drawColor, Projectile.rotation, origin,
new Vector2(stretchX, baseScale), SpriteEffects.None);
return false;
}
}
}