]> granicus.if.org Git - nethack/commitdiff
another sortloot tweak
authorPatR <rankin@nethack.org>
Fri, 15 Jun 2018 00:29:59 +0000 (17:29 -0700)
committerPatR <rankin@nethack.org>
Fri, 15 Jun 2018 00:29:59 +0000 (17:29 -0700)
The code that formats an object for use in alphabetic comparisons
during sorting is forcing off wizard mode to avoid any alternate
formatting that might produce.  Add a guarantee that doing this can't
be used as a backdoor to create a normal mode panic file if someone
figures out a way to make xname() panic.

src/invent.c

index 87a000228b764d16ffead8ce8b08f8c781326297..9a66d0883fcbecc572b1205c44dfafbc7dbc41aa 100644 (file)
@@ -214,11 +214,20 @@ struct obj *obj;
     /* suppress user-assigned name */
     if (save_oname && !obj->oartifact)
         ONAME(obj) = 0;
-    flags.debug = FALSE; /* avoid wizard mode formatting variations */
+    /* avoid wizard mode formatting variations */
+    if (wizard) { /* flags.debug */
+        /* paranoia:  before toggling off wizard mode, guard against a
+           panic in xname() producing a normal mode panic save file */
+        program_state.something_worth_saving = 0;
+        flags.debug = FALSE;
+    }
 
     res = cxname_singular(obj);
 
-    flags.debug = save_debug;
+    if (save_debug) {
+        flags.debug = TRUE;
+        program_state.something_worth_saving = 1;
+    }
     /* restore the object */
     if (obj->oclass == POTION_CLASS) {
         obj->odiluted = saveo.odiluted;
@@ -409,7 +418,7 @@ tiebreak:
  *      whether the list was already sorted as it got ready to do the
  *      sorting, so re-examining inventory or a pile of objects without
  *      having changed anything would gobble up less CPU than a full
- *      sort.  But it had as least two problems (aside from the ordinary
+ *      sort.  But it had at least two problems (aside from the ordinary
  *      complement of bugs):
  *      1) some players wanted to get the original order back when they
  *      changed the 'sortloot' option back to 'none', but the list
@@ -449,10 +458,15 @@ boolean FDECL((*filterfunc), (OBJ_P));
     /* note: if there is a filter function, this might overallocate */
     sliarray = (Loot *) alloc((n + 1) * sizeof *sliarray);
 
+    /* the 'keep cockatrice corpses' flag is overloaded with sort mode */
     augment_filter = (mode & SORTLOOT_PETRIFY) ? TRUE : FALSE;
+    mode &= ~SORTLOOT_PETRIFY; /* remove flag, leaving mode */
     /* populate aliarray[0..n-1] */
     for (i = 0, o = *olist; o; ++i, o = by_nexthere ? o->nexthere : o->nobj) {
         if (filterfunc && !(*filterfunc)(o)
+            /* caller may be asking us to override filterfunc (in order
+               to do a cockatrice corpse touch check during pickup even
+               if/when the filter rejects food class) */
             && (!augment_filter || o->otyp != CORPSE
                 || !touch_petrifies(&mons[o->corpsenm])))
             continue;
@@ -465,11 +479,10 @@ boolean FDECL((*filterfunc), (OBJ_P));
     sliarray[n].obj = (struct obj *) 0, sliarray[n].indx = -1;
     sliarray[n].str = (char *) 0;
     sliarray[n].class = sliarray[n].subclass = sliarray[n].disco = 0;
-    mode &= ~SORTLOOT_PETRIFY;
 
     /* do the sort; if no sorting is requested, we'll just return
        a sortloot_item array reflecting the current ordering */
-    if (mode) {
+    if (mode && n > 1) {
         sortlootmode = mode; /* extra input for sortloot_cmp() */
         qsort((genericptr_t) sliarray, n, sizeof *sliarray, sortloot_cmp);
         sortlootmode = 0; /* reset static mode flags */