diff -u3 old/cmd1.c fragile/cmd1.c
--- old/cmd1.c	Fri Nov 23 03:46:36 2001
+++ fragile/cmd1.c	Mon Dec  3 21:44:36 2001
@@ -1126,6 +1126,8 @@
 
 	bool do_quake = FALSE;
 
+        bool weapon_broken = FALSE;
+
 
 	/* Get the monster */
 	m_ptr = &m_list[cave_m_idx[y][x]];
@@ -1205,9 +1207,35 @@
 				msg_format("You do %d (out of %d) damage.", k, m_ptr->hp);
 			}
 
+                        /* Check for fragile weapons */
+                        if (o_ptr->fragile_counter)
+                        {
+                                /* Each 100 hits */
+                                if (!(--o_ptr->fragile_counter))
+                                {
+                                        /* 5% chance of breaking */
+                                        if (rand_int(100)<5)
+                                        {
+                                                msg_format("Your weapon breaks.");
+                                                inven_item_increase(INVEN_WIELD, -1);
+                                                inven_item_describe(INVEN_WIELD);
+                                                inven_item_optimize(INVEN_WIELD);
+                                                /* Recalculate bonuses */
+                                                p_ptr->update |= (PU_BONUS);
+                                                weapon_broken = TRUE;
+                                        }
+                                        else
+                                                o_ptr->fragile_counter = 100;
+                                }
+                        }
+
 			/* Damage, check for fear and death */
 			if (mon_take_hit(cave_m_idx[y][x], k, &fear, NULL)) break;
 
+                        /* Do not make more attacks if the weapon has broken */
+                        if (weapon_broken)
+                                break;
+
 			/* Confusion attack */
 			if (p_ptr->confusing)
 			{
diff -u3 old/defines.h fragile/defines.h
--- old/defines.h	Fri Nov 23 03:49:08 2001
+++ fragile/defines.h	Mon Dec  3 19:41:30 2001
@@ -1984,7 +1984,7 @@
 #define TR3_XXX1            0x00000100L
 #define TR3_XXX2            0x00000200L
 #define TR3_XXX3            0x00000400L
-#define TR3_XXX4            0x00000800L
+#define TR3_FRAGILE         0x00000800L /* Weapon is fragile */
 #define TR3_IMPACT          0x00001000L /* Earthquake blows */
 #define TR3_TELEPORT        0x00002000L /* Random teleportation */
 #define TR3_AGGRAVATE       0x00004000L /* Aggravate monsters */
diff -u3 old/init1.c fragile/init1.c
--- old/init1.c	Fri Nov 23 03:46:36 2001
+++ fragile/init1.c	Mon Dec  3 19:42:54 2001
@@ -451,7 +451,7 @@
 	"XXX1",
 	"XXX2",
 	"XXX3",
-	"XXX4",
+        "FRAGILE",
 	"IMPACT",
 	"TELEPORT",
 	"AGGRAVATE",
diff -u3 old/l-object.pkg fragile/l-object.pkg
--- old/l-object.pkg	Sun Nov 11 22:54:12 2001
+++ fragile/l-object.pkg	Mon Dec  3 19:42:02 2001
@@ -814,7 +814,7 @@
 #define TR3_XXX1            0x00000100L
 #define TR3_XXX2            0x00000200L
 #define TR3_XXX3            0x00000400L
-#define TR3_XXX4            0x00000800L
+#define TR3_FRAGILE         0x00000800L /* Weapon is fragile */
 #define TR3_IMPACT          0x00001000L /* Earthquake blows */
 #define TR3_TELEPORT        0x00002000L /* Random teleportation */
 #define TR3_AGGRAVATE       0x00004000L /* Aggravate monsters */
diff -u3 old/load.c fragile/load.c
--- old/load.c	Sun Nov 18 16:31:34 2001
+++ fragile/load.c	Mon Dec  3 20:10:14 2001
@@ -299,6 +299,9 @@
 	/* Monster holding object */
 	rd_s16b(&o_ptr->held_m_idx);
 
+        /* Fragile counter */
+        rd_s16b(&o_ptr->fragile_counter);
+
 	/* Special powers */
 	rd_byte(&o_ptr->xtra1);
 	rd_byte(&o_ptr->xtra2);
Common subdirectories: old/lua and fragile/lua
diff -u3 old/object1.c fragile/object1.c
--- old/object1.c	Fri Nov 23 03:46:36 2001
+++ fragile/object1.c	Mon Dec  3 21:41:48 2001
@@ -2181,6 +2181,12 @@
 		known = TRUE;
 	}
 
+        if (f3 & (TR3_FRAGILE))
+        {
+                text_out("It is fragile and might break.\n");
+                known = TRUE;
+        }
+
 	if (f3 & (TR3_AGGRAVATE))
 	{
 		text_out("It aggravates nearby creatures.\n");
diff -u3 old/object2.c fragile/object2.c
--- old/object2.c	Sun Nov 11 22:54:14 2001
+++ fragile/object2.c	Mon Dec  3 21:35:24 2001
@@ -1429,6 +1429,7 @@
 
 	/* Hack -- cursed items are always "cursed" */
 	if (k_ptr->flags3 & (TR3_LIGHT_CURSE)) o_ptr->ident |= (IDENT_CURSED);
+
 }
 
 
@@ -2631,6 +2632,10 @@
 		/* Mega-Hack -- increase the rating */
 		rating += 10;
 
+                /* Set fragile counter for fragile artifacts */
+                if (a_ptr->flags3 & (TR3_FRAGILE))
+                        o_ptr->fragile_counter = 100;
+
 		/* Mega-Hack -- increase the rating again */
 		if (a_ptr->cost > 50000L) rating += 10;
 
@@ -2775,6 +2780,10 @@
 		/* Hack -- apply rating bonus */
 		rating += e_ptr->rating;
 
+                /* Set fragile counter for fragile items */
+                if (e_ptr->flags3 & (TR3_FRAGILE))
+                        o_ptr->fragile_counter = 100;
+
 		/* Cheat -- describe the item */
 		if (cheat_peek) object_mention(o_ptr);
 
diff -u3 old/save.c fragile/save.c
--- old/save.c	Sun Nov 18 16:31:34 2001
+++ fragile/save.c	Mon Dec  3 20:10:24 2001
@@ -726,6 +726,9 @@
 	/* Held by monster index */
 	wr_s16b(o_ptr->held_m_idx);
 
+        /* Fragile counter */
+        wr_s16b(o_ptr->fragile_counter);
+
 	/* Extra information */
 	wr_byte(o_ptr->xtra1);
 	wr_byte(o_ptr->xtra2);
diff -u3 old/types.h fragile/types.h
--- old/types.h	Thu Nov  8 13:56:42 2001
+++ fragile/types.h	Mon Dec  3 20:09:56 2001
@@ -489,6 +489,9 @@
 	s16b next_o_idx;	/* Next object in stack (if any) */
 
 	s16b held_m_idx;	/* Monster holding us (if any) */
+
+        s16b fragile_counter;    /* Number of hits till the weapon
+                                  might break */
 };
 
 
