Only in src.dev: .accepted
diff -u src/act.h src.dev/act.h
--- src/act.h	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/act.h	2012-11-13 16:19:59.000000000 -0600
@@ -51,6 +51,7 @@
  * Begin Functions and defines for act.informative.c
  ****************************************************************************/
 /* Utility Functions */
+void diag_char_to_char(struct char_data *victim, struct char_data *ch);
 /** @todo Move to a utility library */
 char *find_exdesc(char *word, struct extra_descr_data *list);
 /** @todo Move to a mud centric string utility library */
@@ -221,11 +222,12 @@
 #define SCMD_AUTOMAP     25
 #define SCMD_AUTOKEY     26
 #define SCMD_AUTODOOR    27
-#define SCMD_COLOR       28
-#define SCMD_SYSLOG      29
-#define SCMD_WIMPY       30
-#define SCMD_PAGELENGTH  31
-#define SCMD_SCREENWIDTH 32
+#define SCMD_MELEE_HEALTH_MSGS 28
+#define SCMD_COLOR       29
+#define SCMD_SYSLOG      30
+#define SCMD_WIMPY       31
+#define SCMD_PAGELENGTH  32
+#define SCMD_SCREENWIDTH 33
 
 /* do_quit */
 ACMD(do_quit);
diff -u src/act.informative.c src.dev/act.informative.c
--- src/act.informative.c	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/act.informative.c	2012-11-13 18:42:38.000000000 -0600
@@ -29,8 +29,6 @@
 #include "asciimap.h"
 
 /* prototypes of local functions */
-/* do_diagnose utility functions */
-static void diag_char_to_char(struct char_data *i, struct char_data *ch);
 /* do_look and do_examine utility functions */
 static void do_auto_exits(struct char_data *ch);
 static void list_char_to_char(struct char_data *list, struct char_data *ch);
@@ -219,34 +217,74 @@
     send_to_char(ch, "  Nothing.\r\n");
 }
 
