private Action BuildLevel(IBuilder builder) { string level = string.Format("level_{0}", builder.Level); if (!Directory.Exists(level)) { Directory.CreateDirectory(level); } TileType[,] map = builder.CreateTileMap(tileTypes); Func <string, FileStream> getTileFileStream = tileType => { string path = string.Format("../data/tiles/{0}.png", tileType); return(File.OpenRead(path)); }; string indexTarget = string.Concat(level, "/map.idx"); string csvTarget = string.Concat(level, "/map.csv"); string fragmentTarget = string.Concat(level, "/map_{0}_{1}.png"); string metadata = string.Format(LevelBuilder.FileFormat, builder.Level, "{0}"); string metadataRelative = string.Concat("../", metadata); string metadataTarget = string.Concat(level, "/map.{0}"); string mapTarget = string.Concat(level, "/map.png"); // metadata actually used for rendering maps. FragmentedPersistance fragmentedPersistance = new FragmentedPersistance(getTileFileStream); fragmentedPersistance.SaveFragmentMetadata(map, indexTarget, builder); fragmentedPersistance.SaveTileMap(map, fragmentTarget); fragmentedPersistance.SaveTileMatrix(map, csvTarget); // other metadata: just copy over. string npcSource = string.Format(metadataRelative, "npc"); string npcTarget = string.Format(metadataTarget, "npc"); string itemSource = string.Format(metadataRelative, "item"); string itemTarget = string.Format(metadataTarget, "item"); File.Copy(npcSource, npcTarget, true); File.Copy(itemSource, itemTarget, true); return(() => { // full map for preview for viewing and debugging. Persistance persistance = new Persistance(getTileFileStream); persistance.SaveTileMap(map, mapTarget); }); }