The “I’m not a wimp and here’s my proof” conduct patch This patch determines if you’ve ever caused a conflict, instantly killed a monster or ever wore an amulet of lifesaving as (separate) conducts. Now see if you can ascend... Please send me any feedback/bugs you have! Chris Becker topher@csh.rit.edu More bug fixes and patches can be found at http://www.csh.rit.edu/~topher/nethack diff -aur orig-nethack-3.4.3/include/config.h nethack-3.4.3/include/config.h --- orig-nethack-3.4.3/include/config.h 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/include/config.h 2004-01-09 19:31:15.000000000 -0500 @@ -340,6 +340,16 @@ #define EXP_ON_BOTL /* Show experience on bottom line */ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */ +/* The "I'm not a wimp and here's my proof" conducts. + * Checks to see if you ever caused conflicts, instantly killed + * a monster or worn an amulet. + * Chris Becker (topher@csh.rit.edu) + */ + +#define CONFLICT_CONDUCT +#define INSTADEATH_CONDUCT +#define AMULET_CONDUCT + /* * Section 5: EXPERIMENTAL STUFF * diff -aur orig-nethack-3.4.3/include/you.h nethack-3.4.3/include/you.h --- orig-nethack-3.4.3/include/you.h 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/include/you.h 2004-01-09 19:32:34.000000000 -0500 @@ -69,6 +69,16 @@ long polyselfs; /* transformed yourself */ long wishes; /* used a wish */ long wisharti; /* wished for an artifact */ +#ifdef CONFLICT_CONDUCT + long conflicts; +#endif +#ifdef INSTADEATH_CONDUCT + long instadeaths; + long instadeathsind; +#endif +#ifdef AMULET_CONDUCT + long amulets; +#endif /* genocides already listed at end of game */ }; diff -aur orig-nethack-3.4.3/src/artifact.c nethack-3.4.3/src/artifact.c --- orig-nethack-3.4.3/src/artifact.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/artifact.c 2004-01-09 19:15:29.000000000 -0500 @@ -1026,6 +1026,9 @@ if (youattack && u.uswallow && mdef == u.ustuck) { You("slice %s wide open!", mon_nam(mdef)); *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif return TRUE; } if (!youdefend) { @@ -1046,6 +1049,9 @@ *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; pline("%s cuts %s in half!", wepdesc, mon_nam(mdef)); otmp->dknown = TRUE; +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif return TRUE; } else { if (bigmonst(youmonst.data)) { @@ -1095,6 +1101,9 @@ *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; pline(behead_msg[rn2(SIZE(behead_msg))], wepdesc, mon_nam(mdef)); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif otmp->dknown = TRUE; return TRUE; } else { diff -aur orig-nethack-3.4.3/src/cmd.c nethack-3.4.3/src/cmd.c --- orig-nethack-3.4.3/src/cmd.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/cmd.c 2004-01-09 19:29:21.000000000 -0500 @@ -1336,6 +1336,50 @@ " for any artifacts"); } +#ifdef CONFLICT_CONDUCT + if (!u.uconduct.conflicts){ + you_have_X("never caused a conflict"); + } else { + if ( u.uconduct.conflicts >= 10000L ) { + you_are( "the opposition of peace" ); + } else { + Sprintf(buf, "caused %s conflict%s", + u.uconduct.conflicts >= 1000L ? "devastating" : + u.uconduct.conflicts >= 300L ? "excessive" : + u.uconduct.conflicts >= 100L ? "numerous" : + u.uconduct.conflicts > 1L ? "several" : + "one", (u.uconduct.conflicts > 1L) ? "s" : "" ); + + you_have_X(buf); + } + + } +#endif + +#ifdef INSTADEATH_CONDUCT + if (!ngenocided) + if (!u.uconduct.instadeaths && !u.uconduct.instadeathsind) { + you_have_X("never instantly killed a creature"); + } else { + if (u.uconduct.instadeaths) { + Sprintf(buf, "instantly killed %ld creature%s", u.uconduct.instadeaths, + (u.uconduct.instadeaths > 1L) ? "s" : "" ); + you_have_X(buf); + } + if (u.uconduct.instadeathsind) { + Sprintf(buf, "caused %ld indirect instant death%s", u.uconduct.instadeathsind, + (u.uconduct.instadeathsind> 1L) ? "s" : "" ); + you_have_X(buf); + } + } +#endif + +#ifdef AMULET_CONDUCT + if (!u.uconduct.amulets) { + you_have_X("never worn an amulet" ); + } +#endif + /* Pop up the window and wait for a key */ display_nhwindow(en_win, TRUE); destroy_nhwindow(en_win); diff -aur orig-nethack-3.4.3/src/dbridge.c nethack-3.4.3/src/dbridge.c --- orig-nethack-3.4.3/src/dbridge.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/dbridge.c 2004-01-09 19:15:30.000000000 -0500 @@ -420,7 +420,14 @@ if (flags.mon_moving) monkilled(etmp->emon, mk_message(dest), mk_corpse(dest)); else /* you caused it */ +#ifdef INSTADEATH_CONDUCT + { + u.uconduct.instadeaths++; + xkilled(etmp->emon, dest); + } +#else xkilled(etmp->emon, dest); +#endif etmp->edata = (struct permonst *)0; /* dead long worm handling */ diff -aur orig-nethack-3.4.3/src/do.c nethack-3.4.3/src/do.c --- orig-nethack-3.4.3/src/do.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/do.c 2004-01-09 19:15:30.000000000 -0500 @@ -1385,6 +1385,10 @@ mm.x, mm.y, FALSE); } +#ifdef CONFLICT_CONDUCT + u.uconduct.conflicts++; +#endif + } else if (u.ualign.record > 8) { /* fervent */ pline("A voice whispers: \"Thou hast been worthy of me!\""); mm.x = u.ux; diff -aur orig-nethack-3.4.3/src/do_wear.c nethack-3.4.3/src/do_wear.c --- orig-nethack-3.4.3/src/do_wear.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/do_wear.c 2004-01-09 19:32:34.000000000 -0500 @@ -577,6 +577,10 @@ STATIC_OVL void Amulet_on() { +#ifdef AMULET_CONDUCT + u.uconduct.amulets++; +#endif + switch(uamul->otyp) { case AMULET_OF_ESP: case AMULET_OF_LIFE_SAVING: diff -aur orig-nethack-3.4.3/src/dogmove.c nethack-3.4.3/src/dogmove.c --- orig-nethack-3.4.3/src/dogmove.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/dogmove.c 2004-01-09 19:15:30.000000000 -0500 @@ -564,6 +564,10 @@ (void) mk_roamer(&mons[PM_ANGEL], u.ualign.type, mm.x, mm.y, FALSE); } + +#ifdef CONFLICT_CONDUCT + u.uconduct.conflicts++; +#endif return(2); } diff -aur orig-nethack-3.4.3/src/explode.c nethack-3.4.3/src/explode.c --- orig-nethack-3.4.3/src/explode.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/explode.c 2004-01-09 19:15:30.000000000 -0500 @@ -303,6 +303,11 @@ /* KMH -- Don't blame the player for pets killing gas spores */ if (!flags.mon_moving) killed(mtmp); else monkilled(mtmp, "", (int)adtyp); +#ifdef INSTADEATH_CONDUCT + /* increment if this was a wand of death exploding */ + if (olet == WAND_CLASS && adtyp == AD_DISN ) + u.uconduct.instadeaths++; +#endif } else if (!flags.mon_moving) setmangry(mtmp); } diff -aur orig-nethack-3.4.3/src/mhitm.c nethack-3.4.3/src/mhitm.c --- orig-nethack-3.4.3/src/mhitm.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/mhitm.c 2004-01-09 19:15:30.000000000 -0500 @@ -608,6 +608,13 @@ return MM_HIT; /* no damage during the polymorph */ } if (vis) pline("%s turns to stone!", Monnam(magr)); +#ifdef INSTADEATH_CONDUCT + /* an unconfused monster attacked a stoning creature + * this happens when your pet is stoning or the monster + * is under conflict + */ + if (!magr->mconf && (Conflict || mdef->mtame) ) u.uconduct.instadeathsind++; +#endif monstone(magr); if (magr->mhp > 0) return 0; else if (magr->mtame && !vis) @@ -632,6 +639,11 @@ "coughs spasmodically and collapses" : "vomits violently and drops dead"); mondied(magr); +#ifdef INSTADEATH_CONDUCT + /* an unconfused monster under conflict or your pet ate a rider */ + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif if (magr->mhp > 0) return 0; /* lifesaved */ else if (magr->mtame && !vis) You(brief_feeling, "queasy"); @@ -639,6 +651,11 @@ } if(flags.verbose && flags.soundok) verbalize("Burrrrp!"); tmp = mdef->mhp; +#ifdef INSTADEATH_CONDUCT + /* an unconfused monster under conflict ate a rider */ + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif /* Use up amulet of life saving */ if (!!(obj = mlifesaver(mdef))) m_useup(mdef, obj); @@ -722,6 +739,10 @@ pd == &mons[PM_PAPER_GOLEM]) { if (vis) pline("%s burns completely!", Monnam(mdef)); mondied(mdef); +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s roast in peace.", mon_nam(mdef)); @@ -795,6 +816,10 @@ if (pd == &mons[PM_IRON_GOLEM]) { if (vis) pline("%s falls to pieces!", Monnam(mdef)); mondied(mdef); +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s rust in peace.", mon_nam(mdef)); @@ -817,6 +842,10 @@ pd == &mons[PM_LEATHER_GOLEM]) { if (vis) pline("%s falls to pieces!", Monnam(mdef)); mondied(mdef); +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s rot in peace.", mon_nam(mdef)); @@ -840,6 +869,10 @@ if (!resists_ston(mdef)) { if (vis) pline("%s turns to stone!", Monnam(mdef)); monstone(mdef); +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif post_stone: if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) You(brief_feeling, "peculiarly sad"); @@ -943,6 +976,10 @@ s_suffix(mon_nam(mdef))); pline("%s is destroyed!", Monnam(mdef)); } +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) @@ -995,7 +1032,15 @@ pline("%s suddenly seems weaker!", Monnam(mdef)); mdef->mhpmax -= tmp; if (mdef->m_lev == 0) +#ifdef INSTADEATH_CONDUCT + { + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; + tmp = mdef->mhp; + } +#else tmp = mdef->mhp; +#endif else mdef->m_lev--; /* Automatic kill if drained past level 0 */ } @@ -1073,6 +1118,10 @@ else { if (vis) pline_The("poison was deadly..."); tmp = mdef->mhp; +#ifdef INSTADEATH_CONDUCT + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif } } } @@ -1112,6 +1161,13 @@ if (!rn2(4) && !flaming(mdef->data) && mdef->data != &mons[PM_GREEN_SLIME]) { (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, vis); +#ifdef INSTADEATH_CONDUCT + /* sliming a monster is effectively removing it from the game + * plus, as of 3.4.3, this works on the riders + */ + if (!magr->mconf && (Conflict || magr->mtame) ) + u.uconduct.instadeathsind++; +#endif mdef->mstrategy &= ~STRAT_WAITFORU; tmp = 0; } diff -aur orig-nethack-3.4.3/src/mhitu.c nethack-3.4.3/src/mhitu.c --- orig-nethack-3.4.3/src/mhitu.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/mhitu.c 2004-01-09 19:15:30.000000000 -0500 @@ -1929,6 +1929,9 @@ pline("%s is turned to stone!", Monnam(mtmp)); stoned = TRUE; killed(mtmp); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif if (mtmp->mhp > 0) break; return 2; diff -aur orig-nethack-3.4.3/src/mon.c nethack-3.4.3/src/mon.c --- orig-nethack-3.4.3/src/mon.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/mon.c 2004-01-09 19:15:30.000000000 -0500 @@ -618,7 +618,14 @@ if (couldsee(mtmp->mx,mtmp->my) && (distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) && fightm(mtmp)) +#ifdef CONFLICT_CONDUCT + { + u.uconduct.conflicts++; + continue; + } +#else continue; /* mon might have died */ +#endif } if(dochugw(mtmp)) /* otherwise just move the monster */ continue; diff -aur orig-nethack-3.4.3/src/monmove.c nethack-3.4.3/src/monmove.c --- orig-nethack-3.4.3/src/monmove.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/monmove.c 2004-01-09 19:15:30.000000000 -0500 @@ -550,8 +550,16 @@ if (!mtmp->mpeaceful || (Conflict && !resist(mtmp, RING_CLASS, 0, 0))) { if(inrange && !noattacks(mdat) && u.uhp > 0 && !scared && tmp != 3) +#ifdef CONFLICT_CONDUCT + { + if (mtmp->mpeaceful) { + u.uconduct.conflicts++; + if(mattacku(mtmp)) return(1); + } else if(mattacku(mtmp)) return(1); + } +#else if(mattacku(mtmp)) return(1); /* monster died (e.g. exploded) */ - +#endif if(mtmp->wormno) wormhitu(mtmp); } /* special speeches for quest monsters */ diff -aur orig-nethack-3.4.3/src/pray.c nethack-3.4.3/src/pray.c --- orig-nethack-3.4.3/src/pray.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/pray.c 2004-01-09 19:15:31.000000000 -0500 @@ -473,6 +473,9 @@ /* Yup, you get experience. It takes guts to successfully * pull off this trick on your god, anyway. */ +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeathsind++; +#endif xkilled(u.ustuck, 0); } else pline("%s seems unaffected.", Monnam(u.ustuck)); @@ -498,6 +501,9 @@ if (!resists_disint(u.ustuck)) { pline("%s fries to a crisp!", Monnam(u.ustuck)); xkilled(u.ustuck, 2); /* no corpse */ +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeathsind++; +#endif } else pline("%s seems unaffected.", Monnam(u.ustuck)); } else { diff -aur orig-nethack-3.4.3/src/priest.c nethack-3.4.3/src/priest.c --- orig-nethack-3.4.3/src/priest.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/priest.c 2004-01-09 19:15:31.000000000 -0500 @@ -167,6 +167,9 @@ if(Displaced) Your("displaced image doesn't fool %s!", mon_nam(priest)); +#ifdef CONFLICT_CONDUCT + u.uconduct.conflicts++; +#endif (void) mattacku(priest); return(0); } else if(index(u.urooms, temple)) { diff -aur orig-nethack-3.4.3/src/shk.c nethack-3.4.3/src/shk.c --- orig-nethack-3.4.3/src/shk.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/shk.c 2004-01-09 19:15:31.000000000 -0500 @@ -3214,6 +3214,9 @@ if(Displaced) Your("displaced image doesn't fool %s!", mon_nam(shkp)); +#ifdef CONFLICT_CONDUCT + u.uconduct.conflicts++; +#endif (void) mattacku(shkp); return(0); } diff -aur orig-nethack-3.4.3/src/trap.c nethack-3.4.3/src/trap.c --- orig-nethack-3.4.3/src/trap.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/trap.c 2004-01-09 19:15:31.000000000 -0500 @@ -2194,7 +2194,11 @@ if (byplayer) { stoned = TRUE; xkilled(mon,0); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif } else monstone(mon); + } void diff -aur orig-nethack-3.4.3/src/uhitm.c nethack-3.4.3/src/uhitm.c --- orig-nethack-3.4.3/src/uhitm.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/uhitm.c 2004-01-09 19:15:31.000000000 -0500 @@ -1333,6 +1333,9 @@ pd == &mons[PM_PAPER_GOLEM]) { if (!Blind) pline("%s burns completely!", Monnam(mdef)); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif xkilled(mdef,2); tmp = 0; break; @@ -1455,6 +1458,9 @@ if (!Blind) pline("Some writing vanishes from %s head!", s_suffix(mon_nam(mdef))); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif xkilled(mdef, 0); /* Don't return yet; keep hp<1 and tmp=0 for pet msg */ } else { @@ -1472,6 +1478,10 @@ if ((mdef->mhp -= xtmp) <= 0 || !mdef->m_lev) { pline("%s dies!", Monnam(mdef)); xkilled(mdef,0); +#ifdef INSTADEATH_CONDUCT + if (!mdef->m_lev) + u.uconduct.instadeaths++; +#endif } else mdef->m_lev--; tmp = 0; @@ -1481,6 +1491,9 @@ if (pd == &mons[PM_IRON_GOLEM]) { pline("%s falls to pieces!", Monnam(mdef)); xkilled(mdef,0); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif } hurtmarmor(mdef, AD_RUST); tmp = 0; @@ -1494,6 +1507,9 @@ pd == &mons[PM_LEATHER_GOLEM]) { pline("%s falls to pieces!", Monnam(mdef)); xkilled(mdef,0); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif } hurtmarmor(mdef, AD_DCAY); tmp = 0; @@ -1510,6 +1526,9 @@ if (!rn2(10)) { Your("poison was deadly..."); tmp = mdef->mhp; +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif } else tmp += rn1(10,6); } } @@ -1579,6 +1598,9 @@ !amphibious(mdef->data)) { You("drown %s...", mon_nam(mdef)); tmp = mdef->mhp; +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif } else if(mattk->aatyp == AT_HUGS) pline("%s is being crushed.", Monnam(mdef)); } else { @@ -1611,6 +1633,9 @@ mdef->data != &mons[PM_GREEN_SLIME]) { You("turn %s into slime.", mon_nam(mdef)); (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, FALSE); +#ifdef INSTADEATH_CONDUCT + u.uconduct.instadeaths++; +#endif tmp = 0; } break; diff -aur orig-nethack-3.4.3/src/zap.c nethack-3.4.3/src/zap.c --- orig-nethack-3.4.3/src/zap.c 2003-12-07 18:39:14.000000000 -0500 +++ nethack-3.4.3/src/zap.c 2004-01-09 19:19:01.000000000 -0500 @@ -2275,6 +2275,9 @@ killed(mdef); else monkilled(mdef, "", AD_SPEL); +#ifdef INSTADEATH_CONDUCT + if(youattack) u.uconduct.instadeaths++; +#endif } } } @@ -2977,6 +2980,11 @@ sho_shieldeff = TRUE; break; } + +#ifdef INSTADEATH_CONDUCT + if (type >= 0) + u.uconduct.instadeaths++; +#endif type = -1; /* so they don't get saving throws */ } else { struct obj *otmp2; @@ -3002,6 +3010,12 @@ m_useup(mon, otmp2); #endif } +#ifdef INSTADEATH_CONDUCT + if (type >= 0) + u.uconduct.instadeaths++; +#endif + + type = -1; /* no saving throw wanted */ break; /* not ordinary damage */ }