--- ../orig/nethack-3.4.3/src/wield.c	2003-12-07 15:39:13.000000000 -0800
+++ src/wield.c	2004-01-10 16:08:28.000000000 -0800
@@ -255,6 +255,12 @@
 		/* previously interrupted armor removal mustn't be resumed */
 		reset_remarm();
 		return (0);
+	} else if (hates_silver(youmonst.data) && is_silver(wep)) {
+	  	pline_The("%s stings your %s!", simple_typename(wep->otyp),
+		    body_part(HAND));
+		losehp(rnd(12), "touching silver", KILLED_BY);
+		You("give up trying to wield the %s.", simple_typename(wep->otyp));
+		return(0);
 	}
 
 	/* Handle no object, or object in other slot */
--- ../orig/nethack-3.4.3/src/polyself.c	2003-12-07 15:39:13.000000000 -0800
+++ src/polyself.c	2004-01-10 15:57:54.000000000 -0800
@@ -571,6 +571,11 @@
 break_armor()
 {
     register struct obj *otmp;
+    boolean removable_gloves;
+    static char burns_away[] = "skin on your %s burns away!";
+    static char tear_off[] = "tear off the silver ring that is on it.";
+    static char unremovable[] = "cannot remove your gloves to remove the burning ring!";
+    static char unremovable_ring[] = "ring is stuck to your %s!";
 
     if (breakarm(youmonst.data)) {
 	if ((otmp = uarm) != 0) {
@@ -671,6 +676,86 @@
 	    dropx(otmp);
 	}
     }
+
+    /* If you become silver fearing, drop any silver armor and silver weapons
+     * that you are wearing or wielding. */
+    if (hates_silver(youmonst.data))
+    {
+      if ((uwep && is_silver(uwep)) || (uswapwep && is_silver(uswapwep)))
+      {
+	You("feel a searing sting in your %s!", makeplural(body_part(HAND)));
+
+	if (!uwep->cursed)
+	  drop_weapon(1);
+	else
+	{
+	  You("can't drop your weapon%c!  The skin on your %s burns away.",
+	      uswapwep ? 's' : 0, body_part(HAND));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	}
+      }
+
+      removable_gloves = uarmg && uarmg->cursed;
+
+      if (uleft && is_silver(uleft))
+      {
+        pline("Your left %s is on fire!", body_part(FINGER));
+	if (!uright->cursed && removable_gloves)
+	{
+	  You(tear_off);
+	  Ring_off(uleft);
+	  dropx(uleft);
+	}
+	else
+	{
+	  if (uarmg)
+	    You(unremovable);
+	  else
+	    pline_The(unremovable_ring, body_part(FINGER));
+	  
+	  pline_The(burns_away, body_part(FINGER));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	}
+      }
+      
+      if (uright && is_silver(uright))
+      {
+        pline("Your right %s burns!", body_part(FINGER));
+        if (!uright->cursed && removable_gloves)
+	{
+          You(tear_off);
+	  Ring_off(uright);
+	  dropx(uright);
+	}
+	else
+	{
+	  if (uarmg)
+	    You(unremovable);
+	  else
+	    pline_The(unremovable_ring, body_part(FINGER));
+	  
+	  pline_The(burns_away, body_part(FINGER));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	}
+      }
+      
+      /* silver shield */
+      if (uarms && is_silver(uarms))
+      {
+	pline("Your silver shield burns your %s!", body_part(HAND));
+	if (!uarms->cursed)
+	{
+          You("drop it!");
+	  Shield_off();
+	  dropx(uarms);
+	}
+	else
+	{
+	  You("can't drop it!  The skin on your %s burns away.", body_part(HAND));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	}
+      }
+    }
 }
 
 STATIC_OVL void
--- ../orig/nethack-3.4.3/src/do_wear.c	2003-12-07 15:39:13.000000000 -0800
+++ src/do_wear.c	2004-01-10 16:07:54.000000000 -0800
@@ -1419,6 +1419,14 @@
 	if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
 	    return 1;	/* costs a turn even though it didn't get worn */
 
+	if (hates_silver(youmonst.data) && is_silver(otmp))
+	{
+	  You("burn your %s trying to wear that %s!",
+	      makeplural(body_part(HAND)), simple_typename(otmp->otyp));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	  You("wisely give up trying to wear it.");
+	  return 1;
+	}
 	if (otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT &&
 			qstart_level.dnum == u.uz.dnum) {	/* in quest */
 		if (u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL])
@@ -1538,6 +1546,15 @@
 		}
 		if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
 		    return 1; /* costs a turn even though it didn't get worn */
+		
+		if (hates_silver(youmonst.data) && is_silver(otmp))
+		{
+		  pline_The("ring singes your finger as you try to put it on!");
+		  losehp(rnd(12), "touching silver", KILLED_BY);
+		  You("give up trying to wear the ring.");
+		  return 1;
+		}
+		
 		setworn(otmp, mask);
 		Ring_on(otmp);
 	} else if (otmp->oclass == AMULET_CLASS) {
--- ../orig/nethack-3.4.3/src/pickup.c	2003-12-07 15:39:13.000000000 -0800
+++ src/pickup.c	2004-01-10 16:10:16.000000000 -0800
@@ -1344,6 +1344,14 @@
 	if ((res = lift_object(obj, (struct obj *)0, &count, telekinesis)) <= 0)
 	    return res;
 
+	if (hates_silver(youmonst.data) && is_silver(obj) && !telekinesis)
+	{
+	  pline("Ouch!  That %s is made of silver!", simple_typename(obj->otyp));
+	  losehp(rnd(12), "touching silver", KILLED_BY);
+	  You("lose your grip on the %s.", simple_typename(obj->otyp));
+	  return 0;
+	}
+	
 #ifdef GOLDOBJ
         /* Whats left of the special case for gold :-) */
 	if (obj->oclass == COIN_CLASS) flags.botl = 1;
--- ../orig/nethack-3.4.3/include/objclass.h	2003-12-07 15:39:13.000000000 -0800
+++ include/objclass.h	2004-01-10 15:29:16.000000000 -0800
@@ -63,6 +63,7 @@
 #define GEMSTONE	20
 #define MINERAL		21
 
+#define is_silver(otmp)		(objects[otmp->otyp].oc_material == SILVER)
 #define is_organic(otmp)	(objects[otmp->otyp].oc_material <= WOOD)
 #define is_metallic(otmp)	(objects[otmp->otyp].oc_material >= IRON && \
 				 objects[otmp->otyp].oc_material <= MITHRIL)
