Only in angband-290-id/src: 283h-id.diff
Binary files angband-290/src/Angband.opt and angband-290-id/src/Angband.opt differ
Common subdirectories: angband-290/src/Debug and angband-290-id/src/Debug
diff -c -x *.plg -x *.ncb angband-290/src/cmd3.c angband-290-id/src/cmd3.c
*** angband-290/src/cmd3.c	Sun Apr  9 22:42:28 2000
--- angband-290-id/src/cmd3.c	Sat Apr 15 23:04:38 2000
***************
*** 520,533 ****
  	}
  
  
- 	/* 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);
  
--- 520,525 ----
Only in angband-290-id/src: cmd3.c.orig
Only in angband-290-id/src: cmd4.c.orig
Only in angband-290-id/src: cmd4.c.rej
diff -c -x *.plg -x *.ncb angband-290/src/config.h angband-290-id/src/config.h
*** angband-290/src/config.h	Sat Apr 15 22:59:28 2000
--- angband-290-id/src/config.h	Sat Apr 15 23:04:38 2000
***************
*** 319,324 ****
--- 319,336 ----
  /* #define SCORE_CHEATERS */
  
  
+ /*
+  * In-game 'spoilers' for artifacts
+  */
+ #define SPOIL_ARTIFACTS
+ 
+ /*
+  * In-game 'spoilers' for ego-items
+  */
+ #define SPOIL_EGO_ITEMS
+ 
+ 
+ 
  
  /*
   * OPTION: Allow use of the "flow_by_smell" and "flow_by_sound"
Only in angband-290-id/src: config.h.orig
diff -c -x *.plg -x *.ncb angband-290/src/defines.h angband-290-id/src/defines.h
*** angband-290/src/defines.h	Sun Apr  9 22:42:32 2000
--- angband-290-id/src/defines.h	Sat Apr 15 23:17:04 2000
***************
*** 2525,2530 ****
--- 2525,2531 ----
  #define OPT_cheat_xtra				(OPT_CHEAT+3)
  #define OPT_cheat_know				(OPT_CHEAT+4)
  #define OPT_cheat_live				(OPT_CHEAT+5)
+ #define OPT_cheat_item              (OPT_CHEAT+6)
  /* xxx xxx */
  #define OPT_adult_point_based		(OPT_ADULT+0)
  #define OPT_adult_auto_roller		(OPT_ADULT+1)
***************
*** 2643,2648 ****
--- 2644,2650 ----
  #define cheat_xtra				op_ptr->opt[OPT_cheat_xtra]
  #define cheat_know				op_ptr->opt[OPT_cheat_know]
  #define cheat_live				op_ptr->opt[OPT_cheat_live]
+ #define cheat_item              op_ptr->opt[OPT_cheat_item]
  /* xxx xxx */
  #define adult_point_based		op_ptr->opt[OPT_adult_point_based]
  #define adult_auto_roller		op_ptr->opt[OPT_adult_auto_roller]
***************
*** 2659,2664 ****
--- 2661,2667 ----
  #define score_xtra				op_ptr->opt[OPT_score_xtra]
  #define score_know				op_ptr->opt[OPT_score_know]
  #define score_live				op_ptr->opt[OPT_score_live]
+ #define score_item              op_ptr->opt[OPT_score_item]
  /* xxx xxx */
  
  
Only in angband-290-id/src: defines.h.orig
Only in angband-290-id/src: defines.h.rej
diff -c -x *.plg -x *.ncb angband-290/src/files.c angband-290-id/src/files.c
*** angband-290/src/files.c	Sun Apr  9 22:42:28 2000
--- angband-290-id/src/files.c	Sat Apr 15 23:04:38 2000
***************
*** 1602,1607 ****
--- 1602,1609 ----
  
  	u32b f[4];
  
+     char c;
+ 
  
  	/* Four columns */
  	for (x = 0; x < 4; x++)
