using System; using System.Linq; using FNAF_Clone.GUI; using FNAF_Clone.Map; using GlobalClassLib; using MonoGameLibrary.Input; using PacketLib; namespace FNAF_Clone; public class EventProcessor { public static void Evaluate(GameEvent[] events) { foreach (var e in events){ switch (e.ID){ case 0: // join Console.WriteLine("E: Player joined"); break; case 1: // leave Console.WriteLine("E: Player left"); break; case 2: // switch cam if (Client.Player.state.pid != e.Args[0]){ UIManager.ChangeCameraOpponent(e.Args[1]); break; } if (Client.Player.state.camera != e.Args[1]) Console.WriteLine("!!! DESYNC: CAMERA STATE"); Console.WriteLine($"E: player {e.Args[0]} switched to camera {e.Args[1]}"); break; case 3: // toggle cam Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}"); if (e.Args[0] != Client.Player.state.pid){ UIManager.ChangeMonitorStateOpponent(e.Args[1] == 1); break; } if (Client.Player.state.monitorUp != (e.Args[1] == 1)) Console.WriteLine("!!! DESYNC: MONITOR STATE"); // UIManager.ChangeMonitorState(e.Args[1] == 1); break; case 4: // toggle door Console.WriteLine($"E: Player {e.Args[0]} {(e.Args[2] == 1 ? "closed" : "opened")} door {e.Args[1]}"); if (e.Args[0] == Client.Player.state.pid){ if (Client.Player.state.doorStates[e.Args[1]] != (e.Args[2] == 1)) Console.WriteLine("!!! DESYNC: DOOR STATE"); break; } Client.Opponent.state.doorStates[e.Args[1]] = e.Args[2] == 1; UIManager.ChangeDoorStateOpponent((Direction)e.Args[1], e.Args[2] == 1); break; case 5: // toggle remote door Console.WriteLine($"E: Player {e.Args[0]} {(e.Args[3] == 1 ? "closed" : "opened")} door {e.Args[1]}-{e.Args[2]}"); if (e.Args[0] == Client.Player.state.pid){ if (ClientMapManager.GetConnector((e.Args[1], e.Args[2])).Blocked != (e.Args[3] == 1)) Console.WriteLine("!!! DESYNC: REMOTE DOOR STATE"); break; } ClientMapManager.GetConnector((e.Args[1], e.Args[2])).Blocked = e.Args[3] == 1; UIManager.ChangeRemoteDoorState((e.Args[1], e.Args[2]), e.Args[3] == 1); break; case 6: // spawn Console.WriteLine($"E: Spawned enemy {e.Args[0]} at {e.Args[3]}"); ClientEnemyManager.AddEnemyByTemplate((EnemyType)e.Args[0], e.Args[1], e.Args[2], ClientMapManager.Get(e.Args[3])); UIManager.UpdateCameras([e.Args[3]]); break; case 7: // movement Console.WriteLine($"E: Enemy {e.Args[0]} moved to {e.Args[1]}"); int oldPos = ClientEnemyManager.Get(e.Args[0]).Location!.Id; ClientEnemyManager.Move(e.Args[0], ClientMapManager.Get(e.Args[1])); UIManager.UpdateCameras([oldPos, e.Args[1]]); break; case 8: // attack Console.WriteLine($"E: Enemy {e.Args[0]} attacked player {e.Args[1]}"); // TODO: add an arg to indicate lethality if (e.Args[1] == Client.Player.state.pid) { UIManager.Jumpscare(ClientEnemyManager.Get(e.Args[0])); } break; case 9: Console.WriteLine($"E: Enemy {e.Args[0]} reset to {e.Args[1]}"); int preResetPos = ClientEnemyManager.Get(e.Args[0]).Location!.Id; ClientEnemyManager.Move(e.Args[0], ClientMapManager.Get(e.Args[1])); UIManager.UpdateCameras([preResetPos, e.Args[1]]); break; case 10: Console.WriteLine($"E: Spot:{e.Args[0]} turned {(e.Args[1] == 1 ? "on" : " off")}"); ClientEnemyManager.Get(e.Args[0]).Sprite.SetTexture(e.Args[1] == 1 ? 0 : 2); break; case 11: Console.WriteLine($"E: Player {e.Args[0]} won"); if(Client.Player.state.pid == e.Args[0]) UIManager.ShowVictoryScreen(); break; case 12: Console.WriteLine("E: Game started"); UIManager.DisplayGameUI(); UIManager.StartTimer(); break; case 13: Console.WriteLine($"E: power tick {e.Args[0]}: {e.Args[1]}"); if (e.Args[0] == Client.Player.state.pid){ Client.Player.state.power = e.Args[1]; } else{ Client.Opponent.state.power = e.Args[1]; } break; case 14: Console.WriteLine($"E: Player {e.Args[0]} powered out"); ClientMapManager.GetAllConnectors().Where(c => (c.Type == ConnectorType.DOOR_REMOTE || c.Type == ConnectorType.DOOR_OFFICE) && c.Owner == Client.GetPlayer(e.Args[0])).ToList().ForEach(c => { c.Blocked = false; if(c.Type == ConnectorType.DOOR_REMOTE) UIManager.ChangeRemoteDoorState(c.Id, false); }); if (e.Args[0] == Client.Player.state.pid){ UIManager.ChangeDoorState(Direction.EAST, false); UIManager.ChangeDoorState(Direction.NORTH, false); UIManager.ChangeDoorState(Direction.WEST, false); CommandManager.AllowGameControls(false); UIManager.ChangeMonitorState(false); } else{ UIManager.ChangeDoorStateOpponent(Direction.EAST, false); UIManager.ChangeDoorStateOpponent(Direction.NORTH, false); UIManager.ChangeDoorStateOpponent(Direction.WEST, false); UIManager.ChangeMonitorStateOpponent(false); } break; } } } }