|| glyph_is_male_statue_piletop(glyph))
#define glyph_is_statue(glyph) \
(glyph_is_male_statue(glyph) || glyph_is_fem_statue(glyph))
-/* note: 'strange object' gets [mis?]classified as generic here but that
- shouldn't impact anything; to do it properly, glyph_is_normal_generic_obj()
- and glyph_is_piletop_generic_obj() should use '>' rather than '>=', and
- glyph_is_normal_object() and glyph_is_normal_piletop_obj() should include
- (glyph == {GLYPH_OBJ_OFF,GLYPH_OBJ_PILETOP_OFF}) to test for object #0 */
+/* generic objects are after strange object (GLYPH_OBJ_OFF) and before
+ other objects (GLYPH_OBJ_OFF + MAXOCLASSES) */
#define glyph_is_normal_generic_obj(glyph) \
- ((glyph) >= GLYPH_OBJ_OFF && (glyph) < GLYPH_OBJ_OFF + MAXOCLASSES)
+ ((glyph) > GLYPH_OBJ_OFF && (glyph) < GLYPH_OBJ_OFF + MAXOCLASSES)
#define glyph_is_piletop_generic_obj(glyph) \
- ((glyph) >= GLYPH_OBJ_PILETOP_OFF \
+ ((glyph) > GLYPH_OBJ_PILETOP_OFF \
&& (glyph) < GLYPH_OBJ_PILETOP_OFF + MAXOCLASSES)
#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 + MAXOCLASSES) \
- && ((glyph) < (GLYPH_OBJ_PILETOP_OFF + NUM_OBJECTS)))
+ ((glyph) == GLYPH_OBJ_PILETOP_OFF \
+ || ((glyph) > GLYPH_OBJ_PILETOP_OFF + MAXOCLASSES \
+ && (glyph) < (GLYPH_OBJ_PILETOP_OFF + NUM_OBJECTS)))
#define glyph_is_normal_object(glyph) \
- ((((glyph) >= GLYPH_OBJ_OFF + MAXOCLASSES) \
- && ((glyph) < (GLYPH_OBJ_OFF + NUM_OBJECTS))) \
+ ((glyph) == GLYPH_OBJ_OFF \
+ || ((glyph) >= GLYPH_OBJ_OFF + MAXOCLASSES \
+ && (glyph) < (GLYPH_OBJ_OFF + NUM_OBJECTS)) \
|| glyph_is_normal_piletop_obj(glyph))
#if 0 /* [note: out of date] */
extern struct obj *mkobj_at(char, coordxy, coordxy, boolean);
extern struct obj *mksobj_at(int, coordxy, coordxy, boolean, boolean);
extern struct obj *mksobj_migr_to_species(int, unsigned, boolean, boolean);
-extern struct obj *mkobj(int, boolean);
+extern struct obj *mkobj(int, boolean) NONNULL;
extern int rndmonnum_adj(int, int);
extern int rndmonnum(void);
extern boolean bogon_is_pname(char);
extern void costly_alteration(struct obj *, int);
extern void clear_dknown(struct obj *);
extern void unknow_object(struct obj *);
-extern struct obj *mksobj(int, boolean, boolean);
+extern struct obj *mksobj(int, boolean, boolean) NONNULL;
extern int bcsign(struct obj *);
extern int weight(struct obj *);
extern struct obj *mkgold(long, coordxy, coordxy);
obj->known = objects[obj->otyp].oc_uses_known ? 0 : 1;
}
-/* mksobj(): create a specific type of object; result it always non-Null */
+/* mksobj(): create a specific type of object; result is always non-Null */
struct obj *
mksobj(int otyp, boolean init, boolean artif)
{
prevoclass = (int) oclass;
}
/* extra entry allows deriving the range of a class via
- bases[class] through bases[class+1]-1 for all classes */
+ bases[class] through bases[class+1]-1 for all classes
+ (except for ILLOBJ_CLASS which is separated from WEAPON_CLASS
+ by generic objects) */
gb.bases[MAXOCLASSES] = NUM_OBJECTS;
/* hypothetically someone might remove all objects of some class,
or be adding a new class and not populated it yet, leaving gaps
int oclass;
for (oclass = 0; oclass < MAXOCLASSES; ++oclass) {
sum = 0;
+ /* note: for ILLOBJ_CLASS, bases[oclass+1]-1 isn't the last item
+ in the class; but all the generic items have probability 0 so
+ adding them to 'sum' has no impact */
for (i = gb.bases[oclass]; i < gb.bases[oclass + 1]; ++i) {
sum += objects[i].oc_prob;
}
if (sum <= 0 && oclass != ILLOBJ_CLASS
&& gb.bases[oclass] != gb.bases[oclass + 1]) {
- impossible("zero or negative probability total for oclass %d",
- oclass);
+ impossible("%s (%d) probability total for oclass %d",
+ !sum ? "zero" : "negative", sum, oclass);
/* gracefully fail by setting all members of this class to 1 */
for (i = gb.bases[oclass]; i < gb.bases[oclass + 1]; ++i) {
objects[i].oc_prob = 1;
}
static void
-look_at_object(char *buf, /* output buffer */
- coordxy x, coordxy y, int glyph)
+look_at_object(
+ char *buf, /* output buffer */
+ coordxy x, coordxy y,
+ int glyph)
{
struct obj *otmp = 0;
boolean fakeobj = object_from_map(glyph, x, y, &otmp);