using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices.JavaScript; using GlobalClassLib; using ONDClient.GUI; using PacketLib; namespace ONDClient.Map; public class ClientMapManager { private static MapTileProjection[,] map = new MapTileProjection[5, 5]; public static MapTileProjection Get((int x, int y) coords) => map[coords.x, coords.y]; public static MapTileProjection Get(int tileId) => Get(IdToCoords(tileId)); private static bool inverted; public static void InitMap(int[] connectors, int[] yourTiles, int[] opponentTiles, int[] litTiles, bool upsideDown ) { (int id1, int id2, ConnectorType type, ClientPlayer? owner)[] connectorsData = new (int, int , ConnectorType, ClientPlayer?)[connectors.Length / 4]; for (int i = 0; i < connectors.Length / 4; i++){ connectorsData[i] = (connectors[i * 4], connectors[i * 4 + 1], (ConnectorType)connectors[i * 4 + 2], connectors[i * 4 + 3] == -1 ? null : Client.GetPlayer(connectors[i * 4 + 3])); } // ClientMapManager.InitMap(upsideDown); inverted = upsideDown; IdToCoords = upsideDown ? _IdToCoordsInverse : _IdToCoords; CoordsToId = upsideDown ? _CoordsToIdInverse : _CoordsToId; for (int i = 0; i < 5; i++){ for (int j = 0; j < 2; j++){ map[i, j] = new MapTileProjection(CoordsToId(i, j)); } map[i, 2] = new MapTileProjection(CoordsToId(i, 2)); for (int j = 3; j < 5; j++){ map[i, j] = new MapTileProjection(CoordsToId(i, j)); } } foreach (var tileId in yourTiles){ Get(tileId).Owner = Client.Player; } foreach (var tileId in opponentTiles){ Get(tileId).Owner = Client.Opponent; } foreach (var tileId in litTiles){ Get(tileId).Lit = true; } TileConnectorProjection[] connectorProjections = connectorsData.Select(c => new TileConnectorProjection(Get(c.id1), Get(c.id2), c.type){Owner = c.owner}).ToArray(); InitConnectors(connectorProjections); UIManager.SpawnMapElements(connectorProjections.Where(c => c.Type == ConnectorType.DOOR_REMOTE).ToArray()); } public static void InitConnectors(TileConnectorProjection[] connectors) { foreach (var con in connectors){ // (int x, int y) coords1 = MapTileProjection.IdToCoords(con.Tiles.tile1.Id); // (int x, int y) coords2 = MapTileProjection.IdToCoords(con.Tiles.tile2.Id); map[con.Tiles.tile1.GridPosition.x, con.Tiles.tile1.GridPosition.y].AddConnector(con); } } public static TileConnectorProjection GetConnector((int, int) id) => Get(id.Item1).GetConnector(id.Item2); public static TileConnectorProjection[] GetConnectors(int tileId) => Get(IdToCoords(tileId)).GetAllConnectors(); public static TileConnectorProjection[] GetAllConnectors() { List connectors = new(); for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ MapTileProjection tile = map[i, j]; Array.ForEach(tile.GetAllConnectors(), c => { if(tile.Id < c.OtherTile(tile).Id) connectors.Add(c); }); } } return connectors.ToArray(); } public const int MAP_SIDE_LENGTH = 5; // map grid height public static Func CoordsToId{ get; private set; } public static Func IdToCoords{ get; private set; } private static Func _IdToCoords = id => (id / MAP_SIDE_LENGTH, id % MAP_SIDE_LENGTH); private static Func _IdToCoordsInverse = id => (MAP_SIDE_LENGTH - 1 - (id / MAP_SIDE_LENGTH), MAP_SIDE_LENGTH - 1 - (id % MAP_SIDE_LENGTH)); private static Func _CoordsToId = (x, y) => x * MAP_SIDE_LENGTH + y; private static Func _CoordsToIdInverse = (x, y) => (MAP_SIDE_LENGTH - 1 - x) * MAP_SIDE_LENGTH + (MAP_SIDE_LENGTH - 1 - y); public static MapTileProjection[] GetAllTiles() { List tiles = new(); foreach (var tile in map){ tiles.Add(tile); } return tiles.ToArray(); } }