--- deliantra/server/common/map.C 2007/02/17 23:32:11 1.91 +++ deliantra/server/common/map.C 2007/04/17 10:06:32 1.100 @@ -346,8 +346,7 @@ /* 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 - * they are saved). We do have to look for the old maps that did save - * the more sections and not re-add sections for them. + * they are saved). */ void maptile::link_multipart_objects () @@ -401,7 +400,7 @@ { for (;;) { - coroapi::cede_every (1000); // cede once in a while + coroapi::cede_to_tick_every (100); // cede once in a while switch (f.kw) { @@ -456,7 +455,7 @@ bool maptile::_save_objects (object_freezer &f, int flags) { - static int cede_count = 0; + coroapi::cede_to_tick (); if (flags & IO_HEADER) _save_header (f); @@ -466,20 +465,9 @@ for (int i = 0; i < size (); ++i) { -#if 0 // temporarily disabled for improved(?) stability, schmorp #TODO#d#//D - if (cede_count >= 500) - { - cede_count = 0; - coroapi::cede (); - } -#endif - 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; @@ -496,6 +484,8 @@ } } + coroapi::cede_to_tick (); + return true; } @@ -1077,17 +1067,15 @@ { object *tmp, *last = 0; uint8 flags = P_UPTODATE, light = 0, anywhere = 0; - facetile *top, *floor, *middle; - object *top_obj, *floor_obj, *middle_obj; MoveType move_block = 0, move_slow = 0, move_on = 0, move_off = 0, move_allow = 0; - middle = blank_face; - top = blank_face; - floor = blank_face; - - middle_obj = 0; - top_obj = 0; - floor_obj = 0; + //object *middle = 0; + //object *top = 0; + //object *floor = 0; + // this seems to generate better code than using locals, above + object *&top = faces_obj[0] = 0; + object *&middle = faces_obj[1] = 0; + object *&floor = faces_obj[2] = 0; for (tmp = bot; tmp; last = tmp, tmp = tmp->above) { @@ -1110,37 +1098,28 @@ if (!tmp->invisible) { if ((tmp->type == PLAYER || QUERY_FLAG (tmp, FLAG_MONSTER))) - { - top = tmp->face; - top_obj = tmp; - } + top = tmp; else if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) { /* If we got a floor, that means middle and top were below it, * so should not be visible, so we clear them. */ - middle = blank_face; - top = blank_face; - floor = tmp->face; - floor_obj = tmp; + middle = 0; + top = 0; + floor = tmp; } /* Flag anywhere have high priority */ else if (QUERY_FLAG (tmp, FLAG_SEE_ANYWHERE)) { - middle = tmp->face; - - middle_obj = tmp; + middle = tmp; anywhere = 1; } /* Find the highest visible face around. If equal * visibilities, we still want the one nearer to the * top */ - else if (middle == blank_face || (tmp->face->visibility > middle->visibility && !anywhere)) - { - middle = tmp->face; - middle_obj = tmp; - } + else if (!middle || (::faces [tmp->face].visibility > ::faces [middle->face].visibility && !anywhere)) + middle = tmp; } if (tmp == tmp->above) @@ -1185,7 +1164,7 @@ * may be possible for the faces to match but be different objects. */ if (top == middle) - middle = blank_face; + middle = 0; /* There are three posibilities at this point: * 1) top face is set, need middle to be set. @@ -1200,19 +1179,18 @@ break; /* If two top faces are already set, quit processing */ - if ((top != blank_face) && (middle != blank_face)) + if (top && middle) break; /* Only show visible faces */ if (!tmp->invisible) { /* Fill in top if needed */ - if (top == blank_face) + if (!top) { - top = tmp->face; - top_obj = tmp; + top = tmp; if (top == middle) - middle = blank_face; + middle = 0; } else { @@ -1223,10 +1201,9 @@ * more to fill in. We don't check visiblity here, since * */ - if (tmp->face != top) + if (tmp != top) { - middle = tmp->face; - middle_obj = tmp; + middle = tmp; break; } } @@ -1234,14 +1211,16 @@ } if (middle == floor) - middle = blank_face; + middle = 0; if (top == middle) - middle = blank_face; + middle = 0; - faces [0] = top; faces_obj [0] = top != blank_face ? top_obj : 0; - faces [1] = middle; faces_obj [1] = middle != blank_face ? middle_obj : 0; - faces [2] = floor; faces_obj [2] = floor != blank_face ? floor_obj : 0; +#if 0 + faces_obj [0] = top; + faces_obj [1] = middle; + faces_obj [2] = floor; +#endif } uint64 @@ -1689,7 +1668,7 @@ object *pick = at (rndm (width), rndm (height)).bot; // do not prefer big monsters just because they are big. - if (pick->head_ () == pick) + if (pick && pick->head_ () == pick) return pick->head_ (); }