--- deliantra/server/common/map.C 2007/01/27 23:59:29 1.81 +++ deliantra/server/common/map.C 2007/02/15 21:07:48 1.87 @@ -22,12 +22,13 @@ * The authors can be reached via e-mail at */ -#include -#include - -#include #include +#include "global.h" +#include "funcpoint.h" + +#include "loader.h" + #include "path.h" /* @@ -69,9 +70,9 @@ int mode = 0; if (prepend_dir) - strcpy (buf, create_pathname (name)); + assign (buf, create_pathname (name)); else - strcpy (buf, name); + assign (buf, name); /* old method (strchr(buf, '\0')) seemd very odd to me - * this method should be equivalant and is clearer. @@ -543,12 +544,10 @@ if (skip_header) for (;;) { - keyword kw = thawer.get_kv (); - - if (kw == KW_end) + if (thawer.kw == KW_end) break; - thawer.skip_kv (kw); + thawer.skip_kv (); } return _load_objects (thawer); @@ -570,14 +569,13 @@ in_memory = MAP_SWAPPED; /* The maps used to pick up default x and y values from the - * map archetype. Mimic that behaviour. + * map archetype. Mimic that behaviour. */ - width = 16; - height = 16; - reset_timeout = 0; - timeout = 300; - enter_x = 0; - enter_y = 0; + width = 16; + height = 16; + timeout = 300; + max_nrof = 1000; // 1000 items of anything + max_volume = 2000000; // 2m³ } maptile::maptile (int w, int h) @@ -741,18 +739,6 @@ switch (kw) { - case KW_EOF: - LOG (llevError, "%s: end of file while reading map header, aborting header load.\n", &path); - return false; - - case KW_end: - return true; - - default: - case KW_ERROR: - LOG (llevError, "%s: skipping errornous line (%s) while reading map header.\n", &path, thawer.last_keyword); - break; - case KW_msg: thawer.get_ml (KW_endmsg, msg); break; @@ -812,6 +798,14 @@ case KW_tile_path_2: thawer.get (tile_path [1]); break; case KW_tile_path_3: thawer.get (tile_path [2]); break; case KW_tile_path_4: thawer.get (tile_path [3]); break; + + case KW_end: + return true; + + default: + if (!thawer.parse_error ("map", 0)) + return false; + break; } } @@ -1282,6 +1276,17 @@ faces [2] = floor; faces_obj [2] = floor != blank_face ? floor_obj : 0; } +uint64 +mapspace::volume () const +{ + uint64 vol = 0; + + for (object *op = top; op && !op->flag [FLAG_NO_PICK]; op = op->below) + vol += op->volume (); + + return vol; +} + /* 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 @@ -1454,7 +1459,7 @@ * Return whether map2 is adjacent to map1. If so, store the distance from * map1 to map2 in dx/dy. */ -static int +int adjacent_map (const maptile *map1, const maptile *map2, int *dx, int *dy) { if (!map1 || !map2) @@ -1576,9 +1581,9 @@ if (!adjacent_map (op1->map, op2->map, &retval->distance_x, &retval->distance_y)) { /* be conservative and fill in _some_ data */ - retval->distance = 100000; - retval->distance_x = 32767; - retval->distance_y = 32767; + retval->distance = 10000; + retval->distance_x = 10000; + retval->distance_y = 10000; retval->direction = 0; retval->part = 0; } @@ -1593,7 +1598,6 @@ /* If this is multipart, find the closest part now */ if (!(flags & 0x1) && op1->more) { - object *tmp; int best_distance = retval->distance_x * retval->distance_x + retval->distance_y * retval->distance_y, tmpi; /* we just take the offset of the piece to head to figure @@ -1602,7 +1606,7 @@ * same axis as is used for multipart objects, the simply arithmetic * below works. */ - for (tmp = op1->more; tmp != NULL; tmp = tmp->more) + for (object *tmp = op1->more; tmp; tmp = tmp->more) { tmpi = (op1->x - tmp->x + retval->distance_x) * (op1->x - tmp->x + retval->distance_x) + (op1->y - tmp->y + retval->distance_y) * (op1->y - tmp->y + retval->distance_y); @@ -1621,7 +1625,7 @@ } retval->part = best; - retval->distance = idistance (retval->distance_x, retval->distance_y); + retval->distance = upos_max (abs (retval->distance_x), abs (retval->distance_y)); retval->direction = find_dir_2 (-retval->distance_x, -retval->distance_y); } } @@ -1636,9 +1640,8 @@ * for something in the future. Also, since no object is pasted, the best * field of the rv_vector is set to NULL. */ - void -get_rangevector_from_mapcoord (const maptile *m, int x, int y, const object *op2, rv_vector * retval, int flags) +get_rangevector_from_mapcoord (const maptile *m, int x, int y, const object *op2, rv_vector *retval, int flags) { if (!adjacent_map (m, op2->map, &retval->distance_x, &retval->distance_y)) { @@ -1700,3 +1703,4 @@ return ::region::default_region (); } +