extern boolean itsstuck(struct monst *);
extern boolean mb_trapped(struct monst *, boolean);
+extern void mon_track_add(struct monst *, coordxy, coordxy);
+extern void mon_track_clear(struct monst *);
extern boolean monhaskey(struct monst *, boolean);
extern void mon_regen(struct monst *, boolean);
extern int dochugw(struct monst *, boolean);
ylocale = mtmp->mtrack[1].y;
fromdlev.dnum = mtmp->mtrack[2].x;
fromdlev.dlevel = mtmp->mtrack[2].y;
- memset(mtmp->mtrack, 0, sizeof mtmp->mtrack);
+ mon_track_clear(mtmp);
if (mtmp == u.usteed)
return; /* don't place steed on the map */
pline("%s %s reluctantly over %s.", noit_Monnam(mtmp),
vtense((char *) 0, locomotion(mtmp->data, "step")), what);
}
- for (j = MTSZ - 1; j > 0; j--)
- mtmp->mtrack[j] = mtmp->mtrack[j - 1];
- mtmp->mtrack[0].x = omx;
- mtmp->mtrack[0].y = omy;
+ mon_track_add(mtmp, omx, omy);
/* We have to know if the pet's going to do a combined eat and
* move before moving it, but it can't eat until after being
* moved. Thus the do_eat flag.
/* ms->isminion handled below */
/* clone shouldn't be reluctant to move on spots 'parent' just moved on */
- (void) memset((genericptr_t) m2->mtrack, 0, sizeof m2->mtrack);
+ mon_track_clear(m2);
place_monster(m2, m2->mx, m2->my);
if (emits_light(m2->data))
if (mtmp->mtame) {
if (!mtmp->isminion)
EDOG(mtmp)->whistletime = g.moves;
- /* Clear mtrack. This is to fix up a pet who is
- stuck "fleeing" its master. */
- memset(mtmp->mtrack, 0, sizeof mtmp->mtrack);
+ /* Fix up a pet who is stuck "fleeing" its master */
+ mon_track_clear(mtmp);
}
}
}
return FALSE;
}
+/* push coordinate x,y to mtrack, making monster remember where it was */
+void
+mon_track_add(struct monst *mtmp, coordxy x, coordxy y)
+{
+ int j;
+
+ for (j = MTSZ - 1; j > 0; j--)
+ mtmp->mtrack[j] = mtmp->mtrack[j - 1];
+ mtmp->mtrack[0].x = x;
+ mtmp->mtrack[0].y = y;
+}
+
+void
+mon_track_clear(struct monst *mtmp)
+{
+ memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
+}
+
/* check whether a monster is carrying a locking/unlocking tool */
boolean
monhaskey(
mtmp->mflee = 1;
}
/* ignore recently-stepped spaces when made to flee */
- memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
+ mon_track_clear(mtmp);
}
static void
}
if (mmoved) {
- register int j;
-
if (mmoved == MMOVE_MOVED && (u.ux != nix || u.uy != niy) && itsstuck(mtmp))
return MMOVE_DONE;
maybe_unhide_at(mtmp->mx, mtmp->my);
- for (j = MTSZ - 1; j > 0; j--)
- mtmp->mtrack[j] = mtmp->mtrack[j - 1];
- mtmp->mtrack[0].x = omx;
- mtmp->mtrack[0].y = omy;
+ mon_track_add(mtmp, omx, omy);
} else {
if (is_unicorn(ptr) && rn2(2) && !tele_restrict(mtmp)) {
(void) rloc(mtmp, RLOC_MSG);
}
}
- memset(mtmp->mtrack, 0, sizeof mtmp->mtrack);
+ mon_track_clear(mtmp);
place_monster(mtmp, x, y); /* put monster down */
update_monster_region(mtmp);