diff -uNp ./orig/act.informative.c ./act.informative.c
--- ./orig/act.informative.c	Fri May  9 20:50:57 2003
+++ ./act.informative.c	Fri May  9 20:56:38 2003
@@ -735,6 +735,9 @@ ACMD(do_score)
   send_to_char(ch, "This ranks you as %s %s (level %d).\r\n",
 	  GET_NAME(ch), GET_TITLE(ch), GET_LEVEL(ch));
 
+  if (GUARDING(ch) != NULL)
+    send_to_char(ch, "You are guarding %s.\r\n", PERS(GUARDING(ch), ch));
+
   switch (GET_POS(ch)) {
   case POS_DEAD:
     send_to_char(ch, "You are DEAD!\r\n");
diff -uNp ./orig/act.offensive.c ./act.offensive.c
--- ./orig/act.offensive.c	Fri May  9 20:50:57 2003
+++ ./act.offensive.c	Fri May  9 20:59:13 2003
@@ -38,6 +38,7 @@ ACMD(do_flee);
 ACMD(do_bash);
 ACMD(do_rescue);
 ACMD(do_kick);
+ACMD(do_guard);
 
 
 ACMD(do_assist)
@@ -449,3 +450,99 @@ ACMD(do_kick)
 
   WAIT_STATE(ch, PULSE_VIOLENCE * 3);
 }
+
+
+void die_guards(struct char_data *ch)
+{
+  struct char_data *temp_ch = NULL, *next_ch = NULL;
+
+  if (ch == NULL)
+    log("die_guards(): Invalid 'ch' char_data pointer.");
+  else {
+    /* Stop them from guarding if they currently are. */
+    if (GUARDING(ch) != NULL)
+      stop_guarding(ch);
+
+    /* Stop anyone who is presently guarding them. */
+    for (temp_ch = ch->guarded_by; temp_ch != NULL; temp_ch = next_ch) {
+      next_ch = temp_ch->next_guarding;
+      stop_guarding(temp_ch);
+    }
+  }
+}
+
+
+void set_guarding(struct char_data *ch, struct char_data *vict)
+{
+  if (ch == NULL)
+    log("set_guarding(): Invalid character pointer.");
+  else if (vict == NULL)
+    log("set_guarding(): No 'vict' character to guard.");
+  else if (ch == vict)
+    log("set_guarding(): Can't set character '%s' guarding %sself.",
+        GET_NAME(ch), HMHR(ch));
+  else {
+    /* If we're guarding, stop. */
+    if (GUARDING(ch) != NULL)
+      stop_guarding(ch);
+
+    /* Add ch to the list of the charge's guards. */
+    ch->next_guarding = vict->guarded_by;
+    vict->guarded_by = ch;
+    GUARDING(ch) = vict;
+  }
+}
+
+
+void stop_guarding(struct char_data *ch)
+{
+  struct char_data *temp = NULL;
+
+  if (ch == NULL)
+    log("stop_guarding(): Invalid character pointer.");
+  else if (GUARDING(ch) != NULL) {
+    REMOVE_FROM_LIST(ch, GUARDING(ch)->guarded_by, next_guarding);
+    GUARDING(ch) = NULL;
+    ch->next_guarding = NULL;
+  }
+}
+
+
+ACMD(do_guard)
+{
+  char arg1[MAX_INPUT_LENGTH] = {'\0'};
+  struct char_data *vict = NULL;
+
+  argument = one_argument(argument, arg1);
+
+  if (*arg1 == '\0') {
+    if (GUARDING(ch) != NULL)
+      send_to_char(ch, "You are guarding %s.\r\n", PERS(GUARDING(ch), ch));
+    else
+      send_to_char(ch, "You are guarding only yourself.\r\n");
+  } else if ((vict = get_char_vis(ch, arg1, NULL, FIND_CHAR_ROOM)) == NULL)
+    send_to_char(ch, "%s", NOPERSON);
+  else if (FIGHTING(ch) == vict || FIGHTING(vict) == ch)
+    send_to_char(ch, "You can't guard someone you're fighting!\r\n");
+  else {
+    if (vict == ch) {
+      if (GUARDING(ch) == NULL)
+        send_to_char(ch, "You're already guarding yourself!\r\n");
+      else {
+        act("$n is no longer guarding you.", TRUE, ch, NULL, GUARDING(ch), TO_VICT);
+        act("$n is no longer guarding $N.", TRUE, ch, NULL, GUARDING(ch),TO_NOTVICT);
+        act("You are no longer guarding $N.", TRUE, ch, NULL, GUARDING(ch), TO_CHAR);
+        stop_guarding(ch);
+      }
+    } else {
+      if (GUARDING(ch) == vict)
+        send_to_char(ch, "You're already guarding %s.\r\n", PERS(vict, ch));
+      else {
+        act("$n guards you.", TRUE, ch, NULL, vict, TO_VICT);
+        act("$n guards $N.", TRUE, ch, NULL, vict, TO_NOTVICT);
+        act("You guard $N.", TRUE, ch, NULL, vict, TO_CHAR);
+        set_guarding(ch, vict);
+      }
+    }
+  }
+}
Common subdirectories: ./orig/doc and ./doc
diff -uNp ./orig/fight.c ./fight.c
--- ./orig/fight.c	Fri May  9 20:50:57 2003
+++ ./fight.c	Fri May  9 21:10:33 2003
@@ -268,6 +268,71 @@ void stop_fighting(struct char_data *ch)
 }
 
 
