Actually, the fix does break a few things.... My mistake for not making sure that was ok. Basically, when you login, player won't even move... (probably due to the call from check_login). Here's the fix i propose (attached patch): set speed to 0 in clear_object, call update_ob_speed (if speed isn't 0 already, of course). This way, a call to clear_object certifies object is correctly removed from active list. Doing that there was a trouble in treasure.c, during artifact initialization: init_artifacts would directly malloc( ) an object and call reset_object on it (thus some breakage in update_ob_speed due to uninitialized active_next/prev). So i changed to call get_object( ) (which is there to provide objects, isn't it? :)) And, to be on the safe side, i added a speed = 0 in common/arch.c : get_archetype_struct( ) (note that update_ob_speed wouldn't do anything, because arch_init is set at that point) With those fixes i couldn't find any bug in newbie tower, even after resetting map. Nicolas 'Ryo' -------------- next part -------------- Index: common/treasure.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/common/treasure.c,v retrieving revision 1.42 diff -u -r1.42 treasure.c --- common/treasure.c 2 Nov 2003 05:18:02 -0000 1.42 +++ common/treasure.c 20 Dec 2003 15:53:18 -0000 @@ -1200,8 +1200,7 @@ else if (sscanf(cp, "difficulty %d", &value)) art->difficulty = (uint8) value; else if (!strncmp(cp, "Object",6)) { - art->item = (object *) malloc(sizeof(object)); - reset_object(art->item); + art->item = get_object( ); if (!load_object(fp, art->item,LO_LINEMODE,0)) LOG(llevError,"Init_Artifacts: Could not load object.\n"); art->item->name = add_string((strchr(cp, ' ')+1)); Index: common/object.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/common/object.c,v retrieving revision 1.77 diff -u -r1.77 object.c --- common/object.c 18 Dec 2003 20:39:44 -0000 1.77 +++ common/object.c 20 Dec 2003 15:53:36 -0000 @@ -511,6 +511,11 @@ if (op->lore!=NULL) FREE_AND_CLEAR_STR(op->lore); if (op->materialname!= NULL) FREE_AND_CLEAR_STR(op->materialname); + if ( op->speed != 0 ) + { + op->speed = 0; + update_ob_speed( op ); + } /* Using this memset is a lot easier (and probably faster) * than explicitly clearing the fields. @@ -534,8 +539,6 @@ op->head=NULL; op->map=NULL; op->refcount=0; - op->active_next = NULL; - op->active_prev = NULL; /* What is not cleared is next, prev, and count */ op->expmul=1.0; @@ -705,6 +708,7 @@ if(objects!=NULL) objects->prev=op; objects=op; + op->speed = 0; clear_object(op); SET_FLAG(op,FLAG_REMOVED); nroffreeobjects--; Index: common/arch.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/common/arch.c,v retrieving revision 1.29 diff -u -r1.29 arch.c --- common/arch.c 27 Oct 2003 07:24:13 -0000 1.29 +++ common/arch.c 20 Dec 2003 15:53:41 -0000 @@ -366,6 +366,7 @@ new->clone.race=NULL; new->clone.slaying=NULL; new->clone.msg=NULL; + new->clone.speed = 0; clear_object(&new->clone); /* to initial state other also */ CLEAR_FLAG((&new->clone),FLAG_FREED); /* This shouldn't matter, since copy_object() */ SET_FLAG((&new->clone), FLAG_REMOVED); /* doesn't copy these flags... */ -------------- next part -------------- _______________________________________________ crossfire-devel mailing list crossfire-devel at lists.real-time.com https://mailman.real-time.com/mailman/listinfo/crossfire-devel