***************
*** 1656,1661 ****
--- 1658,1708 ----
  				{
  					c_put_str(TERM_WHITE, "*", 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 */
  				else if (f[set] & flag)
Only in angband-290-id/src: files.c.orig
diff -c -x *.plg -x *.ncb angband-290/src/object1.c angband-290-id/src/object1.c
*** angband-290/src/object1.c	Sun Apr  9 22:42:30 2000
--- angband-290-id/src/object1.c	Sat Apr 15 23:19:18 2000
***************
*** 750,776 ****
  	/* Clear */
  	(*f1) = (*f2) = (*f3) = 0L;
  
! 	/* Must be identified */
! 	if (!object_known_p(o_ptr)) 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;
  #endif
  
  #ifdef SPOIL_EGO_ITEMS
--- 750,771 ----
  	/* Clear */
  	(*f1) = (*f2) = (*f3) = 0L;
  
!     /* Must be identified (or cheat -RML) */
!     if (!object_known_p(o_ptr) && !cheat_item) return;
  
  	/* Base object */
  	(*f1) = k_ptr->flags1;
  	(*f2) = k_ptr->flags2;
  	(*f3) = k_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 (adult_rand_artifacts) spoil = FALSE;
+ # endif
  #endif
  
  #ifdef SPOIL_EGO_ITEMS
***************
*** 779,785 ****
  #endif
  
  	/* Need full knowledge or spoilers */
! 	if (!spoil && !(o_ptr->ident & IDENT_MENTAL)) return;
  
  	/* Artifact */
  	if (o_ptr->name1)
--- 774,791 ----
  #endif
  
  	/* Need full knowledge or spoilers */
!     if (!spoil && !(o_ptr->ident & IDENT_MENTAL) && !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)
***************
*** 792,798 ****
  	}
  
  	/* Full knowledge for *identified* objects */
! 	if (!(o_ptr->ident & IDENT_MENTAL)) return;
  
  	/* Extra powers */
  	switch (o_ptr->xtra1)
--- 798,804 ----
  	}
  
  	/* Full knowledge for *identified* objects */
!     if (!(o_ptr->ident & IDENT_MENTAL) && !cheat_item) return;
  
  	/* Extra powers */
  	switch (o_ptr->xtra1)
