From: cohrs Date: Wed, 16 Jan 2002 07:05:43 +0000 (+0000) Subject: riding a non-swimming steed into water X-Git-Tag: MOVE2GIT~3469 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e3ac04eac12519a3eddb900ba3a77eee7ad3056b;p=nethack riding a non-swimming steed into water Patch from to the list on 10/01/2001. The changes cause riding a steed into water to result in a dismount, and, if the steed can't survive in water, the death of the steed, with the usual pet-death penalties. --- diff --git a/doc/fixes33.2 b/doc/fixes33.2 index 3ba204708..009884d66 100644 --- a/doc/fixes33.2 +++ b/doc/fixes33.2 @@ -385,6 +385,7 @@ messages consistent for all monster spells monsters casting spells at your displaced image now set mspec_used monsters without ranged spells don't print curse messages for ranged spells going down to floor using > should set Heart of Ahriman invocation timeout +riding a steed into water kills the steed if it cannot swim, with penalties Platform- and/or Interface-Specific Fixes diff --git a/src/hack.c b/src/hack.c index 61d3ad5f6..a996207aa 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1348,8 +1348,21 @@ stillinwater:; /* limit recursive calls through teleds() */ if(is_lava(u.ux,u.uy) && lava_effects()) return; - if(is_pool(u.ux,u.uy) && !Wwalking && drown()) + if (is_pool(u.ux, u.uy)) { +#ifdef STEED + if (u.usteed && !is_flyer(u.usteed->data) && + !is_floater(u.usteed->data) && + !is_clinger(u.usteed->data)) { + dismount_steed(Underwater ? + DISMOUNT_FELL : DISMOUNT_GENERIC); + /* dismount_steed() -> float_down() -> pickup() */ + if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz)) + pick = FALSE; + } else +#endif + if (!Wwalking && drown()) return; + } } check_special_room(FALSE); #ifdef SINKS diff --git a/src/steed.c b/src/steed.c index 1dc98d6f6..d1b1f1f39 100644 --- a/src/steed.c +++ b/src/steed.c @@ -552,15 +552,19 @@ dismount_steed(reason) * able to walk onto a square with a hole, and autopickup before * falling into the hole). */ - /* Keep steed here, move the player to cc; teleds() clears u.utrap */ - in_steed_dismounting = TRUE; - teleds(cc.x, cc.y); - in_steed_dismounting = FALSE; - - /* Put your steed in your trap */ - if (save_utrap) - (void) mintrap(mtmp); - + /* [ALI] No need to move the player if the steed died. */ + if (!DEADMONSTER(mtmp)) { + /* Keep steed here, move the player to cc; + * teleds() clears u.utrap + */ + in_steed_dismounting = TRUE; + teleds(cc.x, cc.y); + in_steed_dismounting = FALSE; + + /* Put your steed in your trap */ + if (save_utrap) + (void) mintrap(mtmp); + } /* Couldn't... try placing the steed */ } else if (enexto(&cc, u.ux, u.uy, mtmp->data)) { /* Keep player here, move the steed to cc */ @@ -574,7 +578,9 @@ dismount_steed(reason) } /* Return the player to the floor */ + in_steed_dismounting = TRUE; (void) float_down(0L, W_SADDLE); + in_steed_dismounting = FALSE; flags.botl = 1; if (reason != DISMOUNT_ENGULFED) { (void)encumber_msg();