handle C++ vs enum arithmatic differently

The cast to (int) was much simpler but this seems better overall.
This commit is contained in:
PatR
2023-10-31 15:04:14 -07:00
parent 8d98b920f4
commit c8a84acfa5
3 changed files with 20 additions and 13 deletions

View File

@@ -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))

View File

@@ -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,

View File

@@ -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),