***************
*** 1941,2155 ****
  	{
  		case ART_NARTHANC:
  		{
! 			return "fire bolt (9d8) every 8+d8 turns";
  		}
  		case ART_NIMTHANC:
  		{
! 			return "frost bolt (6d8) every 7+d7 turns";
  		}
  		case ART_DETHANC:
  		{
! 			return "lightning bolt (4d8) every 6+d6 turns";
  		}
  		case ART_RILIA:
  		{
! 			return "stinking cloud (12) every 4+d4 turns";
  		}
  		case ART_BELANGIL:
  		{
! 			return "frost ball (48) every 5+d5 turns";
  		}
  		case ART_DAL:
  		{
! 			return "remove fear and cure poison every 5 turns";
  		}
  		case ART_RINGIL:
  		{
! 			return "frost ball (100) every 300 turns";
  		}
  		case ART_ANDURIL:
  		{
! 			return "fire ball (72) every 400 turns";
  		}
  		case ART_FIRESTAR:
  		{
! 			return "large fire ball (72) every 100 turns";
  		}
  		case ART_FEANOR:
  		{
! 			return "haste self (20+d20 turns) every 200 turns";
  		}
  		case ART_THEODEN:
  		{
! 			return "drain life (120) every 400 turns";
  		}
  		case ART_TURMIL:
  		{
! 			return "drain life (90) every 70 turns";
  		}
  		case ART_CASPANION:
  		{
! 			return "door and trap destruction every 10 turns";
  		}
  		case ART_AVAVIR:
  		{
! 			return "word of recall every 200 turns";
  		}
  		case ART_TARATOL:
  		{
! 			return "haste self (20+d20 turns) every 100+d100 turns";
  		}
  		case ART_ERIRIL:
  		{
! 			return "identify every 10 turns";
  		}
  		case ART_OLORIN:
  		{
! 			return "probing every 20 turns";
  		}
  		case ART_EONWE:
  		{
! 			return "mass genocide every 1000 turns";
  		}
  		case ART_LOTHARANG:
  		{
! 			return "cure wounds (4d7) every 3+d3 turns";
  		}
  		case ART_CUBRAGOL:
  		{
! 			return "fire branding of bolts every 999 turns";
  		}
  		case ART_ARUNRUTH:
  		{
! 			return "frost bolt (12d8) every 500 turns";
  		}
  		case ART_AEGLOS:
  		{
! 			return "frost ball (100) every 500 turns";
  		}
  		case ART_OROME:
  		{
! 			return "stone to mud every 5 turns";
  		}
  		case ART_SOULKEEPER:
  		{
! 			return "heal (1000) every 888 turns";
  		}
  		case ART_BELEGENNON:
  		{
! 			return "phase door every 2 turns";
  		}
  		case ART_CELEBORN:
  		{
! 			return "genocide every 500 turns";
  		}
  		case ART_LUTHIEN:
  		{
! 			return "restore life levels every 450 turns";
  		}
  		case ART_ULMO:
  		{
! 			return "teleport away every 150 turns";
  		}
  		case ART_COLLUIN:
  		{
! 			return "resistance (20+d20 turns) every 111 turns";
  		}
  		case ART_HOLCOLLETH:
  		{
! 			return "Sleep II every 55 turns";
  		}
  		case ART_THINGOL:
  		{
! 			return "recharge item I every 70 turns";
  		}
  		case ART_COLANNON:
  		{
! 			return "teleport every 45 turns";
  		}
  		case ART_TOTILA:
  		{
! 			return "confuse monster every 15 turns";
  		}
  		case ART_CAMMITHRIM:
  		{
! 			return "magic missile (2d6) every 2 turns";
  		}
  		case ART_PAURHACH:
  		{
! 			return "fire bolt (9d8) every 8+d8 turns";
  		}
  		case ART_PAURNIMMEN:
  		{
! 			return "frost bolt (6d8) every 7+d7 turns";
  		}
  		case ART_PAURAEGEN:
  		{
! 			return "lightning bolt (4d8) every 6+d6 turns";
  		}
  		case ART_PAURNEN:
  		{
! 			return "acid bolt (5d8) every 5+d5 turns";
  		}
  		case ART_FINGOLFIN:
  		{
! 			return "a magical arrow (150) every 90+d90 turns";
  		}
  		case ART_HOLHENNETH:
  		{
! 			return "detection every 55+d55 turns";
  		}
  		case ART_GONDOR:
  		{
! 			return "heal (500) every 500 turns";
  		}
  		case ART_RAZORBACK:
  		{
! 			return "star ball (150) every 1000 turns";
  		}
  		case ART_BLADETURNER:
  		{
! 			return "berserk rage, bless, and resistance every 400 turns";
  		}
  		case ART_GALADRIEL:
  		{
! 			return "illumination every 10+d10 turns";
  		}
  		case ART_ELENDIL:
  		{
! 			return "magic mapping every 50+d50 turns";
  		}
  		case ART_THRAIN:
  		{
! 			return "clairvoyance every 100+d100 turns";
  		}
  		case ART_INGWE:
  		{
! 			return "dispel evil (x5) every 300+d300 turns";
  		}
  		case ART_CARLAMMAS:
  		{
! 			return "protection from evil every 225+d225 turns";
  		}
  		case ART_TULKAS:
  		{
! 			return "haste self (75+d75 turns) every 150+d150 turns";
  		}
  		case ART_NARYA:
  		{
! 			return "large fire ball (120) every 225+d225 turns";
  		}
  		case ART_NENYA:
  		{
! 			return "large frost ball (200) every 325+d325 turns";
  		}
  		case ART_VILYA:
  		{
! 			return "large lightning ball (250) every 425+d425 turns";
  		}
  		case ART_POWER:
  		{
! 			return "bizarre things every 450+d450 turns";
  		}
  	}
  
