--- deliantra/server/common/map.C 2007/01/03 00:21:35 1.66 +++ deliantra/server/common/map.C 2007/01/04 16:19:31 1.68 @@ -1239,8 +1239,8 @@ if ((top != blank_face) && (middle != blank_face)) break; - /* Only show visible faces, unless its the editor - show all */ - if (!tmp->invisible || editor) + /* Only show visible faces */ + if (!tmp->invisible) { /* Fill in top if needed */ if (top == blank_face) @@ -1280,18 +1280,17 @@ faces [2] = floor; faces_obj [2] = floor != blank_face ? floor_obj : 0; } -/* this updates the orig_map->tile_map[tile_num] value after loading - * the map. It also takes care of linking back the freshly loaded +/* this updates the orig_map->tile_map[tile_num] value after finding + * the map. It also takes care of linking back the freshly found * maps tile_map values if it tiles back to this one. It returns - * the value of orig_map->tile_map[tile_num]. It really only does this - * so that it is easier for calling functions to verify success. + * the value of orig_map->tile_map[tile_num]. */ -static maptile * -load_and_link_tiled_map (maptile *orig_map, int tile_num) +static inline maptile * +find_and_link (maptile *orig_map, int tile_num) { - maptile *mp = orig_map->load_map_sync (orig_map->tile_path [tile_num], orig_map); + maptile *mp = orig_map->find_sync (orig_map->tile_path [tile_num], orig_map); - if (!mp || mp->in_memory != MAP_IN_MEMORY) + if (!mp) { // emergency mode, manufacture a dummy map, this creates a memleak, but thats fine LOG (llevError, "FATAL: cannot load tiled map %s from %s, leaking memory and worse!\n", @@ -1313,6 +1312,12 @@ return mp; } +static inline void +load_and_link (maptile *orig_map, int tile_num) +{ + find_and_link (orig_map, tile_num)->load_sync (); +} + /* this returns TRUE if the coordinates (x,y) are out of * map m. This function also takes into account any * tiling considerations, loading adjacant maps as needed. @@ -1337,7 +1342,7 @@ return 1; if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 3); + find_and_link (m, 3); return out_of_map (m->tile_map[3], x + m->tile_map[3]->width, y); } @@ -1348,7 +1353,7 @@ return 1; if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 1); + find_and_link (m, 1); return out_of_map (m->tile_map[1], x - m->width, y); } @@ -1359,7 +1364,7 @@ return 1; if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 0); + find_and_link (m, 0); return out_of_map (m->tile_map[0], x, y + m->tile_map[0]->height); } @@ -1370,7 +1375,7 @@ return 1; if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 2); + find_and_link (m, 2); return out_of_map (m->tile_map[2], x, y - m->height); } @@ -1390,60 +1395,52 @@ * and then figuring out what the real map is */ maptile * -get_map_from_coord (maptile *m, sint16 *x, sint16 *y) +maptile::xy_find (sint16 &x, sint16 &y) { - if (*x < 0) + if (x < 0) { - if (!m->tile_path[3]) + if (!tile_path[3]) return 0; - if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 3); - - *x += m->tile_map[3]->width; - return (get_map_from_coord (m->tile_map[3], x, y)); + find_and_link (this, 3); + x += tile_map[3]->width; + return tile_map[3]->xy_find (x, y); } - if (*x >= m->width) + if (x >= width) { - if (!m->tile_path[1]) + if (!tile_path[1]) return 0; - if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 1); - - *x -= m->width; - return (get_map_from_coord (m->tile_map[1], x, y)); + find_and_link (this, 1); + x -= width; + return tile_map[1]->xy_find (x, y); } - if (*y < 0) + if (y < 0) { - if (!m->tile_path[0]) + if (!tile_path[0]) return 0; - if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 0); - - *y += m->tile_map[0]->height; - return (get_map_from_coord (m->tile_map[0], x, y)); + find_and_link (this, 0); + y += tile_map[0]->height; + return tile_map[0]->xy_find (x, y); } - if (*y >= m->height) + if (y >= height) { - if (!m->tile_path[2]) + if (!tile_path[2]) return 0; - if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) - load_and_link_tiled_map (m, 2); - - *y -= m->height; - return (get_map_from_coord (m->tile_map[2], x, y)); + find_and_link (this, 2); + y -= height; + return tile_map[2]->xy_find (x, y); } /* Simple case - coordinates are within this local * map. */ - return m; + return this; } /** @@ -1456,6 +1453,8 @@ if (!map1 || !map2) return 0; + //TODO: this doesn't actually check corretcly when intermediate maps are not loaded + //fix: compare paths instead (this is likely faster, too!) if (map1 == map2) { *dx = 0; @@ -1527,6 +1526,23 @@ return 1; } +maptile * +maptile::xy_load (sint16 &x, sint16 &y) +{ + maptile *map = xy_find (x, y); + + if (map) + map->load_sync (); + + return map; +} + +maptile * +get_map_from_coord (maptile *m, sint16 *x, sint16 *y) +{ + return m->xy_load (*x, *y); +} + /* From map.c * This is used by get_player to determine where the other * creature is. get_rangevector takes into account map tiling,