]> granicus.if.org Git - nethack/commitdiff
restore vs perm_invent
authorPatR <rankin@nethack.org>
Thu, 5 Jul 2018 23:06:31 +0000 (16:06 -0700)
committerPatR <rankin@nethack.org>
Thu, 5 Jul 2018 23:06:31 +0000 (16:06 -0700)
Redo how updates of permanent inventory window are suppressed during
restore.  Reverses part of e9f1e032717921cb7a51c0f2822628355a35ec36
which included a simpler attempt to deal with this.

It looks like we should have been getting impossible "unpaid_cost:
object wasn't on any bill" but segfault was reported; I haven't tried
to figure out why.  The band in xname() ought to be redundant now but
is included for bulletproofing.

doc/fixes36.2
src/objnam.c
src/restore.c
src/wield.c
src/worn.c

index ff9b89d18b88e84a95b7df86bd10271a09ad7d58..5e1d1ad9db50909d4a483afc0fa48e2116df542f 100644 (file)
@@ -65,6 +65,9 @@ eating rings while polymorphed didn't handle bonus/penalty for increase damage,
 shopkeeper's position in front of shop door didn't correctly handle bottom
        edge of irregularly shaped shop due to typo or copy+paste error
        (latent bug; no such shops are present in 3.6.x)
+attempting to update permanent inventory window during restore had problems
+       with unpaid items (needed shop bill before shop and its shopkeeper
+       were restored) and named fruit
 
 
 Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
index 5fa0ddd42cd63f5558abbfe75e0f3946922506e5..7de07963c5198a35d278d5a2703083329a8e84fa 100644 (file)
@@ -1194,7 +1194,9 @@ unsigned doname_flags;
             Strcat(bp, " (at the ready)");
         }
     }