--- 1947,2161 ----
  	{
  		case ART_NARTHANC:
  		{
!             return "for a fire bolt (9d8) every 8+d8 turns";
  		}
  		case ART_NIMTHANC:
  		{
!             return "for a frost bolt (6d8) every 7+d7 turns";
  		}
  		case ART_DETHANC:
  		{
!             return "for a lightning bolt (4d8) every 6+d6 turns";
  		}
  		case ART_RILIA:
  		{
!             return "for a stinking cloud (12) every 4+d4 turns";
  		}
  		case ART_BELANGIL:
  		{
!             return "for a frost ball (48) every 5+d5 turns";
  		}
  		case ART_DAL:
  		{
!             return "to remove fear and cure poison every 5 turns";
  		}
  		case ART_RINGIL:
  		{
!             return "for a frost ball (100) every 300 turns";
  		}
  		case ART_ANDURIL:
  		{
!             return "for a fire ball (72) every 400 turns";
  		}
  		case ART_FIRESTAR:
  		{
!             return "for a large fire ball (72) every 100 turns";
  		}
  		case ART_FEANOR:
  		{
!             return "to haste self (20+d20 turns) every 200 turns";
  		}
  		case ART_THEODEN:
  		{
!             return "to drain life (120) every 400 turns";
  		}
  		case ART_TURMIL:
  		{
!             return "to drain life (90) every 70 turns";
  		}
  		case ART_CASPANION:
  		{
!             return "for door and trap destruction every 10 turns";
  		}
  		case ART_AVAVIR:
  		{
!             return "for word of recall every 200 turns";
  		}
  		case ART_TARATOL:
  		{
!             return "to haste self (20+d20 turns) every 100+d100 turns";
  		}
  		case ART_ERIRIL:
  		{
!             return "tp identify every 10 turns";
  		}
  		case ART_OLORIN:
  		{
!             return "for probing every 20 turns";
  		}
  		case ART_EONWE:
  		{
!             return "for mass genocide every 1000 turns";
  		}
  		case ART_LOTHARANG:
  		{
!             return "to cure wounds (4d7) every 3+d3 turns";
  		}
  		case ART_CUBRAGOL:
  		{
!             return "for fire branding of bolts every 999 turns";
  		}
  		case ART_ARUNRUTH:
  		{
!             return "for a frost bolt (12d8) every 500 turns";
  		}
  		case ART_AEGLOS:
  		{
!             return "for a frost ball (100) every 500 turns";
  		}
  		case ART_OROME:
  		{
!             return "for stone to mud every 5 turns";
  		}
  		case ART_SOULKEEPER:
  		{
!             return "to heal (1000) every 888 turns";
  		}
  		case ART_BELEGENNON:
  		{
!             return "for phase door every 2 turns";
  		}
  		case ART_CELEBORN:
  		{
!             return "for genocide every 500 turns";
  		}
  		case ART_LUTHIEN:
  		{
!             return "to restore life levels every 450 turns";
  		}
  		case ART_ULMO:
  		{
!             return "to teleport away every 150 turns";
  		}
  		case ART_COLLUIN:
  		{
!             return "for resistance (20+d20 turns) every 111 turns";
  		}
  		case ART_HOLCOLLETH:
  		{
!             return "for Sleep II every 55 turns";
  		}
  		case ART_THINGOL:
  		{
!             return "for recharge item I every 70 turns";
  		}
  		case ART_COLANNON:
  		{
!             return "for teleport every 45 turns";
  		}
  		case ART_TOTILA:
  		{
!             return "for confuse monster every 15 turns";
  		}
  		case ART_CAMMITHRIM:
  		{
!             return "for a magic missile (2d6) every 2 turns";
  		}
  		case ART_PAURHACH:
  		{
!             return "for a fire bolt (9d8) every 8+d8 turns";
  		}
  		case ART_PAURNIMMEN:
  		{
!             return "for a frost bolt (6d8) every 7+d7 turns";
  		}
  		case ART_PAURAEGEN:
  		{
!             return "for a lightning bolt (4d8) every 6+d6 turns";
  		}
  		case ART_PAURNEN:
  		{
!             return "for a acid bolt (5d8) every 5+d5 turns";
  		}
  		case ART_FINGOLFIN:
  		{
!             return "for a magical arrow (150) every 90+d90 turns";
  		}
  		case ART_HOLHENNETH:
  		{
!             return "for detection every 55+d55 turns";
  		}
  		case ART_GONDOR:
  		{
!             return "to heal (500) every 500 turns";
  		}
  		case ART_RAZORBACK:
  		{
!             return "for a star ball (150) every 1000 turns";
  		}
  		case ART_BLADETURNER:
  		{
!             return "for berserk rage, bless, and resistance every 400 turns";
  		}
  		case ART_GALADRIEL:
  		{
!             return "for illumination every 10+d10 turns";
  		}
  		case ART_ELENDIL:
  		{
!             return "for magic mapping every 50+d50 turns";
  		}
  		case ART_THRAIN:
  		{
!             return "for clairvoyance every 100+d100 turns";
  		}
  		case ART_INGWE:
  		{
!             return "to dispel evil (x5) every 300+d300 turns";
  		}
  		case ART_CARLAMMAS:
  		{
!             return "for protection from evil every 225+d225 turns";
  		}
  		case ART_TULKAS:
  		{
!             return "for haste self (75+d75 turns) every 150+d150 turns";
  		}
  		case ART_NARYA:
  		{
!             return "for a large fire ball (120) every 225+d225 turns";
  		}
  		case ART_NENYA:
  		{
!             return "for a large frost ball (200) every 325+d325 turns";
  		}
  		case ART_VILYA:
  		{
!             return "for a large lightning ball (250) every 425+d425 turns";
  		}
  		case ART_POWER:
  		{
!             return "for bizarre things every 450+d450 turns";
  		}
  	}
  
