Instance variable work check-point.

This commit is contained in:
Bart House
2018-11-23 15:22:53 -08:00
parent 244a473a19
commit 8e316df117
17 changed files with 171 additions and 139 deletions
+1
View File
@@ -556,6 +556,7 @@ typedef unsigned char uchar;
#endif #endif
/* End of Section 4 */ /* End of Section 4 */
#ifdef TTY_TILES_ESCCODES #ifdef TTY_TILES_ESCCODES
+41 -19
View File
@@ -438,29 +438,51 @@ struct early_opt {
boolean valallowed; boolean valallowed;
}; };
/* instance_context holds per game instance data that does not need to be /* instance_variables holds engine state that does not need to be
* persisted upon game exit. This game instance data is one of the first * persisted upon game exit. The initialization state is well defined
* things initialized during the initialization of the game engine. * an set in decl.c during early early engine initialization.
* It is initialized with icontext_initial_state found in decl.c */ *
* unlike instance_flags, variables can be of any type. */
struct instance_context { struct instance_variables {
int oldcap; /* encumberance - pickup.c */ /* apply.c */
int petname_used; /* user preferred pet name has been used - dog.c */ int jumping_is_magic; /* current jump result of magic */
int jumping_is_magic; /* current jump result of magic - apply.c */ int polearm_range_min;
int polearm_range_min; /* apply.c */ int polearm_range_max;
int polearm_range_max; /* apply.c */ /* artifcat.c */
int spec_dbon_applies; /* coordinate effects from spec_dbon() with int spec_dbon_applies; /* coordinate effects from spec_dbon() with
* messages in artifact_hit() - artifact.c */ messages in artifact_hit() */
int mrank_sz; /* loaded by max_rank_sz - botl.c */ /* botl.c */
short nocreate; /* ini_inv() - u_init.c = STRANGE_OBJECT */ int mrank_sz; /* loaded by max_rank_sz */
short nocreate2; /* ini_inv() - u_init.c = STRANGE_OBJECT */ /* dog.c */
short nocreate3; /* ini_inv() - u_init.c = STRANGE_OBJECT */ int petname_used; /* user preferred pet name has been used */
short nocreate4; /* ini_inv() - u_init.c = STRANGE_OBJECT */ /* muse.c */
boolean m_using; /* kludge to use mondided instead of killed */
/* pickup.c */
int oldcap; /* last encumberance */
/* trap.c */
int force_mintrap; /* mintrap() should take a flags argument, but for time
being we use this */
/* u_init.c */
short nocreate;
short nocreate2;
short nocreate3;
short nocreate4;
/* uhitm.c */
boolean override_confirmation; /* Used to flag attacks caused by
Stormbringer's maliciousness. */
/* weapon.c */
struct obj *propellor;
/* zap.c */
int poly_zapped;
boolean obj_zapped;
unsigned long magic; /* validate that structure layout is preserved */
}; };
E struct instance_context icontext; E struct instance_variables iv;
E void icontext_init(); E void instance_variable_init();
#undef E #undef E
+6 -6
View File
@@ -1606,7 +1606,7 @@ int x,y;
{ {
return (isok(x, y) return (isok(x, y)
&& (ACCESSIBLE(levl[x][y].typ) || Passes_walls) && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
&& is_valid_jump_pos(x, y, icontext.jumping_is_magic, FALSE)); && is_valid_jump_pos(x, y, iv.jumping_is_magic, FALSE));
} }
void void
@@ -1720,7 +1720,7 @@ int magic; /* 0=Physical, otherwise skill level */
pline("Where do you want to jump?"); pline("Where do you want to jump?");
cc.x = u.ux; cc.x = u.ux;
cc.y = u.uy; cc.y = u.uy;
icontext.jumping_is_magic = magic; iv.jumping_is_magic = magic;
getpos_sethilite(display_jump_positions, get_valid_jump_position); getpos_sethilite(display_jump_positions, get_valid_jump_position);
if (getpos(&cc, TRUE, "the desired position") < 0) if (getpos(&cc, TRUE, "the desired position") < 0)
return 0; /* user pressed ESC */ return 0; /* user pressed ESC */
@@ -2917,8 +2917,8 @@ get_valid_polearm_position(x, y)
int x, y; int x, y;
{ {
return (isok(x, y) && ACCESSIBLE(levl[x][y].typ) return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
&& distu(x, y) >= icontext.polearm_range_min && distu(x, y) >= iv.polearm_range_min
&& distu(x, y) <= icontext.polearm_range_max); && distu(x, y) <= iv.polearm_range_max);
} }
void void
@@ -2990,8 +2990,8 @@ struct obj *obj;
else else
max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */ max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
icontext.polearm_range_min = min_range; iv.polearm_range_min = min_range;
icontext.polearm_range_max = max_range; iv.polearm_range_max = max_range;
/* Prompt for a location */ /* Prompt for a location */
pline(where_to_hit); pline(where_to_hit);
+16 -16
View File
@@ -844,15 +844,15 @@ int tmp;
if (!weap || (weap->attk.adtyp == AD_PHYS /* check for `NO_ATTK' */ if (!weap || (weap->attk.adtyp == AD_PHYS /* check for `NO_ATTK' */
&& weap->attk.damn == 0 && weap->attk.damd == 0)) && weap->attk.damn == 0 && weap->attk.damd == 0))
icontext.spec_dbon_applies = FALSE; iv.spec_dbon_applies = FALSE;
else if (otmp->oartifact == ART_GRIMTOOTH) else if (otmp->oartifact == ART_GRIMTOOTH)
/* Grimtooth has SPFX settings to warn against elves but we want its /* Grimtooth has SPFX settings to warn against elves but we want its
damage bonus to apply to all targets, so bypass spec_applies() */ damage bonus to apply to all targets, so bypass spec_applies() */
icontext.spec_dbon_applies = TRUE; iv.spec_dbon_applies = TRUE;
else else
icontext.spec_dbon_applies = spec_applies(weap, mon); iv.spec_dbon_applies = spec_applies(weap, mon);
if (icontext.spec_dbon_applies) if (iv.spec_dbon_applies)
return weap->attk.damd ? rnd((int) weap->attk.damd) : max(tmp, 1); return weap->attk.damd ? rnd((int) weap->attk.damd) : max(tmp, 1);
return 0; return 0;
} }
@@ -976,14 +976,14 @@ char *hittee; /* target's name: "you" or mon_nam(mdef) */
scare_dieroll /= (1 << (mb->spe / 3)); scare_dieroll /= (1 << (mb->spe / 3));
/* if target successfully resisted the artifact damage bonus, /* if target successfully resisted the artifact damage bonus,
reduce overall likelihood of the assorted special effects */ reduce overall likelihood of the assorted special effects */
if (!icontext.spec_dbon_applies) if (!iv.spec_dbon_applies)
dieroll += 1; dieroll += 1;
/* might stun even when attempting a more severe effect, but /* might stun even when attempting a more severe effect, but
in that case it will only happen if the other effect fails; in that case it will only happen if the other effect fails;
extra damage will apply regardless; 3.4.1: sometimes might extra damage will apply regardless; 3.4.1: sometimes might
just probe even when it hasn't been enchanted */ just probe even when it hasn't been enchanted */
do_stun = (max(mb->spe, 0) < rn2(icontext.spec_dbon_applies ? 11 : 7)); do_stun = (max(mb->spe, 0) < rn2(iv.spec_dbon_applies ? 11 : 7));
/* the special effects also boost physical damage; increments are /* the special effects also boost physical damage; increments are
generally cumulative, but since the stun effect is based on a generally cumulative, but since the stun effect is based on a
@@ -1182,12 +1182,12 @@ int dieroll; /* needed for Magicbane and vorpal blades */
if (attacks(AD_FIRE, otmp)) { if (attacks(AD_FIRE, otmp)) {
if (realizes_damage) if (realizes_damage)
pline_The("fiery blade %s %s%c", pline_The("fiery blade %s %s%c",
!icontext.spec_dbon_applies !iv.spec_dbon_applies
? "hits" ? "hits"
: (mdef->data == &mons[PM_WATER_ELEMENTAL]) : (mdef->data == &mons[PM_WATER_ELEMENTAL])
? "vaporizes part of" ? "vaporizes part of"
: "burns", : "burns",
hittee, !icontext.spec_dbon_applies ? '.' : '!'); hittee, !iv.spec_dbon_applies ? '.' : '!');
if (!rn2(4)) if (!rn2(4))
(void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE); (void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE);
if (!rn2(4)) if (!rn2(4))
@@ -1201,8 +1201,8 @@ int dieroll; /* needed for Magicbane and vorpal blades */
if (attacks(AD_COLD, otmp)) { if (attacks(AD_COLD, otmp)) {
if (realizes_damage) if (realizes_damage)
pline_The("ice-cold blade %s %s%c", pline_The("ice-cold blade %s %s%c",
!icontext.spec_dbon_applies ? "hits" : "freezes", hittee, !iv.spec_dbon_applies ? "hits" : "freezes", hittee,
!icontext.spec_dbon_applies ? '.' : '!'); !iv.spec_dbon_applies ? '.' : '!');
if (!rn2(4)) if (!rn2(4))
(void) destroy_mitem(mdef, POTION_CLASS, AD_COLD); (void) destroy_mitem(mdef, POTION_CLASS, AD_COLD);
return realizes_damage; return realizes_damage;
@@ -1210,9 +1210,9 @@ int dieroll; /* needed for Magicbane and vorpal blades */
if (attacks(AD_ELEC, otmp)) { if (attacks(AD_ELEC, otmp)) {
if (realizes_damage) if (realizes_damage)
pline_The("massive hammer hits%s %s%c", pline_The("massive hammer hits%s %s%c",
!icontext.spec_dbon_applies ? "" : "! Lightning strikes", !iv.spec_dbon_applies ? "" : "! Lightning strikes",
hittee, !icontext.spec_dbon_applies ? '.' : '!'); hittee, !iv.spec_dbon_applies ? '.' : '!');
if (icontext.spec_dbon_applies) if (iv.spec_dbon_applies)
wake_nearto(mdef->mx, mdef->my, 4 * 4); wake_nearto(mdef->mx, mdef->my, 4 * 4);
if (!rn2(5)) if (!rn2(5))
(void) destroy_mitem(mdef, RING_CLASS, AD_ELEC); (void) destroy_mitem(mdef, RING_CLASS, AD_ELEC);
@@ -1223,10 +1223,10 @@ int dieroll; /* needed for Magicbane and vorpal blades */
if (attacks(AD_MAGM, otmp)) { if (attacks(AD_MAGM, otmp)) {
if (realizes_damage) if (realizes_damage)
pline_The("imaginary widget hits%s %s%c", pline_The("imaginary widget hits%s %s%c",
!icontext.spec_dbon_applies !iv.spec_dbon_applies
? "" ? ""
: "! A hail of magic missiles strikes", : "! A hail of magic missiles strikes",
hittee, !icontext.spec_dbon_applies ? '.' : '!'); hittee, !iv.spec_dbon_applies ? '.' : '!');
return realizes_damage; return realizes_damage;
} }
@@ -1235,7 +1235,7 @@ int dieroll; /* needed for Magicbane and vorpal blades */
return Mb_hit(magr, mdef, otmp, dmgptr, dieroll, vis, hittee); return Mb_hit(magr, mdef, otmp, dmgptr, dieroll, vis, hittee);
} }
if (!icontext.spec_dbon_applies) { if (!iv.spec_dbon_applies) {
/* since damage bonus didn't apply, nothing more to do; /* since damage bonus didn't apply, nothing more to do;
no further attacks have side-effects on inventory */ no further attacks have side-effects on inventory */
return FALSE; return FALSE;
+2 -2
View File
@@ -64,7 +64,7 @@ do_statusline1()
Strcpy(nb = eos(nb), rank()); Strcpy(nb = eos(nb), rank());
Sprintf(nb = eos(nb), " "); Sprintf(nb = eos(nb), " ");
i = icontext.mrank_sz + 15; i = iv.mrank_sz + 15;
j = (int) ((nb + 2) - newbot1); /* strlen(newbot1) but less computation */ j = (int) ((nb + 2) - newbot1); /* strlen(newbot1) but less computation */
if ((i - j) > 0) if ((i - j) > 0)
Sprintf(nb = eos(nb), "%*s", i - j, " "); /* pad with spaces */ Sprintf(nb = eos(nb), "%*s", i - j, " "); /* pad with spaces */
@@ -345,7 +345,7 @@ max_rank_sz()
if (urole.rank[i].f && (r = strlen(urole.rank[i].f)) > maxr) if (urole.rank[i].f && (r = strlen(urole.rank[i].f)) > maxr)
maxr = r; maxr = r;
} }
icontext.mrank_sz = maxr; iv.mrank_sz = maxr;
return; return;
} }
+40 -15
View File
@@ -325,26 +325,51 @@ decl_init()
return; return;
} }
const struct instance_context icontext_initial_state = { #define UNDEFINED { 0 } /* move to hack.h if we are keeping */
0, /* oldcap - last encumberance in pickup.c */ #define UNDEFINED_PTR NULL /* move to hack.h if we are keeping */
0, /* petname_used - dog.c */ #define IVMAGIC 0xdeadbeef
0, /* jumping_is_magic - apply.c */
-1, /* polearm_range_min - apply.c */ const struct instance_variables iv_init = {
-1, /* polearm_range_max - apply.c */ /* apply.c */
0, /* spec_dbon_applies - artifact.c */ 0, /* jumping_is_magic */
0, /* mrank_sz - botl.c */ -1, /* polearm_range_min */
STRANGE_OBJECT, /* nocreate - ini_inv() in u_init.c */ -1, /* polearm_range_max */
STRANGE_OBJECT, /* nocreate2 - ini_inv() in u_init.c */ /* artifact.c */
STRANGE_OBJECT, /* nocreate3 - ini_inv() in u_init.c */ 0, /* spec_dbon_applies */
STRANGE_OBJECT, /* nocreate4 - ini_inv() in u_init.c */ /* botl.c */
0, /* mrank_sz */
/* dog.c */
0, /* petname_used */
/* mused.c */
FALSE, /* m_using */
/* pickup.c */
0, /* oldcap */
/* trap.c */
0, /* force_mintrap */
/* u_init.c */
STRANGE_OBJECT, /* nocreate */
STRANGE_OBJECT, /* nocreate2 */
STRANGE_OBJECT, /* nocreate3 */
STRANGE_OBJECT, /* nocreate4 */
/* uhitm.c */
UNDEFINED, /* override_confirmation */
/* weapon.c */
UNDEFINED_PTR, /* propellor */
/* zap.c */
UNDEFINED, /* poly_zap */
UNDEFINED, /* obj_zapped */
IVMAGIC /* used to validate that structure layout has been preserved */
}; };
struct instance_context icontext; struct instance_variables iv;
void void
icontext_init() instance_variable_init()
{ {
icontext = icontext_initial_state; iv = iv_init;
nhassert(iv_init.magic == IVMAGIC);
sfcap = default_sfinfo; sfcap = default_sfinfo;
sfrestinfo = default_sfinfo; sfrestinfo = default_sfinfo;
+1 -1
View File
@@ -197,7 +197,7 @@ makedog()
put_saddle_on_mon(otmp, mtmp); put_saddle_on_mon(otmp, mtmp);
} }
if (!icontext.petname_used++ && *petname) if (!iv.petname_used++ && *petname)
mtmp = christen_monst(mtmp, petname); mtmp = christen_monst(mtmp, petname);
initedog(mtmp); initedog(mtmp);
+8 -10
View File
@@ -8,8 +8,6 @@
#include "hack.h" #include "hack.h"
boolean m_using = FALSE;
/* Let monsters use magic items. Arbitrary assumptions: Monsters only use /* Let monsters use magic items. Arbitrary assumptions: Monsters only use
* scrolls when they can see, monsters know when wands have 0 charges, * scrolls when they can see, monsters know when wands have 0 charges,
* monsters cannot recognize if items are cursed are not, monsters which * monsters cannot recognize if items are cursed are not, monsters which
@@ -670,12 +668,12 @@ struct monst *mtmp;
zap_oseen = oseen; zap_oseen = oseen;
mzapmsg(mtmp, otmp, FALSE); mzapmsg(mtmp, otmp, FALSE);
otmp->spe--; otmp->spe--;
m_using = TRUE; iv.m_using = TRUE;
mbhit(mtmp, rn1(8, 6), mbhitm, bhito, otmp); mbhit(mtmp, rn1(8, 6), mbhitm, bhito, otmp);
/* monster learns that teleportation isn't useful here */ /* monster learns that teleportation isn't useful here */
if (level.flags.noteleport) if (level.flags.noteleport)
mtmp->mtrapseen |= (1 << (TELEP_TRAP - 1)); mtmp->mtrapseen |= (1 << (TELEP_TRAP - 1));
m_using = FALSE; iv.m_using = FALSE;
return 2; return 2;
case MUSE_SCR_TELEPORTATION: { case MUSE_SCR_TELEPORTATION: {
int obj_is_cursed = otmp->cursed; int obj_is_cursed = otmp->cursed;
@@ -1399,11 +1397,11 @@ struct monst *mtmp;
otmp->spe--; otmp->spe--;
if (oseen) if (oseen)
makeknown(otmp->otyp); makeknown(otmp->otyp);
m_using = TRUE; iv.m_using = TRUE;
buzz((int) (-30 - (otmp->otyp - WAN_MAGIC_MISSILE)), buzz((int) (-30 - (otmp->otyp - WAN_MAGIC_MISSILE)),
(otmp->otyp == WAN_MAGIC_MISSILE) ? 2 : 6, mtmp->mx, mtmp->my, (otmp->otyp == WAN_MAGIC_MISSILE) ? 2 : 6, mtmp->mx, mtmp->my,
sgn(mtmp->mux - mtmp->mx), sgn(mtmp->muy - mtmp->my)); sgn(mtmp->mux - mtmp->mx), sgn(mtmp->muy - mtmp->my));
m_using = FALSE; iv.m_using = FALSE;
return (DEADMONSTER(mtmp)) ? 1 : 2; return (DEADMONSTER(mtmp)) ? 1 : 2;
case MUSE_FIRE_HORN: case MUSE_FIRE_HORN:
case MUSE_FROST_HORN: case MUSE_FROST_HORN:
@@ -1413,20 +1411,20 @@ struct monst *mtmp;
} else } else
You_hear("a horn being played."); You_hear("a horn being played.");
otmp->spe--; otmp->spe--;
m_using = TRUE; iv.m_using = TRUE;
buzz(-30 - ((otmp->otyp == FROST_HORN) ? AD_COLD - 1 : AD_FIRE - 1), buzz(-30 - ((otmp->otyp == FROST_HORN) ? AD_COLD - 1 : AD_FIRE - 1),
rn1(6, 6), mtmp->mx, mtmp->my, sgn(mtmp->mux - mtmp->mx), rn1(6, 6), mtmp->mx, mtmp->my, sgn(mtmp->mux - mtmp->mx),
sgn(mtmp->muy - mtmp->my)); sgn(mtmp->muy - mtmp->my));
m_using = FALSE; iv.m_using = FALSE;
return (DEADMONSTER(mtmp)) ? 1 : 2; return (DEADMONSTER(mtmp)) ? 1 : 2;
case MUSE_WAN_TELEPORTATION: case MUSE_WAN_TELEPORTATION:
case MUSE_WAN_STRIKING: case MUSE_WAN_STRIKING:
zap_oseen = oseen; zap_oseen = oseen;
mzapmsg(mtmp, otmp, FALSE); mzapmsg(mtmp, otmp, FALSE);
otmp->spe--; otmp->spe--;
m_using = TRUE; iv.m_using = TRUE;
mbhit(mtmp, rn1(8, 6), mbhitm, bhito, otmp); mbhit(mtmp, rn1(8, 6), mbhitm, bhito, otmp);
m_using = FALSE; iv.m_using = FALSE;
return 2; return 2;
case MUSE_SCR_EARTH: { case MUSE_SCR_EARTH: {
/* TODO: handle steeds */ /* TODO: handle steeds */
+3 -3
View File
@@ -1558,7 +1558,7 @@ encumber_msg()
{ {
int newcap = near_capacity(); int newcap = near_capacity();
if (icontext.oldcap < newcap) { if (iv.oldcap < newcap) {
switch (newcap) { switch (newcap) {
case 1: case 1:
Your("movements are slowed slightly because of your load."); Your("movements are slowed slightly because of your load.");
@@ -1576,7 +1576,7 @@ encumber_msg()
break; break;
} }
context.botl = 1; context.botl = 1;
} else if (icontext.oldcap > newcap) { } else if (iv.oldcap > newcap) {
switch (newcap) { switch (newcap) {
case 0: case 0:
Your("movements are now unencumbered."); Your("movements are now unencumbered.");
@@ -1595,7 +1595,7 @@ encumber_msg()
context.botl = 1; context.botl = 1;
} }
icontext.oldcap = newcap; iv.oldcap = newcap;
return newcap; return newcap;
} }
+1 -1
View File
@@ -899,7 +899,7 @@ register int fd;
#ifdef MFLOPPY #ifdef MFLOPPY
gameDiskPrompt(); gameDiskPrompt();
#endif #endif
max_rank_sz(); /* to recompute icontext.mrank_sz (botl.c) */ max_rank_sz(); /* to recompute iv.mrank_sz (botl.c) */
/* take care of iron ball & chain */ /* take care of iron ball & chain */
for (otmp = fobj; otmp; otmp = otmp->nobj) for (otmp = fobj; otmp; otmp = otmp->nobj)
if (otmp->owornmask) if (otmp->owornmask)
+11 -14
View File
@@ -39,9 +39,6 @@ STATIC_DCL boolean FDECL(thitm, (int, struct monst *, struct obj *, int,
BOOLEAN_P)); BOOLEAN_P));
STATIC_DCL void NDECL(maybe_finish_sokoban); STATIC_DCL void NDECL(maybe_finish_sokoban);
/* mintrap() should take a flags argument, but for time being we use this */
STATIC_VAR int force_mintrap = 0;
STATIC_VAR const char *const a_your[2] = { "a", "your" }; STATIC_VAR const char *const a_your[2] = { "a", "your" };
STATIC_VAR const char *const A_Your[2] = { "A", "Your" }; STATIC_VAR const char *const A_Your[2] = { "A", "Your" };
STATIC_VAR const char tower_of_flame[] = "tower of flame"; STATIC_VAR const char tower_of_flame[] = "tower of flame";
@@ -2163,7 +2160,7 @@ register struct monst *mtmp;
} else { } else {
register int tt = trap->ttyp; register int tt = trap->ttyp;
boolean in_sight, tear_web, see_it, boolean in_sight, tear_web, see_it,
inescapable = force_mintrap || ((tt == HOLE || tt == PIT) inescapable = iv.force_mintrap || ((tt == HOLE || tt == PIT)
&& Sokoban && !trap->madeby_u); && Sokoban && !trap->madeby_u);
const char *fallverb; const char *fallverb;
@@ -2279,7 +2276,7 @@ register struct monst *mtmp;
|| mptr == &mons[PM_BUGBEAR]) || mptr == &mons[PM_BUGBEAR])
You_hear("the roaring of an angry bear!"); You_hear("the roaring of an angry bear!");
} }
} else if (force_mintrap) { } else if (iv.force_mintrap) {
if (in_sight) { if (in_sight) {
pline("%s evades %s bear trap!", Monnam(mtmp), pline("%s evades %s bear trap!", Monnam(mtmp),
a_your[trap->madeby_u]); a_your[trap->madeby_u]);
@@ -2428,7 +2425,7 @@ register struct monst *mtmp;
if (is_flyer(mptr) || is_floater(mptr) if (is_flyer(mptr) || is_floater(mptr)
|| (mtmp->wormno && count_wsegs(mtmp) > 5) || (mtmp->wormno && count_wsegs(mtmp) > 5)
|| is_clinger(mptr)) { || is_clinger(mptr)) {
if (force_mintrap && !Sokoban) { if (iv.force_mintrap && !Sokoban) {
/* openfallingtrap; not inescapable here */ /* openfallingtrap; not inescapable here */
if (in_sight) { if (in_sight) {
seetrap(trap); seetrap(trap);
@@ -2465,7 +2462,7 @@ register struct monst *mtmp;
if (is_flyer(mptr) || is_floater(mptr) || mptr == &mons[PM_WUMPUS] if (is_flyer(mptr) || is_floater(mptr) || mptr == &mons[PM_WUMPUS]
|| (mtmp->wormno && count_wsegs(mtmp) > 5) || (mtmp->wormno && count_wsegs(mtmp) > 5)
|| mptr->msize >= MZ_HUGE) { || mptr->msize >= MZ_HUGE) {
if (force_mintrap && !Sokoban) { if (iv.force_mintrap && !Sokoban) {
/* openfallingtrap; not inescapable here */ /* openfallingtrap; not inescapable here */
if (in_sight) { if (in_sight) {
seetrap(trap); seetrap(trap);
@@ -2554,7 +2551,7 @@ register struct monst *mtmp;
a_your[trap->madeby_u]); a_your[trap->madeby_u]);
deltrap(trap); deltrap(trap);
newsym(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my);
} else if (force_mintrap && !mtmp->mtrapped) { } else if (iv.force_mintrap && !mtmp->mtrapped) {
if (in_sight) { if (in_sight) {
pline("%s avoids %s spider web!", Monnam(mtmp), pline("%s avoids %s spider web!", Monnam(mtmp),
a_your[trap->madeby_u]); a_your[trap->madeby_u]);
@@ -4689,9 +4686,9 @@ boolean *noticed; /* set to true iff hero notices the effect; */
/* dotrap calls mintrap when mounted hero encounters a web */ /* dotrap calls mintrap when mounted hero encounters a web */
if (u.usteed) if (u.usteed)
dotrapflags |= NOWEBMSG; dotrapflags |= NOWEBMSG;
++force_mintrap; ++iv.force_mintrap;
dotrap(t, dotrapflags); dotrap(t, dotrapflags);
--force_mintrap; --iv.force_mintrap;
result = (u.utrap != 0); result = (u.utrap != 0);
} else { } else {
if (mon->mtrapped) if (mon->mtrapped)
@@ -4699,9 +4696,9 @@ boolean *noticed; /* set to true iff hero notices the effect; */
/* you notice it if you see the trap close/tremble/whatever /* you notice it if you see the trap close/tremble/whatever
or if you sense the monster who becomes trapped */ or if you sense the monster who becomes trapped */
*noticed = cansee(t->tx, t->ty) || canspotmon(mon); *noticed = cansee(t->tx, t->ty) || canspotmon(mon);
++force_mintrap; ++iv.force_mintrap;
result = (mintrap(mon) != 0); result = (mintrap(mon) != 0);
--force_mintrap; --iv.force_mintrap;
} }
return result; return result;
} }
@@ -4742,9 +4739,9 @@ boolean *noticed; /* set to true iff hero notices the effect; */
*noticed = cansee(t->tx, t->ty) || canspotmon(mon); *noticed = cansee(t->tx, t->ty) || canspotmon(mon);
/* monster will be angered; mintrap doesn't handle that */ /* monster will be angered; mintrap doesn't handle that */
wakeup(mon, TRUE); wakeup(mon, TRUE);
++force_mintrap; ++iv.force_mintrap;
result = (mintrap(mon) != 0); result = (mintrap(mon) != 0);
--force_mintrap; --iv.force_mintrap;
/* mon might now be on the migrating monsters list */ /* mon might now be on the migrating monsters list */
} }
return result; return result;
+8 -8
View File
@@ -991,9 +991,9 @@ register struct trobj *trop;
*/ */
obj = mkobj(trop->trclass, FALSE); obj = mkobj(trop->trclass, FALSE);
otyp = obj->otyp; otyp = obj->otyp;
while (otyp == WAN_WISHING || otyp == icontext.nocreate while (otyp == WAN_WISHING || otyp == iv.nocreate
|| otyp == icontext.nocreate2 || otyp == icontext.nocreate3 || otyp == iv.nocreate2 || otyp == iv.nocreate3
|| otyp == icontext.nocreate4 || otyp == RIN_LEVITATION || otyp == iv.nocreate4 || otyp == RIN_LEVITATION
/* 'useless' items */ /* 'useless' items */
|| otyp == POT_HALLUCINATION || otyp == POT_HALLUCINATION
|| otyp == POT_ACID || otyp == POT_ACID
@@ -1035,16 +1035,16 @@ register struct trobj *trop;
case WAN_POLYMORPH: case WAN_POLYMORPH:
case RIN_POLYMORPH: case RIN_POLYMORPH:
case POT_POLYMORPH: case POT_POLYMORPH:
icontext.nocreate = RIN_POLYMORPH_CONTROL; iv.nocreate = RIN_POLYMORPH_CONTROL;
break; break;
case RIN_POLYMORPH_CONTROL: case RIN_POLYMORPH_CONTROL:
icontext.nocreate = RIN_POLYMORPH; iv.nocreate = RIN_POLYMORPH;
icontext.nocreate2 = SPE_POLYMORPH; iv.nocreate2 = SPE_POLYMORPH;
icontext.nocreate3 = POT_POLYMORPH; iv.nocreate3 = POT_POLYMORPH;
} }
/* Don't have 2 of the same ring or spellbook */ /* Don't have 2 of the same ring or spellbook */
if (obj->oclass == RING_CLASS || obj->oclass == SPBOOK_CLASS) if (obj->oclass == RING_CLASS || obj->oclass == SPBOOK_CLASS)
icontext.nocreate4 = otyp; iv.nocreate4 = otyp;
} }
if (urace.malenum != PM_HUMAN) { if (urace.malenum != PM_HUMAN) {
+4 -7
View File
@@ -26,9 +26,6 @@ STATIC_DCL boolean FDECL(shade_aware, (struct obj *));
extern boolean notonhead; /* for long worms */ extern boolean notonhead; /* for long worms */
/* Used to flag attacks caused by Stormbringer's maliciousness. */
static boolean override_confirmation = FALSE;
#define PROJECTILE(obj) ((obj) && is_ammo(obj)) #define PROJECTILE(obj) ((obj) && is_ammo(obj))
void void
@@ -201,7 +198,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
&& !Stunned) { && !Stunned) {
/* Intelligent chaotic weapons (Stormbringer) want blood */ /* Intelligent chaotic weapons (Stormbringer) want blood */
if (wep && wep->oartifact == ART_STORMBRINGER) { if (wep && wep->oartifact == ART_STORMBRINGER) {
override_confirmation = TRUE; iv.override_confirmation = TRUE;
return FALSE; return FALSE;
} }
if (canspotmon(mtmp)) { if (canspotmon(mtmp)) {
@@ -370,7 +367,7 @@ register struct monst *mtmp;
/* possibly set in attack_checks; /* possibly set in attack_checks;
examined in known_hitum, called via hitum or hmonas below */ examined in known_hitum, called via hitum or hmonas below */
override_confirmation = FALSE; iv.override_confirmation = FALSE;
/* attack_checks() used to use <u.ux+u.dx,u.uy+u.dy> directly, now /* attack_checks() used to use <u.ux+u.dx,u.uy+u.dy> directly, now
it uses bhitpos instead; it might map an invisible monster there */ it uses bhitpos instead; it might map an invisible monster there */
bhitpos.x = u.ux + u.dx; bhitpos.x = u.ux + u.dx;
@@ -451,7 +448,7 @@ int dieroll;
{ {
register boolean malive = TRUE; register boolean malive = TRUE;
if (override_confirmation) { if (iv.override_confirmation) {
/* this may need to be generalized if weapons other than /* this may need to be generalized if weapons other than
Stormbringer acquire similar anti-social behavior... */ Stormbringer acquire similar anti-social behavior... */
if (flags.verbose) if (flags.verbose)
@@ -604,7 +601,7 @@ struct attack *uattk;
/* second attack for two-weapon combat; won't occur if Stormbringer /* second attack for two-weapon combat; won't occur if Stormbringer
overrode confirmation (assumes Stormbringer is primary weapon) overrode confirmation (assumes Stormbringer is primary weapon)
or if the monster was killed or knocked to different location */ or if the monster was killed or knocked to different location */
if (u.twoweap && !override_confirmation && malive && m_at(x, y) == mon) { if (u.twoweap && !iv.override_confirmation && malive && m_at(x, y) == mon) {
tmp = find_roll_to_hit(mon, uattk->aatyp, uswapwep, &attknum, tmp = find_roll_to_hit(mon, uattk->aatyp, uswapwep, &attknum,
&armorpenalty); &armorpenalty);
dieroll = rnd(20); dieroll = rnd(20);
+17 -19
View File
@@ -387,8 +387,6 @@ static NEARDATA const int pwep[] = { HALBERD, BARDICHE, SPETUM,
BEC_DE_CORBIN, FAUCHARD, PARTISAN, BEC_DE_CORBIN, FAUCHARD, PARTISAN,
LANCE }; LANCE };
static struct obj *propellor;
/* select a ranged weapon for the monster */ /* select a ranged weapon for the monster */
struct obj * struct obj *
select_rwep(mtmp) select_rwep(mtmp)
@@ -401,7 +399,7 @@ register struct monst *mtmp;
char mlet = mtmp->data->mlet; char mlet = mtmp->data->mlet;
propellor = &zeroobj; iv.propellor = &zeroobj;
Oselect(EGG); /* cockatrice egg */ Oselect(EGG); /* cockatrice egg */
if (mlet == S_KOP) /* pies are first choice for Kops */ if (mlet == S_KOP) /* pies are first choice for Kops */
Oselect(CREAM_PIE); Oselect(CREAM_PIE);
@@ -433,7 +431,7 @@ register struct monst *mtmp;
|| !mon_hates_silver(mtmp))) { || !mon_hates_silver(mtmp))) {
if ((otmp = oselect(mtmp, pwep[i])) != 0 if ((otmp = oselect(mtmp, pwep[i])) != 0
&& (otmp == mwep || !mweponly)) { && (otmp == mwep || !mweponly)) {
propellor = otmp; /* force the monster to wield it */ iv.propellor = otmp; /* force the monster to wield it */
return otmp; return otmp;
} }
} }
@@ -454,41 +452,41 @@ register struct monst *mtmp;
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)
if (otmp->oclass == GEM_CLASS if (otmp->oclass == GEM_CLASS
&& (otmp->otyp != LOADSTONE || !otmp->cursed)) { && (otmp->otyp != LOADSTONE || !otmp->cursed)) {
propellor = m_carrying(mtmp, SLING); iv.propellor = m_carrying(mtmp, SLING);
return otmp; return otmp;
} }
} }
/* KMH -- This belongs here so darts will work */ /* KMH -- This belongs here so darts will work */
propellor = &zeroobj; iv.propellor = &zeroobj;
prop = (objects[rwep[i]]).oc_skill; prop = (objects[rwep[i]]).oc_skill;
if (prop < 0) { if (prop < 0) {
switch (-prop) { switch (-prop) {
case P_BOW: case P_BOW:
propellor = (oselect(mtmp, YUMI)); iv.propellor = (oselect(mtmp, YUMI));
if (!propellor) if (!iv.propellor)
propellor = (oselect(mtmp, ELVEN_BOW)); iv.propellor = (oselect(mtmp, ELVEN_BOW));
if (!propellor) if (!iv.propellor)
propellor = (oselect(mtmp, BOW)); iv.propellor = (oselect(mtmp, BOW));
if (!propellor) if (!iv.propellor)
propellor = (oselect(mtmp, ORCISH_BOW)); iv.propellor = (oselect(mtmp, ORCISH_BOW));
break; break;
case P_SLING: case P_SLING:
propellor = (oselect(mtmp, SLING)); iv.propellor = (oselect(mtmp, SLING));
break; break;
case P_CROSSBOW: case P_CROSSBOW:
propellor = (oselect(mtmp, CROSSBOW)); iv.propellor = (oselect(mtmp, CROSSBOW));
} }
if ((otmp = MON_WEP(mtmp)) && mwelded(otmp) && otmp != propellor if ((otmp = MON_WEP(mtmp)) && mwelded(otmp) && otmp != iv.propellor
&& mtmp->weapon_check == NO_WEAPON_WANTED) && mtmp->weapon_check == NO_WEAPON_WANTED)
propellor = 0; iv.propellor = 0;
} }
/* propellor = obj, propellor to use /* propellor = obj, propellor to use
* propellor = &zeroobj, doesn't need a propellor * propellor = &zeroobj, doesn't need a propellor
* propellor = 0, needed one and didn't have one * propellor = 0, needed one and didn't have one
*/ */
if (propellor != 0) { if (iv.propellor != 0) {
/* Note: cannot use m_carrying for loadstones, since it will /* Note: cannot use m_carrying for loadstones, since it will
* always select the first object of a type, and maybe the * always select the first object of a type, and maybe the
* monster is carrying two but only the first is unthrowable. * monster is carrying two but only the first is unthrowable.
@@ -635,7 +633,7 @@ register struct monst *mon;
break; break;
case NEED_RANGED_WEAPON: case NEED_RANGED_WEAPON:
(void) select_rwep(mon); (void) select_rwep(mon);
obj = propellor; obj = iv.propellor;
break; break;
case NEED_PICK_AXE: case NEED_PICK_AXE:
obj = m_carrying(mon, PICK_AXE); obj = m_carrying(mon, PICK_AXE);
+10 -16
View File
@@ -12,14 +12,8 @@
*/ */
#define MAGIC_COOKIE 1000 #define MAGIC_COOKIE 1000
static NEARDATA boolean obj_zapped;
static NEARDATA int poly_zapped;
extern boolean notonhead; /* for long worms */ extern boolean notonhead; /* for long worms */
/* kludge to use mondied instead of killed */
extern boolean m_using;
STATIC_DCL void FDECL(polyuse, (struct obj *, int, int)); STATIC_DCL void FDECL(polyuse, (struct obj *, int, int));
STATIC_DCL void FDECL(create_polymon, (struct obj *, int)); STATIC_DCL void FDECL(create_polymon, (struct obj *, int));
STATIC_DCL int FDECL(stone_to_flesh_obj, (struct obj *)); STATIC_DCL int FDECL(stone_to_flesh_obj, (struct obj *));
@@ -1366,13 +1360,13 @@ struct obj *obj;
if (obj->otyp == SCR_MAIL) if (obj->otyp == SCR_MAIL)
return; return;
#endif #endif
obj_zapped = TRUE; iv.obj_zapped = TRUE;
if (poly_zapped < 0) { if (iv.poly_zapped < 0) {
/* some may metamorphosize */ /* some may metamorphosize */
for (i = obj->quan; i; i--) for (i = obj->quan; i; i--)
if (!rn2(Luck + 45)) { if (!rn2(Luck + 45)) {
poly_zapped = objects[obj->otyp].oc_material; iv.poly_zapped = objects[obj->otyp].oc_material;
break; break;
} }
} }
@@ -2071,7 +2065,7 @@ schar zz;
learnwand(obj); learnwand(obj);
} }
poly_zapped = -1; iv.poly_zapped = -1;
for (otmp = level.objects[tx][ty]; otmp; otmp = next_obj) { for (otmp = level.objects[tx][ty]; otmp; otmp = next_obj) {
next_obj = otmp->nexthere; next_obj = otmp->nexthere;
/* for zap downwards, don't hit object poly'd hero is hiding under */ /* for zap downwards, don't hit object poly'd hero is hiding under */
@@ -2081,8 +2075,8 @@ schar zz;
hitanything += (*fhito)(otmp, obj); hitanything += (*fhito)(otmp, obj);
} }
if (poly_zapped >= 0) if (iv.poly_zapped >= 0)
create_polymon(level.objects[tx][ty], poly_zapped); create_polymon(level.objects[tx][ty], iv.poly_zapped);
return hitanything; return hitanything;
} }
@@ -2956,16 +2950,16 @@ struct obj *obj; /* wand or spell */
void void
zapsetup() zapsetup()
{ {
obj_zapped = FALSE; iv.obj_zapped = FALSE;
} }
void void
zapwrapup() zapwrapup()
{ {
/* if do_osshock() set obj_zapped while polying, give a message now */ /* if do_osshock() set obj_zapped while polying, give a message now */
if (obj_zapped) if (iv.obj_zapped)
You_feel("shuddering vibrations."); You_feel("shuddering vibrations.");
obj_zapped = FALSE; iv.obj_zapped = FALSE;
} }
/* called for various wand and spell effects - M. Stephenson */ /* called for various wand and spell effects - M. Stephenson */
@@ -5041,7 +5035,7 @@ int damage, tell;
if (damage) { if (damage) {
mtmp->mhp -= damage; mtmp->mhp -= damage;
if (DEADMONSTER(mtmp)) { if (DEADMONSTER(mtmp)) {
if (m_using) if (iv.m_using)
monkilled(mtmp, "", AD_RBRE); monkilled(mtmp, "", AD_RBRE);
else else
killed(mtmp); killed(mtmp);
+1 -1
View File
@@ -97,7 +97,7 @@ char *argv[];
nethack_enter(argc, argv); nethack_enter(argc, argv);
icontext_init(); instance_variable_init();
sys_early_init(); sys_early_init();
#if defined(WIN32) && defined(TTY_GRAPHICS) #if defined(WIN32) && defined(TTY_GRAPHICS)
+1 -1
View File
@@ -97,7 +97,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
win10_init(); win10_init();
icontext_init(); instance_variable_init();
sys_early_init(); sys_early_init();
/* init applicatio structure */ /* init applicatio structure */