diff --git a/include/hack.h b/include/hack.h index a7db0e819..b21fd98dc 100644 --- a/include/hack.h +++ b/include/hack.h @@ -794,6 +794,7 @@ struct sinfo { int exiting; /* an exit handler is executing */ int saving; /* creating a save file */ int restoring; /* reloading a save file */ + int freeingdata; /* in saveobjchn(), mode FREEING */ int in_getlev; /* in getlev() */ int in_moveloop; /* normal gameplay in progress */ int in_impossible; /* reporting a warning */ diff --git a/src/mkobj.c b/src/mkobj.c index 4713e9d29..7af30c4ce 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -2739,10 +2739,15 @@ dealloc_obj(struct obj *obj) obj->where = OBJ_LUAFREE; return; } - /* mark object as deleted, put it into queue to be freed */ - obj->where = OBJ_DELETED; - obj->nobj = go.objs_deleted; - go.objs_deleted = obj; + if (!program_state.freeingdata) { + /* mark object as deleted, put it into queue to be freed */ + obj->where = OBJ_DELETED; + obj->nobj = go.objs_deleted; + go.objs_deleted = obj; + } else { + /* when saving, there's no need to stage deletions on objs_deleted */ + dealloc_obj_real(obj); + } } /* actually deallocate the object */ diff --git a/src/save.c b/src/save.c index e861a2f4f..69b9de6cb 100644 --- a/src/save.c +++ b/src/save.c @@ -853,7 +853,9 @@ saveobjchn(NHFILE *nhfp, struct obj **obj_p) setworn((struct obj *) 0, otmp->owornmask & (W_BALL | W_CHAIN)); otmp->owornmask = 0L; /* no longer care */ + program_state.freeingdata++; dealloc_obj(otmp); + program_state.freeingdata--; } otmp = otmp2; }