fix #H7667 - maybe_reset_pick(), other bad context
When deciding whether to discard interrupted lock/unlock context while changing levels, maybe_reset_pick() checks whether xlock.box is being carried. But it was doing so after the old level had been saved and memory for non-carried container there had been freed. That led to a couple of other issues. context.travelcc was using -1 for 'no cached value', but the fields of travelcc have type 'xchar' and shouldn't be given negative values. 0 should be fine for 'no cache'. Failed partial restore which occurred after old game's context had been loaded would begin a new game with old game's stale context. Restoring goes out of its way to avoid that for 'flags' but didn't for 'context'.
This commit is contained in:
27
src/save.c
27
src/save.c
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 save.c $NHDT-Date: 1489192905 2017/03/11 00:41:45 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.101 $ */
|
||||
/* NetHack 3.6 save.c $NHDT-Date: 1543972194 2018/12/05 01:09:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.115 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Michael Allison, 2009. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -1035,37 +1035,22 @@ register struct obj *otmp;
|
||||
if (Has_contents(otmp))
|
||||
saveobjchn(fd, otmp->cobj, mode);
|
||||
if (release_data(mode)) {
|
||||
/* if (otmp->oclass == FOOD_CLASS)
|
||||
* food_disappears(otmp);
|
||||
*/
|
||||
/*
|
||||
* If these are on the floor, the discarding could
|
||||
* be because of a game save, or we could just be changing levels.
|
||||
* If these are on the floor, the discarding could be
|
||||
* due to game save, or we could just be changing levels.
|
||||
* Always invalidate the pointer, but ensure that we have
|
||||
* the o_id in order to restore the pointer on reload.
|
||||
*/
|
||||
if (otmp == context.victual.piece) {
|
||||
/* Store the o_id of the victual if mismatched */
|
||||
if (context.victual.o_id != otmp->o_id)
|
||||
context.victual.o_id = otmp->o_id;
|
||||
/* invalidate the pointer; on reload it will get restored */
|
||||
context.victual.o_id = otmp->o_id;
|
||||
context.victual.piece = (struct obj *) 0;
|
||||
}
|
||||
if (otmp == context.tin.tin) {
|
||||
/* Store the o_id of your tin */
|
||||
if (context.tin.o_id != otmp->o_id)
|
||||
context.tin.o_id = otmp->o_id;
|
||||
/* invalidate the pointer; on reload it will get restored */
|
||||
context.tin.o_id = otmp->o_id;
|
||||
context.tin.tin = (struct obj *) 0;
|
||||
}
|
||||
/* if (otmp->oclass == SPBOOK_CLASS)
|
||||
* book_disappears(otmp);
|
||||
*/
|
||||
if (otmp == context.spbook.book) {
|
||||
/* Store the o_id of your spellbook */
|
||||
if (context.spbook.o_id != otmp->o_id)
|
||||
context.spbook.o_id = otmp->o_id;
|
||||
/* invalidate the pointer; on reload it will get restored */
|
||||
context.spbook.o_id = otmp->o_id;
|
||||
context.spbook.book = (struct obj *) 0;
|
||||
}
|
||||
otmp->where = OBJ_FREE; /* set to free so dealloc will work */
|
||||
|
||||
Reference in New Issue
Block a user