diff --git a/include/extern.h b/include/extern.h index 37466f9f8..8347989d5 100644 --- a/include/extern.h +++ b/include/extern.h @@ -605,7 +605,7 @@ E int NDECL(opentin); E int NDECL(unfaint); #endif E void FDECL(cprefx, (int, BOOLEAN_P, BOOLEAN_P)); -E void FDECL(cpostfx, (int, BOOLEAN_P, BOOLEAN_P)); +E void FDECL(cpostfx, (int, BOOLEAN_P, BOOLEAN_P, BOOLEAN_P)); E boolean FDECL(is_edible, (struct obj *)); E void NDECL(init_uhunger); E int NDECL(Hear_again); diff --git a/src/eat.c b/src/eat.c index 05ece1627..1f1c1dd04 100644 --- a/src/eat.c +++ b/src/eat.c @@ -29,7 +29,7 @@ STATIC_DCL struct obj *FDECL(touchfood, (struct obj *)); STATIC_DCL void NDECL(do_reset_eat); STATIC_DCL void FDECL(done_eating, (BOOLEAN_P)); STATIC_DCL int FDECL(intrinsic_possible, (int,struct permonst *)); -STATIC_DCL void FDECL(givit, (int,struct permonst *, unsigned short)); +STATIC_DCL void FDECL(givit, (int,struct permonst *, unsigned short, boolean)); STATIC_DCL void FDECL(start_tin, (struct obj *)); STATIC_DCL int FDECL(eatcorpse, (struct obj *)); STATIC_DCL void FDECL(start_eating, (struct obj *)); @@ -536,8 +536,7 @@ boolean message; "eating", food_xname(victual.piece, TRUE)); if(victual.piece->otyp == CORPSE) { - if (!victual.piece->odrained || (Race_if(PM_VAMPIRE) && !rn2(5))) - cpostfx(victual.piece->corpsenm, FALSE, FALSE); + cpostfx(victual.piece->corpsenm, FALSE, FALSE,!victual.piece->odrained); } else fpostfx(victual.piece); @@ -843,10 +842,11 @@ register struct permonst *ptr; * Energy resistence intrinsics time out now - CM */ STATIC_OVL void -givit(type, ptr, nutval) +givit(type, ptr, nutval, drained) int type; register struct permonst *ptr; unsigned short nutval; +boolean drained; { int chance = 0; //starts at 0. Changing it indicates a non-energy resistence int multiplier = 1; @@ -891,6 +891,9 @@ unsigned short nutval; break; } + if(chance && drained && rn2(5)) + return; /* drain chance */ + if (chance && ptr->mlevel <= rn2(chance)) return; /* failed die roll */ @@ -1090,9 +1093,9 @@ unsigned short nutval; } void -cpostfx(pm, tin, nobadeffects) /* called after completely consuming a corpse */ +cpostfx(pm, tin, nobadeffects, drained) /* called after completely consuming a corpse */ register int pm; -BOOLEAN_P tin, nobadeffects; +BOOLEAN_P tin, nobadeffects, drained; { register int tmp = 0; boolean catch_lycanthropy = FALSE; @@ -1104,7 +1107,7 @@ BOOLEAN_P tin, nobadeffects; switch(pm) { case PM_NEWT: /* MRKR: "eye of newt" may give small magical energy boost */ - if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { + if(!drained || !rn2(5)) if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { int old_uen = u.uen; u.uen += d(2,10); if (u.uen > u.uenmax) { @@ -1118,7 +1121,7 @@ BOOLEAN_P tin, nobadeffects; } break; case PM_AOA_DROPLET: //Aoas are drops of pure magic - if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { + if(!drained || !rn2(5)) if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { int old_uen = u.uen; u.uen += d(4,10); if (u.uen > u.uenmax) { @@ -1132,7 +1135,7 @@ BOOLEAN_P tin, nobadeffects; } break; case PM_AOA: //Aoas are drops of pure magic - if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { + if(!drained || !rn2(5)) if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { int old_uen = u.uen; int bonus = d(6,10); u.uen = u.uen + 10 > (u.uenmax - 40) ? u.uen + 10 : (u.uenmax - 40); @@ -1148,10 +1151,10 @@ BOOLEAN_P tin, nobadeffects; } break; case PM_WRAITH: - pluslvl(FALSE); + if(!drained || !rn2(5)) pluslvl(FALSE); break; case PM_DEEP_DRAGON: - pluslvl(FALSE); + if(!drained || !rn2(5)) pluslvl(FALSE); break; case PM_HUMAN_WERERAT: if(!nobadeffects){ @@ -1183,13 +1186,13 @@ BOOLEAN_P tin, nobadeffects; flags.botl = 1; break; case PM_SEWER_RAT: - if(!nobadeffects){ + if(!nobadeffects && !drained){ if(d(1,10) > 9 && !Sick_resistance) make_vomiting(Vomiting+d(10,4), TRUE); } break; case PM_RABID_RAT: if(!nobadeffects){ - if(d(1,20) > 19 && Sick_resistance){ + if(!rn2(20)){ if (!Sick_resistance) { char buf[BUFSZ]; long sick_time; @@ -1207,7 +1210,7 @@ BOOLEAN_P tin, nobadeffects; } break; case PM_STALKER: - if(!nobadeffects){ + if(!drained || !rn2(5)) if(!nobadeffects){ if(!Invis) { set_itimeout(&HInvis, (long)rn1(100, 50)); if (!Blind && !BInvis) self_invis_message(); @@ -1272,7 +1275,7 @@ BOOLEAN_P tin, nobadeffects; } break; case PM_GUG: - gainstr((struct obj *)0, 0); + if(!drained || !rn2(5)) gainstr((struct obj *)0, 0); break; case PM_MANDRAKE: case PM_LIZARD: @@ -1280,6 +1283,7 @@ BOOLEAN_P tin, nobadeffects; if (HConfusion > 2) make_confused(2L,FALSE); break; case PM_BEHOLDER: + if(!drained || !rn2(5)) { You(Hallucination ? "can see your own insides!" : "feel as though you can see the world from a whole new angle!"); if (!BClairvoyant) @@ -1289,6 +1293,7 @@ BOOLEAN_P tin, nobadeffects; You("sense a pointy hat on top of your %s.", body_part(HEAD)); incr_itimeout(&HClairvoyant, rn1(500,500)); + } break; case PM_CHAMELEON: case PM_DOPPELGANGER: @@ -1300,6 +1305,7 @@ BOOLEAN_P tin, nobadeffects; break; case PM_MIND_FLAYER: case PM_MASTER_MIND_FLAYER: + if(!drained || !rn2(5)) { if (ABASE(A_INT) < ATTRMAX(A_INT)) { if (!rn2(2)) { pline("Yum! That was real brain food!"); @@ -1310,6 +1316,7 @@ BOOLEAN_P tin, nobadeffects; else { pline("For some reason, that tasted bland."); } + } /* fall through to default case */ default: { register struct permonst *ptr = &mons[pm]; @@ -1320,7 +1327,8 @@ BOOLEAN_P tin, nobadeffects; pline ("Oh wow! Great stuff!"); make_hallucinated(HHallucination + 200,FALSE,0L); } - if(is_giant(ptr)) gainstr((struct obj *)0, 0); + + if(!drained || !rn2(5)) if(is_giant(ptr)) gainstr((struct obj *)0, 0); /* Check the monster for all of the intrinsics. If this * monster can give more than one, pick one to try to give @@ -1348,8 +1356,8 @@ BOOLEAN_P tin, nobadeffects; for (i = 1; i <= LAST_PROP; i++) { if (intrinsic_possible(i, ptr)) { count++; - if(u.sealsActive&SEAL_AHAZU) givit(i, ptr, (tin && ptr->cnutrit > 45) ? 45 : ptr->cnutrit*0.9); - else givit(i, ptr, (tin && ptr->cnutrit > 50) ? 50 : ptr->cnutrit); + if(u.sealsActive&SEAL_AHAZU) givit(i, ptr, (tin && ptr->cnutrit > 45) ? 45 : ptr->cnutrit*0.9, drained); + else givit(i, ptr, (tin && ptr->cnutrit > 50) ? 50 : ptr->cnutrit, drained); } } @@ -1470,7 +1478,7 @@ opentin() /* called during each move whilst opening a tin */ You("drain energy from %s %s.", tintxts[r].txt, mons[tin.tin->corpsenm].mname); cprefx(tin.tin->corpsenm, TRUE, FALSE); - cpostfx(tin.tin->corpsenm, FALSE, FALSE); + cpostfx(tin.tin->corpsenm, FALSE, FALSE, FALSE); costly_tin((const char*)0); goto use_me; } @@ -1494,7 +1502,7 @@ opentin() /* called during each move whilst opening a tin */ tin.tin->dknown = tin.tin->known = TRUE; cprefx(tin.tin->corpsenm, FALSE, FALSE); - cpostfx(tin.tin->corpsenm, TRUE, FALSE); + cpostfx(tin.tin->corpsenm, TRUE, FALSE, FALSE); /* charge for one at pre-eating cost */ costly_tin((const char*)0); @@ -2587,7 +2595,7 @@ doeat() /* generic "eat" command funtion (see cmd.c) */ u.uconduct.food++; You("drain the %s.", xname(otmp)); cprefx(otmp->corpsenm, TRUE, FALSE); - cpostfx(otmp->corpsenm, FALSE, FALSE); + cpostfx(otmp->corpsenm, FALSE, FALSE, !otmp->odrained); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); } diff --git a/src/potion.c b/src/potion.c index 67c25818b..10689587e 100644 --- a/src/potion.c +++ b/src/potion.c @@ -989,7 +989,7 @@ as_extra_healing: //Note: clockworks that use potions of blood as oil gain the intrinsics! //Incantifiers likewise gain intrinsics but not nutrition. cprefx(otmp->corpsenm, TRUE, FALSE); - cpostfx(otmp->corpsenm, FALSE, FALSE); + cpostfx(otmp->corpsenm, FALSE, FALSE, FALSE); break; default: impossible("What a funny potion! (%u)", otmp->otyp); diff --git a/src/spell.c b/src/spell.c index 1bb06199e..3c1a75b1f 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1362,7 +1362,7 @@ spiriteffects(power, atme) int value = min(monstr[monsndx(mon->data)] + 1,MAXVALUE); Your("shadow flows under %s, swallowing %s up!",mon_nam(mon),mhim(mon)); cprefx(monsndx(mon->data), TRUE, TRUE); - cpostfx(monsndx(mon->data), FALSE, TRUE); + cpostfx(monsndx(mon->data), FALSE, TRUE, FALSE); if(u.ugangr) { u.ugangr -= ((value * (u.ualign.type == A_CHAOTIC ? 2 : 3)) / MAXVALUE); if(u.ugangr < 0) u.ugangr = 0; diff --git a/src/uhitm.c b/src/uhitm.c index f5928e598..9eb92de42 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -556,7 +556,7 @@ register struct monst *mtmp; int value = min(monstr[monsndx(mtmp->data)] + 1,MAXVALUE); pline("%s sinks into your deep black shadow!", Monnam(mtmp)); cprefx(monsndx(mtmp->data), TRUE, TRUE); - cpostfx(monsndx(mtmp->data), FALSE, TRUE); + cpostfx(monsndx(mtmp->data), FALSE, TRUE, FALSE); if(u.ugangr) { u.ugangr -= ((value * (u.ualign.type == A_CHAOTIC ? 2 : 3)) / MAXVALUE); if(u.ugangr < 0) u.ugangr = 0;