***************
*** 2162,2216 ****
  	{
  		case SV_DRAGON_BLUE:
  		{
! 			return "breathe lightning (100) every 450+d450 turns";
  		}
  		case SV_DRAGON_WHITE:
  		{
! 			return "breathe frost (110) every 450+d450 turns";
  		}
  		case SV_DRAGON_BLACK:
  		{
! 			return "breathe acid (130) every 450+d450 turns";
  		}
  		case SV_DRAGON_GREEN:
  		{
! 			return "breathe poison gas (150) every 450+d450 turns";
  		}
  		case SV_DRAGON_RED:
  		{
! 			return "breathe fire (200) every 450+d450 turns";
  		}
  		case SV_DRAGON_MULTIHUED:
  		{
! 			return "breathe multi-hued (250) every 225+d225 turns";
  		}
  		case SV_DRAGON_BRONZE:
  		{
! 			return "breathe confusion (120) every 450+d450 turns";
  		}
  		case SV_DRAGON_GOLD:
  		{
! 			return "breathe sound (130) every 450+d450 turns";
  		}
  		case SV_DRAGON_CHAOS:
  		{
! 			return "breathe chaos/disenchant (220) every 300+d300 turns";
  		}
  		case SV_DRAGON_LAW:
  		{
! 			return "breathe sound/shards (230) every 300+d300 turns";
  		}
  		case SV_DRAGON_BALANCE:
  		{
! 			return "breathe balance (250) every 300+d300 turns";
  		}
  		case SV_DRAGON_SHINING:
  		{
! 			return "breathe light/darkness (200) every 300+d300 turns";
  		}
  		case SV_DRAGON_POWER:
  		{
! 			return "breathe the elements (300) every 300+d300 turns";
  		}
  	}
  
--- 2168,2222 ----
  	{
  		case SV_DRAGON_BLUE:
  		{
!             return "to breathe lightning (100) every 450+d450 turns";
  		}
  		case SV_DRAGON_WHITE:
  		{
!             return "to breathe frost (110) every 450+d450 turns";
  		}
  		case SV_DRAGON_BLACK:
  		{
!             return "to breathe acid (130) every 450+d450 turns";
  		}
  		case SV_DRAGON_GREEN:
  		{
!             return "to breathe poison gas (150) every 450+d450 turns";
  		}
  		case SV_DRAGON_RED:
  		{
!             return "to breathe fire (200) every 450+d450 turns";
  		}
  		case SV_DRAGON_MULTIHUED:
  		{
!             return "to breathe multi-hued (250) every 225+d225 turns";
  		}
  		case SV_DRAGON_BRONZE:
  		{
!             return "to breathe confusion (120) every 450+d450 turns";
  		}
  		case SV_DRAGON_GOLD:
  		{
!             return "to breathe sound (130) every 450+d450 turns";
  		}
  		case SV_DRAGON_CHAOS:
  		{
!             return "to breathe chaos/disenchant (220) every 300+d300 turns";
  		}
  		case SV_DRAGON_LAW:
  		{
!             return "to breathe sound/shards (230) every 300+d300 turns";
  		}
  		case SV_DRAGON_BALANCE:
  		{
!             return "to breathe balance (250) every 300+d300 turns";
  		}
  		case SV_DRAGON_SHINING:
  		{
!             return "to breathe light/darkness (200) every 300+d300 turns";
  		}
  		case SV_DRAGON_POWER:
  		{
!             return "to breathe the elements (300) every 300+d300 turns";
  		}
  	}
  
***************
*** 2231,2247 ****
  
  	cptr info[128];
  
  
  	/* Extract the flags */
