Monsters can track hero through fixed teleport traps
Also make fixed teleport traps always trigger when entered.
This commit is contained in:
@@ -3144,6 +3144,7 @@ extern int tt_doppel(struct monst *) NONNULLARG1;
|
||||
extern void initrack(void);
|
||||
extern void settrack(void);
|
||||
extern coord *gettrack(coordxy, coordxy);
|
||||
extern boolean hastrack(coordxy, coordxy);
|
||||
extern void save_track(NHFILE *) NONNULLARG1;
|
||||
extern void rest_track(NHFILE *) NONNULLARG1;
|
||||
|
||||
|
||||
@@ -122,5 +122,7 @@ enum trap_immunities {
|
||||
|| (ttyp) == POLY_TRAP)
|
||||
/* "transportation" traps */
|
||||
#define is_xport(ttyp) ((ttyp) >= TELEP_TRAP && (ttyp) <= MAGIC_PORTAL)
|
||||
#define fixed_tele_trap(t) ((t)->ttyp == TELEP_TRAP \
|
||||
&& isok((t)->teledest.x,(t)->teledest.x))
|
||||
|
||||
#endif /* TRAP_H */
|
||||
|
||||
@@ -2316,7 +2316,10 @@ mfndpos(
|
||||
ttmp->ttyp);
|
||||
continue;
|
||||
}
|
||||
if (!m_harmless_trap(mon, ttmp)) {
|
||||
/* fixed-destination teleport trap, was used by hero */
|
||||
if (fixed_tele_trap(ttmp) && hastrack(nx, ny))
|
||||
info[cnt] |= ALLOW_TRAPS;
|
||||
else if (!m_harmless_trap(mon, ttmp)) {
|
||||
if (!(flag & ALLOW_TRAPS)) {
|
||||
if (mon_knows_traps(mon, ttmp->ttyp))
|
||||
continue;
|
||||
|
||||
@@ -1456,6 +1456,7 @@ tele_trap(struct trap *trap)
|
||||
coord cc;
|
||||
struct monst *mtmp = m_at(trap->teledest.x, trap->teledest.y);
|
||||
|
||||
settrack();
|
||||
if (mtmp) {
|
||||
if (!enexto(&cc, mtmp->mx, mtmp->my, mtmp->data)) {
|
||||
/* could not find some other place to put mtmp; the level must
|
||||
|
||||
13
src/track.c
13
src/track.c
@@ -52,6 +52,19 @@ gettrack(coordxy x, coordxy y)
|
||||
return (coord *) 0;
|
||||
}
|
||||
|
||||
/* return TRUE if x,y has hero tracks on it */
|
||||
boolean
|
||||
hastrack(coordxy x, coordxy y)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < utcnt; i++)
|
||||
if (utrack[i].x == x && utrack[i].y == y)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* save the hero tracking info */
|
||||
void
|
||||
save_track(NHFILE *nhfp)
|
||||
|
||||
10
src/trap.c
10
src/trap.c
@@ -2897,6 +2897,11 @@ dotrap(struct trap *trap, unsigned trflags)
|
||||
|
||||
nomul(0);
|
||||
|
||||
if (fixed_tele_trap(trap)) {
|
||||
trflags |= FORCETRAP;
|
||||
forcetrap = TRUE;
|
||||
}
|
||||
|
||||
/* KMH -- You can't escape the Sokoban level traps */
|
||||
if (Sokoban && (is_pit(ttype) || is_hole(ttype))) {
|
||||
/* The "air currents" message is still appropriate -- even when
|
||||
@@ -3654,6 +3659,11 @@ mintrap(struct monst *mtmp, unsigned mintrapflags)
|
||||
boolean already_seen = (mon_knows_traps(mtmp, tt)
|
||||
|| (tt == HOLE && !mindless(mptr)));
|
||||
|
||||
if (fixed_tele_trap(trap)) {
|
||||
mintrapflags |= FORCETRAP;
|
||||
forcetrap = TRUE;
|
||||
}
|
||||
|
||||
if (mtmp == u.usteed) {
|
||||
; /* true when called from dotrap, inescapable is not an option */
|
||||
} else if (Sokoban && (is_pit(tt) || is_hole(tt)) && !trap->madeby_u) {
|
||||
|
||||
Reference in New Issue
Block a user