-static void diag_char_to_char(struct char_data *i, struct char_data *ch)
+void diag_char_to_char(struct char_data *victim, struct char_data *ch)
 {
   struct {
-    byte percent;
-    const char *text;
+  byte percent;    
+  const char *self, *other, *text;
   } diagnosis[] = {
-    { 100, "is in excellent condition."			},
-    {  90, "has a few scratches."			},
-    {  75, "has some small wounds and bruises."		},
-    {  50, "has quite a few wounds."			},
-    {  30, "has some big nasty wounds and scratches."	},
-    {  15, "looks pretty hurt."				},
-    {   0, "is in awful condition."			},
-    {  -1, "is bleeding awfully from big wounds."	},
+    { 100, "are", "is", "in excellent condition."		},
+    {  90, "have", "has", "a few scratches."			},
+    {  75, "have", "has", "some small wounds and bruises."	},
+    {  50, "have", "has", "quite a few wounds."			},
+    {  30, "have", "has", "some big nasty wounds and scratches."  },
+    {  15, "are", "looks", "pretty hurt."			},
+    {   0, "are", "is", "in awful condition."			},
+    {  -1, "are", "is", "bleeding awfully from big wounds."	},
   };
-  int percent, ar_index;
-  const char *pers = PERS(i, ch);
+  int ar_index;
 
-  if (GET_MAX_HIT(i) > 0)
-    percent = (100 * GET_HIT(i)) / GET_MAX_HIT(i);
+  /* use a fighting victim's melee health message number */
+  if (FIGHTING(victim) != NULL) ar_index = victim->melee_health_message;
+  // remember: POS_FIGHTING and FIGHTING(...) are distinct
   else
-    percent = -1;		/* How could MAX_HIT be < 1?? */
+  {
+    int percent;
 
-  for (ar_index = 0; diagnosis[ar_index].percent >= 0; ar_index++)
-    if (percent >= diagnosis[ar_index].percent)
-      break;
+    if (GET_MAX_HIT(victim) > 0)
+      percent = (100 * GET_HIT(victim)) / GET_MAX_HIT(victim);
+    else
+      percent = -1;		/* How could MAX_HIT be < 1?? */
 
-  send_to_char(ch, "%c%s %s\r\n", UPPER(*pers), pers + 1, diagnosis[ar_index].text);
+    for (ar_index = 0; diagnosis[ar_index].percent >= 0; ar_index++)
+      if (percent >= diagnosis[ar_index].percent)
+        break;
+  }
+  /* show victim own health */
+  if (ch == victim)
+  {
+    send_to_char(ch, "You %s %s\r\n", diagnosis[ar_index].self, diagnosis[ar_index].text);
+    return;
+  }
+  /* show normal ch victim's health */ 
+  if (ch != victim->master)
+  {
+    const char *pers = PERS(victim, ch);
+    send_to_char(ch, "%c%s %s %s\r\n", UPPER(*pers), pers + 1, diagnosis[ar_index].other,
+                 diagnosis[ar_index].text);
+    return;
+  }
+  /* let master know */
+  const char *pers = PERS(victim, ch);
+  if (GET_POS(ch) == POS_SLEEPING)
+  {
+    send_to_char(ch, "You dream about %s ", pers);
+    if (ar_index > 0 || ar_index < 5)
+      send_to_char(ch, "having %s", diagnosis[ar_index].text);
+    if (ar_index == 0 || ar_index > 5)
+      send_to_char(ch, "%s", diagnosis[ar_index].text);
+    if (ar_index == 5)
+      send_to_char(ch, "looking %s", diagnosis[ar_index].text);
+    return;
+  }
+  if (IN_ROOM(ch) != IN_ROOM(victim))
+  {
+  send_to_char(ch, "You sense %s %s %s\r\n", pers, diagnosis[ar_index].other,
+               diagnosis[ar_index].text);
+    return;
+  }
+  send_to_char(ch, "%c%s %s %s\r\n", UPPER(*pers), pers + 1, diagnosis[ar_index].other,
+              diagnosis[ar_index].text);      
 }
 
 static void look_at_char(struct char_data *i, struct char_data *ch)
@@ -259,7 +297,8 @@
    if (i->player.description)
     send_to_char(ch, "%s", i->player.description);
   else
-    act("You see nothing special about $m.", FALSE, i, 0, ch, TO_VICT);
+  (ch == i) ? send_to_char(ch, "You see nothing special about yourself.\r\n")
+            : act("You see nothing special about $m.", FALSE, i, 0, ch, TO_VICT);
 
   diag_char_to_char(i, ch);
 
@@ -722,13 +761,19 @@
     }
     if (!*arg)			/* "look" alone, without an argument at all */
       look_at_room(ch, 1);
+    else if (!str_cmp(arg, "self"))
+      look_at_target(ch, GET_NAME(ch));
     else if (is_abbrev(arg, "in"))
       look_in_obj(ch, arg2);
     /* did the char type 'look <direction>?' */
     else if ((look_type = search_block(arg, dirs, FALSE)) >= 0)
       look_in_direction(ch, look_type);
     else if (is_abbrev(arg, "at"))
