From c8a84acfa576ea1dbd7847aabf96e602af2bcd57 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 31 Oct 2023 15:04:14 -0700 Subject: [PATCH] handle C++ vs enum arithmatic differently The cast to (int) was much simpler but this seems better overall. --- include/display.h | 18 +++++++----------- include/objects.h | 12 ++++++++++-- src/allmain.c | 3 +++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/display.h b/include/display.h index 27582ce6b..6a895cdcc 100644 --- a/include/display.h +++ b/include/display.h @@ -181,14 +181,10 @@ * * 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. - * NUM_OBJECTS and MAXOCLASSES are from different enum lists and recent C++ - * (for the Qt interface) complains about mixing them in arithmatic so cast - * them to int here. Doesn't impact compiling random_object() with C. + * -/+ FIRST_OBJECT is used to skip it and them. */ #define random_monster(rng) ((*rng)(NUMMONS)) -#define random_object(rng) \ - ((*rng)((int) NUM_OBJECTS - (int) MAXOCLASSES) + (int) MAXOCLASSES) +#define random_object(rng) ((*rng)(NUM_OBJECTS - FIRST_OBJECT) + FIRST_OBJECT) /* * what_obj() @@ -861,22 +857,22 @@ enum glyph_offsets { #define glyph_is_statue(glyph) \ (glyph_is_male_statue(glyph) || glyph_is_fem_statue(glyph)) /* generic objects are after strange object (GLYPH_OBJ_OFF) and before - other objects (GLYPH_OBJ_OFF + MAXOCLASSES) */ + other objects (GLYPH_OBJ_OFF + FIRST_OBJECT) */ #define glyph_is_normal_generic_obj(glyph) \ - ((glyph) > GLYPH_OBJ_OFF && (glyph) < GLYPH_OBJ_OFF + MAXOCLASSES) + ((glyph) > GLYPH_OBJ_OFF && (glyph) < GLYPH_OBJ_OFF + FIRST_OBJECT) #define glyph_is_piletop_generic_obj(glyph) \ ((glyph) > GLYPH_OBJ_PILETOP_OFF \ - && (glyph) < GLYPH_OBJ_PILETOP_OFF + MAXOCLASSES) + && (glyph) < GLYPH_OBJ_PILETOP_OFF + FIRST_OBJECT) #define glyph_is_generic_object(glyph) \ (glyph_is_normal_generic_obj(glyph) \ || glyph_is_piletop_generic_obj(glyph)) #define glyph_is_normal_piletop_obj(glyph) \ ((glyph) == GLYPH_OBJ_PILETOP_OFF \ - || ((glyph) > GLYPH_OBJ_PILETOP_OFF + MAXOCLASSES \ + || ((glyph) > GLYPH_OBJ_PILETOP_OFF + FIRST_OBJECT \ && (glyph) < (GLYPH_OBJ_PILETOP_OFF + NUM_OBJECTS))) #define glyph_is_normal_object(glyph) \ ((glyph) == GLYPH_OBJ_OFF \ - || ((glyph) >= GLYPH_OBJ_OFF + MAXOCLASSES \ + || ((glyph) >= GLYPH_OBJ_OFF + FIRST_OBJECT \ && (glyph) < (GLYPH_OBJ_OFF + NUM_OBJECTS)) \ || glyph_is_normal_piletop_obj(glyph)) diff --git a/include/objects.h b/include/objects.h index 72dfa4b07..ac4f6f407 100644 --- a/include/objects.h +++ b/include/objects.h @@ -98,6 +98,14 @@ GENERIC("iron ball", BALL_CLASS, GENERIC_BALL), /* [15] */ GENERIC("iron chain", CHAIN_CLASS, GENERIC_CHAIN), /* [16] */ GENERIC("venom", VENOM_CLASS, GENERIC_VENOM), /* [17] */ #undef GENERIC +/* FIRST_OBJECT: it would be simpler just to use MARKER(FIRST_OBJECT,ARROW) + below but that is vulnerable to neglecting to update the marker enum + after inserting something in front of arrow */ +MARKER(LAST_GENERIC, GENERIC_VENOM) +MARKER(FIRST_OBJECT, LAST_GENERIC + 1) +/* this definition of FIRST_OBJECT advances the default value for next enum; + backtrack to fix that, otherwise ARROW and the rest would be off by 1 */ +MARKER(OBJCLASS_HACK, FIRST_OBJECT - 1) /* weapons ... */ #define WEAPON(name,desc,kn,mg,bi,prob,wt, \ @@ -810,9 +818,9 @@ MARKER(FIRST_AMULET, AMULET_OF_ESP) AMULET("amulet of life saving", "spherical", LIFESAVED, 75, AMULET_OF_LIFE_SAVING), AMULET("amulet of strangulation", "oval", STRANGLED, 115, - AMULET_OF_STRANGULATION), + AMULET_OF_STRANGULATION), AMULET("amulet of restful sleep", "triangular", SLEEPY, 115, - AMULET_OF_RESTFUL_SLEEP), + AMULET_OF_RESTFUL_SLEEP), AMULET("amulet versus poison", "pyramidal", POISON_RES, 115, AMULET_VERSUS_POISON), AMULET("amulet of change", "square", 0, 115, diff --git a/src/allmain.c b/src/allmain.c index e26f171f7..d9c8c7431 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -1127,6 +1127,9 @@ dump_enums(void) }; #define dump_om(om) { om, #om } static const struct enum_dump omdump[] = { + dump_om(LAST_GENERIC), + dump_om(OBJCLASS_HACK), + dump_om(FIRST_OBJECT), dump_om(FIRST_AMULET), dump_om(LAST_AMULET), dump_om(FIRST_SPELL),