--- deliantra/server/common/map.C 2006/12/12 21:39:56 1.40 +++ deliantra/server/common/map.C 2006/12/13 02:55:49 1.42 @@ -552,23 +552,23 @@ switch (i) { - case LL_NORMAL: - /* if we are loading an overlay, put the floors on the bottom */ - if ((QUERY_FLAG (op, FLAG_IS_FLOOR) || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR)) && mapflags & MAP_OVERLAY) - insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY | INS_MAP_LOAD); - else - insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ON_TOP | INS_MAP_LOAD); - - if (op->inv) - sum_weight (op); - - prev = op, last_more = op; - break; - - case LL_MORE: - insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY); - op->head = prev, last_more->more = op, last_more = op; - break; + case LL_NORMAL: + /* if we are loading an overlay, put the floors on the bottom */ + if ((QUERY_FLAG (op, FLAG_IS_FLOOR) || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR)) && mapflags & MAP_OVERLAY) + insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY | INS_MAP_LOAD); + else + insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ON_TOP | INS_MAP_LOAD); + + if (op->inv) + sum_weight (op); + + prev = op, last_more = op; + break; + + case LL_MORE: + insert_ob_in_map (op, m, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY); + op->head = prev, last_more->more = op, last_more = op; + break; } if (mapflags & MAP_STYLE) @@ -588,6 +588,7 @@ { if (QUERY_FLAG (otmp, FLAG_UNIQUE) || QUERY_FLAG (otmp, FLAG_OBJ_SAVE_ON_OVL)) unique = 1; + if (!(mapflags & (MAP_OVERLAY | MAP_PLAYER_UNIQUE) || unique)) SET_FLAG (otmp, FLAG_OBJ_ORIGINAL); } @@ -969,115 +970,65 @@ * what really should be used. */ else if (!strcmp (key, "oid")) - { - fp.get (m, atoi (value)); - } + fp.get (m, atoi (value)); else if (!strcmp (key, "attach")) - { - m->attach = value; - } + m->attach = value; else if (!strcmp (key, "hp") || !strcmp (key, "enter_x")) - { - m->enter_x = atoi (value); - } + m->enter_x = atoi (value); else if (!strcmp (key, "sp") || !strcmp (key, "enter_y")) - { - m->enter_y = atoi (value); - } + m->enter_y = atoi (value); else if (!strcmp (key, "x") || !strcmp (key, "width")) - { - m->width = atoi (value); - } + m->width = atoi (value); else if (!strcmp (key, "y") || !strcmp (key, "height")) - { - m->height = atoi (value); - } + m->height = atoi (value); else if (!strcmp (key, "weight") || !strcmp (key, "reset_timeout")) - { - m->reset_timeout = atoi (value); - } + m->reset_timeout = atoi (value); else if (!strcmp (key, "value") || !strcmp (key, "swap_time")) - { - m->timeout = atoi (value); - } + m->timeout = atoi (value); else if (!strcmp (key, "level") || !strcmp (key, "difficulty")) - { - m->difficulty = atoi (value); - } + m->difficulty = clamp (atoi (value), 1, settings.max_level); else if (!strcmp (key, "invisible") || !strcmp (key, "darkness")) - { - m->darkness = atoi (value); - } + m->darkness = atoi (value); else if (!strcmp (key, "stand_still") || !strcmp (key, "fixed_resettime")) - { - m->fixed_resettime = atoi (value); - } + m->fixed_resettime = atoi (value); else if (!strcmp (key, "unique")) - { - m->unique = atoi (value); - } + m->unique = atoi (value); else if (!strcmp (key, "template")) - { - m->templatemap = atoi (value); - } + m->templatemap = atoi (value); else if (!strcmp (key, "region")) - { - m->region = get_region_by_name (value); - } + m->region = get_region_by_name (value); else if (!strcmp (key, "shopitems")) { *end = 0; m->shopitems = parse_shop_string (value); } else if (!strcmp (key, "shopgreed")) - { - m->shopgreed = atof (value); - } + m->shopgreed = atof (value); else if (!strcmp (key, "shopmin")) - { - m->shopmin = atol (value); - } + m->shopmin = atol (value); else if (!strcmp (key, "shopmax")) - { - m->shopmax = atol (value); - } + m->shopmax = atol (value); else if (!strcmp (key, "shoprace")) { *end = 0; m->shoprace = strdup_local (value); } else if (!strcmp (key, "outdoor")) - { - m->outdoor = atoi (value); - } + m->outdoor = atoi (value); else if (!strcmp (key, "temp")) - { - m->temp = atoi (value); - } + m->temp = atoi (value); else if (!strcmp (key, "pressure")) - { - m->pressure = atoi (value); - } + m->pressure = atoi (value); else if (!strcmp (key, "humid")) - { - m->humid = atoi (value); - } + m->humid = atoi (value); else if (!strcmp (key, "windspeed")) - { - m->windspeed = atoi (value); - } + m->windspeed = atoi (value); else if (!strcmp (key, "winddir")) - { - m->winddir = atoi (value); - } + m->winddir = atoi (value); else if (!strcmp (key, "sky")) - { - m->sky = atoi (value); - } + m->sky = atoi (value); else if (!strcmp (key, "nosmooth")) - { - m->nosmooth = atoi (value); - } + m->nosmooth = atoi (value); else if (!strncmp (key, "tile_path_", 10)) { int tile = atoi (key + 10); @@ -1130,15 +1081,15 @@ } /* end if tile direction (in)valid */ } else - { - LOG (llevError, "Got unknown value in map header: %s %s\n", key, value); - } + LOG (llevError, "Got unknown value in map header: %s %s\n", key, value); } + if (!key || strcmp (key, "end")) { LOG (llevError, "Got premature eof on map header!\n"); return 1; } + return 0; } @@ -1583,6 +1534,10 @@ LOG (llevError, "Trying to free freed map.\n"); return; } + + // TODO: use new/delete +#define FREE_AND_CLEAR(p) { free (p); p = NULL; } + if (flag && m->spaces) free_all_objects (m); if (m->name) @@ -1593,21 +1548,29 @@ FREE_AND_CLEAR (m->msg); if (m->maplore) FREE_AND_CLEAR (m->maplore); - if (m->shopitems) - delete[]m->shopitems; + + delete [] m->shopitems; m->shopitems = 0; + if (m->shoprace) FREE_AND_CLEAR (m->shoprace); + if (m->buttons) free_objectlinkpt (m->buttons); + m->buttons = NULL; + for (i = 0; i < 4; i++) { if (m->tile_path[i]) FREE_AND_CLEAR (m->tile_path[i]); m->tile_map[i] = NULL; } + m->in_memory = MAP_SWAPPED; + +#undef FREE_AND_CLEAR + } /* @@ -2147,7 +2110,7 @@ timeout = MAP_DEFAULTRESET; if (timeout >= MAP_MAXRESET) timeout = MAP_MAXRESET; - MAP_WHEN_RESET (map) = seconds () + timeout; + MAP_WHEN_RESET (map) = time (0) + timeout; } /* this updates the orig_map->tile_map[tile_num] value after loading