> > I noticed an odd bug in digging/searching up buried items recently, it seems
> > to search the entire world for buried items and uncovers them, can anybody
> > help me with where the loop or whatnot is going wrong?
> >
> > obj = world[IN_ROOM(ch)].contents;
> >
> > while (obj != NULL) {
> > if (IS_BURIED(obj)) {
> > /* Remove the buried bit so the player can see it. */
> <...snip...>
> > }
> > else {
> > SET_BIT(GET_OBJ_EXTRA(obj), ITEM_BURIED);
> > }
> > }
> > /* go to the next obj */
> > obj = obj->next;
> > }
>
>
> Don't you want obj->next_content (next in room) and not ->next? What I
> really want to know is why every other item isn't buried?
> --Angus
Part of the code that you snipped out was calling obj_from_room(obj) and
obj_to_char(...). This will modify the obj->next_content pointer, so that
the obj = obj->next_content at the bottom will cause undesired behavior.
You need to grab the next_content pointer before it is altered and use it
for the next iteration of the loop. I posted a message about this recently,
and there are many examples of for loops in the stock code that accomplish
this.
To modify the loop, declare an obj_data pointer called "next", and assign
next = obj->next_content as the first line in your while loop. Modify the
assignment at the bottom of your loop to be: obj = next;
As to your last question, if you are referring to the removal of the
ITEM_BURIED bit and then setting it again in the else clause, it seems to
me THAT code needs to remain as written.
Mike
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST