Only in angband-283h/src: birth.o
Only in angband-283h/src: borg-todo.txt
Only in angband-283h/src: borg1.o
Only in angband-283h/src: borg2.o
Only in angband-283h/src: borg3.o
Only in angband-283h/src: borg4.o
Only in angband-283h/src: borg5.o
Only in angband-283h/src: borg6.o
Only in angband-283h/src: borg7.o
Only in angband-283h/src: borg8.o
Only in angband-283h/src: borg9.o
Only in angband-283h/src: cave.o
Only in angband-283h/src: chklist.ms
Only in angband-283h/src: cmd1.o
Only in angband-283h/src: cmd2.o
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/cmd3.c angband-283h/src/cmd3.c
--- angband-283h-orig/src/cmd3.c	Wed Feb 11 12:30:28 1998
+++ angband-283h/src/cmd3.c	Wed May 26 01:58:20 1999
@@ -513,14 +513,6 @@
 	}
 
 
-	/* Require full knowledge */
-	if (!(o_ptr->ident & (IDENT_MENTAL)))
-	{
-		msg_print("You have no special knowledge about that item.");
-		return;
-	}
-
-
 	/* Description */
 	object_desc(o_name, o_ptr, TRUE, 3);
 
Only in angband-283h/src: cmd3.o
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/cmd4.c angband-283h/src/cmd4.c
--- angband-283h-orig/src/cmd4.c	Wed Feb 11 12:30:28 1998
+++ angband-283h/src/cmd4.c	Tue May 25 22:06:00 1999
@@ -396,7 +396,8 @@
 	"cheat_room",
 	"cheat_xtra",
 	"cheat_know",
-	"cheat_live"
+    "cheat_live",
+    "cheat_item",
 };
 
 /*
@@ -409,7 +410,8 @@
 	"Peek into dungeon creation",
 	"Peek into something else",
 	"Know complete monster info",
-	"Allow player to avoid death"
+    "Allow player to avoid death",
+    "Know complete object info"
 };
 
 
Only in angband-283h/src: cmd4.o
Only in angband-283h/src: cmd5.o
Only in angband-283h/src: cmd6.o
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/config.h angband-283h/src/config.h
--- angband-283h-orig/src/config.h	Sun Mar 28 11:27:30 1999
+++ angband-283h/src/config.h	Wed May 26 08:46:12 1999
@@ -283,12 +283,24 @@
 /*
  * Allow "Borgs" to yield "high scores"
  */
-/* #define SCORE_BORGS */
+/* #define SCORE_BORGS */
 
 /*
  * Allow "Cheaters" to yield "high scores"
  */
 /* #define SCORE_CHEATERS */
+
+
+/*
+ * In-game 'spoilers' for artifacts
+ */
+#define SPOIL_ARTIFACTS
+
+/*
+ * In-game 'spoilers' for ego-items
+ */
+#define SPOIL_EGO_ITEMS
+
 
 
 
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/defines.h angband-283h/src/defines.h
--- angband-283h-orig/src/defines.h	Thu May 14 16:00:56 1998
+++ angband-283h/src/defines.h	Tue May 25 22:05:14 1999
@@ -2255,7 +2255,8 @@
 #define CHEAT_cheat_xtra	3
 #define CHEAT_cheat_know	4
 #define CHEAT_cheat_live	5
-#define CHEAT_MAX			6
+#define CHEAT_cheat_item    6
+#define CHEAT_MAX           7
 
 
 /*
Only in angband-283h/src: dungeon.o
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/files.c angband-283h/src/files.c
--- angband-283h-orig/src/files.c	Tue May 19 14:15:54 1998
+++ angband-283h/src/files.c	Sat May 29 00:22:58 1999
@@ -1597,6 +1597,8 @@
 
 	u32b f[4];
 
+    char c;
+
 
 	/* Four columns */
 	for (x = 0; x < 4; x++)
