bool is_keep(const map_location& loc) const { return on_board(loc) && is_keep(get_terrain(loc)); }
t_translation::t_terrain gamemap::get_terrain(const map_location& loc) const { if(on_board_with_border(loc)) { return tiles_[loc.x + border_size_][loc.y + border_size_]; } const std::map<map_location, t_translation::t_terrain>::const_iterator itor = borderCache_.find(loc); if(itor != borderCache_.end()) return itor->second; // If not on the board, decide based on what surrounding terrain is t_translation::t_terrain items[6]; int nitems = 0; map_location adj[6]; get_adjacent_tiles(loc,adj); for(int n = 0; n != 6; ++n) { if(on_board(adj[n])) { items[nitems] = tiles_[adj[n].x][adj[n].y]; ++nitems; } else { // If the terrain is off map but already in the border cache, // this will be used to determine the terrain. // This avoids glitches // * on map with an even width in the top right corner // * on map with an odd height in the bottom left corner. // It might also change the result on other map and become random, // but the border tiles will be determined in the future, so then // this will no longer be used in the game // (The editor will use this feature to expand maps in a better way). std::map<map_location, t_translation::t_terrain>::const_iterator itor = borderCache_.find(adj[n]); // Only add if it is in the cache and a valid terrain if(itor != borderCache_.end() && itor->second != t_translation::NONE_TERRAIN) { items[nitems] = itor->second; ++nitems; } } } // Count all the terrain types found, // and see which one is the most common, and use it. t_translation::t_terrain used_terrain; int terrain_count = 0; for(int i = 0; i != nitems; ++i) { if(items[i] != used_terrain && !is_village(items[i]) && !is_keep(items[i])) { const int c = std::count(items+i+1,items+nitems,items[i]) + 1; if(c > terrain_count) { used_terrain = items[i]; terrain_count = c; } } } borderCache_.insert(std::pair<map_location, t_translation::t_terrain>(loc,used_terrain)); return used_terrain; }