From: Pasi Kallinen Date: Fri, 3 Mar 2023 15:37:02 +0000 (+0200) Subject: Saving grace X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08a2a2a1a4aa52a6f44e59d38dac50a181d9f939;p=nethack Saving grace Once per game, if receiving a killing blow from above 90% HP, allow the hero to survive with 1 HP. --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 21c667045..0bbd643f1 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1115,6 +1115,7 @@ give feedback when some types of damage are avoided due to MC (aka negation) feedback if a named, shape-shifted vampire reverted to original shape rather than dying when engulfed could say "Dracula turns into Dracula" adjust archeologist and valkyrie starting intrinsics +once per game if receiving killing blow from near-full hp, leave 1 hp Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index 2d141e8f1..743967d24 100644 --- a/include/extern.h +++ b/include/extern.h @@ -987,6 +987,7 @@ extern int monster_nearby(void); extern void end_running(boolean); extern void nomul(int); extern void unmul(const char *); +extern int saving_grace(int); extern void losehp(int, const char *, schar); extern int weight_cap(void); extern int inv_weight(void); diff --git a/include/patchlevel.h b/include/patchlevel.h index 2c35824f5..05d9cc8dd 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -17,7 +17,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 75 +#define EDITLEVEL 76 /* * Development status possibilities. diff --git a/include/you.h b/include/you.h index c85db2581..2c252aac1 100644 --- a/include/you.h +++ b/include/you.h @@ -419,7 +419,7 @@ struct you { Bitfield(uinvulnerable, 1); /* you're invulnerable (praying) */ Bitfield(uburied, 1); /* you're buried */ Bitfield(uedibility, 1); /* blessed food detect; sense unsafe food */ - /* 1 free bit! */ + Bitfield(usaving_grace, 1); /* prevents death once */ unsigned udg_cnt; /* how long you have been demigod */ struct u_event uevent; /* certain events have happened */ diff --git a/src/hack.c b/src/hack.c index eade9a4d9..60cf2fc72 100644 --- a/src/hack.c +++ b/src/hack.c @@ -3711,6 +3711,19 @@ maybe_wail(void) } } +/* once per game, if receiving a killing blow from above 90% HP, + allow the hero to survive with 1 HP */ +int +saving_grace(int dmg) +{ + if (!u.usaving_grace && (u.uhp <= dmg) + && (u.uhp * 100 / u.uhpmax) > 90) { + dmg = u.uhp - 1; + u.usaving_grace = TRUE; /* used up */ + } + return dmg; +} + void losehp(int n, const char *knam, schar k_format) { @@ -3734,6 +3747,7 @@ losehp(int n, const char *knam, schar k_format) return; } + n = saving_grace(n); u.uhp -= n; if (u.uhp > u.uhpmax) u.uhpmax = u.uhp; /* perhaps n was negative */ diff --git a/src/mhitu.c b/src/mhitu.c index 9d4e9ee6e..71c6ced2c 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -1753,6 +1753,7 @@ mdamageu(struct monst *mtmp, int n) if (u.mh < 1) rehumanize(); } else { + n = saving_grace(n); u.uhp -= n; if (u.uhp < 1) done_in_by(mtmp, DIED);