using System.Collections.Generic; using Decimation.Lib.Items; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Terraria; using Terraria.ID; namespace Decimation.Content.Projectiles.DuneWyrm { public class Sundial : DecimationProjectile { private static readonly IDictionary ProjectilesIndex = new Dictionary(); private static readonly IDictionary ProjectilesCount = new Dictionary(); private static readonly int IndexResetCounterMax = 60; protected override int AnimationFrames => 12; protected override int AnimationFps => 1; protected override DecimationWeapon.DamageType DamageType => DecimationWeapon.DamageType.Magic; protected override int Damages => 15; private int ProjectileIndex { get { if (!ProjectilesIndex.ContainsKey(Owner)) ProjectilesIndex[Owner] = -1; return ProjectilesIndex[Owner]; } set { int index = value; if (index > AnimationFrames) index = AnimationFrames; ProjectilesIndex[Owner] = index; } } private int Count { get { if (!ProjectilesCount.ContainsKey(Owner)) Count = -1; return ProjectilesCount[Owner]; } set => ProjectilesCount[Owner] = value; } private int Index { get => (int) projectile.localAI[0]; set => projectile.localAI[0] = value; } private int Owner { get => (int) projectile.localAI[1]; set => projectile.localAI[1] = value; } private bool EndOfLife => projectile.timeLeft < IndexResetCounterMax || projectile.penetrate <= 1; protected override void Init() { projectile.width = 20; projectile.height = 22; projectile.timeLeft = 180 + IndexResetCounterMax; projectile.aiStyle = -1; projectile.tileCollide = false; projectile.knockBack = 7; Owner = projectile.owner; if (Count++ == 0) ProjectileIndex = 0; Index = ++ProjectileIndex; projectile.penetrate = Index + 1; } public override bool PreKill(int timeLeft) { Count -= 1; return true; } public override bool PreAI() { projectile.frame = Index - 1; if (projectile.frame >= AnimationFrames) projectile.frame = AnimationFrames - 1; return true; } public override void AI() { if (EndOfLife) { projectile.velocity = Vector2.Zero; projectile.penetrate = -1; projectile.damage = 0; projectile.alpha = 0; } else { Lighting.AddLight(projectile.Center, 0, 0.8f, 1); projectile.velocity.Normalize(); projectile.velocity *= Index; if (Index >= 6) projectile.damage = 25; if (Index >= 12) projectile.damage = 35; } } public override void OnHitNPC(NPC target, int damage, float knockback, bool crit) { if (Index == 1) target.AddBuff(BuffID.Slow, 300); } public override void OnHitPvp(Player target, int damage, bool crit) { if (Index == 1) target.AddBuff(BuffID.Slow, 300); } public override bool PreDraw(SpriteBatch spriteBatch, Color lightColor) { return !EndOfLife; // projectile.alpha = 0 does not always work? } } }