! 	object_flags(o_ptr, &f1, &f2, &f3);
  
  
  	/* 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.";
  	}
  
  
--- 2237,2271 ----
  
  	cptr info[128];
  
+     /* -RML */
+     cptr reclaim[128];
+     int num_reclaim = 0;
+     cptr new_str;
+     cptr new_buf;
+ 
+     int power;
+ 
  
  	/* Extract the flags */
!     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))
  	{
!         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;
  	}
  
  
***************
*** 2267,2364 ****
  
  	if (f1 & (TR1_STR))
  	{
! 		info[i++] = "It affects your strength.";
  	}
  	if (f1 & (TR1_INT))
  	{
! 		info[i++] = "It affects your intelligence.";
  	}
  	if (f1 & (TR1_WIS))
  	{
! 		info[i++] = "It affects your wisdom.";
  	}
  	if (f1 & (TR1_DEX))
  	{
! 		info[i++] = "It affects your dexterity.";
  	}
  	if (f1 & (TR1_CON))
  	{
! 		info[i++] = "It affects your constitution.";
  	}
  	if (f1 & (TR1_CHR))
  	{
! 		info[i++] = "It affects your charisma.";
  	}
  
  	if (f1 & (TR1_STEALTH))
  	{
! 		info[i++] = "It affects your stealth.";
  	}
  	if (f1 & (TR1_SEARCH))
  	{
! 		info[i++] = "It affects your searching.";
  	}
  	if (f1 & (TR1_INFRA))
  	{
! 		info[i++] = "It affects your infravision.";
  	}
  	if (f1 & (TR1_TUNNEL))
  	{
! 		info[i++] = "It affects your ability to tunnel.";
  	}
  	if (f1 & (TR1_SPEED))
  	{
! 		info[i++] = "It affects your speed.";
  	}
  	if (f1 & (TR1_BLOWS))
  	{
! 		info[i++] = "It affects your attack speed.";
  	}
  	if (f1 & (TR1_SHOTS))
  	{
! 		info[i++] = "It affects your shooting speed.";
  	}
  	if (f1 & (TR1_MIGHT))
  	{
! 		info[i++] = "It affects your shooting power.";
  	}
  
  	if (f1 & (TR1_SLAY_ANIMAL))
  	{
! 		info[i++] = "It is especially deadly against natural creatures.";
  	}
  	if (f1 & (TR1_SLAY_EVIL))
  	{
! 		info[i++] = "It fights against evil with holy fury.";
  	}
  	if (f1 & (TR1_SLAY_UNDEAD))
  	{
! 		info[i++] = "It strikes at undead with holy wrath.";
  	}
  	if (f1 & (TR1_SLAY_DEMON))
  	{
! 		info[i++] = "It strikes at demons with holy wrath.";
  	}
  	if (f1 & (TR1_SLAY_ORC))
  	{
! 		info[i++] = "It is especially deadly against orcs.";
  	}
  	if (f1 & (TR1_SLAY_TROLL))
  	{
! 		info[i++] = "It is especially deadly 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.";
  	}
  
  	if (f1 & (TR1_KILL_DRAGON))
  	{
! 		info[i++] = "It is a great bane of dragons.";
  	}
  
  	if (f1 & (TR1_BRAND_ACID))