-      look_at_target(ch, arg2);
+    {
+      if (!str_cmp(arg2, "self"))
+      look_at_target(ch, GET_NAME(ch));
+      else look_at_target(ch, arg2);
+    }
     else if (is_abbrev(arg, "around")) {
       struct extra_descr_data *i;
 
@@ -1911,6 +1956,9 @@
     {"autodoor", PRF_AUTODOOR, 0,
     "You will now need to specify a door direction when opening, closing and unlocking.\r\n",
     "You will now find the next available door when opening, closing or unlocking.\r\n"},
+    {"healthmsg", PRF_MELEE_HEALTH_MSGS, 0,
+    "You will now see melee health messages.\r\n",
+    "You will no longer see melee health messages.\r\n"},
     {"color", 0, 0, "\n", "\n"},
     {"syslog", 0, LVL_IMMORT, "\n", "\n"},
     {"wimpy", 0, 0, "\n", "\n"},
@@ -2031,6 +2079,7 @@
 
     ONOFF(PRF_FLAGGED(ch, PRF_AUTOKEY)),
     ONOFF(PRF_FLAGGED(ch, PRF_AUTODOOR)),
+    ONOFF(PRF_FLAGGED(ch, PRF_MELEE_HEALTH_MSGS)),
     types[COLOR_LEV(ch)]);
     return;
   }
Only in src.dev: act.informative.c~
diff -u src/act.other.c src.dev/act.other.c
--- src/act.other.c	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/act.other.c	2012-11-13 16:19:59.000000000 -0600
@@ -749,7 +749,9 @@
     {"Autokey disabled.\r\n",
     "Autokey enabled.\r\n"},
     {"Autodoor disabled.\r\n",
-    "Autodoor enabled.\r\n"}
+    "Autodoor enabled.\r\n"},
+    {"Melee health messages disabled.\r\n",
+    "Melee health messages enabled.\r\n"}
   };
 
   if (IS_NPC(ch))
@@ -860,6 +862,9 @@
   case SCMD_AUTODOOR:
     result = PRF_TOG_CHK(ch, PRF_AUTODOOR);
     break;
+  case SCMD_MELEE_HEALTH_MSGS:
+    result = PRF_TOG_CHK(ch, PRF_MELEE_HEALTH_MSGS);
+    break;
   default:
     log("SYSERR: Unknown subcmd %d in do_gen_toggle.", subcmd);
     return;
Only in src.dev: conf.h
diff -u src/constants.c src.dev/constants.c
--- src/constants.c	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/constants.c	2012-11-13 16:19:59.000000000 -0600
@@ -252,6 +252,7 @@
   "AUTOMAP",
   "AUTOKEY",
   "AUTODOOR",
+  "HEALTHMSG",
   "\n"
 };
 
Only in src.dev: depend
diff -u src/fight.c src.dev/fight.c
--- src/fight.c	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/fight.c	2012-11-13 18:36:07.000000000 -0600
@@ -593,6 +593,21 @@
 	  attack_hit_text[w_type].singular, attack_hit_text[w_type].plural);
   act(buf, FALSE, ch, NULL, victim, TO_VICT | TO_SLEEP);
   send_to_char(victim, CCNRM(victim, C_CMP));
+
+  /* if victim's health message has changed */
+  if (victim->melee_health_message != victim->prior_melee_health_message)
+  {
+    /* show it to PCs in the room who want to see it and are in the fight or 
+       the victim's master */
+    for (ch = world[IN_ROOM(victim)].people; ch; ch = ch->next_in_room) 
+      if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_MELEE_HEALTH_MSGS)
+      && (ch == victim || FIGHTING(ch) == victim || FIGHTING(ch) == FIGHTING(victim) 
+         || ch == victim->master))
+        diag_char_to_char(victim, ch);
+    /* let victims' masters in another room know */
+    if ((victim->master) && IN_ROOM(victim) != IN_ROOM(victim->master))
+      diag_char_to_char(victim, victim->master);
+  }
 }
 
 /*  message for doing damage with a spell or skill. Also used for weapon
@@ -735,16 +750,39 @@
       dam = 0;
   }
 
-  /* Set the maximum damage per round and subtract the hit points */
+  /* Set the maximum damage per round */
   dam = MAX(MIN(dam, 100), 0);
-  GET_HIT(victim) -= dam;
-
-  /* Gain exp for the hit */
-  if (ch != victim)
-    gain_exp(ch, GET_LEVEL(victim) * dam);
-
-  update_pos(victim);
 
