if wand or spell zap reached edge of map
if blind hero was challanged by a vault guard, it wasn't possible to see how
to start following that guard out of the vault
+make taming via magic harp be consistent with scroll of taming and charm
+ spell: an angry shopkeeper becomes pacified (but never tamed)
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
water on Plane of Water, and fumaroles on Plane of Fire be transparent
add wizard mode #wizkill command to remove monster(s) from play
some quest nemeses release a cloud of poisonous gas when they die
+taming magic acting on an already tame creature might make it become tamer
Platform- and/or Interface-Specific New Features
return FALSE;
}
- if (mtmp->mtame || !mtmp->mcanmove
- /* monsters with conflicting structures cannot be tamed */
+ /* if already tame, taming magic might make it become tamer */
+ if (mtmp->mtame) {
+ /* maximum tameness is 20, only reachable via eating */
+ if (rnd(10) > mtmp->mtame)
+ mtmp->mtame++;
+ return FALSE; /* didn't just get tamed */
+ }
+ /* pacify angry shopkeeper but don't tame him/her/it/them */
+ if (mtmp->isshk) {
+ make_happy_shk(mtmp, FALSE);
+ return FALSE;
+ }
+
+ if (!mtmp->mcanmove
+ /* monsters with conflicting structures cannot be tamed
+ [note: the various mextra structures don't actually conflict
+ with each other anymore] */
|| mtmp->isshk || mtmp->isgd || mtmp->ispriest || mtmp->isminion
|| is_covetous(mtmp->data) || is_human(mtmp->data)
|| (is_demon(mtmp->data) && !is_demon(g.youmonst.data))
}
}
-/* Charm monsters in range. Note that they may resist the spell.
- * If swallowed, range is reduced to 0.
- */
+/* Charm monsters in range. Note that they may resist the spell. */
static void
charm_monsters(int distance)
{
struct monst *mtmp, *mtmp2;
- if (u.uswallow) {
- if (!resist(u.ustuck, TOOL_CLASS, 0, NOTELL))
- (void) tamedog(u.ustuck, (struct obj *) 0);
- } else {
- for (mtmp = fmon; mtmp; mtmp = mtmp2) {
- mtmp2 = mtmp->nmon;
- if (DEADMONSTER(mtmp))
- continue;
+ if (u.uswallow)
+ distance = 0; /* only u.ustuck will be affected (u.usteed is Null
+ * since hero gets forcibly dismounted when engulfed) */
- if (distu(mtmp->mx, mtmp->my) <= distance) {
- if (!resist(mtmp, TOOL_CLASS, 0, NOTELL))
- (void) tamedog(mtmp, (struct obj *) 0);
- }
+ for (mtmp = fmon; mtmp; mtmp = mtmp2) {
+ mtmp2 = mtmp->nmon;
+ if (DEADMONSTER(mtmp))
+ continue;
+
+ if (distu(mtmp->mx, mtmp->my) <= distance) {
+ if (!resist(mtmp, TOOL_CLASS, 0, NOTELL))
+ (void) tamedog(mtmp, (struct obj *) 0);
}
}
}
/* monster is hit by scroll of taming's effect */
static int
-maybe_tame(struct monst* mtmp, struct obj* sobj)
+maybe_tame(struct monst *mtmp, struct obj *sobj)
{
int was_tame = mtmp->mtame;
unsigned was_peaceful = mtmp->mpeaceful;
if (was_peaceful && !mtmp->mpeaceful)
return -1;
} else {
- if (mtmp->isshk)
- make_happy_shk(mtmp, FALSE);
- else if (!resist(mtmp, sobj->oclass, 0, NOTELL))
+ /* for a shopkeeper, tamedog() will call make_happy_shk() but
+ not tame the target, so call it even if taming gets resisted */
+ if (!resist(mtmp, sobj->oclass, 0, NOTELL) || mtmp->isshk)
(void) tamedog(mtmp, (struct obj *) 0);
if ((!was_peaceful && mtmp->mpeaceful) || (!was_tame && mtmp->mtame))
return 1;