diff -Pp -C4 3.1.10/src/README 3.1.11/src/README
*** 3.1.10/src/README	Wed Mar 19 21:33:16 1997
--- 3.1.11/src/README	Sat May 17 15:59:50 1997
***************
*** 1,5 ****
! Mythran Mud release 3.1.10
  Wed Mar 19, 1997
  
  
  === The src directory
--- 1,5 ----
! Mythran Mud release 3.1.11
  Wed Mar 19, 1997
  
  
  === The src directory
diff -Pp -C4 3.1.10/src/WHATSNEW.TXT 3.1.11/src/WHATSNEW.TXT
*** 3.1.10/src/WHATSNEW.TXT	Sat May 17 15:57:49 1997
--- 3.1.11/src/WHATSNEW.TXT	Fri Jun 27 21:36:25 1997
*************** Somewhere here:	Fixed a bug in saving of
*** 304,307 ****
--- 304,315 ----
  17-mar-1997:	Clan who and clan where are now in to help find clan members.
  		Wiznet levels has been activated.
  		Made sepparate clan donate.
  		Reboot and shutdown now execute an asave changed.
+ 
+ 07-jun-1997:	Fixed various small bugs.
+ 		Wiznet DEATHS implemented.
+ 
+ 16-jun-1997:	Various WIZNETs implemented
+ 		Added birthdays
+ 
+ 27-jun-1997:	Added creator name for socials. Need to do deletor still.
diff -Pp -C4 3.1.10/src/act_comm.c 3.1.11/src/act_comm.c
*** 3.1.10/src/act_comm.c	Sun Mar 16 15:14:47 1997
--- 3.1.11/src/act_comm.c	Sun Jun 15 15:01:00 1997
*************** void do_delete( CHAR_DATA *ch, char *arg
*** 68,83 ****
  		if (argument[0] != '\0')
  		{
  			send_to_char("Delete status removed.\n\r",ch);
  			ch->pcdata->confirm_delete = FALSE;
! 			sprintf (buf, "%s has decided not to self-delete.\n\r", ch->name );
! 			wiznet(ch, WIZ_LOGINS, 0, buf);
  			return;
  		}
  		else
  		{
! 			sprintf (buf, "%s has been turned into line noise.\n\r", ch->name );
! 			wiznet(ch, WIZ_LOGINS, 0, buf);
  
  #if !defined( macintosh ) && !defined( MSDOS )
  			sprintf( strsave, "%s%s%s%s", PLAYER_DIR,
  			initial( ch->name ), "/", capitalize( ch->name ) );
--- 68,86 ----
  		if (argument[0] != '\0')
  		{
  			send_to_char("Delete status removed.\n\r",ch);
  			ch->pcdata->confirm_delete = FALSE;
! 			sprintf (buf, "%s has decided not to self-delete.",
! 			    ch->name );
! 			wiznet(ch, WIZ_LOGINS, get_trust( ch ), buf);
  			return;
  		}
  		else
  		{
! 			sprintf (buf, "%s has been turned into line noise.",
! 			    ch->name );
! 			wiznet(ch, WIZ_LOGINS, get_trust( ch ), buf);
! 			log_string( buf );
  
  #if !defined( macintosh ) && !defined( MSDOS )
  			sprintf( strsave, "%s%s%s%s", PLAYER_DIR,
  			initial( ch->name ), "/", capitalize( ch->name ) );
*************** void do_delete( CHAR_DATA *ch, char *arg
*** 102,111 ****
  	send_to_char("WARNING: this command is irreversible.\n\r",ch);
  	send_to_char("Typing delete with an argument will undo.\n\r", ch);
  	ch->pcdata->confirm_delete = TRUE;
  
! 	sprintf (buf, "%s is contemplating deletion.\n\r", ch->name );
! 	wiznet(ch, WIZ_LOGINS, 0, buf);
  }
  
  bool is_note_to( CHAR_DATA *ch, NOTE_DATA *pnote )
  {
--- 105,114 ----
  	send_to_char("WARNING: this command is irreversible.\n\r",ch);
  	send_to_char("Typing delete with an argument will undo.\n\r", ch);
  	ch->pcdata->confirm_delete = TRUE;
  
! 	sprintf (buf, "%s is contemplating deletion.", ch->name );
! 	wiznet(ch, WIZ_LOGINS, get_trust( ch ), buf);
  }
  
  bool is_note_to( CHAR_DATA *ch, NOTE_DATA *pnote )
  {
*************** void do_quit( CHAR_DATA *ch, char *argum
*** 1371,1379 ****
  
      act( "$n has left the game.", ch, NULL, NULL, TO_ROOM );
      sprintf( log_buf, "%s has quit.", ch->name );
      log_string( log_buf );
!     wiznet (ch, WIZ_LOGINS, 0, log_buf );
  
      /*
       * After extract_char the ch is no longer valid!
       */
--- 1374,1382 ----
  
      act( "$n has left the game.", ch, NULL, NULL, TO_ROOM );
      sprintf( log_buf, "%s has quit.", ch->name );
      log_string( log_buf );
!     wiznet (ch, WIZ_LOGINS, get_trust( ch ), log_buf );
  
      /*
       * After extract_char the ch is no longer valid!
       */
diff -Pp -C4 3.1.10/src/act_info.c 3.1.11/src/act_info.c
*** 3.1.10/src/act_info.c	Mon Mar 17 21:21:35 1997
--- 3.1.11/src/act_info.c	Sat Jun 28 15:41:31 1997
*************** void do_look( CHAR_DATA *ch, char *argum
*** 472,479 ****
--- 472,480 ----
      OBJ_DATA  *obj;
      CHAR_DATA *victim;
      EXIT_DATA *pexit;
      ROOM_INDEX_DATA *original;
+     char       flag [ MAX_STRING_LENGTH ];
      char       buf  [ MAX_STRING_LENGTH ];
      char       arg1 [ MAX_INPUT_LENGTH  ];
      char       arg2 [ MAX_INPUT_LENGTH  ];
      char      *pdesc;
*************** void do_look( CHAR_DATA *ch, char *argum
*** 520,527 ****
--- 521,547 ----
  	if ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOEXIT ) )
  	    do_exits( ch, "auto" );
  	send_to_char( "{x", ch );
  
+ 	if ( IS_IMMORTAL( ch ) )
+ 	{
+ 	    sprintf( flag, "( %s%s%s%s%s%s%s%s%s%s%s%s ) [ %s ]\n\r",
+ 		ch->in_room->sector_type == SECT_INSIDE                  ? "Inside"       : "",
+ 		ch->in_room->sector_type == SECT_CITY                    ? "City"         : "",
+ 		ch->in_room->sector_type == SECT_FIELD                   ? "Field"        : "",
+ 		ch->in_room->sector_type == SECT_FOREST                  ? "Forest"       : "",
+ 		ch->in_room->sector_type == SECT_HILLS                   ? "Hills"        : "",
+ 		ch->in_room->sector_type == SECT_MOUNTAIN                ? "Mountain"     : "",
+ 		ch->in_room->sector_type == SECT_WATER_SWIM              ? "Water-swim"   : "",
+ 		ch->in_room->sector_type == SECT_WATER_NOSWIM            ? "Water-noswim" : "",
+ 		ch->in_room->sector_type == SECT_UNDERWATER              ? "Underwater"   : "",
+ 		ch->in_room->sector_type == SECT_AIR                     ? "Air"          : "",
+ 		ch->in_room->sector_type == SECT_DESERT                  ? "Desert"       : "",
+ 		ch->in_room->sector_type == SECT_MAX                     ? "Max"          : "",
+ 		room_flags_name( ch->in_room->room_flags ) );
+ 	    send_to_char( flag, ch );
+ 	}
+ 
  	send_to_char( "{y", ch );
  	if ( arg1[0] == '\0'
  	    || ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_BRIEF ) ) )
  	    send_to_char( ch->in_room->description, ch );
*************** void do_who( CHAR_DATA *ch, char *argume
*** 1343,1351 ****
  	    IS_SET( wch->act, PLR_KILLER	) ? "({BKILLER{x) "	: "",
  	    IS_SET( wch->act, PLR_THIEF		) ? "({BTHIEF{x) "	: "",
  	    IS_SET( wch->act, PLR_REGISTER	) ? "({BPK{x) "		: "",
  	    IS_SET( wch->act, PLR_AFK		) ? "({YAFK{x) "	: "",
! 	    (wch->pcdata->spouse != NULL	) ? "({YMARRIED{x)"	: "",
  	    wch->name,
  	    wch->pcdata->title,
  	    buf3 );
  	/* No who-text */
--- 1363,1371 ----
  	    IS_SET( wch->act, PLR_KILLER	) ? "({BKILLER{x) "	: "",
  	    IS_SET( wch->act, PLR_THIEF		) ? "({BTHIEF{x) "	: "",
  	    IS_SET( wch->act, PLR_REGISTER	) ? "({BPK{x) "		: "",
  	    IS_SET( wch->act, PLR_AFK		) ? "({YAFK{x) "	: "",
! 	    (wch->pcdata->spouse != NULL	) ? "({YMARRIED{x) "	: "",
  	    wch->name,
  	    wch->pcdata->title,
  	    buf3 );
  	/* No who-text */
*************** void do_whois( CHAR_DATA *ch, char *argu
*** 1463,1471 ****
  	    IS_SET( wch->act, PLR_KILLER	) ? "({BKILLER{x) "	: "",
  	    IS_SET( wch->act, PLR_THIEF		) ? "({BTHIEF{x) "	: "",
  	    IS_SET( wch->act, PLR_REGISTER	) ? "({BPK{x) "		: "",
  	    IS_SET( wch->act, PLR_AFK		) ? "({YAFK{x) "	: "",
! 	    (wch->pcdata->spouse != NULL)	  ? "({YMARRIED{x)"	: "",
  	    wch->name,
  	    wch->pcdata->title );
  	if ( !str_cmp ( wch->pcdata->who_text, "@" )
  		|| !str_cmp ( wch->pcdata->who_text, "" ) )
--- 1483,1491 ----
  	    IS_SET( wch->act, PLR_KILLER	) ? "({BKILLER{x) "	: "",
  	    IS_SET( wch->act, PLR_THIEF		) ? "({BTHIEF{x) "	: "",
  	    IS_SET( wch->act, PLR_REGISTER	) ? "({BPK{x) "		: "",
  	    IS_SET( wch->act, PLR_AFK		) ? "({YAFK{x) "	: "",
! 	    (wch->pcdata->spouse != NULL)	  ? "({YMARRIED{x) "	: "",
  	    wch->name,
  	    wch->pcdata->title );
  	if ( !str_cmp ( wch->pcdata->who_text, "@" )
  		|| !str_cmp ( wch->pcdata->who_text, "" ) )
*************** void do_pagelen ( CHAR_DATA *ch, char *a
*** 2740,2755 ****
  
      if ( lines < 19 )
      {
  	send_to_char( "Less than 19 lines of paged text is not allowed", ch );
! 	return;
      }
  
      if ( lines > 60 )
      {
! 	send_to_char(
! 		"I don't know of a screen that is larger than 60 lines!\n\r",
! 		     ch );
  	lines = 60;
      }
  
      ch->pcdata->pagelen = lines;
--- 2760,2774 ----
  
      if ( lines < 19 )
      {
  	send_to_char( "Less than 19 lines of paged text is not allowed", ch );
! 	lines = 19;
      }
  
      if ( lines > 60 )
      {
! 	send_to_char( "I don't know of a screen that is larger than 60 lines!\n\r",
! 	    ch );
  	lines = 60;
      }
  
      ch->pcdata->pagelen = lines;
*************** void do_remort( CHAR_DATA *ch, char *arg
*** 2904,2908 ****
--- 2923,2978 ----
      if (ch->max_mana < 200)
  	ch->max_mana = 200;
  
      return;
+ }
+ 
+ 
+ /*
+  * Birthdays by Canth (canth@xs4all.nl)
+  * This gives a random b-day gift to a player.
+  * Player ages approx. 1 year per 17.5 hours on-line
+  */
+ void birthday( CHAR_DATA *ch )
+ {
+     OBJ_DATA *obj = NULL;
+     char buf [ MAX_STRING_LENGTH ];
+ 
+     if ( IS_NPC( ch ) )
+     {
+ 	send_to_char( "Happy birthday!", ch );
+ 	return;
+     }
+ 
+     /* Inform everyone of the birthday */
+     /* Need to check for invis still */
+     sprintf( buf, "[NEWS] %s has aged a year and is now a respectfull %d years old!\n\r",
+ 	ch->name, get_age( ch ) );
+     send_to_all_char( buf );
+ 
+     switch( number_range( 1, 5 ) )
+     {
+ 	case 1:
+ 	    obj = create_object( get_obj_index( OBJ_VNUM_BDAY_1 ), ch->level );
+ 	    break;
+ 	case 2:
+ 	    obj = create_object( get_obj_index( OBJ_VNUM_BDAY_2 ), ch->level );
+ 	    break;
+ 	case 3:
+ 	    obj = create_object( get_obj_index( OBJ_VNUM_BDAY_3 ), ch->level );
+ 	    break;
+ 	case 4:
+ 	    obj = create_object( get_obj_index( OBJ_VNUM_BDAY_4 ), ch->level );
+ 	    break;
+ 	case 5:
+ 	    obj = create_object( get_obj_index( OBJ_VNUM_BDAY_5 ), ch->level );
+ 	    break;
+     }
+ 
+     sprintf( buf, "Heppy birthday! The gods give you a %s for your birthday.\n\r",
+ 	obj->short_descr );
+     send_to_char( buf, ch );
+ 
+     obj_to_char( obj, ch );
+     return;
+ 
  }
diff -Pp -C4 3.1.10/src/act_obj.c 3.1.11/src/act_obj.c
*** 3.1.10/src/act_obj.c	Sun Mar 16 16:37:48 1997
--- 3.1.11/src/act_obj.c	Mon Jun 23 19:42:05 1997
*************** void do_sacrifice( CHAR_DATA *ch, char *
*** 1493,1559 ****
  
  #if defined (SAC_VAR_REWARD)
      /* Idea by Bram (Unicorn Mud) Mythran Code by Maniac */
      switch(number_range(1, 50))
!     {
  	    default:
! 	    	sprintf( arg, "%s gives you %d gold coin%s for your sacrifice.\n\r", godname, gain, ((gain == 1) ? "" : "s") );
      		ch->gold += gain;
  		break;
  	    case 1:
! 	    	sprintf( arg, "%s gives you 1 permanent move point for your sacrifice!\n\r", godname );
  		ch->max_move += 1;
  		break;
  	    case 2:
! 	    	sprintf( arg, "%s gives you 1 permanent hit point for your sacrifice!\n\r", godname );
  		ch->max_hit += 1;
  		break;
  	    case 3:
! 		sprintf( arg, "%s gives you 1 permanent mana point for your sacrifice!\n\r", godname );
  		ch->max_mana += 1;
  		break;
  	    case 4:
  	    case 5:
  	    case 6:
! 		sprintf(arg, "%s gives you %d move points for yor sacrifice.\n\r", godname, gain );
  		ch->move += gain;
  		break;
  	    case 7:
  	    case 8:
  	    case 9:
! 		sprintf( arg, "%s gives you %d hit points for your sacrifice.\n\r", godname, gain );
! 		ch->move += gain;
  		break;
  	    case 10:
  	    case 11:
  	    case 12:
! 		sprintf( arg, "%s gives you %d mana points for your sacrifice.\n\r", godname, gain );
  		ch->mana +=gain;
  		break;
  	    case 13:
  	    case 14:
  	    case 15:
  	    	if (IS_NPC(ch))
  		{
! 			sprintf(arg, "%s gives you 1 gp for your sacrifice.\n\r", godname);
  			ch->gold += 1;
  		}
  		else
  		{
! 	    		sprintf(arg, "%s gives you 1 learning session for your sacrifice.\n\r", godname);
  			ch->pcdata->learn += 1;
  		}
  		break;
  	    case 16:
  	    case 17:
  	    case 18:
! 	    	sprintf(arg, "%s gives you %d experience point%s for your sacrifice.\n\r", godname, gain, (gain == 1) ? "" : "s");
  		ch->exp += gain;
  		break;
  	    case 19:
  	    case 20:
  	    case 21:
! 		sprintf( arg, "%s gives you 1 practice session for your sacrifice.\n\r", godname );
  		ch->practice += 1;
  		break;
      }
  #else
--- 1493,1570 ----
  
  #if defined (SAC_VAR_REWARD)
      /* Idea by Bram (Unicorn Mud) Mythran Code by Maniac */
      switch(number_range(1, 50))
!     {	/* Approx. 42% chance at something special.. 6% at something real good */
  	    default:
! 	    	sprintf( arg, "%s gives you %d gold coin%s for your sacrifice.\n\r",
! 		    godname, gain, ((gain == 1) ? "" : "s") );
      		ch->gold += gain;
  		break;
  	    case 1:
! 	    	sprintf( arg, "%s gives you 1 permanent move point for your sacrifice!\n\r",
! 		    godname );
  		ch->max_move += 1;
  		break;
  	    case 2:
! 	    	sprintf( arg, "%s gives you 1 permanent hit point for your sacrifice!\n\r",
! 			godname );
  		ch->max_hit += 1;
  		break;
  	    case 3:
! 		sprintf( arg, "%s gives you 1 permanent mana point for your sacrifice!\n\r",
! 		    godname );
  		ch->max_mana += 1;
  		break;
  	    case 4:
  	    case 5:
  	    case 6:
! 		sprintf(arg, "%s gives you %d move points for yor sacrifice.\n\r",
! 		    godname, gain );
  		ch->move += gain;
  		break;
  	    case 7:
  	    case 8:
  	    case 9:
! 		sprintf( arg, "%s gives you %d hit points for your sacrifice.\n\r",
! 		    godname, gain );
! 		ch->hit += gain;
  		break;
  	    case 10:
  	    case 11:
  	    case 12:
! 		sprintf( arg, "%s gives you %d mana points for your sacrifice.\n\r",
! 		    godname, gain );
  		ch->mana +=gain;
  		break;
  	    case 13:
  	    case 14:
  	    case 15:
  	    	if (IS_NPC(ch))
  		{
! 			sprintf(arg, "%s gives you 1 gp for your sacrifice.\n\r",
! 			    godname);
  			ch->gold += 1;
  		}
  		else
  		{
! 	    		sprintf(arg, "%s gives you 1 learning session for your sacrifice.\n\r",
! 			    godname);
  			ch->pcdata->learn += 1;
  		}
  		break;
  	    case 16:
  	    case 17:
  	    case 18:
! 	    	sprintf(arg, "%s gives you %d experience point%s for your sacrifice.\n\r",
! 		    godname, gain, (gain == 1) ? "" : "s");
  		ch->exp += gain;
  		break;
  	    case 19:
  	    case 20:
  	    case 21:
! 		sprintf( arg, "%s gives you 1 practice session for your sacrifice.\n\r",
! 		    godname );
  		ch->practice += 1;
  		break;
      }
  #else
*************** void do_sacrifice( CHAR_DATA *ch, char *
*** 1561,1572 ****
  	ch->gold += 1;
  #endif
  
      send_to_char(arg, ch);
!     sprintf (arg, "%s: %s(%d).\n\r", ch->name,
  	obj->short_descr, obj->pIndexData->vnum );
      act( "$n sacrifices $p to God.", ch, obj, NULL, TO_ROOM );
!     wiznet (ch, WIZ_SACCING, get_trust(ch) + 1, arg );
      extract_obj( obj );
      return;
  }
  
--- 1572,1583 ----
  	ch->gold += 1;
  #endif
  
      send_to_char(arg, ch);
!     sprintf (arg, "%s: %s(%d).", ch->name,
  	obj->short_descr, obj->pIndexData->vnum );
      act( "$n sacrifices $p to God.", ch, obj, NULL, TO_ROOM );
!     wiznet (ch, WIZ_SACCING, get_trust(ch), arg );
      extract_obj( obj );
      return;
  }
  
*************** void do_steal( CHAR_DATA *ch, char *argu
*** 2194,2203 ****
  		{
  		    SET_BIT( ch->act, PLR_THIEF );
  		    send_to_char( "*** You are now a THIEF!! ***\n\r", ch );
  		    save_char_obj( ch );
!                     sprintf( buf, "[NEWS] %s is a THIEF", ch->name );
!                     send_to_all_char( buf );
  		}
  	    }
  	}
  	return;
--- 2205,2215 ----
  		{
  		    SET_BIT( ch->act, PLR_THIEF );
  		    send_to_char( "*** You are now a THIEF!! ***\n\r", ch );
  		    save_char_obj( ch );
! 		    sprintf( buf, "%s became a THIEF by stealing from %s",
! 			ch->name, victim->name );
! 		    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  		}
  	    }
  	}
  	return;
