fix github issue #1003 - anti-magic field energy

Issue reported by vultur-cadens:  when trap effect of an anti-magic
field reduced maximum energy, the result might end up with current
energy being one point higher than new maximum.

Fixes #1003
This commit is contained in:
PatR
2023-04-07 23:34:19 -07:00
parent 6c2d7c3695
commit 14d003c4ba
2 changed files with 18 additions and 10 deletions
+3 -1
View File
@@ -1,4 +1,4 @@
HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1139 $ $NHDT-Date: 1679595146 2023/03/23 18:12:26 $ HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1146 $ $NHDT-Date: 1680935652 2023/04/08 06:34:12 $
General Fixes and Modified Features General Fixes and Modified Features
----------------------------------- -----------------------------------
@@ -1515,6 +1515,8 @@ some actions that ask the user to pick a location allow typing '$' to show
change 'm' prefix for #tip from 'use menu to pick among floor containers' change 'm' prefix for #tip from 'use menu to pick among floor containers'
(since that's already the default) to 'skip floor containers' so that (since that's already the default) to 'skip floor containers' so that
context-sensitive item-action Tip directly operates on the item context-sensitive item-action Tip directly operates on the item
anti-magic field's reduction of hero's maximum energy could result in current
energy being one point higher than maximum
Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository
+15 -9
View File
@@ -1,4 +1,4 @@
/* NetHack 3.7 trap.c $NHDT-Date: 1663890450 2022/09/22 23:47:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.508 $ */ /* NetHack 3.7 trap.c $NHDT-Date: 1680935652 2023/04/08 06:34:12 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.525 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2013. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2110,13 +2110,13 @@ trapeffect_magic_trap(
static int static int
trapeffect_anti_magic( trapeffect_anti_magic(
struct monst* mtmp, struct monst *mtmp, /* monster, possibly youmonst */
struct trap* trap, struct trap *trap, /* trap->ttyp == ANTI_MAGIC */
unsigned int trflags UNUSED) unsigned int trflags UNUSED)
{ {
if (mtmp == &gy.youmonst) { if (mtmp == &gy.youmonst) {
int drain = d(2, 6); int drain = d(2, 6); /* 2d6 => 2..12 */
int halfd = rnd(((drain + 1) / 2)); int halfd = rnd((drain + 1) / 2); /* 1..drain/2 (rounded up) */
seetrap(trap); seetrap(trap);
if (Antimagic) { if (Antimagic) {
@@ -2144,13 +2144,14 @@ trapeffect_anti_magic(
You_feel((dmgval2 >= hp) ? "unbearably torpid!" You_feel((dmgval2 >= hp) ? "unbearably torpid!"
: (dmgval2 >= hp / 4) ? "very lethargic." : (dmgval2 >= hp / 4) ? "very lethargic."
: "sluggish."); : "sluggish.");
/* opposite of magical explosion */ /* opposite of magical explosion */
losehp(dmgval2, "anti-magic implosion", KILLED_BY_AN); losehp(dmgval2, "anti-magic implosion", KILLED_BY_AN);
} }
if (u.uenmax > halfd) { if (u.uenmax > halfd) {
u.uenmax -= halfd; u.uenmax -= halfd; /* drain_en() will set context.botl */
drain -= halfd; drain = halfd;
} }
drain_en(drain); drain_en(drain);
} else { } else {
@@ -4599,6 +4600,11 @@ drown(void)
void void
drain_en(int n) drain_en(int n)
{ {
/*
* FIXME?
* u.uenmax should probably have a higher mininum than 0;
* perhaps u.ulevel or (u.ulevel + 1) / 2
*/
if (!u.uenmax) { if (!u.uenmax) {
/* energy is completely gone */ /* energy is completely gone */
You_feel("momentarily lethargic."); You_feel("momentarily lethargic.");
@@ -4615,7 +4621,7 @@ drain_en(int n)
u.uenmax = 0; u.uenmax = 0;
u.uen = 0; u.uen = 0;
} }
gc.context.botl = 1; gc.context.botl = TRUE;
} }
} }