private void ReadRoom(BinaryReader reader, Room room) { // Read the dimensions. int width = reader.ReadInt32(); int height = reader.ReadInt32(); int layerCount = reader.ReadInt32(); // Read the room's properties. ReadProperties(reader, room.Properties); // Read tile data for first layer (stored as a grid of tiles). for (int y = 0; y < room.Height; y++) { for (int x = 0; x < room.Width; x++) { TileDataInstance tile = ReadTileData(reader); if (tile != null) { room.PlaceTile(tile, new Point2I(x, y), 0); } } } // Read tile data for higher layers (stored as a list of non-null tiles). int tileDataCount = reader.ReadInt32(); for (int i = 0; i < tileDataCount; i++) { int x = reader.ReadInt32(); int y = reader.ReadInt32(); int layer = reader.ReadInt32(); room.PlaceTile(ReadTileData(reader), new Point2I(x, y), layer); } // Read event tile data. int eventTileDataCount = reader.ReadInt32(); for (int i = 0; i < eventTileDataCount; i++) { room.AddEventTile(ReadEventTileData(reader)); } }
// Place the tiles in a tile grid starting at the given location. public void PlaceTileGrid(TileGrid tileGrid, LevelTileCoord location) { // Remove tiles. Rectangle2I area = new Rectangle2I((Point2I)location, tileGrid.Size); RemoveArea(area); // Place tiles. foreach (BaseTileDataInstance baseTile in tileGrid.GetTiles()) { if (baseTile is TileDataInstance) { TileDataInstance tile = (TileDataInstance)baseTile; LevelTileCoord coord = (LevelTileCoord)((Point2I)location + tile.Location); Room room = GetRoom(coord); if (room != null) { tile.Location = GetTileLocation(coord); room.PlaceTile(tile, tile.Location, tile.Layer); } } else if (baseTile is EventTileDataInstance) { EventTileDataInstance eventTile = (EventTileDataInstance)baseTile; eventTile.Position += (Point2I)location * GameSettings.TILE_SIZE; Point2I roomLocation = eventTile.Position / (roomSize * GameSettings.TILE_SIZE); Room room = GetRoomAt(roomLocation); if (room != null) { eventTile.Position -= roomLocation * roomSize * GameSettings.TILE_SIZE; room.AddEventTile(eventTile); } } } }