*************** void do_register( CHAR_DATA *ch, char *a
*** 3154,3161 ****
--- 3166,3176 ----
  
      ch->gold -= cost;
  
      SET_BIT( ch->act, PLR_REGISTER );
+ 
+     sprintf( buf, "%s just registered to PK at %s", ch->name, mob->short_descr );
+     wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  
      return;
  
  }
diff -Pp -C4 3.1.10/src/act_wiz.c 3.1.11/src/act_wiz.c
*** 3.1.10/src/act_wiz.c	Wed Mar 19 21:32:39 1997
--- 3.1.11/src/act_wiz.c	Sat Jun 28 16:58:13 1997
*************** void do_disconnect( CHAR_DATA *ch, char 
*** 218,227 ****
  void do_pardon( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH ];
!     char       arg2 [ MAX_INPUT_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "pardon" ) )
--- 218,228 ----
  void do_pardon( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH  ];
!     char       arg2 [ MAX_INPUT_LENGTH  ];
!     char       buf  [ MAX_STRING_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "pardon" ) )
*************** void do_pardon( CHAR_DATA *ch, char *arg
*** 254,325 ****
  	{
  	    REMOVE_BIT( victim->act, PLR_KILLER );
  	    send_to_char( "Killer flag removed.\n\r",		ch	);
  	    send_to_char( "You are no longer a killer.\n\r",	victim	);
  	}
  	if ( IS_SET( victim->act, PLR_THIEF ) )
  	{
  	    REMOVE_BIT( victim->act, PLR_THIEF );
  	    send_to_char( "Thief flag removed.\n\r",		ch	);
  	    send_to_char( "You are no longer a thief.\n\r",	victim	);
  	}
  	if ( IS_SET( victim->act, PLR_REGISTER ) )
  	{
  	    REMOVE_BIT( victim->act, PLR_REGISTER );
  	    send_to_char( "PK flag removed.\n\r",		ch	);
  	    send_to_char( "You can no longer PK.\n\r",		victim	);
  	}
  	return;
      }
  
!     if ( !str_prefix( arg2, "killer" ) )
      {
! 	if ( IS_SET( victim->act, PLR_KILLER ) )
! 	{
! 	    REMOVE_BIT( victim->act, PLR_KILLER );
! 	    send_to_char( "Killer flag removed.\n\r",        ch     );
! 	    send_to_char( "You are no longer a KILLER.\n\r", victim );
! 	}
! 	else
! 	{
! 	    SET_BIT( victim->act, PLR_KILLER );
! 	    send_to_char( "Killer flag set.\n\r", ch );
! 	    send_to_char( "You are now a KILLER!\n\r", victim );
! 	}
  	return;
      }
  
!     if ( !str_prefix( arg2, "thief" ) )
      {
! 	if ( IS_SET( victim->act, PLR_THIEF  ) )
! 	{
! 	    REMOVE_BIT( victim->act, PLR_THIEF  );
! 	    send_to_char( "Thief flag removed.\n\r",        ch     );
! 	    send_to_char( "You are no longer a THIEF.\n\r", victim );
! 	}
! 	else
! 	{
! 	    SET_BIT( victim->act, PLR_THIEF );
! 	    send_to_char( "Thief flag set.\n\r", ch );
! 	    send_to_char( "You are now a THIEF!\n\r", victim );
! 	}
  	return;
      }
  
!     if ( !str_prefix( arg2, "pk" ) )
      {
! 	if ( IS_SET( victim->act, PLR_REGISTER ) )
! 	{
! 	    REMOVE_BIT( victim->act, PLR_REGISTER );
! 	    send_to_char( "PK flag removed.\n\r", ch );
! 	    send_to_char( "You can no longer PK.\n\r", victim );
! 	}
! 	else
! 	{
! 	    SET_BIT( victim->act, PLR_REGISTER );
! 	    send_to_char( "PK flag set.\n\r", ch );
! 	    send_to_char( "You can now PK.\n\r", victim );
! 	}
  	return;
      }
  
      do_pardon( ch, "" );
--- 255,320 ----
  	{
  	    REMOVE_BIT( victim->act, PLR_KILLER );
  	    send_to_char( "Killer flag removed.\n\r",		ch	);
  	    send_to_char( "You are no longer a killer.\n\r",	victim	);
+ 	    sprintf( buf, "%s was pardonned for KILLER by %s", victim->name,
+ 		ch->name );
+ 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	}
  	if ( IS_SET( victim->act, PLR_THIEF ) )
  	{
  	    REMOVE_BIT( victim->act, PLR_THIEF );
  	    send_to_char( "Thief flag removed.\n\r",		ch	);
  	    send_to_char( "You are no longer a thief.\n\r",	victim	);
+ 	    sprintf( buf, "%s was pardonned for THIEF by %s", victim->name,
+ 		ch->name );
+ 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	}
  	if ( IS_SET( victim->act, PLR_REGISTER ) )
  	{
  	    REMOVE_BIT( victim->act, PLR_REGISTER );
  	    send_to_char( "PK flag removed.\n\r",		ch	);
  	    send_to_char( "You can no longer PK.\n\r",		victim	);
+ 	    sprintf( buf, "%s was pardonned for PK by %s", victim->name,
+ 		ch->name );
+ 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	}
  	return;
      }
  
!     if ( ( !str_prefix( arg2, "killer" ) )
! 	&& ( IS_SET( victim->act, PLR_KILLER ) ) )
      {
! 	REMOVE_BIT( victim->act, PLR_KILLER );
! 	send_to_char( "Killer flag removed.\n\r",        ch     );
! 	send_to_char( "You are no longer a KILLER.\n\r", victim );
! 	sprintf( buf, "%s was pardonned for KILLER by %s", victim->name,
! 	    ch->name );
! 	wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	return;
      }
  
!     if ( ( !str_prefix( arg2, "thief" ) )
! 	&& ( IS_SET( victim->act, PLR_THIEF  ) ) )
      {
! 	REMOVE_BIT( victim->act, PLR_THIEF  );
! 	send_to_char( "Thief flag removed.\n\r",        ch     );
! 	send_to_char( "You are no longer a THIEF.\n\r", victim );
! 	sprintf( buf, "%s was pardonned for THIEF by %s", victim->name,
! 	    ch->name );
! 	wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	return;
      }
  
!     if ( ( !str_prefix( arg2, "pk" ) )
! 	&& ( IS_SET( victim->act, PLR_REGISTER ) ) )
      {
! 	REMOVE_BIT( victim->act, PLR_REGISTER );
! 	send_to_char( "PK flag removed.\n\r", ch );
! 	send_to_char( "You can no longer PK.\n\r", victim );
! 	sprintf( buf, "%s was pardonned for PK by %s", victim->name,
! 	    ch->name );
! 	wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	return;
      }
  
      do_pardon( ch, "" );
*************** void do_mstat( CHAR_DATA *ch, char *argu
*** 942,950 ****
  	strcat( buf1, buf );
      }
      else
      {
! 	sprintf (buf, "\n\rGold: %d.  Balance: %d.  Shares: %d. Securety: %d\n\r",
  	victim->gold, victim->pcdata->balance, victim->pcdata->shares, victim->pcdata->security );
  	strcat( buf1, buf );
      }
  
--- 937,945 ----
  	strcat( buf1, buf );
      }
      else
      {
! 	sprintf (buf, "\n\rGold: %d.  Balance: %d.  Shares: %d. Security: %d\n\r",
  	victim->gold, victim->pcdata->balance, victim->pcdata->shares, victim->pcdata->security );
  	strcat( buf1, buf );
      }
  
*************** void do_snoop( CHAR_DATA *ch, char *argu
*** 1314,1322 ****
  {
      CHAR_DATA       *rch;
      CHAR_DATA       *victim;
      DESCRIPTOR_DATA *d;
!     char             arg [ MAX_INPUT_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "snoop" ) )
--- 1309,1318 ----
  {
      CHAR_DATA       *rch;
      CHAR_DATA       *victim;
      DESCRIPTOR_DATA *d;
!     char             arg [ MAX_INPUT_LENGTH  ];
!     char             buf [ MAX_STRING_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "snoop" ) )
*************** void do_snoop( CHAR_DATA *ch, char *argu
*** 1378,1385 ****
--- 1374,1383 ----
      }
  
      victim->desc->snoop_by = ch->desc;
      send_to_char( "Ok.\n\r", ch );
+     sprintf( buf, "%s is snooping %s", ch->name, victim->name );
+     wiznet( ch, WIZ_SNOOPS, get_trust( ch ), buf );
      return;
  }
  
  
