#endif
-/* PLAYAGAIN support for allowing the game shell to stay open after the player
- * saves or dies. This requires that the game engine can be re-entered to
- * start another game.
- *
- * This support does not include supporting playing another game when
- * a panic has occured due to undetermined state the engine is left in after a
- * panic */
-/* #define PLAYAGAIN */
-
/* End of Section 4 */
#ifdef TTY_TILES_ESCCODES
E NEARDATA char catname[];
E NEARDATA char horsename[];
E char preferred_pet;
-E int petname_used;
E const char *occtxt; /* defined when occupation != NULL */
E const char *nomovemsg;
* things initialized during the initialization of the game engine.
* It is initialized with icontext_initial_state found in decl.c */
-#define PLAYAGAIN
-
struct instance_context {
int oldcap; /* encumberance - pickup.c */
+ int petname_used; /* user preferred pet name has been used - dog.c */
+ int jumping_is_magic; /* current jump result of magic - apply.c */
+ int polearm_range_min; /* apply.c */
+ int polearm_range_max; /* apply.c */
+ int spec_dbon_applies; /* coordinate effects from spec_dbon() with
+ * messages in artifact_hit() - artifact.c */
+ int mrank_sz; /* loaded by max_rank_sz - botl.c */
+ short nocreate; /* ini_inv() - u_init.c = STRANGE_OBJECT */
+ short nocreate2; /* ini_inv() - u_init.c = STRANGE_OBJECT */
+ short nocreate3; /* ini_inv() - u_init.c = STRANGE_OBJECT */
+ short nocreate4; /* ini_inv() - u_init.c = STRANGE_OBJECT */
};
E struct instance_context icontext;
/* ### decl.c ### */
E void NDECL(decl_init);
-#ifdef PLAYAGAIN
-E void NDECL(decl_early_init);
-#endif
/* ### detect.c ### */
return TRUE;
}
-static int jumping_is_magic;
-
STATIC_OVL boolean
get_valid_jump_position(x,y)
int x,y;
{
return (isok(x, y)
&& (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
- && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
+ && is_valid_jump_pos(x, y, icontext.jumping_is_magic, FALSE));
}
void
pline("Where do you want to jump?");
cc.x = u.ux;
cc.y = u.uy;
- jumping_is_magic = magic;
+ icontext.jumping_is_magic = magic;
getpos_sethilite(display_jump_positions, get_valid_jump_position);
if (getpos(&cc, TRUE, "the desired position") < 0)
return 0; /* user pressed ESC */
return TRUE;
}
-static int polearm_range_min = -1;
-static int polearm_range_max = -1;
-
STATIC_OVL boolean
get_valid_polearm_position(x, y)
int x, y;
{
return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
- && distu(x, y) >= polearm_range_min
- && distu(x, y) <= polearm_range_max);
+ && distu(x, y) >= icontext.polearm_range_min
+ && distu(x, y) <= icontext.polearm_range_max);
}
void
else
max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
- polearm_range_min = min_range;
- polearm_range_max = max_range;
+ icontext.polearm_range_min = min_range;
+ icontext.polearm_range_max = max_range;
/* Prompt for a location */
pline(where_to_hit);
of hit points that will fit in a 15 bit integer. */
#define FATAL_DAMAGE_MODIFIER 200
-/* coordinate effects from spec_dbon() with messages in artifact_hit() */
-STATIC_OVL int spec_dbon_applies = 0;
-
/* flags including which artifacts have already been created */
static boolean artiexist[1 + NROFARTIFACTS + 1];
/* and a discovery list for them (no dummy first entry here) */
if (!weap || (weap->attk.adtyp == AD_PHYS /* check for `NO_ATTK' */
&& weap->attk.damn == 0 && weap->attk.damd == 0))
- spec_dbon_applies = FALSE;
+ icontext.spec_dbon_applies = FALSE;
else if (otmp->oartifact == ART_GRIMTOOTH)
/* Grimtooth has SPFX settings to warn against elves but we want its
damage bonus to apply to all targets, so bypass spec_applies() */
- spec_dbon_applies = TRUE;
+ icontext.spec_dbon_applies = TRUE;
else
- spec_dbon_applies = spec_applies(weap, mon);
+ icontext.spec_dbon_applies = spec_applies(weap, mon);
- if (spec_dbon_applies)
+ if (icontext.spec_dbon_applies)
return weap->attk.damd ? rnd((int) weap->attk.damd) : max(tmp, 1);
return 0;
}
scare_dieroll /= (1 << (mb->spe / 3));
/* if target successfully resisted the artifact damage bonus,
reduce overall likelihood of the assorted special effects */
- if (!spec_dbon_applies)
+ if (!icontext.spec_dbon_applies)
dieroll += 1;
/* might stun even when attempting a more severe effect, but
in that case it will only happen if the other effect fails;
extra damage will apply regardless; 3.4.1: sometimes might
just probe even when it hasn't been enchanted */
- do_stun = (max(mb->spe, 0) < rn2(spec_dbon_applies ? 11 : 7));
+ do_stun = (max(mb->spe, 0) < rn2(icontext.spec_dbon_applies ? 11 : 7));
/* the special effects also boost physical damage; increments are
generally cumulative, but since the stun effect is based on a
if (attacks(AD_FIRE, otmp)) {
if (realizes_damage)
pline_The("fiery blade %s %s%c",
- !spec_dbon_applies
+ !icontext.spec_dbon_applies
? "hits"
: (mdef->data == &mons[PM_WATER_ELEMENTAL])
? "vaporizes part of"
: "burns",
- hittee, !spec_dbon_applies ? '.' : '!');
+ hittee, !icontext.spec_dbon_applies ? '.' : '!');
if (!rn2(4))
(void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE);
if (!rn2(4))
if (attacks(AD_COLD, otmp)) {
if (realizes_damage)
pline_The("ice-cold blade %s %s%c",
- !spec_dbon_applies ? "hits" : "freezes", hittee,
- !spec_dbon_applies ? '.' : '!');
+ !icontext.spec_dbon_applies ? "hits" : "freezes", hittee,
+ !icontext.spec_dbon_applies ? '.' : '!');
if (!rn2(4))
(void) destroy_mitem(mdef, POTION_CLASS, AD_COLD);
return realizes_damage;
if (attacks(AD_ELEC, otmp)) {
if (realizes_damage)
pline_The("massive hammer hits%s %s%c",
- !spec_dbon_applies ? "" : "! Lightning strikes",
- hittee, !spec_dbon_applies ? '.' : '!');
- if (spec_dbon_applies)
+ !icontext.spec_dbon_applies ? "" : "! Lightning strikes",
+ hittee, !icontext.spec_dbon_applies ? '.' : '!');
+ if (icontext.spec_dbon_applies)
wake_nearto(mdef->mx, mdef->my, 4 * 4);
if (!rn2(5))
(void) destroy_mitem(mdef, RING_CLASS, AD_ELEC);
if (attacks(AD_MAGM, otmp)) {
if (realizes_damage)
pline_The("imaginary widget hits%s %s%c",
- !spec_dbon_applies
+ !icontext.spec_dbon_applies
? ""
: "! A hail of magic missiles strikes",
- hittee, !spec_dbon_applies ? '.' : '!');
+ hittee, !icontext.spec_dbon_applies ? '.' : '!');
return realizes_damage;
}
return Mb_hit(magr, mdef, otmp, dmgptr, dieroll, vis, hittee);
}
- if (!spec_dbon_applies) {
+ if (!icontext.spec_dbon_applies) {
/* since damage bonus didn't apply, nothing more to do;
no further attacks have side-effects on inventory */
return FALSE;
const char *const enc_stat[] = { "", "Burdened", "Stressed",
"Strained", "Overtaxed", "Overloaded" };
-STATIC_OVL NEARDATA int mrank_sz = 0; /* loaded by max_rank_sz (from u_init) */
STATIC_DCL const char *NDECL(rank);
#ifdef STATUS_HILITES
STATIC_DCL void NDECL(bot_via_windowport);
Strcpy(nb = eos(nb), rank());
Sprintf(nb = eos(nb), " ");
- i = mrank_sz + 15;
+ i = icontext.mrank_sz + 15;
j = (int) ((nb + 2) - newbot1); /* strlen(newbot1) but less computation */
if ((i - j) > 0)
Sprintf(nb = eos(nb), "%*s", i - j, " "); /* pad with spaces */
if (urole.rank[i].f && (r = strlen(urole.rank[i].f)) > maxr)
maxr = r;
}
- mrank_sz = maxr;
+ icontext.mrank_sz = maxr;
return;
}
NEARDATA char catname[PL_PSIZ] = DUMMY;
NEARDATA char horsename[PL_PSIZ] = DUMMY;
char preferred_pet; /* '\0', 'c', 'd', 'n' (none) */
-int petname_used = 0;
/* monsters that went down/up together with @ */
NEARDATA struct monst *mydogs = (struct monst *) 0;
/* monsters that are moving to another dungeon level */
};
#endif
-#ifdef PLAYAGAIN
const struct savefile_info default_sfinfo = {
#ifdef NHSTDC
0x00000000UL
0x00000000L, 0x00000000L
#endif
};
-#endif
-NEARDATA struct savefile_info sfcap = {
-#ifdef NHSTDC
- 0x00000000UL
-#else
- 0x00000000L
-#endif
-#if defined(COMPRESS) || defined(ZLIB_COMP)
- | SFI1_EXTERNALCOMP
-#endif
-#if defined(ZEROCOMP)
- | SFI1_ZEROCOMP
-#endif
-#if defined(RLECOMP)
- | SFI1_RLECOMP
-#endif
- ,
-#ifdef NHSTDC
- 0x00000000UL, 0x00000000UL
-#else
- 0x00000000L, 0x00000000L
-#endif
-};
-
-NEARDATA struct savefile_info sfrestinfo, sfsaveinfo = {
-#ifdef NHSTDC
- 0x00000000UL
-#else
- 0x00000000L
-#endif
-#if defined(COMPRESS) || defined(ZLIB_COMP)
- | SFI1_EXTERNALCOMP
-#endif
-#if defined(ZEROCOMP)
- | SFI1_ZEROCOMP
-#endif
-#if defined(RLECOMP)
- | SFI1_RLECOMP
-#endif
- ,
-#ifdef NHSTDC
- 0x00000000UL, 0x00000000UL
-#else
- 0x00000000L, 0x00000000L
-#endif
-};
+NEARDATA struct savefile_info sfcap, sfrestinfo, sfsaveinfo;
struct plinemsg_type *plinemsg_types = (struct plinemsg_type *) 0;
return;
}
-#ifdef PLAYAGAIN
-
-static boolean s_firstStart = TRUE;
-
-static boolean
-decl_is_block_zero(p, n)
-unsigned char * p;
-int n;
-{
- static unsigned char zeroblock[512] = { 0 };
- unsigned char * sentinel = p + n;
- while (p < sentinel) {
- int c = (n < sizeof(zeroblock) ? n : sizeof(zeroblock));
- if (memcmp(p, zeroblock, c) != 0) return FALSE;
- p += c;
- }
- return TRUE;
-}
-
-static void
-decl_zero_block(p, n)
-unsigned char * p;
-int n;
-{
- nhassert(!s_firstStart || decl_is_block_zero(p, n));
- memset(p, 0, n);
-}
-
-#define ZEROARRAY(x) decl_zero_block((void *) &x[0], 0, sizeof(x))
-#define ZEROARRAYN(x,n) decl_zero_block((void *) &x[0], 0, sizeof(x[0])*(n))
-#define ZERO(x) decl_zero_block((void *) &x, 0, sizeof(x))
-#define ZEROPTR(x) { nhassert(x == NULL); x = NULL; }
-#define ZEROPTRNOCHECK(x) { x = NULL; }
-
-/* decl_early_init() is called when we are starting a game. On first
- * start, it validates that global state is in the expected state.
- * When called on subsequent starts, it initializes global state to
- * expected state.
- *
- * In the case that of global pointers, on subsequent starts it will
- * panic if it finds a non-NULL pointer with the assumption that a
- * pointer has leaked. */
-
-void
-decl_early_init()
-{
- hackpid = 0;
-#if defined(UNIX) || defined(VMS)
- locknum = 0;
-#endif
-#ifdef DEF_PAGER
- catmore = 0;
-#endif
-
- ZEROARRAY(bases);
-
- multi = 0;
- multi_reason = NULL;
- nroom = 0;
- nsubroom = 0;
- occtime = 0;
-
- x_maze_max = (COLNO - 1) & ~1;
- y_maze_max = (ROWNO - 1) & ~1;
-
- otg_temp = 0;
-
- ZERO(dungeon_topology);
- ZERO(quest_status);
-
- warn_obj_cnt = 0;
- ZEROARRAYN(smeq, MAXNROFROOMS + 1);
- doorindex = 0;
- save_cm = NULL;
-
- ZERO(killer);
- done_money = 0;
- nomovemsg = NULL;
- ZEROARRAY(plname);
- ZEROARRAY(pl_character);
- pl_race = '\0';
-
- ZEROARRAY(pl_fruit);
- ffruit = NULL;
-
- ZEROARRAY(tune);
-
- occtxt = NULL;
-
- yn_number = 0;
-
-#if defined(MICRO) || defined(WIN32)
- ZEROARRAYN(hackdir, PATHLEN);
-#ifdef MICRO
- ZEROARRAYN(levels, PATHLEN);
-#endif /* MICRO */
-#endif /* MICRO || WIN32 */
-
-#ifdef MFLOPPY
- ZEROARRAYN(permbones, PATHLEN);
- ramdisk = FALSE;
- saveprompt = TRUE;
-#endif
-
- ZEROARRAY(level_info);
-
- ZERO(program_state);
-
- tbx = 0;
- tby = 0;
-
- ZERO(m_shot);
-
- ZEROARRAYN(dungeons, MAXDUNGEON);
- ZEROPTR(sp_levchn);
- ZERO(upstair);
- ZERO(dnstair);
- ZERO(upladder);
- ZERO(dnladder);
- ZERO(sstairs);
- ZERO(updest);
- ZERO(dndest);
- ZERO(inv_pos);
-
- defer_see_monsters = FALSE;
- in_mklev = FALSE;
- stoned = FALSE;
- unweapon = FALSE;
- mrg_to_wielded = FALSE;
-
- in_steed_dismounting = FALSE;
-
- ZERO(bhitpos);
- ZEROARRAY(doors);
-
- ZEROARRAY(rooms);
- subrooms = &rooms[MAXNROFROOMS + 1];
- upstairs_room = NULL;
- dnstairs_room = NULL;
- sstairs_room = NULL;
-
- ZERO(level);
- ZEROPTR(ftrap);
- ZERO(youmonst);
- ZERO(context);
- ZERO(flags);
-#ifdef SYSFLAGS
- ZERO(sysflags);
-#endif
- ZERO(iflags);
- ZERO(u);
- ZERO(ubirthday);
- ZERO(urealtime);
-
- ZEROARRAY(lastseentyp);
-
- ZEROPTR(invent);
- ZEROPTRNOCHECK(uwep);
- ZEROPTRNOCHECK(uarm);
- ZEROPTRNOCHECK(uswapwep);
- ZEROPTRNOCHECK(uquiver);
- ZEROPTRNOCHECK(uarmu);
- ZEROPTRNOCHECK(uskin);
- ZEROPTRNOCHECK(uarmc);
- ZEROPTRNOCHECK(uarmh);
- ZEROPTRNOCHECK(uarms);
- ZEROPTRNOCHECK(uarmg);
- ZEROPTRNOCHECK(uarmf);
- ZEROPTRNOCHECK(uamul);
- ZEROPTRNOCHECK(uright);
- ZEROPTRNOCHECK(uleft);
- ZEROPTRNOCHECK(ublindf);
- ZEROPTRNOCHECK(uchain);
- ZEROPTRNOCHECK(uball);
-
- ZEROPTR(current_wand);
- ZEROPTR(thrownobj);
- ZEROPTR(kickedobj);
-
- ZEROARRAYN(spl_book, MAXSPELL + 1);
-
- moves = 1;
- monstermoves = 1;
-
- wailmsg = 0L;
-
- ZEROPTR(migrating_objs);
- ZEROPTR(billobjs);
-
- ZERO(zeroobj);
- ZERO(zeromonst);
- ZERO(zeroany);
-
- ZEROARRAYN(dogname, PL_PSIZ);
- ZEROARRAYN(catname, PL_PSIZ);
- ZEROARRAYN(horsename, PL_PSIZ);
- ZERO(preferred_pet);
- ZERO(petname_used);
- ZEROPTR(mydogs);
- ZEROPTR(migrating_mons);
-
- ZEROARRAY(mvitals);
-
- ZEROPTR(menu_colorings);
-
- vision_full_recalc = 0;
- viz_array = NULL;
-
- WIN_MESSAGE = WIN_ERR;
-#ifndef STATUS_VIA_WINDOWPORT
- WIN_STATUS = WIN_ERR;
-#endif
- WIN_MAP = WIN_ERR;
- WIN_INVEN = WIN_ERR;
-
- ZEROARRAYN(toplines, TBUFSZ);
- ZERO(tc_gbl_data);
- ZEROARRAYN(fqn_prefix, PREFIX_COUNT);
-
- sfcap = default_sfinfo;
- sfrestinfo = default_sfinfo;
- sfsaveinfo = default_sfinfo;
-
- ZEROPTR(plinemsg_types);
-
-#ifdef PANICTRACE
- ARGV0 = NULL;
-#endif
-
- nhUse_dummy = 0;
-
- s_firstStart = FALSE;
-}
-#endif
-
const struct instance_context icontext_initial_state = {
- 0, /* oldcap - last encumberance in pickup.c */
+ 0, /* oldcap - last encumberance in pickup.c */
+ 0, /* petname_used - dog.c */
+ 0, /* jumping_is_magic - apply.c */
+ -1, /* polearm_range_min - apply.c */
+ -1, /* polearm_range_max - apply.c */
+ 0, /* spec_dbon_applies - artifact.c */
+ 0, /* mrank_sz - botl.c */
+ STRANGE_OBJECT, /* nocreate - ini_inv() in u_init.c */
+ STRANGE_OBJECT, /* nocreate2 - ini_inv() in u_init.c */
+ STRANGE_OBJECT, /* nocreate3 - ini_inv() in u_init.c */
+ STRANGE_OBJECT, /* nocreate4 - ini_inv() in u_init.c */
};
struct instance_context icontext;
{
icontext = icontext_initial_state;
- decl_early_init();
+ sfcap = default_sfinfo;
+ sfrestinfo = default_sfinfo;
+ sfsaveinfo = default_sfinfo;
};
/*decl.c*/
put_saddle_on_mon(otmp, mtmp);
}
- if (!petname_used++ && *petname)
+ if (!icontext.petname_used++ && *petname)
mtmp = christen_monst(mtmp, petname);
initedog(mtmp);
#ifdef MFLOPPY
gameDiskPrompt();
#endif
- max_rank_sz(); /* to recompute mrank_sz (botl.c) */
+ max_rank_sz(); /* to recompute icontext.mrank_sz (botl.c) */
/* take care of iron ball & chain */
for (otmp = fobj; otmp; otmp = otmp->nobj)
if (otmp->owornmask)
struct obj *obj;
int otyp, i;
- NEARDATA short nocreate = STRANGE_OBJECT;
- NEARDATA short nocreate2 = STRANGE_OBJECT;
- NEARDATA short nocreate3 = STRANGE_OBJECT;
- NEARDATA short nocreate4 = STRANGE_OBJECT;
-
while (trop->trclass) {
otyp = (int) trop->trotyp;
if (otyp != UNDEF_TYP) {
*/
obj = mkobj(trop->trclass, FALSE);
otyp = obj->otyp;
- while (otyp == WAN_WISHING || otyp == nocreate
- || otyp == nocreate2 || otyp == nocreate3
- || otyp == nocreate4 || otyp == RIN_LEVITATION
+ while (otyp == WAN_WISHING || otyp == icontext.nocreate
+ || otyp == icontext.nocreate2 || otyp == icontext.nocreate3
+ || otyp == icontext.nocreate4 || otyp == RIN_LEVITATION
/* 'useless' items */
|| otyp == POT_HALLUCINATION
|| otyp == POT_ACID
case WAN_POLYMORPH:
case RIN_POLYMORPH:
case POT_POLYMORPH:
- nocreate = RIN_POLYMORPH_CONTROL;
+ icontext.nocreate = RIN_POLYMORPH_CONTROL;
break;
case RIN_POLYMORPH_CONTROL:
- nocreate = RIN_POLYMORPH;
- nocreate2 = SPE_POLYMORPH;
- nocreate3 = POT_POLYMORPH;
+ icontext.nocreate = RIN_POLYMORPH;
+ icontext.nocreate2 = SPE_POLYMORPH;
+ icontext.nocreate3 = POT_POLYMORPH;
}
/* Don't have 2 of the same ring or spellbook */
if (obj->oclass == RING_CLASS || obj->oclass == SPBOOK_CLASS)
- nocreate4 = otyp;
+ icontext.nocreate4 = otyp;
}
if (urace.malenum != PM_HUMAN) {