@@ -1648,6 +1650,51 @@
 				/* Default */
 				c_put_str(attr, ".", row, col+n);
 
+                /* XXX Immunity -RML */
+                if (set == 2 && flag == TR2_RES_FIRE && (f[set] & TR2_IM_FIRE))
+                {
+                    c_put_str(TERM_GREEN, "I", row, col+n);
+                    continue;
+                }
+                if (set == 2 && flag == TR2_RES_COLD && (f[set] & TR2_IM_COLD))
+                {
+                    c_put_str(TERM_GREEN, "I", row, col+n);
+                    continue;
+                }
+                if (set == 2 && flag == TR2_RES_ACID && (f[set] & TR2_IM_ACID))
+                {
+                    c_put_str(TERM_GREEN, "I", row, col+n);
+                    continue;
+                }
+                if (set == 2 && flag == TR2_RES_ELEC && (f[set] & TR2_IM_ELEC))
+                {
+                    c_put_str(TERM_GREEN, "I", row, col+n);
+                    continue;
+                }
+
+                /* Set 1 flags are bonuses -RML */
+                if (set == 1 && (f[set] & flag))
+                {
+                    if (o_ptr->pval > 0)
+                    {
+                        if (o_ptr->pval > 9)
+                            c = '*';
+                        else
+                            c = '0' + o_ptr->pval;
+                        Term_putch(col+n, row, TERM_L_GREEN, c);
+                    }
+                    else
+                    {
+                        if (-o_ptr->pval > 9)
+                            c = '*';
+                        else
+                            c = '0' + -o_ptr->pval;
+                        Term_putch(col+n, row, TERM_RED, c);
+                    }
+
+                    continue;
+                }
+
 				/* Check flags */
 				if (f[set] & flag) c_put_str(TERM_WHITE, "+", row, col+n);
 			}
Only in angband-283h/src: files.o
Only in angband-283h/src: generate.o
Only in angband-283h/src: init1.o
Only in angband-283h/src: init2.o
Only in angband-283h/src: load1.o
Only in angband-283h/src: load2.o
Only in angband-283h/src: main-dos.o
Only in angband-283h/src: main-ibm.o
Only in angband-283h/src: main.o
Only in angband-283h/src: melee1.o
Only in angband-283h/src: melee2.o
Only in angband-283h/src: monster1.o
Only in angband-283h/src: monster2.o
diff -u --exclude=borg.h --exclude=borg*.c angband-283h-orig/src/object1.c angband-283h/src/object1.c
--- angband-283h-orig/src/object1.c	Fri Feb 27 23:13:48 1998
+++ angband-283h/src/object1.c	Wed May 26 08:46:32 1999
@@ -757,27 +757,22 @@
 	/* Clear */
 	(*f1) = (*f2) = (*f3) = 0L;
 
-	/* Must be identified */
-	if (!object_known_p(o_ptr)) return;
+    /* Must be identified (or cheat -RML) */
+    if (!object_known_p(o_ptr) && !p_ptr->cheat[CHEAT_cheat_item]) return;
 
 	/* Base object */
 	(*f1) = k_ptr->flags1;
 	(*f2) = k_ptr->flags2;
 	(*f3) = k_ptr->flags3;
 
-	/* Ego-item */
-	if (o_ptr->name2)
-	{
-		ego_item_type *e_ptr = &e_info[o_ptr->name2];
-
-		(*f1) |= e_ptr->flags1;
-		(*f2) |= e_ptr->flags2;
-		(*f3) |= e_ptr->flags3;
-	}
-
 #ifdef SPOIL_ARTIFACTS
 	/* Full knowledge for some artifacts */
 	if (artifact_p(o_ptr)) spoil = TRUE;
+
+# ifdef GJW_RANDART
+    /* ... but not randarts -RML */
+    if (p_ptr->random_artifacts) spoil = FALSE;
+# endif
 #endif
 
 #ifdef SPOIL_EGO_ITEMS