--- 2291,2517 ----
  
  	if (f1 & (TR1_STR))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         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))
  	{
!         /* 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 deals double damage against natural creatures.";
  	}
  	if (f1 & (TR1_SLAY_EVIL))
  	{
!         info[i++] = "It deals double damage against evil monsters.";
  	}
  	if (f1 & (TR1_SLAY_UNDEAD))
  	{
!         info[i++] = "It is triply effective against undead.";
  	}
  	if (f1 & (TR1_SLAY_DEMON))
  	{
!         info[i++] = "It deals triple damage against demons.";
  	}
  	if (f1 & (TR1_SLAY_ORC))
  	{
!         info[i++] = "It is triply deadly against orcs.";
  	}
  	if (f1 & (TR1_SLAY_TROLL))
  	{
!         info[i++] = "It deals triple damage against trolls.";
  	}
  	if (f1 & (TR1_SLAY_GIANT))
  	{
!         info[i++] = "It is triply deadly against giants.";
  	}
  
  	if (f1 & (TR1_KILL_DRAGON))
  	{
!         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))
***************
*** 2556,2562 ****
  
  	if (f3 & (TR3_DRAIN_EXP))
  	{
! 		info[i++] = "It drains experience.";
  	}
  
  	if (f3 & (TR3_BLESSED))
--- 2709,2715 ----
  
  	if (f3 & (TR3_DRAIN_EXP))
  	{
!         info[i++] = "It drains your experience.";
  	}
  
  	if (f3 & (TR3_BLESSED))
***************
*** 2642,2647 ****
--- 2795,2807 ----
  
  	/* 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-290-id/src: object1.c.orig
Only in angband-290-id/src: object1.c.rej
diff -c -x *.plg -x *.ncb angband-290/src/tables.c angband-290-id/src/tables.c
*** angband-290/src/tables.c	Sun Apr  9 22:42:30 2000
--- angband-290-id/src/tables.c	Sat Apr 15 23:15:58 2000
***************
*** 2735,2741 ****
  	"cheat_xtra",				/* OPT_cheat_xtra */
  	"cheat_know",				/* OPT_cheat_know */
  	"cheat_live",				/* OPT_cheat_live */
! 	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
--- 2735,2741 ----
  	"cheat_xtra",				/* OPT_cheat_xtra */
  	"cheat_know",				/* OPT_cheat_know */
  	"cheat_live",				/* OPT_cheat_live */
!     "cheat_item",               /* OPT_cheat_item */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
***************
*** 2799,2805 ****
  	"score_xtra",				/* OPT_score_xtra */
  	"score_know",				/* OPT_score_know */
  	"score_live",				/* OPT_score_live */
! 	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
--- 2799,2805 ----
  	"score_xtra",				/* OPT_score_xtra */
  	"score_know",				/* OPT_score_know */
  	"score_live",				/* OPT_score_live */
!     "score_item",               /* OPT_score_item */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
  	NULL,						/* xxx */
***************
*** 2999,3005 ****
  	"Cheat: Peek into something else",			/* OPT_cheat_xtra */
  	"Cheat: Know complete monster info",		/* OPT_cheat_know */
  	"Cheat: Allow player to avoid death",		/* OPT_cheat_live */
! 	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
--- 2999,3005 ----
  	"Cheat: Peek into something else",			/* OPT_cheat_xtra */
  	"Cheat: Know complete monster info",		/* OPT_cheat_know */
  	"Cheat: Allow player to avoid death",		/* OPT_cheat_live */
!     "Cheat: Know complete object info",         /* OPT_cheat_item */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
***************
*** 3063,3069 ****
  	"Score: Peek into something else",			/* OPT_score_xtra */
  	"Score: Know complete monster info",		/* OPT_score_know */
  	"Score: Allow player to avoid death",		/* OPT_score_live */
! 	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
--- 3063,3069 ----
  	"Score: Peek into something else",			/* OPT_score_xtra */
  	"Score: Know complete monster info",		/* OPT_score_know */
  	"Score: Allow player to avoid death",		/* OPT_score_live */
!     "Score: Know complete object info",         /* OPT_score_item */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
  	NULL,										/* xxx */
***************
*** 3263,3269 ****
  	FALSE,		/* OPT_cheat_xtra */
  	FALSE,		/* OPT_cheat_know */
  	FALSE,		/* OPT_cheat_live */
! 	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
--- 3263,3269 ----
  	FALSE,		/* OPT_cheat_xtra */
  	FALSE,		/* OPT_cheat_know */
  	FALSE,		/* OPT_cheat_live */
!     FALSE,      /* OPT_cheat_item */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
***************
*** 3327,3333 ****
  	FALSE,		/* OPT_score_xtra */
  	FALSE,		/* OPT_score_know */
  	FALSE,		/* OPT_score_live */
! 	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
--- 3327,3333 ----
  	FALSE,		/* OPT_score_xtra */
  	FALSE,		/* OPT_score_know */
  	FALSE,		/* OPT_score_live */
!     FALSE,      /* OPT_score_item */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
  	FALSE,		/* xxx */
***************
*** 3497,3503 ****
  		OPT_cheat_xtra,
  		OPT_cheat_know,
  		OPT_cheat_live,
! 		255,
  		255,
  		255,
  		255,
--- 3497,3503 ----
  		OPT_cheat_xtra,
  		OPT_cheat_know,
  		OPT_cheat_live,
!         OPT_cheat_item,
  		255,
  		255,
  		255,