+  if (dam > 0)
+  {
+    /* store victim's health message before damage */
+    int health_percent;
+    health_percent = (100 * GET_HIT(victim)/GET_MAX_HIT(victim));
+    if (health_percent >= 100) victim->prior_melee_health_message = 0;
+    else if (health_percent >= 90) victim->prior_melee_health_message = 1;
+    else if (health_percent >= 75) victim->prior_melee_health_message = 2;
+    else if (health_percent >= 50) victim->prior_melee_health_message = 3;
+    else if (health_percent >= 30) victim->prior_melee_health_message = 4;
+    else if (health_percent >= 15) victim->prior_melee_health_message = 5;
+    else victim->prior_melee_health_message = 6;
+
+    /* subtract the hit points */
+    GET_HIT(victim) -= dam;
+
+    /* store victim's health message after damage */
+    health_percent = 100 * GET_HIT(victim)/GET_MAX_HIT(victim);
+    if (health_percent >= 90) victim->melee_health_message = 1;
+    else if (health_percent >= 75) victim->melee_health_message = 2;
+    else if (health_percent >= 50) victim->melee_health_message = 3;
+    else if (health_percent >= 30) victim->melee_health_message = 4;
+    else if (health_percent >= 15) victim->melee_health_message = 5;
+    else victim->melee_health_message = 6;
+
+    /* Gain exp for the hit */
+    if (ch != victim)
+      gain_exp(ch, GET_LEVEL(victim) * dam);
+  }
+    update_pos(victim);
   /* skill_message sends a message from the messages file in lib/misc.
    * dam_message just sends a generic "You hit $n extremely hard.".
    * skill_message is preferable to dam_message because it is more
Only in src.dev: fight.c~
diff -u src/interpreter.c src.dev/interpreter.c
--- src/interpreter.c	2012-04-04 18:13:22.000000000 -0500
+++ src.dev/interpreter.c	2012-11-13 16:19:59.000000000 -0600
@@ -181,6 +181,7 @@
   { "holler"   , "holler"  , POS_RESTING , do_gen_comm , 1, SCMD_HOLLER },
   { "holylight", "holy"    , POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_HOLYLIGHT },
   { "house"    , "house"   , POS_RESTING , do_house    , 0, 0 },
+  { "healthmsg", "he"      , POS_DEAD    , do_gen_tog, 0, SCMD_MELEE_HEALTH_MSGS },
 
   { "inventory", "i"       , POS_DEAD    , do_inventory, 0, 0 },
   { "identify" , "id"      , POS_STANDING, do_not_here , 1, 0 },
Only in src.dev: Makefile
diff -u src/structs.h src.dev/structs.h
--- src/structs.h	2012-04-04 18:11:23.000000000 -0500
+++ src.dev/structs.h	2012-11-13 16:19:59.000000000 -0600
@@ -266,8 +266,9 @@
 #define PRF_AUTOMAP      31   /**< Show map at the side of room descs */
 #define PRF_AUTOKEY      32   /**< Automatically unlock locked doors when opening */
 #define PRF_AUTODOOR     33   /**< Use the next available door */
+#define PRF_MELEE_HEALTH_MSGS 34 /**< Show melee health messages */
 /** Total number of available PRF flags */
-#define NUM_PRF_FLAGS    34
+#define NUM_PRF_FLAGS    35
 
 /* Affect bits: used in char_data.char_specials.saved.affected_by */
 /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */
@@ -1007,6 +1008,8 @@
   room_rnum in_room;     /**< Current location (real room number) */
   room_rnum was_in_room; /**< Previous location for linkdead people  */
   int wait;              /**< wait for how many loops before taking action. */
+  sh_int melee_health_message;
+  sh_int prior_melee_health_message;
 
   struct char_player_data player;       /**< General PC/NPC data */
   struct char_ability_data real_abils;  /**< Abilities without modifiers */
Common subdirectories: src/util and src.dev/util