or objects and known traps in preference to remembered objects
restrictions on diagonal movement were ignored when crawling out of water
when using magic whistle, prevent steed from being affected (trap interaction)
+declining to attack a peaceful monster burned nutrition even though no action
+ took place
Platform- and/or Interface-Specific Fixes
E boolean FDECL(invocation_pos, (XCHAR_P,XCHAR_P));
E boolean FDECL(test_move, (int, int, int, int, int));
E void NDECL(domove);
+E boolean NDECL(overexertion);
E void NDECL(invocation_message);
E boolean FDECL(pooleffects, (BOOLEAN_P));
E void FDECL(spoteffects, (BOOLEAN_P));
bhitpos = cc;
if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *)0) {
if (attack_checks(mtmp, uwep)) return res;
+ if (overexertion()) return 1; /* burn nutrition; maybe pass out */
check_caitiff(mtmp);
notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
(void) thitmonst(mtmp, uwep);
bhitpos.x = x;
bhitpos.y = y;
if (attack_checks(mon, (struct obj *)0)) return;
+ /* burn extra nutrition, same as direct combat;
+ maybe pass out before making target angry */
+ if (overexertion()) return;
/* anger target even if wild miss will occur */
setmangry(mon);
* ceiling shouldn't be kickable (unless hero is flying?);
* kicking toward them should just target whatever is on
* the floor at that spot.]
+ * [FIXME too: kick_monster() calls attack_checks() which gives
+ * the player a chance to decline to attack a peaceful monster,
+ * and also calls overexertion() so hero might pass out before
+ * performing the kick. We shouldn't call wake_nearby() (and
+ * u_wipe_engr(), both already done above) in such cases.]
*/
if(MON_AT(x, y)) {
if(context.forcefight || !mtmp->mundetected || sensemon(mtmp) ||
((hides_under(mtmp->data) || mtmp->data->mlet == S_EEL) &&
!is_safepet(mtmp))){
- gethungry();
- if(wtcap >= HVY_ENCUMBER && moves%3) {
- if (Upolyd && u.mh > 1) {
- u.mh--;
- } else if (!Upolyd && u.uhp > 1) {
- u.uhp--;
- } else {
- You("pass out from exertion!");
- exercise(A_CON, FALSE);
- fall_asleep(-10, FALSE);
- }
- }
- if(multi < 0) return; /* we just fainted */
-
/* try to attack; note that it might evade */
/* also, we don't attack tame when _safepet_ */
if(attack(mtmp)) return;
}
}
+/* combat increases metabolism */
+boolean
+overexertion()
+{
+ /* this used to be part of domove() when moving to a monster's
+ position, but is now called by attack() so that it doesn't
+ execute if you decline to attack a peaceful monster */
+ gethungry();
+ if ((moves % 3L) != 0L && near_capacity() >= HVY_ENCUMBER) {
+ int *hp = (!Upolyd ? &u.uhp : &u.mh);
+
+ if (*hp > 1) {
+ *hp -= 1;
+ } else {
+ You("pass out from exertion!");
+ exercise(A_CON, FALSE);
+ fall_asleep(-10, FALSE);
+ }
+ }
+ return (multi < 0); /* might have fainted (actually gone to sleep) */
+}
+
void
invocation_message()
{
bhitpos.y = u.uy + u.dy;
if (attack_checks(mtmp, uwep)) return(TRUE);
- if (Upolyd) {
- /* certain "pacifist" monsters don't attack */
- if(noattacks(youmonst.data)) {
- You("have no way to attack monsters physically.");
- mtmp->mstrategy &= ~STRAT_WAITMASK;
- goto atk_done;
- }
+ if (Upolyd && noattacks(youmonst.data)) {
+ /* certain "pacifist" monsters don't attack */
+ You("have no way to attack monsters physically.");
+ mtmp->mstrategy &= ~STRAT_WAITMASK;
+ goto atk_done;
}
- if(check_capacity("You cannot fight while so heavily loaded."))
+ if (check_capacity("You cannot fight while so heavily loaded.") ||
+ /* consume extra nutrition during combat; maybe pass out */
+ overexertion())
goto atk_done;
if (u.twoweap && !can_twoweapon())