private static void ProcessGrid(WritableMapFile map, IArchiveFileEntry grid, byte gridX, byte gridY) { // skip any low quality grids if (grid.FileName.Contains("_low", StringComparison.OrdinalIgnoreCase)) { return; } log.Info($"Processing {map.Asset} grid {gridX},{gridY}..."); using (Stream stream = ArchiveManager.MainArchive.OpenFileStream(grid)) { try { var mapFileGrid = new WritableMapFileGrid(gridX, gridY); var areaFile = new AreaFile(stream); foreach (IReadable areaChunk in areaFile.Chunks) { switch (areaChunk) { case Chnk chnk: { foreach (ChnkCell cell in chnk.Cells.Where(c => c != null)) { mapFileGrid.AddCell(new WritableMapFileCell(cell)); } break; } } } map.SetGrid(gridX, gridY, mapFileGrid); } catch (Exception e) { log.Error(e); } } }
/// <summary> /// Generate a base map (.nfmap) file from supplied <see cref="WorldEntry"/>. /// </summary> private static void ProcessWorld(WorldEntry entry) { var mapFile = new WritableMapFile(Path.GetFileName(entry.AssetPath)); log.Info($"Processing {mapFile.Asset}..."); foreach (IArchiveFileEntry fileEntry in ArchiveManager.MainArchive.IndexFile.GetFiles(Path.Combine(entry.AssetPath, "*.*.area"))) { // skip any low quality grids if (fileEntry.FileName.Contains("_low", StringComparison.OrdinalIgnoreCase)) { continue; } Regex regex = new Regex(@"[\w]+\.([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})\.area"); Match match = regex.Match(fileEntry.FileName); uint x = uint.Parse(match.Groups[1].Value, NumberStyles.HexNumber); uint y = uint.Parse(match.Groups[2].Value, NumberStyles.HexNumber); log.Info($"Processing {mapFile.Asset} grid {x},{y}..."); using (Stream stream = ArchiveManager.MainArchive.OpenFileStream(fileEntry)) { try { var mapFileGrid = new WritableMapFileGrid(x, y); var areaFile = new AreaFile(stream); foreach (IReadable areaChunk in areaFile.Chunks) { switch (areaChunk) { case Chnk chnk: { foreach (ChnkCell cell in chnk.Cells.Where(c => c != null)) { var mapFileCell = new WritableMapFileCell(cell); mapFileGrid.AddCell(mapFileCell); } break; } } } mapFile.SetGrid(x, y, mapFileGrid); } catch (Exception e) { log.Error(e); } } } if (!mapFile.Any()) { log.Info($"Map {mapFile.Asset} has no grid information, skipping"); return; } // Path.ChangeExtension(mapFile.Asset, "nfmap") // ChangeExtension doesn't behave correctly on linux string filePath = Path.Combine("map", $"{mapFile.Asset}.nfmap"); using (FileStream stream = File.Create(filePath)) using (var writer = new BinaryWriter(stream)) { mapFile.Write(writer); } }