@@ -786,7 +781,18 @@
 #endif
 
 	/* Need full knowledge or spoilers */
-	if (!spoil && !(o_ptr->ident & IDENT_MENTAL)) return;
+    if (!spoil && !(o_ptr->ident & IDENT_MENTAL) && !p_ptr->cheat[CHEAT_cheat_item])
+        return;
+
+	/* Ego-item */
+	if (o_ptr->name2)
+	{
+		ego_item_type *e_ptr = &e_info[o_ptr->name2];
+
+		(*f1) |= e_ptr->flags1;
+		(*f2) |= e_ptr->flags2;
+		(*f3) |= e_ptr->flags3;
+	}
 
 	/* Artifact */
 	if (o_ptr->name1)
@@ -799,7 +805,7 @@
 	}
 
 	/* Full knowledge for *identified* objects */
-	if (!(o_ptr->ident & IDENT_MENTAL)) return;
+    if (!(o_ptr->ident & IDENT_MENTAL) && !p_ptr->cheat[CHEAT_cheat_item]) return;
 
 	/* Extra powers */
 	switch (o_ptr->xtra1)
@@ -1870,215 +1876,215 @@
 	{
 		case ART_NARTHANC:
 		{
-			return "fire bolt (9d8) every 8+d8 turns";
+            return "for a fire bolt (9d8) every 8+d8 turns";
 		}
 		case ART_NIMTHANC:
 		{
-			return "frost bolt (6d8) every 7+d7 turns";
+            return "for a frost bolt (6d8) every 7+d7 turns";
 		}
 		case ART_DETHANC:
 		{
-			return "lightning bolt (4d8) every 6+d6 turns";
+            return "for a lightning bolt (4d8) every 6+d6 turns";
 		}
 		case ART_RILIA:
 		{
-			return "stinking cloud (12) every 4+d4 turns";
+            return "for a stinking cloud (12) every 4+d4 turns";
 		}
 		case ART_BELANGIL:
 		{
-			return "frost ball (48) every 5+d5 turns";
+            return "for a frost ball (48) every 5+d5 turns";
 		}
 		case ART_DAL:
 		{
-			return "remove fear and cure poison every 5 turns";
+            return "to remove fear and cure poison every 5 turns";
 		}
 		case ART_RINGIL:
 		{
-			return "frost ball (100) every 300 turns";
+            return "for a frost ball (100) every 300 turns";
 		}
 		case ART_ANDURIL:
 		{
-			return "fire ball (72) every 400 turns";
+            return "for a fire ball (72) every 400 turns";
 		}
 		case ART_FIRESTAR:
 		{
-			return "large fire ball (72) every 100 turns";
+            return "for a large fire ball (72) every 100 turns";
 		}
 		case ART_FEANOR:
 		{
-			return "haste self (20+d20 turns) every 200 turns";
+            return "to haste self (20+d20 turns) every 200 turns";
 		}
 		case ART_THEODEN:
 		{
-			return "drain life (120) every 400 turns";
+            return "to drain life (120) every 400 turns";
 		}
 		case ART_TURMIL:
 		{
-			return "drain life (90) every 70 turns";
+            return "to drain life (90) every 70 turns";
 		}
 		case ART_CASPANION:
 		{
-			return "door and trap destruction every 10 turns";
+            return "for door and trap destruction every 10 turns";
 		}
 		case ART_AVAVIR:
 		{
-			return "word of recall every 200 turns";
+            return "for word of recall every 200 turns";
 		}
 		case ART_TARATOL:
 		{
-			return "haste self (20+d20 turns) every 100+d100 turns";
+            return "to haste self (20+d20 turns) every 100+d100 turns";
 		}
 		case ART_ERIRIL:
 		{
-			return "identify every 10 turns";
+            return "tp identify every 10 turns";
 		}
 		case ART_OLORIN:
 		{
-			return "probing every 20 turns";
+            return "for probing every 20 turns";
 		}
 		case ART_EONWE:
 		{
-			return "mass genocide every 1000 turns";
+            return "for mass genocide every 1000 turns";
 		}
 		case ART_LOTHARANG:
 		{
-			return "cure wounds (4d7) every 3+d3 turns";
+            return "to cure wounds (4d7) every 3+d3 turns";
 		}
 		case ART_CUBRAGOL:
 		{
-			return "fire branding of bolts every 999 turns";
+            return "for fire branding of bolts every 999 turns";
 		}
 		case ART_ARUNRUTH:
 		{
-			return "frost bolt (12d8) every 500 turns";
+            return "for a frost bolt (12d8) every 500 turns";
 		}
 		case ART_AEGLOS:
 		{
-			return "frost ball (100) every 500 turns";
+            return "for a frost ball (100) every 500 turns";
 		}
 		case ART_OROME:
 		{
-			return "stone to mud every 5 turns";
+            return "for stone to mud every 5 turns";
 		}
 		case ART_SOULKEEPER:
 		{
-			return "heal (1000) every 888 turns";
+            return "to heal (1000) every 888 turns";
 		}
 		case ART_BELEGENNON:
 		{
-			return "phase door every 2 turns";
+            return "for phase door every 2 turns";
 		}
 		case ART_CELEBORN:
 		{
-			return "genocide every 500 turns";
+            return "for genocide every 500 turns";
 		}
 		case ART_LUTHIEN:
 		{
-			return "restore life levels every 450 turns";
+            return "to restore life levels every 450 turns";
 		}
 		case ART_ULMO:
 		{
-			return "teleport away every 150 turns";
+            return "to teleport away every 150 turns";
 		}
 		case ART_COLLUIN:
 		{
-			return "resistance (20+d20 turns) every 111 turns";
+            return "for resistance (20+d20 turns) every 111 turns";
 		}
 		case ART_HOLCOLLETH:
 		{
-			return "Sleep II every 55 turns";
+            return "for Sleep II every 55 turns";
 		}
 		case ART_THINGOL:
 		{
-			return "recharge item I every 70 turns";
+            return "for recharge item I every 70 turns";
 		}
 		case ART_COLANNON:
 		{
-			return "teleport every 45 turns";
+            return "for teleport every 45 turns";
 		}
 		case ART_TOTILA:
 		{
-			return "confuse monster every 15 turns";
+            return "for confuse monster every 15 turns";
 		}
 		case ART_CAMMITHRIM:
 		{
-			return "magic missile (2d6) every 2 turns";
+            return "for a magic missile (2d6) every 2 turns";
 		}
 		case ART_PAURHACH:
 		{
-			return "fire bolt (9d8) every 8+d8 turns";
+            return "for a fire bolt (9d8) every 8+d8 turns";
 		}
 		case ART_PAURNIMMEN:
 		{
-			return "frost bolt (6d8) every 7+d7 turns";
+            return "for a frost bolt (6d8) every 7+d7 turns";
 		}
 		case ART_PAURAEGEN:
 		{
-			return "lightning bolt (4d8) every 6+d6 turns";
+            return "for a lightning bolt (4d8) every 6+d6 turns";
 		}
 		case ART_PAURNEN:
 		{
-			return "acid bolt (5d8) every 5+d5 turns";
+            return "for a acid bolt (5d8) every 5+d5 turns";
 		}
 		case ART_FINGOLFIN:
 		{
-			return "a magical arrow (150) every 90+d90 turns";
+            return "for a magical arrow (150) every 90+d90 turns";
 		}
 		case ART_HOLHENNETH:
 		{
-			return "detection every 55+d55 turns";
+            return "for detection every 55+d55 turns";
 		}
 		case ART_GONDOR:
 		{
-			return "heal (500) every 500 turns";
+            return "to heal (500) every 500 turns";
 		}
 		case ART_RAZORBACK:
 		{
-			return "star ball (150) every 1000 turns";
+            return "for a star ball (150) every 1000 turns";
 		}
 		case ART_BLADETURNER:
 		{
-			return "berserk rage, bless, and resistance every 400 turns";
+            return "for berserk rage, bless, and resistance every 400 turns";
 		}
 		case ART_GALADRIEL:
 		{
-			return "illumination every 10+d10 turns";
+            return "for illumination every 10+d10 turns";
 		}
 		case ART_ELENDIL:
 		{
-			return "magic mapping every 50+d50 turns";
+            return "for magic mapping every 50+d50 turns";
 		}
 		case ART_THRAIN:
 		{
-			return "clairvoyance every 100+d100 turns";
+            return "for clairvoyance every 100+d100 turns";
 		}
 		case ART_INGWE:
 		{
-			return "dispel evil (x5) every 300+d300 turns";
+            return "to dispel evil (x5) every 300+d300 turns";
 		}
 		case ART_CARLAMMAS:
 		{
-			return "protection from evil every 225+d225 turns";
+            return "for protection from evil every 225+d225 turns";
 		}
 		case ART_TULKAS:
 		{
-			return "haste self (75+d75 turns) every 150+d150 turns";
+            return "for haste self (75+d75 turns) every 150+d150 turns";
 		}
 		case ART_NARYA:
 		{
-			return "large fire ball (120) every 225+d225 turns";
+            return "for a large fire ball (120) every 225+d225 turns";
 		}
 		case ART_NENYA:
 		{
-			return "large frost ball (200) every 325+d325 turns";
+            return "for a large frost ball (200) every 325+d325 turns";
 		}
 		case ART_VILYA:
 		{
-			return "large lightning ball (250) every 425+d425 turns";
+            return "for a large lightning ball (250) every 425+d425 turns";
 		}
 		case ART_POWER:
 		{
-			return "bizarre things every 450+d450 turns";
+            return "for bizarre things every 450+d450 turns";
 		}
 	}
 
