Fix monster trapped state being wrong
When cloning a monster, clear the clone trapped and hiding states. When splitting a monster (eg. a black pudding), the clone could be placed on a trap, so do mintrap. When removing a monster from the map, clear the trapped state.
This commit is contained in:
@@ -422,6 +422,8 @@ Vlad wasn't set up as a vampshifter properly
|
|||||||
poly'd hero capable of spitting venom would leave intact venom object if it
|
poly'd hero capable of spitting venom would leave intact venom object if it
|
||||||
reached end of range at a 'soft' location such as water
|
reached end of range at a 'soft' location such as water
|
||||||
avoid impossible if monster cannot be relocated from teleport region
|
avoid impossible if monster cannot be relocated from teleport region
|
||||||
|
fix cloned monster trapped and hiding states
|
||||||
|
split monster could be placed on trap without triggering it
|
||||||
|
|
||||||
|
|
||||||
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
|
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
|
||||||
|
|||||||
@@ -842,6 +842,8 @@ xchar x, y; /* clone's preferred location or 0 (near mon) */
|
|||||||
m2->mx = mm.x;
|
m2->mx = mm.x;
|
||||||
m2->my = mm.y;
|
m2->my = mm.y;
|
||||||
|
|
||||||
|
m2->mundetected = 0;
|
||||||
|
m2->mtrapped = 0;
|
||||||
m2->mcloned = 1;
|
m2->mcloned = 1;
|
||||||
m2->minvent = (struct obj *) 0; /* objects don't clone */
|
m2->minvent = (struct obj *) 0; /* objects don't clone */
|
||||||
m2->mleashed = FALSE;
|
m2->mleashed = FALSE;
|
||||||
|
|||||||
+3
-1
@@ -419,7 +419,8 @@ register struct monst *magr, *mdef;
|
|||||||
|| objects[otmp->otyp].oc_material == METAL))
|
|| objects[otmp->otyp].oc_material == METAL))
|
||||||
&& mdef->mhp > 1
|
&& mdef->mhp > 1
|
||||||
&& !mdef->mcan) {
|
&& !mdef->mcan) {
|
||||||
if (clone_mon(mdef, 0, 0)) {
|
struct monst *mclone;
|
||||||
|
if ((mclone = clone_mon(mdef, 0, 0)) != 0) {
|
||||||
if (vis && canspotmon(mdef)) {
|
if (vis && canspotmon(mdef)) {
|
||||||
char buf[BUFSZ];
|
char buf[BUFSZ];
|
||||||
|
|
||||||
@@ -427,6 +428,7 @@ register struct monst *magr, *mdef;
|
|||||||
pline("%s divides as %s hits it!", buf,
|
pline("%s divides as %s hits it!", buf,
|
||||||
mon_nam(magr));
|
mon_nam(magr));
|
||||||
}
|
}
|
||||||
|
mintrap(mclone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
|||||||
@@ -1687,6 +1687,7 @@ struct monst **monst_list; /* &migrating_mons or &mydogs or null */
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (on_map) {
|
if (on_map) {
|
||||||
|
mon->mtrapped = 0;
|
||||||
if (mon->wormno)
|
if (mon->wormno)
|
||||||
remove_worm(mon);
|
remove_worm(mon);
|
||||||
else
|
else
|
||||||
|
|||||||
+3
-1
@@ -1227,7 +1227,8 @@ int dieroll;
|
|||||||
/* but not bashing with darts, arrows or ya */
|
/* but not bashing with darts, arrows or ya */
|
||||||
&& !(is_ammo(obj) || is_missile(obj)))
|
&& !(is_ammo(obj) || is_missile(obj)))
|
||||||
&& hand_to_hand) {
|
&& hand_to_hand) {
|
||||||
if (clone_mon(mon, 0, 0)) {
|
struct monst *mclone;
|
||||||
|
if ((mclone = clone_mon(mon, 0, 0)) != 0) {
|
||||||
char withwhat[BUFSZ];
|
char withwhat[BUFSZ];
|
||||||
|
|
||||||
withwhat[0] = '\0';
|
withwhat[0] = '\0';
|
||||||
@@ -1235,6 +1236,7 @@ int dieroll;
|
|||||||
Sprintf(withwhat, " with %s", yname(obj));
|
Sprintf(withwhat, " with %s", yname(obj));
|
||||||
pline("%s divides as you hit it%s!", Monnam(mon), withwhat);
|
pline("%s divides as you hit it%s!", Monnam(mon), withwhat);
|
||||||
hittxt = TRUE;
|
hittxt = TRUE;
|
||||||
|
mintrap(mclone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user