From: PatR Date: Fri, 15 Jun 2018 00:29:59 +0000 (-0700) Subject: another sortloot tweak X-Git-Tag: NetHack-3.6.2_Released~214^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3eb452ad946fe7e759f2a7e25bbc3145a1f878f1;p=nethack another sortloot tweak 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. --- diff --git a/src/invent.c b/src/invent.c index 87a000228..9a66d0883 100644 --- a/src/invent.c +++ b/src/invent.c @@ -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 */