@@ -2091,55 +2097,55 @@
 	{
 		case SV_DRAGON_BLUE:
 		{
-			return "breathe lightning (100) every 450+d450 turns";
+            return "to breathe lightning (100) every 450+d450 turns";
 		}
 		case SV_DRAGON_WHITE:
 		{
-			return "breathe frost (110) every 450+d450 turns";
+            return "to breathe frost (110) every 450+d450 turns";
 		}
 		case SV_DRAGON_BLACK:
 		{
-			return "breathe acid (130) every 450+d450 turns";
+            return "to breathe acid (130) every 450+d450 turns";
 		}
 		case SV_DRAGON_GREEN:
 		{
-			return "breathe poison gas (150) every 450+d450 turns";
+            return "to breathe poison gas (150) every 450+d450 turns";
 		}
 		case SV_DRAGON_RED:
 		{
-			return "breathe fire (200) every 450+d450 turns";
+            return "to breathe fire (200) every 450+d450 turns";
 		}
 		case SV_DRAGON_MULTIHUED:
 		{
-			return "breathe multi-hued (250) every 225+d225 turns";
+            return "to breathe multi-hued (250) every 225+d225 turns";
 		}
 		case SV_DRAGON_BRONZE:
 		{
-			return "breathe confusion (120) every 450+d450 turns";
+            return "to breathe confusion (120) every 450+d450 turns";
 		}
 		case SV_DRAGON_GOLD:
 		{
-			return "breathe sound (130) every 450+d450 turns";
+            return "to breathe sound (130) every 450+d450 turns";
 		}
 		case SV_DRAGON_CHAOS:
 		{
-			return "breathe chaos/disenchant (220) every 300+d300 turns";
+            return "to breathe chaos/disenchant (220) every 300+d300 turns";
 		}
 		case SV_DRAGON_LAW:
 		{
-			return "breathe sound/shards (230) every 300+d300 turns";
+            return "to breathe sound/shards (230) every 300+d300 turns";
 		}
 		case SV_DRAGON_BALANCE:
 		{
-			return "You breathe balance (250) every 300+d300 turns";
+            return "to breathe balance (250) every 300+d300 turns";
 		}
 		case SV_DRAGON_SHINING:
 		{
-			return "breathe light/darkness (200) every 300+d300 turns";
+            return "to breathe light/darkness (200) every 300+d300 turns";
 		}
 		case SV_DRAGON_POWER:
 		{
-			return "breathe the elements (300) every 300+d300 turns";
+            return "to breathe the elements (300) every 300+d300 turns";
 		}
 	}
 
