Merge remote-tracking branch 'origin/NetHack-3.6.0'

This commit is contained in:
keni
2017-08-15 07:59:38 -04:00
51 changed files with 2521 additions and 1573 deletions

View File

@@ -13,6 +13,7 @@
#ifdef POSITIONBAR
STATIC_DCL void NDECL(do_positionbar);
#endif
STATIC_DCL void FDECL(regen_hp, (int));
STATIC_DCL void FDECL(interrupt_multi, (const char *));
void
@@ -185,66 +186,20 @@ boolean resuming;
/* One possible result of prayer is healing. Whether or
* not you get healed depends on your current hit points.
* If you are allowed to regenerate during the prayer, the
* end-of-prayer calculation messes up on this.
* If you are allowed to regenerate during the prayer,
* the end-of-prayer calculation messes up on this.
* Another possible result is rehumanization, which
* requires
* that encumbrance and movement rate be recalculated.
* requires that encumbrance and movement rate be
* recalculated.
*/
if (u.uinvulnerable) {
/* for the moment at least, you're in tiptop shape */
wtcap = UNENCUMBERED;
} else if (Upolyd && youmonst.data->mlet == S_EEL
&& !is_pool(u.ux, u.uy)
&& !Is_waterlevel(&u.uz)) {
/* eel out of water loses hp, same as for monsters;
as hp gets lower, rate of further loss slows down
*/
if (u.mh > 1 && rn2(u.mh) > rn2(8)
&& (!Half_physical_damage || !(moves % 2L))) {
u.mh--;
context.botl = 1;
} else if (u.mh < 1)
rehumanize();
} else if (Upolyd && u.mh < u.mhmax) {
if (u.mh < 1)
rehumanize();
else if (Regeneration
|| (wtcap < MOD_ENCUMBER && !(moves % 20))) {
context.botl = 1;
u.mh++;
if (u.mh >= u.mhmax)
interrupt_multi("You are in full health.");
}
} else if (u.uhp < u.uhpmax
&& (wtcap < MOD_ENCUMBER || !u.umoved
|| Regeneration)) {
if (u.ulevel > 9 && !(moves % 3)) {
int heal, Con = (int) ACURR(A_CON);
if (Con <= 12) {
heal = 1;
} else {
heal = rnd(Con);
if (heal > u.ulevel - 9)
heal = u.ulevel - 9;
}
context.botl = 1;
u.uhp += heal;
if (u.uhp > u.uhpmax)
u.uhp = u.uhpmax;
if (u.uhp >= u.uhpmax)
interrupt_multi("You are in full health.");
} else if (Regeneration
|| (u.ulevel <= 9
&& !(moves
% ((MAXULEV + 12) / (u.ulevel + 2)
+ 1)))) {
context.botl = 1;
u.uhp++;
if (u.uhp >= u.uhpmax)
interrupt_multi("You are in full health.");
}
} else if (!Upolyd ? (u.uhp < u.uhpmax)
: (u.mh < u.mhmax
|| youmonst.data->mlet == S_EEL)) {
/* maybe heal */
regen_hp(wtcap);
}
/* moving around while encumbered is hard work */
@@ -263,7 +218,7 @@ boolean resuming;
}
}
if ((u.uen < u.uenmax)
if (u.uen < u.uenmax
&& ((wtcap < MOD_ENCUMBER
&& (!(moves % ((MAXULEV + 8 - u.ulevel)
* (Role_if(PM_WIZARD) ? 3 : 4)
@@ -273,7 +228,7 @@ boolean resuming;
if (u.uen > u.uenmax)
u.uen = u.uenmax;
context.botl = 1;
if (u.uen >= u.uenmax)
if (u.uen == u.uenmax)
interrupt_multi("You feel full of energy.");
}
@@ -493,6 +448,76 @@ boolean resuming;
}
}
/* maybe recover some lost health (or lose some when an eel out of water) */
STATIC_OVL void
regen_hp(wtcap)
int wtcap;
{
int heal = 0;
boolean reached_full = FALSE,
encumbrance_ok = (wtcap < MOD_ENCUMBER || !u.umoved);
if (Upolyd) {
if (u.mh < 1) { /* shouldn't happen... */
rehumanize();
} else if (youmonst.data->mlet == S_EEL
&& !is_pool(u.ux, u.uy) && !Is_waterlevel(&u.uz)) {
/* eel out of water loses hp, similar to monster eels;
as hp gets lower, rate of further loss slows down */
if (u.mh > 1 && !Regeneration && rn2(u.mh) > rn2(8)
&& (!Half_physical_damage || !(moves % 2L)))
heal = -1;
} else if (u.mh < u.mhmax) {
if (Regeneration || (encumbrance_ok && !(moves % 20L)))
heal = 1;
}
if (heal) {
context.botl = 1;
u.mh += heal;
reached_full = (u.mh == u.mhmax);
}
/* !Upolyd */
} else {
/* [when this code was in-line within moveloop(), there was
no !Upolyd check here, so poly'd hero recovered lost u.uhp
once u.mh reached u.mhmax; that may have been convenient
for the player, but it didn't make sense for gameplay...] */
if (u.uhp < u.uhpmax && (encumbrance_ok || Regeneration)) {
if (u.ulevel > 9) {
if (!(moves % 3L)) {
int Con = (int) ACURR(A_CON);
if (Con <= 12) {
heal = 1;
} else {
heal = rnd(Con);
if (heal > u.ulevel - 9)
heal = u.ulevel - 9;
}
}
} else { /* u.ulevel <= 9 */
if (!(moves % (long) ((MAXULEV + 12) / (u.ulevel + 2) + 1)))
heal = 1;
}
if (Regeneration && !heal)
heal = 1;
if (heal) {
context.botl = 1;
u.uhp += heal;
if (u.uhp > u.uhpmax)
u.uhp = u.uhpmax;
/* stop voluntary multi-turn activity if now fully healed */
reached_full = (u.uhp == u.uhpmax);
}
}
}
if (reached_full)
interrupt_multi("You are in full health.");
}
void
stop_occupation()
{
@@ -561,7 +586,7 @@ newgame()
context.tribute.enabled = TRUE; /* turn on 3.6 tributes */
context.tribute.tributesz = sizeof(struct tribute_info);
for (i = 0; i < NUMMONS; i++)
for (i = LOW_PM; i < NUMMONS; i++)
mvitals[i].mvflags = mons[i].geno & G_NOCORPSE;
init_objects(); /* must be before u_init() */