*************** void do_snoop( CHAR_DATA *ch, char *argu
*** 1387,1395 ****
  void do_switch( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg [ MAX_INPUT_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "switch" ) )
--- 1385,1394 ----
  void do_switch( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg [ MAX_INPUT_LENGTH  ];
!     char       buf [ MAX_STRING_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "switch" ) )
*************** void do_switch( CHAR_DATA *ch, char *arg
*** 1444,1458 ****
--- 1443,1462 ----
      ch->desc->original    = ch;
      victim->desc          = ch->desc;
      ch->desc              = NULL;
      send_to_char( "Ok.\n\r", victim );
+     sprintf( buf, "%s switched into %s", ch->desc->original->name,
+ 	ch->desc->character->short_descr );
+     wiznet( ch, WIZ_SWITCHES, get_trust( ch->desc->original ), buf );
      return;
  }
  
  
  
  void do_return( CHAR_DATA *ch, char *argument )
  {
+     char buf [ MAX_STRING_LENGTH ];
+ 
      if ( !ch->desc )
  	return;
  
      if ( !ch->desc->original )
*************** void do_return( CHAR_DATA *ch, char *arg
*** 1471,1478 ****
--- 1475,1485 ----
      ch->desc->character                  = ch->desc->original;
      ch->desc->original                   = NULL;
      ch->desc->character->desc            = ch->desc; 
      ch->desc                             = NULL;
+ 
+     sprintf( buf, "%s returnes to his original body", ch->name );
+     wiznet( ch, WIZ_SWITCHES, get_trust( ch ), buf );
      return;
  }
  
  
*************** void do_mload( CHAR_DATA *ch, char *argu
*** 1481,1489 ****
  {
      CHAR_DATA      *rch;
      CHAR_DATA      *victim;
      MOB_INDEX_DATA *pMobIndex;
!     char            arg [ MAX_INPUT_LENGTH ];
      
      rch = get_char( ch );
  
      if ( !authorized( rch, "mload" ) )
--- 1488,1497 ----
  {
      CHAR_DATA      *rch;
      CHAR_DATA      *victim;
      MOB_INDEX_DATA *pMobIndex;
!     char            arg [ MAX_INPUT_LENGTH  ];
!     char            buf [ MAX_STRING_LENGTH ];
      
      rch = get_char( ch );
  
      if ( !authorized( rch, "mload" ) )
*************** void do_mload( CHAR_DATA *ch, char *argu
*** 1508,1515 ****
--- 1516,1526 ----
      victim->game_fun = pMobIndex->game_fun;	/* Add game function */
      char_to_room( victim, ch->in_room );
      send_to_char( "Ok.\n\r", ch );
      act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
+     sprintf( buf, "%s has loaded %s at %s [%d]", ch->name, victim->short_descr,
+ 	ch->in_room->name, ch->in_room->vnum );
+     wiznet( ch, WIZ_LOAD, get_trust( ch ), buf );
      return;
  }
  
  
*************** void do_oload( CHAR_DATA *ch, char *argu
*** 1518,1527 ****
  {
      OBJ_DATA       *obj;
      CHAR_DATA      *rch;
      OBJ_INDEX_DATA *pObjIndex;
!     char            arg1 [ MAX_INPUT_LENGTH ];
!     char            arg2 [ MAX_INPUT_LENGTH ];
      int             level;
  
      rch = get_char( ch );
  
--- 1529,1539 ----
  {
      OBJ_DATA       *obj;
      CHAR_DATA      *rch;
      OBJ_INDEX_DATA *pObjIndex;
!     char            arg1 [ MAX_INPUT_LENGTH  ];
!     char            arg2 [ MAX_INPUT_LENGTH  ];
!     char            buf  [ MAX_STRING_LENGTH ];
      int             level;
  
      rch = get_char( ch );
  
*************** void do_oload( CHAR_DATA *ch, char *argu
*** 1575,1582 ****
--- 1587,1597 ----
  	obj_to_room( obj, ch->in_room );
  	act( "$n has created $p!", ch, obj, NULL, TO_ROOM );
      }
      send_to_char( "Ok.\n\r", ch );
+     sprintf( buf, "%s has loaded %s at %s [%d]", ch->name, obj->short_descr,
+ 	ch->in_room->name, ch->in_room->vnum );
+     wiznet( ch, WIZ_LOAD, get_trust( ch ), buf );
      return;
  }
  
  
*************** void do_advance( CHAR_DATA *ch, char *ar
*** 1725,1741 ****
  	victim->practice = 0;
  	victim->hit      = victim->max_hit;
  	victim->mana     = victim->max_mana;
  	victim->move     = victim->max_move;
! 	sprintf( buf, "%s has been demoted by %s", victim->name, ch->name );
  	wiznet( victim, WIZ_LEVELS, get_trust( ch ), buf );
  	advance_level( victim );
      }
      else
      {
  	send_to_char( "Raising a player's level!\n\r", ch );
  	send_to_char( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****\n\r", victim );
! 	sprintf( buf, "%s has been advanced by %s", victim->name, ch->name );
  	wiznet( victim, WIZ_LEVELS, get_trust( ch ), buf );
      }
  
      for ( iLevel = victim->level ; iLevel < level; iLevel++ )
--- 1740,1759 ----
  	victim->practice = 0;
  	victim->hit      = victim->max_hit;
  	victim->mana     = victim->max_mana;
  	victim->move     = victim->max_move;
! 	victim->pcdata->learn = 0;
! 	sprintf( buf, "%s has been demoted to level %d by %s", victim->name,
! 	    level, ch->name );
  	wiznet( victim, WIZ_LEVELS, get_trust( ch ), buf );
  	advance_level( victim );
      }
      else
      {
  	send_to_char( "Raising a player's level!\n\r", ch );
  	send_to_char( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****\n\r", victim );
! 	sprintf( buf, "%s has been advanced to level %d by %s", victim->name,
! 	    level, ch->name );
  	wiznet( victim, WIZ_LEVELS, get_trust( ch ), buf );
      }
  
      for ( iLevel = victim->level ; iLevel < level; iLevel++ )
*************** void do_advance( CHAR_DATA *ch, char *ar
*** 1754,1763 ****
  void do_trust( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH ];
!     char       arg2 [ MAX_INPUT_LENGTH ];
      int        level;
  
      rch = get_char( ch );
  
--- 1772,1782 ----
  void do_trust( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH  ];
!     char       arg2 [ MAX_INPUT_LENGTH  ];
!     char       buf  [ MAX_STRING_LENGTH ];
      int        level;
  
      rch = get_char( ch );
  
*************** void do_trust( CHAR_DATA *ch, char *argu
*** 1795,1812 ****
  	send_to_char( "Limited to your trust.\n\r", ch );
  	return;
      }
  
!     /*
!      * Little extra check by Canth (canth@xs4all.nl)
!      * This works seeing as I'm trusted 55 ;-)
!      */
!     if ( get_trust(ch) <= get_trust(victim) )
      {
! 	send_to_char( "You cannot trust your peer nor your superior.\n\r", ch );
  	return;
      }
  
      victim->trust = level;
      return;
  }
  
--- 1814,1831 ----
  	send_to_char( "Limited to your trust.\n\r", ch );
  	return;
      }
  
!     if ( get_trust(ch) < get_trust(victim) )
      {
! 	send_to_char( "You cannot trust your superior.\n\r", ch );
  	return;
      }
  
+     sprintf( buf, "%s has been trusted at level %d by %s", victim->name,
+ 	level, ch->name );
+     wiznet( ch, WIZ_LEVELS, get_trust( ch ), buf );
+ 
      victim->trust = level;
      return;
  }
  
*************** void do_restore( CHAR_DATA *ch, char *ar
*** 1871,1879 ****
              victim->move = victim->max_move;
              update_pos( victim );
              act( "$n has restored you.", ch, NULL, victim, TO_VICT );
          }
! 	sprintf( buf, "%s has restored the whole mud.\n\r", ch->name );
  	wiznet (ch, WIZ_RESTORE, get_trust( ch ), buf );
          send_to_char( "Aww...how sweet :)...Done.\n\r", ch );
      }
      else
--- 1890,1898 ----
              victim->move = victim->max_move;
              update_pos( victim );
              act( "$n has restored you.", ch, NULL, victim, TO_VICT );
          }
! 	sprintf( buf, "%s has restored the whole mud.", ch->name );
  	wiznet (ch, WIZ_RESTORE, get_trust( ch ), buf );
          send_to_char( "Aww...how sweet :)...Done.\n\r", ch );
      }
      else
*************** void do_restore( CHAR_DATA *ch, char *ar
*** 1894,1902 ****
          victim->mana = victim->max_mana;
          victim->move = victim->max_move;
          update_pos( victim );
          act( "$n has restored you.", ch, NULL, victim, TO_VICT );
! 	sprintf( buf, "%s has restored %s.\n\r", ch->name, victim->name );
  	wiznet (ch, WIZ_RESTORE, get_trust( ch ), buf );
          send_to_char( "Ok.\n\r", ch );
      }
  
--- 1913,1921 ----
          victim->mana = victim->max_mana;
          victim->move = victim->max_move;
          update_pos( victim );
          act( "$n has restored you.", ch, NULL, victim, TO_VICT );
! 	sprintf( buf, "%s has restored %s.", ch->name, victim->name );
  	wiznet (ch, WIZ_RESTORE, get_trust( ch ), buf );
          send_to_char( "Ok.\n\r", ch );
      }
  
*************** BAN_DATA *		ban_list;
*** 2243,2252 ****
  void do_ban( CHAR_DATA *ch, char *argument )
  {
      BAN_DATA  *pban;
      CHAR_DATA *rch;
!     char       buf [ MAX_STRING_LENGTH ];
!     char       arg [ MAX_INPUT_LENGTH  ];
  
      if ( IS_NPC( ch ) )
  	return;
  
--- 2262,2273 ----
  void do_ban( CHAR_DATA *ch, char *argument )
  {
      BAN_DATA  *pban;
      CHAR_DATA *rch;
!     char       buf  [ MAX_STRING_LENGTH ];
!     char       arg  [ MAX_INPUT_LENGTH  ];
!     char       arg2 [ MAX_STRING_LENGTH ];
!     int        level;
  
      if ( IS_NPC( ch ) )
  	return;
  
*************** void do_ban( CHAR_DATA *ch, char *argume
*** 2254,2272 ****
  
      if ( !authorized( rch, "ban" ) )
          return;
  
!     one_argument( argument, arg );
  
      if ( arg[0] == '\0' )
      {
  	strcpy( buf, "Banned sites:\n\r" );
  	for ( pban = ban_list; pban; pban = pban->next )
  	{
! 	    strcat( buf, pban->name );
! 	    strcat( buf, "\n\r" );
  	}
- 	send_to_char( buf, ch );
  	return;
      }
  
      for ( pban = ban_list; pban; pban = pban->next )
--- 2275,2293 ----
  
      if ( !authorized( rch, "ban" ) )
          return;
  
!     argument = one_argument( argument, arg );
!     one_argument( argument, arg2 );
  
      if ( arg[0] == '\0' )
      {
  	strcpy( buf, "Banned sites:\n\r" );
  	for ( pban = ban_list; pban; pban = pban->next )
  	{
! 	    sprintf( buf, "%50s      level: %d\n\r", pban->name, pban->level );
! 	    send_to_char( buf, ch );
  	}
  	return;
      }
  
      for ( pban = ban_list; pban; pban = pban->next )
*************** void do_ban( CHAR_DATA *ch, char *argume
*** 2277,2284 ****
--- 2298,2307 ----
  	    return;
  	}
      }
  
+     level = URANGE( 1, atoi( arg2 ), MAX_LEVEL );
+ 
      if ( !ban_free )
      {
  	pban		= alloc_perm( sizeof( *pban ) );
      }
*************** void do_ban( CHAR_DATA *ch, char *argume
*** 2288,2295 ****
--- 2311,2319 ----
  	ban_free	= ban_free->next;
      }
  
      pban->name	= str_dup( arg );
+     pban->level = level;
      pban->next	= ban_list;
      ban_list	= pban;
      send_to_char( "Ok.\n\r", ch );
      ban_update( );
diff -Pp -C4 3.1.10/src/act_wiz2.c 3.1.11/src/act_wiz2.c
*** 3.1.10/src/act_wiz2.c	Fri Mar 14 19:37:46 1997
--- 3.1.11/src/act_wiz2.c	Sun Jun 15 14:50:52 1997
*************** void do_dog( CHAR_DATA *ch, char *argume
*** 332,339 ****
--- 332,340 ----
      ROOM_INDEX_DATA *location;
      MOB_INDEX_DATA  *pMobIndex;
      CHAR_DATA       *mob;
      CHAR_DATA       *victim;
+     char             buf [ MAX_STRING_LENGTH ];
   
      if ( !authorized( ch, "dog" ) )
  	return;
  
*************** void do_dog( CHAR_DATA *ch, char *argume
*** 389,396 ****
--- 390,400 ----
   
      act( "$n is suddenly turned into a small doggy!!", victim, NULL, NULL, TO_ROOM );
      send_to_char( "You suddenly turn into a small doggy!", victim );
      send_to_char( "Ok.\n\r", ch );
+     sprintf( buf, "%s was turned into a little doggy by %s",
+ 	victim->desc->original->name, ch->name );
+     wiznet( ch, WIZ_SWITCHES, get_trust( ch ), buf );
      return;
  }
  
  /* Idea from Talen of Vego's do_where command */
*************** void do_imtlset( CHAR_DATA *ch, char *ar
*** 693,703 ****
          send_to_char( "Not on NPC's.\n\r", ch );
          return;
      }
   
!     if ( get_trust(rch) <= get_trust(victim) && rch != victim )
      {
!         send_to_char( "You may not imtlset your peer nor your superior.\n\r",
                       ch );
          return;
      }
  
--- 697,707 ----
          send_to_char( "Not on NPC's.\n\r", ch );
          return;
      }
   
!     if ( get_trust(rch) < get_trust(victim) && rch != victim )
      {
!         send_to_char( "You may not imtlset your superior.\n\r",
                       ch );
          return;
      }
  
*************** void do_string( CHAR_DATA *ch, char *arg
*** 1397,1406 ****
  void do_setkill( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH ];
!     char       arg2 [ MAX_INPUT_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "setkill" ) )
--- 1401,1411 ----
  void do_setkill( CHAR_DATA *ch, char *argument )
  {
      CHAR_DATA *rch;
      CHAR_DATA *victim;
!     char       arg1 [ MAX_INPUT_LENGTH  ];
!     char       arg2 [ MAX_INPUT_LENGTH  ];
!     char       buf  [ MAX_STRING_LENGTH ];
  
      rch = get_char( ch );
  
      if ( !authorized( rch, "setkill" ) )
*************** void do_setkill( CHAR_DATA *ch, char *ar
*** 1410,1418 ****
      argument = one_argument( argument, arg2 );
  
      if ( arg1[0] == '\0' || arg2[0] == '\0' )
      {
!         send_to_char( "Syntax: setkill <character> <killer|thief>.\n\r", ch );
          return;
      }
  
      if ( !( victim = get_char_world( ch, arg1 ) ) )
--- 1415,1423 ----
      argument = one_argument( argument, arg2 );
  
      if ( arg1[0] == '\0' || arg2[0] == '\0' )
      {
!         send_to_char( "Syntax: setkill <character> <killer|thief|PK>.\n\r", ch );
          return;
      }
  
      if ( !( victim = get_char_world( ch, arg1 ) ) )
*************** void do_setkill( CHAR_DATA *ch, char *ar
*** 1431,1456 ****
      {
          if (!IS_SET( victim->act, PLR_KILLER ) )
          {
              SET_BIT( victim->act, PLR_KILLER );
!             send_to_char( "Killer flag set.\n\r",        ch     );
              send_to_char( "You are a KILLER.\n\r", victim );
          }
          return;
      }
  
      if ( !str_cmp( arg2, "thief" ) )
      {
!         if (!IS_SET( victim->act, PLR_THIEF  ) )
          {
!             SET_BIT( victim->act, PLR_THIEF  );
!             send_to_char( "Thief flag set.\n\r",        ch     );
              send_to_char( "You are a THIEF.\n\r", victim );
          }
          return;
      }
  
!     send_to_char( "Syntax: setkill <character> <killer|thief>.\n\r", ch );
      return;
  }
  
  void do_pwhere( CHAR_DATA *ch, char *argument )
--- 1436,1478 ----
      {
          if (!IS_SET( victim->act, PLR_KILLER ) )
          {
              SET_BIT( victim->act, PLR_KILLER );
!             send_to_char( "Killer flag set.\n\r", ch );
              send_to_char( "You are a KILLER.\n\r", victim );
+ 	    sprintf( buf, "%s was set KILLER by %s", victim->name, ch->name );
+ 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
          }
          return;
      }
  
      if ( !str_cmp( arg2, "thief" ) )
      {
!         if (!IS_SET( victim->act, PLR_THIEF ) )
          {
!             SET_BIT( victim->act, PLR_THIEF );
!             send_to_char( "Thief flag set.\n\r", ch );
              send_to_char( "You are a THIEF.\n\r", victim );
+ 	    sprintf( buf, "%s was set THIEF by %s", victim->name, ch->name );
+ 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
          }
          return;
      }
  
!     if ( !str_cmp( arg2, "pk" ) )
!     {
! 	if (!IS_SET( victim->act, PLR_REGISTER ) )
! 	{
! 	    SET_BIT( victim->act, PLR_REGISTER );
! 	    send_to_char( "PK flag set.\n\r", ch );
! 	    send_to_char( "You are a PK.\n\r", victim );
! 	    sprintf( buf, "%s was set PK by %s", victim->name, ch->name );
! 	    wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
! 	}
! 	return;
!     }
! 
!     do_setkill( ch, "" );
      return;
  }
  
  void do_pwhere( CHAR_DATA *ch, char *argument )
*************** void do_rings ( CHAR_DATA *ch, char *arg
*** 1957,1965 ****
      char	buf  [ MAX_STRING_LENGTH ];
      OBJ_DATA  * ring;
      EXTRA_DESCR_DATA * ed;
  
!     if ( !authorized( ch, "rings" ) )
  	return;
  
      /* Don't be scared off by the humoungous code... It's not all that
  	tricky... Honest */
--- 1979,1987 ----
      char	buf  [ MAX_STRING_LENGTH ];
      OBJ_DATA  * ring;
      EXTRA_DESCR_DATA * ed;
  
!     if ( !authorized( ch, "newring" ) )
  	return;
  
      /* Don't be scared off by the humoungous code... It's not all that
  	tricky... Honest */
*************** void do_marry( CHAR_DATA *ch, char *argu
*** 2166,2174 ****
  	/* Ok, they _are_ married to each other... Now let's divorce them finally */
  	spouse1->pcdata->spouse = NULL;		/* Fix by Maniac */
  	spouse2->pcdata->spouse = NULL;		/* Fix by Maniac */
  	/* Let's inform everyone of this sad event now */
! 	sprintf( buf, "%s and %s just divorced each other\n\r", spouse1->name,
  		spouse2->name );
  	send_to_all_char( buf );
  	return;
      }
--- 2188,2196 ----
  	/* Ok, they _are_ married to each other... Now let's divorce them finally */
  	spouse1->pcdata->spouse = NULL;		/* Fix by Maniac */
  	spouse2->pcdata->spouse = NULL;		/* Fix by Maniac */
  	/* Let's inform everyone of this sad event now */
! 	sprintf( buf, "%s and %s just divorced each other.\n\r", spouse1->name,
  		spouse2->name );
  	send_to_all_char( buf );
  	return;
      }
*************** void do_marry( CHAR_DATA *ch, char *argu
*** 2197,2205 ****
      do_rings( ch, spouse1->name );
      do_rings( ch, spouse2->name );
  
      /* Let's inform everyone of this happy event now */
!     sprintf( buf, "%s and %s have just married each other\n\r", spouse1->name,
  	spouse2->name );
      send_to_all_char( buf );
      return;
      /* That's all folks! */
--- 2219,2227 ----
      do_rings( ch, spouse1->name );
      do_rings( ch, spouse2->name );
  
      /* Let's inform everyone of this happy event now */
!     sprintf( buf, "%s and %s have just married each other.\n\r", spouse1->name,
  	spouse2->name );
      send_to_all_char( buf );
      return;
      /* That's all folks! */
*************** void do_marry( CHAR_DATA *ch, char *argu
*** 2210,2228 ****
   * divorce function... Just calls marry with undo added
   * This is part of the marriage code by Canth (canth@xs4all.nl)
   * of Mythran
   */
  void do_divorce ( CHAR_DATA *ch, char *argument )
  {
      char *	buf;
  
!     /* This seems pretty much like the "proper" way to do it... */
!     buf = str_dup ( argument );
      buf = strcat( buf, " undo" );
      do_marry( ch, buf );
      return;
  }
! 
  
  /* Recursive cloning. To ensure cloning items in bags in backpacks in ... */
  void recursive_clone( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *clone )
  {
--- 2232,2252 ----
   * divorce function... Just calls marry with undo added
   * This is part of the marriage code by Canth (canth@xs4all.nl)
   * of Mythran
   */
+ /* This function disabled.. marry <char> <char> undo works..
+  * Calling it using the divorce function crashes the mud.
+  * (str_dup crash in ssm.c) - Canth 7/6/97
  void do_divorce ( CHAR_DATA *ch, char *argument )
  {
      char *	buf;
  
!     strcpy ( buf, argument );
      buf = strcat( buf, " undo" );
      do_marry( ch, buf );
      return;
  }
! */
  
  /* Recursive cloning. To ensure cloning items in bags in backpacks in ... */
  void recursive_clone( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *clone )
  {
*************** void do_clone ( CHAR_DATA *ch, char *arg
*** 2248,2255 ****
--- 2272,2282 ----
      char       arg [ MAX_INPUT_LENGTH ];
      char      *arg2;
      CHAR_DATA *mob = NULL;
      OBJ_DATA  *obj = NULL;
+ 
+     if( !authorized( ch, "clone" ) )
+ 	return;
  
      arg2 = one_argument( argument, arg );
  
      if ( arg[0] == '\0' )
diff -Pp -C4 3.1.10/src/comm.c 3.1.11/src/comm.c
*** 3.1.10/src/comm.c	Sun Mar 16 21:27:48 1997
--- 3.1.11/src/comm.c	Mon Jun 23 20:18:47 1997
*************** void game_loop_unix( int control )
*** 873,881 ****
  
  #if defined( unix )
  void new_descriptor( int control )
  {
- 	   BAN_DATA        *pban;
      static DESCRIPTOR_DATA  d_zero;
  	   DESCRIPTOR_DATA *dnew;
      struct sockaddr_in      sock;
      struct hostent         *from;
--- 873,880 ----
*************** void new_descriptor( int control )
*** 953,984 ****
  	log_string( log_buf );
  	from = gethostbyaddr( (char *) &sock.sin_addr,
  			     sizeof(sock.sin_addr), AF_INET );
  	dnew->host = str_dup( from ? from->h_name : buf );
      }
  	
-     /*
-      * Swiftest: I added the following to ban sites.  I don't
-      * endorse banning of sites, but Copper has few descriptors now
-      * and some people from certain sites keep abusing access by
-      * using automated 'autodialers' and leaving connections hanging.
-      *
-      * Furey: added suffix check by request of Nickel of HiddenWorlds.
-      */
-     for ( pban = ban_list; pban; pban = pban->next )
-     {
- 	if ( !str_suffix( pban->name, dnew->host ) )
- 	{
- 	    write_to_descriptor( desc,
- 		"Your site has been banned from this Mud.\n\r", 0 );
- 	    close( desc );
- 	    free_string( dnew->host );
- 	    free_mem( dnew->outbuf, dnew->outsize );
- 	    dnew->next          = descriptor_free;
- 	    descriptor_free     = dnew;
- 	    return;
- 	}
-     }
  
      /*
       * Init descriptor data.
       */
--- 952,963 ----
  	log_string( log_buf );
  	from = gethostbyaddr( (char *) &sock.sin_addr,
  			     sizeof(sock.sin_addr), AF_INET );
  	dnew->host = str_dup( from ? from->h_name : buf );
+ 	sprintf( log_buf, "New connection: %s (%s)", dnew->host, buf );
+ 	wiznet ( NULL, WIZ_LOGINS, L_DIR, log_buf );
      }
  	
  
      /*
       * Init descriptor data.
       */
*************** void read_from_buffer( DESCRIPTOR_DATA *
*** 1217,1224 ****
--- 1196,1204 ----
  	    if ( ++d->repeat >= 20 )
  	    {
  		sprintf( log_buf, "%s input spamming!", d->host );
  		log_string( log_buf );
+ 		wiznet( NULL, WIZ_SPAM, 0, log_buf );
  		write_to_descriptor( d->descriptor,
  		    "\n\r*** PUT A LID ON IT!!! ***\n\r", 0 );
  		strcpy( d->incomm, "quit" );
  	    }
*************** bool write_to_descriptor( int desc, char
*** 1552,1559 ****
--- 1532,1540 ----
   * Deal with sockets that haven't logged in yet.
   */
  void nanny( DESCRIPTOR_DATA *d, char *argument )
  {
+     BAN_DATA  *pban;
      CHAR_DATA *ch;
      NOTE_DATA *pnote;
      char      *pwdnew;
      char      *classname;
*************** void nanny( DESCRIPTOR_DATA *d, char *ar
*** 1605,1612 ****
--- 1586,1616 ----
  	    close_socket( d );
  	    return;
  	}
  
+ 	/*
+ 	 * Swiftest: I added the following to ban sites.  I don't
+ 	 * endorse banning of sites, but Copper has few descriptors now
+ 	 * and some people from certain sites keep abusing access by
+ 	 * using automated 'autodialers' and leaving connections hanging.
+ 	 *
+ 	 * Furey: added suffix check by request of Nickel of HiddenWorlds.
+ 	 *
+ 	 * Bell: Added level check to allow cool players from banned sites
+ 	 * to log on after all :)
+ 	 */
+ 	for ( pban = ban_list; pban; pban = pban->next )
+ 	{
+ 	    if ( ( !str_suffix( pban->name, d->host ) )
+ 		&& ( ch->level < pban->level ) )
+ 	    {
+ 		write_to_buffer( d,
+ 		    "Your site has been banned from this Mud.\n\r", 0 );
+ 		close_socket( d );
+ 		return;
+ 	    }
+ 	}
+ 
  	if ( ( ch->current_age > ch->death_age ) && ( ch->death_age > 0) &&
  		( get_trust( ch ) <= LEVEL_HERO ) )
  	{
  	    sprintf( log_buf, "%s tried to get out of its grave.", ch->name );
*************** void nanny( DESCRIPTOR_DATA *d, char *ar
*** 1974,1989 ****
  #endif
  	    ch->pcdata->clan = CLAN_NONE;
  	    ch->pcdata->clanlevel = CLAN_NOLEVEL;
  #if defined (START_AGE_SYSTEM)
! 	    ch->current_age = 428400 * ( race_table[ch->race].start_age +
  		dice(race_table[ch->race].start_age_mod[0],
  		    race_table[ch->race].start_age_mod[1]) );
  #else
  	    ch->current_age = -1;
  #endif
  #if defined (DEATH_AGE_SYSTEM)
! 	    ch->death_age = 428400 * ( race_table[ch->race].death_age +
  		dice(race_table[ch->race].death_age_mod[0],
  		    race_table[ch->race].death_age_mod[1]) );
  #else
  	    ch->death_age = -1;		/* Immortality (No death of old age) */
--- 1978,1993 ----
  #endif
  	    ch->pcdata->clan = CLAN_NONE;
  	    ch->pcdata->clanlevel = CLAN_NOLEVEL;
  #if defined (START_AGE_SYSTEM)
! 	    ch->current_age = MUD_YEAR * ( race_table[ch->race].start_age +
  		dice(race_table[ch->race].start_age_mod[0],
  		    race_table[ch->race].start_age_mod[1]) );
  #else
  	    ch->current_age = -1;
  #endif
  #if defined (DEATH_AGE_SYSTEM)
! 	    ch->death_age = MUD_YEAR * ( race_table[ch->race].death_age +
  		dice(race_table[ch->race].death_age_mod[0],
  		    race_table[ch->race].death_age_mod[1]) );
  #else
  	    ch->death_age = -1;		/* Immortality (No death of old age) */
*************** void nanny( DESCRIPTOR_DATA *d, char *ar
*** 2039,2047 ****
              ch->gold -= (ch->gold - 250000) / 10;
          }
  #endif
  
! 	sprintf( log_buf, "%s has entered the game.\n\r", ch->name );
  	wiznet(ch, WIZ_LOGINS, get_trust( ch ), log_buf );
  	act( "$n has entered the game.", ch, NULL, NULL, TO_ROOM );
  
  	do_look( ch, "auto" );
--- 2043,2051 ----
              ch->gold -= (ch->gold - 250000) / 10;
          }
  #endif
  
! 	sprintf( log_buf, "%s has entered the game.", ch->name );
  	wiznet(ch, WIZ_LOGINS, get_trust( ch ), log_buf );
  	act( "$n has entered the game.", ch, NULL, NULL, TO_ROOM );
  
  	do_look( ch, "auto" );
diff -Pp -C4 3.1.10/src/config.h 3.1.11/src/config.h
*** 3.1.10/src/config.h	Sun Mar 16 20:41:51 1997
--- 3.1.11/src/config.h	Sat May 17 15:59:32 1997
***************
*** 1,6 ****
  /*
!  * Mythran Mud 3.1.1
   * Mud Configuration file
   *
   * Various extra options to change the way the mud is run...
   *
--- 1,6 ----
  /*
!  * Mythran Mud 3.1.11
   * Mud Configuration file
   *
   * Various extra options to change the way the mud is run...
   *
diff -Pp -C4 3.1.10/src/db.c 3.1.11/src/db.c
*** 3.1.10/src/db.c	Sun Mar 16 21:36:30 1997
--- 3.1.11/src/db.c	Mon Jun 23 19:54:52 1997
*************** void boot_db( void )
*** 283,306 ****
  
  
  	lhour		= ( current_time - 650336715 )
  			   / ( PULSE_TICK / PULSE_PER_SECOND );
! 	time_info.hour  = lhour  % 24;
! 	lday		= lhour  / 24;
! 	time_info.day	= lday   % 35;
! 	lmonth		= lday   / 35;
! 	time_info.month	= lmonth % 17;
! 	time_info.year	= lmonth / 17;
! 
! 	     if ( time_info.hour <  5 ) weather_info.sunlight = SUN_DARK;
! 	else if ( time_info.hour <  6 ) weather_info.sunlight = SUN_RISE;
! 	else if ( time_info.hour < 19 ) weather_info.sunlight = SUN_LIGHT;
! 	else if ( time_info.hour < 20 ) weather_info.sunlight = SUN_SET;
  	else                            weather_info.sunlight = SUN_DARK;
  
  	weather_info.change	= 0;
  	weather_info.mmhg	= 960;
! 	if ( time_info.month >= 7 && time_info.month <=12 )
  	    weather_info.mmhg += number_range( 1, 50 );
  	else
  	    weather_info.mmhg += number_range( 1, 80 );
  
--- 283,308 ----
  
  
  	lhour		= ( current_time - 650336715 )
  			   / ( PULSE_TICK / PULSE_PER_SECOND );
! 	/* Damn, check these new ones out.. Now no matter how many days/
! 	week/month/year, it always works. Canth - 9-6-97 */
! 	time_info.hour  = lhour  % HOUR_DAY;
! 	lday		= lhour  / HOUR_DAY;
! 	time_info.day	= lday   % DAY_MONTH;
! 	lmonth		= lday   / DAY_MONTH;
! 	time_info.month	= lmonth % MONTH_YEAR;
! 	time_info.year	= lmonth / MONTH_YEAR;
! 
! 	     if ( time_info.hour < ( HOUR_DAY / 5 ) ) weather_info.sunlight = SUN_DARK;
! 	else if ( time_info.hour < ( HOUR_DAY / 5 ) + 1 ) weather_info.sunlight = SUN_RISE;
! 	else if ( time_info.hour < ( HOUR_DAY * 4 / 5 ) ) weather_info.sunlight = SUN_LIGHT;
! 	else if ( time_info.hour < ( HOUR_DAY * 4 / 5 ) + 1 ) weather_info.sunlight = SUN_SET;
  	else                            weather_info.sunlight = SUN_DARK;
  
  	weather_info.change	= 0;
  	weather_info.mmhg	= 960;
! 	if ( time_info.month >= (MONTH_YEAR / 5) && time_info.month <= MONTH_YEAR )
  	    weather_info.mmhg += number_range( 1, 50 );
  	else
  	    weather_info.mmhg += number_range( 1, 80 );
  
*************** void load_ban( void )
*** 1672,1679 ****
--- 1674,1682 ----
  	    ban_free = ban_free->next;
  	}
  
  	pban->name   = fread_string( fp );
+ 	pban->level  = fread_number( fp );
  
  	pban->next   = ban_list;
  	ban_list     = pban;
      }
diff -Pp -C4 3.1.10/src/fight.c 3.1.11/src/fight.c
*** 3.1.10/src/fight.c	Mon Mar 10 20:55:15 1997
--- 3.1.11/src/fight.c	Sun Jun 15 14:35:12 1997
*************** void one_hit( CHAR_DATA *ch, CHAR_DATA *
*** 389,396 ****
--- 389,397 ----
   */
  void damage( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int wpn )
  {
      int sntemp;
+     char buf [ MAX_STRING_LENGTH ];
  
      if ( victim->position == POS_DEAD )
  	return;
  
*************** void damage( CHAR_DATA *ch, CHAR_DATA *v
*** 590,597 ****
--- 591,605 ----
  
      case POS_DEAD:
  	send_to_char( "You have been KILLED!!\n\r\n\r", victim );
  	act( "$n is DEAD!!", victim, NULL, NULL, TO_ROOM );
+ 	if ( !IS_NPC( victim ) )
+ 	{
+ 	    sprintf( buf, "%s died at the hands of %s at %s [%d]", victim->name,
+ 		( IS_NPC( ch ) ? ch->short_descr : ch->name ),
+ 		victim->in_room->name, victim->in_room->vnum);
+ 	    wiznet ( ch, WIZ_DEATHS, get_trust( ch ), buf );
+ 	}
  	break;
  
      default:
  	if ( dam > victim->max_hit / 4 )
*************** void check_killer( CHAR_DATA *ch, CHAR_D
*** 881,888 ****
--- 889,899 ----
          send_to_char( "You are a KILLER!  You lose 600 exps.\n\r", ch );
  	sprintf( buf, "Help!  I'm being attacked by %s!", ch->name );
  	do_shout( victim, buf );
  	SET_BIT( ch->act, PLR_KILLER );
+ 	sprintf( buf, "%s became a killer by attacking %s", ch->name,
+ 	    victim->name );
+ 	wiznet( ch, WIZ_FLAGS, get_trust( ch ), buf );
  	gain_exp( ch, -600 );
  	demote_level( ch );
  
  	for ( obj = ch->carrying; obj; obj = obj_next )
diff -Pp -C4 3.1.10/src/handler.c 3.1.11/src/handler.c
*** 3.1.10/src/handler.c	Sun Mar 16 21:31:05 1997
--- 3.1.11/src/handler.c	Mon Jun 23 21:02:45 1997
*************** int get_trust( CHAR_DATA *ch )
*** 68,81 ****
   * Retrieve a character's age.
   */
  int get_age( CHAR_DATA *ch )
  {
!     return ( ch->current_age / 428400 );
  
      /* 428400 assumes 30 secs/mud hour * 24 hours/day * 35 days/month *
         17 months/year - Kahn */
  
!     /* current_age at last login - Canth */
  }
  
  
  
--- 68,85 ----
   * Retrieve a character's age.
   */
  int get_age( CHAR_DATA *ch )
  {
!     return ( ( ch->current_age + current_time - ch->logon ) / MUD_YEAR );
! 
!     /* MUD_YEAR defined in merc.h.. (252000) */
  
      /* 428400 assumes 30 secs/mud hour * 24 hours/day * 35 days/month *
         17 months/year - Kahn */
  
!     /* Changed to 252000, assuming 30 secs/mud hour * 24 hours/day *
!        7 days/week * 5 weeks/month * 10 months/year - Canth */
! 
  }
  
  
  
diff -Pp -C4 3.1.10/src/interp.c 3.1.11/src/interp.c
*** 3.1.10/src/interp.c	Mon Mar 17 20:05:55 1997
--- 3.1.11/src/interp.c	Sat Jun  7 14:48:02 1997
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 113,131 ****
      { "examine",	do_examine,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "help",		do_help,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "idea",		do_idea,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "report",		do_report,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "pagelength",     do_pagelen,     POS_DEAD,        0,  LOG_NORMAL },
      { "read",		do_look,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "score",		do_score,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "slist",          do_slist,       POS_DEAD,        0,  LOG_NORMAL },
      { "socials",	do_socials,	POS_DEAD,	 0,  LOG_NORMAL },
      { "time",		do_time,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "typo",		do_typo,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "weather",	do_weather,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "who",		do_who,		POS_DEAD,	 0,  LOG_NORMAL	},
      { "whois",		do_whois,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "wizlist",        do_wizlist,     POS_DEAD,        0,  LOG_NORMAL },
  
      /*
       * Combat commands.
       */
--- 113,131 ----
      { "examine",	do_examine,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "help",		do_help,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "idea",		do_idea,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "report",		do_report,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "pagelength",	do_pagelen,	POS_DEAD,        0,  LOG_NORMAL },
      { "read",		do_look,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "score",		do_score,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "slist",		do_slist,	POS_DEAD,        0,  LOG_NORMAL },
      { "socials",	do_socials,	POS_DEAD,	 0,  LOG_NORMAL },
      { "time",		do_time,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "typo",		do_typo,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "weather",	do_weather,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "who",		do_who,		POS_DEAD,	 0,  LOG_NORMAL	},
      { "whois",		do_whois,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "wizlist",	do_wizlist,	POS_DEAD,        0,  LOG_NORMAL },
  
      /*
       * Combat commands.
       */
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 144,167 ****
  
      /*
       * Configuration commands.
       */
!     { "auto",           do_auto,        POS_DEAD,        0,  LOG_NORMAL },
!     { "autoexit",       do_autoexit,    POS_DEAD,        0,  LOG_NORMAL },
!     { "autogold",       do_autogold,    POS_DEAD,        0,  LOG_NORMAL },
!     { "autoloot",       do_autoloot,    POS_DEAD,        0,  LOG_NORMAL },
!     { "autosac",        do_autosac,     POS_DEAD,        0,  LOG_NORMAL },
!     { "blank",          do_blank,       POS_DEAD,        0,  LOG_NORMAL },
!     { "brief",          do_brief,       POS_DEAD,        0,  LOG_NORMAL },
      { "channels",	do_channels,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "color",		do_colour,	POS_DEAD,	 0,  LOG_NORMAL },
      { "colour",		do_colour,	POS_DEAD,	 0,  LOG_NORMAL },
!     { "combine",        do_combine,     POS_DEAD,        0,  LOG_NORMAL },
      { "config",		do_config,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "description",	do_description,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "password",	do_password,	POS_DEAD,	 0,  LOG_NEVER	},
!     { "prompt",         do_prompt,      POS_DEAD,        0,  LOG_NORMAL },
!     { "sedit",		do_sedit,	POS_DEAD,	 3,  LOG_ALWAYS },
      { "title",		do_title,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "wimpy",		do_wimpy,	POS_DEAD,	 0,  LOG_NORMAL	},
  
      /*
--- 144,166 ----
  
      /*
       * Configuration commands.
       */
!     { "auto",		do_auto,	POS_DEAD,        0,  LOG_NORMAL },
!     { "autoexit",	do_autoexit,	POS_DEAD,        0,  LOG_NORMAL },
!     { "autogold",	do_autogold,	POS_DEAD,        0,  LOG_NORMAL },
!     { "autoloot",	do_autoloot,	POS_DEAD,        0,  LOG_NORMAL },
!     { "autosac",	do_autosac,	POS_DEAD,        0,  LOG_NORMAL },
!     { "blank",		do_blank,	POS_DEAD,        0,  LOG_NORMAL },
!     { "brief",		do_brief,	POS_DEAD,        0,  LOG_NORMAL },
      { "channels",	do_channels,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "color",		do_colour,	POS_DEAD,	 0,  LOG_NORMAL },
      { "colour",		do_colour,	POS_DEAD,	 0,  LOG_NORMAL },
!     { "combine",	do_combine,	POS_DEAD,        0,  LOG_NORMAL },
      { "config",		do_config,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "description",	do_description,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "password",	do_password,	POS_DEAD,	 0,  LOG_NEVER	},
!     { "prompt",		do_prompt,	POS_DEAD,        0,  LOG_NORMAL },
      { "title",		do_title,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "wimpy",		do_wimpy,	POS_DEAD,	 0,  LOG_NORMAL	},
  
      /*
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 193,201 ****
      { "brew",		do_brew,	POS_STANDING,	 0,  LOG_NORMAL },
      { "brandish",	do_brandish,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "close",		do_close,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "cdonate",	do_cdonate,	POS_RESTING,	 0,  LOG_NORMAL },
!     { "donate",         do_donate,      POS_RESTING,     0,  LOG_NORMAL },
      { "drink",		do_drink,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "drop",		do_drop,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "eat",		do_eat,		POS_RESTING,	 0,  LOG_NORMAL	},
      { "fill",		do_fill,	POS_RESTING,	 0,  LOG_NORMAL	},
--- 192,200 ----
      { "brew",		do_brew,	POS_STANDING,	 0,  LOG_NORMAL },
      { "brandish",	do_brandish,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "close",		do_close,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "cdonate",	do_cdonate,	POS_RESTING,	 0,  LOG_NORMAL },
!     { "donate",		do_donate,	POS_RESTING,     0,  LOG_NORMAL },
      { "drink",		do_drink,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "drop",		do_drop,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "eat",		do_eat,		POS_RESTING,	 0,  LOG_NORMAL	},
      { "fill",		do_fill,	POS_RESTING,	 0,  LOG_NORMAL	},
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 223,244 ****
  
      /*
       * Miscellaneous commands.
       */
!     { "afk",            do_afk,         POS_SLEEPING,    0,  LOG_NORMAL },
!     { "bash",           do_bash,        POS_STANDING,    0,  LOG_NORMAL },
!     { "bet",            do_bet,         POS_STANDING,    0,  LOG_NORMAL },
      { "bladethirst",	do_bladethirst,	POS_STANDING,	 0,  LOG_NORMAL },
      { "bring",		do_getspouse,	POS_RESTING,	 0,  LOG_NORMAL },
      { "delet",		do_delet,	POS_DEAD,	 0,  LOG_ALWAYS },
      { "delete",		do_delete,	POS_DEAD,	 0,  LOG_ALWAYS },
!     { "wager",          do_bet,         POS_STANDING,    0,  LOG_NORMAL },
!     { "chameleon power",do_chameleon,   POS_STANDING,    0,  LOG_NORMAL },
      { "follow",		do_follow,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "lose",		do_lose,	POS_RESTING,	 0,  LOG_NORMAL },
      { "group",		do_group,	POS_SLEEPING,	 0,  LOG_NORMAL	},
      { "heal",		do_heal,	POS_RESTING,	 0,  LOG_NORMAL	},
!     { "heighten senses",do_heighten,    POS_STANDING,    0,  LOG_NORMAL },
      { "hide",		do_hide,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "hunt",		do_hunt,	POS_STANDING,	 0,  LOG_NORMAL },
      { "join",		do_gospouse,	POS_RESTING,	 0,  LOG_NORMAL },
      { "learn",		do_learn,	POS_SLEEPING,	 0,  LOG_ALWAYS },
--- 222,243 ----
  
      /*
       * Miscellaneous commands.
       */
!     { "afk",		do_afk,		POS_SLEEPING,    0,  LOG_NORMAL },
!     { "bash",		do_bash,	POS_STANDING,    0,  LOG_NORMAL },
!     { "bet",		do_bet,		POS_STANDING,    0,  LOG_NORMAL },
      { "bladethirst",	do_bladethirst,	POS_STANDING,	 0,  LOG_NORMAL },
      { "bring",		do_getspouse,	POS_RESTING,	 0,  LOG_NORMAL },
      { "delet",		do_delet,	POS_DEAD,	 0,  LOG_ALWAYS },
      { "delete",		do_delete,	POS_DEAD,	 0,  LOG_ALWAYS },
!     { "wager",		do_bet,		POS_STANDING,    0,  LOG_NORMAL },
!     { "chameleon power",do_chameleon,	POS_STANDING,    0,  LOG_NORMAL },
      { "follow",		do_follow,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "lose",		do_lose,	POS_RESTING,	 0,  LOG_NORMAL },
      { "group",		do_group,	POS_SLEEPING,	 0,  LOG_NORMAL	},
      { "heal",		do_heal,	POS_RESTING,	 0,  LOG_NORMAL	},
!     { "heighten senses",do_heighten,	POS_STANDING,    0,  LOG_NORMAL },
      { "hide",		do_hide,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "hunt",		do_hunt,	POS_STANDING,	 0,  LOG_NORMAL },
      { "join",		do_gospouse,	POS_RESTING,	 0,  LOG_NORMAL },
      { "learn",		do_learn,	POS_SLEEPING,	 0,  LOG_ALWAYS },
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 251,281 ****
      { "/",		do_recall,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "register",	do_register,	POS_STANDING,	 0,  LOG_NORMAL	},
      { "rent",		do_rent,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "save",		do_save,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "shadow form",    do_shadow,      POS_STANDING,    0,  LOG_NORMAL },
      { "sleep",		do_sleep,	POS_SLEEPING,	 0,  LOG_NORMAL	},
      { "snare",		do_snare,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "sneak",		do_sneak,	POS_STANDING,	 0,  LOG_NORMAL	},
!     { "spells",         do_spells,      POS_SLEEPING,    0,  LOG_NORMAL },
      { "split",		do_split,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "steal",		do_steal,	POS_STANDING,	 0,  LOG_NORMAL	},
      { "study",		do_study,	POS_STANDING,	 0,  LOG_NORMAL },
      { "train",		do_train,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "untangle",	do_untangle,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "visible",	do_visible,	POS_SLEEPING,	 0,  LOG_NORMAL },
      { "wake",		do_wake,	POS_SLEEPING,	 0,  LOG_NORMAL	},
!     { "wed",		do_wed,		POS_DEAD,	 0,  LOG_NORMAL },
      { "where",		do_where,	POS_RESTING,	 0,  LOG_NORMAL	},
  
      /*
       * Immortal commands.
       */
      { "advance",	do_advance,	POS_DEAD,    L_DIR,  LOG_ALWAYS	},
!     { "divorce",	do_divorce,	POS_STANDING,L_DIR,  LOG_ALWAYS },
      { "imtlset",	do_imtlset,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
  /*    { "objlist",	do_objlist,	POS_DEAD,    L_DIR,  LOG_ALWAYS }, */
!     { "marry",		do_marry,       POS_STANDING,L_DIR,  LOG_ALWAYS },
      { "newring",	do_rings,	POS_STANDING,L_DIR,  LOG_ALWAYS },
      { "rename",		do_rename,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
      { "sstime",		do_sstime,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
      { "trust",		do_trust,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
--- 250,280 ----
      { "/",		do_recall,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "register",	do_register,	POS_STANDING,	 0,  LOG_NORMAL	},
      { "rent",		do_rent,	POS_DEAD,	 0,  LOG_NORMAL	},
      { "save",		do_save,	POS_DEAD,	 0,  LOG_NORMAL	},
!     { "shadow form",	do_shadow,	POS_STANDING,    0,  LOG_NORMAL },
      { "sleep",		do_sleep,	POS_SLEEPING,	 0,  LOG_NORMAL	},
      { "snare",		do_snare,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "sneak",		do_sneak,	POS_STANDING,	 0,  LOG_NORMAL	},
!     { "spells",		do_spells,	POS_SLEEPING,    0,  LOG_NORMAL },
      { "split",		do_split,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "steal",		do_steal,	POS_STANDING,	 0,  LOG_NORMAL	},
      { "study",		do_study,	POS_STANDING,	 0,  LOG_NORMAL },
      { "train",		do_train,	POS_RESTING,	 0,  LOG_NORMAL	},
      { "untangle",	do_untangle,	POS_FIGHTING,	 0,  LOG_NORMAL	},
      { "visible",	do_visible,	POS_SLEEPING,	 0,  LOG_NORMAL },
      { "wake",		do_wake,	POS_SLEEPING,	 0,  LOG_NORMAL	},
!     { "wed",		do_wed,		POS_DEAD,	 0,  LOG_NEVER  },
      { "where",		do_where,	POS_RESTING,	 0,  LOG_NORMAL	},
  
      /*
       * Immortal commands.
       */
      { "advance",	do_advance,	POS_DEAD,    L_DIR,  LOG_ALWAYS	},
! /*    { "divorce",	do_divorce,	POS_STANDING,L_DIR,  LOG_ALWAYS }, */
      { "imtlset",	do_imtlset,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
  /*    { "objlist",	do_objlist,	POS_DEAD,    L_DIR,  LOG_ALWAYS }, */
!     { "marry",		do_marry,	POS_STANDING,L_DIR,  LOG_ALWAYS },
      { "newring",	do_rings,	POS_STANDING,L_DIR,  LOG_ALWAYS },
      { "rename",		do_rename,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
      { "sstime",		do_sstime,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
      { "trust",		do_trust,	POS_DEAD,    L_DIR,  LOG_ALWAYS },
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 284,301 ****
      { "allow",		do_allow,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "ban",		do_ban,		POS_DEAD,    L_SEN,  LOG_ALWAYS	},
  /* placed bank here, to make sure ban would still work... */
      { "bank",		do_bank,	POS_STANDING,	 0,  LOG_NORMAL },
-     { "clone",		do_clone,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "deny",		do_deny,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "disconnect",	do_disconnect,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
!     { "dog",            do_dog,         POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "for",		do_for,		POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "force",		do_force,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "freeze",		do_freeze,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "log",		do_log,		POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "lset",		do_lset,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "lstat",		do_lstat,	POS_DEAD,    L_SEN,  LOG_NORMAL },
      { "mset",		do_mset,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "noemote",	do_noemote,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "notell",		do_notell,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "notestat",	do_notestat,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
--- 283,301 ----
      { "allow",		do_allow,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "ban",		do_ban,		POS_DEAD,    L_SEN,  LOG_ALWAYS	},
  /* placed bank here, to make sure ban would still work... */
      { "bank",		do_bank,	POS_STANDING,	 0,  LOG_NORMAL },
      { "deny",		do_deny,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "disconnect",	do_disconnect,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
!     { "dog",		do_dog,		POS_DEAD,    L_SEN,  LOG_ALWAYS },
!     { "echo",		do_echo,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "for",		do_for,		POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "force",		do_force,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "freeze",		do_freeze,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "log",		do_log,		POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "lset",		do_lset,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "lstat",		do_lstat,	POS_DEAD,    L_SEN,  LOG_NORMAL },
+     { "memory",		do_memory,	POS_DEAD,    L_SEN,  LOG_NORMAL	},
      { "mset",		do_mset,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "noemote",	do_noemote,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "notell",		do_notell,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "notestat",	do_notestat,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 314,338 ****
      { "setkill",	do_setkill,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "sla",		do_sla,		POS_DEAD,    L_SEN,  LOG_NORMAL	},
      { "slay",		do_slay,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "sset",		do_sset,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
!     { "sstat",          do_sstat,       POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "stat",		do_stat,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
-     { "string",		do_string,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "transfer",	do_transfer,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "update",		do_update,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "users",		do_users,	POS_DEAD,    L_SEN,  LOG_NORMAL	},
      { "vnum",		do_vnum,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
-     { "wiznet",		do_wiznet,	POS_DEAD,LEVEL_HERO, LOG_NORMAL },
      { "wizify", 	do_wizify,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "wizlock",	do_wizlock,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
  
      { "areacount",	do_area_count,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
!     { "echo",		do_echo,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "disable",	do_disable,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "exlist",		do_exlist,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
!     { "iscore",         do_iscore,      POS_DEAD,    L_JUN,  LOG_ALWAYS },
!     { "memory",		do_memory,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "mload",		do_mload,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "mfind",		do_mfind,	POS_DEAD,    L_JUN,  LOG_NORMAL },
      { "mstat",		do_mstat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "mwhere",		do_mwhere,	POS_DEAD,    L_JUN,  LOG_NORMAL },
--- 314,335 ----
      { "setkill",	do_setkill,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "sla",		do_sla,		POS_DEAD,    L_SEN,  LOG_NORMAL	},
      { "slay",		do_slay,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "sset",		do_sset,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
!     { "sstat",		do_sstat,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "stat",		do_stat,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "transfer",	do_transfer,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "update",		do_update,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "users",		do_users,	POS_DEAD,    L_SEN,  LOG_NORMAL	},
      { "vnum",		do_vnum,	POS_DEAD,    L_SEN,  LOG_ALWAYS },
      { "wizify", 	do_wizify,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
      { "wizlock",	do_wizlock,	POS_DEAD,    L_SEN,  LOG_ALWAYS	},
  
      { "areacount",	do_area_count,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
!     { "clone",		do_clone,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "disable",	do_disable,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "exlist",		do_exlist,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
!     { "iscore",		do_iscore,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "mload",		do_mload,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "mfind",		do_mfind,	POS_DEAD,    L_JUN,  LOG_NORMAL },
      { "mstat",		do_mstat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "mwhere",		do_mwhere,	POS_DEAD,    L_JUN,  LOG_NORMAL },
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 341,367 ****
      { "ofind",		do_ofind,	POS_DEAD,    L_JUN,  LOG_NORMAL },
      { "ostat",		do_ostat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "owhere",		do_owhere,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "peace",		do_peace,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
!     { "pecho",          do_pecho,       POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "recho",		do_recho,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "return",		do_return,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "rset",		do_rset,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "rstat",		do_rstat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "slookup",	do_slookup,	POS_DEAD,    L_JUN,  LOG_NORMAL },
!     { "smite",          do_smite,       POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "snoop",		do_snoop,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "switch",		do_switch,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
-     { "wizinvis",	do_invis,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
  
      { "at",		do_at,		POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "bamfin",		do_bamfin,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "bamfout",	do_bamfout,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "goto",		do_goto,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "holylight",	do_holylight,	POS_DEAD,    L_APP,  LOG_NORMAL	},
  
      { ":",		do_immtalk,	POS_DEAD,    L_HER,  LOG_NORMAL	},
!     { "scan",           do_scan,        POS_DEAD,    L_HER,  LOG_ALWAYS },
  
      { "guild",		do_guild,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "clan",		do_clan,	POS_DEAD,	 1,  LOG_NORMAL },
      { ">",		do_clantalk,	POS_DEAD,	 0,  LOG_NORMAL },
--- 338,367 ----
      { "ofind",		do_ofind,	POS_DEAD,    L_JUN,  LOG_NORMAL },
      { "ostat",		do_ostat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "owhere",		do_owhere,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "peace",		do_peace,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
!     { "pecho",		do_pecho,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "recho",		do_recho,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "return",		do_return,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "rset",		do_rset,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
      { "rstat",		do_rstat,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
      { "slookup",	do_slookup,	POS_DEAD,    L_JUN,  LOG_NORMAL },
!     { "smite",		do_smite,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "snoop",		do_snoop,	POS_DEAD,    L_JUN,  LOG_NORMAL	},
+     { "string",		do_string,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "switch",		do_switch,	POS_DEAD,    L_JUN,  LOG_ALWAYS	},
  
      { "at",		do_at,		POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "bamfin",		do_bamfin,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "bamfout",	do_bamfout,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "goto",		do_goto,	POS_DEAD,    L_APP,  LOG_NORMAL	},
      { "holylight",	do_holylight,	POS_DEAD,    L_APP,  LOG_NORMAL	},
+     { "sedit",		do_sedit,	POS_DEAD,    L_APP,  LOG_ALWAYS },
+     { "wizinvis",	do_invis,	POS_DEAD,    L_APP,  LOG_NORMAL	},
  
      { ":",		do_immtalk,	POS_DEAD,    L_HER,  LOG_NORMAL	},
!     { "scan",		do_scan,	POS_DEAD,    L_HER,  LOG_ALWAYS },
!     { "wiznet",		do_wiznet,	POS_DEAD,    L_HER,  LOG_NORMAL },
  
      { "guild",		do_guild,	POS_DEAD,    L_JUN,  LOG_ALWAYS },
      { "clan",		do_clan,	POS_DEAD,	 1,  LOG_NORMAL },
      { ">",		do_clantalk,	POS_DEAD,	 0,  LOG_NORMAL },
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 370,385 ****
  
      /*
       * OLC 1.1b
       */
!     { "aedit",          do_aedit,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "redit",          do_redit,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "oedit",          do_oedit,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "medit",          do_medit,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "mpedit",		do_mpedit,	POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "asave",          do_asave,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "alist",          do_alist,       POS_DEAD, L_SEN,  LOG_NORMAL },
!     { "resets",         do_resets,      POS_DEAD, L_SEN,  LOG_NORMAL },
  
      /*
       * Languages.
       */
--- 370,385 ----
  
      /*
       * OLC 1.1b
       */
!     { "aedit",		do_aedit,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "redit",		do_redit,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "oedit",		do_oedit,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "medit",		do_medit,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "mpedit",		do_mpedit,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "asave",		do_asave,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "alist",		do_alist,	POS_DEAD,    L_SEN,  LOG_NORMAL },
!     { "resets",		do_resets,	POS_DEAD,    L_SEN,  LOG_NORMAL },
  
      /*
       * Languages.
       */
*************** const	struct	cmd_type	cmd_table	[ ] =
*** 399,420 ****
  
      /*
       * MOBprogram commands.
       */
!     { "mpstat",         do_mpstat,      POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpasound",       do_mpasound,    POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpjunk",         do_mpjunk,      POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpecho",         do_mpecho,      POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpechoat",       do_mpechoat,    POS_DEAD, L_DIR + 1, LOG_NORMAL },
      { "mpechoaround",   do_mpechoaround,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpkill",         do_mpkill      ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpmload",        do_mpmload     ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpoload",        do_mpoload     ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mppurge",        do_mppurge     ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpgoto",         do_mpgoto      ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpat",           do_mpat        ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mptransfer",     do_mptransfer  ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpforce",        do_mpforce     ,POS_DEAD, L_DIR + 1, LOG_NORMAL },
  
  
      /*
       * End of list.
--- 399,420 ----
  
      /*
       * MOBprogram commands.
       */
!     { "mpstat",         do_mpstat,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpasound",       do_mpasound,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpjunk",         do_mpjunk,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpecho",         do_mpecho,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpechoat",       do_mpechoat,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
      { "mpechoaround",   do_mpechoaround,POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpkill",         do_mpkill,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpmload",        do_mpmload,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpoload",        do_mpoload,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mppurge",        do_mppurge,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpgoto",         do_mpgoto,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpat",           do_mpat,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mptransfer",     do_mptransfer,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
!     { "mpforce",        do_mpforce,	POS_DEAD, L_DIR + 1, LOG_NORMAL },
  
  
      /*
       * End of list.
diff -Pp -C4 3.1.10/src/language.c 3.1.11/src/language.c
*** 3.1.10/src/language.c	Mon Mar 10 20:55:15 1997
--- 3.1.11/src/language.c	Mon Jun 23 20:33:08 1997
*************** void do_language( CHAR_DATA *ch, char *a
*** 435,442 ****
--- 435,449 ----
  	int		chance2;
  	char		*lan_str;
  	char		buf	[ 256 ];
  
+ 	if( IS_NPC( ch ) )
+ 	{
+ 		send_to_char( "You can't speak any languages", ch );
+ 		do_say( ch, argument );
+ 		return;
+ 	}
+ 
  	lan_str = lang_table[language].name;
  
  	buf[0] = '\0';
  	/* Now find out if we can speak it... */
*************** void do_language( CHAR_DATA *ch, char *a
*** 460,469 ****
  
  	if(number_percent( ) <= chance )
  	{
  	   buf[0] = '\0';
! 	   sprintf (buf,"In %s, you say '{c%s{x'\n\r", lan_str, argument);
! 	   send_to_char(buf, ch);
  	   for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
  	   {
              if(!IS_NPC(och) && (och != ch))
  	    {
--- 467,476 ----
  
  	if(number_percent( ) <= chance )
  	{
  	   buf[0] = '\0';
! 	   sprintf ( buf, "In %s, you say '{c$T{x'", lan_str );
! 	   act( buf, ch, NULL, argument, TO_CHAR );
  	   for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
  	   {
              if(!IS_NPC(och) && (och != ch))
  	    {
*************** void do_language( CHAR_DATA *ch, char *a
*** 472,496 ****
  	    else
  		if(number_percent( ) <= chance2)
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, %s says, '{c%s{x'\n\r", lan_str, ch->name, argument);
! 		   send_to_char(buf, och);
  		}
  		else
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, %s says something you can't understand.\n\r", lan_str, ch->name);
! 		   send_to_char(buf, och);
  		}
               }
  	   }
  	}
  	else
  	{
  	   buf[0] = '\0';
! 	   sprintf (buf, "In %s, you try to say '{c%s{x', but it doesn't sound correct.{x\n\r", lan_str, argument);
! 	   send_to_char(buf, ch);
             for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
             {
              if(!IS_NPC(och) && (och != ch))
              {
--- 479,503 ----
  	    else
  		if(number_percent( ) <= chance2)
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, $n says, '{c%s{x'", lan_str, argument);
! 		   act( buf, ch, NULL, och, TO_VICT );
  		}
  		else
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, $n says something you can't understand.", lan_str );
! 		   act( buf, ch, NULL, och, TO_VICT );
  		}
               }
  	   }
  	}
  	else
  	{
  	   buf[0] = '\0';
! 	   sprintf (buf, "In %s, you try to say '{c$T{x', but it doesn't sound correct.{x", lan_str );
! 	   act( buf, ch, NULL, argument, TO_CHAR );
             for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
             {
              if(!IS_NPC(och) && (och != ch))
              {
*************** void do_language( CHAR_DATA *ch, char *a
*** 499,514 ****
  	    else
                  if(number_percent( ) <= chance2)
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In a weird form of %s, %s says something uncomprehensible.\n\r", lan_str, ch->name);
!                    send_to_char(buf, och);
  		}
                  else
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, %s says something you can't understand.\n\r", lan_str, ch->name);
! 		   send_to_char(buf, och);
  		}
               }
             }
  	}
--- 506,521 ----
  	    else
                  if(number_percent( ) <= chance2)
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In a weird form of %s, $n says something uncomprehensible.", lan_str );
! 		   act( buf, ch, NULL, och, TO_VICT );
  		}
                  else
  		{
  		   buf[0] = '\0';
! 		   sprintf (buf, "In %s, $n says something you can't understand.", lan_str );
! 		   act( buf, ch, NULL, och, TO_VICT );
  		}
               }
             }
  	}
diff -Pp -C4 3.1.10/src/merc.h 3.1.11/src/merc.h
*** 3.1.10/src/merc.h	Sun Mar 16 21:03:25 1997
--- 3.1.11/src/merc.h	Sat Jun 28 17:09:20 1997
*************** typedef void GAME_FUN		args( ( CHAR_DATA
*** 155,172 ****
   * String and memory management parameters.
   */
  #define MAX_KEY_HASH             1024
  #define MAX_STRING_LENGTH        4096
! #define MAX_INPUT_LENGTH          160
  
  
  
  /*
   * Game parameters.
   * Increase the max'es if you add more of something.
   * Adjust the pulse numbers to suit yourself.
   */
! #define MAX_CHUNKS		   27		/* Used in ssm.c */
  #define MAX_SKILL                 166
  #define MAX_CLASS                   8
  #define MAX_RACE                   41
  #define MAX_LEVEL                  54
--- 155,172 ----
   * String and memory management parameters.
   */
  #define MAX_KEY_HASH             1024
  #define MAX_STRING_LENGTH        4096
! #define MAX_INPUT_LENGTH          180
  
  
  
  /*
   * Game parameters.
   * Increase the max'es if you add more of something.
   * Adjust the pulse numbers to suit yourself.
   */
! #define MAX_CHUNKS		   29		/* Used in ssm.c */
  #define MAX_SKILL                 166
  #define MAX_CLASS                   8
  #define MAX_RACE                   41
  #define MAX_LEVEL                  54
*************** typedef void GAME_FUN		args( ( CHAR_DATA
*** 188,197 ****
  /* Save the database - OLC 1.1b */
  #define PULSE_DB_DUMP             (1800* PULSE_PER_SECOND ) /* 30 minutes  */
  #define MUD_HOUR		  ( PULSE_TICK / PULSE_PER_SECOND )
  #define MUD_DAY			  ( 24 * MUD_HOUR )
! #define MUD_MONTH		  ( 35 * MUD_DAY )
! #define MUD_YEAR		  ( 17 * MUD_MONTH )
  
  /*
   * Language stuff
   */
--- 188,216 ----
  /* Save the database - OLC 1.1b */
  #define PULSE_DB_DUMP             (1800* PULSE_PER_SECOND ) /* 30 minutes  */
  #define MUD_HOUR		  ( PULSE_TICK / PULSE_PER_SECOND )
  #define MUD_DAY			  ( 24 * MUD_HOUR )
! #define MUD_WEEK		  ( 7 * MUD_DAY )
! #define MUD_MONTH		  ( 5 * MUD_WEEK )
! #define MUD_YEAR		  ( 10 * MUD_MONTH )
! /* hours per day, days per week, weeks per month, etc */
! #define HOUR_DAY		  ( MUD_DAY / MUD_HOUR )
! #define DAY_WEEK		  ( MUD_WEEK / MUD_DAY )
! #define WEEK_MONTH		  ( MUD_MONTH / MUD_WEEK )
! #define MONTH_YEAR		  ( MUD_YEAR / MUD_MONTH )
! #define DAY_MONTH		  ( DAY_WEEK * WEEK_MONTH )
! /* (Used for time_info.day... to name the days of the month) */
! /* MUD dates adjusted to make ppl age a little faster
!  * MUD_HOUR  =   7.5 seconds
!  * MUD_DAY   =   180 seconds (3 minutes)
!  * MUD_WEEK  =  1260 seconds (21 minutes)
!  * MUD_MONTH =  6300 seconds (1 hour, 45 minutes)
!  * MUD_YEAR  = 63000 seconds (17 hours, 30 minutes)
!  * So for every 17.5 hours a player spends on-line, he ages 1 year.
!  * (Humans start at +- 20, die at +- 60, so approx 40 life years
!  *  this means they can be on-line for 29 days non-stop)
!  * Canth - 7/6/97
!  */
  
  /*
   * Language stuff
   */
*************** static char * const attack_table [ ] = 
*** 226,233 ****
--- 245,253 ----
  struct  ban_data
  {
      BAN_DATA *  next;
      char *      name;
+     int		level;
  };
  
  /*
   * Drunk struct
*************** struct disabled_data
*** 268,275 ****
--- 288,296 ----
  struct  time_info_data
  {
      int         hour;
      int         day;
+     int		week;
      int         month;
      int         year;
  };
  
*************** struct  kill_data
*** 758,765 ****
--- 779,792 ----
  #define OBJ_VNUM_WEDDING_BAND	3372	/* Canth (canth@xs4all.nl) of Mythran */
  
  #define OBJ_VNUM_PORTAL		62	/* Default portal for portal spell */
  
+ #define OBJ_VNUM_BDAY_1		70	/* Birthday presents - Canth */
+ #define OBJ_VNUM_BDAY_2		71
+ #define OBJ_VNUM_BDAY_3		72
+ #define OBJ_VNUM_BDAY_4		73
+ #define OBJ_VNUM_BDAY_5		74
+ 
  /*
   * Item types.
   * Used in #OBJECTS.
   */
*************** struct  pc_data
*** 1288,1295 ****
--- 1315,1323 ----
      int                 learned         [ MAX_SKILL ];		/* Maniac */
      int			language	[ MAX_LANGUAGE ];	/* Maniac */
      int			speaking;				/* Maniac */
      int			learn;					/* Maniac */
+     int			last_age;				/* Canth */
      int			balance;				/* Maniac */
      int			shares;					/* Maniac */
      int			security;				/* OLC */
      int			clan;					/* Maniac */
diff -Pp -C4 3.1.10/src/save.c 3.1.11/src/save.c
*** 3.1.10/src/save.c	Sun Mar 16 21:49:34 1997
--- 3.1.11/src/save.c	Sat Jun 28 15:17:07 1997
*************** bool load_char_obj( DESCRIPTOR_DATA *d, 
*** 435,442 ****
--- 435,444 ----
      ch->pcdata->condition[COND_FULL]	= 48;
      ch->pcdata->pagelen                 = 20;
      ch->pcdata->security		= 0;
      ch->pcdata->oldclass		= 0;	/* Remort code -- Maniac */
+     ch->pcdata->last_age		= 999;	/* So we don't have NEWBIE
+ 						 * birthdays :) Canth */
  
      ch->pcdata->switched                = FALSE;
  
      found = FALSE;
*************** bool load_char_obj( DESCRIPTOR_DATA *d, 
*** 509,517 ****
  	if (race_table[ch->race].death_age < 0)
  		ch->death_age = -1;
  	else
  	{
! 	    ch->death_age = 428400 * ( race_table[ch->race].death_age +
  		dice( race_table[ch->race].death_age_mod[0],
  		    race_table[ch->race].death_age_mod[1]) );
  	}
  #else
--- 511,519 ----
  	if (race_table[ch->race].death_age < 0)
  		ch->death_age = -1;
  	else
  	{
! 	    ch->death_age = MUD_YEAR * ( race_table[ch->race].death_age +
  		dice( race_table[ch->race].death_age_mod[0],
  		    race_table[ch->race].death_age_mod[1]) );
  	}
  #else
*************** bool load_char_obj( DESCRIPTOR_DATA *d, 
*** 524,532 ****
  	if ( race_table[ ch->race ].start_age < 0 )
  	    ch->current_age = -1;
  	else
  	{
! 	    ch->current_age = 428400 * ( race_table[ ch->race ].start_age +
  		dice( race_table[ ch->race ].start_age_mod[ 0 ],
  		    race_table[ ch->race ].start_age_mod[ 1 ] ) );
  	}
  #else
--- 526,534 ----
  	if ( race_table[ ch->race ].start_age < 0 )
  	    ch->current_age = -1;
  	else
  	{
! 	    ch->current_age = MUD_YEAR * ( race_table[ ch->race ].start_age +
  		dice( race_table[ ch->race ].start_age_mod[ 0 ],
  		    race_table[ ch->race ].start_age_mod[ 1 ] ) );
  	}
  #else
*************** void fread_char( CHAR_DATA *ch, FILE *fp
*** 851,858 ****
--- 853,863 ----
  		break;
  	    }
  	    break;
  	}
+ 
+ 	/* Assign this variable here as it is not necesary to save it */
+ 	ch->pcdata->last_age = get_age ( ch );
  
  	/* Make sure old chars have this field - Kahn */
  	if ( !ch->pcdata->pagelen )
  	    ch->pcdata->pagelen = 20;
diff -Pp -C4 3.1.10/src/social-edit.c 3.1.11/src/social-edit.c
*** 3.1.10/src/social-edit.c	Mon Mar 10 20:55:15 1997
--- 3.1.11/src/social-edit.c	Sat Jun 28 17:09:12 1997
***************
*** 33,45 ****
  #include "merc.h"
  
  #define SOCIAL_FILE "SOCIALS.TXT" /* or whatever fits you */
  
- /* #define CONST_SOCIAL */  /* remove this in Step 2 */
- 
  int maxSocial; /* max number of socials */
  
- #ifndef CONST_SOCIAL 
  struct social_type *social_table;	   /* and social table */
  
  void load_social (FILE *fp, struct social_type *social)
  {
--- 33,42 ----
*************** void load_social (FILE *fp, struct socia
*** 56,177 ****
  void load_social_table ()
  {
  	FILE *fp;
  	int i;
! 	
! 	
  	fp = fopen (SOCIAL_FILE, "r");
! 	
  	if (!fp)
  	{
  		bug ("Could not open " SOCIAL_FILE " for reading.",0);
  		exit(1);
  	}
! 	
  	fscanf (fp, "%d\n", &maxSocial);
  
  	/* IMPORTANT to use malloc so we can realloc later on */
! 		
  	social_table = malloc (sizeof(struct social_type) * (maxSocial+1));
! 	
  	for (i = 0; i < maxSocial; i++)
  		load_social (fp,&social_table[i]);
  
  	/* For backwards compatibility */
! 			
  	social_table[maxSocial].name = str_dup(""); /* empty! */		
! 		
  	fclose (fp);
- 	
- }
  
! #endif /* CONST_SOCIAL */
  
  void save_social (const struct social_type *s, FILE *fp)
  {
  	/* get rid of (null) */
  	fprintf (fp, "%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n\n",
! 			       s->name 			 ? s->name          : "" , 
! 			       s->char_no_arg 	 ? s->char_no_arg   : "" , 
! 			       s->others_no_arg  ? s->others_no_arg : "" ,
! 			       s->char_found     ? s->char_found    : "" , 
! 			       s->others_found   ? s->others_found  : "" , 
! 			       s->vict_found     ? s->vict_found    : "" ,
! 			       s->char_auto      ? s->char_auto     : "" , 
! 			       s->others_auto    ? s->others_auto   : ""
! 			       );
  }
  
  
  void save_social_table()
  {
  	FILE *fp;
  	int i;
! 	
  	fp = fopen (SOCIAL_FILE, "w");
! 	
  	if (!fp)
  	{
  		bug ("Could not open " SOCIAL_FILE " for writing.",0);
  		return;
  	}
  
! #ifdef CONST_SOCIAL /* If old table still in use, count socials first */
! 	
! 	for (maxSocial = 0 ; social_table[maxSocial].name[0] ; maxSocial++)
! 		; /* empty */
! #endif	
! 	
! 	
  	fprintf (fp, "%d\n", maxSocial);
! 	
  	for ( i = 0 ; i < maxSocial ; i++)
  		save_social (&social_table[i], fp);
! 		
  	fclose (fp);
  }
  
  
  /* Find a social based on name */ 
  int social_lookup (const char *name)
  {
  	int i;
! 	
  	for (i = 0; i < maxSocial ; i++)
  		if (!str_cmp(name, social_table[i].name))
  			return i;
! 			
  	return -1;
  }
  
  /*
   * Social editting command
   */
- 
- #ifndef CONST_SOCIAL
  void do_sedit (CHAR_DATA *ch, char *argument)
  {
! 	char cmd[MAX_INPUT_LENGTH], social[MAX_INPUT_LENGTH];
! 	char buf[MAX_STRING_LENGTH];
  	int iSocial;
! 	
  	argument = one_argument (argument,cmd);
  	argument = one_argument (argument,social);
! 	
  	if (!cmd[0])
  	{
  		send_to_char ("Huh? Type HELP SEDIT to see syntax.\n\r",ch);
  		return;
  	}
! 		
  	if (!social[0])
  	{
  		send_to_char ("What social do you want to operate on?\n\r",ch);
  		return;
  	}
! 	
  	iSocial = social_lookup (social);
! 	
  	if (str_cmp(cmd,"new") && (iSocial == -1))
  	{
  		send_to_char ("No such social exists.\n\r",ch);
  		return;
--- 53,165 ----
  void load_social_table ()
  {
  	FILE *fp;
  	int i;
! 
! 
  	fp = fopen (SOCIAL_FILE, "r");
! 
  	if (!fp)
  	{
  		bug ("Could not open " SOCIAL_FILE " for reading.",0);
  		exit(1);
  	}
! 
  	fscanf (fp, "%d\n", &maxSocial);
  
  	/* IMPORTANT to use malloc so we can realloc later on */
! 
  	social_table = malloc (sizeof(struct social_type) * (maxSocial+1));
! 
  	for (i = 0; i < maxSocial; i++)
  		load_social (fp,&social_table[i]);
  
  	/* For backwards compatibility */
! 
  	social_table[maxSocial].name = str_dup(""); /* empty! */		
! 
  	fclose (fp);
  
! }
  
  void save_social (const struct social_type *s, FILE *fp)
  {
  	/* get rid of (null) */
  	fprintf (fp, "%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n\n",
! 		s->name		  ? s->name		: "" , 
! 		s->char_no_arg	  ? s->char_no_arg	: "" , 
! 		s->others_no_arg  ? s->others_no_arg	: "" ,
! 		s->char_found	  ? s->char_found	: "" , 
! 		s->others_found	  ? s->others_found	: "" , 
! 		s->vict_found	  ? s->vict_found	: "" ,
! 		s->char_auto	  ? s->char_auto	: "" , 
! 		s->others_auto	  ? s->others_auto	: ""
! 		);
  }
  
  
  void save_social_table()
  {
  	FILE *fp;
  	int i;
! 
  	fp = fopen (SOCIAL_FILE, "w");
! 
  	if (!fp)
  	{
  		bug ("Could not open " SOCIAL_FILE " for writing.",0);
  		return;
  	}
  
! 
  	fprintf (fp, "%d\n", maxSocial);
! 
  	for ( i = 0 ; i < maxSocial ; i++)
  		save_social (&social_table[i], fp);
! 
  	fclose (fp);
  }
  
  
  /* Find a social based on name */ 
  int social_lookup (const char *name)
  {
  	int i;
! 
  	for (i = 0; i < maxSocial ; i++)
  		if (!str_cmp(name, social_table[i].name))
  			return i;
! 
  	return -1;
  }
  
  /*
   * Social editting command
   */
  void do_sedit (CHAR_DATA *ch, char *argument)
  {
! 	char cmd    [ MAX_INPUT_LENGTH  ];
! 	char social [ MAX_INPUT_LENGTH  ];
! 	char buf    [ MAX_STRING_LENGTH ];
  	int iSocial;
! 
  	argument = one_argument (argument,cmd);
  	argument = one_argument (argument,social);
! 
  	if (!cmd[0])
  	{
  		send_to_char ("Huh? Type HELP SEDIT to see syntax.\n\r",ch);
  		return;
  	}
! 
  	if (!social[0])
  	{
  		send_to_char ("What social do you want to operate on?\n\r",ch);
  		return;
  	}
! 
  	iSocial = social_lookup (social);
! 
  	if (str_cmp(cmd,"new") && (iSocial == -1))
  	{
  		send_to_char ("No such social exists.\n\r",ch);
  		return;
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 180,250 ****
  	if (!str_cmp(cmd, "delete")) /* Remove a social */
  	{
  		int i,j;
  		struct social_type *new_table = malloc (sizeof(struct social_type) * maxSocial);
! 		
  		if (!new_table)
  		{
  			send_to_char ("Memory allocation failed. Brace for impact...\n\r",ch);
  			return;
  		}
! 		
  		/* Copy all elements of old table into new table, except the deleted social */
  		for (i = 0, j = 0; i < maxSocial+1; i++)
  			if (i != iSocial) /* copy, increase only if copied */
  			{
  				new_table[j] = social_table[i];
  				j++;
  			}
! 	
  		free (social_table);
  		social_table = new_table;
! 		
  		maxSocial--; /* Important :() */
! 		
  		send_to_char ("That social is history now.\n\r",ch);
! 				
  	}
! 	
  	else if (!str_cmp(cmd, "new")) /* Create a new social */
  	{
  		struct social_type *new_table;
! 		
  		if (iSocial != -1)
  		{
  			send_to_char ("A social with that name already exists\n\r",ch);
  			return;
  		}
! 		
  		/* reallocate the table */
  		/* Note that the table contains maxSocial socials PLUS one empty spot! */
! 		
  		maxSocial++;
  		new_table = realloc (social_table, sizeof(struct social_type) * maxSocial + 1);
! 		
  		if (!new_table) /* realloc failed */
  		{
  			send_to_char ("Memory allocation failed. Brace for impact.\n\r",ch);
  			return;
  		}
! 		
  		social_table = new_table;
! 		
  		social_table[maxSocial-1].name = str_dup (social);
  		social_table[maxSocial-1].char_no_arg = str_dup ("");
  		social_table[maxSocial-1].others_no_arg = str_dup ("");
  		social_table[maxSocial-1].char_found = str_dup ("");
  		social_table[maxSocial-1].others_found = str_dup ("");
  		social_table[maxSocial-1].vict_found = str_dup ("");
  		social_table[maxSocial-1].char_auto = str_dup ("");
  		social_table[maxSocial-1].others_auto = str_dup ("");
! 		
  		social_table[maxSocial].name = str_dup (""); /* 'terminating' empty string */
! 		
  		send_to_char ("New social added.\n\r",ch);
! 			
  	}
! 	
  	else if (!str_cmp(cmd, "show")) /* Show a certain social */
  	{
  		sprintf (buf, "Social: %s\n\r"
  		              "(cnoarg) No argument given, character sees:\n\r"
--- 168,247 ----
  	if (!str_cmp(cmd, "delete")) /* Remove a social */
  	{
  		int i,j;
  		struct social_type *new_table = malloc (sizeof(struct social_type) * maxSocial);
! 
  		if (!new_table)
  		{
  			send_to_char ("Memory allocation failed. Brace for impact...\n\r",ch);
  			return;
  		}
! 
  		/* Copy all elements of old table into new table, except the deleted social */
  		for (i = 0, j = 0; i < maxSocial+1; i++)
  			if (i != iSocial) /* copy, increase only if copied */
  			{
  				new_table[j] = social_table[i];
  				j++;
  			}
! 
  		free (social_table);
  		social_table = new_table;
! 
  		maxSocial--; /* Important :() */
! 
  		send_to_char ("That social is history now.\n\r",ch);
! 
! 		sprintf( buf, "%s just deleted the %s social", ch->name,
! 		    social );
! 		log_string( buf );
! 		wiznet( ch, WIZ_SECURE, get_trust( ch ), buf );
! 
  	}
! 
  	else if (!str_cmp(cmd, "new")) /* Create a new social */
  	{
  		struct social_type *new_table;
! 
  		if (iSocial != -1)
  		{
  			send_to_char ("A social with that name already exists\n\r",ch);
  			return;
  		}
! 
  		/* reallocate the table */
  		/* Note that the table contains maxSocial socials PLUS one empty spot! */
! 
  		maxSocial++;
  		new_table = realloc (social_table, sizeof(struct social_type) * maxSocial + 1);
! 
  		if (!new_table) /* realloc failed */
  		{
  			send_to_char ("Memory allocation failed. Brace for impact.\n\r",ch);
  			return;
  		}
! 
  		social_table = new_table;
! 
  		social_table[maxSocial-1].name = str_dup (social);
  		social_table[maxSocial-1].char_no_arg = str_dup ("");
  		social_table[maxSocial-1].others_no_arg = str_dup ("");
  		social_table[maxSocial-1].char_found = str_dup ("");
  		social_table[maxSocial-1].others_found = str_dup ("");
  		social_table[maxSocial-1].vict_found = str_dup ("");
  		social_table[maxSocial-1].char_auto = str_dup ("");
  		social_table[maxSocial-1].others_auto = str_dup ("");
! 
  		social_table[maxSocial].name = str_dup (""); /* 'terminating' empty string */
! 
  		send_to_char ("New social added.\n\r",ch);
! 
! 		sprintf( buf, "%s added the %s social", ch->name, social );
! 		log_string( buf );
! 		wiznet( ch, WIZ_SECURE, get_trust( ch ), buf );
! 
  	}
! 
  	else if (!str_cmp(cmd, "show")) /* Show a certain social */
  	{
  		sprintf (buf, "Social: %s\n\r"
  		              "(cnoarg) No argument given, character sees:\n\r"
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 260,268 ****
  		              "(cself) Target is character himself:\n\r"
  		              "%s\n\r\n\r"
  		              "(oself) Target is character himself, others see:\n\r"
  		              "%s\n\r",
! 		              
  		              social_table[iSocial].name,
  		              social_table[iSocial].char_no_arg,
  		              social_table[iSocial].others_no_arg,
  		              social_table[iSocial].char_found,
--- 257,265 ----
  		              "(cself) Target is character himself:\n\r"
  		              "%s\n\r\n\r"
  		              "(oself) Target is character himself, others see:\n\r"
  		              "%s\n\r",
! 
  		              social_table[iSocial].name,
  		              social_table[iSocial].char_no_arg,
  		              social_table[iSocial].others_no_arg,
  		              social_table[iSocial].char_found,
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 273,281 ****
  
  		send_to_char (buf,ch);		          
  		return; /* return right away, do not save the table */
  	}
! 	
  	else if (!str_cmp(cmd, "cnoarg")) /* Set that argument */
  	{
  		free_string (social_table[iSocial].char_no_arg);
  		social_table[iSocial].char_no_arg = str_dup(argument);		
--- 270,278 ----
  
  		send_to_char (buf,ch);		          
  		return; /* return right away, do not save the table */
  	}
! 
  	else if (!str_cmp(cmd, "cnoarg")) /* Set that argument */
  	{
  		free_string (social_table[iSocial].char_no_arg);
  		social_table[iSocial].char_no_arg = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 284,292 ****
  			send_to_char ("Character will now see nothing when this social is used without arguments.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 	
  	else if (!str_cmp(cmd, "onoarg"))
  	{
  		free_string (social_table[iSocial].others_no_arg);
  		social_table[iSocial].others_no_arg = str_dup(argument);		
--- 281,289 ----
  			send_to_char ("Character will now see nothing when this social is used without arguments.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 
  	else if (!str_cmp(cmd, "onoarg"))
  	{
  		free_string (social_table[iSocial].others_no_arg);
  		social_table[iSocial].others_no_arg = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 294,304 ****
  		if (!argument[0])
  			send_to_char ("Others will now see nothing when this social is used without arguments.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 			
  	}
! 	
  	else if (!str_cmp(cmd, "cfound"))
  	{
  		free_string (social_table[iSocial].char_found);
  		social_table[iSocial].char_found = str_dup(argument);		
--- 291,301 ----
  		if (!argument[0])
  			send_to_char ("Others will now see nothing when this social is used without arguments.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 
  	}
! 
  	else if (!str_cmp(cmd, "cfound"))
  	{
  		free_string (social_table[iSocial].char_found);
  		social_table[iSocial].char_found = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 306,316 ****
  		if (!argument[0])
  			send_to_char ("The character will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 			
  	}
! 	
  	else if (!str_cmp(cmd, "ofound"))
  	{
  		free_string (social_table[iSocial].others_found);
  		social_table[iSocial].others_found = str_dup(argument);		
--- 303,313 ----
  		if (!argument[0])
  			send_to_char ("The character will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 
  	}
! 
  	else if (!str_cmp(cmd, "ofound"))
  	{
  		free_string (social_table[iSocial].others_found);
  		social_table[iSocial].others_found = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 318,328 ****
  		if (!argument[0])
  			send_to_char ("Others will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 			
  	}
! 	
  	else if (!str_cmp(cmd, "vfound"))
  	{
  		free_string (social_table[iSocial].vict_found);
  		social_table[iSocial].vict_found = str_dup(argument);		
--- 315,325 ----
  		if (!argument[0])
  			send_to_char ("Others will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
! 
  	}
! 
  	else if (!str_cmp(cmd, "vfound"))
  	{
  		free_string (social_table[iSocial].vict_found);
  		social_table[iSocial].vict_found = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 331,339 ****
  			send_to_char ("Victim will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 	
  	else if (!str_cmp(cmd, "cself"))
  	{
  		free_string (social_table[iSocial].char_auto);
  		social_table[iSocial].char_auto = str_dup(argument);		
--- 328,336 ----
  			send_to_char ("Victim will now see nothing when a target is found.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 
  	else if (!str_cmp(cmd, "cself"))
  	{
  		free_string (social_table[iSocial].char_auto);
  		social_table[iSocial].char_auto = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 343,351 ****
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  
  	}
! 	
  	else if (!str_cmp(cmd, "oself"))
  	{
  		free_string (social_table[iSocial].others_auto);
  		social_table[iSocial].others_auto = str_dup(argument);		
--- 340,348 ----
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  
  	}
! 
  	else if (!str_cmp(cmd, "oself"))
  	{
  		free_string (social_table[iSocial].others_auto);
  		social_table[iSocial].others_auto = str_dup(argument);		
*************** void do_sedit (CHAR_DATA *ch, char *argu
*** 354,369 ****
  			send_to_char ("Others will now see nothing when character targets self.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 	
  	else
  	{
  		send_to_char ("Huh? Try HELP SEDIT.\n\r",ch);
  		return;
  	}
! 	
  	/* We have done something. update social table */
! 	
  	save_social_table();
  }
- #endif /* CONST_SOCIAL */
--- 351,365 ----
  			send_to_char ("Others will now see nothing when character targets self.\n\r",ch);
  		else
  			act ( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR );
  	}
! 
  	else
  	{
  		send_to_char ("Huh? Try HELP SEDIT.\n\r",ch);
  		return;
  	}
! 
  	/* We have done something. update social table */
! 
  	save_social_table();
  }
diff -Pp -C4 3.1.10/src/update.c 3.1.11/src/update.c
*** 3.1.10/src/update.c	Sun Mar 16 21:56:06 1997
--- 3.1.11/src/update.c	Mon Jun 23 21:24:41 1997
*************** void	char_update     args( ( void ) );
*** 57,64 ****
--- 57,68 ----
  void	obj_update      args( ( void ) );
  void	aggr_update     args( ( void ) );
  void    quest_update	args( ( void ) );
  
+ /*
+  * External functions.
+  */
+ void	birthday	args( ( CHAR_DATA *ch ) );
  
  
  /*
   * Advancement stuff.
*************** void gain_exp( CHAR_DATA *ch, int gain )
*** 180,188 ****
      {
  	send_to_char( "You raise a level!!  ", ch );
  	ch->level += 1;
  	advance_level( ch );
! 	sprintf( buf, "%s has levelled.\n\r", ch->name );
  	wiznet( ch, WIZ_LEVELS, get_trust( ch ), buf );
      }
  
      return;
--- 184,193 ----
      {
  	send_to_char( "You raise a level!!  ", ch );
  	ch->level += 1;
  	advance_level( ch );
! 	sprintf( buf, "%s has levelled and is now level %d.", ch->name,
! 	    ch->level );
  	wiznet( ch, WIZ_LEVELS, get_trust( ch ), buf );
      }
  
      return;
*************** void weather_update( void )
*** 534,583 ****
      buf[0] = '\0';
  
      switch ( ++time_info.hour )
      {
!     case  6:
  	weather_info.sunlight = SUN_RISE;
  	strcat( buf, "The sun rises in the east.\n\r" );
  	break;
  
!     case  7:
  	weather_info.sunlight = SUN_LIGHT;
  	strcat( buf, "The day has begun.\n\r" );
  	break;
  
!     case 19:
  	weather_info.sunlight = SUN_SET;
  	strcat( buf, "The sun slowly disappears in the west.\n\r" );
  	break;
  
!     case 20:
  	weather_info.sunlight = SUN_DARK;
  	strcat( buf, "The night has begun.\n\r" );
  	break;
  
!     case 24:
  	time_info.hour = 0;
  	time_info.day++;
  	break;
      }
  
!     if ( time_info.day   >= 35 )
      {
  	time_info.day = 0;
  	time_info.month++;
      }
  
!     if ( time_info.month >= 17 )
      {
  	time_info.month = 0;
  	time_info.year++;
      }
  
      /*
       * Weather change.
       */
!     if ( time_info.month >= 9 && time_info.month <= 16 )
  	diff = weather_info.mmhg >  985 ? -2 : 2;
      else
  	diff = weather_info.mmhg > 1015 ? -2 : 2;
  
--- 539,588 ----
      buf[0] = '\0';
  
      switch ( ++time_info.hour )
      {
!     case  (int) ( ( HOUR_DAY / 5 ) + 1 ):
  	weather_info.sunlight = SUN_RISE;
  	strcat( buf, "The sun rises in the east.\n\r" );
  	break;
  
!     case  (int) ( ( HOUR_DAY / 5 ) + 2 ):
  	weather_info.sunlight = SUN_LIGHT;
  	strcat( buf, "The day has begun.\n\r" );
  	break;
  
!     case (int) ( HOUR_DAY * 4 / 5 ):
  	weather_info.sunlight = SUN_SET;
  	strcat( buf, "The sun slowly disappears in the west.\n\r" );
  	break;
  
!     case (int) ( (HOUR_DAY * 4 / 5 ) + 1 ):
  	weather_info.sunlight = SUN_DARK;
  	strcat( buf, "The night has begun.\n\r" );
  	break;
  
!     case HOUR_DAY:
  	time_info.hour = 0;
  	time_info.day++;
  	break;
      }
  
!     if ( time_info.day   >= DAY_MONTH )
      {
  	time_info.day = 0;
  	time_info.month++;
      }
  
!     if ( time_info.month >= MONTH_YEAR )
      {
  	time_info.month = 0;
  	time_info.year++;
      }
  
      /*
       * Weather change.
       */
!     if ( time_info.month >= ( MONTH_YEAR / 2 ) && time_info.month <= MONTH_YEAR )
  	diff = weather_info.mmhg >  985 ? -2 : 2;
      else
  	diff = weather_info.mmhg > 1015 ? -2 : 2;
  
*************** void bank_update(void)
*** 677,685 ****
          value = number_range ( 0, 200);
          value -= 100;
          value /= 10;
  
!         share_value += value;
  
          if ( !( fp = fopen ( BANK_FILE, "w" ) ) )
          {
                  bug( "bank_update:  fopen of BANK_FILE failed", 0 );
--- 682,691 ----
          value = number_range ( 0, 200);
          value -= 100;
          value /= 10;
  
!         if ( ( share_value += value) < 0 )
! 		share_value = 1;
  
          if ( !( fp = fopen ( BANK_FILE, "w" ) ) )
          {
                  bug( "bank_update:  fopen of BANK_FILE failed", 0 );
*************** void char_update( void )
*** 714,728 ****
  	if (IS_PC( ch ) )
  	{
  	    if ( ( ch->death_age > 0 ) && ( get_trust( ch ) <= LEVEL_HERO ) )
  	    {
! 		if ( ( ch->current_age + (int) current_time - ch->logon )
! 			>= ch->death_age )	/* Player dies (old age) */
  		{
  		    die_old_age( ch );
  		    continue;
  		}
  	    }
  	}
  
  	/*
  	 * Find dude with oldest save time.
--- 720,740 ----
  	if (IS_PC( ch ) )
  	{
  	    if ( ( ch->death_age > 0 ) && ( get_trust( ch ) <= LEVEL_HERO ) )
  	    {
! 		if ( get_age( ch ) >= ch->death_age )	/* Player dies (old age) */
  		{
  		    die_old_age( ch );
  		    continue;
  		}
  	    }
+ 	    /* Check to see if a char ages here */
+ 	    if ( ch->pcdata->last_age < get_age( ch ) )
+ 	    {
+ 		ch->pcdata->last_age= get_age( ch );
+ 		birthday( ch );
+ 	    }
+ 
  	}
  
  	/*
  	 * Find dude with oldest save time.
*************** void ban_update( void )
*** 1497,1505 ****
  	return;
      }
  
      for ( pban = ban_list; pban; pban = pban->next )
!         fprintf( fp, "%s~\n", pban->name );
  
      fclose( fp );
      fpReserve = fopen( NULL_FILE, "r" );
  
--- 1509,1520 ----
  	return;
      }
  
      for ( pban = ban_list; pban; pban = pban->next )
!     {
!         fprintf( fp, "%s~\n", pban->name  );
! 	fprintf( fp, "%d\n",  pban->level );
!     }
  
      fclose( fp );
      fpReserve = fopen( NULL_FILE, "r" );
  
diff -Pp -C4 3.1.10/src/wiznet.c 3.1.11/src/wiznet.c
*** 3.1.10/src/wiznet.c	Sun Mar 16 15:52:14 1997
--- 3.1.11/src/wiznet.c	Sat Jun  7 13:03:47 1997
*************** void wiznet( CHAR_DATA *ch, int chan, in
*** 241,256 ****
  	strcat (buf, "\n\r" );
  
  	for ( d = descriptor_list; d != NULL; d = d->next )
  	{
! 		if (d->connected == CON_PLAYING		/* Playing ??? */
  		&& (!d->original)			/* Fix ???? */
! 		&& (get_trust(d->character) >= level)	/* Powerfull enuf */
  		&& (d->character != ch )		/* Not the sender */
! 		&& (WCHAN(d->character, WIZ_ON ) )	/* Is wiznet on */
! 		&& (WCHAN(d->character, chan ) )	/* Is this chan on */
  		&& (get_trust( d->character ) > L_HER )	/* Ex-imm's */
! 		&& (can_see( d->character, ch ) ) )	/* Can see each other */
  		{
  			/* used bw to show {'s in the log instead of colour */
  			send_to_char_bw (buf, d->character );
  		}
--- 241,257 ----
  	strcat (buf, "\n\r" );
  
  	for ( d = descriptor_list; d != NULL; d = d->next )
  	{
! 		if ( ( d->connected == CON_PLAYING )	/* Playing ??? */
  		&& (!d->original)			/* Fix ???? */
! 		&& (get_trust( d->character ) >= level)	/* Powerfull enuf */
  		&& (d->character != ch )		/* Not the sender */
! 		&& (WCHAN( d->character, WIZ_ON ) )	/* Is wiznet on */
! 		&& (WCHAN( d->character, chan ) )	/* Is this chan on */
  		&& (get_trust( d->character ) > L_HER )	/* Ex-imm's */
! 		&& (ch ? can_see( d->character, ch ) : TRUE ) )	/* Can see each other */
! 		/* Beware of NULL ch.. - Canth */
  		{
  			/* used bw to show {'s in the log instead of colour */
  			send_to_char_bw (buf, d->character );
  		}