include the PM_ index in mons (permonst)
This is useful for debugging and it allows the index
to be used directly instead of calculated in a
monsndx() function, which has been removed.
I left monsndx() in as a simple short-hand macro for the value
and didn't change the use cases, the reasoning being that this:
monsndx(mon->data)
is arguably a little easier on the eyes than:
mon->data->pmidx
LOW_PM, NON_PM, SPECIAL_PM have been included in the 'enum monnums'
now, instead of as individual macro definitions.
I chose to add the pmidx field as an instance of the enum declaration,
because that has very advantageous results in some debuggers, where it is
then shown as:
pmidx PM_GRAND_MASTER (349) monnums
instead of the less-informative:
pmidx 349 int
Adding the element count to the extern declaration for mons from:
'extern struct permonst *mons[];'
to the more specific declaration to that in src/monst.c:
'extern struct permonst *mons[NUMMONS + 1];'
then allows navigation through the mons array in one of the debuggers.
This commit is contained in:
@@ -1695,7 +1695,6 @@ extern struct attack *dmgtype_fromattack(struct permonst *, int, int);
|
|||||||
extern boolean dmgtype(struct permonst *, int);
|
extern boolean dmgtype(struct permonst *, int);
|
||||||
extern int max_passive_dmg(struct monst *, struct monst *);
|
extern int max_passive_dmg(struct monst *, struct monst *);
|
||||||
extern boolean same_race(struct permonst *, struct permonst *);
|
extern boolean same_race(struct permonst *, struct permonst *);
|
||||||
extern int monsndx(struct permonst *);
|
|
||||||
extern int name_to_mon(const char *, int *);
|
extern int name_to_mon(const char *, int *);
|
||||||
extern int name_to_monplus(const char *, const char **, int *);
|
extern int name_to_monplus(const char *, const char **, int *);
|
||||||
extern int name_to_monclass(const char *, int *);
|
extern int name_to_monclass(const char *, int *);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#ifndef MONDATA_H
|
#ifndef MONDATA_H
|
||||||
#define MONDATA_H
|
#define MONDATA_H
|
||||||
|
|
||||||
|
#define monsndx(ptr) ((ptr)->pmidx)
|
||||||
#define verysmall(ptr) ((ptr)->msize < MZ_SMALL)
|
#define verysmall(ptr) ((ptr)->msize < MZ_SMALL)
|
||||||
#define bigmonst(ptr) ((ptr)->msize >= MZ_LARGE)
|
#define bigmonst(ptr) ((ptr)->msize >= MZ_LARGE)
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,18 @@
|
|||||||
* for a blinding attack, they determine the amount of time blinded.
|
* for a blinding attack, they determine the amount of time blinded.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum monnums {
|
||||||
|
#define MONS_ENUM
|
||||||
|
#include "monsters.h"
|
||||||
|
#undef MONS_ENUM
|
||||||
|
NUMMONS,
|
||||||
|
NON_PM = -1, /* "not a monster */
|
||||||
|
LOW_PM = NON_PM + 1, /* first monster in mons */
|
||||||
|
SPECIAL_PM = PM_LONG_WORM_TAIL /* [normal] < ~ < [special] */
|
||||||
|
/* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are
|
||||||
|
never generated randomly and cannot be polymorphed into */
|
||||||
|
};
|
||||||
|
|
||||||
struct attack {
|
struct attack {
|
||||||
uchar aatyp;
|
uchar aatyp;
|
||||||
uchar adtyp, damn, damd;
|
uchar adtyp, damn, damd;
|
||||||
@@ -42,6 +54,7 @@ struct attack {
|
|||||||
|
|
||||||
struct permonst {
|
struct permonst {
|
||||||
const char *pmnames[NUM_MGENDERS];
|
const char *pmnames[NUM_MGENDERS];
|
||||||
|
const enum monnums pmidx; /* mons array index aka PM_ identifier */
|
||||||
char mlet; /* symbol */
|
char mlet; /* symbol */
|
||||||
schar mlevel, /* base monster level */
|
schar mlevel, /* base monster level */
|
||||||
mmove, /* move speed */
|
mmove, /* move speed */
|
||||||
@@ -60,17 +73,10 @@ struct permonst {
|
|||||||
mflags2; /* more boolean bitflags */
|
mflags2; /* more boolean bitflags */
|
||||||
unsigned short mflags3; /* yet more boolean bitflags */
|
unsigned short mflags3; /* yet more boolean bitflags */
|
||||||
uchar difficulty; /* toughness (formerly from makedefs -m) */
|
uchar difficulty; /* toughness (formerly from makedefs -m) */
|
||||||
uchar mcolor; /* color to use */
|
uchar mcolor; /* color to use */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern NEARDATA struct permonst mons[]; /* the master list of monster types */
|
extern NEARDATA struct permonst mons[NUMMONS + 1]; /* the master list of monster types */
|
||||||
|
|
||||||
enum monnums {
|
|
||||||
#define MONS_ENUM
|
|
||||||
#include "monsters.h"
|
|
||||||
#undef MONS_ENUM
|
|
||||||
NUMMONS
|
|
||||||
};
|
|
||||||
|
|
||||||
#define VERY_SLOW 3
|
#define VERY_SLOW 3
|
||||||
#define SLOW_SPEED 9
|
#define SLOW_SPEED 9
|
||||||
@@ -78,12 +84,6 @@ enum monnums {
|
|||||||
#define FAST_SPEED 15
|
#define FAST_SPEED 15
|
||||||
#define VERY_FAST 24
|
#define VERY_FAST 24
|
||||||
|
|
||||||
#define NON_PM (-1) /* "not a monster" */
|
|
||||||
#define LOW_PM (NON_PM + 1) /* first monster in mons[] */
|
|
||||||
#define SPECIAL_PM PM_LONG_WORM_TAIL /* [normal] < ~ < [special] */
|
|
||||||
/* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are
|
|
||||||
never generated randomly and cannot be polymorphed into */
|
|
||||||
|
|
||||||
#ifdef PMNAME_MACROS
|
#ifdef PMNAME_MACROS
|
||||||
#define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \
|
#define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \
|
||||||
? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL])
|
? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL])
|
||||||
|
|||||||
@@ -1110,6 +1110,9 @@ timet_delta(time_t etim, time_t stim) /* end and start times */
|
|||||||
struct enum_dump monsdump[] = {
|
struct enum_dump monsdump[] = {
|
||||||
#include "monsters.h"
|
#include "monsters.h"
|
||||||
{ NUMMONS, "NUMMONS" },
|
{ NUMMONS, "NUMMONS" },
|
||||||
|
{ NON_PM, "NON_PM" },
|
||||||
|
{ LOW_PM, "LOW_PM" },
|
||||||
|
{ SPECIAL_PM, "SPECIAL_PM" }
|
||||||
};
|
};
|
||||||
struct enum_dump objdump[] = {
|
struct enum_dump objdump[] = {
|
||||||
#include "objects.h"
|
#include "objects.h"
|
||||||
@@ -1162,7 +1165,9 @@ dump_enums(void)
|
|||||||
for (i = 0; i < NUM_ENUM_DUMPS; ++ i) {
|
for (i = 0; i < NUM_ENUM_DUMPS; ++ i) {
|
||||||
raw_printf("enum %s = {", titles[i]);
|
raw_printf("enum %s = {", titles[i]);
|
||||||
for (j = 0; j < szd[i]; ++j) {
|
for (j = 0; j < szd[i]; ++j) {
|
||||||
nmprefix = (j == szd[i] - 1) ? "" : pfx[i]; /* "" or "PM_" */
|
int unprefixed_count = (i == monsters_enum) ? 4 : 1;
|
||||||
|
nmprefix = (j >= szd[i] - unprefixed_count)
|
||||||
|
? "" : pfx[i]; /* "" or "PM_" */
|
||||||
nmwidth = 27 - (int) strlen(nmprefix); /* 27 or 24 */
|
nmwidth = 27 - (int) strlen(nmprefix); /* 27 or 24 */
|
||||||
raw_printf(" %s%*s = %3d,",
|
raw_printf(" %s%*s = %3d,",
|
||||||
nmprefix, -nmwidth, ed[i][j].nm, ed[i][j].val);
|
nmprefix, -nmwidth, ed[i][j].nm, ed[i][j].val);
|
||||||
|
|||||||
@@ -771,26 +771,6 @@ same_race(struct permonst *pm1, struct permonst *pm2)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DISABLE_WARNING_UNREACHABLE_CODE
|
|
||||||
|
|
||||||
/* return an index into the mons array */
|
|
||||||
int
|
|
||||||
monsndx(struct permonst *ptr)
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
|
|
||||||
i = (int) (ptr - &mons[0]);
|
|
||||||
if (i < LOW_PM || i >= NUMMONS) {
|
|
||||||
panic("monsndx - could not index monster (%s)",
|
|
||||||
fmt_ptr((genericptr_t) ptr));
|
|
||||||
/*NOTREACHED*/
|
|
||||||
return NON_PM; /* will not get here */
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
RESTORE_WARNING_UNREACHABLE_CODE
|
|
||||||
|
|
||||||
/* for handling alternate spellings */
|
/* for handling alternate spellings */
|
||||||
struct alt_spl {
|
struct alt_spl {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|||||||
19
src/monst.c
19
src/monst.c
@@ -23,13 +23,15 @@
|
|||||||
flg1, flg2, flg3, d, col, bn) \
|
flg1, flg2, flg3, d, col, bn) \
|
||||||
{ \
|
{ \
|
||||||
{ (const char *) 0, (const char *) 0, nam }, \
|
{ (const char *) 0, (const char *) 0, nam }, \
|
||||||
sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \
|
PM_##bn, \
|
||||||
|
sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, \
|
#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, \
|
||||||
flg1, flg2, flg3, d, col, bn) \
|
flg1, flg2, flg3, d, col, bn) \
|
||||||
{ \
|
{ \
|
||||||
{ namm, namf, namn }, \
|
{ namm, namf, namn }, \
|
||||||
|
PM_##bn, \
|
||||||
sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \
|
sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \
|
||||||
}
|
}
|
||||||
/* LVL() and SIZ() collect several fields to cut down on number of args
|
/* LVL() and SIZ() collect several fields to cut down on number of args
|
||||||
@@ -52,11 +54,22 @@ struct permonst mons_init[NUMMONS + 1] = {
|
|||||||
/*
|
/*
|
||||||
* array terminator
|
* array terminator
|
||||||
*/
|
*/
|
||||||
|
#undef MON
|
||||||
|
#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, \
|
||||||
|
flg1, flg2, flg3, d, col, bn) \
|
||||||
|
{ \
|
||||||
|
{ (const char *) 0, (const char *) 0, nam }, \
|
||||||
|
NON_PM, \
|
||||||
|
sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \
|
||||||
|
}
|
||||||
MON("", 0, LVL(0, 0, 0, 0, 0), (0),
|
MON("", 0, LVL(0, 0, 0, 0, 0), (0),
|
||||||
A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||||
SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0, 0)
|
SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#undef MON
|
||||||
|
#undef MON3
|
||||||
|
|
||||||
void monst_globals_init(void); /* in hack.h but we're using config.h */
|
void monst_globals_init(void); /* in hack.h but we're using config.h */
|
||||||
|
|
||||||
struct permonst mons[SIZE(mons_init)];
|
struct permonst mons[SIZE(mons_init)];
|
||||||
@@ -76,8 +89,6 @@ const struct attack c_sa_no[NATTK] = SEDUCTION_ATTACKS_NO;
|
|||||||
#undef C
|
#undef C
|
||||||
#define C(c) (0x1f & (c)) /* global.h */
|
#define C(c) (0x1f & (c)) /* global.h */
|
||||||
#undef NO_ATTK
|
#undef NO_ATTK
|
||||||
#undef MON
|
|
||||||
#undef MON3
|
|
||||||
#undef LVL
|
#undef LVL
|
||||||
#undef SIZ
|
#undef SIZ
|
||||||
#undef ATTK
|
#undef ATTK
|
||||||
|
|||||||
Reference in New Issue
Block a user