+bool check_guard(struct char_data *ch, struct char_data *victim)
+{
+  bool result = FALSE;
+  int count = 0;
+  struct char_data *tch = NULL, *tch2 = NULL;
+  
+  if (ch == NULL)
+    log("check_guard(): Invalid 'ch' char_data pointer.");
+  else if (victim == NULL)
+    log("check_guard(): Invalid 'victim' char_data pointer.");
+  else if (victim->guarded_by != NULL && IN_ROOM(ch) == IN_ROOM(victim)) {
+    for (tch = victim->guarded_by; tch != NULL; tch = tch->next_guarding) {
+      if (FIGHTING(tch) == NULL && IN_ROOM(tch) == IN_ROOM(ch))
+	break;
+
+      if (FIGHTING(tch) != ch && CAN_SEE(tch, ch) &&
+	  IN_ROOM(tch) == IN_ROOM(ch)) {
+	/* Count the number of opponents the guard has. */
+	for (tch2 = world[IN_ROOM(tch)].people, count=0; tch2 != NULL;
+	  tch2 = tch2->next_in_room) {
+	  if (tch2 != tch && FIGHTING(tch2) == tch)
+	    count++;
+	}
+	/*
+	 * The guard has a 1:N chance to protect the person he or she
+	 * is protecting.  The more people they fight the smaller the
+	 * chance they will be able to draw another attacker off their
+	 * master.
+	 */
+	if (!rand_number(0, count))
+	  break;
+      }
+    }
+
+    if (tch != NULL) {
+      /* Send out messages to the individual actors. */
+      send_to_char(victim, "%s protects you from %s.\r\n", PERS(tch, victim),
+	PERS(ch, victim));
+      send_to_char(tch, "You protect %s from %s.\r\n", PERS(victim, tch),
+	PERS(ch, tch));
+      send_to_char(ch, "%s protects %s from you.\r\n", PERS(tch, ch),
+	PERS(victim, ch));
+
+      /* Send a message to anyone else not addressed above. */
+      for (tch2 = world[IN_ROOM(tch)].people; tch2; tch2 =
+	tch2->next_in_room) {
+	if (tch2 == ch || tch2 == tch || tch2 == victim)
+	  continue;
+	send_to_char(tch2, "%s protects %s from %s.\r\n", PERS(tch, tch2),
+		PERS(victim, tch2), PERS(ch, tch2));
+      }
+
+      /* Set the appropriate persons fighting. */
+      if (FIGHTING(tch) == NULL)
+	set_fighting(tch, ch);
+      set_fighting(ch, tch);
+
+      result = TRUE;
+    }
+  }
+
+  return (result);
+}
+
+
 
 void make_corpse(struct char_data *ch)
 {
@@ -702,12 +767,18 @@ int damage(struct char_data *ch, struct 
     dam = 0;
 
   if (victim != ch) {
+    /* Check for guards. */
+    if (victim->guarded_by != NULL)  {
+      if (check_guard(ch, victim))
+	return (0);
+    }
+
     /* Start the attacker fighting the victim */
-    if (GET_POS(ch) > POS_STUNNED && (FIGHTING(ch) == NULL))
+    if (GET_POS(ch) > POS_STUNNED && FIGHTING(ch) == NULL)
       set_fighting(ch, victim);
 
     /* Start the victim fighting the attacker */
-    if (GET_POS(victim) > POS_STUNNED && (FIGHTING(victim) == NULL)) {
+    if (GET_POS(victim) > POS_STUNNED && FIGHTING(victim) == NULL) {
       set_fighting(victim, ch);
       if (MOB_FLAGGED(victim, MOB_MEMORY) && !IS_NPC(ch))
 	remember(victim, ch);
@@ -718,6 +789,14 @@ int damage(struct char_data *ch, struct 
   if (victim->master == ch)
     stop_follower(victim);
 
+  /* If you attack your guards they will stop guarding you. */
+  if (GUARDING(victim) == ch)
+    stop_guarding(victim);
+
+  /* If you attack someone you're guarding, you no longer guard them. */
+  if (GUARDING(ch) == victim)
+    stop_guarding(ch);
+
   /* If the attacker is invisible, he becomes visible */
   if (AFF_FLAGGED(ch, AFF_INVISIBLE | AFF_HIDE))
     appear(ch);
diff -uNp ./orig/handler.c ./handler.c
--- ./orig/handler.c	Fri May  9 20:50:57 2003
+++ ./handler.c	Fri May  9 21:11:01 2003
@@ -900,9 +900,12 @@ void extract_char_final(struct char_data
 
   /* On with the character's assets... */
 
-  if (ch->followers || ch->master)
+  if (ch->followers != NULL || ch->master != NULL)
     die_follower(ch);
 
+  if (ch->guarded_by != NULL || GUARDING(ch) != NULL)
+    die_guards(ch);
+
   /* transfer objects to room, if any */
   while (ch->carrying) {
     obj = ch->carrying;
diff -uNp ./orig/interpreter.c ./interpreter.c
--- ./orig/interpreter.c	Fri May  9 20:50:57 2003
+++ ./interpreter.c	Fri May  9 21:12:19 2003
@@ -104,6 +104,7 @@ ACMD(do_goto);
 ACMD(do_grab);
 ACMD(do_group);
 ACMD(do_gsay);
+ACMD(do_guard);
 ACMD(do_hcontrol);
 ACMD(do_help);
 ACMD(do_hide);
@@ -313,6 +314,7 @@ cpp_extern const struct command_info cmd
   { "growl"    , POS_RESTING , do_action   , 0, 0 },
   { "gsay"     , POS_SLEEPING, do_gsay     , 0, 0 },
   { "gtell"    , POS_SLEEPING, do_gsay     , 0, 0 },
+  { "guard"    , POS_STANDING, do_guard    , 0, 0 },
 
   { "help"     , POS_DEAD    , do_help     , 0, 0 },
   { "handbook" , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_HANDBOOK },
Common subdirectories: ./orig/orig and ./orig
diff -uNp ./orig/structs.h ./structs.h
--- ./orig/structs.h	Fri May  9 20:50:57 2003
+++ ./structs.h	Fri May  9 21:15:30 2003
@@ -792,6 +792,7 @@ struct char_special_data_saved {
 /* Special playing constants shared by PCs and NPCs which aren't in pfile */
 struct char_special_data {
    struct char_data *fighting;	/* Opponent				*/
+   struct char_data *guarding;	/* Who the character is guarding.	*/
    struct char_data *hunting;	/* Char hunted by this char		*/
 
    byte position;		/* Standing, fighting, sleeping, etc.	*/
@@ -921,9 +922,11 @@ struct char_data {
    struct obj_data *carrying;            /* Head of list                  */
    struct descriptor_data *desc;         /* NULL for mobiles              */
 
-   struct char_data *next_in_room;     /* For room->people - list         */
+   struct char_data *guarded_by;       /* List of guardians.		  */
    struct char_data *next;             /* For either monster or ppl-list  */
    struct char_data *next_fighting;    /* For fighting list               */
+   struct char_data *next_guarding;    /* Next char in guardians list.	  */
+   struct char_data *next_in_room;     /* For room->people - list         */
 
    struct follow_type *followers;        /* List of chars followers       */
    struct char_data *master;             /* Who is char following?        */
Common subdirectories: ./orig/util and ./util
diff -uNp ./orig/utils.h ./utils.h
--- ./orig/utils.h	Fri May  9 20:50:57 2003
+++ ./utils.h	Fri May  9 21:18:48 2003
@@ -73,6 +73,11 @@ void	add_follower(struct char_data *ch, 
 void	stop_follower(struct char_data *ch);
 bool	circle_follow(struct char_data *ch, struct char_data *victim);
 
+/* Guards */
+void die_guards(struct char_data *ch);
+void set_guarding(struct char_data *ch, struct char_data *vict);
+void stop_guarding(struct char_data *ch);
+
 /* in act.informative.c */
 void	look_at_room(struct char_data *ch, int mode);
 
@@ -306,6 +311,7 @@ void	update_pos(struct char_data *victim
 #define IS_CARRYING_W(ch) ((ch)->char_specials.carry_weight)
 #define IS_CARRYING_N(ch) ((ch)->char_specials.carry_items)
 #define FIGHTING(ch)	  ((ch)->char_specials.fighting)
+#define GUARDING(ch)	  ((ch)->char_specials.guarding)
 #define HUNTING(ch)	  ((ch)->char_specials.hunting)
 #define GET_SAVE(ch, i)	  ((ch)->char_specials.saved.apply_saving_throw[i])
 #define GET_ALIGNMENT(ch) ((ch)->char_specials.saved.alignment)
