using System.Net.Mime; using FNAF_Server.Map; using GlobalClassLib; using PacketLib; namespace FNAF_Server.Enemies; public class DashEnemy : Enemy { public DashEnemy(int difficulty) : base(difficulty) { movementOpportunity = new(5000); SetDifficulty(difficulty); } public override string Name{ get; } = "Dash"; public override int TypeId{ get; } = (int)EnemyType.DASH; public override bool BlocksTile{ get; set; } = false; private MovementOpportunity movementOpportunity; private readonly (MapTile tile, Direction p1AttackDir, Direction p2AttackDir)[] positions =[ (MapManager.Get(7), Direction.EAST, Direction.WEST), (MapManager.Get(12), Direction.NORTH, Direction.NORTH), (MapManager.Get(17), Direction.WEST, Direction.EAST) ]; private int currentPosIndex = 0; private Random random = new(); public override void Reset() { int roll = random.Next(0, positions.Length - 1); if (roll >= currentPosIndex) roll++; currentPosIndex = roll; Location = positions[roll].tile; Server.SendUpdateToAll([GameEvent.ENEMY_RESET(Id, Location.Id)]); } public override void SetDifficulty(int difficulty) { Difficulty = difficulty; movementOpportunity.MovementChance = (2 * Math.Sign(difficulty) + difficulty) / 12.0; } public override void Spawn(MapTile location) { currentPosIndex = positions.ToList().FindIndex(p => p.tile == location); if (currentPosIndex == -1){ Console.WriteLine("Dash failed to spawn on " + location.Id); return; } base.Spawn(location); movementOpportunity.Start(); Server.SendUpdateToAll([GameEvent.ENEMY_SPAWN(TypeId, Id, Difficulty, Location.Id)]); } public override void Update() { base.Update(); if (movementOpportunity.CheckAndRoll()){ bool attackP1 = !Server.P1.state.doorStates[(int)positions[currentPosIndex].p1AttackDir]; bool attackP2 = !Server.P2.state.doorStates[(int)positions[currentPosIndex].p2AttackDir]; if (attackP1 != attackP2){ if(attackP1) Attack(Server.P1); else if(attackP2) Attack(Server.P2); return; } Reset(); } } }