using GlobalClassLib; namespace ONDServer.Map; public static class MapManager { private static MapTile[,] map = new MapTile[5, 5]; private static List doors = new(); private static List doorsP1 = new(); private static List doorsP2 = new(); public static MapTile Get((int x, int y) coords) => map[coords.x, coords.y]; public static MapTile Get(int tileId) => Get(IdToCoords(tileId)); private static Dictionary<(int x1, int y1), (int x2, int y2, int value, ConnectorType type)[]> halfConnectors = new(){ [(0, 0)] =[(1, 0, 1, ConnectorType.HALL), (0, 1, 1, ConnectorType.DOOR_REMOTE)], [(1, 0)] =[(2, 0, 1, ConnectorType.DOOR_OFFICE), (1, 1, 1, ConnectorType.DOOR_REMOTE)], [(3, 0)] =[(2, 0, 1, ConnectorType.DOOR_OFFICE), (4, 0, 1, ConnectorType.HALL), (3, 1, 1, ConnectorType.DOOR_REMOTE)], [(4, 0)] =[(4, 1, 1, ConnectorType.DOOR_REMOTE)], [(0, 1)] =[(1, 1, 1, ConnectorType.HALL)], [(1, 1)] =[(1, 2, 1, ConnectorType.DOOR_REMOTE)], [(2, 1)] =[(2, 2, 2, ConnectorType.HALL), (2, 0, 1, ConnectorType.DOOR_OFFICE)], [(3, 1)] =[(3, 2, 1, ConnectorType.DOOR_REMOTE), (4, 1, 1, ConnectorType.HALL)] }; private static Dictionary<(int x1, int y1), (int x2, int y2, int value)[]> mainHallwayConnectors = new(){ [(0,2)] = [(1,2,1)], [(1,2)] = [(2,2,1)], [(2,2)] = [(3,2,1)], [(3,2)] = [(4,2,1)] }; private static (int x, int y)[] ventTiles =[(0, 1), (4, 1), (2, 2), (0, 3), (4, 3)]; public static void InitMap() { for (int i = 0; i < 5; i++){ for (int j = 0; j < 2; j++){ map[i, j] = new MapTile(CoordsToId(i, j)){Owner = Server.P1}; } map[i, 2] = new MapTile(CoordsToId(i, 2)){Lit = true}; for (int j = 3; j < 5; j++){ map[i, j] = new MapTile(CoordsToId(i, j)){Owner = Server.P2}; } } foreach (var con in mainHallwayConnectors){ map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[c.x2, c.y2], ConnectorType.HALL, c.value)).ToArray()); } foreach (var con in halfConnectors){ map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[c.x2, c.y2], c.type, c.value){Owner = Server.P1}).ToArray()); } foreach (var con in halfConnectors){ map[4 - con.Key.x1, 4 - con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[4 - c.x2, 4 - c.y2], c.type, c.value){Owner = Server.P2}).ToArray()); } doors = GetAllConnectors().Where(c => c.Type == ConnectorType.DOOR_OFFICE || c.Type == ConnectorType.DOOR_REMOTE).ToList(); doorsP1 = doors.Where(c => c.Owner == Server.P1).ToList(); doorsP2 = doors.Where(c => c.Owner == Server.P2).ToList(); foreach (var tile1Coords in ventTiles){ MapTile tile1 = map[tile1Coords.x, tile1Coords.y]; foreach (var tile2Coords in ventTiles){ MapTile tile2 = map[tile2Coords.x, tile2Coords.y]; if(tile1.GetConnector(tile2) != null || tile1 == tile2) continue; tile1.AddConnector(new TileConnector(tile2, ConnectorType.VENT, 2)); } } } public static TileConnector[] GetAllConnectors() { List connectors = new(); for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ MapTile tile = map[i, j]; Array.ForEach(tile.GetAllConnectors(), c => { if(tile.Id < c.OtherTile(tile).Id) connectors.Add(c); }); } } return connectors.ToArray(); } public static MapTile[] GetAllTiles() { List tiles = new(); foreach (var tile in map){ tiles.Add(tile); } return tiles.ToArray(); } public const int ID_X_OFFSET = 5; // map grid height public static int CoordsToId(int x, int y) => x * ID_X_OFFSET + y; public static (int, int) IdToCoords(int id) => (id / ID_X_OFFSET, id % ID_X_OFFSET); public static TileConnector[] GetDoors() => doors.ToArray(); public static TileConnector[] GetDoors(ServerPlayer player) => player == Server.P1 ? doorsP1.ToArray() : doorsP2.ToArray(); }