Even more globals moved to instance_globals.

This commit is contained in:
Bart House
2018-11-24 19:27:56 -08:00
parent 5807fb5062
commit 6d6623cf57
13 changed files with 315 additions and 301 deletions

View File

@@ -578,6 +578,49 @@ struct rogueroom {
int nroom; /* Only meaningful for "real" rooms */
};
typedef struct ls_t {
struct ls_t *next;
xchar x, y; /* source's position */
short range; /* source's current range */
short flags;
short type; /* type of light source */
anything id; /* source's identifier */
} light_source;
struct container {
struct container *next;
xchar x, y;
short what;
genericptr_t list;
};
enum bubble_contains_types {
CONS_OBJ = 0,
CONS_MON,
CONS_HERO,
CONS_TRAP
};
#define MAX_BMASK 4
struct bubble {
xchar x, y; /* coordinates of the upper left corner */
schar dx, dy; /* the general direction of the bubble's movement */
uchar bm[MAX_BMASK + 2]; /* bubble bit mask */
struct bubble *prev, *next; /* need to traverse the list up and down */
struct container *cons;
};
struct musable {
struct obj *offensive;
struct obj *defensive;
struct obj *misc;
int has_offense, has_defense, has_misc;
/* =0, no capability; otherwise, different numbers.
* If it's an object, the object is also set (it's 0 otherwise).
*/
};
/* instance_globals holds engine state that does not need to be
* persisted upon game exit. The initialization state is well defined
* an set in decl.c during early early engine initialization.
@@ -720,6 +763,18 @@ struct instance_globals {
* reset by sortloot when done */
char *invbuf;
unsigned invbufsiz;
/* for perm_invent when operating on a partial inventory display, so that
the persistent one doesn't get shrunk during filtering for item selection
then regrown to full inventory, possibly being resized in the process */
winid cached_pickinv_win;
/* query objlist callback: return TRUE if obj type matches "this_type" */
int this_type;
/* query objlist callback: return TRUE if obj is at given location */
coord only;
/* light.c */
light_source *light_base;
/* lock.c */
struct xlock_s xlock;
@@ -760,10 +815,16 @@ struct instance_globals {
lev_region bughack; /* for preserving the insect legs when wallifying
* baalz level */
boolean was_waterlevel; /* ugh... this shouldn't be needed */
struct bubble *bbubbles;
struct bubble *ebubbles;
struct trap *wportal;
int xmin, ymin, xmax, ymax; /* level boundaries */
/* mon.c */
boolean vamp_rise_msg;
boolean disintegested;
short *animal_list; /* list of PM values for animal monsters */
int animal_list_count;
/* muse.c */
boolean m_using; /* kludge to use mondided instead of killed */
@@ -775,6 +836,7 @@ struct instance_globals {
* function mbhitm has to be compatible with the
* normal zap routines, and those routines don't
* remember who zapped the wand. */
struct musable m;
/* objname.c */
/* distantname used by distant_name() to pass extra information to

View File

@@ -12,43 +12,8 @@
#define WRITE_SAVE 0x2
#define FREE_SAVE 0x4
#define MAX_BMASK 4
/* operations of the various saveXXXchn & co. routines */
#define perform_bwrite(mode) ((mode) & (COUNT_SAVE | WRITE_SAVE))
#define release_data(mode) ((mode) &FREE_SAVE)
/* The following are used in mkmaze.c */
struct container {
struct container *next;
xchar x, y;
short what;
genericptr_t list;
};
enum bubble_contains_types {
CONS_OBJ = 0,
CONS_MON,
CONS_HERO,
CONS_TRAP
};
struct bubble {
xchar x, y; /* coordinates of the upper left corner */
schar dx, dy; /* the general direction of the bubble's movement */
uchar bm[MAX_BMASK + 2]; /* bubble bit mask */
struct bubble *prev, *next; /* need to traverse the list up and down */
struct container *cons;
};
/* used in light.c */
typedef struct ls_t {
struct ls_t *next;
xchar x, y; /* source's position */
short range; /* source's current range */
short flags;
short type; /* type of light source */
anything id; /* source's identifier */
} light_source;
#endif /* LEV_H */

View File

@@ -438,6 +438,12 @@ const struct instance_globals g_init = {
0, /* sortloogmode */
NULL, /* invbuf */
0, /* inbufsize */
WIN_ERR, /* cached_pickinv_win */
UNDEFINED_VALUE,
UNDEFINED_VALUES,
/* light.c */
NULL, /* light_source */
/* lock.c */
UNDEFINED_VALUES,
@@ -472,16 +478,26 @@ const struct instance_globals g_init = {
/* mkmaze.c */
{ {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} }, /* bughack */
UNDEFINED_VALUE, /* was_waterlevel */
UNDEFINED_PTR, /* bbubbles */
UNDEFINED_PTR, /* ebubbles */
UNDEFINED_PTR, /* wportal */
UNDEFINED_VALUE, /* xmin */
UNDEFINED_VALUE, /* ymin */
UNDEFINED_VALUE, /* xmax */
UNDEFINED_VALUE, /* ymax */
/* mon.c */
UNDEFINED_VALUE, /* vamp_rise_msg */
UNDEFINED_VALUE, /* disintegested */
NULL, /* animal_list */
UNDEFINED_VALUE, /* animal_list_count */
/* mused.c */
/* muse.c */
FALSE, /* m_using */
UNDEFINED_VALUE, /* trapx */
UNDEFINED_VALUE, /* trapy */
UNDEFINED_VALUE, /* zap_oseen */
UNDEFINED_VALUES, /* m */
/* objname.c */
0, /* distantname */

View File

@@ -3127,7 +3127,6 @@ boolean FDECL((*proc), (char *));
return rv;
}
extern struct symparse loadsyms[]; /* drawing.c */
extern const char *known_handling[]; /* drawing.c */
extern const char *known_restrictions[]; /* drawing.c */

View File

@@ -48,7 +48,7 @@ STATIC_DCL char FDECL(obj_to_let, (struct obj *));
* confused: 'WIZARD' used to be a compile-time conditional so this was
* guarded by #ifdef WIZARD/.../#endif.]
*/
static char venom_inv[] = { VENOM_CLASS, 0 }; /* (constant) */
static const char venom_inv[] = { VENOM_CLASS, 0 }; /* (constant) */
/* sortloot() classification; called at most once for each object sorted */
STATIC_OVL void
@@ -2464,17 +2464,12 @@ struct obj *list, **last_found;
return (struct obj *) 0;
}
/* for perm_invent when operating on a partial inventory display, so that
the persistent one doesn't get shrunk during filtering for item selection
then regrown to full inventory, possibly being resized in the process */
static winid cached_pickinv_win = WIN_ERR;
void
free_pickinv_cache()
{
if (cached_pickinv_win != WIN_ERR) {
destroy_nhwindow(cached_pickinv_win);
cached_pickinv_win = WIN_ERR;
if (g.cached_pickinv_win != WIN_ERR) {
destroy_nhwindow(g.cached_pickinv_win);
g.cached_pickinv_win = WIN_ERR;
}
}
@@ -2494,7 +2489,7 @@ long *out_cnt;
static const char not_carrying_anything[] = "Not carrying anything";
struct obj *otmp, wizid_fakeobj;
char ilet, ret;
char *invlet = flags.inv_order;
const char *invlet = flags.inv_order;
int n, classcount;
winid win; /* windows being used */
anything any;
@@ -2510,9 +2505,9 @@ long *out_cnt;
/* partial inventory in perm_invent setting; don't operate on
full inventory window, use an alternate one instead; create
the first time needed and keep it for re-use as needed later */
if (cached_pickinv_win == WIN_ERR)
cached_pickinv_win = create_nhwindow(NHW_MENU);
win = cached_pickinv_win;
if (g.cached_pickinv_win == WIN_ERR)
g.cached_pickinv_win = create_nhwindow(NHW_MENU);
win = g.cached_pickinv_win;
} else
win = WIN_INVEN;
@@ -2997,22 +2992,20 @@ dounpaid()
destroy_nhwindow(win);
}
/* query objlist callback: return TRUE if obj type matches "this_type" */
static int this_type;
STATIC_OVL boolean
this_type_only(obj)
struct obj *obj;
{
boolean res = (obj->oclass == this_type);
boolean res = (obj->oclass == g.this_type);
if (obj->oclass == COIN_CLASS) {
/* if filtering by bless/curse state, gold is classified as
either unknown or uncursed based on user option setting */
if (this_type && index("BUCX", this_type))
res = (this_type == (iflags.goldX ? 'X' : 'U'));
if (g.this_type && index("BUCX", g.this_type))
res = (g.this_type == (iflags.goldX ? 'X' : 'U'));
} else {
switch (this_type) {
switch (g.this_type) {
case 'B':
res = (obj->bknown && obj->blessed);
break;
@@ -3071,7 +3064,7 @@ dotypeinv()
n = query_category(prompt, invent, i, &pick_list, PICK_ONE);
if (!n)
return 0;
this_type = c = pick_list[0].item.a_int;
g.this_type = c = pick_list[0].item.a_int;
free((genericptr_t) pick_list);
}
}
@@ -3189,7 +3182,7 @@ dotypeinv()
You("have no %sobjects%s.", before, after);
return 0;
}
this_type = oclass;
g.this_type = oclass;
}
if (query_objlist((char *) 0, &invent,
((flags.invlet_constant ? USE_INVLET : 0)
@@ -4289,14 +4282,12 @@ register struct obj *obj;
return ret;
}
/* query objlist callback: return TRUE if obj is at given location */
static coord only;
STATIC_OVL boolean
only_here(obj)
struct obj *obj;
{
return (obj->ox == only.x && obj->oy == only.y);
return (obj->ox == g.only.x && obj->oy == g.only.y);
}
/*
@@ -4323,13 +4314,13 @@ boolean as_if_seen;
}
if (n) {
only.x = x;
only.y = y;
g.only.x = x;
g.only.y = y;
if (query_objlist("Things that are buried here:",
&level.buriedobjlist, INVORDER_SORT,
&selected, PICK_NONE, only_here) > 0)
free((genericptr_t) selected);
only.x = only.y = 0;
g.only.x = g.only.y = 0;
}
return n;
}

View File

@@ -42,8 +42,6 @@
#define LSF_SHOW 0x1 /* display the light source */
#define LSF_NEEDS_FIXUP 0x2 /* need oid fixup */
static light_source *light_base = 0;
STATIC_DCL void FDECL(write_ls, (int, light_source *));
STATIC_DCL int FDECL(maybe_write_ls, (int, int, BOOLEAN_P));
@@ -67,14 +65,14 @@ anything *id;
ls = (light_source *) alloc(sizeof(light_source));
ls->next = light_base;
ls->next = g.light_base;
ls->x = x;
ls->y = y;
ls->range = range;
ls->type = type;
ls->id = *id;
ls->flags = 0;
light_base = ls;
g.light_base = ls;
vision_full_recalc = 1; /* make the source show up */
}
@@ -107,7 +105,7 @@ anything *id;
break;
}
for (prev = 0, curr = light_base; curr; prev = curr, curr = curr->next) {
for (prev = 0, curr = g.light_base; curr; prev = curr, curr = curr->next) {
if (curr->type != type)
continue;
if (curr->id.a_obj
@@ -115,7 +113,7 @@ anything *id;
if (prev)
prev->next = curr->next;
else
light_base = curr->next;
g.light_base = curr->next;
free((genericptr_t) curr);
vision_full_recalc = 1;
@@ -137,7 +135,7 @@ char **cs_rows;
light_source *ls;
char *row;
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
ls->flags &= ~LSF_SHOW;
/*
@@ -255,7 +253,7 @@ int fd, mode, range;
}
if (release_data(mode)) {
for (prev = &light_base; (curr = *prev) != 0;) {
for (prev = &g.light_base; (curr = *prev) != 0;) {
if (!curr->id.a_monst) {
impossible("save_light_sources: no id! [range=%d]", range);
is_global = 0;
@@ -301,8 +299,8 @@ int fd;
while (count-- > 0) {
ls = (light_source *) alloc(sizeof(light_source));
mread(fd, (genericptr_t) ls, sizeof(light_source));
ls->next = light_base;
light_base = ls;
ls->next = g.light_base;
g.light_base = ls;
}
}
@@ -317,7 +315,7 @@ long *count, *size;
Sprintf(hdrbuf, hdrfmt, (long) sizeof (light_source));
*count = *size = 0L;
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
++*count;
*size += (long) sizeof *ls;
}
@@ -332,7 +330,7 @@ boolean ghostly;
unsigned nid;
light_source *ls;
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
if (ls->flags & LSF_NEEDS_FIXUP) {
if (ls->type == LS_OBJECT || ls->type == LS_MONSTER) {
if (ghostly) {
@@ -371,7 +369,7 @@ boolean write_it;
int count = 0, is_global;
light_source *ls;
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
if (!ls->id.a_monst) {
impossible("maybe_write_ls: no id! [range=%d]", range);
continue;
@@ -408,7 +406,7 @@ light_sources_sanity_check()
struct obj *otmp;
unsigned int auint;
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
if (!ls->id.a_monst)
panic("insane light source: no id!");
if (ls->type == LS_OBJECT) {
@@ -475,7 +473,7 @@ struct obj *src, *dest;
{
light_source *ls;
for (ls = light_base; ls; ls = ls->next)
for (ls = g.light_base; ls; ls = ls->next)
if (ls->type == LS_OBJECT && ls->id.a_obj == src)
ls->id.a_obj = dest;
src->lamplit = 0;
@@ -486,7 +484,7 @@ struct obj *src, *dest;
boolean
any_light_source()
{
return (boolean) (light_base != (light_source *) 0);
return (boolean) (g.light_base != (light_source *) 0);
}
/*
@@ -500,7 +498,7 @@ int x, y;
light_source *ls;
struct obj *obj;
for (ls = light_base; ls; ls = ls->next)
for (ls = g.light_base; ls; ls = ls->next)
/*
* Is this position check valid??? Can I assume that the positions
* will always be correct because the objects would have been
@@ -553,7 +551,7 @@ struct obj *src, *dest;
{
light_source *ls, *new_ls;
for (ls = light_base; ls; ls = ls->next)
for (ls = g.light_base; ls; ls = ls->next)
if (ls->type == LS_OBJECT && ls->id.a_obj == src) {
/*
* Insert the new source at beginning of list. This will
@@ -569,8 +567,8 @@ struct obj *src, *dest;
vision_full_recalc = 1; /* in case range changed */
}
new_ls->id.a_obj = dest;
new_ls->next = light_base;
light_base = new_ls;
new_ls->next = g.light_base;
g.light_base = new_ls;
dest->lamplit = 1; /* now an active light source */
}
}
@@ -587,7 +585,7 @@ struct obj *src, *dest;
if (src != dest)
end_burn(src, TRUE); /* extinguish candles */
for (ls = light_base; ls; ls = ls->next)
for (ls = g.light_base; ls; ls = ls->next)
if (ls->type == LS_OBJECT && ls->id.a_obj == dest) {
ls->range = candle_light_range(dest);
vision_full_recalc = 1; /* in case range changed */
@@ -603,7 +601,7 @@ int new_radius;
{
light_source *ls;
for (ls = light_base; ls; ls = ls->next)
for (ls = g.light_base; ls; ls = ls->next)
if (ls->type == LS_OBJECT && ls->id.a_obj == obj) {
if (new_radius != ls->range)
vision_full_recalc = 1;
@@ -709,10 +707,10 @@ wiz_light_sources()
putstr(win, 0, buf);
putstr(win, 0, "");
if (light_base) {
if (g.light_base) {
putstr(win, 0, "location range flags type id");
putstr(win, 0, "-------- ----- ------ ---- -------");
for (ls = light_base; ls; ls = ls->next) {
for (ls = g.light_base; ls; ls = ls->next) {
Sprintf(buf, " %2d,%2d %2d 0x%04x %s %s", ls->x, ls->y,
ls->range, ls->flags,
(ls->type == LS_OBJECT

View File

@@ -2112,7 +2112,7 @@ struct monst *mtmp;
MCORPSENM(mtmp) = NON_PM;
}
static NEARDATA char syms[] = {
static const NEARDATA char syms[] = {
MAXOCLASSES, MAXOCLASSES + 1, RING_CLASS, WAND_CLASS, WEAPON_CLASS,
FOOD_CLASS, COIN_CLASS, SCROLL_CLASS, POTION_CLASS, ARMOR_CLASS,
AMULET_CLASS, TOOL_CLASS, ROCK_CLASS, GEM_CLASS, SPBOOK_CLASS,

View File

@@ -61,8 +61,8 @@ schar bg_typ;
return levl[col][row].typ;
}
static int dirs[16] = { -1, -1 /**/, -1, 0 /**/, -1, 1 /**/, 0, -1 /**/,
0, 1 /**/, 1, -1 /**/, 1, 0 /**/, 1, 1 };
static const int dirs[16] = { -1, -1 /**/, -1, 0 /**/, -1, 1 /**/, 0, -1 /**/,
0, 1 /**/, 1, -1 /**/, 1, 0 /**/, 1, 1 };
STATIC_OVL void
pass_one(bg_typ, fg_typ)

View File

@@ -1371,15 +1371,11 @@ fumaroles()
* other source files, but they are all so nicely encapsulated here.
*/
static struct bubble *bbubbles, *ebubbles;
static struct trap *wportal;
static int xmin, ymin, xmax, ymax; /* level boundaries */
/* bubble movement boundaries */
#define bxmin (xmin + 1)
#define bymin (ymin + 1)
#define bxmax (xmax - 1)
#define bymax (ymax - 1)
#define gbxmin (g.xmin + 1)
#define gbymin (g.ymin + 1)
#define gbxmax (g.xmax - 1)
#define gbymax (g.ymax - 1)
STATIC_DCL void NDECL(set_wportal);
STATIC_DCL void FDECL(mk_bubble, (int, int, int));
@@ -1398,7 +1394,7 @@ movebubbles()
1, 0, 0, 0, 0 };
/* set up the portal the first time bubbles are moved */
if (!wportal)
if (!g.wportal)
set_wportal();
vision_recalc(2);
@@ -1412,7 +1408,7 @@ movebubbles()
* Pick up everything inside of a bubble then fill all bubble
* locations.
*/
for (b = up ? bbubbles : ebubbles; b; b = up ? b->next : b->prev) {
for (b = up ? g.bbubbles : g.ebubbles; b; b = up ? b->next : b->prev) {
if (b->cons)
panic("movebubbles: cons != null");
for (i = 0, x = b->x; i < (int) b->bm[0]; i++, x++)
@@ -1511,7 +1507,7 @@ movebubbles()
* would eventually end up in the last bubble in the chain.
*/
up = !up;
for (b = up ? bbubbles : ebubbles; b; b = up ? b->next : b->prev) {
for (b = up ? g.bbubbles : g.ebubbles; b; b = up ? b->next : b->prev) {
int rx = rn2(3), ry = rn2(3);
mv_bubble(b, b->dx + 1 - (!b->dx ? rx : (rx ? 1 : 0)),
@@ -1570,14 +1566,14 @@ int fd, mode;
if (perform_bwrite(mode)) {
int n = 0;
for (b = bbubbles; b; b = b->next)
for (b = g.bbubbles; b; b = b->next)
++n;
bwrite(fd, (genericptr_t) &n, sizeof(int));
bwrite(fd, (genericptr_t) &xmin, sizeof(int));
bwrite(fd, (genericptr_t) &ymin, sizeof(int));
bwrite(fd, (genericptr_t) &xmax, sizeof(int));
bwrite(fd, (genericptr_t) &ymax, sizeof(int));
for (b = bbubbles; b; b = b->next)
bwrite(fd, (genericptr_t) &g.xmin, sizeof(int));
bwrite(fd, (genericptr_t) &g.ymin, sizeof(int));
bwrite(fd, (genericptr_t) &g.xmax, sizeof(int));
bwrite(fd, (genericptr_t) &g.ymax, sizeof(int));
for (b = g.bbubbles; b; b = b->next)
bwrite(fd, (genericptr_t) b, sizeof(struct bubble));
}
if (release_data(mode))
@@ -1596,24 +1592,24 @@ int fd;
set_wportal();
mread(fd, (genericptr_t) &n, sizeof(int));
mread(fd, (genericptr_t) &xmin, sizeof(int));
mread(fd, (genericptr_t) &ymin, sizeof(int));
mread(fd, (genericptr_t) &xmax, sizeof(int));
mread(fd, (genericptr_t) &ymax, sizeof(int));
mread(fd, (genericptr_t) &g.xmin, sizeof(int));
mread(fd, (genericptr_t) &g.ymin, sizeof(int));
mread(fd, (genericptr_t) &g.xmax, sizeof(int));
mread(fd, (genericptr_t) &g.ymax, sizeof(int));
for (i = 0; i < n; i++) {
btmp = b;
b = (struct bubble *) alloc(sizeof(struct bubble));
mread(fd, (genericptr_t) b, sizeof(struct bubble));
if (bbubbles) {
if (g.bbubbles) {
btmp->next = b;
b->prev = btmp;
} else {
bbubbles = b;
g.bbubbles = b;
b->prev = (struct bubble *) 0;
}
mv_bubble(b, 0, 0, TRUE);
}
ebubbles = b;
g.ebubbles = b;
b->next = (struct bubble *) 0;
g.was_waterlevel = TRUE;
}
@@ -1652,8 +1648,8 @@ STATIC_OVL void
set_wportal()
{
/* there better be only one magic portal on water level... */
for (wportal = ftrap; wportal; wportal = wportal->ntrap)
if (wportal->ttyp == MAGIC_PORTAL)
for (g.wportal = ftrap; g.wportal; g.wportal = g.wportal->ntrap)
if (g.wportal->ttyp == MAGIC_PORTAL)
return;
impossible("set_wportal(): no portal!");
}
@@ -1668,15 +1664,15 @@ setup_waterlevel()
/* ouch, hardcoded... */
xmin = 3;
ymin = 1;
xmax = 78;
ymax = 20;
g.xmin = 3;
g.ymin = 1;
g.xmax = 78;
g.ymax = 20;
/* set hero's memory to water */
for (x = xmin; x <= xmax; x++)
for (y = ymin; y <= ymax; y++)
for (x = g.xmin; x <= g.xmax; x++)
for (y = g.ymin; y <= g.ymax; y++)
levl[x][y].glyph = Is_waterlevel(&u.uz) ? water_glyph : air_glyph;
/* make bubbles */
@@ -1689,8 +1685,8 @@ setup_waterlevel()
yskip = 3 + rn2(3);
}
for (x = bxmin; x <= bxmax; x += xskip)
for (y = bymin; y <= bymax; y += yskip)
for (x = gbxmin; x <= gbxmax; x += xskip)
for (y = gbymin; y <= gbymax; y += yskip)
mk_bubble(x, y, rn2(7));
}
@@ -1701,11 +1697,11 @@ unsetup_waterlevel()
/* free bubbles */
for (b = bbubbles; b; b = bb) {
for (b = g.bbubbles; b; b = bb) {
bb = b->next;
free((genericptr_t) b);
}
bbubbles = ebubbles = (struct bubble *) 0;
g.bbubbles = g.ebubbles = (struct bubble *) 0;
}
STATIC_OVL void
@@ -1729,7 +1725,7 @@ int x, y, n;
*bmask[] = { bm2, bm3, bm4, bm5, bm6, bm7, bm8 };
struct bubble *b;
if (x >= bxmax || y >= bymax)
if (x >= gbxmax || y >= gbymax)
return;
if (n >= SIZE(bmask)) {
impossible("n too large (mk_bubble)");
@@ -1739,10 +1735,10 @@ int x, y, n;
panic("bmask size is larger than MAX_BMASK");
}
b = (struct bubble *) alloc(sizeof(struct bubble));
if ((x + (int) bmask[n][0] - 1) > bxmax)
x = bxmax - bmask[n][0] + 1;
if ((y + (int) bmask[n][1] - 1) > bymax)
y = bymax - bmask[n][1] + 1;
if ((x + (int) bmask[n][0] - 1) > gbxmax)
x = gbxmax - bmask[n][0] + 1;
if ((y + (int) bmask[n][1] - 1) > gbymax)
y = gbymax - bmask[n][1] + 1;
b->x = x;
b->y = y;
b->dx = 1 - rn2(3);
@@ -1751,15 +1747,15 @@ int x, y, n;
(void) memcpy((genericptr_t) b->bm, (genericptr_t) bmask[n],
(bmask[n][1] + 2) * sizeof(b->bm[0]));
b->cons = 0;
if (!bbubbles)
bbubbles = b;
if (ebubbles) {
ebubbles->next = b;
b->prev = ebubbles;
if (!g.bbubbles)
g.bbubbles = b;
if (g.ebubbles) {
g.ebubbles->next = b;
b->prev = g.ebubbles;
} else
b->prev = (struct bubble *) 0;
b->next = (struct bubble *) 0;
ebubbles = b;
g.ebubbles = b;
mv_bubble(b, 0, 0, TRUE);
}
@@ -1793,42 +1789,42 @@ boolean ini;
* collision with level borders?
* 1 = horizontal border, 2 = vertical, 3 = corner
*/
if (b->x <= bxmin)
if (b->x <= gbxmin)
colli |= 2;
if (b->y <= bymin)
if (b->y <= gbymin)
colli |= 1;
if ((int) (b->x + b->bm[0] - 1) >= bxmax)
if ((int) (b->x + b->bm[0] - 1) >= gbxmax)
colli |= 2;
if ((int) (b->y + b->bm[1] - 1) >= bymax)
if ((int) (b->y + b->bm[1] - 1) >= gbymax)
colli |= 1;
if (b->x < bxmin) {
pline("bubble xmin: x = %d, xmin = %d", b->x, bxmin);
b->x = bxmin;
if (b->x < gbxmin) {
pline("bubble xmin: x = %d, xmin = %d", b->x, gbxmin);
b->x = gbxmin;
}
if (b->y < bymin) {
pline("bubble ymin: y = %d, ymin = %d", b->y, bymin);
b->y = bymin;
if (b->y < gbymin) {
pline("bubble ymin: y = %d, ymin = %d", b->y, gbymin);
b->y = gbymin;
}
if ((int) (b->x + b->bm[0] - 1) > bxmax) {
if ((int) (b->x + b->bm[0] - 1) > gbxmax) {
pline("bubble xmax: x = %d, xmax = %d", b->x + b->bm[0] - 1,
bxmax);
b->x = bxmax - b->bm[0] + 1;
gbxmax);
b->x = gbxmax - b->bm[0] + 1;
}
if ((int) (b->y + b->bm[1] - 1) > bymax) {
if ((int) (b->y + b->bm[1] - 1) > gbymax) {
pline("bubble ymax: y = %d, ymax = %d", b->y + b->bm[1] - 1,
bymax);
b->y = bymax - b->bm[1] + 1;
gbymax);
b->y = gbymax - b->bm[1] + 1;
}
/* bounce if we're trying to move off the border */
if (b->x == bxmin && dx < 0)
if (b->x == gbxmin && dx < 0)
dx = -dx;
if (b->x + b->bm[0] - 1 == bxmax && dx > 0)
if (b->x + b->bm[0] - 1 == gbxmax && dx > 0)
dx = -dx;
if (b->y == bymin && dy < 0)
if (b->y == gbymin && dy < 0)
dy = -dy;
if (b->y + b->bm[1] - 1 == bymax && dy > 0)
if (b->y + b->bm[1] - 1 == gbymax && dy > 0)
dy = -dy;
b->x += dx;

View File

@@ -1436,7 +1436,7 @@ register struct obj *obj;
return (wt ? wt * (int) obj->quan : ((int) obj->quan + 1) >> 1);
}
static int treefruits[] = { APPLE, ORANGE, PEAR, BANANA, EUCALYPTUS_LEAF };
static const int treefruits[] = { APPLE, ORANGE, PEAR, BANANA, EUCALYPTUS_LEAF };
struct obj *
rnd_treefruit_at(x, y)

View File

@@ -759,7 +759,7 @@ courtmon()
#define NSTYPES (PM_CAPTAIN - PM_SOLDIER + 1)
static struct {
static const struct {
unsigned pm;
unsigned prob;
} squadprob[NSTYPES] = { { PM_SOLDIER, 80 },

View File

@@ -3056,9 +3056,6 @@ struct monst *mon;
}
}
static short *animal_list = 0; /* list of PM values for animal monsters */
static int animal_list_count;
void
mon_animal_list(construct)
boolean construct;
@@ -3074,14 +3071,14 @@ boolean construct;
animal_temp[n++] = i;
/* if (n == 0) animal_temp[n++] = NON_PM; */
animal_list = (short *) alloc(n * sizeof *animal_list);
(void) memcpy((genericptr_t) animal_list, (genericptr_t) animal_temp,
n * sizeof *animal_list);
animal_list_count = n;
g.animal_list = (short *) alloc(n * sizeof *g.animal_list);
(void) memcpy((genericptr_t) g.animal_list, (genericptr_t) animal_temp,
n * sizeof *g.animal_list);
g.animal_list_count = n;
} else { /* release */
if (animal_list)
free((genericptr_t) animal_list), animal_list = 0;
animal_list_count = 0;
if (g.animal_list)
free((genericptr_t) g.animal_list), g.animal_list = 0;
g.animal_list_count = 0;
}
}
@@ -3090,15 +3087,15 @@ pick_animal()
{
int res;
if (!animal_list)
if (!g.animal_list)
mon_animal_list(TRUE);
res = animal_list[rn2(animal_list_count)];
res = g.animal_list[rn2(g.animal_list_count)];
/* rogue level should use monsters represented by uppercase letters
only, but since chameleons aren't generated there (not uppercase!)
we don't perform a lot of retries */
if (Is_rogue_level(&u.uz) && !isupper((uchar) mons[res].mlet))
res = animal_list[rn2(animal_list_count)];
res = g.animal_list[rn2(g.animal_list_count)];
return res;
}

View File

@@ -35,16 +35,6 @@ STATIC_DCL boolean FDECL(muse_unslime, (struct monst *, struct obj *,
STATIC_DCL int FDECL(cures_sliming, (struct monst *, struct obj *));
STATIC_DCL boolean FDECL(green_mon, (struct monst *));
static struct musable {
struct obj *offensive;
struct obj *defensive;
struct obj *misc;
int has_offense, has_defense, has_misc;
/* =0, no capability; otherwise, different numbers.
* If it's an object, the object is also set (it's 0 otherwise).
*/
} m;
/* Any preliminary checks which may result in the monster being unable to use
* the item. Returns 0 if nothing happened, 2 if the monster can't do
* anything (i.e. it teleported) and 1 if it's dead.
@@ -148,7 +138,7 @@ struct obj *obj;
monkilled(mon, "", AD_RBRE);
return 1;
}
m.has_defense = m.has_offense = m.has_misc = 0;
g.m.has_defense = g.m.has_offense = g.m.has_misc = 0;
/* Only one needed to be set to 0 but the others are harmless */
}
return 0;
@@ -265,18 +255,18 @@ struct monst *mtmp;
{
struct obj *obj = 0;
if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) != 0) {
m.defensive = obj;
m.has_defense = MUSE_POT_FULL_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_FULL_HEALING;
return TRUE;
}
if ((obj = m_carrying(mtmp, POT_EXTRA_HEALING)) != 0) {
m.defensive = obj;
m.has_defense = MUSE_POT_EXTRA_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_EXTRA_HEALING;
return TRUE;
}
if ((obj = m_carrying(mtmp, POT_HEALING)) != 0) {
m.defensive = obj;
m.has_defense = MUSE_POT_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_HEALING;
return TRUE;
}
return FALSE;
@@ -302,8 +292,8 @@ struct monst *mtmp;
if (u.uswallow && stuck)
return FALSE;
m.defensive = (struct obj *) 0;
m.has_defense = 0;
g.m.defensive = (struct obj *) 0;
g.m.has_defense = 0;
/* since unicorn horns don't get used up, the monster would look
* silly trying to use the same cursed horn round after round
@@ -315,8 +305,8 @@ struct monst *mtmp;
break;
}
if (obj || is_unicorn(mtmp->data)) {
m.defensive = obj;
m.has_defense = MUSE_UNICORN_HORN;
g.m.defensive = obj;
g.m.has_defense = MUSE_UNICORN_HORN;
return TRUE;
}
}
@@ -326,8 +316,8 @@ struct monst *mtmp;
for (obj = mtmp->minvent; obj; obj = obj->nobj) {
if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD) {
m.defensive = obj;
m.has_defense = MUSE_LIZARD_CORPSE;
g.m.defensive = obj;
g.m.has_defense = MUSE_LIZARD_CORPSE;
return TRUE;
} else if (obj->otyp == TIN && obj->corpsenm == PM_LIZARD) {
liztin = obj;
@@ -335,9 +325,9 @@ struct monst *mtmp;
}
/* confused or stunned monster might not be able to open tin */
if (liztin && mcould_eat_tin(mtmp) && rn2(3)) {
m.defensive = liztin;
g.m.defensive = liztin;
/* tin and corpse ultimately end up being handled the same */
m.has_defense = MUSE_LIZARD_CORPSE;
g.m.has_defense = MUSE_LIZARD_CORPSE;
return TRUE;
}
}
@@ -374,22 +364,22 @@ struct monst *mtmp;
} else if (levl[x][y].typ == STAIRS) {
if (x == xdnstair && y == ydnstair) {
if (!is_floater(mtmp->data))
m.has_defense = MUSE_DOWNSTAIRS;
g.m.has_defense = MUSE_DOWNSTAIRS;
} else if (x == xupstair && y == yupstair) {
m.has_defense = MUSE_UPSTAIRS;
g.m.has_defense = MUSE_UPSTAIRS;
} else if (sstairs.sx && x == sstairs.sx && y == sstairs.sy) {
if (sstairs.up || !is_floater(mtmp->data))
m.has_defense = MUSE_SSTAIRS;
g.m.has_defense = MUSE_SSTAIRS;
}
} else if (levl[x][y].typ == LADDER) {
if (x == xupladder && y == yupladder) {
m.has_defense = MUSE_UP_LADDER;
g.m.has_defense = MUSE_UP_LADDER;
} else if (x == xdnladder && y == ydnladder) {
if (!is_floater(mtmp->data))
m.has_defense = MUSE_DN_LADDER;
g.m.has_defense = MUSE_DN_LADDER;
} else if (sstairs.sx && x == sstairs.sx && y == sstairs.sy) {
if (sstairs.up || !is_floater(mtmp->data))
m.has_defense = MUSE_SSTAIRS;
g.m.has_defense = MUSE_SSTAIRS;
}
} else {
/* Note: trap doors take precedence over teleport traps. */
@@ -434,12 +424,12 @@ struct monst *mtmp;
&& Can_fall_thru(&u.uz)) {
g.trapx = xx;
g.trapy = yy;
m.has_defense = MUSE_TRAPDOOR;
g.m.has_defense = MUSE_TRAPDOOR;
break; /* no need to look at any other spots */
} else if (t->ttyp == TELEP_TRAP) {
g.trapx = xx;
g.trapy = yy;
m.has_defense = MUSE_TELEPORT_TRAP;
g.m.has_defense = MUSE_TELEPORT_TRAP;
}
}
}
@@ -462,8 +452,8 @@ struct monst *mtmp;
if ((mon = m_at(xx, yy)) != 0 && is_mercenary(mon->data)
&& mon->data != &mons[PM_GUARD]
&& (mon->msleeping || !mon->mcanmove)) {
m.defensive = obj;
m.has_defense = MUSE_BUGLE;
g.m.defensive = obj;
g.m.has_defense = MUSE_BUGLE;
goto toot; /* double break */
}
}
@@ -473,7 +463,7 @@ struct monst *mtmp;
}
/* use immediate physical escape prior to attempting magic */
if (m.has_defense) /* stairs, trap door or tele-trap, bugle alert */
if (g.m.has_defense) /* stairs, trap door or tele-trap, bugle alert */
goto botm;
/* kludge to cut down on trap destruction (particularly portals) */
@@ -482,16 +472,16 @@ struct monst *mtmp;
|| t->ttyp == BEAR_TRAP))
t = 0; /* ok for monster to dig here */
#define nomore(x) if (m.has_defense == x) continue;
#define nomore(x) if (g.m.has_defense == x) continue;
/* selection could be improved by collecting all possibilities
into an array and then picking one at random */
for (obj = mtmp->minvent; obj; obj = obj->nobj) {
/* don't always use the same selection pattern */
if (m.has_defense && !rn2(3))
if (g.m.has_defense && !rn2(3))
break;
/* nomore(MUSE_WAN_DIGGING); */
if (m.has_defense == MUSE_WAN_DIGGING)
if (g.m.has_defense == MUSE_WAN_DIGGING)
break;
if (obj->otyp == WAN_DIGGING && obj->spe > 0 && !stuck && !t
&& !mtmp->isshk && !mtmp->isgd && !mtmp->ispriest
@@ -504,8 +494,8 @@ struct monst *mtmp;
&& !(is_ice(x, y) || is_pool(x, y) || is_lava(x, y))
&& !(mtmp->data == &mons[PM_VLAD_THE_IMPALER]
&& In_V_tower(&u.uz))) {
m.defensive = obj;
m.has_defense = MUSE_WAN_DIGGING;
g.m.defensive = obj;
g.m.has_defense = MUSE_WAN_DIGGING;
}
nomore(MUSE_WAN_TELEPORTATION_SELF);
nomore(MUSE_WAN_TELEPORTATION);
@@ -518,8 +508,8 @@ struct monst *mtmp;
*/
if (!level.flags.noteleport
|| !(mtmp->mtrapseen & (1 << (TELEP_TRAP - 1)))) {
m.defensive = obj;
m.has_defense = (mon_has_amulet(mtmp))
g.m.defensive = obj;
g.m.has_defense = (mon_has_amulet(mtmp))
? MUSE_WAN_TELEPORTATION
: MUSE_WAN_TELEPORTATION_SELF;
}
@@ -532,52 +522,52 @@ struct monst *mtmp;
/* see WAN_TELEPORTATION case above */
if (!level.flags.noteleport
|| !(mtmp->mtrapseen & (1 << (TELEP_TRAP - 1)))) {
m.defensive = obj;
m.has_defense = MUSE_SCR_TELEPORTATION;
g.m.defensive = obj;
g.m.has_defense = MUSE_SCR_TELEPORTATION;
}
}
if (mtmp->data != &mons[PM_PESTILENCE]) {
nomore(MUSE_POT_FULL_HEALING);
if (obj->otyp == POT_FULL_HEALING) {
m.defensive = obj;
m.has_defense = MUSE_POT_FULL_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_FULL_HEALING;
}
nomore(MUSE_POT_EXTRA_HEALING);
if (obj->otyp == POT_EXTRA_HEALING) {
m.defensive = obj;
m.has_defense = MUSE_POT_EXTRA_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_EXTRA_HEALING;
}
nomore(MUSE_WAN_CREATE_MONSTER);
if (obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) {
m.defensive = obj;
m.has_defense = MUSE_WAN_CREATE_MONSTER;
g.m.defensive = obj;
g.m.has_defense = MUSE_WAN_CREATE_MONSTER;
}
nomore(MUSE_POT_HEALING);
if (obj->otyp == POT_HEALING) {
m.defensive = obj;
m.has_defense = MUSE_POT_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_HEALING;
}
} else { /* Pestilence */
nomore(MUSE_POT_FULL_HEALING);
if (obj->otyp == POT_SICKNESS) {
m.defensive = obj;
m.has_defense = MUSE_POT_FULL_HEALING;
g.m.defensive = obj;
g.m.has_defense = MUSE_POT_FULL_HEALING;
}
nomore(MUSE_WAN_CREATE_MONSTER);
if (obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) {
m.defensive = obj;
m.has_defense = MUSE_WAN_CREATE_MONSTER;
g.m.defensive = obj;
g.m.has_defense = MUSE_WAN_CREATE_MONSTER;
}
}
nomore(MUSE_SCR_CREATE_MONSTER);
if (obj->otyp == SCR_CREATE_MONSTER) {
m.defensive = obj;
m.has_defense = MUSE_SCR_CREATE_MONSTER;
g.m.defensive = obj;
g.m.has_defense = MUSE_SCR_CREATE_MONSTER;
}
}
botm:
return (boolean) !!m.has_defense;
return (boolean) !!g.m.has_defense;
#undef nomore
}
@@ -590,7 +580,7 @@ use_defensive(mtmp)
struct monst *mtmp;
{
int i, fleetim, how = 0;
struct obj *otmp = m.defensive;
struct obj *otmp = g.m.defensive;
boolean vis, vismon, oseen;
const char *Mnam;
@@ -608,7 +598,7 @@ struct monst *mtmp;
monflee(m, fleetim, FALSE, FALSE); \
}
switch (m.has_defense) {
switch (g.m.has_defense) {
case MUSE_UNICORN_HORN:
if (vismon) {
if (otmp)
@@ -968,7 +958,7 @@ struct monst *mtmp;
return 0; /* i.e. an exploded wand */
default:
impossible("%s wanted to perform action %d?", Monnam(mtmp),
m.has_defense);
g.m.has_defense);
break;
}
return 0;
@@ -1051,8 +1041,8 @@ struct monst *mtmp;
boolean reflection_skip = (Reflecting && rn2(2));
struct obj *helmet = which_armor(mtmp, W_ARMH);
m.offensive = (struct obj *) 0;
m.has_offense = 0;
g.m.offensive = (struct obj *) 0;
g.m.has_offense = 0;
if (mtmp->mpeaceful || is_animal(mtmp->data) || mindless(mtmp->data)
|| nohands(mtmp->data))
return FALSE;
@@ -1068,55 +1058,55 @@ struct monst *mtmp;
if (!lined_up(mtmp))
return FALSE;
#define nomore(x) if (m.has_offense == x) continue;
#define nomore(x) if (g.m.has_offense == x) continue;
/* this picks the last viable item rather than prioritizing choices */
for (obj = mtmp->minvent; obj; obj = obj->nobj) {
if (!reflection_skip) {
nomore(MUSE_WAN_DEATH);
if (obj->otyp == WAN_DEATH && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_DEATH;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_DEATH;
}
nomore(MUSE_WAN_SLEEP);
if (obj->otyp == WAN_SLEEP && obj->spe > 0 && multi >= 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_SLEEP;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_SLEEP;
}
nomore(MUSE_WAN_FIRE);
if (obj->otyp == WAN_FIRE && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_FIRE;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_FIRE;
}
nomore(MUSE_FIRE_HORN);
if (obj->otyp == FIRE_HORN && obj->spe > 0 && can_blow(mtmp)) {
m.offensive = obj;
m.has_offense = MUSE_FIRE_HORN;
g.m.offensive = obj;
g.m.has_offense = MUSE_FIRE_HORN;
}
nomore(MUSE_WAN_COLD);
if (obj->otyp == WAN_COLD && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_COLD;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_COLD;
}
nomore(MUSE_FROST_HORN);
if (obj->otyp == FROST_HORN && obj->spe > 0 && can_blow(mtmp)) {
m.offensive = obj;
m.has_offense = MUSE_FROST_HORN;
g.m.offensive = obj;
g.m.has_offense = MUSE_FROST_HORN;
}
nomore(MUSE_WAN_LIGHTNING);
if (obj->otyp == WAN_LIGHTNING && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_LIGHTNING;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_LIGHTNING;
}
nomore(MUSE_WAN_MAGIC_MISSILE);
if (obj->otyp == WAN_MAGIC_MISSILE && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_MAGIC_MISSILE;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_MAGIC_MISSILE;
}
}
nomore(MUSE_WAN_STRIKING);
if (obj->otyp == WAN_STRIKING && obj->spe > 0) {
m.offensive = obj;
m.has_offense = MUSE_WAN_STRIKING;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_STRIKING;
}
#if 0 /* use_offensive() has had some code to support wand of teleportation
* for a long time, but find_offensive() never selected one;
@@ -1132,34 +1122,34 @@ struct monst *mtmp;
|| (u.ux == sstairs.sx && u.uy == sstairs.sy)
|| (u.ux == xupladder && u.uy == yupladder)
|| (u.ux == xdnladder && u.uy == ydnladder))) {
m.offensive = obj;
m.has_offense = MUSE_WAN_TELEPORTATION;
g.m.offensive = obj;
g.m.has_offense = MUSE_WAN_TELEPORTATION;
}
#endif
nomore(MUSE_POT_PARALYSIS);
if (obj->otyp == POT_PARALYSIS && multi >= 0) {
m.offensive = obj;
m.has_offense = MUSE_POT_PARALYSIS;
g.m.offensive = obj;
g.m.has_offense = MUSE_POT_PARALYSIS;
}
nomore(MUSE_POT_BLINDNESS);
if (obj->otyp == POT_BLINDNESS && !attacktype(mtmp->data, AT_GAZE)) {
m.offensive = obj;
m.has_offense = MUSE_POT_BLINDNESS;
g.m.offensive = obj;
g.m.has_offense = MUSE_POT_BLINDNESS;
}
nomore(MUSE_POT_CONFUSION);
if (obj->otyp == POT_CONFUSION) {
m.offensive = obj;
m.has_offense = MUSE_POT_CONFUSION;
g.m.offensive = obj;
g.m.has_offense = MUSE_POT_CONFUSION;
}
nomore(MUSE_POT_SLEEPING);
if (obj->otyp == POT_SLEEPING) {
m.offensive = obj;
m.has_offense = MUSE_POT_SLEEPING;
g.m.offensive = obj;
g.m.has_offense = MUSE_POT_SLEEPING;
}
nomore(MUSE_POT_ACID);
if (obj->otyp == POT_ACID) {
m.offensive = obj;
m.has_offense = MUSE_POT_ACID;
g.m.offensive = obj;
g.m.has_offense = MUSE_POT_ACID;
}
/* we can safely put this scroll here since the locations that
* are in a 1 square radius are a subset of the locations that
@@ -1175,20 +1165,20 @@ struct monst *mtmp;
&& mtmp->mcansee && haseyes(mtmp->data)
&& !Is_rogue_level(&u.uz)
&& (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) {
m.offensive = obj;
m.has_offense = MUSE_SCR_EARTH;
g.m.offensive = obj;
g.m.has_offense = MUSE_SCR_EARTH;
}
#if 0
nomore(MUSE_SCR_FIRE);
if (obj->otyp == SCR_FIRE && resists_fire(mtmp)
&& dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 2
&& mtmp->mcansee && haseyes(mtmp->data)) {
m.offensive = obj;
m.has_offense = MUSE_SCR_FIRE;
g.m.offensive = obj;
g.m.has_offense = MUSE_SCR_FIRE;
}
#endif /* 0 */
}
return (boolean) !!m.has_offense;
return (boolean) !!g.m.has_offense;
#undef nomore
}
@@ -1371,7 +1361,7 @@ use_offensive(mtmp)
struct monst *mtmp;
{
int i;
struct obj *otmp = m.offensive;
struct obj *otmp = g.m.offensive;
boolean oseen;
/* offensive potions are not drunk, they're thrown */
@@ -1379,7 +1369,7 @@ struct monst *mtmp;
return i;
oseen = otmp && canseemon(mtmp);
switch (m.has_offense) {
switch (g.m.has_offense) {
case MUSE_WAN_DEATH:
case MUSE_WAN_SLEEP:
case MUSE_WAN_FIRE:
@@ -1534,7 +1524,7 @@ struct monst *mtmp;
return 0; /* i.e. an exploded wand */
default:
impossible("%s wanted to perform action %d?", Monnam(mtmp),
m.has_offense);
g.m.has_offense);
break;
}
return 0;
@@ -1610,8 +1600,8 @@ struct monst *mtmp;
boolean immobile = (mdat->mmove == 0);
boolean stuck = (mtmp == u.ustuck);
m.misc = (struct obj *) 0;
m.has_misc = 0;
g.m.misc = (struct obj *) 0;
g.m.has_misc = 0;
if (is_animal(mdat) || mindless(mdat))
return 0;
if (u.uswallow && stuck)
@@ -1642,7 +1632,7 @@ struct monst *mtmp;
if (t->ttyp == POLY_TRAP) {
g.trapx = xx;
g.trapy = yy;
m.has_misc = MUSE_POLY_TRAP;
g.m.has_misc = MUSE_POLY_TRAP;
return TRUE;
}
}
@@ -1650,7 +1640,7 @@ struct monst *mtmp;
if (nohands(mdat))
return 0;
#define nomore(x) if (m.has_misc == x) continue
#define nomore(x) if (g.m.has_misc == x) continue
/*
* [bug?] Choice of item is not prioritized; the last viable one
* in the monster's inventory will be chosen.
@@ -1663,8 +1653,8 @@ struct monst *mtmp;
if (obj->otyp == POT_GAIN_LEVEL
&& (!obj->cursed
|| (!mtmp->isgd && !mtmp->isshk && !mtmp->ispriest))) {
m.misc = obj;
m.has_misc = MUSE_POT_GAIN_LEVEL;
g.m.misc = obj;
g.m.has_misc = MUSE_POT_GAIN_LEVEL;
}
nomore(MUSE_BULLWHIP);
if (obj->otyp == BULLWHIP && !mtmp->mpeaceful
@@ -1678,8 +1668,8 @@ struct monst *mtmp;
prevent cursed weapons from being targetted) */
&& (canletgo(uwep, "")
|| (u.twoweap && canletgo(uswapwep, "")))) {
m.misc = obj;
m.has_misc = MUSE_BULLWHIP;
g.m.misc = obj;
g.m.has_misc = MUSE_BULLWHIP;
}
/* Note: peaceful/tame monsters won't make themselves
* invisible unless you can see them. Not really right, but...
@@ -1688,41 +1678,41 @@ struct monst *mtmp;
if (obj->otyp == WAN_MAKE_INVISIBLE && obj->spe > 0 && !mtmp->minvis
&& !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible)
&& (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) {
m.misc = obj;
m.has_misc = MUSE_WAN_MAKE_INVISIBLE;
g.m.misc = obj;
g.m.has_misc = MUSE_WAN_MAKE_INVISIBLE;
}
nomore(MUSE_POT_INVISIBILITY);
if (obj->otyp == POT_INVISIBILITY && !mtmp->minvis
&& !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible)
&& (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) {
m.misc = obj;
m.has_misc = MUSE_POT_INVISIBILITY;
g.m.misc = obj;
g.m.has_misc = MUSE_POT_INVISIBILITY;
}
nomore(MUSE_WAN_SPEED_MONSTER);
if (obj->otyp == WAN_SPEED_MONSTER && obj->spe > 0
&& mtmp->mspeed != MFAST && !mtmp->isgd) {
m.misc = obj;
m.has_misc = MUSE_WAN_SPEED_MONSTER;
g.m.misc = obj;
g.m.has_misc = MUSE_WAN_SPEED_MONSTER;
}
nomore(MUSE_POT_SPEED);
if (obj->otyp == POT_SPEED && mtmp->mspeed != MFAST && !mtmp->isgd) {
m.misc = obj;
m.has_misc = MUSE_POT_SPEED;
g.m.misc = obj;
g.m.has_misc = MUSE_POT_SPEED;
}
nomore(MUSE_WAN_POLYMORPH);
if (obj->otyp == WAN_POLYMORPH && obj->spe > 0
&& (mtmp->cham == NON_PM) && mons[monsndx(mdat)].difficulty < 6) {
m.misc = obj;
m.has_misc = MUSE_WAN_POLYMORPH;
g.m.misc = obj;
g.m.has_misc = MUSE_WAN_POLYMORPH;
}
nomore(MUSE_POT_POLYMORPH);
if (obj->otyp == POT_POLYMORPH && (mtmp->cham == NON_PM)
&& mons[monsndx(mdat)].difficulty < 6) {
m.misc = obj;
m.has_misc = MUSE_POT_POLYMORPH;
g.m.misc = obj;
g.m.has_misc = MUSE_POT_POLYMORPH;
}
}
return (boolean) !!m.has_misc;
return (boolean) !!g.m.has_misc;
#undef nomore
}
@@ -1748,7 +1738,7 @@ use_misc(mtmp)
struct monst *mtmp;
{
int i;
struct obj *otmp = m.misc;
struct obj *otmp = g.m.misc;
boolean vis, vismon, oseen;
char nambuf[BUFSZ];
@@ -1758,7 +1748,7 @@ struct monst *mtmp;
vismon = canseemon(mtmp);
oseen = otmp && vismon;
switch (m.has_misc) {
switch (g.m.has_misc) {
case MUSE_POT_GAIN_LEVEL:
mquaffmsg(mtmp, otmp);
if (otmp->cursed) {
@@ -1951,7 +1941,7 @@ struct monst *mtmp;
return 0; /* i.e. an exploded wand */
default:
impossible("%s wanted to perform action %d?", Monnam(mtmp),
m.has_misc);
g.m.has_misc);
break;
}
return 0;