@@ -2160,17 +2166,35 @@
 
 	cptr info[128];
 
+    /* -RML */
+    cptr reclaim[128];
+    int num_reclaim = 0;
+    cptr new_str;
+    cptr new_buf;
+
+    int power;
+
 
 	/* Extract the flags */
-	object_flags(o_ptr, &f1, &f2, &f3);
+    object_flags_known(o_ptr, &f1, &f2, &f3);
 
 
+    /* Indicate if fully known */
+    if (o_ptr->ident & IDENT_MENTAL)
+    {
+        info[i++] = "You have full knowlege of this item.";
+    }
+
 	/* Mega-Hack -- describe activation */
 	if (f3 & (TR3_ACTIVATE))
 	{
-		info[i++] = "It can be activated for...";
-		info[i++] = item_activation(o_ptr);
-		info[i++] = "...if it is being worn.";
+        new_str = format("It can be activated %s when worn.", item_activation(o_ptr));
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 
 
@@ -2196,98 +2220,227 @@
 
 	if (f1 & (TR1_STR))
 	{
-		info[i++] = "It affects your strength.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your strength by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your strength by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_INT))
 	{
-		info[i++] = "It affects your intelligence.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your intelligence by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your intelligence by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_WIS))
 	{
-		info[i++] = "It affects your wisdom.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your wisdom by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your wisdom by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_DEX))
 	{
-		info[i++] = "It affects your dexterity.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your dexterity by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your dexterity by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_CON))
 	{
-		info[i++] = "It affects your constitution.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your constitution by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your constitution by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_CHR))
 	{
-		info[i++] = "It affects your charisma.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your charisma by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your charisma by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 
 	if (f1 & (TR1_STEALTH))
 	{
-		info[i++] = "It affects your stealth.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your stealth by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your stealth by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_SEARCH))
 	{
-		info[i++] = "It affects your searching.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your searching ability by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your searching ability by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_INFRA))
 	{
-		info[i++] = "It affects your infravision.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your infravision by %i'.", o_ptr->pval * 10);
+        else
+            new_str = format("It decreases your infravision by %i'.", -o_ptr->pval * 10);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_TUNNEL))
 	{
-		info[i++] = "It affects your ability to tunnel.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your ability to dig by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your ability to dig by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_SPEED))
 	{
-		info[i++] = "It affects your speed.";
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your speed by %+i.", o_ptr->pval);
+        else
+            new_str = format("It decreases your speed by %+i.", o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_BLOWS))
 	{
-		info[i++] = "It affects your attack speed.";
+        if (o_ptr->pval > 0)
+            new_str = format("It provides %i extra blows per turn.", o_ptr->pval);
+        else
+            new_str = format("It provides %i fewer blows per turn.", -o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_SHOTS))
 	{
-		info[i++] = "It affects your shooting speed.";
+        if (o_ptr->pval > 0)
+            new_str = format("It provides %i extra shots per turn.", o_ptr->pval);
+        else
+            new_str = format("It provides %i fewer shots per turn.", -o_ptr->pval);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 	if (f1 & (TR1_MIGHT))
 	{
-		info[i++] = "It affects your shooting power.";
+        /* Hack -- Extract the "base power" */
+        power = (o_ptr->sval % 10);
+
+        if (o_ptr->pval > 0)
+            new_str = format("It increases your bow modifier to x%i.", o_ptr->pval + power);
+        else
+            new_str = format("It decreases your bow modifier to x%i.", o_ptr->pval + power);
+
+        C_MAKE(new_buf, strlen(new_str) + 1, char);
+        C_COPY(new_buf, new_str, strlen(new_str) + 1, char);
+        reclaim[num_reclaim++] = new_buf;
+
+        info[i++] = new_buf;
 	}
 
 	if (f1 & (TR1_SLAY_ANIMAL))
 	{
-		info[i++] = "It is especially deadly against natural creatures.";
+        info[i++] = "It deals double damage against natural creatures.";
 	}
 	if (f1 & (TR1_SLAY_EVIL))
 	{
-		info[i++] = "It fights against evil with holy fury.";
+        info[i++] = "It deals double damage against evil monsters.";
 	}
 	if (f1 & (TR1_SLAY_UNDEAD))
 	{
-		info[i++] = "It strikes at undead with holy wrath.";
+        info[i++] = "It is triply effective against undead.";
 	}
 	if (f1 & (TR1_SLAY_DEMON))
 	{
-		info[i++] = "It strikes at demons with holy wrath.";
+        info[i++] = "It deals triple damage against demons.";
 	}
 	if (f1 & (TR1_SLAY_ORC))
 	{
-		info[i++] = "It is especially deadly against orcs.";
+        info[i++] = "It is triply deadly against orcs.";
 	}
 	if (f1 & (TR1_SLAY_TROLL))
 	{
-		info[i++] = "It is especially deadly against trolls.";
+        info[i++] = "It deals triple damage against trolls.";
 	}
 	if (f1 & (TR1_SLAY_GIANT))
 	{
-		info[i++] = "It is especially deadly against giants.";
-	}
-	if (f1 & (TR1_SLAY_DRAGON))
-	{
-		info[i++] = "It is especially deadly against dragons.";
+        info[i++] = "It is triply deadly against giants.";
 	}
 
 	if (f1 & (TR1_KILL_DRAGON))
 	{
-		info[i++] = "It is a great bane of dragons.";
+        info[i++] = "It deals quintuple damage to dragons.";
+	}
+    else if (f1 & (TR1_SLAY_DRAGON))
+	{
+        info[i++] = "It deals triple damage to dragons.";
 	}
 
 	if (f1 & (TR1_BRAND_ACID))
@@ -2485,7 +2638,7 @@
 
 	if (f3 & (TR3_DRAIN_EXP))
 	{
-		info[i++] = "It drains experience.";
+        info[i++] = "It drains your experience.";
 	}
 
 	if (f3 & (TR3_BLESSED))
@@ -2568,6 +2721,13 @@
 
 	/* Load screen */
 	screen_load();
+
+
+    /* Free temp buffers -RML */
+    for (k = 0; k < num_reclaim; k++)
+    {
+        C_FREE(reclaim[k], strlen(reclaim[k]) + 1, char);
+    }
 
 
 	/* Gave knowledge */
Only in angband-283h/src: object1.o
Only in angband-283h/src: object2.o
Only in angband-283h/src: randart.o
Only in angband-283h/src: save.o
Only in angband-283h/src: spells1.o
Only in angband-283h/src: spells2.o
Only in angband-283h/src: store.o
Only in angband-283h/src: tables.o
Only in angband-283h/src: util.o
Only in angband-283h/src: variable.o
Only in angband-283h/src: wizard1.o
Only in angband-283h/src: wizard2.o
Only in angband-283h/src: xtra1.o
Only in angband-283h/src: xtra2.o
Only in angband-283h/src: z-form.o
Only in angband-283h/src: z-rand.o
Only in angband-283h/src: z-term.o
Only in angband-283h/src: z-util.o
Only in angband-283h/src: z-virt.o
