--- deliantra/server/common/map.C 2006/12/10 01:16:27 1.35 +++ deliantra/server/common/map.C 2006/12/12 22:37:05 1.41 @@ -26,9 +26,7 @@ #include #include -#ifndef WIN32 /* ---win32 exclude header */ -# include -#endif /* win32 */ +#include #include "path.h" @@ -159,19 +157,14 @@ { char buf[MAX_BUF]; -#ifndef WIN32 char *endbuf; struct stat statbuf; int mode = 0; -#endif if (prepend_dir) strcpy (buf, create_pathname (name)); else strcpy (buf, name); -#ifdef WIN32 /* ***win32: check this sucker in windows style. */ - return (_access (buf, 0)); -#else /* old method (strchr(buf, '\0')) seemd very odd to me - * this method should be equivalant and is clearer. @@ -194,7 +187,6 @@ mode |= 2; return (mode); -#endif } /* @@ -542,7 +534,7 @@ int unique; object *op, *prev = NULL, *last_more = NULL, *otmp; - op = get_object (); + op = object::create (); op->map = m; /* To handle buttons correctly */ while ((i = load_object (fp, op, mapflags))) @@ -560,29 +552,29 @@ 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) remove_from_active_list (op); - op = get_object (); + op = object::create (); op->map = m; } @@ -596,13 +588,14 @@ { 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); } } } - free_object (op); + op->destroy (); link_multipart_objects (m); } @@ -862,27 +855,30 @@ { buf[HUGE_BUF - 1] = 0; key = buf; + while (isspace (*key)) key++; + if (*key == 0) continue; /* empty line */ + value = strchr (key, ' '); + if (!value) { - end = strchr (key, '\n'); - if (end != NULL) - { - *end = 0; - } + if ((end = strchr (key, '\n'))) + *end = 0; } else { *value = 0; value++; end = strchr (value, '\n'); + while (isspace (*value)) { value++; + if (*value == '\0' || value == end) { /* Nothing but spaces. */ @@ -974,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); @@ -1135,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; } @@ -1305,18 +1251,22 @@ for (j = 0; j < MAP_HEIGHT (m); j++) { unique = 0; + for (op = get_map_ob (m, i, j); op; op = next) { next = op->above; + if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE)) unique = 1; + if (op->head == NULL && (QUERY_FLAG (op, FLAG_UNIQUE) || unique)) { clean_object (op); + if (QUERY_FLAG (op, FLAG_IS_LINKED)) remove_button_link (op); - remove_ob (op); - free_object (op); + + op->destroy (); } } } @@ -1429,17 +1379,10 @@ } if (m->shopgreed) fprintf (freezer, "shopgreed %f\n", m->shopgreed); -#ifndef WIN32 if (m->shopmin) fprintf (freezer, "shopmin %llu\n", m->shopmin); if (m->shopmax) fprintf (freezer, "shopmax %llu\n", m->shopmax); -#else - if (m->shopmin) - fprintf (freezer, "shopmin %I64u\n", m->shopmin); - if (m->shopmax) - fprintf (freezer, "shopmax %I64u\n", m->shopmax); -#endif if (m->shoprace) fprintf (freezer, "shoprace %s\n", m->shoprace); if (m->darkness) @@ -1528,11 +1471,12 @@ for (tmp = op->inv; tmp; tmp = next) { next = tmp->below; + clean_object (tmp); if (QUERY_FLAG (tmp, FLAG_IS_LINKED)) remove_button_link (tmp); - remove_ob (tmp); - free_object (tmp); + + tmp->destroy (); } } @@ -1558,7 +1502,9 @@ LOG (llevDebug, "free_all_objects: Link error, bailing out.\n"); break; } + previous_obj = op; + if (op->head != NULL) op = op->head; @@ -1567,8 +1513,8 @@ */ if (m->in_memory == MAP_IN_MEMORY) clean_object (op); - remove_ob (op); - free_object (op); + + op->destroy (); } } }