diff -Nabru nethack-src-3.4.1/include/config.h vladb-nethack-src-3.4.1/include/config.h --- nethack-src-3.4.1/include/config.h 2003-02-23 14:43:20.000000000 +0000 +++ vladb-nethack-src-3.4.1/include/config.h 2003-07-09 11:20:58.000000000 +0000 @@ -327,6 +327,9 @@ #define SEDUCE /* Succubi/incubi seduction, by KAA, suggested by IM */ #define STEED /* Riding steeds */ #define TOURIST /* Tourist players with cameras and Hawaiian shirts */ +#define TOUGHVLAD /* Vlad Balance patch 0.3, by CWC, suggestions by DACOD and JAH */ +/* #define MENTALPLYS */ /* Mental paralysis attacks yielding WIS saving throw by CWC */ + /* difficulty */ #define ELBERETH /* Engraving the E-word repels monsters */ /* I/O */ diff -Nabru nethack-src-3.4.1/include/monattk.h vladb-nethack-src-3.4.1/include/monattk.h --- nethack-src-3.4.1/include/monattk.h 2003-02-23 14:43:22.000000000 +0000 +++ vladb-nethack-src-3.4.1/include/monattk.h 2003-07-09 11:20:58.000000000 +0000 @@ -48,36 +48,37 @@ #define AD_BLND 11 /* blinds (yellow light) */ #define AD_STUN 12 /* stuns */ #define AD_SLOW 13 /* slows */ -#define AD_PLYS 14 /* paralyses */ -#define AD_DRLI 15 /* drains life levels (Vampire) */ -#define AD_DREN 16 /* drains magic energy */ -#define AD_LEGS 17 /* damages legs (xan) */ -#define AD_STON 18 /* petrifies (Medusa, cockatrice) */ -#define AD_STCK 19 /* sticks to you (mimic) */ -#define AD_SGLD 20 /* steals gold (leppie) */ -#define AD_SITM 21 /* steals item (nymphs) */ -#define AD_SEDU 22 /* seduces & steals multiple items */ -#define AD_TLPT 23 /* teleports you (Quantum Mech.) */ -#define AD_RUST 24 /* rusts armour (Rust Monster)*/ -#define AD_CONF 25 /* confuses (Umber Hulk) */ -#define AD_DGST 26 /* digests opponent (trapper, etc.) */ -#define AD_HEAL 27 /* heals opponent's wounds (nurse) */ -#define AD_WRAP 28 /* special "stick" for eels */ -#define AD_WERE 29 /* confers lycanthropy */ -#define AD_DRDX 30 /* drains dexterity (quasit) */ -#define AD_DRCO 31 /* drains constitution */ -#define AD_DRIN 32 /* drains intelligence (mind flayer) */ -#define AD_DISE 33 /* confers diseases */ -#define AD_DCAY 34 /* decays organics (brown Pudding) */ -#define AD_SSEX 35 /* Succubus seduction (extended) */ +#define AD_PLYS 14 /* paralyses (physically) */ +#define AD_PLYM 15 /* paralyses (mentally) */ +#define AD_DRLI 16 /* drains life levels (Vampire) */ +#define AD_DREN 17 /* drains magic energy */ +#define AD_LEGS 18 /* damages legs (xan) */ +#define AD_STON 19 /* petrifies (Medusa, cockatrice) */ +#define AD_STCK 20 /* sticks to you (mimic) */ +#define AD_SGLD 21 /* steals gold (leppie) */ +#define AD_SITM 22 /* steals item (nymphs) */ +#define AD_SEDU 23 /* seduces & steals multiple items */ +#define AD_TLPT 24 /* teleports you (Quantum Mech.) */ +#define AD_RUST 25 /* rusts armour (Rust Monster)*/ +#define AD_CONF 26 /* confuses (Umber Hulk) */ +#define AD_DGST 27 /* digests opponent (trapper, etc.) */ +#define AD_HEAL 28 /* heals opponent's wounds (nurse) */ +#define AD_WRAP 29 /* special "stick" for eels */ +#define AD_WERE 30 /* confers lycanthropy */ +#define AD_DRDX 31 /* drains dexterity (quasit) */ +#define AD_DRCO 32 /* drains constitution */ +#define AD_DRIN 33 /* drains intelligence (mind flayer) */ +#define AD_DISE 34 /* confers diseases */ +#define AD_DCAY 35 /* decays organics (brown Pudding) */ +#define AD_SSEX 36 /* Succubus seduction (extended) */ /* If no SEDUCE then same as AD_SEDU */ -#define AD_HALU 36 /* causes hallucination */ -#define AD_DETH 37 /* for Death only */ -#define AD_PEST 38 /* for Pestilence only */ -#define AD_FAMN 39 /* for Famine only */ -#define AD_SLIM 40 /* turns you into green slime */ -#define AD_ENCH 41 /* remove enchantment (disenchanter) */ -#define AD_CORR 42 /* corrode armor (black pudding) */ +#define AD_HALU 37 /* causes hallucination */ +#define AD_DETH 38 /* for Death only */ +#define AD_PEST 39 /* for Pestilence only */ +#define AD_FAMN 40 /* for Famine only */ +#define AD_SLIM 41 /* turns you into green slime */ +#define AD_ENCH 42 /* remove enchantment (disenchanter) */ +#define AD_CORR 43 /* corrode armor (black pudding) */ #define AD_CLRC 240 /* random clerical spell */ #define AD_SPEL 241 /* random magic spell */ diff -Nabru nethack-src-3.4.1/src/mhitm.c vladb-nethack-src-3.4.1/src/mhitm.c --- nethack-src-3.4.1/src/mhitm.c 2003-02-23 14:43:28.000000000 +0000 +++ vladb-nethack-src-3.4.1/src/mhitm.c 2003-07-09 11:20:58.000000000 +0000 @@ -868,6 +868,30 @@ mdef->mstrategy &= ~STRAT_WAITFORU; } break; +#ifdef MENTALPLYS + /* mental paralysis attack - CWC */ + case AD_PLYM: + if(!magr->mcan && mdef->mcanmove) { + if (vis && !mindless(mdef->data) && !is_covetous(mdef->data)) { + /* mental paralysis does not work against mindless creatures + * Also does not work against covetous monsters - inelegant hack to + * disallow paralysis of certain "strong" monsters such as the Wiz + * Ideally this would want a WIS saving throw but... + * + * If successful, the monster is paralysed for rnd(damn) turns + * This relies on the fact that PLYM attacks do *no* physical damage + * + * Note that AD_PLYM should never be a *physical* attack (bite, claw etc) + * as it simply makes no sense - use AD_PLYS instead + */ + Strcpy(buf, Monnam(mdef)); + pline("%s is frozen by %s.", buf, mon_nam(magr)); + } + mdef->mcanmove = 0; + mdef->mfrozen = rnd(((int)mattk->damd)+1); + } + break; +#endif case AD_SLOW: if (!cancelled && mdef->mspeed != MSLOW) { unsigned int oldspeed = mdef->mspeed; @@ -1305,6 +1329,9 @@ /* These affect the enemy only if defender is still alive */ if (rn2(3)) switch(mddat->mattk[i].adtyp) { +#ifdef MENTALPLYS + case AD_PLYS: /* Gelatinous cubes, etc */ +#else case AD_PLYS: /* Floating eye */ if (tmp > 127) tmp = 127; if (mddat == &mons[PM_FLOATING_EYE]) { @@ -1325,14 +1352,37 @@ return (mdead|mhit); } } else { /* gelatinous cube */ +#endif Strcpy(buf, Monnam(magr)); if(canseemon(magr)) pline("%s is frozen by %s.", buf, mon_nam(mdef)); magr->mcanmove = 0; magr->mfrozen = tmp; return (mdead|mhit); +#ifndef MENTALPLYS + } +#endif + return 1; + +#ifdef MENTALPLYS + case AD_PLYM: /* Floating eyes */ + if (magr->mcansee && haseyes(madat) && mdef->mcansee && + (perceives(madat) || !mdef->minvis)) { + Sprintf(buf, "%s gaze is reflected by %%s %%s.", + s_suffix(mon_nam(mdef))); + if (mon_reflects(magr, + canseemon(magr) ? buf : (char *)0)) + return(mdead|mhit); + Strcpy(buf, Monnam(magr)); + if(canseemon(magr)) + pline("%s is mesmerised by %s gaze!", + buf, s_suffix(mon_nam(mdef))); + magr->mcanmove = 0; + magr->mfrozen = rnd(((int)mddat->mattk[i].damd)+1); + return (mdead|mhit); } return 1; +#endif case AD_COLD: if (resists_cold(magr)) { if (canseemon(magr)) { diff -Nabru nethack-src-3.4.1/src/mhitu.c vladb-nethack-src-3.4.1/src/mhitu.c --- nethack-src-3.4.1/src/mhitu.c 2003-02-23 14:43:28.000000000 +0000 +++ vladb-nethack-src-3.4.1/src/mhitu.c 2003-07-09 11:20:58.000000000 +0000 @@ -1105,7 +1105,12 @@ break; case AD_DRLI: hitmsg(mtmp, mattk); +#ifdef TOUGHVLAD + if ((uncancelled || mdat == &mons[PM_VLAD_THE_IMPALER]) && !rn2(3) && !Drain_resistance) { + /* Boosted up by Vlad balance patch - CWC */ +#else if (uncancelled && !rn2(3) && !Drain_resistance) { +#endif losexp("life drainage"); } break; @@ -1855,6 +1860,41 @@ register struct attack *mattk; { switch(mattk->adtyp) { +#ifdef TOUGHVLAD +#ifdef MENTALPLYS + case AD_PLYM: + /* For Vlad The Impaler - Vlad Balance Patch CWC + * This is a mental paralysis - distinct from the physical AD_PLYS + * + * free action and cancellation does not help here - this is intentional + * only takes effect if you can see the monster, the monster can see you and + * you aren't already paralysed - player has a (potentially) modified + * WIS saving throw (mental) based on damd + * If successful, the monster is paralysed for d(damn) turns + * + * This relies on the fact that PLYM attacks do *no* physical damage + * + * Note that AD_PLYM should never be a *physical* attack (bite, claw etc) + * as it simply makes no sense - use AD_PLYS instead + */ + if(!mtmp->mcan && canseemon(mtmp) && (multi >= 0) && mtmp->mcansee && (rnd(20) > (ACURR(A_WIS) - (int)mattk->damd))) { + You("are mesmerised by %s gaze!", s_suffix(Monnam(mtmp))); + nomovemsg = 0; /* default: "you can move again" */ + nomul(-rnd(((int)mattk->damd)+1)); + exercise(A_DEX, FALSE); + } + break; +#else + case AD_PLYS: /* Default case for Vlad The Impaler if MENTALPLYS is not defined */ + if(!mtmp->mcan && canseemon(mtmp) && (multi >= 0) && mtmp->mcansee && (rnd(20) > (ACURR(A_WIS) - (int)mattk->damd))) { + You("are mesmerised by %s gaze!", s_suffix(Monnam(mtmp))); + nomovemsg = 0; /* default: "you can move again" */ + nomul(-rnd(4)); + exercise(A_DEX, FALSE); + } + break; +#endif +#endif case AD_STON: if (mtmp->mcan || !mtmp->mcansee) { if (mtmp->data == &mons[PM_MEDUSA] && canseemon(mtmp)) { diff -Nabru nethack-src-3.4.1/src/monmove.c vladb-nethack-src-3.4.1/src/monmove.c --- nethack-src-3.4.1/src/monmove.c 2003-02-23 14:43:28.000000000 +0000 +++ vladb-nethack-src-3.4.1/src/monmove.c 2003-07-09 11:23:40.000000000 +0000 @@ -133,6 +133,10 @@ if (mtmp->isshk || mtmp->isgd || mtmp->iswiz || !mtmp->mcansee || mtmp->mpeaceful || mtmp->data->mlet == S_HUMAN || is_lminion(mtmp) || mtmp->data == &mons[PM_ANGEL] || +#ifdef TOUGHVLAD + /* Vlad ignores Elbereth/Scare Monster/Garlic */ + mtmp->data == &mons[PM_VLAD_THE_IMPALER] || +#endif is_rider(mtmp->data) || mtmp->data == &mons[PM_MINOTAUR]) return(FALSE); diff -Nabru nethack-src-3.4.1/src/monst.c vladb-nethack-src-3.4.1/src/monst.c --- nethack-src-3.4.1/src/monst.c 2003-02-23 14:43:28.000000000 +0000 +++ vladb-nethack-src-3.4.1/src/monst.c 2003-07-09 11:20:58.000000000 +0000 @@ -319,6 +319,15 @@ SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_FLY|M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), +#ifdef MENTALPLYS + MON("floating eye", S_EYE, + LVL(2, 1, 9, 10, 0), (G_GENO|5), + A(ATTK(AT_NONE, AD_PLYM, 0,115), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, + M1_FLY|M1_AMPHIBIOUS|M1_NOLIMBS|M1_NOHEAD|M1_NOTAKE, + M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), +#else MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO|5), A(ATTK(AT_NONE, AD_PLYS, 0,70), @@ -326,6 +335,7 @@ SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_FLY|M1_AMPHIBIOUS|M1_NOLIMBS|M1_NOHEAD|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), +#endif MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_NOHELL|G_GENO|2), A(ATTK(AT_EXPL, AD_COLD, 4, 6), @@ -2012,6 +2022,30 @@ M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_LORD|M2_MALE| M2_MAGIC, M3_INFRAVISIBLE, HI_ZAP), #endif +#ifdef TOUGHVLAD + /* Vlad Balance Patch - CWC */ +# ifdef MENTALPLYS + MON("Vlad the Impaler", S_VAMPIRE, + LVL(28, 24, -6, 80, -10), (G_NOGEN|G_NOCORPSE|G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12), + ATTK(AT_GAZE, AD_PLYM, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, + M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, + M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| + M2_NASTY|M2_PRINCE|M2_MALE, + M3_WAITFORU|M3_WANTSCAND|M3_INFRAVISIBLE, HI_LORD), +# else + MON("Vlad the Impaler", S_VAMPIRE, + LVL(28, 24, -6, 80, -10), (G_NOGEN|G_NOCORPSE|G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12), + ATTK(AT_GAZE, AD_PLYS, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, + M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, + M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| + M2_NASTY|M2_PRINCE|M2_MALE, + M3_WAITFORU|M3_WANTSCAND|M3_INFRAVISIBLE, HI_LORD), +# endif +#else MON("Vlad the Impaler", S_VAMPIRE, LVL(14, 18, -3, 80, -10), (G_NOGEN|G_NOCORPSE|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_DRLI, 1, 10), @@ -2021,6 +2055,7 @@ M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| M2_NASTY|M2_PRINCE|M2_MALE, M3_WAITFORU|M3_WANTSCAND|M3_INFRAVISIBLE, HI_LORD), +#endif /* * Wraiths */ diff -Nabru nethack-src-3.4.1/src/uhitm.c vladb-nethack-src-3.4.1/src/uhitm.c --- nethack-src-3.4.1/src/uhitm.c 2003-02-23 14:43:32.000000000 +0000 +++ vladb-nethack-src-3.4.1/src/uhitm.c 2003-07-09 11:20:58.000000000 +0000 @@ -2212,6 +2212,7 @@ switch(ptr->mattk[i].adtyp) { case AD_PLYS: +#ifndef MENTALPLYS if(ptr == &mons[PM_FLOATING_EYE]) { if (!canseemon(mon)) { break; @@ -2233,15 +2234,42 @@ Adjmonnam(mon,"blind")); if(!rn2(500)) change_luck(-1); } - } else if (Free_action) { + } else +#endif + if (Free_action) { You("momentarily stiffen."); } else { /* gelatinous cube */ You("are frozen by %s!", mon_nam(mon)); nomovemsg = 0; /* default: "you can move again" */ nomul(-tmp); exercise(A_DEX, FALSE); +#ifndef MENTALPLYS } +#endif break; +#ifdef MENTALPLYS + case AD_PLYM: + /* This is a mental paralysis - distinct from the physical AD_PLYS + * + * free action and cancellation does not help here - this is intentional + * only takes effect if you can see the monster, the monster can see you and + * you aren't already paralysed - player has a (potentially) modified + * WIS saving throw (mental) based on damd + * If successful, the monster is paralysed for d(damn) turns + * + * This relies on the fact that PLYM attacks do *no* physical damage + * + * Note that AD_PLYM should never be a *physical* attack (bite, claw etc) + * as it simply makes no sense - use AD_PLYS instead + */ + if(!mon->mcan && canseemon(mon) && (multi >= 0) && mon->mcansee && (rnd(20) > (ACURR(A_WIS) - (int)ptr->mattk[i].damn))) { + You("are mesmerised by %s gaze!", s_suffix(Monnam(mon))); + nomovemsg = 0; /* default: "you can move again" */ + nomul(-rnd(((int)ptr->mattk[i].damd)+1)); + exercise(A_DEX, FALSE); + } + break; +#endif case AD_COLD: /* brown mold or blue jelly */ if(monnear(mon, u.ux, u.uy)) { if(Cold_resistance) { diff -Nabru nethack-src-3.4.1/util/makedefs.c vladb-nethack-src-3.4.1/util/makedefs.c --- nethack-src-3.4.1/util/makedefs.c 2003-02-23 14:43:44.000000000 +0000 +++ vladb-nethack-src-3.4.1/util/makedefs.c 2003-07-09 11:20:58.000000000 +0000 @@ -736,6 +736,9 @@ "user sounds via pmatch", # endif #endif +#ifdef TOUGHVLAD + "Vlad balance patch", +#endif #ifdef PREFIXES_IN_USE "variable playground", #endif