public override DungeonLevel GetLevel(int level, Dungeon dungeon, Point? startTile) { DungeonLevel dungeonLevel = null; if (Data.Maps.Count <= level) throw new ArgumentException("Level does not exist."); if (loadedLevels.TryGetValue(level, out dungeonLevel)) return dungeonLevel; Initialize(level, startTile); stack.Push(new TileInfo<TileData> { Position = start, Tile = CurrentMap[start.X, start.Y] }); bitMap[start.X, start.Y] = true; while (stack.Count > 0) { currentTile = stack.Pop(); var nextTiles = CreateTile(currentTile).Where(t => t.Tile != null && t.Tile.GetType() != typeof(WallTileData) && !bitMap[t.Position.X, t.Position.Y]); foreach (var t in nextTiles) //recursion { stack.Push(t); bitMap[t.Position.X, t.Position.Y] = true; } } SetupNeighbours(TilesPositions, outputTiles); SetupItems(); dungeonLevel = new DungeonLevel(dungeon, outputTiles, creatures, level, TilesPositions, TilesPositions[start], legacyTileCreator.MiniMap); loadedLevels.Add(level, dungeonLevel); return dungeonLevel; }