Moved more globals to instance_globals.

This commit is contained in:
Bart House
2018-12-16 19:52:43 -08:00
parent 471224ea70
commit 40b682ecf6
37 changed files with 987 additions and 869 deletions
+1 -2
View File
@@ -1508,14 +1508,13 @@ struct obj *obj;
case CREATE_PORTAL: {
int i, num_ok_dungeons, last_ok_dungeon = 0;
d_level newlev;
extern int n_dgns; /* from dungeon.c */
winid tmpwin = create_nhwindow(NHW_MENU);
anything any;
any = zeroany; /* set all bits to zero */
start_menu(tmpwin);
/* use index+1 (cant use 0) as identifier */
for (i = num_ok_dungeons = 0; i < n_dgns; i++) {
for (i = num_ok_dungeons = 0; i < g.n_dgns; i++) {
if (!dungeons[i].dunlev_ureached)
continue;
any.a_int = i + 1;
+2 -3
View File
@@ -20,11 +20,10 @@ STATIC_OVL boolean
no_bones_level(lev)
d_level *lev;
{
extern d_level save_dlevel; /* in do.c */
s_level *sptr;
if (ledger_no(&save_dlevel))
assign_level(lev, &save_dlevel);
if (ledger_no(&g.save_dlevel))
assign_level(lev, &g.save_dlevel);
return (boolean) (((sptr = Is_special(lev)) != 0 && !sptr->boneid)
|| !dungeons[lev->dnum].boneid
+2 -2
View File
@@ -739,10 +739,10 @@ boolean *valsetlist;
*/
if (fld == BL_GOLD
&& (context.rndencode != oldrndencode
|| showsyms[COIN_CLASS + SYM_OFF_O] != oldgoldsym)) {
|| g.showsyms[COIN_CLASS + SYM_OFF_O] != oldgoldsym)) {
update_all = TRUE; /* chg = 2; */
oldrndencode = context.rndencode;
oldgoldsym = showsyms[COIN_CLASS + SYM_OFF_O];
oldgoldsym = g.showsyms[COIN_CLASS + SYM_OFF_O];
}
reset = FALSE;
+32 -44
View File
@@ -266,16 +266,6 @@ int xtime;
STATIC_DCL char NDECL(popch);
/* Provide a means to redo the last command. The flag `in_doagain' is set
* to true while redoing the command. This flag is tested in commands that
* require additional input (like `throw' which requires a thing and a
* direction), and the input prompt is not shown. Also, while in_doagain is
* TRUE, no keystrokes can be saved into the saveq.
*/
#define BSIZE 20
static char pushq[BSIZE], saveq[BSIZE];
static NEARDATA int phead, ptail, shead, stail;
STATIC_OVL char
popch()
{
@@ -287,9 +277,9 @@ popch()
if (occupation)
return '\0';
if (in_doagain)
return (char) ((shead != stail) ? saveq[stail++] : '\0');
return (char) ((g.shead != g.stail) ? g.saveq[g.stail++] : '\0');
else
return (char) ((phead != ptail) ? pushq[ptail++] : '\0');
return (char) ((g.phead != g.ptail) ? g.pushq[g.ptail++] : '\0');
}
char
@@ -310,9 +300,9 @@ pushch(ch)
char ch;
{
if (!ch)
phead = ptail = 0;
if (phead < BSIZE)
pushq[phead++] = ch;
g.phead = g.ptail = 0;
if (g.phead < BSIZE)
g.pushq[g.phead++] = ch;
return;
}
@@ -325,9 +315,9 @@ char ch;
{
if (!in_doagain) {
if (!ch)
phead = ptail = shead = stail = 0;
else if (shead < BSIZE)
saveq[shead++] = ch;
g.phead = g.ptail = g.shead = g.stail = 0;
else if (g.shead < BSIZE)
g.saveq[g.shead++] = ch;
}
return;
}
@@ -1547,8 +1537,6 @@ doterrain(VOID_ARGS)
}
/* -enlightenment and conduct- */
static winid en_win = WIN_ERR;
static boolean en_via_menu = FALSE;
static const char You_[] = "You ", are[] = "are ", were[] = "were ",
have[] = "have ", had[] = "had ", can[] = "can ",
could[] = "could ";
@@ -1570,13 +1558,13 @@ static void
enlght_out(buf)
const char *buf;
{
if (en_via_menu) {
if (g.en_via_menu) {
anything any;
any = zeroany;
add_menu(en_win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
add_menu(g.en_win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
} else
putstr(en_win, 0, buf);
putstr(g.en_win, 0, buf);
}
static void
@@ -1708,10 +1696,10 @@ int final; /* ENL_GAMEINPROGRESS:0, ENL_GAMEOVERALIVE, ENL_GAMEOVERDEAD */
{
char buf[BUFSZ], tmpbuf[BUFSZ];
en_win = create_nhwindow(NHW_MENU);
en_via_menu = !final;
if (en_via_menu)
start_menu(en_win);
g.en_win = create_nhwindow(NHW_MENU);
g.en_via_menu = !final;
if (g.en_via_menu)
start_menu(g.en_win);
Strcpy(tmpbuf, plname);
*tmpbuf = highc(*tmpbuf); /* same adjustment as bottom line */
@@ -1746,18 +1734,18 @@ int final; /* ENL_GAMEINPROGRESS:0, ENL_GAMEOVERALIVE, ENL_GAMEOVERDEAD */
attributes_enlightenment(mode, final);
}
if (!en_via_menu) {
display_nhwindow(en_win, TRUE);
if (!g.en_via_menu) {
display_nhwindow(g.en_win, TRUE);
} else {
menu_item *selected = 0;
end_menu(en_win, (char *) 0);
if (select_menu(en_win, PICK_NONE, &selected) > 0)
end_menu(g.en_win, (char *) 0);
if (select_menu(g.en_win, PICK_NONE, &selected) > 0)
free((genericptr_t) selected);
en_via_menu = FALSE;
g.en_via_menu = FALSE;
}
destroy_nhwindow(en_win);
en_win = WIN_ERR;
destroy_nhwindow(g.en_win);
g.en_win = WIN_ERR;
}
/*ARGSUSED*/
@@ -3108,8 +3096,8 @@ int final;
int ngenocided;
/* Create the conduct window */
en_win = create_nhwindow(NHW_MENU);
putstr(en_win, 0, "Voluntary challenges:");
g.en_win = create_nhwindow(NHW_MENU);
putstr(g.en_win, 0, "Voluntary challenges:");
if (u.uroleplay.blind)
you_have_been("blind from birth");
@@ -3203,9 +3191,9 @@ int final;
}
/* Pop up the window and wait for a key */
display_nhwindow(en_win, TRUE);
destroy_nhwindow(en_win);
en_win = WIN_ERR;
display_nhwindow(g.en_win, TRUE);
destroy_nhwindow(g.en_win);
g.en_win = WIN_ERR;
}
/* ordered by command name */
@@ -4499,9 +4487,9 @@ register char *cmd;
context.move = FALSE;
return;
}
if (*cmd == DOAGAIN && !in_doagain && saveq[0]) {
if (*cmd == DOAGAIN && !in_doagain && g.saveq[0]) {
in_doagain = TRUE;
stail = 0;
g.stail = 0;
rhack((char *) 0); /* read and execute command */
in_doagain = FALSE;
return;
@@ -4582,7 +4570,7 @@ register char *cmd;
case NHKF_CLICKLOOK:
if (iflags.clicklook) {
context.move = FALSE;
do_look(2, &clicklook_cc);
do_look(2, &g.clicklook_cc);
}
return;
case NHKF_TRAVEL:
@@ -5347,8 +5335,8 @@ int x, y, mod;
cmd[1] = 0;
if (iflags.clicklook && mod == CLICK_2) {
clicklook_cc.x = x;
clicklook_cc.y = y;
g.clicklook_cc.x = x;
g.clicklook_cc.y = y;
cmd[0] = g.Cmd.spkeys[NHKF_CLICKLOOK];
return cmd;
}
+17 -27
View File
@@ -282,16 +282,6 @@ boolean flag;
return TRUE;
}
struct entity {
struct monst *emon; /* youmonst for the player */
struct permonst *edata; /* must be non-zero for record to be valid */
int ex, ey;
};
#define ENTITIES 2
static NEARDATA struct entity occupants[ENTITIES];
STATIC_OVL
struct entity *
e_at(x, y)
@@ -300,15 +290,15 @@ int x, y;
int entitycnt;
for (entitycnt = 0; entitycnt < ENTITIES; entitycnt++)
if ((occupants[entitycnt].edata) && (occupants[entitycnt].ex == x)
&& (occupants[entitycnt].ey == y))
if ((g.occupants[entitycnt].edata) && (g.occupants[entitycnt].ex == x)
&& (g.occupants[entitycnt].ey == y))
break;
debugpline1("entitycnt = %d", entitycnt);
#ifdef D_DEBUG
wait_synch();
#endif
return (entitycnt == ENTITIES) ? (struct entity *) 0
: &(occupants[entitycnt]);
: &(g.occupants[entitycnt]);
}
STATIC_OVL void
@@ -471,9 +461,9 @@ int xkill_flags, how;
/* dead long worm handling */
for (entitycnt = 0; entitycnt < ENTITIES; entitycnt++) {
if (etmp != &(occupants[entitycnt])
&& etmp->emon == occupants[entitycnt].emon)
occupants[entitycnt].edata = (struct permonst *) 0;
if (etmp != &(g.occupants[entitycnt])
&& etmp->emon == g.occupants[entitycnt].emon)
g.occupants[entitycnt].edata = (struct permonst *) 0;
}
#undef mk_message
#undef mk_corpse
@@ -801,11 +791,11 @@ int x, y;
break;
}
lev2->wall_info = W_NONDIGGABLE;
set_entity(x, y, &(occupants[0]));
set_entity(x2, y2, &(occupants[1]));
do_entity(&(occupants[0])); /* Do set_entity after first */
set_entity(x2, y2, &(occupants[1])); /* do_entity for worm tail */
do_entity(&(occupants[1]));
set_entity(x, y, &(g.occupants[0]));
set_entity(x2, y2, &(g.occupants[1]));
do_entity(&(g.occupants[0])); /* Do set_entity after first */
set_entity(x2, y2, &(g.occupants[1])); /* do_entity for worm tail */
do_entity(&(g.occupants[1]));
if (OBJ_AT(x, y) && !Deaf)
You_hear("smashing and crushing.");
(void) revive_nasty(x, y, (char *) 0);
@@ -850,11 +840,11 @@ int x, y;
lev2 = &levl[x2][y2];
lev2->typ = DOOR;
lev2->doormask = D_NODOOR;
set_entity(x, y, &(occupants[0]));
set_entity(x2, y2, &(occupants[1]));
do_entity(&(occupants[0])); /* do set_entity after first */
set_entity(x2, y2, &(occupants[1])); /* do_entity for worm tails */
do_entity(&(occupants[1]));
set_entity(x, y, &(g.occupants[0]));
set_entity(x2, y2, &(g.occupants[1]));
do_entity(&(g.occupants[0])); /* do set_entity after first */
set_entity(x2, y2, &(g.occupants[1])); /* do_entity for worm tails */
do_entity(&(g.occupants[1]));
(void) revive_nasty(x, y, (char *) 0);
delallobj(x, y);
if ((t = t_at(x, y)) != 0)
@@ -883,7 +873,7 @@ int x, y;
struct obj *otmp;
int x2, y2, i;
boolean e_inview;
struct entity *etmp1 = &(occupants[0]), *etmp2 = &(occupants[1]);
struct entity *etmp1 = &(g.occupants[0]), *etmp2 = &(g.occupants[1]);
lev1 = &levl[x][y];
if (!IS_DRAWBRIDGE(lev1->typ))
+110 -2
View File
@@ -337,13 +337,109 @@ const struct instance_globals g_init = {
/* cmd.c */
UNDEFINED_VALUES, /* Cmd */
UNDEFINED_VALUES, /* pushq */
UNDEFINED_VALUES, /* saveq */
UNDEFINED_VALUE, /* phead */
UNDEFINED_VALUE, /* ptail */
UNDEFINED_VALUE, /* shead */
UNDEFINED_VALUE, /* stail */
UNDEFINED_VALUES, /* clicklook_cc */
WIN_ERR, /* en_win */
FALSE, /* en_via_menu */
/* dbridge.c */
UNDEFINED_VALUES,
/* dig.c */
UNDEFINED_VALUE, /* did_dig_msg */
/* do.c */
FALSE, /* at_ladder */
NULL, /* dfr_pre_msg */
NULL, /* dfr_post_msg */
{ 0, 0 }, /* save_dlevel */
/* do_name.c */
NULL, /* gloc_filter_map */
UNDEFINED_VALUE, /* gloc_filter_floodfill_match_glyph */
0, /* via_naming */
/* dog.c */
0, /* petname_used */
UNDEFINED_VALUE, /* gtyp */
UNDEFINED_VALUE, /* gx */
UNDEFINED_VALUE, /* gy */
/* dokick.c */
UNDEFINED_PTR, /* maploc */
UNDEFINED_VALUES, /* nowhere */
UNDEFINED_PTR, /* gate_str */
/* drawing.c */
DUMMY, /* symset */
0, /* currentgraphics */
DUMMY, /* showsyms */
DUMMY, /* l_syms */
DUMMY, /* r_syms */
DUMMY, /* warnsyms */
/* dungeon.c */
UNDEFINED_VALUE, /* n_dgns */
NULL, /* branches */
NULL, /* mapseenchn */
/* eat.c */
FALSE, /* force_save_hs */
/* end.c */
UNDEFINED_VALUES,
UNDEFINED_VALUES,
UNDEFINED_VALUES,
/* hack.c */
UNDEFINED_VALUES,
UNDEFINED_VALUE,
/* invent.c */
51, /* lastinvr */
0, /* sortloogmode */
NULL, /* invbuf */
0, /* inbufsize */
/* lock.c */
UNDEFINED_VALUES,
/* makemon.c */
{ -1, /* choice_count */
{ 0 } }, /* mchoices */
{ -1, /* choice_count */
{ 0 } }, /* mchoices */
/* mhitm.c */
UNDEFINED_VALUE, /* vis */
UNDEFINED_VALUE, /* far_noise */
UNDEFINED_VALUE, /* noisetime */
UNDEFINED_PTR, /* otmp */
UNDEFINED_VALUE, /* dieroll */
/* mhitu.c */
UNDEFINED_VALUE, /* mhitu_dieroll */
/* mklev.c */
UNDEFINED_VALUE, /* vault_x */
UNDEFINED_VALUE, /* vault_y */
UNDEFINED_VALUE, /* made_branch */
/* mkmap.c */
UNDEFINED_PTR, /* new_locations */
UNDEFINED_VALUE, /* min_rx */
UNDEFINED_VALUE, /* max_rx */
UNDEFINED_VALUE, /* min_ry */
UNDEFINED_VALUE, /* max_ry */
UNDEFINED_VALUE, /* n_loc_filled */
/* mkmaze.c */
{ {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} }, /* bughack */
UNDEFINED_VALUE, /* was_waterlevel */
/* mused.c */
FALSE, /* m_using */
@@ -406,6 +502,11 @@ const struct instance_globals g_init = {
0, /* ustuck_id */
0, /* usteed_id */
/* sp_lev.c */
NULL, /* lev_message */
NULL, /* lregions */
0, /* num_lregions */
/* trap.c */
0, /* force_mintrap */
@@ -435,6 +536,13 @@ decl_globals_init()
{
g = g_init;
g.valuables[0].list = g.gems;
g.valuables[0].size = SIZE(g.gems);
g.valuables[1].list = g.amulets;
g.valuables[1].size = SIZE(g.amulets);
g.valuables[2].list = NULL;
g.valuables[2].size = 0;
nhassert(g_init.magic == IVMAGIC);
nhassert(g_init.havestate == TRUE);
+5 -5
View File
@@ -482,9 +482,9 @@ dig(VOID_ARGS)
|| (dig_target == DIGTYP_ROCK && !IS_ROCK(lev->typ)))
return 0; /* statue or boulder got taken */
if (!did_dig_msg) {
if (!g.did_dig_msg) {
You("hit the %s with all your might.", d_target[dig_target]);
did_dig_msg = TRUE;
g.did_dig_msg = TRUE;
}
}
return 1;
@@ -1116,7 +1116,7 @@ struct obj *obj;
"chopping at the door",
"cutting the tree" };
did_dig_msg = FALSE;
g.did_dig_msg = FALSE;
context.digging.quiet = FALSE;
if (context.digging.pos.x != rx || context.digging.pos.y != ry
|| !on_level(&context.digging.level, &u.uz)
@@ -1128,7 +1128,7 @@ struct obj *obj;
&& (moves <= context.digging.lastdigtime + 2
&& moves >= context.digging.lastdigtime)) {
/* avoid messages if repeated autodigging */
did_dig_msg = TRUE;
g.did_dig_msg = TRUE;
context.digging.quiet = TRUE;
}
context.digging.down = context.digging.chew = FALSE;
@@ -1185,7 +1185,7 @@ struct obj *obj;
shopdig(0);
} else
You("continue %s downward.", verbing);
did_dig_msg = FALSE;
g.did_dig_msg = FALSE;
set_occupation(dig, verbing, 0);
}
return 1;
+24 -34
View File
@@ -19,8 +19,6 @@ STATIC_DCL int NDECL(currentlevel_rewrite);
STATIC_DCL void NDECL(final_level);
/* static boolean FDECL(badspot, (XCHAR_P,XCHAR_P)); */
extern int n_dgns; /* number of dungeons, from dungeon.c */
static NEARDATA const char drop_types[] = { ALLOW_COUNT, COIN_CLASS,
ALL_CLASSES, 0 };
@@ -891,9 +889,6 @@ drop_done:
return n_dropped;
}
/* on a ladder, used in goto_level */
static NEARDATA boolean at_ladder = FALSE;
/* the '>' command */
int
dodown()
@@ -1024,9 +1019,9 @@ dodown()
if (trap && Is_stronghold(&u.uz)) {
goto_hell(FALSE, TRUE);
} else {
at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
g.at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
next_level(!trap);
at_ladder = FALSE;
g.at_ladder = FALSE;
}
return 1;
}
@@ -1077,14 +1072,12 @@ doup()
You("are held back by your pet!");
return 0;
}
at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
g.at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
prev_level(TRUE);
at_ladder = FALSE;
g.at_ladder = FALSE;
return 1;
}
d_level save_dlevel = { 0, 0 };
/* check that we can write out the current level */
STATIC_OVL int
currentlevel_rewrite()
@@ -1221,7 +1214,7 @@ boolean at_stairs, falling, portal;
(void) next_to_u();
return;
} else
at_stairs = at_ladder = FALSE;
at_stairs = g.at_ladder = FALSE;
}
}
@@ -1297,7 +1290,7 @@ boolean at_stairs, falling, portal;
for (l_idx = maxledgerno(); l_idx > 0; --l_idx)
delete_levelfile(l_idx);
/* mark #overview data for all dungeon branches as uninteresting */
for (l_idx = 0; l_idx < n_dgns; ++l_idx)
for (l_idx = 0; l_idx < g.n_dgns; ++l_idx)
remdun_mapseen(l_idx);
}
@@ -1371,7 +1364,7 @@ boolean at_stairs, falling, portal;
u_on_newpos(ttrap->tx, ttrap->ty);
} else if (at_stairs && !In_endgame(&u.uz)) {
if (up) {
if (at_ladder)
if (g.at_ladder)
u_on_newpos(xdnladder, ydnladder);
else if (newdungeon)
u_on_sstairs(1);
@@ -1384,10 +1377,10 @@ boolean at_stairs, falling, portal;
pline("%s %s up%s the %s.",
great_effort ? "With great effort, you" : "You",
Levitation ? "float" : Flying ? "fly" : "climb",
(Flying && at_ladder) ? " along" : "",
at_ladder ? "ladder" : "stairs");
(Flying && g.at_ladder) ? " along" : "",
g.at_ladder ? "ladder" : "stairs");
} else { /* down */
if (at_ladder)
if (g.at_ladder)
u_on_newpos(xupladder, yupladder);
else if (newdungeon)
u_on_sstairs(0);
@@ -1398,10 +1391,10 @@ boolean at_stairs, falling, portal;
} else if (Flying) {
if (flags.verbose)
You("fly down %s.",
at_ladder ? "along the ladder" : "the stairs");
g.at_ladder ? "along the ladder" : "the stairs");
} else if (near_capacity() > UNENCUMBERED
|| Punished || Fumbling) {
You("fall down the %s.", at_ladder ? "ladder" : "stairs");
You("fall down the %s.", g.at_ladder ? "ladder" : "stairs");
if (Punished) {
drag_down();
ballrelease(FALSE);
@@ -1411,13 +1404,13 @@ boolean at_stairs, falling, portal;
dismount_steed(DISMOUNT_FELL);
else
losehp(Maybe_Half_Phys(rnd(3)),
at_ladder ? "falling off a ladder"
g.at_ladder ? "falling off a ladder"
: "tumbling down a flight of stairs",
KILLED_BY);
selftouch("Falling, you");
} else { /* ordinary descent */
if (flags.verbose)
You("%s.", at_ladder ? "climb down the ladder"
You("%s.", g.at_ladder ? "climb down the ladder"
: "descend the stairs");
}
}
@@ -1615,9 +1608,6 @@ final_level()
gain_guardian_angel();
}
static char *dfr_pre_msg = 0, /* pline() before level change */
*dfr_post_msg = 0; /* pline() after level change */
/* change levels at the end of this turn, after monsters finish moving */
void
schedule_goto(tolev, at_stairs, falling, portal_flag, pre_msg, post_msg)
@@ -1642,9 +1632,9 @@ const char *pre_msg, *post_msg;
assign_level(&u.utolev, tolev);
if (pre_msg)
dfr_pre_msg = dupstr(pre_msg);
g.dfr_pre_msg = dupstr(pre_msg);
if (post_msg)
dfr_post_msg = dupstr(post_msg);
g.dfr_post_msg = dupstr(post_msg);
}
/* handle something like portal ejection */
@@ -1656,8 +1646,8 @@ deferred_goto()
int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */
assign_level(&dest, &u.utolev);
if (dfr_pre_msg)
pline1(dfr_pre_msg);
if (g.dfr_pre_msg)
pline1(g.dfr_pre_msg);
goto_level(&dest, !!(typmask & 1), !!(typmask & 2), !!(typmask & 4));
if (typmask & 0200) { /* remove portal */
struct trap *t = t_at(u.ux, u.uy);
@@ -1667,14 +1657,14 @@ deferred_goto()
newsym(u.ux, u.uy);
}
}
if (dfr_post_msg)
pline1(dfr_post_msg);
if (g.dfr_post_msg)
pline1(g.dfr_post_msg);
}
u.utotype = 0; /* our caller keys off of this */
if (dfr_pre_msg)
free((genericptr_t) dfr_pre_msg), dfr_pre_msg = 0;
if (dfr_post_msg)
free((genericptr_t) dfr_post_msg), dfr_post_msg = 0;
if (g.dfr_pre_msg)
free((genericptr_t) g.dfr_pre_msg), g.dfr_pre_msg = 0;
if (g.dfr_post_msg)
free((genericptr_t) g.dfr_post_msg), g.dfr_post_msg = 0;
}
/*
+15 -20
View File
@@ -244,13 +244,9 @@ const void *b;
&& glyph_to_cmap(levl[(x)][(y)].glyph) == S_stone \
&& !levl[(x)][(y)].seenv)
static struct opvar *gloc_filter_map = (struct opvar *) 0;
#define GLOC_SAME_AREA(x,y) \
(isok((x), (y)) \
&& (selection_getpoint((x),(y), gloc_filter_map)))
static int gloc_filter_floodfill_match_glyph;
&& (selection_getpoint((x),(y), g.gloc_filter_map)))
int
gloc_filter_classify_glyph(glyph)
@@ -285,11 +281,11 @@ int x, y;
if (!levl[x][y].seenv)
return FALSE;
if (glyph == gloc_filter_floodfill_match_glyph)
if (glyph == g.gloc_filter_floodfill_match_glyph)
return TRUE;
if (gloc_filter_classify_glyph(glyph)
== gloc_filter_classify_glyph(gloc_filter_floodfill_match_glyph))
== gloc_filter_classify_glyph(g.gloc_filter_floodfill_match_glyph))
return TRUE;
return FALSE;
@@ -299,18 +295,18 @@ void
gloc_filter_floodfill(x, y)
int x, y;
{
gloc_filter_floodfill_match_glyph = back_to_glyph(x, y);
g.gloc_filter_floodfill_match_glyph = back_to_glyph(x, y);
set_selection_floodfillchk(gloc_filter_floodfill_matcharea);
selection_floodfill(gloc_filter_map, x, y, FALSE);
selection_floodfill(g.gloc_filter_map, x, y, FALSE);
}
void
gloc_filter_init()
{
if (iflags.getloc_filter == GFILTER_AREA) {
if (!gloc_filter_map) {
gloc_filter_map = selection_opvar((char *) 0);
if (!g.gloc_filter_map) {
g.gloc_filter_map = selection_opvar((char *) 0);
}
/* special case: if we're in a doorway, try to figure out which
direction we're moving, and use that side of the doorway */
@@ -329,9 +325,10 @@ gloc_filter_init()
void
gloc_filter_done()
{
if (gloc_filter_map) {
opvar_free_x(gloc_filter_map);
gloc_filter_map = (struct opvar *) 0;
if (g.gloc_filter_map) {
opvar_free_x(g.gloc_filter_map);
g.gloc_filter_map = (struct opvar *) 0;
}
}
@@ -885,7 +882,7 @@ const char *goal;
|| glyph_to_cmap(k) == S_corr
|| glyph_to_cmap(k) == S_litcorr)
continue;
if (c == defsyms[sidx].sym || c == (int) showsyms[sidx])
if (c == defsyms[sidx].sym || c == (int) g.showsyms[sidx])
matching[sidx] = (char) ++k;
}
if (k) {
@@ -1184,8 +1181,6 @@ do_mname()
(void) christen_monst(mtmp, buf);
}
STATIC_VAR int via_naming = 0;
/*
* This routine used to change the address of 'obj' so be unsafe if not
* used with extreme care. Applying a name to an object no longer
@@ -1257,9 +1252,9 @@ register struct obj *obj;
a valid artifact name */
u.uconduct.literate++;
}
++via_naming; /* This ought to be an argument rather than a static... */
++g.via_naming; /* This ought to be an argument rather than a static... */
obj = oname(obj, buf);
--via_naming; /* ...but oname() is used in a lot of places, so defer. */
--g.via_naming; /* ...but oname() is used in a lot of places, so defer. */
}
struct obj *
@@ -1299,7 +1294,7 @@ const char *name;
/* if obj is owned by a shop, increase your bill */
if (obj->unpaid)
alter_cost(obj, 0L);
if (via_naming) {
if (g.via_naming) {
/* violate illiteracy conduct since successfully wrote arti-name */
u.uconduct.literate++;
}
+33 -34
View File
@@ -120,7 +120,6 @@ struct monst *mon;
static NEARDATA const char nofetch[] = { BALL_CLASS, CHAIN_CLASS, ROCK_CLASS,
0 };
STATIC_VAR xchar gtyp, gx, gy; /* type and position of dog's current goal */
STATIC_PTR void FDECL(wantdoor, (int, int, genericptr_t));
@@ -492,17 +491,17 @@ int after, udist, whappr;
dog_has_minvent = (droppables(mtmp) != 0);
if (!edog || mtmp->mleashed) { /* he's not going anywhere... */
gtyp = APPORT;
gx = u.ux;
gy = u.uy;
g.gtyp = APPORT;
g.gx = u.ux;
g.gy = u.uy;
} else {
#define DDIST(x, y) (dist2(x, y, omx, omy))
#define SQSRCHRADIUS 5
int min_x, max_x, min_y, max_y;
register int nx, ny;
gtyp = UNDEF; /* no goal as yet */
gx = gy = 0; /* suppress 'used before set' message */
g.gtyp = UNDEF; /* no goal as yet */
g.gx = g.gy = 0; /* suppress 'used before set' message */
if ((min_x = omx - SQSRCHRADIUS) < 1)
min_x = 1;
@@ -520,7 +519,7 @@ int after, udist, whappr;
if (nx >= min_x && nx <= max_x && ny >= min_y && ny <= max_y) {
otyp = dogfood(mtmp, obj);
/* skip inferior goals */
if (otyp > gtyp || otyp == UNDEF)
if (otyp > g.gtyp || otyp == UNDEF)
continue;
/* avoid cursed items unless starving */
if (cursed_object_at(nx, ny)
@@ -531,31 +530,31 @@ int after, udist, whappr;
|| !can_reach_location(mtmp, mtmp->mx, mtmp->my, nx, ny))
continue;
if (otyp < MANFOOD) {
if (otyp < gtyp || DDIST(nx, ny) < DDIST(gx, gy)) {
gx = nx;
gy = ny;
gtyp = otyp;
if (otyp < g.gtyp || DDIST(nx, ny) < DDIST(g.gx, g.gy)) {
g.gx = nx;
g.gy = ny;
g.gtyp = otyp;
}
} else if (gtyp == UNDEF && in_masters_sight
} else if (g.gtyp == UNDEF && in_masters_sight
&& !dog_has_minvent
&& (!levl[omx][omy].lit || levl[u.ux][u.uy].lit)
&& (otyp == MANFOOD || m_cansee(mtmp, nx, ny))
&& edog->apport > rn2(8)
&& can_carry(mtmp, obj) > 0) {
gx = nx;
gy = ny;
gtyp = APPORT;
g.gx = nx;
g.gy = ny;
g.gtyp = APPORT;
}
}
}
}
/* follow player if appropriate */
if (gtyp == UNDEF || (gtyp != DOGFOOD && gtyp != APPORT
if (g.gtyp == UNDEF || (g.gtyp != DOGFOOD && g.gtyp != APPORT
&& monstermoves < edog->hungrytime)) {
gx = u.ux;
gy = u.uy;
if (after && udist <= 4 && gx == u.ux && gy == u.uy)
g.gx = u.ux;
g.gy = u.uy;
if (after && udist <= 4 && g.gx == u.ux && g.gy == u.uy)
return -2;
appr = (udist >= 9) ? 1 : (mtmp->mflee) ? -1 : 0;
if (udist > 1) {
@@ -576,34 +575,34 @@ int after, udist, whappr;
appr = 0;
#define FARAWAY (COLNO + 2) /* position outside screen */
if (gx == u.ux && gy == u.uy && !in_masters_sight) {
if (g.gx == u.ux && g.gy == u.uy && !in_masters_sight) {
register coord *cp;
cp = gettrack(omx, omy);
if (cp) {
gx = cp->x;
gy = cp->y;
g.gx = cp->x;
g.gy = cp->y;
if (edog)
edog->ogoal.x = 0;
} else {
/* assume master hasn't moved far, and reuse previous goal */
if (edog && edog->ogoal.x
&& (edog->ogoal.x != omx || edog->ogoal.y != omy)) {
gx = edog->ogoal.x;
gy = edog->ogoal.y;
g.gx = edog->ogoal.x;
g.gy = edog->ogoal.y;
edog->ogoal.x = 0;
} else {
int fardist = FARAWAY * FARAWAY;
gx = gy = FARAWAY; /* random */
g.gx = g.gy = FARAWAY; /* random */
do_clear_area(omx, omy, 9, wantdoor, (genericptr_t) &fardist);
/* here gx == FARAWAY e.g. when dog is in a vault */
if (gx == FARAWAY || (gx == omx && gy == omy)) {
gx = u.ux;
gy = u.uy;
if (g.gx == FARAWAY || (g.gx == omx && g.gy == omy)) {
g.gx = u.ux;
g.gy = u.uy;
} else if (edog) {
edog->ogoal.x = gx;
edog->ogoal.y = gy;
edog->ogoal.x = g.gx;
edog->ogoal.y = g.gy;
}
}
}
@@ -878,7 +877,7 @@ int after; /* this is extra fast monster movement */
int chi = -1, nidist, ndist;
coord poss[9];
long info[9], allowflags;
#define GDIST(x, y) (dist2(x, y, gx, gy))
#define GDIST(x, y) (dist2(x, y, g.gx, g.gy))
/*
* Tame Angels have isminion set and an ispriest structure instead of
@@ -982,7 +981,7 @@ int after; /* this is extra fast monster movement */
uncursedcnt++;
}
better_with_displacing = should_displace(mtmp, poss, info, cnt, gx, gy);
better_with_displacing = should_displace(mtmp, poss, info, cnt, g.gx, g.gy);
chcnt = 0;
chi = -1;
@@ -1329,8 +1328,8 @@ genericptr_t distance;
int ndist, *dist_ptr = (int *) distance;
if (*dist_ptr > (ndist = distu(x, y))) {
gx = x;
gy = y;
g.gx = x;
g.gy = y;
*dist_ptr = ndist;
}
}
+71 -74
View File
@@ -9,9 +9,6 @@
(martial_bonus() || is_bigfoot(youmonst.data) \
|| (uarmf && uarmf->otyp == KICKING_BOOTS))
static NEARDATA struct rm *maploc, nowhere;
static NEARDATA const char *gate_str;
/* kickedobj (decl.c) tracks a kicked object until placed or destroyed */
STATIC_DCL void FDECL(kickdmg, (struct monst *, BOOLEAN_P));
@@ -718,33 +715,33 @@ const char *kickobjnam;
if (*kickobjnam)
what = kickobjnam;
else if (maploc == &nowhere)
else if (g.maploc == &g.nowhere)
what = "nothing";
else if (IS_DOOR(maploc->typ))
else if (IS_DOOR(g.maploc->typ))
what = "a door";
else if (IS_TREE(maploc->typ))
else if (IS_TREE(g.maploc->typ))
what = "a tree";
else if (IS_STWALL(maploc->typ))
else if (IS_STWALL(g.maploc->typ))
what = "a wall";
else if (IS_ROCK(maploc->typ))
else if (IS_ROCK(g.maploc->typ))
what = "a rock";
else if (IS_THRONE(maploc->typ))
else if (IS_THRONE(g.maploc->typ))
what = "a throne";
else if (IS_FOUNTAIN(maploc->typ))
else if (IS_FOUNTAIN(g.maploc->typ))
what = "a fountain";
else if (IS_GRAVE(maploc->typ))
else if (IS_GRAVE(g.maploc->typ))
what = "a headstone";
else if (IS_SINK(maploc->typ))
else if (IS_SINK(g.maploc->typ))
what = "a sink";
else if (IS_ALTAR(maploc->typ))
else if (IS_ALTAR(g.maploc->typ))
what = "an altar";
else if (IS_DRAWBRIDGE(maploc->typ))
else if (IS_DRAWBRIDGE(g.maploc->typ))
what = "a drawbridge";
else if (maploc->typ == STAIRS)
else if (g.maploc->typ == STAIRS)
what = "the stairs";
else if (maploc->typ == LADDER)
else if (g.maploc->typ == LADDER)
what = "a ladder";
else if (maploc->typ == IRONBARS)
else if (g.maploc->typ == IRONBARS)
what = "an iron bar";
else
what = "something weird";
@@ -887,10 +884,10 @@ dokick()
u_wipe_engr(2);
if (!isok(x, y)) {
maploc = &nowhere;
g.maploc = &g.nowhere;
goto ouch;
}
maploc = &levl[x][y];
g.maploc = &levl[x][y];
/*
* The next five tests should stay in their present order:
@@ -959,49 +956,49 @@ dokick()
goto ouch;
}
if (!IS_DOOR(maploc->typ)) {
if (maploc->typ == SDOOR) {
if (!IS_DOOR(g.maploc->typ)) {
if (g.maploc->typ == SDOOR) {
if (!Levitation && rn2(30) < avrg_attrib) {
cvt_sdoor_to_door(maploc); /* ->typ = DOOR */
cvt_sdoor_to_door(g.maploc); /* ->typ = DOOR */
pline("Crash! %s a secret door!",
/* don't "kick open" when it's locked
unless it also happens to be trapped */
(maploc->doormask & (D_LOCKED | D_TRAPPED)) == D_LOCKED
(g.maploc->doormask & (D_LOCKED | D_TRAPPED)) == D_LOCKED
? "Your kick uncovers"
: "You kick open");
exercise(A_DEX, TRUE);
if (maploc->doormask & D_TRAPPED) {
maploc->doormask = D_NODOOR;
if (g.maploc->doormask & D_TRAPPED) {
g.maploc->doormask = D_NODOOR;
b_trapped("door", FOOT);
} else if (maploc->doormask != D_NODOOR
&& !(maploc->doormask & D_LOCKED))
maploc->doormask = D_ISOPEN;
} else if (g.maploc->doormask != D_NODOOR
&& !(g.maploc->doormask & D_LOCKED))
g.maploc->doormask = D_ISOPEN;
feel_newsym(x, y); /* we know it's gone */
if (maploc->doormask == D_ISOPEN
|| maploc->doormask == D_NODOOR)
if (g.maploc->doormask == D_ISOPEN
|| g.maploc->doormask == D_NODOOR)
unblock_point(x, y); /* vision */
return 1;
} else
goto ouch;
}
if (maploc->typ == SCORR) {
if (g.maploc->typ == SCORR) {
if (!Levitation && rn2(30) < avrg_attrib) {
pline("Crash! You kick open a secret passage!");
exercise(A_DEX, TRUE);
maploc->typ = CORR;
g.maploc->typ = CORR;
feel_newsym(x, y); /* we know it's gone */
unblock_point(x, y); /* vision */
return 1;
} else
goto ouch;
}
if (IS_THRONE(maploc->typ)) {
if (IS_THRONE(g.maploc->typ)) {
register int i;
if (Levitation)
goto dumb;
if ((Luck < 0 || maploc->doormask) && !rn2(3)) {
maploc->typ = ROOM;
maploc->doormask = 0; /* don't leave loose ends.. */
if ((Luck < 0 || g.maploc->doormask) && !rn2(3)) {
g.maploc->typ = ROOM;
g.maploc->doormask = 0; /* don't leave loose ends.. */
(void) mkgold((long) rnd(200), x, y);
if (Blind)
pline("CRASH! You destroy it.");
@@ -1011,7 +1008,7 @@ dokick()
}
exercise(A_DEX, TRUE);
return 1;
} else if (Luck > 0 && !rn2(3) && !maploc->looted) {
} else if (Luck > 0 && !rn2(3) && !g.maploc->looted) {
(void) mkgold((long) rn1(201, 300), x, y);
i = Luck + 1;
if (i > 6)
@@ -1027,7 +1024,7 @@ dokick()
newsym(x, y);
}
/* prevent endless milking */
maploc->looted = T_LOOTED;
g.maploc->looted = T_LOOTED;
return 1;
} else if (!rn2(4)) {
if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) {
@@ -1038,7 +1035,7 @@ dokick()
}
goto ouch;
}
if (IS_ALTAR(maploc->typ)) {
if (IS_ALTAR(g.maploc->typ)) {
if (Levitation)
goto dumb;
You("kick %s.", (Blind ? something : "the altar"));
@@ -1048,7 +1045,7 @@ dokick()
exercise(A_DEX, TRUE);
return 1;
}
if (IS_FOUNTAIN(maploc->typ)) {
if (IS_FOUNTAIN(g.maploc->typ)) {
if (Levitation)
goto dumb;
You("kick %s.", (Blind ? something : "the fountain"));
@@ -1063,7 +1060,7 @@ dokick()
exercise(A_DEX, TRUE);
return 1;
}
if (IS_GRAVE(maploc->typ)) {
if (IS_GRAVE(g.maploc->typ)) {
if (Levitation)
goto dumb;
if (rn2(4))
@@ -1073,8 +1070,8 @@ dokick()
|| ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10))) {
adjalign(-sgn(u.ualign.type));
}
maploc->typ = ROOM;
maploc->doormask = 0;
g.maploc->typ = ROOM;
g.maploc->doormask = 0;
(void) mksobj_at(ROCK, x, y, TRUE, FALSE);
del_engr_at(x, y);
if (Blind)
@@ -1085,9 +1082,9 @@ dokick()
}
return 1;
}
if (maploc->typ == IRONBARS)
if (g.maploc->typ == IRONBARS)
goto ouch;
if (IS_TREE(maploc->typ)) {
if (IS_TREE(g.maploc->typ)) {
struct obj *treefruit;
/* nothing, fruit or trouble? 75:23.5:1.5% */
@@ -1096,7 +1093,7 @@ dokick()
You_hear("a low buzzing."); /* a warning */
goto ouch;
}
if (rn2(15) && !(maploc->looted & TREE_LOOTED)
if (rn2(15) && !(g.maploc->looted & TREE_LOOTED)
&& (treefruit = rnd_treefruit_at(x, y))) {
long nfruit = 8L - rnl(7), nfall;
short frtype = treefruit->otyp;
@@ -1120,9 +1117,9 @@ dokick()
exercise(A_DEX, TRUE);
exercise(A_WIS, TRUE); /* discovered a new food source! */
newsym(x, y);
maploc->looted |= TREE_LOOTED;
g.maploc->looted |= TREE_LOOTED;
return 1;
} else if (!(maploc->looted & TREE_SWARM)) {
} else if (!(g.maploc->looted & TREE_SWARM)) {
int cnt = rnl(4) + 2;
int made = 0;
coord mm;
@@ -1139,12 +1136,12 @@ dokick()
pline("You've attracted the tree's former occupants!");
else
You("smell stale honey.");
maploc->looted |= TREE_SWARM;
g.maploc->looted |= TREE_SWARM;
return 1;
}
goto ouch;
}
if (IS_SINK(maploc->typ)) {
if (IS_SINK(g.maploc->typ)) {
int gend = poly_gender();
short washerndx = (gend == 1 || (gend == 2 && rn2(2)))
? PM_INCUBUS
@@ -1159,7 +1156,7 @@ dokick()
pline("Klunk!");
exercise(A_DEX, TRUE);
return 1;
} else if (!(maploc->looted & S_LPUDDING) && !rn2(3)
} else if (!(g.maploc->looted & S_LPUDDING) && !rn2(3)
&& !(mvitals[PM_BLACK_PUDDING].mvflags & G_GONE)) {
if (Blind)
You_hear("a gushing sound.");
@@ -1169,37 +1166,37 @@ dokick()
(void) makemon(&mons[PM_BLACK_PUDDING], x, y, NO_MM_FLAGS);
exercise(A_DEX, TRUE);
newsym(x, y);
maploc->looted |= S_LPUDDING;
g.maploc->looted |= S_LPUDDING;
return 1;
} else if (!(maploc->looted & S_LDWASHER) && !rn2(3)
} else if (!(g.maploc->looted & S_LDWASHER) && !rn2(3)
&& !(mvitals[washerndx].mvflags & G_GONE)) {
/* can't resist... */
pline("%s returns!", (Blind ? Something : "The dish washer"));
if (makemon(&mons[washerndx], x, y, NO_MM_FLAGS))
newsym(x, y);
maploc->looted |= S_LDWASHER;
g.maploc->looted |= S_LDWASHER;
exercise(A_DEX, TRUE);
return 1;
} else if (!rn2(3)) {
pline("Flupp! %s.",
(Blind ? "You hear a sloshing sound"
: "Muddy waste pops up from the drain"));
if (!(maploc->looted & S_LRING)) { /* once per sink */
if (!(g.maploc->looted & S_LRING)) { /* once per sink */
if (!Blind)
You_see("a ring shining in its midst.");
(void) mkobj_at(RING_CLASS, x, y, TRUE);
newsym(x, y);
exercise(A_DEX, TRUE);
exercise(A_WIS, TRUE); /* a discovery! */
maploc->looted |= S_LRING;
g.maploc->looted |= S_LRING;
}
return 1;
}
goto ouch;
}
if (maploc->typ == STAIRS || maploc->typ == LADDER
|| IS_STWALL(maploc->typ)) {
if (!IS_STWALL(maploc->typ) && maploc->ladder == LA_DOWN)
if (g.maploc->typ == STAIRS || g.maploc->typ == LADDER
|| IS_STWALL(g.maploc->typ)) {
if (!IS_STWALL(g.maploc->typ) && g.maploc->ladder == LA_DOWN)
goto dumb;
ouch:
pline("Ouch! That hurts!");
@@ -1212,7 +1209,7 @@ dokick()
pline_The("drawbridge is unaffected.");
/* update maploc to refer to the drawbridge */
(void) find_drawbridge(&x, &y);
maploc = &levl[x][y];
g.maploc = &levl[x][y];
}
}
if (!rn2(3))
@@ -1226,8 +1223,8 @@ dokick()
goto dumb;
}
if (maploc->doormask == D_ISOPEN || maploc->doormask == D_BROKEN
|| maploc->doormask == D_NODOOR) {
if (g.maploc->doormask == D_ISOPEN || g.maploc->doormask == D_BROKEN
|| g.maploc->doormask == D_NODOOR) {
dumb:
exercise(A_DEX, FALSE);
if (martial() || ACURR(A_DEX) >= 16 || rn2(3)) {
@@ -1253,20 +1250,20 @@ dokick()
if (rnl(35) < avrg_attrib + (!martial() ? 0 : ACURR(A_DEX))) {
boolean shopdoor = *in_rooms(x, y, SHOPBASE) ? TRUE : FALSE;
/* break the door */
if (maploc->doormask & D_TRAPPED) {
if (g.maploc->doormask & D_TRAPPED) {
if (flags.verbose)
You("kick the door.");
exercise(A_STR, FALSE);
maploc->doormask = D_NODOOR;
g.maploc->doormask = D_NODOOR;
b_trapped("door", FOOT);
} else if (ACURR(A_STR) > 18 && !rn2(5) && !shopdoor) {
pline("As you kick the door, it shatters to pieces!");
exercise(A_STR, TRUE);
maploc->doormask = D_NODOOR;
g.maploc->doormask = D_NODOOR;
} else {
pline("As you kick the door, it crashes open!");
exercise(A_STR, TRUE);
maploc->doormask = D_BROKEN;
g.maploc->doormask = D_BROKEN;
}
feel_newsym(x, y); /* we know we broke it */
unblock_point(x, y); /* vision */
@@ -1438,11 +1435,11 @@ xchar dlev; /* if !0 send to dlev near player */
dct == oct ? "the " : dct == 1L ? "an" : "", what);
else if (oct == dct)
pline("%s adjacent %s %s.", dct == 1L ? "The" : "All the", what,
gate_str);
g.gate_str);
else
pline("%s adjacent %s %s.",
dct == 1L ? "One of the" : "Some of the",
dct == 1L ? "objects falls" : what, gate_str);
dct == 1L ? "objects falls" : what, g.gate_str);
}
if (costly && shkp && price) {
@@ -1746,10 +1743,10 @@ long num;
if (nodrop)
Sprintf(eos(xbuf), ".");
else
Sprintf(eos(xbuf), " and %s %s.", otense(otmp, "fall"), gate_str);
Sprintf(eos(xbuf), " and %s %s.", otense(otmp, "fall"), g.gate_str);
pline("%s%s", obuf, xbuf);
} else if (!nodrop)
pline("%s %s %s.", obuf, otense(otmp, "fall"), gate_str);
pline("%s %s %s.", obuf, otense(otmp, "fall"), g.gate_str);
}
/* migration destination for objects which fall down to next level */
@@ -1759,25 +1756,25 @@ xchar x, y;
{
struct trap *ttmp;
gate_str = 0;
g.gate_str = 0;
/* this matches the player restriction in goto_level() */
if (on_level(&u.uz, &qstart_level) && !ok_to_quest())
return MIGR_NOWHERE;
if ((xdnstair == x && ydnstair == y)
|| (sstairs.sx == x && sstairs.sy == y && !sstairs.up)) {
gate_str = "down the stairs";
g.gate_str = "down the stairs";
return (xdnstair == x && ydnstair == y) ? MIGR_STAIRS_UP
: MIGR_SSTAIRS;
}
if (xdnladder == x && ydnladder == y) {
gate_str = "down the ladder";
g.gate_str = "down the ladder";
return MIGR_LADDER_UP;
}
if (((ttmp = t_at(x, y)) != 0 && ttmp->tseen)
&& is_hole(ttmp->ttyp)) {
gate_str = (ttmp->ttyp == TRAPDOOR) ? "through the trap door"
g.gate_str = (ttmp->ttyp == TRAPDOOR) ? "through the trap door"
: "through the hole";
return MIGR_RANDOM;
}
+42 -51
View File
@@ -17,15 +17,6 @@
#define C(n)
#endif
struct symsetentry symset[NUM_GRAPHICS];
int currentgraphics = 0;
nhsym showsyms[SYM_MAX] = DUMMY; /* symbols to be displayed */
nhsym l_syms[SYM_MAX] = DUMMY; /* loaded symbols */
nhsym r_syms[SYM_MAX] = DUMMY; /* rogue symbols */
nhsym warnsyms[WARNCOUNT] = DUMMY; /* the current warning display symbols */
const char invisexplain[] = "remembered, unseen, creature",
altinvisexplain[] = "unseen creature"; /* for clairvoyance */
@@ -357,9 +348,9 @@ init_symbols()
void
update_bouldersym()
{
showsyms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
l_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
r_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
g.showsyms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
g.l_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
g.r_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
}
void
@@ -368,20 +359,20 @@ init_showsyms()
register int i;
for (i = 0; i < MAXPCHARS; i++)
showsyms[i + SYM_OFF_P] = defsyms[i].sym;
g.showsyms[i + SYM_OFF_P] = defsyms[i].sym;
for (i = 0; i < MAXOCLASSES; i++)
showsyms[i + SYM_OFF_O] = def_oc_syms[i].sym;
g.showsyms[i + SYM_OFF_O] = def_oc_syms[i].sym;
for (i = 0; i < MAXMCLASSES; i++)
showsyms[i + SYM_OFF_M] = def_monsyms[i].sym;
g.showsyms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
showsyms[i + SYM_OFF_W] = def_warnsyms[i].sym;
g.showsyms[i + SYM_OFF_W] = def_warnsyms[i].sym;
for (i = 0; i < MAXOTHER; i++) {
if (i == SYM_BOULDER)
showsyms[i + SYM_OFF_X] = iflags.bouldersym
g.showsyms[i + SYM_OFF_X] = iflags.bouldersym
? iflags.bouldersym
: def_oc_syms[ROCK_CLASS].sym;
else if (i == SYM_INVISIBLE)
showsyms[i + SYM_OFF_X] = DEF_INVISIBLE;
g.showsyms[i + SYM_OFF_X] = DEF_INVISIBLE;
}
}
@@ -392,20 +383,20 @@ init_l_symbols()
register int i;
for (i = 0; i < MAXPCHARS; i++)
l_syms[i + SYM_OFF_P] = defsyms[i].sym;
g.l_syms[i + SYM_OFF_P] = defsyms[i].sym;
for (i = 0; i < MAXOCLASSES; i++)
l_syms[i + SYM_OFF_O] = def_oc_syms[i].sym;
g.l_syms[i + SYM_OFF_O] = def_oc_syms[i].sym;
for (i = 0; i < MAXMCLASSES; i++)
l_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
g.l_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
l_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
g.l_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
for (i = 0; i < MAXOTHER; i++) {
if (i == SYM_BOULDER)
l_syms[i + SYM_OFF_X] = iflags.bouldersym
g.l_syms[i + SYM_OFF_X] = iflags.bouldersym
? iflags.bouldersym
: def_oc_syms[ROCK_CLASS].sym;
else if (i == SYM_INVISIBLE)
l_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
g.l_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
}
clear_symsetentry(PRIMARY, FALSE);
@@ -420,30 +411,30 @@ init_r_symbols()
later by the roguesymbols option */
for (i = 0; i < MAXPCHARS; i++)
r_syms[i + SYM_OFF_P] = defsyms[i].sym;
r_syms[S_vodoor] = r_syms[S_hodoor] = r_syms[S_ndoor] = '+';
r_syms[S_upstair] = r_syms[S_dnstair] = '%';
g.r_syms[i + SYM_OFF_P] = defsyms[i].sym;
g.r_syms[S_vodoor] = g.r_syms[S_hodoor] = g.r_syms[S_ndoor] = '+';
g.r_syms[S_upstair] = g.r_syms[S_dnstair] = '%';
for (i = 0; i < MAXOCLASSES; i++)
r_syms[i + SYM_OFF_O] = def_r_oc_syms[i];
g.r_syms[i + SYM_OFF_O] = def_r_oc_syms[i];
for (i = 0; i < MAXMCLASSES; i++)
r_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
g.r_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
r_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
g.r_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
for (i = 0; i < MAXOTHER; i++) {
if (i == SYM_BOULDER)
r_syms[i + SYM_OFF_X] = iflags.bouldersym
g.r_syms[i + SYM_OFF_X] = iflags.bouldersym
? iflags.bouldersym
: def_oc_syms[ROCK_CLASS].sym;
else if (i == SYM_INVISIBLE)
r_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
g.r_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
}
clear_symsetentry(ROGUESET, FALSE);
/* default on Rogue level is no color
* but some symbol sets can override that
*/
symset[ROGUESET].nocolor = 1;
g.symset[ROGUESET].nocolor = 1;
}
void
@@ -457,25 +448,25 @@ int whichset;
/* Adjust graphics display characters on Rogue levels */
for (i = 0; i < SYM_MAX; i++)
showsyms[i] = r_syms[i];
g.showsyms[i] = g.r_syms[i];
#if defined(MSDOS) && defined(USE_TILES)
if (iflags.grmode)
tileview(FALSE);
#endif
currentgraphics = ROGUESET;
g.currentgraphics = ROGUESET;
break;
case PRIMARY:
default:
for (i = 0; i < SYM_MAX; i++)
showsyms[i] = l_syms[i];
g.showsyms[i] = g.l_syms[i];
#if defined(MSDOS) && defined(USE_TILES)
if (iflags.grmode)
tileview(TRUE);
#endif
currentgraphics = PRIMARY;
g.currentgraphics = PRIMARY;
break;
}
}
@@ -488,11 +479,11 @@ int nondefault;
if (nondefault) {
for (i = 0; i < SYM_MAX; i++)
showsyms[i] = l_syms[i];
g.showsyms[i] = g.l_syms[i];
#ifdef PC9800
if (SYMHANDLING(H_IBM) && ibmgraphics_mode_callback)
(*ibmgraphics_mode_callback)();
else if (!symset[currentgraphics].name && ascgraphics_mode_callback)
else if (!g.symset[g.currentgraphics].name && ascgraphics_mode_callback)
(*ascgraphics_mode_callback)();
#endif
#ifdef TERMLIB
@@ -512,7 +503,7 @@ update_l_symset(symp, val)
struct symparse *symp;
int val;
{
l_syms[symp->idx] = val;
g.l_syms[symp->idx] = val;
}
void
@@ -520,7 +511,7 @@ update_r_symset(symp, val)
struct symparse *symp;
int val;
{
r_syms[symp->idx] = val;
g.r_syms[symp->idx] = val;
}
void
@@ -528,20 +519,20 @@ clear_symsetentry(which_set, name_too)
int which_set;
boolean name_too;
{
if (symset[which_set].desc)
free((genericptr_t) symset[which_set].desc);
symset[which_set].desc = (char *) 0;
if (g.symset[which_set].desc)
free((genericptr_t) g.symset[which_set].desc);
g.symset[which_set].desc = (char *) 0;
symset[which_set].handling = H_UNK;
symset[which_set].nocolor = 0;
g.symset[which_set].handling = H_UNK;
g.symset[which_set].nocolor = 0;
/* initialize restriction bits */
symset[which_set].primary = 0;
symset[which_set].rogue = 0;
g.symset[which_set].primary = 0;
g.symset[which_set].rogue = 0;
if (name_too) {
if (symset[which_set].name)
free((genericptr_t) symset[which_set].name);
symset[which_set].name = (char *) 0;
if (g.symset[which_set].name)
free((genericptr_t) g.symset[which_set].name);
g.symset[which_set].name = (char *) 0;
}
}
+59 -64
View File
@@ -25,11 +25,6 @@ struct proto_dungeon {
int n_brs; /* number of tmpbranch entries */
};
int n_dgns; /* number of dungeons (also used in mklev.c and do.c) */
static branch *branches = (branch *) 0; /* dungeon branch list */
mapseen *mapseenchn = (struct mapseen *) 0; /*DUNGEON_OVERVIEW*/
struct lchoice {
int idx;
schar lev[MAXLINFO];
@@ -88,7 +83,7 @@ dumpit()
if (!explicitdebug(__FILE__))
return;
for (i = 0; i < n_dgns; i++) {
for (i = 0; i < g.n_dgns; i++) {
fprintf(stderr, "\n#%d \"%s\" (%s):\n", i, DD.dname, DD.proto);
fprintf(stderr, " num_dunlevs %d, dunlev_ureached %d\n",
DD.num_dunlevs, DD.dunlev_ureached);
@@ -112,7 +107,7 @@ dumpit()
getchar();
}
fprintf(stderr, "\nBranches:\n");
for (br = branches; br; br = br->next) {
for (br = g.branches; br; br = br->next) {
fprintf(stderr, "%d: %s, end1 %d %d, end2 %d %d, %s\n", br->id,
br->type == BR_STAIR
? "stair"
@@ -143,17 +138,17 @@ boolean perform_write, free_data;
int count;
if (perform_write) {
bwrite(fd, (genericptr_t) &n_dgns, sizeof n_dgns);
bwrite(fd, (genericptr_t) &g.n_dgns, sizeof g.n_dgns);
bwrite(fd, (genericptr_t) dungeons,
sizeof(dungeon) * (unsigned) n_dgns);
sizeof(dungeon) * (unsigned) g.n_dgns);
bwrite(fd, (genericptr_t) &dungeon_topology, sizeof dungeon_topology);
bwrite(fd, (genericptr_t) tune, sizeof tune);
for (count = 0, curr = branches; curr; curr = curr->next)
for (count = 0, curr = g.branches; curr; curr = curr->next)
count++;
bwrite(fd, (genericptr_t) &count, sizeof(count));
for (curr = branches; curr; curr = curr->next)
for (curr = g.branches; curr; curr = curr->next)
bwrite(fd, (genericptr_t) curr, sizeof(branch));
count = maxledgerno();
@@ -162,28 +157,28 @@ boolean perform_write, free_data;
(unsigned) count * sizeof(struct linfo));
bwrite(fd, (genericptr_t) &inv_pos, sizeof inv_pos);
for (count = 0, curr_ms = mapseenchn; curr_ms;
for (count = 0, curr_ms = g.mapseenchn; curr_ms;
curr_ms = curr_ms->next)
count++;
bwrite(fd, (genericptr_t) &count, sizeof(count));
for (curr_ms = mapseenchn; curr_ms; curr_ms = curr_ms->next)
for (curr_ms = g.mapseenchn; curr_ms; curr_ms = curr_ms->next)
save_mapseen(fd, curr_ms);
}
if (free_data) {
for (curr = branches; curr; curr = next) {
for (curr = g.branches; curr; curr = next) {
next = curr->next;
free((genericptr_t) curr);
}
branches = 0;
for (curr_ms = mapseenchn; curr_ms; curr_ms = next_ms) {
g.branches = 0;
for (curr_ms = g.mapseenchn; curr_ms; curr_ms = next_ms) {
next_ms = curr_ms->next;
if (curr_ms->custom)
free((genericptr_t) curr_ms->custom);
free((genericptr_t) curr_ms);
}
mapseenchn = 0;
g.mapseenchn = 0;
}
}
@@ -196,12 +191,12 @@ int fd;
int count, i;
mapseen *curr_ms, *last_ms;
mread(fd, (genericptr_t) &n_dgns, sizeof(n_dgns));
mread(fd, (genericptr_t) dungeons, sizeof(dungeon) * (unsigned) n_dgns);
mread(fd, (genericptr_t) &g.n_dgns, sizeof(g.n_dgns));
mread(fd, (genericptr_t) dungeons, sizeof(dungeon) * (unsigned) g.n_dgns);
mread(fd, (genericptr_t) &dungeon_topology, sizeof dungeon_topology);
mread(fd, (genericptr_t) tune, sizeof tune);
last = branches = (branch *) 0;
last = g.branches = (branch *) 0;
mread(fd, (genericptr_t) &count, sizeof(count));
for (i = 0; i < count; i++) {
@@ -211,7 +206,7 @@ int fd;
if (last)
last->next = curr;
else
branches = curr;
g.branches = curr;
last = curr;
}
@@ -231,7 +226,7 @@ int fd;
if (last_ms)
last_ms->next = curr_ms;
else
mapseenchn = curr_ms;
g.mapseenchn = curr_ms;
last_ms = curr_ms;
}
}
@@ -258,7 +253,7 @@ const char *s;
{
xchar i;
for (i = 0; i < n_dgns; i++)
for (i = 0; i < g.n_dgns; i++)
if (!strcmp(dungeons[i].dname, s))
return i;
@@ -297,7 +292,7 @@ struct proto_dungeon *pd;
branch *br;
const char *dnam;
for (br = branches; br; br = br->next) {
for (br = g.branches; br; br = br->next) {
dnam = dungeons[br->end2.dnum].dname;
if (!strcmpi(dnam, s)
|| (!strncmpi(dnam, "The ", 4) && !strcmpi(dnam + 4, s)))
@@ -397,7 +392,7 @@ struct proto_dungeon *pd;
do {
if (++i >= num)
i = 0;
for (curr = branches; curr; curr = curr->next)
for (curr = g.branches; curr; curr = curr->next)
if ((curr->end1.dnum == dnum && curr->end1.dlevel == base + i)
|| (curr->end2.dnum == dnum && curr->end2.dlevel == base + i))
break;
@@ -439,7 +434,7 @@ boolean extract_first;
long new_val, curr_val, prev_val;
if (extract_first) {
for (prev = 0, curr = branches; curr; prev = curr, curr = curr->next)
for (prev = 0, curr = g.branches; curr; prev = curr, curr = curr->next)
if (curr == new_branch)
break;
@@ -448,7 +443,7 @@ boolean extract_first;
if (prev)
prev->next = curr->next;
else
branches = curr->next;
g.branches = curr->next;
}
new_branch->next = (branch *) 0;
@@ -464,7 +459,7 @@ boolean extract_first;
prev = (branch *) 0;
prev_val = -1;
new_val = branch_val(new_branch);
for (curr = branches; curr;
for (curr = g.branches; curr;
prev_val = curr_val, prev = curr, curr = curr->next) {
curr_val = branch_val(curr);
if (prev_val < new_val && new_val <= curr_val)
@@ -474,8 +469,8 @@ boolean extract_first;
new_branch->next = curr;
prev->next = new_branch;
} else {
new_branch->next = branches;
branches = new_branch;
new_branch->next = g.branches;
g.branches = new_branch;
}
}
@@ -763,11 +758,11 @@ init_dungeons()
* dungeon arrays.
*/
sp_levchn = (s_level *) 0;
Fread((genericptr_t) &n_dgns, sizeof(int), 1, dgn_file);
if (n_dgns >= MAXDUNGEON)
Fread((genericptr_t) &g.n_dgns, sizeof(int), 1, dgn_file);
if (g.n_dgns >= MAXDUNGEON)
panic("init_dungeons: too many dungeons");
for (i = 0; i < n_dgns; i++) {
for (i = 0; i < g.n_dgns; i++) {
Fread((genericptr_t) &pd.tmpdungeon[i], sizeof(struct tmpdungeon), 1,
dgn_file);
if (!wizard && pd.tmpdungeon[i].chance
@@ -782,7 +777,7 @@ init_dungeons()
for (j = 0; j < pd.tmpdungeon[i].branches; j++)
Fread((genericptr_t) &pd.tmpbranch[cb],
sizeof(struct tmpbranch), 1, dgn_file);
n_dgns--;
g.n_dgns--;
i--;
continue;
}
@@ -938,12 +933,12 @@ init_dungeons()
* its entrance (end1) has a bogus dnum, namely
* n_dgns.
*/
for (br = branches; br; br = br->next)
for (br = g.branches; br; br = br->next)
if (on_level(&br->end2, &knox_level))
break;
if (br)
br->end1.dnum = n_dgns;
br->end1.dnum = g.n_dgns;
/* adjust the branch's position on the list */
insert_branch(br, TRUE);
}
@@ -1015,7 +1010,7 @@ boolean noquest;
d_level tmp;
register schar ret = 0;
for (i = 0; i < n_dgns; i++) {
for (i = 0; i < g.n_dgns; i++) {
if (noquest && i == quest_dnum)
continue;
tmp.dlevel = dungeons[i].dunlev_ureached;
@@ -1050,8 +1045,8 @@ d_level *lev;
xchar
maxledgerno()
{
return (xchar) (dungeons[n_dgns - 1].ledger_start
+ dungeons[n_dgns - 1].num_dunlevs);
return (xchar) (dungeons[g.n_dgns - 1].ledger_start
+ dungeons[g.n_dgns - 1].num_dunlevs);
}
/* return the dungeon that this ledgerno exists in */
@@ -1062,7 +1057,7 @@ xchar ledgerno;
register int i;
/* find i such that (i->base + 1) <= ledgerno <= (i->base + i->count) */
for (i = 0; i < n_dgns; i++)
for (i = 0; i < g.n_dgns; i++)
if (dungeons[i].ledger_start < ledgerno
&& ledgerno <= dungeons[i].ledger_start + dungeons[i].num_dunlevs)
return (xchar) i;
@@ -1123,7 +1118,7 @@ d_level *lev;
{
branch *curr;
for (curr = branches; curr; curr = curr->next) {
for (curr = g.branches; curr; curr = curr->next) {
if (on_level(lev, &curr->end1) || on_level(lev, &curr->end2))
return curr;
}
@@ -1373,7 +1368,7 @@ int levnum;
* This assumes that end2 is always the "child" and it is
* unique.
*/
for (br = branches; br; br = br->next)
for (br = g.branches; br; br = br->next)
if (br->end2.dnum == dgn)
break;
if (!br)
@@ -1425,7 +1420,7 @@ const char *s;
dnum = dname_to_dnum(s);
/* Find the branch that connects to dungeon i's branch. */
for (br = branches; br; br = br->next)
for (br = g.branches; br; br = br->next)
if (br->end2.dnum == dnum)
break;
@@ -1721,8 +1716,8 @@ struct dungeon *dptr;
/* if other floating branches are added, this will need to change */
if (idx != knox_level.dnum)
return FALSE;
for (br = branches; br; br = br->next)
if (br->end1.dnum == n_dgns && br->end2.dnum == idx)
for (br = g.branches; br; br = br->next)
if (br->end1.dnum == g.n_dgns && br->end2.dnum == idx)
return TRUE;
return FALSE;
}
@@ -1816,7 +1811,7 @@ struct lchoice *lchoices_p;
char buf[BUFSZ];
/* This assumes that end1 is the "parent". */
for (br = branches; br; br = br->next) {
for (br = g.branches; br; br = br->next) {
if (br->end1.dnum == dnum && lower_bound < br->end1.dlevel
&& br->end1.dlevel <= upper_bound) {
Sprintf(buf, "%c %s to %s: %d",
@@ -1856,7 +1851,7 @@ xchar *rdgn;
lchoices.menuletter = 'a';
}
for (i = 0, dptr = dungeons; i < n_dgns; i++, dptr++) {
for (i = 0, dptr = dungeons; i < g.n_dgns; i++, dptr++) {
if (bymenu && In_endgame(&u.uz) && i != astral_level.dnum)
continue;
unplaced = unplaced_floater(dptr);
@@ -1933,8 +1928,8 @@ xchar *rdgn;
}
/* Print out floating branches (if any). */
for (first = TRUE, br = branches; br; br = br->next) {
if (br->end1.dnum == n_dgns) {
for (first = TRUE, br = g.branches; br; br = br->next) {
if (br->end1.dnum == g.n_dgns) {
if (first) {
putstr(win, 0, "");
putstr(win, 0, "Floating branches");
@@ -2006,7 +2001,7 @@ d_level *dest;
return;
/* we only care about forward branches */
for (br = branches; br; br = br->next) {
for (br = g.branches; br; br = br->next) {
if (on_level(source, &br->end1) && on_level(dest, &br->end2))
break;
if (on_level(source, &br->end2) && on_level(dest, &br->end1))
@@ -2094,7 +2089,7 @@ d_level *lev;
{
mapseen *mptr;
for (mptr = mapseenchn; mptr; mptr = mptr->next)
for (mptr = g.mapseenchn; mptr; mptr = mptr->next)
if (on_level(&(mptr->lev), lev))
break;
@@ -2107,7 +2102,7 @@ const char *s;
{
mapseen *mptr;
for (mptr = mapseenchn; mptr; mptr = mptr->next)
for (mptr = g.mapseenchn; mptr; mptr = mptr->next)
if (mptr->custom && !strcmpi(s, mptr->custom))
break;
@@ -2122,7 +2117,7 @@ int ledger_num;
mapseen *mptr;
struct cemetery *bp;
for (mptr = mapseenchn; mptr; mptr = mptr->next)
for (mptr = g.mapseenchn; mptr; mptr = mptr->next)
if (dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel
== ledger_num)
break;
@@ -2151,7 +2146,7 @@ int ledger_num;
mapseen *mptr, *mprev = (mapseen *)0;
struct cemetery *bp, *bpnext;
for (mptr = mapseenchn; mptr; mprev = mptr, mptr = mptr->next)
for (mptr = g.mapseenchn; mptr; mprev = mptr, mptr = mptr->next)
if (dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel == ledger_num)
break;
@@ -2172,7 +2167,7 @@ int ledger_num;
mprev->next = mptr->next;
free(mptr);
} else {
mapseenchn = mptr->next;
g.mapseenchn = mptr->next;
free(mptr);
}
}
@@ -2185,7 +2180,7 @@ mapseen *mptr;
branch *curr;
int brindx;
for (brindx = 0, curr = branches; curr; curr = curr->next, ++brindx)
for (brindx = 0, curr = g.branches; curr; curr = curr->next, ++brindx)
if (curr == mptr->br)
break;
bwrite(fd, (genericptr_t) &brindx, sizeof brindx);
@@ -2211,7 +2206,7 @@ int fd;
load = (mapseen *) alloc(sizeof *load);
mread(fd, (genericptr_t) &branchnum, sizeof branchnum);
for (brindx = 0, curr = branches; curr; curr = curr->next, ++brindx)
for (brindx = 0, curr = g.branches; curr; curr = curr->next, ++brindx)
if (brindx == branchnum)
break;
load->br = curr;
@@ -2246,7 +2241,7 @@ long *total_count, *total_size;
mapseen *mptr = find_mapseen(&u.uz);
ocount = bcount = acount = osize = bsize = asize = 0L;
for (mptr = mapseenchn; mptr; mptr = mptr->next) {
for (mptr = g.mapseenchn; mptr; mptr = mptr->next) {
++ocount;
osize += (long) sizeof *mptr;
for (ce = mptr->final_resting_place; ce; ce = ce->next) {
@@ -2288,7 +2283,7 @@ int dnum;
{
mapseen *mptr, **mptraddr;
mptraddr = &mapseenchn;
mptraddr = &g.mapseenchn;
while ((mptr = *mptraddr) != 0) {
if (mptr->lev.dnum == dnum) {
#if 1 /* use this... */
@@ -2330,14 +2325,14 @@ d_level *lev;
init->lev.dlevel = lev->dlevel;
/* walk until we get to the place where we should insert init */
for (mptr = mapseenchn, prev = 0; mptr; prev = mptr, mptr = mptr->next)
for (mptr = g.mapseenchn, prev = 0; mptr; prev = mptr, mptr = mptr->next)
if (mptr->lev.dnum > init->lev.dnum
|| (mptr->lev.dnum == init->lev.dnum
&& mptr->lev.dlevel > init->lev.dlevel))
break;
if (!prev) {
init->next = mapseenchn;
mapseenchn = init;
init->next = g.mapseenchn;
g.mapseenchn = init;
} else {
mptr = prev->next;
prev->next = init;
@@ -2413,7 +2408,7 @@ recalc_mapseen()
if (mptr->flags.unreachable) {
mptr->flags.unreachable = 0; /* reached it; Eye of the Aethiopica? */
if (In_quest(&u.uz)) {
mapseen *mptrtmp = mapseenchn;
mapseen *mptrtmp = g.mapseenchn;
/* when quest was unreachable due to ejection and portal removal,
getting back to it via arti-invoke should revive annotation
@@ -2716,7 +2711,7 @@ int why, reason, *lastdun_p;
mapseen *mptr;
boolean showheader;
for (mptr = mapseenchn; mptr; mptr = mptr->next) {
for (mptr = g.mapseenchn; mptr; mptr = mptr->next) {
if (viewendgame ^ In_endgame(&mptr->lev))
continue;
+5 -8
View File
@@ -39,8 +39,6 @@ STATIC_DCL const char *FDECL(foodword, (struct obj *));
STATIC_DCL int FDECL(tin_variety, (struct obj *, BOOLEAN_P));
STATIC_DCL boolean FDECL(maybe_cannibal, (int, BOOLEAN_P));
char msgbuf[BUFSZ];
/* also used to see if you're allowed to eat cats and dogs */
#define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC))
@@ -69,8 +67,6 @@ STATIC_OVL NEARDATA const char allobj[] = {
BALL_CLASS, CHAIN_CLASS, SPBOOK_CLASS, 0
};
STATIC_OVL boolean force_save_hs = FALSE;
/* see hunger states in hack.h - texts used on bottom line */
const char *hu_stat[] = { "Satiated", " ", "Hungry ", "Weak ",
"Fainting", "Fainted ", "Starved " };
@@ -1733,6 +1729,7 @@ start_eating(otmp)
struct obj *otmp;
{
const char *old_nomovemsg, *save_nomovemsg;
static char msgbuf[BUFSZ];
debugpline2("start_eating: %s (victual = %s)",
/* note: fmt_ptr() returns a static buffer but supports
@@ -2758,7 +2755,7 @@ bite()
do_reset_eat();
return 0;
}
force_save_hs = TRUE;
g.force_save_hs = TRUE;
if (context.victual.nmod < 0) {
lesshungry(-context.victual.nmod);
consume_oeaten(context.victual.piece,
@@ -2768,7 +2765,7 @@ bite()
lesshungry(1);
consume_oeaten(context.victual.piece, -1); /* -= 1 */
}
force_save_hs = FALSE;
g.force_save_hs = FALSE;
recalc_wt();
return 0;
}
@@ -2845,7 +2842,7 @@ lesshungry(num)
int num;
{
/* See comments in newuhs() for discussion on force_save_hs */
boolean iseating = (occupation == eatfood) || force_save_hs;
boolean iseating = (occupation == eatfood) || g.force_save_hs;
debugpline1("lesshungry(%d)", num);
u.uhunger += num;
@@ -2951,7 +2948,7 @@ boolean incr;
* were added or if HUNGRY and WEAK were separated by a big enough
* gap to fit two bites.
*/
if (occupation == eatfood || force_save_hs) {
if (occupation == eatfood || g.force_save_hs) {
if (!saved_hs) {
save_hs = u.uhs;
saved_hs = TRUE;
+11 -32
View File
@@ -19,27 +19,6 @@
/* add b to long a, convert wraparound to max value */
#define nowrap_add(a, b) (a = ((a + b) < 0 ? LONG_MAX : (a + b)))
/* these probably ought to be generated by makedefs, like LAST_GEM */
#define FIRST_GEM DILITHIUM_CRYSTAL
#define FIRST_AMULET AMULET_OF_ESP
#define LAST_AMULET AMULET_OF_YENDOR
struct valuable_data {
long count;
int typ;
};
static struct valuable_data
gems[LAST_GEM + 1 - FIRST_GEM + 1], /* 1 extra for glass */
amulets[LAST_AMULET + 1 - FIRST_AMULET];
static struct val_list {
struct valuable_data *list;
int size;
} valuables[] = { { gems, sizeof gems / sizeof *gems },
{ amulets, sizeof amulets / sizeof *amulets },
{ 0, 0 } };
#ifndef NO_SIGNAL
STATIC_PTR void FDECL(done_intr, (int));
#if defined(UNIX) || defined(VMS) || defined(__EMX__)
@@ -909,18 +888,18 @@ struct obj *list; /* inventory or container contents */
continue;
} else if (obj->oclass == AMULET_CLASS) {
i = obj->otyp - FIRST_AMULET;
if (!amulets[i].count) {
amulets[i].count = obj->quan;
amulets[i].typ = obj->otyp;
if (!g.amulets[i].count) {
g.amulets[i].count = obj->quan;
g.amulets[i].typ = obj->otyp;
} else
amulets[i].count += obj->quan; /* always adds one */
g.amulets[i].count += obj->quan; /* always adds one */
} else if (obj->oclass == GEM_CLASS && obj->otyp < LUCKSTONE) {
i = min(obj->otyp, LAST_GEM + 1) - FIRST_GEM;
if (!gems[i].count) {
gems[i].count = obj->quan;
gems[i].typ = obj->otyp;
if (!g.gems[i].count) {
g.gems[i].count = obj->quan;
g.gems[i].typ = obj->otyp;
} else
gems[i].count += obj->quan;
g.gems[i].count += obj->quan;
}
return;
}
@@ -1407,14 +1386,14 @@ int how;
register struct val_list *val;
register int i;
for (val = valuables; val->list; val++)
for (val = g.valuables; val->list; val++)
for (i = 0; i < val->size; i++) {
val->list[i].count = 0L;
}
get_valuables(invent);
/* add points for collected valuables */
for (val = valuables; val->list; val++)
for (val = g.valuables; val->list; val++)
for (i = 0; i < val->size; i++)
if (val->list[i].count != 0L) {
tmp = val->list[i].count
@@ -1465,7 +1444,7 @@ int how;
#endif
/* list valuables here */
for (val = valuables; val->list; val++) {
for (val = g.valuables; val->list; val++) {
sort_valuables(val->list, val->size);
for (i = 0; i < val->size && !done_stopprint; i++) {
int typ = val->list[i].typ;
+14 -16
View File
@@ -167,8 +167,6 @@ static int lockptr;
extern char *sounddir;
#endif
extern int n_dgns; /* from dungeon.c */
#if defined(UNIX) && defined(QT_GRAPHICS)
#define SELECTSAVED
#endif
@@ -604,7 +602,7 @@ clearlocks()
sethanguphandler((void FDECL((*), (int) )) SIG_IGN);
#endif
/* can't access maxledgerno() before dungeons are created -dlc */
for (x = (n_dgns ? maxledgerno() : 0); x >= 0; x--)
for (x = (g.n_dgns ? maxledgerno() : 0); x >= 0; x--)
delete_levelfile(x); /* not all levels need be present */
}
#endif /* ?PC_LOCKING,&c */
@@ -3182,17 +3180,17 @@ int which_set;
/* name caller put in symset[which_set].name was not found;
if it looks like "Default symbols", null it out and return
success to use the default; otherwise, return failure */
if (symset[which_set].name
&& (fuzzymatch(symset[which_set].name, "Default symbols",
if (g.symset[which_set].name
&& (fuzzymatch(g.symset[which_set].name, "Default symbols",
" -_", TRUE)
|| !strcmpi(symset[which_set].name, "default")))
|| !strcmpi(g.symset[which_set].name, "default")))
clear_symsetentry(which_set, TRUE);
config_error_done();
return (symset[which_set].name == 0) ? 1 : 0;
return (g.symset[which_set].name == 0) ? 1 : 0;
}
if (!chosen_symset_end)
config_error_add("Missing finish for symset \"%s\"",
symset[which_set].name ? symset[which_set].name
g.symset[which_set].name ? g.symset[which_set].name
: "unknown");
config_error_done();
@@ -3256,7 +3254,7 @@ int which_set;
return 0;
}
if (!symset[which_set].name) {
if (!g.symset[which_set].name) {
/* A null symset name indicates that we're just
building a pick-list of possible symset
values from the file, so only do that */
@@ -3328,7 +3326,7 @@ int which_set;
switch (symp->idx) {
case 0:
/* start of symset */
if (!strcmpi(bufp, symset[which_set].name)) {
if (!strcmpi(bufp, g.symset[which_set].name)) {
/* matches desired one */
chosen_symset_start = TRUE;
/* these init_*() functions clear symset fields too */
@@ -3355,11 +3353,11 @@ int which_set;
if (bufp) {
if (!strcmpi(bufp, "true") || !strcmpi(bufp, "yes")
|| !strcmpi(bufp, "on"))
symset[which_set].nocolor = 0;
g.symset[which_set].nocolor = 0;
else if (!strcmpi(bufp, "false")
|| !strcmpi(bufp, "no")
|| !strcmpi(bufp, "off"))
symset[which_set].nocolor = 1;
g.symset[which_set].nocolor = 1;
}
}
break;
@@ -3371,10 +3369,10 @@ int which_set;
if (!strcmpi(known_restrictions[n], bufp)) {
switch (n) {
case 0:
symset[which_set].primary = 1;
g.symset[which_set].primary = 1;
break;
case 1:
symset[which_set].rogue = 1;
g.symset[which_set].rogue = 1;
break;
}
break; /* while loop */
@@ -3405,10 +3403,10 @@ int which_set;
{
int i = 0;
symset[which_set].handling = H_UNK;
g.symset[which_set].handling = H_UNK;
while (known_handling[i]) {
if (!strcmpi(known_handling[i], handling)) {
symset[which_set].handling = i;
g.symset[which_set].handling = i;
return;
}
i++;
+17 -21
View File
@@ -24,42 +24,40 @@ STATIC_DCL void FDECL(move_update, (BOOLEAN_P));
#define TRAVP_GUESS 1
#define TRAVP_VALID 2
static anything tmp_anything;
anything *
uint_to_any(ui)
unsigned ui;
{
tmp_anything = zeroany;
tmp_anything.a_uint = ui;
return &tmp_anything;
g.tmp_anything = zeroany;
g.tmp_anything.a_uint = ui;
return &g.tmp_anything;
}
anything *
long_to_any(lng)
long lng;
{
tmp_anything = zeroany;
tmp_anything.a_long = lng;
return &tmp_anything;
g.tmp_anything = zeroany;
g.tmp_anything.a_long = lng;
return &g.tmp_anything;
}
anything *
monst_to_any(mtmp)
struct monst *mtmp;
{
tmp_anything = zeroany;
tmp_anything.a_monst = mtmp;
return &tmp_anything;
g.tmp_anything = zeroany;
g.tmp_anything.a_monst = mtmp;
return &g.tmp_anything;
}
anything *
obj_to_any(obj)
struct obj *obj;
{
tmp_anything = zeroany;
tmp_anything.a_obj = obj;
return &tmp_anything;
g.tmp_anything = zeroany;
g.tmp_anything.a_obj = obj;
return &g.tmp_anything;
}
boolean
@@ -2968,8 +2966,6 @@ weight_cap()
return (int) carrcap;
}
static int wc; /* current weight_cap(); valid after call to inv_weight() */
/* returns how far beyond the normal capacity the player is currently. */
/* inv_weight() is negative if the player is below normal capacity. */
int
@@ -2985,8 +2981,8 @@ inv_weight()
wt += otmp->owt;
otmp = otmp->nobj;
}
wc = weight_cap();
return (wt - wc);
g.wc = weight_cap();
return (wt - g.wc);
}
/*
@@ -3001,9 +2997,9 @@ int xtra_wt;
if (wt <= 0)
return UNENCUMBERED;
if (wc <= 1)
if (g.wc <= 1)
return OVERLOADED;
cap = (wt * 2 / wc) + 1;
cap = (wt * 2 / g.wc) + 1;
return min(cap, OVERLOADED);
}
@@ -3018,7 +3014,7 @@ max_capacity()
{
int wt = inv_weight();
return (wt - (2 * wc));
return (wt - (2 * g.wc));
}
boolean
+24 -32
View File
@@ -39,8 +39,6 @@ STATIC_DCL void FDECL(menu_identify, (int));
STATIC_DCL boolean FDECL(tool_in_use, (struct obj *));
STATIC_DCL char FDECL(obj_to_let, (struct obj *));
static int lastinvnr = 51; /* 0 ... 51 (never saved&restored) */
/* wizards can wish for venom, which will become an invisible inventory
* item without this. putting it in inv_order would mean venom would
* suddenly become a choice for all the inventory-class commands, which
@@ -263,9 +261,6 @@ struct obj *obj;
return res;
}
/* set by sortloot() for use by sortloot_cmp(); reset by sortloot when done */
static unsigned sortlootmode = 0;
/* qsort comparison routine for sortloot() */
STATIC_OVL int CFDECLSPEC
sortloot_cmp(vptr1, vptr2)
@@ -280,7 +275,7 @@ const genericptr vptr2;
int val1, val2, c, namcmp;
/* order by object class unless we're doing by-invlet without sortpack */
if ((sortlootmode & (SORTLOOT_PACK | SORTLOOT_INVLET))
if ((g.sortlootmode & (SORTLOOT_PACK | SORTLOOT_INVLET))
!= SORTLOOT_INVLET) {
/* Classify each object at most once no matter how many
comparisons it is involved in. */
@@ -296,7 +291,7 @@ const genericptr vptr2;
return (int) (val1 - val2);
/* skip sub-classes when ordering by sortpack+invlet */
if ((sortlootmode & SORTLOOT_INVLET) == 0) {
if ((g.sortlootmode & SORTLOOT_INVLET) == 0) {
/* Class matches; sort by subclass. */
val1 = sli1->subclass;
val2 = sli2->subclass;
@@ -321,7 +316,7 @@ const genericptr vptr2;
}
/* order by assigned inventory letter */
if ((sortlootmode & SORTLOOT_INVLET) != 0) {
if ((g.sortlootmode & SORTLOOT_INVLET) != 0) {
c = obj1->invlet;
val1 = ('a' <= c && c <= 'z') ? (c - 'a' + 2)
: ('A' <= c && c <= 'Z') ? (c - 'A' + 2 + 26)
@@ -338,7 +333,7 @@ const genericptr vptr2;
return val1 - val2;
}
if ((sortlootmode & SORTLOOT_LOOT) == 0)
if ((g.sortlootmode & SORTLOOT_LOOT) == 0)
goto tiebreak;
/*
@@ -488,9 +483,9 @@ boolean FDECL((*filterfunc), (OBJ_P));
/* do the sort; if no sorting is requested, we'll just return
a sortloot_item array reflecting the current ordering */
if (mode && n > 1) {
sortlootmode = mode; /* extra input for sortloot_cmp() */
g.sortlootmode = mode; /* extra input for sortloot_cmp() */
qsort((genericptr_t) sliarray, n, sizeof *sliarray, sortloot_cmp);
sortlootmode = 0; /* reset static mode flags */
g.sortlootmode = 0; /* reset static mode flags */
/* if sortloot_cmp formatted any objects, discard their strings now */
for (i = 0; i < n; ++i)
if (sliarray[i].str)
@@ -520,7 +515,7 @@ boolean by_nexthere; /* T: traverse via obj->nexthere, F: via obj->nobj */
unsigned n, i;
boolean already_sorted = TRUE;
sortlootmode = mode; /* extra input for sortloot_cmp() */
g.sortlootmode = mode; /* extra input for sortloot_cmp() */
for (n = osli.indx = 0, osli.obj = *olist; (o = osli.obj) != 0;
osli = nsli) {
nsli.obj = by_nexthere ? o->nexthere : o->nobj;
@@ -544,7 +539,7 @@ boolean by_nexthere; /* T: traverse via obj->nexthere, F: via obj->nobj */
*olist = sliarray[0].obj;
free((genericptr_t) sliarray);
}
sortlootmode = 0;
g.sortlootmode = 0;
}
#endif /*0*/
@@ -577,7 +572,7 @@ register struct obj *otmp;
if ((i = otmp->invlet)
&& (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z')))
return;
for (i = lastinvnr + 1; i != lastinvnr; i++) {
for (i = g.lastinvnr + 1; i != g.lastinvnr; i++) {
if (i == 52) {
i = -1;
continue;
@@ -587,7 +582,7 @@ register struct obj *otmp;
}
otmp->invlet =
(inuse[i] ? NOINVSYM : (i < 26) ? ('a' + i) : ('A' + i - 26));
lastinvnr = i;
g.lastinvnr = i;
}
/* note: assumes ASCII; toggling a bit puts lowercase in front of uppercase */
@@ -3809,9 +3804,6 @@ STATIC_VAR NEARDATA const char *names[] = {
STATIC_VAR NEARDATA const char oth_symbols[] = { CONTAINED_SYM, '\0' };
STATIC_VAR NEARDATA const char *oth_names[] = { "Bagged/Boxed items" };
STATIC_VAR NEARDATA char *invbuf = (char *) 0;
STATIC_VAR NEARDATA unsigned invbufsiz = 0;
char *
let_to_name(let, unpaid, showsym)
char let;
@@ -3833,36 +3825,36 @@ boolean unpaid, showsym;
len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "")
+ (oclass ? (strlen(ocsymfmt) + invbuf_sympadding) : 0);
if (len > invbufsiz) {
if (invbuf)
free((genericptr_t) invbuf);
invbufsiz = len + 10; /* add slop to reduce incremental realloc */
invbuf = (char *) alloc(invbufsiz);
if (len > g.invbufsiz) {
if (g.invbuf)
free((genericptr_t) g.invbuf);
g.invbufsiz = len + 10; /* add slop to reduce incremental realloc */
g.invbuf = (char *) alloc(g.invbufsiz);
}
if (unpaid)
Strcat(strcpy(invbuf, "Unpaid "), class_name);
Strcat(strcpy(g.invbuf, "Unpaid "), class_name);
else
Strcpy(invbuf, class_name);
Strcpy(g.invbuf, class_name);
if ((oclass != 0) && showsym) {
char *bp = eos(invbuf);
char *bp = eos(g.invbuf);
int mlen = invbuf_sympadding - strlen(class_name);
while (--mlen > 0) {
*bp = ' ';
bp++;
}
*bp = '\0';
Sprintf(eos(invbuf), ocsymfmt, def_oc_syms[oclass].sym);
Sprintf(eos(g.invbuf), ocsymfmt, def_oc_syms[oclass].sym);
}
return invbuf;
return g.invbuf;
}
/* release the static buffer used by let_to_name() */
void
free_invbuf()
{
if (invbuf)
free((genericptr_t) invbuf), invbuf = (char *) 0;
invbufsiz = 0;
if (g.invbuf)
free((genericptr_t) g.invbuf), g.invbuf = (char *) 0;
g.invbufsiz = 0;
}
/* give consecutive letters to every item in inventory (for !fixinv mode);
@@ -3896,7 +3888,7 @@ reassign()
}
if (i >= 52)
i = 52 - 1;
lastinvnr = i;
g.lastinvnr = i;
}
/* #adjust command
+81 -90
View File
@@ -5,15 +5,6 @@
#include "hack.h"
/* at most one of `door' and `box' should be non-null at any given time */
STATIC_VAR NEARDATA struct xlock_s {
struct rm *door;
struct obj *box;
int picktyp, /* key|pick|card for unlock, sharp vs blunt for #force */
chance, usedtime;
boolean magic_key;
} xlock;
/* occupation callbacks */
STATIC_PTR int NDECL(picklock);
STATIC_PTR int NDECL(forcelock);
@@ -40,7 +31,7 @@ boolean
picking_at(x, y)
int x, y;
{
return (boolean) (occupation == picklock && xlock.door == &levl[x][y]);
return (boolean) (occupation == picklock && g.xlock.door == &levl[x][y]);
}
/* produce an occupation string appropriate for the current activity */
@@ -56,19 +47,19 @@ lock_action()
};
/* if the target is currently unlocked, we're trying to lock it now */
if (xlock.door && !(xlock.door->doormask & D_LOCKED))
if (g.xlock.door && !(g.xlock.door->doormask & D_LOCKED))
return actions[0] + 2; /* "locking the door" */
else if (xlock.box && !xlock.box->olocked)
return xlock.box->otyp == CHEST ? actions[1] + 2 : actions[2] + 2;
else if (g.xlock.box && !g.xlock.box->olocked)
return g.xlock.box->otyp == CHEST ? actions[1] + 2 : actions[2] + 2;
/* otherwise we're trying to unlock it */
else if (xlock.picktyp == LOCK_PICK)
else if (g.xlock.picktyp == LOCK_PICK)
return actions[3]; /* "picking the lock" */
else if (xlock.picktyp == CREDIT_CARD)
else if (g.xlock.picktyp == CREDIT_CARD)
return actions[3]; /* same as lock_pick */
else if (xlock.door)
else if (g.xlock.door)
return actions[0]; /* "unlocking the door" */
else if (xlock.box)
return xlock.box->otyp == CHEST ? actions[1] : actions[2];
else if (g.xlock.box)
return g.xlock.box->otyp == CHEST ? actions[1] : actions[2];
else
return actions[3];
}
@@ -77,44 +68,44 @@ lock_action()
STATIC_PTR int
picklock(VOID_ARGS)
{
if (xlock.box) {
if (xlock.box->where != OBJ_FLOOR
|| xlock.box->ox != u.ux || xlock.box->oy != u.uy) {
return ((xlock.usedtime = 0)); /* you or it moved */
if (g.xlock.box) {
if (g.xlock.box->where != OBJ_FLOOR
|| g.xlock.box->ox != u.ux || g.xlock.box->oy != u.uy) {
return ((g.xlock.usedtime = 0)); /* you or it moved */
}
} else { /* door */
if (xlock.door != &(levl[u.ux + u.dx][u.uy + u.dy])) {
return ((xlock.usedtime = 0)); /* you moved */
if (g.xlock.door != &(levl[u.ux + u.dx][u.uy + u.dy])) {
return ((g.xlock.usedtime = 0)); /* you moved */
}
switch (xlock.door->doormask) {
switch (g.xlock.door->doormask) {
case D_NODOOR:
pline("This doorway has no door.");
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
case D_ISOPEN:
You("cannot lock an open door.");
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
case D_BROKEN:
pline("This door is broken.");
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
}
}
if (xlock.usedtime++ >= 50 || nohands(youmonst.data)) {
if (g.xlock.usedtime++ >= 50 || nohands(youmonst.data)) {
You("give up your attempt at %s.", lock_action());
exercise(A_DEX, TRUE); /* even if you don't succeed */
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
}
if (rn2(100) >= xlock.chance)
if (rn2(100) >= g.xlock.chance)
return 1; /* still busy */
/* using the Master Key of Thievery finds traps if its bless/curse
state is adequate (non-cursed for rogues, blessed for others;
checked when setting up 'xlock') */
if ((!xlock.door ? (int) xlock.box->otrapped
: (xlock.door->doormask & D_TRAPPED) != 0)
&& xlock.magic_key) {
xlock.chance += 20; /* less effort needed next time */
if ((!g.xlock.door ? (int) g.xlock.box->otrapped
: (g.xlock.door->doormask & D_TRAPPED) != 0)
&& g.xlock.magic_key) {
g.xlock.chance += 20; /* less effort needed next time */
/* unfortunately we don't have a 'tknown' flag to record
"known to be trapped" so declining to disarm and then
retrying lock manipulation will find it all over again */
@@ -123,14 +114,14 @@ picklock(VOID_ARGS)
boolean alreadyunlocked;
/* disarming while using magic key always succeeds */
if (xlock.door) {
xlock.door->doormask &= ~D_TRAPPED;
if (g.xlock.door) {
g.xlock.door->doormask &= ~D_TRAPPED;
what = "door";
alreadyunlocked = !(xlock.door->doormask & D_LOCKED);
alreadyunlocked = !(g.xlock.door->doormask & D_LOCKED);
} else {
xlock.box->otrapped = 0;
what = (xlock.box->otyp == CHEST) ? "chest" : "box";
alreadyunlocked = !xlock.box->olocked;
g.xlock.box->otrapped = 0;
what = (g.xlock.box->otyp == CHEST) ? "chest" : "box";
alreadyunlocked = !g.xlock.box->olocked;
}
You("succeed in disarming the trap. The %s is still %slocked.",
what, alreadyunlocked ? "un" : "");
@@ -139,30 +130,30 @@ picklock(VOID_ARGS)
You("stop %s.", lock_action());
exercise(A_WIS, FALSE);
}
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
}
You("succeed in %s.", lock_action());
if (xlock.door) {
if (xlock.door->doormask & D_TRAPPED) {
if (g.xlock.door) {
if (g.xlock.door->doormask & D_TRAPPED) {
b_trapped("door", FINGER);
xlock.door->doormask = D_NODOOR;
g.xlock.door->doormask = D_NODOOR;
unblock_point(u.ux + u.dx, u.uy + u.dy);
if (*in_rooms(u.ux + u.dx, u.uy + u.dy, SHOPBASE))
add_damage(u.ux + u.dx, u.uy + u.dy, SHOP_DOOR_COST);
newsym(u.ux + u.dx, u.uy + u.dy);
} else if (xlock.door->doormask & D_LOCKED)
xlock.door->doormask = D_CLOSED;
} else if (g.xlock.door->doormask & D_LOCKED)
g.xlock.door->doormask = D_CLOSED;
else
xlock.door->doormask = D_LOCKED;
g.xlock.door->doormask = D_LOCKED;
} else {
xlock.box->olocked = !xlock.box->olocked;
xlock.box->lknown = 1;
if (xlock.box->otrapped)
(void) chest_trap(xlock.box, FINGER, FALSE);
g.xlock.box->olocked = !g.xlock.box->olocked;
g.xlock.box->lknown = 1;
if (g.xlock.box->otrapped)
(void) chest_trap(g.xlock.box, FINGER, FALSE);
}
exercise(A_DEX, TRUE);
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
}
void
@@ -222,17 +213,17 @@ boolean destroyit;
STATIC_PTR int
forcelock(VOID_ARGS)
{
if ((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy))
return ((xlock.usedtime = 0)); /* you or it moved */
if ((g.xlock.box->ox != u.ux) || (g.xlock.box->oy != u.uy))
return ((g.xlock.usedtime = 0)); /* you or it moved */
if (xlock.usedtime++ >= 50 || !uwep || nohands(youmonst.data)) {
if (g.xlock.usedtime++ >= 50 || !uwep || nohands(youmonst.data)) {
You("give up your attempt to force the lock.");
if (xlock.usedtime >= 50) /* you made the effort */
exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE);
return ((xlock.usedtime = 0));
if (g.xlock.usedtime >= 50) /* you made the effort */
exercise((g.xlock.picktyp) ? A_DEX : A_STR, TRUE);
return ((g.xlock.usedtime = 0));
}
if (xlock.picktyp) { /* blade */
if (g.xlock.picktyp) { /* blade */
if (rn2(1000 - (int) uwep->spe) > (992 - greatest_erosion(uwep) * 10)
&& !uwep->cursed && !obj_resists(uwep, 0, 99)) {
/* for a +0 weapon, probability that it survives an unsuccessful
@@ -243,35 +234,35 @@ forcelock(VOID_ARGS)
useup(uwep);
You("give up your attempt to force the lock.");
exercise(A_DEX, TRUE);
return ((xlock.usedtime = 0));
return ((g.xlock.usedtime = 0));
}
} else /* blunt */
wake_nearby(); /* due to hammering on the container */
if (rn2(100) >= xlock.chance)
if (rn2(100) >= g.xlock.chance)
return 1; /* still busy */
You("succeed in forcing the lock.");
breakchestlock(xlock.box, (boolean) (!xlock.picktyp && !rn2(3)));
breakchestlock(g.xlock.box, (boolean) (!g.xlock.picktyp && !rn2(3)));
exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE);
return ((xlock.usedtime = 0));
exercise((g.xlock.picktyp) ? A_DEX : A_STR, TRUE);
return ((g.xlock.usedtime = 0));
}
void
reset_pick()
{
xlock.usedtime = xlock.chance = xlock.picktyp = 0;
xlock.magic_key = FALSE;
xlock.door = 0;
xlock.box = 0;
g.xlock.usedtime = g.xlock.chance = g.xlock.picktyp = 0;
g.xlock.magic_key = FALSE;
g.xlock.door = 0;
g.xlock.box = 0;
}
/* level change; don't reset if hero is carrying xlock.box with him/her */
void
maybe_reset_pick()
{
if (!xlock.box || !carried(xlock.box))
if (!g.xlock.box || !carried(g.xlock.box))
reset_pick();
}
@@ -297,7 +288,7 @@ struct obj *pick;
picktyp = pick->otyp;
/* check whether we're resuming an interrupted previous attempt */
if (xlock.usedtime && picktyp == xlock.picktyp) {
if (g.xlock.usedtime && picktyp == g.xlock.picktyp) {
static char no_longer[] = "Unfortunately, you can no longer %s %s.";
if (nohands(youmonst.data)) {
@@ -308,7 +299,7 @@ struct obj *pick;
pline(no_longer, "hold the", what);
reset_pick();
return PICKLOCK_LEARNED_SOMETHING;
} else if (u.uswallow || (xlock.box && !can_reach_floor(TRUE))) {
} else if (u.uswallow || (g.xlock.box && !can_reach_floor(TRUE))) {
pline(no_longer, "reach the", "lock");
reset_pick();
return PICKLOCK_LEARNED_SOMETHING;
@@ -316,7 +307,7 @@ struct obj *pick;
const char *action = lock_action();
You("resume your attempt at %s.", action);
xlock.magic_key = is_magic_key(&youmonst, pick);
g.xlock.magic_key = is_magic_key(&youmonst, pick);
set_occupation(picklock, action, 0);
return PICKLOCK_DID_SOMETHING;
}
@@ -416,8 +407,8 @@ struct obj *pick;
if (otmp->cursed)
ch /= 2;
xlock.box = otmp;
xlock.door = 0;
g.xlock.box = otmp;
g.xlock.door = 0;
break;
}
if (c != 'y') {
@@ -495,15 +486,15 @@ struct obj *pick;
default:
ch = 0;
}
xlock.door = door;
xlock.box = 0;
g.xlock.door = door;
g.xlock.box = 0;
}
}
context.move = 0;
xlock.chance = ch;
xlock.picktyp = picktyp;
xlock.magic_key = is_magic_key(&youmonst, pick);
xlock.usedtime = 0;
g.xlock.chance = ch;
g.xlock.picktyp = picktyp;
g.xlock.magic_key = is_magic_key(&youmonst, pick);
g.xlock.usedtime = 0;
set_occupation(picklock, lock_action(), 0);
return PICKLOCK_DID_SOMETHING;
}
@@ -539,14 +530,14 @@ doforce()
}
picktyp = is_blade(uwep) && !is_pick(uwep);
if (xlock.usedtime && xlock.box && picktyp == xlock.picktyp) {
if (g.xlock.usedtime && g.xlock.box && picktyp == g.xlock.picktyp) {
You("resume your attempt to force the lock.");
set_occupation(forcelock, "forcing the lock", 0);
return 1;
}
/* A lock is made only for the honest man, the thief will break it. */
xlock.box = (struct obj *) 0;
g.xlock.box = (struct obj *) 0;
for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere)
if (Is_box(otmp)) {
if (otmp->obroken || !otmp->olocked) {
@@ -574,15 +565,15 @@ doforce()
You("force %s into a crack and pry.", yname(uwep));
else
You("start bashing it with %s.", yname(uwep));
xlock.box = otmp;
xlock.chance = objects[uwep->otyp].oc_wldam * 2;
xlock.picktyp = picktyp;
xlock.magic_key = FALSE;
xlock.usedtime = 0;
g.xlock.box = otmp;
g.xlock.chance = objects[uwep->otyp].oc_wldam * 2;
g.xlock.picktyp = picktyp;
g.xlock.magic_key = FALSE;
g.xlock.usedtime = 0;
break;
}
if (xlock.box)
if (g.xlock.box)
set_occupation(forcelock, "forcing the lock", 0);
else
You("decide not to force the issue.");
@@ -890,7 +881,7 @@ struct obj *obj, *otmp; /* obj *is* a box */
case SPE_POLYMORPH:
/* maybe start unlocking chest, get interrupted, then zap it;
we must avoid any attempt to resume unlocking it */
if (xlock.box == obj)
if (g.xlock.box == obj)
reset_pick();
break;
}
+9 -9
View File
@@ -48,10 +48,10 @@ static const int explcolors[] = {
#if defined(USE_TILES) && defined(MSDOS)
#define HAS_ROGUE_IBM_GRAPHICS \
(currentgraphics == ROGUESET && SYMHANDLING(H_IBM) && !iflags.grmode)
(g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM) && !iflags.grmode)
#else
#define HAS_ROGUE_IBM_GRAPHICS \
(currentgraphics == ROGUESET && SYMHANDLING(H_IBM))
(g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM))
#endif
#define is_objpile(x,y) (!Hallucination && level.objects[(x)][(y)] \
@@ -71,7 +71,7 @@ unsigned *ospecial;
/* condense multiple tests in macro version down to single */
boolean has_rogue_ibm_graphics = HAS_ROGUE_IBM_GRAPHICS;
boolean has_rogue_color = (has_rogue_ibm_graphics
&& symset[currentgraphics].nocolor == 0);
&& g.symset[g.currentgraphics].nocolor == 0);
/*
* Map the glyph back to a character and color.
@@ -129,14 +129,14 @@ unsigned *ospecial;
/* provide a visible difference if normal and lit corridor
use the same symbol */
} else if (iflags.use_color && offset == S_litcorr
&& showsyms[idx] == showsyms[S_corr + SYM_OFF_P]) {
&& g.showsyms[idx] == g.showsyms[S_corr + SYM_OFF_P]) {
color = CLR_WHITE;
#endif
/* try to provide a visible difference between water and lava
if they use the same symbol and color is disabled */
} else if (!iflags.use_color && offset == S_lava
&& (showsyms[idx] == showsyms[S_pool + SYM_OFF_P]
|| showsyms[idx] == showsyms[S_water + SYM_OFF_P])) {
&& (g.showsyms[idx] == g.showsyms[S_pool + SYM_OFF_P]
|| g.showsyms[idx] == g.showsyms[S_water + SYM_OFF_P])) {
special |= MG_BW_LAVA;
} else {
cmap_color(offset);
@@ -222,7 +222,7 @@ unsigned *ospecial;
}
}
ch = showsyms[idx];
ch = g.showsyms[idx];
#ifdef TEXTCOLOR
/* Turn off color if no color defined, or rogue level w/o PC graphics. */
if (!has_color(color) || (Is_rogue_level(&u.uz) && !has_rogue_color))
@@ -283,7 +283,7 @@ const char *str;
else
break;
so = mapglyph(gv, &ch, &oc, &os, 0, 0);
*put++ = showsyms[so];
*put++ = g.showsyms[so];
/* 'str' is ready for the next loop iteration and '*str'
should not be copied at the end of this iteration */
continue;
@@ -308,7 +308,7 @@ const char *str;
else
break;
}
*put++ = showsyms[so];
*put++ = g.showsyms[so];
break;
#endif
case '\\':
+92 -101
View File
@@ -6,10 +6,6 @@
#include "hack.h"
#include "artifact.h"
static NEARDATA boolean vis, far_noise;
static NEARDATA long noisetime;
static NEARDATA struct obj *otmp;
static const char brief_feeling[] =
"have a %s feeling for a moment, then it passes.";
@@ -32,11 +28,6 @@ STATIC_DCL void FDECL(missmm, (struct monst *, struct monst *,
STATIC_DCL int FDECL(passivemm, (struct monst *, struct monst *,
BOOLEAN_P, int));
/* Needed for the special case of monsters wielding vorpal blades (rare).
* If we use this a lot it should probably be a parameter to mdamagem()
* instead of a global variable.
*/
static int dieroll;
/* returns mon_nam(mon) relative to other_mon; normal name unless they're
the same, in which case the reference is to {him|her|it} self */
@@ -69,9 +60,9 @@ register struct attack *mattk;
{
boolean farq = (distu(magr->mx, magr->my) > 15);
if (!Deaf && (farq != far_noise || moves - noisetime > 10)) {
far_noise = farq;
noisetime = moves;
if (!Deaf && (farq != g.far_noise || moves - g.noisetime > 10)) {
g.far_noise = farq;
g.noisetime = moves;
You_hear("%s%s.",
(mattk->aatyp == AT_EXPL) ? "an explosion" : "some noises",
farq ? " in the distance" : "");
@@ -87,7 +78,7 @@ struct attack *mattk;
const char *fmt;
char buf[BUFSZ], mdef_name[BUFSZ];
if (vis) {
if (g.vis) {
if (!canspotmon(magr))
map_invisible(magr->mx, magr->my);
if (!canspotmon(mdef))
@@ -235,7 +226,7 @@ boolean quietly;
* You can observe monster displacement if you can see both of
* the monsters involved.
*/
vis = (canspotmon(magr) && canspotmon(mdef));
g.vis = (canspotmon(magr) && canspotmon(mdef));
if (touch_petrifies(pd) && !resists_ston(magr)) {
if (which_armor(magr, W_ARMG) != 0) {
@@ -248,7 +239,7 @@ boolean quietly;
monstone(magr);
if (!DEADMONSTER(magr))
return MM_HIT; /* lifesaved */
else if (magr->mtame && !vis)
else if (magr->mtame && !g.vis)
You(brief_feeling, "peculiarly sad");
return MM_AGR_DIED;
}
@@ -258,7 +249,7 @@ boolean quietly;
remove_monster(tx, ty);
place_monster(magr, tx, ty); /* put down at target spot */
place_monster(mdef, fx, fy);
if (vis && !quietly)
if (g.vis && !quietly)
pline("%s moves %s out of %s way!", Monnam(magr), mon_nam(mdef),
is_rider(pa) ? "the" : mhis(magr));
newsym(fx, fy); /* see it */
@@ -343,7 +334,7 @@ register struct monst *magr, *mdef;
tmp++;
/* Set up the visibility of action */
vis = (cansee(magr->mx, magr->my) && cansee(mdef->mx, mdef->my)
g.vis = (cansee(magr->mx, magr->my) && cansee(mdef->mx, mdef->my)
&& (canspotmon(magr) || canspotmon(mdef)));
/* Set flag indicating monster has moved this turn. Necessary since a
@@ -357,7 +348,7 @@ register struct monst *magr, *mdef;
for (i = 0; i < NATTK; i++) {
res[i] = MM_MISS;
mattk = getmattk(magr, mdef, i, res, &alt_attk);
otmp = (struct obj *) 0;
g.otmp = (struct obj *) 0;
attk = 1;
switch (mattk->aatyp) {
case AT_WEAP: /* "hand to hand" attacks */
@@ -376,12 +367,12 @@ register struct monst *magr, *mdef;
return 0;
}
possibly_unwield(magr, FALSE);
otmp = MON_WEP(magr);
g.otmp = MON_WEP(magr);
if (otmp) {
if (vis)
mswingsm(magr, mdef, otmp);
tmp += hitval(otmp, mdef);
if (g.otmp) {
if (g.vis)
mswingsm(magr, mdef, g.otmp);
tmp += hitval(g.otmp, mdef);
}
/*FALLTHRU*/
case AT_CLAW:
@@ -399,26 +390,26 @@ register struct monst *magr, *mdef;
* have a weapon instead. This instinct doesn't work for
* players, or under conflict or confusion.
*/
if (!magr->mconf && !Conflict && otmp && mattk->aatyp != AT_WEAP
if (!magr->mconf && !Conflict && g.otmp && mattk->aatyp != AT_WEAP
&& touch_petrifies(mdef->data)) {
strike = 0;
break;
}
dieroll = rnd(20 + i);
strike = (tmp > dieroll);
g.dieroll = rnd(20 + i);
strike = (tmp > g.dieroll);
/* KMH -- don't accumulate to-hit bonuses */
if (otmp)
tmp -= hitval(otmp, mdef);
if (g.otmp)
tmp -= hitval(g.otmp, mdef);
if (strike) {
res[i] = hitmm(magr, mdef, mattk);
if ((mdef->data == &mons[PM_BLACK_PUDDING]
|| mdef->data == &mons[PM_BROWN_PUDDING])
&& (otmp && (objects[otmp->otyp].oc_material == IRON
|| objects[otmp->otyp].oc_material == METAL))
&& (g.otmp && (objects[g.otmp->otyp].oc_material == IRON
|| objects[g.otmp->otyp].oc_material == METAL))
&& mdef->mhp > 1
&& !mdef->mcan) {
if (clone_mon(mdef, 0, 0)) {
if (vis && canspotmon(mdef)) {
if (g.vis && canspotmon(mdef)) {
char buf[BUFSZ];
Strcpy(buf, Monnam(mdef));
@@ -533,7 +524,7 @@ hitmm(magr, mdef, mattk)
register struct monst *magr, *mdef;
struct attack *mattk;
{
if (vis) {
if (g.vis) {
int compat;
char buf[BUFSZ], mdef_name[BUFSZ];
@@ -595,7 +586,7 @@ struct attack *mattk;
{
char buf[BUFSZ];
if (vis) {
if (g.vis) {
if (mdef->data->mlet == S_MIMIC
&& mdef->m_ap_type != M_AP_NOTHING)
seemimic(mdef);
@@ -606,7 +597,7 @@ struct attack *mattk;
if (magr->mcan || !magr->mcansee || !mdef->mcansee
|| (magr->minvis && !perceives(mdef->data)) || mdef->msleeping) {
if (vis && canspotmon(mdef))
if (g.vis && canspotmon(mdef))
pline("but nothing happens.");
return MM_MISS;
}
@@ -687,7 +678,7 @@ register struct attack *mattk;
if (!engulf_target(magr, mdef))
return MM_MISS;
if (vis) {
if (g.vis) {
/* [this two-part formatting dates back to when only one x_monnam
result could be included in an expression because the next one
would overwrite first's result -- that's no longer the case] */
@@ -699,7 +690,7 @@ register struct attack *mattk;
if (is_vampshifter(mdef)
&& newcham(mdef, &mons[mdef->cham], FALSE, FALSE)) {
if (vis) {
if (g.vis) {
/* 'it' -- previous form is no longer available and
using that would be excessively verbose */
pline("%s expels %s.", Monnam(magr),
@@ -821,7 +812,7 @@ register struct attack *mattk;
wornitems = magr->misc_worn_check;
/* wielded weapon gives same protection as gloves here */
if (otmp != 0)
if (g.otmp != 0)
wornitems |= W_ARMG;
if (protector == 0L
@@ -830,12 +821,12 @@ register struct attack *mattk;
mon_to_stone(magr);
return MM_HIT; /* no damage during the polymorph */
}
if (vis && canspotmon(magr))
if (g.vis && canspotmon(magr))
pline("%s turns to stone!", Monnam(magr));
monstone(magr);
if (!DEADMONSTER(magr))
return MM_HIT; /* lifesaved */
else if (magr->mtame && !vis)
else if (magr->mtame && !g.vis)
You(brief_feeling, "peculiarly sad");
return MM_AGR_DIED;
}
@@ -849,7 +840,7 @@ register struct attack *mattk;
case AD_DGST:
/* eating a Rider or its corpse is fatal */
if (is_rider(pd)) {
if (vis && canseemon(magr))
if (g.vis && canseemon(magr))
pline("%s %s!", Monnam(magr),
(pd == &mons[PM_FAMINE])
? "belches feebly, shrivels up and dies"
@@ -859,7 +850,7 @@ register struct attack *mattk;
mondied(magr);
if (!DEADMONSTER(magr))
return 0; /* lifesaved */
else if (magr->mtame && !vis)
else if (magr->mtame && !g.vis)
You(brief_feeling, "queasy");
return MM_AGR_DIED;
}
@@ -917,26 +908,26 @@ register struct attack *mattk;
if (mattk->aatyp == AT_KICK && thick_skinned(pd)) {
tmp = 0;
} else if (mattk->aatyp == AT_WEAP) {
if (otmp) {
if (g.otmp) {
struct obj *marmg;
if (otmp->otyp == CORPSE
&& touch_petrifies(&mons[otmp->corpsenm]))
if (g.otmp->otyp == CORPSE
&& touch_petrifies(&mons[g.otmp->corpsenm]))
goto do_stone;
tmp += dmgval(otmp, mdef);
tmp += dmgval(g.otmp, mdef);
if ((marmg = which_armor(magr, W_ARMG)) != 0
&& marmg->otyp == GAUNTLETS_OF_POWER)
tmp += rn1(4, 3); /* 3..6 */
if (tmp < 1) /* is this necessary? mhitu.c has it... */
tmp = 1;
if (otmp->oartifact) {
(void) artifact_hit(magr, mdef, otmp, &tmp, dieroll);
if (g.otmp->oartifact) {
(void) artifact_hit(magr, mdef, g.otmp, &tmp, g.dieroll);
if (DEADMONSTER(mdef))
return (MM_DEF_DIED
| (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
if (tmp)
rustm(mdef, otmp);
rustm(mdef, g.otmp);
}
} else if (pa == &mons[PM_PURPLE_WORM] && pd == &mons[PM_SHRIEKER]) {
/* hack to enhance mm_aggression(); we don't want purple
@@ -952,22 +943,22 @@ register struct attack *mattk;
tmp = 0;
break;
}
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s is %s!", Monnam(mdef), on_fire(pd, mattk));
if (completelyburns(pd)) { /* paper golem or straw golem */
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s burns completely!", Monnam(mdef));
mondead(mdef); /* was mondied() but that dropped paper scrolls */
if (!DEADMONSTER(mdef))
return 0;
else if (mdef->mtame && !vis)
else if (mdef->mtame && !g.vis)
pline("May %s roast in peace.", mon_nam(mdef));
return (MM_DEF_DIED | (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
tmp += destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE);
tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE);
if (resists_fire(mdef)) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline_The("fire doesn't seem to burn %s!", mon_nam(mdef));
shieldeff(mdef->mx, mdef->my);
golemeffects(mdef, AD_FIRE, tmp);
@@ -981,10 +972,10 @@ register struct attack *mattk;
tmp = 0;
break;
}
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s is covered in frost!", Monnam(mdef));
if (resists_cold(mdef)) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline_The("frost doesn't seem to chill %s!", mon_nam(mdef));
shieldeff(mdef->mx, mdef->my);
golemeffects(mdef, AD_COLD, tmp);
@@ -997,11 +988,11 @@ register struct attack *mattk;
tmp = 0;
break;
}
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s gets zapped!", Monnam(mdef));
tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC);
if (resists_elec(mdef)) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline_The("zap doesn't shock %s!", mon_nam(mdef));
shieldeff(mdef->mx, mdef->my);
golemeffects(mdef, AD_ELEC, tmp);
@@ -1016,11 +1007,11 @@ register struct attack *mattk;
break;
}
if (resists_acid(mdef)) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s is covered in %s, but it seems harmless.",
Monnam(mdef), hliquid("acid"));
tmp = 0;
} else if (vis && canseemon(mdef)) {
} else if (g.vis && canseemon(mdef)) {
pline("%s is covered in %s!", Monnam(mdef), hliquid("acid"));
pline("It burns %s!", mon_nam(mdef));
}
@@ -1033,12 +1024,12 @@ register struct attack *mattk;
if (magr->mcan)
break;
if (pd == &mons[PM_IRON_GOLEM]) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s falls to pieces!", Monnam(mdef));
mondied(mdef);
if (!DEADMONSTER(mdef))
return 0;
else if (mdef->mtame && !vis)
else if (mdef->mtame && !g.vis)
pline("May %s rust in peace.", mon_nam(mdef));
return (MM_DEF_DIED | (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
@@ -1057,12 +1048,12 @@ register struct attack *mattk;
if (magr->mcan)
break;
if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s falls to pieces!", Monnam(mdef));
mondied(mdef);
if (!DEADMONSTER(mdef))
return 0;
else if (mdef->mtame && !vis)
else if (mdef->mtame && !g.vis)
pline("May %s rot in peace.", mon_nam(mdef));
return (MM_DEF_DIED | (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
@@ -1083,13 +1074,13 @@ register struct attack *mattk;
break;
}
if (!resists_ston(mdef)) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s turns to stone!", Monnam(mdef));
monstone(mdef);
post_stone:
if (!DEADMONSTER(mdef))
return 0;
else if (mdef->mtame && !vis)
else if (mdef->mtame && !g.vis)
You(brief_feeling, "peculiarly sad");
return (MM_DEF_DIED | (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
@@ -1101,18 +1092,18 @@ register struct attack *mattk;
boolean wasseen = canspotmon(mdef);
/* save the name before monster teleports, otherwise
we'll get "it" in the suddenly disappears message */
if (vis && wasseen)
if (g.vis && wasseen)
Strcpy(mdef_Monnam, Monnam(mdef));
mdef->mstrategy &= ~STRAT_WAITFORU;
(void) rloc(mdef, TRUE);
if (vis && wasseen && !canspotmon(mdef) && mdef != u.usteed)
if (g.vis && wasseen && !canspotmon(mdef) && mdef != u.usteed)
pline("%s suddenly disappears!", mdef_Monnam);
}
break;
case AD_SLEE:
if (!cancelled && !mdef->msleeping
&& sleep_monst(mdef, rnd(10), -1)) {
if (vis && canspotmon(mdef)) {
if (g.vis && canspotmon(mdef)) {
Strcpy(buf, Monnam(mdef));
pline("%s is put to sleep by %s.", buf, mon_nam(magr));
}
@@ -1122,7 +1113,7 @@ register struct attack *mattk;
break;
case AD_PLYS:
if (!cancelled && mdef->mcanmove) {
if (vis && canspotmon(mdef)) {
if (g.vis && canspotmon(mdef)) {
Strcpy(buf, Monnam(mdef));
pline("%s is frozen by %s.", buf, mon_nam(magr));
}
@@ -1135,7 +1126,7 @@ register struct attack *mattk;
mon_adjust_speed(mdef, -1, (struct obj *) 0);
mdef->mstrategy &= ~STRAT_WAITFORU;
if (mdef->mspeed != oldspeed && vis && canspotmon(mdef))
if (mdef->mspeed != oldspeed && g.vis && canspotmon(mdef))
pline("%s slows down.", Monnam(mdef));
}
break;
@@ -1145,7 +1136,7 @@ register struct attack *mattk;
* we still should check for it).
*/
if (!magr->mcan && !mdef->mconf && !magr->mspec_used) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s looks confused.", Monnam(mdef));
mdef->mconf = 1;
mdef->mstrategy &= ~STRAT_WAITFORU;
@@ -1155,7 +1146,7 @@ register struct attack *mattk;
if (can_blnd(magr, mdef, mattk->aatyp, (struct obj *) 0)) {
register unsigned rnd_tmp;
if (vis && mdef->mcansee && canspotmon(mdef))
if (g.vis && mdef->mcansee && canspotmon(mdef))
pline("%s is blinded.", Monnam(mdef));
rnd_tmp = d((int) mattk->damn, (int) mattk->damd);
if ((rnd_tmp += mdef->mblinded) > 127)
@@ -1168,7 +1159,7 @@ register struct attack *mattk;
break;
case AD_HALU:
if (!magr->mcan && haseyes(pd) && mdef->mcansee) {
if (vis && canseemon(mdef))
if (g.vis && canseemon(mdef))
pline("%s looks %sconfused.", Monnam(mdef),
mdef->mconf ? "more " : "");
mdef->mconf = 1;
@@ -1185,7 +1176,7 @@ register struct attack *mattk;
if (is_were(pd) && pd->mlet != S_HUMAN)
were_change(mdef);
if (pd == &mons[PM_CLAY_GOLEM]) {
if (vis && canseemon(mdef)) {
if (g.vis && canseemon(mdef)) {
pline("Some writing vanishes from %s head!",
s_suffix(mon_nam(mdef)));
pline("%s is destroyed!", Monnam(mdef));
@@ -1193,13 +1184,13 @@ register struct attack *mattk;
mondied(mdef);
if (!DEADMONSTER(mdef))
return 0;
else if (mdef->mtame && !vis)
else if (mdef->mtame && !g.vis)
You(brief_feeling, "strangely sad");
return (MM_DEF_DIED
| (grow_up(magr, mdef) ? 0 : MM_AGR_DIED));
}
if (!Deaf) {
if (!vis)
if (!g.vis)
You_hear("laughter.");
else if (canseemon(magr))
pline("%s chuckles.", Monnam(magr));
@@ -1222,21 +1213,21 @@ register struct attack *mattk;
add_to_minv(magr, gold);
}
mdef->mstrategy &= ~STRAT_WAITFORU;
if (vis && canseemon(mdef)) {
if (g.vis && canseemon(mdef)) {
Strcpy(buf, Monnam(magr));
pline("%s steals some gold from %s.", buf, mon_nam(mdef));
}
if (!tele_restrict(magr)) {
boolean couldspot = canspotmon(magr);
(void) rloc(magr, TRUE);
if (vis && couldspot && !canspotmon(magr))
if (g.vis && couldspot && !canspotmon(magr))
pline("%s suddenly disappears!", buf);
}
break;
case AD_DRLI:
if (!cancelled && !rn2(3) && !resists_drli(mdef)) {
tmp = d(2, 6);
if (vis && canspotmon(mdef))
if (g.vis && canspotmon(mdef))
pline("%s suddenly seems weaker!", Monnam(mdef));
mdef->mhpmax -= tmp;
if (mdef->m_lev == 0)
@@ -1264,26 +1255,26 @@ register struct attack *mattk;
Strcpy(mdefnambuf,
x_monnam(mdef, ARTICLE_THE, (char *) 0, 0, FALSE));
otmp = obj;
if (u.usteed == mdef && otmp == which_armor(mdef, W_SADDLE))
g.otmp = obj;
if (u.usteed == mdef && g.otmp == which_armor(mdef, W_SADDLE))
/* "You can no longer ride <steed>." */
dismount_steed(DISMOUNT_POLY);
obj_extract_self(otmp);
if (otmp->owornmask) {
mdef->misc_worn_check &= ~otmp->owornmask;
if (otmp->owornmask & W_WEP)
obj_extract_self(g.otmp);
if (g.otmp->owornmask) {
mdef->misc_worn_check &= ~g.otmp->owornmask;
if (g.otmp->owornmask & W_WEP)
mwepgone(mdef);
otmp->owornmask = 0L;
update_mon_intrinsics(mdef, otmp, FALSE, FALSE);
g.otmp->owornmask = 0L;
update_mon_intrinsics(mdef, g.otmp, FALSE, FALSE);
/* give monster a chance to wear other equipment on its next
move instead of waiting until it picks something up */
mdef->misc_worn_check |= I_SPECIAL;
}
/* add_to_minv() might free otmp [if it merges] */
if (vis)
Strcpy(onambuf, doname(otmp));
(void) add_to_minv(magr, otmp);
if (vis && canseemon(mdef)) {
if (g.vis)
Strcpy(onambuf, doname(g.otmp));
(void) add_to_minv(magr, g.otmp);
if (g.vis && canseemon(mdef)) {
Strcpy(buf, Monnam(magr));
pline("%s steals %s from %s!", buf, onambuf, mdefnambuf);
}
@@ -1297,7 +1288,7 @@ register struct attack *mattk;
boolean couldspot = canspotmon(magr);
(void) rloc(magr, TRUE);
if (vis && couldspot && !canspotmon(magr))
if (g.vis && couldspot && !canspotmon(magr))
pline("%s suddenly disappears!", buf);
}
}
@@ -1305,7 +1296,7 @@ register struct attack *mattk;
break;
case AD_DREN:
if (!cancelled && !rn2(4))
xdrainenergym(mdef, (boolean) (vis && canspotmon(mdef)
xdrainenergym(mdef, (boolean) (g.vis && canspotmon(mdef)
&& mattk->aatyp != AT_ENGL));
tmp = 0;
break;
@@ -1313,18 +1304,18 @@ register struct attack *mattk;
case AD_DRDX:
case AD_DRCO:
if (!cancelled && !rn2(8)) {
if (vis && canspotmon(magr))
if (g.vis && canspotmon(magr))
pline("%s %s was poisoned!", s_suffix(Monnam(magr)),
mpoisons_subj(magr, mattk));
if (resists_poison(mdef)) {
if (vis && canspotmon(mdef) && canspotmon(magr))
if (g.vis && canspotmon(mdef) && canspotmon(magr))
pline_The("poison doesn't seem to affect %s.",
mon_nam(mdef));
} else {
if (rn2(10))
tmp += rn1(10, 6);
else {
if (vis && canspotmon(mdef))
if (g.vis && canspotmon(mdef))
pline_The("poison was deadly...");
tmp = mdef->mhp;
}
@@ -1333,28 +1324,28 @@ register struct attack *mattk;
break;
case AD_DRIN:
if (g.notonhead || !has_head(pd)) {
if (vis && canspotmon(mdef))
if (g.vis && canspotmon(mdef))
pline("%s doesn't seem harmed.", Monnam(mdef));
/* Not clear what to do for green slimes */
tmp = 0;
break;
}
if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) {
if (vis && canspotmon(magr) && canseemon(mdef)) {
if (g.vis && canspotmon(magr) && canseemon(mdef)) {
Strcpy(buf, s_suffix(Monnam(mdef)));
pline("%s helmet blocks %s attack to %s head.", buf,
s_suffix(mon_nam(magr)), mhis(mdef));
}
break;
}
res = eat_brains(magr, mdef, vis, &tmp);
res = eat_brains(magr, mdef, g.vis, &tmp);
break;
case AD_SLIM:
if (cancelled)
break; /* physical damage only */
if (!rn2(4) && !slimeproof(pd)) {
if (!munslime(mdef, FALSE) && !DEADMONSTER(mdef)) {
if (newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, vis && canseemon(mdef)))
if (newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, g.vis && canseemon(mdef)))
pd = mdef->data;
mdef->mstrategy &= ~STRAT_WAITFORU;
res = MM_HIT;
@@ -1558,8 +1549,8 @@ int mdead;
acid_damage(MON_WEP(magr));
goto assess_dmg;
case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
if (mhit && !mdef->mcan && otmp) {
(void) drain_item(otmp, FALSE);
if (mhit && !mdef->mcan && g.otmp) {
(void) drain_item(g.otmp, FALSE);
/* No message */
}
break;
+2 -6
View File
@@ -22,10 +22,6 @@ STATIC_DCL void FDECL(mswings, (struct monst *, struct obj *));
STATIC_DCL void FDECL(wildmiss, (struct monst *, struct attack *));
STATIC_DCL void FDECL(hitmsg, (struct monst *, struct attack *));
/* See comment in mhitm.c. If we use this a lot it probably should be */
/* changed to a parameter to mhitu. */
static int dieroll;
STATIC_OVL void
hitmsg(mtmp, mattk)
struct monst *mtmp;
@@ -755,7 +751,7 @@ register struct monst *mtmp;
tmp += hittmp;
mswings(mtmp, mon_currwep);
}
if (tmp > (j = dieroll = rnd(20 + i)))
if (tmp > (j = g.mhitu_dieroll = rnd(20 + i)))
sum[i] = hitmu(mtmp, mattk);
else
missmu(mtmp, (tmp == j), mattk);
@@ -991,7 +987,7 @@ register struct attack *mattk;
if (dmg <= 0)
dmg = 1;
if (!(otmp->oartifact
&& artifact_hit(mtmp, &youmonst, otmp, &dmg, dieroll)))
&& artifact_hit(mtmp, &youmonst, otmp, &dmg, g.mhitu_dieroll)))
hitmsg(mtmp, mattk);
if (!dmg)
break;
+14 -17
View File
@@ -36,10 +36,8 @@ STATIC_DCL void FDECL(mkinvpos, (XCHAR_P, XCHAR_P, int));
STATIC_DCL void FDECL(mk_knox_portal, (XCHAR_P, XCHAR_P));
#define create_vault() create_room(-1, -1, 2, 2, -1, -1, VAULT, TRUE)
#define init_vault() vault_x = -1
#define do_vault() (vault_x != -1)
static xchar vault_x, vault_y;
static boolean made_branch; /* used only during level creation */
#define init_vault() g.vault_x = -1
#define do_vault() (g.vault_x != -1)
/* Args must be (const genericptr) so that qsort will always be happy. */
@@ -229,8 +227,8 @@ makerooms()
if (nroom >= (MAXNROFROOMS / 6) && rn2(2) && !tried_vault) {
tried_vault = TRUE;
if (create_vault()) {
vault_x = rooms[nroom].lx;
vault_y = rooms[nroom].ly;
g.vault_x = rooms[nroom].lx;
g.vault_y = rooms[nroom].ly;
rooms[nroom].hx = -1;
}
} else if (!create_room(-1, -1, -1, -1, -1, -1, OROOM, -1))
@@ -636,7 +634,7 @@ clear_level_structures()
xdnstair = ydnstair = xupstair = yupstair = 0;
sstairs.sx = sstairs.sy = 0;
xdnladder = ydnladder = xupladder = yupladder = 0;
made_branch = FALSE;
g.made_branch = FALSE;
clear_regions();
}
@@ -731,20 +729,20 @@ makelevel()
debugpline0("trying to make a vault...");
w = 1;
h = 1;
if (check_room(&vault_x, &w, &vault_y, &h, TRUE)) {
if (check_room(&g.vault_x, &w, &g.vault_y, &h, TRUE)) {
fill_vault:
add_room(vault_x, vault_y, vault_x + w, vault_y + h, TRUE, VAULT,
add_room(g.vault_x, g.vault_y, g.vault_x + w, g.vault_y + h, TRUE, VAULT,
FALSE);
level.flags.has_vault = 1;
++room_threshold;
fill_room(&rooms[nroom - 1], FALSE);
mk_knox_portal(vault_x + w, vault_y + h);
mk_knox_portal(g.vault_x + w, g.vault_y + h);
if (!level.flags.noteleport && !rn2(3))
makevtele();
} else if (rnd_rect() && create_vault()) {
vault_x = rooms[nroom].lx;
vault_y = rooms[nroom].ly;
if (check_room(&vault_x, &w, &vault_y, &h, TRUE))
g.vault_x = rooms[nroom].lx;
g.vault_y = rooms[nroom].ly;
if (check_room(&g.vault_x, &w, &g.vault_y, &h, TRUE))
goto fill_vault;
else
rooms[nroom].hx = -1;
@@ -1139,7 +1137,7 @@ xchar x, y; /* location */
* a special level is loaded that specifies an SSTAIR location
* as a favored spot for a branch.
*/
if (!br || made_branch)
if (!br || g.made_branch)
return;
if (!x) { /* find random coordinates for branch */
@@ -1179,7 +1177,7 @@ xchar x, y; /* location */
* per level, if we failed once, we're going to fail again on the
* next call.
*/
made_branch = TRUE;
g.made_branch = TRUE;
}
STATIC_OVL boolean
@@ -1824,7 +1822,6 @@ STATIC_OVL void
mk_knox_portal(x, y)
xchar x, y;
{
extern int n_dgns; /* from dungeon.c */
d_level *source;
branch *br;
schar u_depth;
@@ -1840,7 +1837,7 @@ xchar x, y;
}
/* Already set or 2/3 chance of deferring until a later level. */
if (source->dnum < n_dgns || (rn2(3) && !wizard))
if (source->dnum < g.n_dgns || (rn2(3) && !wizard))
return;
if (!(u.uz.dnum == oracle_level.dnum /* in main dungeon */
+19 -23
View File
@@ -21,10 +21,6 @@ STATIC_DCL void FDECL(finish_map,
STATIC_DCL void FDECL(remove_room, (unsigned));
void FDECL(mkmap, (lev_init *));
static char *new_locations;
int min_rx, max_rx, min_ry, max_ry; /* rectangle bounds for regions */
static int n_loc_filled;
STATIC_OVL void
init_map(bg_typ)
schar bg_typ;
@@ -100,7 +96,7 @@ schar bg_typ, fg_typ;
}
}
#define new_loc(i, j) *(new_locations + ((j) * (WIDTH + 1)) + (i))
#define new_loc(i, j) *(g.new_locations + ((j) * (WIDTH + 1)) + (i))
STATIC_OVL void
pass_two(bg_typ, fg_typ)
@@ -176,10 +172,10 @@ boolean anyroom;
sx++; /* compensate for extra decrement */
/* assume sx,sy is valid */
if (sx < min_rx)
min_rx = sx;
if (sy < min_ry)
min_ry = sy;
if (sx < g.min_rx)
g.min_rx = sx;
if (sy < g.min_ry)
g.min_ry = sy;
for (i = sx; i <= WIDTH && levl[i][sy].typ == fg_typ; i++) {
levl[i][sy].roomno = rmno;
@@ -199,7 +195,7 @@ boolean anyroom;
levl[ii][jj].roomno = SHARED;
}
}
n_loc_filled++;
g.n_loc_filled++;
}
nx = i;
@@ -240,10 +236,10 @@ boolean anyroom;
}
}
if (nx > max_rx)
max_rx = nx - 1; /* nx is just past valid region */
if (sy > max_ry)
max_ry = sy;
if (nx > g.max_rx)
g.max_rx = nx - 1; /* nx is just past valid region */
if (sy > g.max_ry)
g.max_ry = sy;
}
/*
@@ -284,12 +280,12 @@ schar bg_typ, fg_typ;
for (i = 2; i <= WIDTH; i++)
for (j = 1; j < HEIGHT; j++) {
if (levl[i][j].typ == fg_typ && levl[i][j].roomno == NO_ROOM) {
min_rx = max_rx = i;
min_ry = max_ry = j;
n_loc_filled = 0;
g.min_rx = g.max_rx = i;
g.min_ry = g.max_ry = j;
g.n_loc_filled = 0;
flood_fill_rm(i, j, nroom + ROOMOFFSET, FALSE, FALSE);
if (n_loc_filled > 3) {
add_room(min_rx, min_ry, max_rx, max_ry, FALSE, OROOM,
if (g.n_loc_filled > 3) {
add_room(g.min_rx, g.min_ry, g.max_rx, g.max_ry, FALSE, OROOM,
TRUE);
rooms[nroom - 1].irregular = TRUE;
if (nroom >= (MAXNROFROOMS * 2))
@@ -299,8 +295,8 @@ schar bg_typ, fg_typ;
* it's a tiny hole; erase it from the map to avoid
* having the player end up here with no way out.
*/
for (sx = min_rx; sx <= max_rx; sx++)
for (sy = min_ry; sy <= max_ry; sy++)
for (sx = g.min_rx; sx <= g.max_rx; sx++)
for (sy = g.min_ry; sy <= g.max_ry; sy++)
if ((int) levl[sx][sy].roomno
== nroom + ROOMOFFSET) {
levl[sx][sy].typ = bg_typ;
@@ -460,7 +456,7 @@ lev_init *init_lev;
if (lit < 0)
lit = (rnd(1 + abs(depth(&u.uz))) < 11 && rn2(77)) ? 1 : 0;
new_locations = (char *) alloc((WIDTH + 1) * HEIGHT);
g.new_locations = (char *) alloc((WIDTH + 1) * HEIGHT);
init_map(bg_typ);
init_fill(bg_typ, fg_typ);
@@ -485,7 +481,7 @@ lev_init *init_lev;
level.flags.is_maze_lev = FALSE;
level.flags.is_cavernous_lev = TRUE;
}
free(new_locations);
free(g.new_locations);
}
/*mkmap.c*/
+36 -41
View File
@@ -7,12 +7,6 @@
#include "sp_lev.h"
#include "lev.h" /* save & restore info */
/* from sp_lev.c, for fixup_special() */
extern lev_region *lregions;
extern int num_lregions;
/* for preserving the insect legs when wallifying baalz level */
static lev_region bughack = { {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} };
STATIC_DCL int FDECL(iswall, (int, int));
STATIC_DCL int FDECL(iswall_or_stone, (int, int));
STATIC_DCL boolean FDECL(is_solid, (int, int));
@@ -30,6 +24,9 @@ STATIC_DCL void FDECL(migr_booty_item, (int, const char *));
STATIC_DCL void FDECL(migrate_orc, (struct monst *, unsigned long));
STATIC_DCL void NDECL(stolen_booty);
lev_region bughack; /* for preserving the insect legs when wallifying
* baalz level */
/* adjust a coordinate one step in the specified direction */
#define mz_move(X, Y, dir) \
do { \
@@ -142,8 +139,8 @@ int x1, y1, x2, y2;
for (x = x1; x <= x2; x++)
for (y = y1; y <= y2; y++) {
if (within_bounded_area(x, y,
bughack.inarea.x1, bughack.inarea.y1,
bughack.inarea.x2, bughack.inarea.y2))
g.bughack.inarea.x1, g.bughack.inarea.y1,
g.bughack.inarea.x2, g.bughack.inarea.y2))
continue;
lev = &levl[x][y];
type = lev->typ;
@@ -193,8 +190,8 @@ int x1, y1, x2, y2;
/* set the locations TRUE if rock or wall or out of bounds */
loc_f = within_bounded_area(x, y, /* for baalz insect */
bughack.inarea.x1, bughack.inarea.y1,
bughack.inarea.x2, bughack.inarea.y2)
g.bughack.inarea.x1, g.bughack.inarea.y1,
g.bughack.inarea.x2, g.bughack.inarea.y2)
? iswall
: iswall_or_stone;
locale[0][0] = (*loc_f)(x - 1, y - 1);
@@ -394,28 +391,28 @@ baalz_fixup()
for (lastx = x = 0; x < COLNO; ++x)
if ((levl[x][y].wall_info & W_NONDIGGABLE) != 0) {
if (!lastx)
bughack.inarea.x1 = x + 1;
g.bughack.inarea.x1 = x + 1;
lastx = x;
}
bughack.inarea.x2 = ((lastx > bughack.inarea.x1) ? lastx : x) - 1;
g.bughack.inarea.x2 = ((lastx > g.bughack.inarea.x1) ? lastx : x) - 1;
/* find low and high y for to-be-wallified portion of level */
x = bughack.inarea.x1;
x = g.bughack.inarea.x1;
for (lasty = y = 0; y < ROWNO; ++y)
if ((levl[x][y].wall_info & W_NONDIGGABLE) != 0) {
if (!lasty)
bughack.inarea.y1 = y + 1;
g.bughack.inarea.y1 = y + 1;
lasty = y;
}
bughack.inarea.y2 = ((lasty > bughack.inarea.y1) ? lasty : y) - 1;
g.bughack.inarea.y2 = ((lasty > g.bughack.inarea.y1) ? lasty : y) - 1;
/* two pools mark where special post-wallify fix-ups are needed */
for (x = bughack.inarea.x1; x <= bughack.inarea.x2; ++x)
for (y = bughack.inarea.y1; y <= bughack.inarea.y2; ++y)
for (x = g.bughack.inarea.x1; x <= g.bughack.inarea.x2; ++x)
for (y = g.bughack.inarea.y1; y <= g.bughack.inarea.y2; ++y)
if (levl[x][y].typ == POOL) {
levl[x][y].typ = HWALL;
if (bughack.delarea.x1 == COLNO)
bughack.delarea.x1 = x, bughack.delarea.y1 = y;
if (g.bughack.delarea.x1 == COLNO)
g.bughack.delarea.x1 = x, g.bughack.delarea.y1 = y;
else
bughack.delarea.x2 = x, bughack.delarea.y2 = y;
g.bughack.delarea.x2 = x, g.bughack.delarea.y2 = y;
} else if (levl[x][y].typ == IRONBARS) {
/* novelty effect; allowing digging in front of 'eyes' */
levl[x - 1][y].wall_info &= ~W_NONDIGGABLE;
@@ -423,15 +420,15 @@ baalz_fixup()
levl[x - 2][y].wall_info &= ~W_NONDIGGABLE;
}
wallification(max(bughack.inarea.x1 - 2, 1),
max(bughack.inarea.y1 - 2, 0),
min(bughack.inarea.x2 + 2, COLNO - 1),
min(bughack.inarea.y2 + 2, ROWNO - 1));
wallification(max(g.bughack.inarea.x1 - 2, 1),
max(g.bughack.inarea.y1 - 2, 0),
min(g.bughack.inarea.x2 + 2, COLNO - 1),
min(g.bughack.inarea.y2 + 2, ROWNO - 1));
/* bughack hack for rear-most legs on baalz level; first joint on
both top and bottom gets a bogus extra connection to room area,
producing unwanted rectangles; change back to separated legs */
x = bughack.delarea.x1, y = bughack.delarea.y1;
x = g.bughack.delarea.x1, y = g.bughack.delarea.y1;
if (isok(x, y) && levl[x][y].typ == TLWALL
&& isok(x, y + 1) && levl[x][y + 1].typ == TUWALL) {
levl[x][y].typ = BRCORNER;
@@ -439,7 +436,7 @@ baalz_fixup()
if ((mtmp = m_at(x, y)) != 0) /* something at temporary pool... */
(void) rloc(mtmp, FALSE);
}
x = bughack.delarea.x2, y = bughack.delarea.y2;
x = g.bughack.delarea.x2, y = g.bughack.delarea.y2;
if (isok(x, y) && levl[x][y].typ == TLWALL
&& isok(x, y - 1) && levl[x][y - 1].typ == TDWALL) {
levl[x][y].typ = TRCORNER;
@@ -451,37 +448,35 @@ baalz_fixup()
/* reset bughack region; set low end to <COLNO,ROWNO> so that
within_bounded_region() in fix_wall_spines() will fail
most quickly--on its first test--when loading other levels */
bughack.inarea.x1 = bughack.delarea.x1 = COLNO;
bughack.inarea.y1 = bughack.delarea.y1 = ROWNO;
bughack.inarea.x2 = bughack.delarea.x2 = 0;
bughack.inarea.y2 = bughack.delarea.y2 = 0;
g.bughack.inarea.x1 = g.bughack.delarea.x1 = COLNO;
g.bughack.inarea.y1 = g.bughack.delarea.y1 = ROWNO;
g.bughack.inarea.x2 = g.bughack.delarea.x2 = 0;
g.bughack.inarea.y2 = g.bughack.delarea.y2 = 0;
}
static boolean was_waterlevel; /* ugh... this shouldn't be needed */
/* this is special stuff that the level compiler cannot (yet) handle */
void
fixup_special()
{
lev_region *r = lregions;
lev_region *r = g.lregions;
struct d_level lev;
int x, y;
struct mkroom *croom;
boolean added_branch = FALSE;
if (was_waterlevel) {
was_waterlevel = FALSE;
if (g.was_waterlevel) {
g.was_waterlevel = FALSE;
u.uinwater = 0;
unsetup_waterlevel();
}
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) {
level.flags.hero_memory = 0;
was_waterlevel = TRUE;
g.was_waterlevel = TRUE;
/* water level is an odd beast - it has to be set up
before calling place_lregions etc. */
setup_waterlevel();
}
for (x = 0; x < num_lregions; x++, r++) {
for (x = 0; x < g.num_lregions; x++, r++) {
switch (r->rtype) {
case LR_BRANCH:
added_branch = TRUE;
@@ -618,9 +613,9 @@ fixup_special()
stolen_booty();
}
if (lregions)
free((genericptr_t) lregions), lregions = 0;
num_lregions = 0;
if (g.lregions)
free((genericptr_t) g.lregions), g.lregions = 0;
g.num_lregions = 0;
}
void
@@ -1623,7 +1618,7 @@ int fd;
}
ebubbles = b;
b->next = (struct bubble *) 0;
was_waterlevel = TRUE;
g.was_waterlevel = TRUE;
}
const char *
+32 -32
View File
@@ -599,9 +599,9 @@ reglyph_darkroom()
}
}
if (flags.dark_room && iflags.use_color)
showsyms[S_darkroom] = showsyms[S_room];
g.showsyms[S_darkroom] = g.showsyms[S_room];
else
showsyms[S_darkroom] = showsyms[S_stone];
g.showsyms[S_darkroom] = g.showsyms[S_stone];
}
/* check whether a user-supplied option string is a proper leading
@@ -742,7 +742,7 @@ initoptions_init()
/* Set the default monster and object class symbols. */
init_symbols();
for (i = 0; i < WARNCOUNT; i++)
warnsyms[i] = def_warnsyms[i].sym;
g.warnsyms[i] = def_warnsyms[i].sym;
iflags.bouldersym = 0;
/* for "special achievement" tracking (see obj.h,
@@ -771,9 +771,9 @@ initoptions_init()
*/
/* this detects the IBM-compatible console on most 386 boxes */
if ((opts = nh_getenv("TERM")) && !strncmp(opts, "AT", 2)) {
if (!symset[PRIMARY].name)
if (!g.symset[PRIMARY].name)
load_symset("IBMGraphics", PRIMARY);
if (!symset[ROGUESET].name)
if (!g.symset[ROGUESET].name)
load_symset("RogueIBM", ROGUESET);
switch_symbols(TRUE);
#ifdef TEXTCOLOR
@@ -788,7 +788,7 @@ initoptions_init()
/* [could also check "xterm" which emulates vtXXX by default] */
&& !strncmpi(opts, "vt", 2)
&& AS && AE && index(AS, '\016') && index(AE, '\017')) {
if (!symset[PRIMARY].name)
if (!g.symset[PRIMARY].name)
load_symset("DECGraphics", PRIMARY);
switch_symbols(TRUE);
}
@@ -797,10 +797,10 @@ initoptions_init()
#if defined(MSDOS) || defined(WIN32)
/* Use IBM defaults. Can be overridden via config file */
if (!symset[PRIMARY].name) {
if (!g.symset[PRIMARY].name) {
load_symset("IBMGraphics_2", PRIMARY);
}
if (!symset[ROGUESET].name) {
if (!g.symset[ROGUESET].name) {
load_symset("RogueEpyx", ROGUESET);
}
#endif
@@ -1157,7 +1157,7 @@ register uchar *graph_chars;
for (i = 0; i < WARNCOUNT; i++)
if (graph_chars[i])
warnsyms[i] = graph_chars[i];
g.warnsyms[i] = graph_chars[i];
}
STATIC_OVL int
@@ -2288,7 +2288,7 @@ boolean tinitial, tfrom_file;
bad_negation(fullname, FALSE);
return FALSE;
} else if ((op = string_for_opt(opts, FALSE)) != 0) {
symset[ROGUESET].name = dupstr(op);
g.symset[ROGUESET].name = dupstr(op);
if (!read_sym_file(ROGUESET)) {
clear_symsetentry(ROGUESET, TRUE);
config_error_add(
@@ -2313,7 +2313,7 @@ boolean tinitial, tfrom_file;
bad_negation(fullname, FALSE);
return FALSE;
} else if ((op = string_for_opt(opts, FALSE)) != 0) {
symset[PRIMARY].name = dupstr(op);
g.symset[PRIMARY].name = dupstr(op);
if (!read_sym_file(PRIMARY)) {
clear_symsetentry(PRIMARY, TRUE);
config_error_add(
@@ -2321,7 +2321,7 @@ boolean tinitial, tfrom_file;
op, SYMBOLS);
return FALSE;
} else {
switch_symbols(symset[PRIMARY].name != (char *) 0);
switch_symbols(g.symset[PRIMARY].name != (char *) 0);
need_redraw = TRUE;
}
} else
@@ -3779,10 +3779,10 @@ boolean tinitial, tfrom_file;
complain_about_duplicate(opts, 1);
if (!negated) {
/* There is no rogue level DECgraphics-specific set */
if (symset[PRIMARY].name) {
if (g.symset[PRIMARY].name) {
badflag = TRUE;
} else {
symset[PRIMARY].name = dupstr(fullname);
g.symset[PRIMARY].name = dupstr(fullname);
if (!read_sym_file(PRIMARY)) {
badflag = TRUE;
clear_symsetentry(PRIMARY, TRUE);
@@ -3812,12 +3812,12 @@ boolean tinitial, tfrom_file;
complain_about_duplicate(opts, 1);
if (!negated) {
for (i = 0; i < NUM_GRAPHICS; ++i) {
if (symset[i].name) {
if (g.symset[i].name) {
badflag = TRUE;
} else {
if (i == ROGUESET)
sym_name = "RogueIBM";
symset[i].name = dupstr(sym_name);
g.symset[i].name = dupstr(sym_name);
if (!read_sym_file(i)) {
badflag = TRUE;
clear_symsetentry(i, TRUE);
@@ -3850,10 +3850,10 @@ boolean tinitial, tfrom_file;
if (duplicate)
complain_about_duplicate(opts, 1);
if (!negated) {
if (symset[PRIMARY].name) {
if (g.symset[PRIMARY].name) {
badflag = TRUE;
} else {
symset[PRIMARY].name = dupstr(fullname);
g.symset[PRIMARY].name = dupstr(fullname);
if (!read_sym_file(PRIMARY)) {
badflag = TRUE;
clear_symsetentry(PRIMARY, TRUE);
@@ -5211,8 +5211,8 @@ boolean setinitial, setfromfile;
which_set = rogueflag ? ROGUESET : PRIMARY;
/* clear symset[].name as a flag to read_sym_file() to build list */
symset_name = symset[which_set].name;
symset[which_set].name = (char *) 0;
symset_name = g.symset[which_set].name;
g.symset[which_set].name = (char *) 0;
symset_list = (struct symsetentry *) 0;
res = read_sym_file(which_set);
@@ -5294,7 +5294,7 @@ boolean setinitial, setfromfile;
clear_symsetentry(which_set, TRUE);
/* transfer only the name of the symbol set */
symset[which_set].name = dupstr(sl->name);
g.symset[which_set].name = dupstr(sl->name);
ready_to_switch = TRUE;
break;
}
@@ -5338,8 +5338,8 @@ boolean setinitial, setfromfile;
if (nothing_to_do)
return TRUE;
if (!symset[which_set].name && symset_name)
symset[which_set].name = symset_name; /* not dupstr() here */
if (!g.symset[which_set].name && symset_name)
g.symset[which_set].name = symset_name; /* not dupstr() here */
/* Set default symbols and clear the handling value */
if (rogueflag)
@@ -5347,7 +5347,7 @@ boolean setinitial, setfromfile;
else
init_l_symbols();
if (symset[which_set].name) {
if (g.symset[which_set].name) {
if (read_sym_file(which_set)) {
ready_to_switch = TRUE;
} else {
@@ -5426,7 +5426,7 @@ char *buf;
Sprintf(buf, "%c",
iflags.bouldersym
? iflags.bouldersym
: showsyms[(int) objects[BOULDER].oc_class + SYM_OFF_O]);
: g.showsyms[(int) objects[BOULDER].oc_class + SYM_OFF_O]);
#endif
else if (!strcmp(optname, "catname"))
Sprintf(buf, "%s", catname[0] ? catname : none);
@@ -5611,8 +5611,8 @@ char *buf;
Sprintf(buf, "%s", rolestring(flags.initrace, races, noun));
} else if (!strcmp(optname, "roguesymset")) {
Sprintf(buf, "%s",
symset[ROGUESET].name ? symset[ROGUESET].name : "default");
if (currentgraphics == ROGUESET && symset[ROGUESET].name)
g.symset[ROGUESET].name ? g.symset[ROGUESET].name : "default");
if (g.currentgraphics == ROGUESET && g.symset[ROGUESET].name)
Strcat(buf, ", active");
} else if (!strcmp(optname, "role")) {
Sprintf(buf, "%s", rolestring(flags.initrole, roles, name.m));
@@ -5671,8 +5671,8 @@ char *buf;
FEATURE_NOTICE_VER_MIN, FEATURE_NOTICE_VER_PATCH);
} else if (!strcmp(optname, "symset")) {
Sprintf(buf, "%s",
symset[PRIMARY].name ? symset[PRIMARY].name : "default");
if (currentgraphics == PRIMARY && symset[PRIMARY].name)
g.symset[PRIMARY].name ? g.symset[PRIMARY].name : "default");
if (g.currentgraphics == PRIMARY && g.symset[PRIMARY].name)
Strcat(buf, ", active");
#ifdef CURSES_GRAPHICS
} else if (!strcmp(optname, "term_cols")) {
@@ -5903,9 +5903,9 @@ int which_set;
{
clear_symsetentry(which_set, TRUE);
if (symset[which_set].name)
free((genericptr_t) symset[which_set].name);
symset[which_set].name = dupstr(s);
if (g.symset[which_set].name)
free((genericptr_t) g.symset[which_set].name);
g.symset[which_set].name = dupstr(s);
if (read_sym_file(which_set)) {
switch_symbols(TRUE);
+7 -7
View File
@@ -44,7 +44,7 @@ int c;
int i;
for (i = S_sw_tl; i <= S_sw_br; i++)
if ((int) showsyms[i] == c)
if ((int) g.showsyms[i] == c)
return TRUE;
return FALSE;
}
@@ -851,7 +851,7 @@ struct permonst **for_supplement;
/* Check for monsters */
if (!iflags.terrainmode || (iflags.terrainmode & TER_MON) != 0) {
for (i = 0; i < MAXMCLASSES; i++) {
if (sym == (looked ? showsyms[i + SYM_OFF_M] : def_monsyms[i].sym)
if (sym == (looked ? g.showsyms[i + SYM_OFF_M] : def_monsyms[i].sym)
&& def_monsyms[i].explain) {
need_to_look = TRUE;
if (!found) {
@@ -867,7 +867,7 @@ struct permonst **for_supplement;
/* handle '@' as a special case if it refers to you and you're
playing a character which isn't normally displayed by that
symbol; firstmatch is assumed to already be set for '@' */
if ((looked ? (sym == showsyms[S_HUMAN + SYM_OFF_M]
if ((looked ? (sym == g.showsyms[S_HUMAN + SYM_OFF_M]
&& cc.x == u.ux && cc.y == u.uy)
: (sym == def_monsyms[S_HUMAN].sym && !flags.showrace))
&& !(Race_if(PM_HUMAN) || Race_if(PM_ELF)) && !Upolyd)
@@ -877,7 +877,7 @@ struct permonst **for_supplement;
/* Now check for objects */
if (!iflags.terrainmode || (iflags.terrainmode & TER_OBJ) != 0) {
for (i = 1; i < MAXOCLASSES; i++) {
if (sym == (looked ? showsyms[i + SYM_OFF_O]
if (sym == (looked ? g.showsyms[i + SYM_OFF_O]
: def_oc_syms[i].sym)
|| (looked && i == ROCK_CLASS && glyph_is_statue(glyph))) {
need_to_look = TRUE;
@@ -913,7 +913,7 @@ struct permonst **for_supplement;
}
/* Now check for graphics symbols */
alt_i = (sym == (looked ? showsyms[0] : defsyms[0].sym)) ? 0 : (2 + 1);
alt_i = (sym == (looked ? g.showsyms[0] : defsyms[0].sym)) ? 0 : (2 + 1);
for (hit_trap = FALSE, i = 0; i < MAXPCHARS; i++) {
/* when sym is the default background character, we process
i == 0 three times: unexplored, stone, dark part of a room */
@@ -929,7 +929,7 @@ struct permonst **for_supplement;
x_str = "land"; /* replace "dark part of a room" */
/* alt_i is now 3 or more and no longer of interest */
}
if (sym == (looked ? showsyms[i] : defsyms[i].sym) && *x_str) {
if (sym == (looked ? g.showsyms[i] : defsyms[i].sym) && *x_str) {
/* avoid "an unexplored", "an stone", "an air", "a water",
"a floor of a room", "a dark part of a room";
article==2 => "the", 1 => "an", 0 => (none) */
@@ -972,7 +972,7 @@ struct permonst **for_supplement;
/* Now check for warning symbols */
for (i = 1; i < WARNCOUNT; i++) {
x_str = def_warnsyms[i].explanation;
if (sym == (looked ? warnsyms[i] : def_warnsyms[i].sym)) {
if (sym == (looked ? g.warnsyms[i] : def_warnsyms[i].sym)) {
if (!found) {
Sprintf(out_str, "%s%s", prefix, def_warnsyms[i].explanation);
*firstmatch = def_warnsyms[i].explanation;
+4 -7
View File
@@ -15,9 +15,6 @@
#include "wintty.h"
#endif
/* from sp_lev.c, for deliver_splev_message() */
extern char *lev_message;
static void NDECL(dump_qtlist);
static void FDECL(Fread, (genericptr_t, int, int, dlb *));
STATIC_DCL struct qtmsg *FDECL(construct_qtlist, (long));
@@ -676,10 +673,10 @@ deliver_splev_message()
char *str, *nl, in_line[BUFSZ], out_line[BUFSZ];
/* there's no provision for delivering via window instead of pline */
if (lev_message) {
if (g.lev_message) {
/* lev_message can span multiple lines using embedded newline chars;
any segments too long to fit within in_line[] will be truncated */
for (str = lev_message; *str; str = nl + 1) {
for (str = g.lev_message; *str; str = nl + 1) {
/* copying will stop at newline if one is present */
copynchars(in_line, str, (int) (sizeof in_line) - 1);
@@ -692,8 +689,8 @@ deliver_splev_message()
break; /* done if no newline */
}
free((genericptr_t) lev_message);
lev_message = 0;
free((genericptr_t) g.lev_message);
g.lev_message = NULL;
}
}
+21 -24
View File
@@ -18,6 +18,8 @@
#pragma warning(disable : 4244)
#endif
lev_region *lregions;
typedef void FDECL((*select_iter_func), (int, int, genericptr));
extern void FDECL(mkmap, (lev_init *));
@@ -189,8 +191,6 @@ STATIC_DCL boolean FDECL(sp_level_coder, (sp_lev *));
extern struct engr *head_engr;
extern int min_rx, max_rx, min_ry, max_ry; /* from mkmap.c */
/* positions touched by level elements explicitly defined in the des-file */
static char SpLev_Map[COLNO][ROWNO];
@@ -198,10 +198,6 @@ static aligntyp ralign[3] = { AM_CHAOTIC, AM_NEUTRAL, AM_LAWFUL };
static NEARDATA xchar xstart, ystart;
static NEARDATA char xsize, ysize;
char *lev_message = 0;
lev_region *lregions = 0;
int num_lregions = 0;
static boolean splev_init_present = FALSE;
static boolean icedpools = FALSE;
static int mines_prize_count = 0, soko_prize_count = 0; /* achievements */
@@ -2966,19 +2962,19 @@ struct sp_coder *coder;
if (!msg)
return;
old_n = lev_message ? (strlen(lev_message) + 1) : 0;
old_n = g.lev_message ? (strlen(g.lev_message) + 1) : 0;
n = strlen(msg);
levmsg = (char *) alloc(old_n + n + 1);
if (old_n)
levmsg[old_n - 1] = '\n';
if (lev_message)
(void) memcpy((genericptr_t) levmsg, (genericptr_t) lev_message,
if (g.lev_message)
(void) memcpy((genericptr_t) levmsg, (genericptr_t) g.lev_message,
old_n - 1);
(void) memcpy((genericptr_t) &levmsg[old_n], msg, n);
levmsg[old_n + n] = '\0';
Free(lev_message);
lev_message = levmsg;
Free(g.lev_message);
g.lev_message = levmsg;
opvar_free(op);
}
@@ -4566,21 +4562,21 @@ struct sp_coder *coder;
get_location(&tmplregion->delarea.x2, &tmplregion->delarea.y2,
ANY_LOC, (struct mkroom *) 0);
}
if (num_lregions) {
if (g.num_lregions) {
/* realloc the lregion space to add the new one */
lev_region *newl = (lev_region *) alloc(
sizeof(lev_region) * (unsigned) (1 + num_lregions));
sizeof(lev_region) * (unsigned) (1 + g.num_lregions));
(void) memcpy((genericptr_t) (newl), (genericptr_t) lregions,
sizeof(lev_region) * num_lregions);
Free(lregions);
num_lregions++;
lregions = newl;
(void) memcpy((genericptr_t) (newl), (genericptr_t) g.lregions,
sizeof(lev_region) * g.num_lregions);
Free(g.lregions);
g.num_lregions++;
g.lregions = newl;
} else {
num_lregions = 1;
lregions = (lev_region *) alloc(sizeof(lev_region));
g.num_lregions = 1;
g.lregions = (lev_region *) alloc(sizeof(lev_region));
}
(void) memcpy(&lregions[num_lregions - 1], tmplregion,
(void) memcpy(&g.lregions[g.num_lregions - 1], tmplregion,
sizeof(lev_region));
free(tmplregion);
@@ -4669,11 +4665,12 @@ struct sp_coder *coder;
troom->needjoining = joined;
if (irregular) {
min_rx = max_rx = dx1;
min_ry = max_ry = dy1;
g.min_rx = g.max_rx = dx1;
g.min_ry = g.max_ry = dy1;
smeq[nroom] = nroom;
flood_fill_rm(dx1, dy1, nroom + ROOMOFFSET, OV_i(rlit), TRUE);
add_room(min_rx, min_ry, max_rx, max_ry, FALSE, OV_i(rtype), TRUE);
add_room(g.min_rx, g.min_ry, g.max_rx, g.max_ry, FALSE, OV_i(rtype),
TRUE);
troom->rlit = OV_i(rlit);
troom->irregular = TRUE;
} else {