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.Boss.DuneWyrm { public class Sundial : DecimationProjectile { private static readonly IDictionary ProjectilesIndex = new Dictionary(); private static readonly IDictionary ProjectilesCount = new Dictionary(); public static void Reset() { ProjectilesIndex.Clear(); ProjectilesCount.Clear(); } protected override int AnimationFrames => 12; protected override int AnimationFps => 1; protected override DecimationWeapon.DamageType DamageType => DecimationWeapon.DamageType.Magic; protected override int Damages => 15; private const int IndexResetCounterMax = 30; private bool _killAnimationPlayer = false; private int ProjectileIndex { get { if (!ProjectilesIndex.ContainsKey(Owner)) ProjectilesIndex[Owner] = 0; return ProjectilesIndex[Owner]; } set { int index = value; if (index >= AnimationFrames) index = 0; ProjectilesIndex[Owner] = index; } } private int Count { get { if (!ProjectilesCount.ContainsKey(Owner)) Count = 0; 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; if (!_killAnimationPlayer) { Main.PlaySound(SoundID.Item27, projectile.Center); for (int i = 0; i < 4; i++) { Dust.NewDust(projectile.position, projectile.width, projectile.height, 135, 0, 0, 100, default, 4f * projectile.scale); } _killAnimationPlayer = true; } } else { Lighting.AddLight(projectile.Center, 0, 0.8f, 1); Dust.NewDust(projectile.position, projectile.width, projectile.height, 135, projectile.velocity.X * 0.2f, projectile.velocity.Y * 0.2f, 100, default, 1f * projectile.scale); projectile.velocity.Normalize(); projectile.velocity *= Index; if (Index >= 6) projectile.damage = 25; if (Index >= 12) projectile.damage = 35; } } public override void OnHitNPC(Terraria.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? } } }