Gives the player an extra turn of warning before the touch of death.

The spell now makes the caster's hand glow black (if you can see it); on the
next turn that the monster thinks it's adjacent to you, it will attempt to
touch you in preference to other actions; if successful, it will kill you.

This version is a quick proof of concept.  It currently has a limit of one
black-handed monster, through the use of a global variable that isn't saved
across save/restore.  A flag in struct monst would be much better, perhaps
with a timeout.  I also lacks #define wrappers, and support monster vs
monster attacks.

This needs something to balance out the fact that it makes the game easier.
Perhaps the finger of death spell could be made to work the same way...

 -- Eric Wald

diff -urp nethack-3.4.3/src/mcastu.c death/src/mcastu.c
--- nethack-3.4.3/src/mcastu.c	2003-12-07 16:39:13.000000000 -0700
+++ death/src/mcastu.c	2006-02-23 18:50:20.000000000 -0700
@@ -330,23 +330,18 @@ int spellnum;
 
     switch (spellnum) {
     case MGC_DEATH_TOUCH:
-	pline("Oh no, %s's using the touch of death!", mhe(mtmp));
-	if (nonliving(youmonst.data) || is_demon(youmonst.data)) {
-	    You("seem no deader than before.");
-	} else if (!Antimagic && rn2(mtmp->m_lev) > 12) {
-	    if (Hallucination) {
-		You("have an out of body experience.");
-	    } else {
-		killer_format = KILLED_BY_AN;
-		killer = "touch of death";
-		done(DIED);
-	    }
+    {
+	/* Warn players before the touch of death -- ESW */
+	extern struct monst *death_mon;
+	death_mon = mtmp;
+	if (!Blind && canseemon(mtmp)) {
+	    pline("%s's %s glows black.", Monnam(mtmp), mbodypart(mtmp, HAND));
 	} else {
-	    if (Antimagic) shieldeff(u.ux, u.uy);
-	    pline("Lucky for you, it didn't work!");
+	    pline("%s mutters darkly.", Monnam(mtmp));
 	}
 	dmg = 0;
 	break;
+    }
     case MGC_CLONE_WIZ:
 	if (mtmp->iswiz && flags.no_of_wizards == 1) {
 	    pline("Double Trouble...");
diff -urp nethack-3.4.3/src/mhitu.c death/src/mhitu.c
--- nethack-3.4.3/src/mhitu.c	2005-02-24 18:29:51.000000000 -0700
+++ death/src/mhitu.c	2006-02-23 19:35:31.000000000 -0700
@@ -34,6 +34,11 @@ STATIC_DCL void FDECL(hitmsg,(struct mon
 /* changed to a parameter to mhitu. */
 static int dieroll;
 
+/* Records which monster has used the touch of death last.  A field in the
+ * monst struct would be better, but would break save file compatibility.
+ * -- ESW */
+struct monst *death_mon;
+
 #ifdef OVL1
 
 
@@ -331,6 +336,31 @@ mattacku(mtmp)
 	    foundyou = 1;
 	    if(u.uinvulnerable) return (0); /* stomachs can't hurt you! */
 	}
+	
+	/* Delayed touch of death -- ESW */
+	else if (mtmp == death_mon && !range2) {
+	    if (foundyou) {
+		death_mon = NULL;
+		pline("%s touches you!", Monnam(mtmp));
+		if (nonliving(youmonst.data) || is_demon(youmonst.data)) {
+		    You_feel("an urge to move on with your afterlife.");
+		} else if (!Antimagic && rn2(mtmp->m_lev) > 12) {
+		    if (Hallucination) {
+			You("have an out of body experience.");
+		    } else {
+			killer_format = KILLED_BY_AN;
+			killer = "touch of death";
+			done(DIED);
+		    }
+		} else {
+		    if (Antimagic) shieldeff(u.ux, u.uy);
+		    You("shiver for a moment.");
+		}
+	    } else if (youseeit) {
+		pline("%s reaches out toward your displaced image.", Monnam(mtmp));
+	    }
+	    return(0);
+	}
 
 #ifdef STEED
 	else if (u.usteed) {
