void Generator::PostProcessMap(Map& map) { // Sort tiles by connectivity std::map<std::pair<unsigned int, unsigned int>, unsigned int> tiles; unsigned int id = 0; for (Map::TileIterator itr = map.GetTilesBegin(); itr != map.GetTilesEnd(); ++itr) { if (!itr->second->IsBlocked()) { std::map<std::pair<unsigned int, unsigned int>, unsigned int>::iterator itr2 = tiles.find(itr->first); if (itr2 == tiles.end()) { tiles.insert(std::make_pair(itr->first, id)); PostProcessTile(map, *itr->second, tiles, id); ++id; } } } // Find largest connected area std::vector<unsigned int> count; for (unsigned int i = 0; i != id; ++i) { count.push_back(0); } for (std::map<std::pair<unsigned int, unsigned int>, unsigned int>::iterator itr = tiles.begin(); itr != tiles.end(); ++itr) { ++count[itr->second]; } unsigned int max = 0; unsigned int max_id = 0; for (unsigned int i = 0; i != id; ++i) { if (count[i] > max) { max = count[i]; max_id = i; } } // Blcok all tiles that aren't connected to the largest connected area for (std::map<std::pair<unsigned int, unsigned int>, unsigned int>::iterator itr = tiles.begin(); itr != tiles.end(); ++itr) { if (itr->second != max_id) { Tile* tile = map.GetTile(itr->first.first, itr->first.second); tile->SetType(TT_FOREST); } } }