-    if (!iflags.suppress_price && is_unpaid(obj)) {
+    /* treat 'restoring' like suppress_price because shopkeeper and
+       bill might not be available yet while restore is in progress */
+    if (!iflags.suppress_price && !restoring && is_unpaid(obj)) {
         long quotedprice = unpaid_cost(obj, TRUE);
 
         Sprintf(eos(bp), " (%s, %ld %s)",
index b967e1464ef43bac38dea25ef6b1e3dfeb2f8aac..f7e92da76def72e26f842115f0ab1be2e3d48e59 100644 (file)
@@ -35,8 +35,7 @@ STATIC_DCL struct monst *FDECL(restmonchn, (int, BOOLEAN_P));
 STATIC_DCL struct fruit *FDECL(loadfruitchn, (int));
 STATIC_DCL void FDECL(freefruitchn, (struct fruit *));
 STATIC_DCL void FDECL(ghostfruit, (struct obj *));
-STATIC_DCL boolean
-FDECL(restgamestate, (int, unsigned int *, unsigned int *));
+STATIC_DCL boolean FDECL(restgamestate, (int, unsigned int *, unsigned int *));
 STATIC_DCL void FDECL(restlevelstate, (unsigned int, unsigned int));
 STATIC_DCL int FDECL(restlevelfile, (int, XCHAR_P));
 STATIC_OVL void FDECL(restore_msghistory, (int));
@@ -521,6 +520,7 @@ unsigned int *stuckid, *steedid;
     struct obj *otmp, *tmp_bc;
     char timebuf[15];
     unsigned long uid;
+    boolean defer_perm_invent;
 
     mread(fd, (genericptr_t) &uid, sizeof uid);
     if (SYSOPT_CHECK_SAVE_UID
@@ -531,7 +531,7 @@ unsigned int *stuckid, *steedid;
         if (!wizard)
             return FALSE;
     }
-    mread(fd, (genericptr_t) &context, sizeof(struct context_info));
+    mread(fd, (genericptr_t) &context, sizeof (struct context_info));
     if (context.warntype.speciesidx >= LOW_PM)
         context.warntype.species = &mons[context.warntype.speciesidx];
 
@@ -539,7 +539,13 @@ unsigned int *stuckid, *steedid;
        file option values instead of keeping old save file option values
        if partial restore fails and we resort to starting a new game */
     newgameflags = flags;
-    mread(fd, (genericptr_t) &flags, sizeof(struct flag));
+    mread(fd, (genericptr_t) &flags, sizeof (struct flag));
+    /* avoid keeping permanent inventory window up to date during restore
+       (setworn() calls update_inventory); attempting to include the cost
+       of unpaid items before shopkeeper's bill is available is a no-no;
+       named fruit names aren't accessible yet either */
+    defer_perm_invent = flags.perm_invent;
+    flags.perm_invent = FALSE;
     /* wizard and discover are actually flags.debug and flags.explore;
        player might be overriding the save file values for them;
        in the discover case, we don't want to set that for a normal
@@ -645,14 +651,14 @@ unsigned int *stuckid, *steedid;
     restlevchn(fd);
     mread(fd, (genericptr_t) &moves, sizeof moves);
     mread(fd, (genericptr_t) &monstermoves, sizeof monstermoves);
-    mread(fd, (genericptr_t) &quest_status, sizeof(struct q_score));
-    mread(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1));
+    mread(fd, (genericptr_t) &quest_status, sizeof (struct q_score));
+    mread(fd, (genericptr_t) spl_book, (MAXSPELL + 1) * sizeof (struct spell));
     restore_artifacts(fd);
     restore_oracles(fd);
     if (u.ustuck)
-        mread(fd, (genericptr_t) stuckid, sizeof(*stuckid));
+        mread(fd, (genericptr_t) stuckid, sizeof *stuckid);
     if (u.usteed)
-        mread(fd, (genericptr_t) steedid, sizeof(*steedid));
+        mread(fd, (genericptr_t) steedid, sizeof *steedid);
     mread(fd, (genericptr_t) pl_character, sizeof pl_character);
 
     mread(fd, (genericptr_t) pl_fruit, sizeof pl_fruit);
@@ -665,6 +671,8 @@ unsigned int *stuckid, *steedid;
     /* must come after all mons & objs are restored */
     relink_timers(FALSE);
     relink_light_sources(FALSE);
+    /* inventory display is now viable */
+    flags.perm_invent = defer_perm_invent;
     return TRUE;
 }
 
index c45282a144edc9990c966e26654354720f221045..1063e125b8d63c4b4403d3ed283f8af4c283d780 100644 (file)
@@ -112,7 +112,6 @@ register struct obj *obj;
                        : !is_weptool(obj) && !is_wet_towel(obj);
     } else
         unweapon = TRUE; /* for "bare hands" message */
-    update_inventory();
 }
 
 STATIC_OVL boolean
@@ -230,7 +229,9 @@ setuqwep(obj)
 register struct obj *obj;
 {
     setworn(obj, W_QUIVER);
-    update_inventory();
+    /* no extra handling needed; this used to include a call to
+       update_inventory() but that's already performed by setworn() */
+    return;
 }
 
 void
@@ -238,7 +239,7 @@ setuswapwep(obj)
 register struct obj *obj;
 {
     setworn(obj, W_SWAPWEP);
-    update_inventory();
+    return;
 }
 
 /*** Commands to change particular slot(s) ***/
index 828e6a90261bf973e9c1bee043aa77c1493696ed..e7860c6552f732d66a359ed52f65bafc6ed0f74a 100644 (file)
@@ -106,8 +106,7 @@ long mask;
                 }
             }
     }
-    if (!restoring)
-        update_inventory();
+    update_inventory();
 }
 
 /* called e.g. when obj is destroyed */
@@ -138,9 +137,7 @@ register struct obj *obj;
             if ((p = w_blocks(obj, wp->w_mask)) != 0)
                 u.uprops[p].blocked &= ~wp->w_mask;
         }
-    /* setnotworn() isn't called during restore but parallel setworn() */
-    if (!restoring)
-        update_inventory();
+    update_inventory();
 }
 
 /* return item worn in slot indiciated by wornmask; needed by poly_obj() */