generic object fix

When hallucinating, random object selection for objects was including
the new generic objects.  It was already excluding 'strange object'
by using 'rn2(NUM_OBJECTS - 1) + 1' to skip objects[0]; changing that
to be 'rn2(NUM_OBJECTS - MAXOCLASSES) + MAXOCLASSES' will skip the
first 18 objects, 'strange object' plus the 17 generic objects.

(I'm trying to convince myself that there's no off-by-1 or off-by-N
error and think I've succeeded.)
This commit is contained in:
PatR
2023-01-15 11:04:35 -08:00
parent 2e1f52e882
commit 68d8b5376a
3 changed files with 13 additions and 6 deletions
+4
View File
@@ -1457,6 +1457,10 @@ adding command line 'nethack --usage' broke 'nethack -u name' (however,
being hit by a big monster and getting knockback effect could send hero out being hit by a big monster and getting knockback effect could send hero out
of a shop (or into its "free spot") while carrying unpaid goods; of a shop (or into its "free spot") while carrying unpaid goods;
robbery wasn't noticed until hero eventually moved to a different spot robbery wasn't noticed until hero eventually moved to a different spot
hallucination of objects incorrectly included generic objects as candidates
for what objects looked like; if an object had its dknown flag set,
formatting a generic object in its place was unreliable (Null pointer
deference prior to static analyzer fix, odd fake name "generic" after)
curses: 'msg_window' option wasn't functional for curses unless the binary curses: 'msg_window' option wasn't functional for curses unless the binary
also included tty support also included tty support
+4 -2
View File
@@ -180,9 +180,11 @@
* random_object() * random_object()
* *
* Respectively return a random monster or object. * Respectively return a random monster or object.
* random_object() won't return STRANGE_OBJECT or the generic objects.
* -/+ MAXOCLASSES is used to skip it and them.
*/ */
#define random_monster(rng) rng(NUMMONS) #define random_monster(rng) ((*rng)(NUMMONS))
#define random_object(rng) (rng(NUM_OBJECTS - 1) + 1) #define random_object(rng) ((*rng)(NUM_OBJECTS - MAXOCLASSES) + MAXOCLASSES)
/* /*
* what_obj() * what_obj()
+5 -4
View File
@@ -332,10 +332,11 @@ look_at_object(
} }
static void static void
look_at_monster(char *buf, look_at_monster(
char *monbuf, /* buf: output, monbuf: optional output */ char *buf,
struct monst *mtmp, char *monbuf, /* buf: output, monbuf: optional output */
coordxy x, coordxy y) struct monst *mtmp,
coordxy x, coordxy y)
{ {
char *name, monnambuf[BUFSZ], healthbuf[BUFSZ]; char *name, monnambuf[BUFSZ], healthbuf[BUFSZ];
boolean accurate = !Hallucination; boolean accurate = !Hallucination;