--- deliantra/server/common/map.C 2006/12/31 17:17:22 1.61 +++ deliantra/server/common/map.C 2007/01/01 21:19:51 1.65 @@ -38,78 +38,9 @@ const char * create_pathname (const char *name) { - static char buf[MAX_BUF]; - - /* Why? having extra / doesn't confuse unix anyplace? Dependancies - * someplace else in the code? msw 2-17-97 - */ - if (*name == '/') - sprintf (buf, "%s/%s%s", settings.datadir, settings.mapdir, name); - else - sprintf (buf, "%s/%s/%s", settings.datadir, settings.mapdir, name); - return (buf); -} - -/* - * same as create_pathname, but for the overlay maps. - */ -const char * -create_overlay_pathname (const char *name) -{ - static char buf[MAX_BUF]; - - /* Why? having extra / doesn't confuse unix anyplace? Dependancies - * someplace else in the code? msw 2-17-97 - */ - if (*name == '/') - sprintf (buf, "%s/%s%s", settings.localdir, settings.mapdir, name); - else - sprintf (buf, "%s/%s/%s", settings.localdir, settings.mapdir, name); - return (buf); -} - -/* - * same as create_pathname, but for the template maps. - */ -const char * -create_template_pathname (const char *name) -{ - static char buf[MAX_BUF]; - - /* Why? having extra / doesn't confuse unix anyplace? Dependancies - * someplace else in the code? msw 2-17-97 - */ - if (*name == '/') - sprintf (buf, "%s/%s%s", settings.localdir, settings.templatedir, name); - else - sprintf (buf, "%s/%s/%s", settings.localdir, settings.templatedir, name); - return (buf); -} - -/* - * This makes absolute path to the itemfile where unique objects - * will be saved. Converts '/' to '@'. I think it's essier maintain - * files than full directory structure, but if this is problem it can - * be changed. - */ -static const char * -create_items_path (const char *s) -{ - static char buf[MAX_BUF]; - char *t; - - if (*s == '/') - s++; - - sprintf (buf, "%s/%s/", settings.localdir, settings.uniquedir); - - for (t = buf + strlen (buf); *s; s++, t++) - if (*s == '/') - *t = '@'; - else - *t = *s; - *t = 0; - return (buf); + static char buf[8192]; + snprintf (buf, sizeof (buf), "%s/%s/%s", settings.datadir, settings.mapdir, name); + return buf; } /* @@ -400,6 +331,17 @@ sum_weight (container); } +void +maptile::set_object_flag (int flag, int value) +{ + if (!spaces) + return; + + for (mapspace *ms = spaces + size (); ms-- > spaces; ) + for (object *tmp = ms->bot; tmp; tmp = tmp->above) + tmp->flag [flag] = value; +} + /* link_multipart_objects go through all the objects on the map looking * for objects whose arch says they are multipart yet according to the * info we have, they only have the head (as would be expected when @@ -547,6 +489,8 @@ bool maptile::save_objects (object_freezer &freezer, int flags) { + static int cede_count = 0; + if (flags & IO_HEADER) save_header (freezer); @@ -555,9 +499,18 @@ for (int i = 0; i < size (); ++i) { + if (cede_count >= 500) + { + cede_count = 0; + coroapi::cede (); + } + int unique = 0; for (object *op = spaces [i].bot; op; op = op->above) { + // count per-object, but cede only when modification-safe + cede_count++; + if (op->flag [FLAG_UNIQUE] && op->flag [FLAG_IS_FLOOR]) unique = 1; @@ -959,6 +912,7 @@ if (tile_path [2]) MAP_OUT2 (tile_path_3, tile_path [2]); if (tile_path [3]) MAP_OUT2 (tile_path_4, tile_path [3]); + freezer.put (this); freezer.put (KW_end); return true;