/
olc11/
olc11/Envy20/code/
olc11/install/
olc11/install/area/
olc11/install/changes/
olc11/install/code/
olc11/install/doc/
olc11/install/options/
diff -u -p stock/Makefile src/Makefile
--- stock/Makefile	Tue Dec 26 23:17:54 1995
+++ src/Makefile	Sun May 11 19:26:12 1997
@@ -10,11 +10,12 @@ C_FLAGS = $(O_FLAGS) -Wall $(DEBUG) $(PR
 L_FLAGS = $(O_FLAGS)                $(PROF)
 
 O_FILES = act_comm.o act_info.o act_move.o act_obj.o act_wiz.o comm.o const.o \
-          db.o fight.o handler.o interp.o magic.o save.o special.o update.o
+          db.o fight.o handler.o interp.o magic.o save.o special.o update.o \
+          bit.o mem.o olc.o olc_act.o olc_save.o string.o
 
-envy: $(O_FILES)
-	rm -f envy
-	$(CC) $(L_FLAGS) -o envy $(O_FILES)
+envy2: $(O_FILES)
+	rm -f envy2
+	$(CC) $(L_FLAGS) -o envy2 $(O_FILES)
 
 .c.o: merc.h
 	$(CC) -c $(C_FLAGS) $<
diff -u -p stock/act_comm.c src/act_comm.c
--- stock/act_comm.c	Tue Dec 26 23:17:54 1995
+++ src/act_comm.c	Wed May 28 15:31:16 1997
@@ -515,7 +515,8 @@ void talk_channel( CHAR_DATA *ch, char *
     }
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
@@ -551,7 +552,8 @@ void talk_channel( CHAR_DATA *ch, char *
 	if ( d->connected == CON_PLAYING
 	    && vch != ch
 	    && !IS_SET( och->deaf, channel )
-	    && !IS_SET( och->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+	    && !IS_SET( och->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+            && !IS_SET( och->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	{
 	    if ( channel == CHANNEL_IMMTALK && !IS_HERO( och ) )
 		continue;
@@ -656,7 +658,8 @@ void do_say( CHAR_DATA *ch, char *argume
     }
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
@@ -676,7 +679,8 @@ void do_tell( CHAR_DATA *ch, char *argum
     int        position;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
@@ -697,7 +701,8 @@ void do_tell( CHAR_DATA *ch, char *argum
 
     if ( ( !IS_NPC( ch ) && (   IS_SET( ch->act, PLR_SILENCE )
 			     || IS_SET( ch->act, PLR_NO_TELL ) ) )
-	|| IS_SET( victim->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
 	send_to_char( "Your message didn't get through.\n\r", ch );
 	return;
@@ -738,7 +743,8 @@ void do_reply( CHAR_DATA *ch, char *argu
     int        position;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
@@ -752,7 +758,8 @@ void do_reply( CHAR_DATA *ch, char *argu
 
     if ( ( !IS_NPC( ch ) && (   IS_SET( ch->act, PLR_SILENCE )
  			     || IS_SET( ch->act, PLR_NO_TELL ) ) )
-	|| IS_SET( victim->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
 	send_to_char( "Your message didn't get through.\n\r", ch );
 	return;
@@ -1615,7 +1622,8 @@ void do_gtell( CHAR_DATA *ch, char *argu
     }
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
@@ -1635,6 +1643,7 @@ void do_gtell( CHAR_DATA *ch, char *argu
     {
 	if ( is_same_group( gch, ch )
 	    && !IS_SET( gch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+            && !IS_SET( gch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE )
 	    && !IS_AFFECTED( gch, AFF_MUTE ) )
 	    send_to_char( buf, gch );
     }
diff -u -p stock/act_info.c src/act_info.c
--- stock/act_info.c	Tue Dec 26 23:17:54 1995
+++ src/act_info.c	Wed May 28 15:32:39 1997
@@ -490,7 +490,8 @@ void do_look( CHAR_DATA *ch, char *argum
 	    || ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_BRIEF ) ) )
 	    send_to_char( ch->in_room->description, ch );
 
-        if ( IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        if ( IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) 
+             || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
             send_to_char( "It seems eerily quiet.\n\r", ch );
 
 	show_list_to_char( ch->in_room->contents, ch, FALSE, FALSE );
diff -u -p stock/act_move.c src/act_move.c
--- stock/act_move.c	Tue Dec 26 23:17:54 1995
+++ src/act_move.c	Wed May 28 15:33:02 1997
@@ -1666,7 +1666,8 @@ void do_bet( CHAR_DATA *ch, char *argume
     CHAR_DATA *croupier;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
diff -u -p stock/act_obj.c src/act_obj.c
--- stock/act_obj.c	Tue Dec 26 23:17:54 1995
+++ src/act_obj.c	Wed May 28 15:33:24 1997
@@ -1507,7 +1507,8 @@ void do_recite( CHAR_DATA *ch, char *arg
     }
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
         send_to_char( "You can't seem to break the silence.\n\r", ch );
         return;
diff -u -p stock/act_wiz.c src/act_wiz.c
--- stock/act_wiz.c	Tue Dec 26 23:17:54 1995
+++ src/act_wiz.c	Wed May 28 15:11:21 1997
@@ -896,6 +896,12 @@ void do_mstat( CHAR_DATA *ch, char *argu
 	    affect_bit_name( victim->affected_by ) );
     strcat( buf1, buf );
 
+    if ( !IS_NPC( victim ) )    /* OLC */
+    {
+        sprintf( buf, "Security: %d.\n\r", victim->pcdata->security );
+        strcat( buf1, buf );
+    }
+
     sprintf( buf, "Short description: %s.\n\rLong  description: %s",
 	    victim->short_descr,
 	    victim->long_descr[0] != '\0' ? victim->long_descr
@@ -2341,7 +2347,7 @@ void do_mset( CHAR_DATA *ch, char *argum
 	send_to_char( "Field being one of:\n\r",			ch );
 	send_to_char( "  str int wis dex con class sex race level\n\r",	ch );
 	send_to_char( "  gold hp mana move practice align\n\r",		ch );
-	send_to_char( "  thirst drunk full",				ch );
+	send_to_char( "  thirst drunk full security",			ch );
 	send_to_char( "\n\r",						ch );
 	send_to_char( "String being one of:\n\r",			ch );
 	send_to_char( "  name short long title spec\n\r",               ch );
@@ -2787,6 +2793,32 @@ void do_mset( CHAR_DATA *ch, char *argum
 	}
 
 	return;
+    }
+
+    if ( !str_cmp( arg2, "security" ) ) /* OLC */
+    {
+        if ( IS_NPC( victim ) )
+        {
+            send_to_char( "Not on NPC's.\n\r", ch );
+            return;
+        }
+
+        if ( value > ch->pcdata->security || value < 0 )
+        {
+            if ( ch->pcdata->security != 0 )
+            {
+                sprintf( buf, "Valid security is 0-%d.\n\r",
+                    ch->pcdata->security );
+                send_to_char( buf, ch );
+            }
+            else
+            {
+                send_to_char( "Valid security is 0 only.\n\r", ch );
+            }
+            return;
+        }
+        victim->pcdata->security = value;
+        return;
     }
 
     /*
Only in src: bit.c
diff -u -p stock/comm.c src/comm.c
--- stock/comm.c	Sat Apr 12 20:37:04 1997
+++ src/comm.c	Wed May 28 15:10:56 1997
@@ -512,6 +512,9 @@ void game_loop_mac_msdos( void )
     dcon.outbuf		= alloc_mem( dcon.outsize );
     dcon.showstr_head   = str_dup( "" );
     dcon.showstr_point  = 0;
+    dcon.pEdit          = NULL;                 /* OLC */
+    dcon.pString        = NULL;                 /* OLC */
+    dcon.editor         = 0;                    /* OLC */
     dcon.next		= descriptor_list;
     descriptor_list	= &dcon;
 
@@ -567,16 +570,23 @@ void game_loop_mac_msdos( void )
 		d->fcommand	= TRUE;
 		stop_idling( d->character );
 
-		if ( d->connected == CON_PLAYING )
-		    if ( d->showstr_point )
-		        show_string( d, d->incomm );
-		    else
-		        interpret( d->character, d->incomm );
-		else
-		    nanny( d, d->incomm );
+                /* OLC */
+                if ( d->connected == CON_PLAYING )
+                {
+                    if ( d->showstr_point )
+                       show_string( d, d->incomm );
+                    else
+                    if ( d->pString )
+                        string_add( d->character, d->incomm );
+                    else
+                    if ( !run_olc_editor( d ) )
+                        interpret( d->character, d->incomm );
+                }
+                else
+                    nanny( d, d->incomm );
 
-		d->incomm[0]	= '\0';
-	    }
+                d->incomm[0]    = '\0';
+            }
 	}
 
 
@@ -756,15 +766,22 @@ void game_loop_unix( int control )
 		d->fcommand	= TRUE;
 		stop_idling( d->character );
 
-		if ( d->connected == CON_PLAYING )
-		    if ( d->showstr_point )
-		        show_string( d, d->incomm );
-		    else
-		        interpret( d->character, d->incomm );
-		else
-		    nanny( d, d->incomm );
+                /* OLC */
+                if ( d->connected == CON_PLAYING )
+                {
+                    if ( d->showstr_point )
+                       show_string( d, d->incomm );
+                    else
+                    if ( d->pString )
+                        string_add( d->character, d->incomm );
+                    else
+                    if ( !run_olc_editor( d ) )
+                        interpret( d->character, d->incomm );
+                }
+                else
+                    nanny( d, d->incomm );
 
-		d->incomm[0]	= '\0';
+                d->incomm[0]    = '\0';
 	    }
 	}
 
@@ -904,6 +921,9 @@ void new_descriptor( int control )
     dnew->connected	= CON_GET_NAME;
     dnew->showstr_head  = str_dup( "" );
     dnew->showstr_point = 0;
+    dnew->pEdit         = NULL;                 /* OLC */
+    dnew->pString       = NULL;                 /* OLC */
+    dnew->editor        = 0;                    /* OLC */
     dnew->outsize	= 2000;
     dnew->outbuf	= alloc_mem( dnew->outsize );
 
@@ -1239,7 +1259,9 @@ bool process_output( DESCRIPTOR_DATA *d,
 	    write_to_buffer( d,
   "[Please type (c)ontinue, (r)efresh, (b)ack, (q)uit, or RETURN]:  ", 0 );
 	}
-	else
+        if ( d->pString != NULL ) /* OLC */
+            write_to_buffer( d, "> ", 2 );
+        else
 	{
 	    CHAR_DATA *ch;
 
@@ -1321,6 +1343,12 @@ void bust_a_prompt( DESCRIPTOR_DATA *d )
       {
          default :
             i = " "; break;
+         case 'c' :             /* OLC */
+            i = olc_ed_name( d->character );
+            break;
+         case 'C' :             /* OLC */
+            i = olc_ed_vnum( d->character );
+            break;
          case 'h' :
             sprintf( buf2, "%d", ch->hit                               );
             i = buf2; break;
@@ -1959,7 +1987,7 @@ bool check_parse_name( char *name )
     /*
      * Reserved words.
      */
-    if ( is_name( name, "all auto imm immortal self someone" ) )
+    if ( is_name( name, "all auto imm immortal self someone none" ) )
 	return FALSE;
 
     /*
Only in src: core
diff -u -p stock/db.c src/db.c
--- stock/db.c	Tue Dec 26 23:17:55 1995
+++ src/db.c	Sun May 11 19:14:48 1997
@@ -151,6 +151,10 @@ int			top_obj_index;
 int			top_reset;
 int			top_room;
 int			top_shop;
+int                     top_vnum_room;  /* OLC */
+int                     top_vnum_mob;   /* OLC */
+int                     top_vnum_obj;   /* OLC */
+
 
 /*
  * Memory management.
@@ -216,6 +220,12 @@ void	fix_exits       args( ( void ) );
 
 void	reset_area      args( ( AREA_DATA * pArea ) );
 
+/*
+ * Non-Envy Loading procedures.
+ * Put any new loading function in this section.
+ */
+void    new_load_area   args( ( FILE *fp ) );   /* OLC */
+void    new_load_rooms  args( ( FILE *fp ) );   /* OLC 1.1b */
 
 
 /*
@@ -354,6 +364,10 @@ void boot_db( void )
 		    load_shops   ( fpArea );
 		else if ( !str_cmp( word, "SPECIALS" ) )
 		    load_specials( fpArea );
+                else if ( !str_cmp( word, "AREADATA" ) )        /* OLC */
+                    new_load_area( fpArea );
+                else if ( !str_cmp( word, "ROOMDATA" ) )        /* OLC 1.1b */
+                    new_load_rooms( fpArea );
 		else
 		{
 		    bug( "Boot_db: bad section name.", 0 );
@@ -395,26 +409,151 @@ void load_area( FILE *fp )
 {
     AREA_DATA *pArea;
 
-    pArea		= alloc_perm( sizeof( *pArea ) );
-    pArea->reset_first	= NULL;
-    pArea->reset_last	= NULL;
-    pArea->name		= fread_string( fp );
+    pArea               = alloc_perm( sizeof( *pArea ) );       /*
+    pArea->reset_first  = NULL;                                  * OLC-Removed
+    pArea->reset_last   = NULL;                                  */
+    pArea->name         = fread_string( fp );
     pArea->recall       = ROOM_VNUM_TEMPLE;
-    pArea->age		= 15;
-    pArea->nplayer	= 0;
+    pArea->area_flags   = AREA_LOADING;         /* OLC */
+    pArea->security     = 1;                    /* OLC */
+    pArea->builders     = str_dup( "None" );    /* OLC */
+    pArea->lvnum        = 0;                    /* OLC */
+    pArea->uvnum        = 0;                    /* OLC */
+    pArea->vnum         = top_area;             /* OLC */
+    pArea->filename     = str_dup( strArea );   /* OLC */
+    pArea->age          = 15;
+    pArea->nplayer      = 0;
 
     if ( !area_first )
-	area_first = pArea;
+        area_first = pArea;
     if (  area_last  )
-	area_last->next = pArea;
-    area_last	= pArea;
-    pArea->next	= NULL;
+    {
+        area_last->next = pArea;
+        REMOVE_BIT(area_last->area_flags, AREA_LOADING);        /* OLC */
+    }
+    area_last   = pArea;
+    pArea->next = NULL;
 
     top_area++;
     return;
 }
 
 
+/*
+ * OLC
+ * Use these macros to load any new area formats that you choose to
+ * support on your MUD.  See the new_load_area format below for
+ * a short example.
+ */
+#if defined(KEY)
+#undef KEY
+#endif
+
+#define KEY( literal, field, value )                \
+                if ( !str_cmp( word, literal ) )    \
+                {                                   \
+                    field  = value;                 \
+                    fMatch = TRUE;                  \
+                    break;                          \
+                }
+
+#define SKEY( string, field )                       \
+                if ( !str_cmp( word, string ) )     \
+                {                                   \
+                    free_string( field );           \
+                    field = fread_string( fp );     \
+                    fMatch = TRUE;                  \
+                    break;                          \
+                }
+
+/* OLC
+ * Snarf an 'area' header line.   Check this format.  MUCH better.  Add fields
+ * too.
+ *
+ * #AREAFILE
+ * Name   { All } Locke    Newbie School~
+ * Repop  A teacher pops in the room and says, 'Repop coming!'~
+ * Recall 3001
+ * End
+ */
+void new_load_area( FILE *fp )
+{
+    AREA_DATA *pArea;
+    char      *word;
+    bool      fMatch;
+
+    pArea               = alloc_perm( sizeof(*pArea) );
+    pArea->age          = 15;
+    pArea->nplayer      = 0;
+    pArea->filename     = str_dup( strArea );
+    pArea->vnum         = top_area;
+    pArea->name         = str_dup( "New Area" );
+    pArea->builders     = str_dup( "" );
+    pArea->security     = 1;
+    pArea->lvnum        = 0;
+    pArea->area_flags   = 0;
+    pArea->recall       = ROOM_VNUM_TEMPLE;
+
+    for ( ; ; )
+    {
+       word   = feof( fp ) ? "End" : fread_word( fp );
+       fMatch = FALSE;
+
+       switch ( UPPER(word[0]) )
+       {
+           case 'N':
+            SKEY( "Name", pArea->name );
+            break;
+           case 'S':
+             KEY( "Security", pArea->security, fread_number( fp ) );
+            break;
+           case 'V':
+            if ( !str_cmp( word, "VNUMs" ) )
+            {
+                pArea->lvnum = fread_number( fp );
+                pArea->uvnum = fread_number( fp );
+            }
+            break;
+           case 'E':
+             if ( !str_cmp( word, "End" ) )
+             {
+                 fMatch = TRUE;
+                 if ( area_first == NULL )
+                    area_first = pArea;
+                 if ( area_last  != NULL )
+                    area_last->next = pArea;
+                 area_last   = pArea;
+                 pArea->next = NULL;
+                 top_area++;
+                 return;
+            }
+            break;
+           case 'B':
+            SKEY( "Builders", pArea->builders );
+            break;
+           case 'R':
+             KEY( "Recall", pArea->recall, fread_number( fp ) );
+            break;
+        }
+    }
+}
+
+
+/*
+ * Sets vnum range for area using OLC protection features.
+ */
+void assign_area_vnum( int vnum )
+{
+    if ( area_last->lvnum == 0 || area_last->uvnum == 0 )
+        area_last->lvnum = area_last->uvnum = vnum;
+    if ( vnum != URANGE( area_last->lvnum, vnum, area_last->uvnum ) )
+        if ( vnum < area_last->lvnum )
+            area_last->lvnum = vnum;
+        else
+            area_last->uvnum = vnum;
+    return;
+}
+
 
 /*
  * Snarf a help section.
@@ -485,6 +624,12 @@ void load_mobiles( FILE *fp )
 {
     MOB_INDEX_DATA *pMobIndex;
 
+    if ( !area_last )   /* OLC */
+    {
+        bug( "Load_mobiles: no #AREA seen yet.", 0 );
+        exit( 1 );
+    }
+
     for ( ; ; )
     {
 	char *race;
@@ -513,6 +658,7 @@ void load_mobiles( FILE *fp )
 
 	pMobIndex			= alloc_perm( sizeof( *pMobIndex ) );
 	pMobIndex->vnum			= vnum;
+        pMobIndex->area                 = area_last;            /* OLC */
 	pMobIndex->player_name		= fread_string( fp );
 	pMobIndex->short_descr		= fread_string( fp );
 	pMobIndex->long_descr		= fread_string( fp );
@@ -526,7 +672,9 @@ void load_mobiles( FILE *fp )
 	pMobIndex->pShop		= NULL;
 	pMobIndex->alignment		= fread_number( fp );
 	letter				= fread_letter( fp );
-	pMobIndex->level		= number_fuzzy( fread_number( fp ) );
+	pMobIndex->level		= fread_number( fp );
+        /* Took number_fuzzy out of above line to store mob levels
+           at a constant due to OLC resaving areas  --Stoked */
 
 	/*
 	 * The unused stuff is for imps who want to use the old-style
@@ -567,6 +715,8 @@ void load_mobiles( FILE *fp )
 	pMobIndex->next		= mob_index_hash[iHash];
 	mob_index_hash[iHash]	= pMobIndex;
 	top_mob_index++;
+        top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob;  /* OLC */
+        assign_area_vnum( vnum );                                  /* OLC */
 	kill_table[URANGE( 0, pMobIndex->level, MAX_LEVEL-1 )].number++;
     }
 
@@ -582,6 +732,12 @@ void load_objects( FILE *fp )
 {
     OBJ_INDEX_DATA *pObjIndex;
 
+    if ( !area_last )   /* OLC */
+    {
+        bug( "Load_objects: no #AREA seen yet.", 0 );
+        exit( 1 );
+    }
+
     for ( ; ; )
     {
         char *value [ 4 ];
@@ -610,6 +766,7 @@ void load_objects( FILE *fp )
 
 	pObjIndex			= alloc_perm( sizeof( *pObjIndex ) );
 	pObjIndex->vnum			= vnum;
+        pObjIndex->area                 = area_last;            /* OLC */
 	pObjIndex->name			= fread_string( fp );
 	pObjIndex->short_descr		= fread_string( fp );
 	pObjIndex->description		= fread_string( fp );
@@ -715,12 +872,43 @@ void load_objects( FILE *fp )
 	pObjIndex->next		= obj_index_hash[iHash];
 	obj_index_hash[iHash]	= pObjIndex;
 	top_obj_index++;
+        top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj;  /* OLC */
+        assign_area_vnum( vnum );                                  /* OLC */
     }
 
     return;
 }
 
 
+/*
+ * Adds a reset to a room.  OLC
+ * Similar to add_reset in olc.c
+ */
+void new_reset( ROOM_INDEX_DATA *pR, RESET_DATA *pReset )
+{
+    RESET_DATA *pr;
+
+    if ( !pR )
+       return;
+
+    pr = pR->reset_last;
+
+    if ( !pr )
+    {
+        pR->reset_first = pReset;
+        pR->reset_last  = pReset;
+    }
+    else
+    {
+        pR->reset_last->next = pReset;
+        pR->reset_last       = pReset;
+        pR->reset_last->next = NULL;
+    }
+
+    top_reset++;
+    return;
+}
+
 
 /*
  * Snarf a reset section.
@@ -728,6 +916,8 @@ void load_objects( FILE *fp )
 void load_resets( FILE *fp )
 {
     RESET_DATA *pReset;
+    int         iLastRoom = 0;
+    int         iLastObj  = 0;
 
     if ( !area_last )
     {
@@ -770,66 +960,80 @@ void load_resets( FILE *fp )
 	    exit( 1 );
 	    break;
 
-	case 'M':
-	    get_mob_index  ( pReset->arg1 );
-	    get_room_index ( pReset->arg3 );
-	    break;
-
-	case 'O':
-	    get_obj_index  ( pReset->arg1 );
-	    get_room_index ( pReset->arg3 );
-	    break;
-
-	case 'P':
-	    get_obj_index  ( pReset->arg1 );
-	    get_obj_index  ( pReset->arg3 );
-	    break;
-
-	case 'G':
-	case 'E':
-	    get_obj_index  ( pReset->arg1 );
-	    break;
-
-	case 'D':
-	    pRoomIndex = get_room_index( pReset->arg1 );
-
-	    if (   pReset->arg2 < 0
-		|| pReset->arg2 > 5
-		|| !( pexit = pRoomIndex->exit[pReset->arg2] )
-		|| !IS_SET( pexit->exit_info, EX_ISDOOR ) )
-	    {
-		bug( "Load_resets: 'D': exit %d not door.", pReset->arg2 );
-		exit( 1 );
-	    }
-
-	    if ( pReset->arg3 < 0 || pReset->arg3 > 2 )
-	    {
-		bug( "Load_resets: 'D': bad 'locks': %d.", pReset->arg3 );
-		exit( 1 );
-	    }
+        case 'M':
+            get_mob_index  ( pReset->arg1 );
+            if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) )
+            {
+                new_reset( pRoomIndex, pReset );
+                iLastRoom = pReset->arg3;
+            }
+            break;
+
+        case 'O':
+            get_obj_index  ( pReset->arg1 );
+            if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) )
+            {
+                new_reset( pRoomIndex, pReset );
+                iLastObj = pReset->arg3;
+            }
+            break;
+
+        case 'P':
+            get_obj_index  ( pReset->arg1 );
+            if ( ( pRoomIndex = get_room_index ( iLastObj ) ) )
+            {
+                new_reset( pRoomIndex, pReset );
+            }
+            break;
+
+        case 'G':
+        case 'E':
+            get_obj_index  ( pReset->arg1 );
+            if ( ( pRoomIndex = get_room_index ( iLastRoom ) ) )
+            {
+                new_reset( pRoomIndex, pReset );
+                iLastObj = iLastRoom;
+            }
+            break;
+
+        case 'D':
+            pRoomIndex = get_room_index( pReset->arg1 );
+
+            if (   pReset->arg2 < 0
+                || pReset->arg2 > 5
+                || !pRoomIndex
+                || !( pexit = pRoomIndex->exit[pReset->arg2] )
+                || !IS_SET( pexit->rs_flags, EX_ISDOOR ) )
+            {
+                bug( "Load_resets: 'D': exit %d not door.", pReset->arg2 );
+                exit( 1 );
+            }
+
+            switch ( pReset->arg3 )     /* OLC 1.1b */
+            {
+                default:
+                    bug( "Load_resets: 'D': bad 'locks': %d." , pReset->arg3);
+                case 0:
+                    break;
+                case 1: SET_BIT( pexit->rs_flags, EX_CLOSED );
+                    break;
+                case 2: SET_BIT( pexit->rs_flags, EX_CLOSED | EX_LOCKED );
+                    break;
+            }
+            break;
 
-	    break;
+        case 'R':
+            if ( pReset->arg2 < 0 || pReset->arg2 > 6 ) /* Last Door. */
+            {
+                bug( "Load_resets: 'R': bad exit %d.", pReset->arg2 );
+                exit( 1 );
+            }
 
-	case 'R':
-	    pRoomIndex		= get_room_index( pReset->arg1 );
+            if ( ( pRoomIndex = get_room_index( pReset->arg1 ) ) )
+                new_reset( pRoomIndex, pReset );
 
-	    if ( pReset->arg2 < 0 || pReset->arg2 > 6 )
-	    {
-		bug( "Load_resets: 'R': bad exit %d.", pReset->arg2 );
-		exit( 1 );
-	    }
-
-	    break;
+            break;
 	}
-
-	if ( !area_last->reset_first )
-	    area_last->reset_first      = pReset;
-	if (  area_last->reset_last  )
-	    area_last->reset_last->next = pReset;
-	    
-	area_last->reset_last	= pReset;
-	pReset->next		= NULL;
-	top_reset++;
     }
 
     return;
@@ -918,25 +1122,26 @@ void load_rooms( FILE *fp )
 		pexit->description	= fread_string( fp );
 		pexit->keyword		= fread_string( fp );
 		pexit->exit_info	= 0;
+		pexit->rs_flags		= 0;
 		locks			= fread_number( fp );
 		pexit->key		= fread_number( fp );
 		pexit->vnum		= fread_number( fp );
 
-		switch ( locks )
-		{
-		case 1: pexit->exit_info = EX_ISDOOR;                    break;
-		case 2: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF;     break;
-		case 3: pexit->exit_info = EX_ISDOOR | EX_BASHPROOF;     break;
-		case 4: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF
-		                         | EX_BASHPROOF;                 break;
-		case 5: pexit->exit_info = EX_ISDOOR | EX_PASSPROOF;     break;
-		case 6: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF
-		                         | EX_PASSPROOF;                 break;
-		case 7: pexit->exit_info = EX_ISDOOR | EX_BASHPROOF
-		                         | EX_PASSPROOF;                 break;
-		case 8: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF
-		                         | EX_BASHPROOF | EX_PASSPROOF;  break;
-		}
+                switch ( locks )        /* OLC exit_info to rs_flags. */
+                {
+                case 1: pexit->rs_flags  = EX_ISDOOR;                    break;
+                case 2: pexit->rs_flags  = EX_ISDOOR | EX_PICKPROOF;     break;
+                case 3: pexit->rs_flags  = EX_ISDOOR | EX_BASHPROOF;     break;
+                case 4: pexit->rs_flags  = EX_ISDOOR | EX_PICKPROOF
+                                         | EX_BASHPROOF;                 break;
+                case 5: pexit->rs_flags  = EX_ISDOOR | EX_PASSPROOF;     break;
+                case 6: pexit->rs_flags  = EX_ISDOOR | EX_PICKPROOF
+                                         | EX_PASSPROOF;                 break;
+                case 7: pexit->rs_flags  = EX_ISDOOR | EX_BASHPROOF
+                                         | EX_PASSPROOF;                 break;
+                case 8: pexit->rs_flags  = EX_ISDOOR | EX_PICKPROOF
+                                         | EX_BASHPROOF | EX_PASSPROOF;  break;
+                }
 
 		pRoomIndex->exit[door]   = pexit;
 		top_exit++;
@@ -963,12 +1168,131 @@ void load_rooms( FILE *fp )
 	pRoomIndex->next	= room_index_hash[iHash];
 	room_index_hash[iHash]	= pRoomIndex;
 	top_room++;
+        top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room; /* OLC */
+        assign_area_vnum( vnum );                                    /* OLC */
     }
 
     return;
 }
 
 
+/* OLC 1.1b */
+void new_load_rooms( FILE *fp )
+{
+    ROOM_INDEX_DATA *pRoomIndex;
+
+    if ( !area_last )
+    {
+        bug( "Load_rooms: no #AREA seen yet.", 0 );
+        exit( 1 );
+    }
+
+    for ( ; ; )
+    {
+        char letter;
+        int  vnum;
+        int  door;
+        int  iHash;
+
+        letter                          = fread_letter( fp );
+        if ( letter != '#' )
+        {
+            bug( "Load_rooms: # not found.", 0 );
+            exit( 1 );
+        }
+
+        vnum                            = fread_number( fp );
+        if ( vnum == 0 )
+            break;
+
+        fBootDb = FALSE;
+        if ( get_room_index( vnum ) )
+        {
+            bug( "Load_rooms: vnum %d duplicated.", vnum );
+            exit( 1 );
+        }
+        fBootDb = TRUE;
+
+        pRoomIndex                      = alloc_perm( sizeof( *pRoomIndex ) );
+        pRoomIndex->people              = NULL;
+        pRoomIndex->contents            = NULL;
+        pRoomIndex->extra_descr         = NULL;
+        pRoomIndex->area                = area_last;
+        pRoomIndex->vnum                = vnum;
+        pRoomIndex->name                = fread_string( fp );
+        pRoomIndex->description         = fread_string( fp );
+        /* Area number */                 fread_number( fp );   /* Unused */
+        pRoomIndex->room_flags          = fread_number( fp );
+        pRoomIndex->sector_type         = fread_number( fp );
+        pRoomIndex->light               = 0;
+        for ( door = 0; door <= 5; door++ )
+            pRoomIndex->exit[door] = NULL;
+
+        for ( ; ; )
+        {
+            letter = fread_letter( fp );
+
+            if ( letter == 'S' || letter == 's' )
+            {
+                if ( letter == 's' )
+                    bug( "Load_rooms: vnum %d has lowercase 's'", vnum );
+                break;
+            }
+
+            if ( letter == 'D' )
+            {
+                EXIT_DATA *pexit;
+                int        locks;
+
+                door = fread_number( fp );
+                if ( door < 0 || door > 5 )
+                {
+                    bug( "Fread_rooms: vnum %d has bad door number.", vnum );
+                    exit( 1 );
+                }
+
+                pexit                   = alloc_perm( sizeof( *pexit ) );
+                pexit->description      = fread_string( fp );
+                pexit->keyword          = fread_string( fp );
+                locks                   = fread_number( fp );
+                pexit->exit_info        = locks;
+                pexit->rs_flags         = locks;
+                pexit->key              = fread_number( fp );
+                pexit->vnum             = fread_number( fp );
+
+
+                pRoomIndex->exit[door]          = pexit;
+                top_exit++;
+            }
+            else if ( letter == 'E' )
+            {
+                EXTRA_DESCR_DATA *ed;
+
+                ed                      = alloc_perm( sizeof( *ed ) );
+                ed->keyword             = fread_string( fp );
+                ed->description         = fread_string( fp );
+                ed->next                = pRoomIndex->extra_descr;
+                pRoomIndex->extra_descr = ed;
+                top_ed++;
+            }
+            else
+            {
+                bug( "Load_rooms: vnum %d has flag not 'DES'.", vnum );
+                exit( 1 );
+            }
+        }
+
+        iHash                   = vnum % MAX_KEY_HASH;
+        pRoomIndex->next        = room_index_hash[iHash];
+        room_index_hash[iHash]  = pRoomIndex;
+        top_room++;
+        top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room;
+        assign_area_vnum( vnum );
+    }
+
+    return;
+}
+
 
 /*
  * Snarf a shop section.
@@ -1303,6 +1627,254 @@ void fix_exits( void )
 }
 
 
+/* OLC
+ * Reset one room.  Called by reset_area and olc.
+ */
+void reset_room( ROOM_INDEX_DATA *pRoom )
+{
+    RESET_DATA  *pReset;
+    CHAR_DATA   *pMob;
+    CHAR_DATA   *LastMob = NULL;
+    int iExit;
+    int level = 0;
+    bool last;
+
+    if ( !pRoom )
+        return;
+
+    pMob        = NULL;
+    last        = TRUE;
+    
+    for ( iExit = 0;  iExit < MAX_DIR;  iExit++ )
+    {
+        EXIT_DATA *pExit;
+        if ( ( pExit = pRoom->exit[iExit] )
+          && !IS_SET( pExit->exit_info, EX_BASHED ) )   /* Skip Bashed. */
+        {
+            pExit->exit_info = pExit->rs_flags;
+            if ( ( pExit->to_room != NULL )
+              && ( ( pExit = pExit->to_room->exit[rev_dir[iExit]] ) ) )
+            {
+                /* nail the other side */
+                pExit->exit_info = pExit->rs_flags;
+            }
+        }
+    }
+
+    for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next )
+    {
+        OBJ_DATA        *pObj;
+        OBJ_DATA        *LastObj;
+        MOB_INDEX_DATA  *pMobIndex;
+        OBJ_INDEX_DATA  *pObjIndex;
+        OBJ_INDEX_DATA  *pObjToIndex;
+        ROOM_INDEX_DATA *pRoomIndex;
+
+        switch ( pReset->command )
+        {
+        default:
+                bug( "Reset_room: bad command %c.", pReset->command );
+                break;
+        case 'M':
+            if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) )
+            {
+                bug( "Reset_room: 'M': bad vnum %d.", pReset->arg1 );
+                continue;
+            }
+
+            if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
+            {
+                bug( "Reset_area: 'R': bad vnum %d.", pReset->arg3 );
+                continue;
+            }
+
+            if ( ( pMobIndex->spec_fun == spec_lookup( "spec_cast_ghost" )
+                  && ( weather_info.sunlight != SUN_DARK ) ) )
+            {
+                last = FALSE;
+                continue;
+            }
+
+            level = URANGE( 0, pMobIndex->level - 2, LEVEL_HERO );
+
+            /* If sentinel, then maximum number indicates in room instead
+               of in world. -Kahn */
+            /* Midgaard mayor is special case as it has a spec proc which
+               moves it.  Dislike such specific coding.  Shrug.  -Kahn */
+            if ( IS_SET( pMobIndex->act, ACT_SENTINEL )
+                && pMobIndex->vnum != MOB_VNUM_MIDGAARD_MAYOR )
+            {
+                CHAR_DATA *ch;
+                int        count = 0;
+
+                for ( ch = pRoomIndex->people; ch; ch = ch->next_in_room )
+                    if ( IS_NPC( ch ) && ch->pIndexData == pMobIndex )
+                        count++;
+                if ( count >= pReset->arg2 )
+                {
+                    last = FALSE;
+                    break;
+                }
+            }
+            else
+                if ( pMobIndex->count >= pReset->arg2 )
+
+                {
+                    last = FALSE;
+                    break;
+                }
+            pMob = create_mobile( pMobIndex );
+
+            /*
+             * Check for pet shop.
+             */
+            {
+                ROOM_INDEX_DATA *pRoomIndexPrev;
+
+                pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 );
+                if ( pRoomIndexPrev
+                    && IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) )
+                    SET_BIT( pMob->act, ACT_PET);
+            }
+
+            if ( room_is_dark( pRoomIndex ) )
+                SET_BIT( pMob->affected_by, AFF_INFRARED );
+
+            LastMob = pMob;
+            char_to_room( pMob, pRoomIndex );
+            level = URANGE( 0, pMob->level - 2, LEVEL_HERO );
+            last  = TRUE;
+            break;
+
+        case 'O':
+            if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+            {
+                bug( "Reset_room: 'O': bad vnum %d.", pReset->arg1 );
+                continue;
+            }
+
+            if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
+            {
+                bug( "Reset_room: 'O': bad vnum %d.", pReset->arg3 );
+                continue;
+            }
+
+            if ( pRoom->area->nplayer > 0
+              || count_obj_list( pObjIndex, pRoomIndex->contents ) > 0 )
+            {
+                last = FALSE;
+                break;
+            }
+
+            pObj = create_object( pObjIndex, number_fuzzy( level ) ); 
+            pObj->cost = 0;
+            obj_to_room( pObj, pRoom );
+            last = TRUE;
+            break;
+
+        case 'P':
+            if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+            {
+                bug( "Reset_room: 'P': bad vnum %d.", pReset->arg1 );
+                continue;
+            }
+
+            if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) )
+            {
+                bug( "Reset_room: 'P': bad vnum %d.", pReset->arg3 );
+                continue;
+            }
+
+            if ( pRoom->area->nplayer > 0
+              || !( LastObj = get_obj_type( pObjToIndex ) )
+              || count_obj_list( pObjIndex, LastObj->contains ) > 0 )
+            {
+                last = FALSE;
+                break;
+            }
+
+            pObj = create_object( pObjIndex, number_fuzzy( LastObj->level ) );
+            obj_to_obj( pObj, LastObj );
+            last = TRUE;
+
+            /*
+             * Ensure that the container gets reset.    OLC 1.1b
+             */
+            if ( LastObj->item_type == ITEM_CONTAINER )
+            {
+                LastObj->value[1] = LastObj->pIndexData->value[1];
+            }
+            else
+            {
+                    /* THIS SPACE INTENTIONALLY LEFT BLANK */
+            }
+            break;
+
+        case 'G':
+        case 'E':
+            if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+            {
+                bug( "Reset_room: 'E' or 'G': bad vnum %d.", pReset->arg1 );
+                continue;
+            }
+
+            if ( !last )
+                break;
+
+            if ( !LastMob )
+            {
+                bug( "Reset_room: 'E' or 'G': null mob for vnum %d.",
+                    pReset->arg1 );
+                last = FALSE;
+                break;
+            }
+
+            if ( LastMob->pIndexData->pShop )   /* Shop-keeper? */
+            {
+                int olevel;
+
+                switch ( pObjIndex->item_type )
+                {
+                default:                olevel = 0;                      break;
+                case ITEM_PILL:         olevel = number_range(  0, 10 ); break;
+                case ITEM_POTION:       olevel = number_range(  0, 10 ); break;
+                case ITEM_SCROLL:       olevel = number_range(  5, 15 ); break;
+                case ITEM_WAND:         olevel = number_range( 10, 20 ); break;
+                case ITEM_STAFF:        olevel = number_range( 15, 25 ); break;
+                case ITEM_ARMOR:        olevel = number_range(  5, 15 ); break;
+                case ITEM_WEAPON:       if ( pReset->command == 'G' )
+                                            olevel = number_range( 5, 15 );
+                                        else
+                                            olevel = number_fuzzy( level );
+                  break;
+                }
+
+                pObj = create_object( pObjIndex, olevel );
+                if ( pReset->command == 'G' )
+                    SET_BIT( pObj->extra_flags, ITEM_INVENTORY );
+            }
+            else
+            {
+                pObj = create_object( pObjIndex, number_fuzzy( level ) );
+            }
+            obj_to_char( pObj, LastMob );
+            if ( pReset->command == 'E' )
+                equip_char( LastMob, pObj, pReset->arg3 );
+            last = TRUE;
+            break;
+
+        case 'D':
+            break;
+
+        case 'R':
+            break;
+        }
+    }
+
+    return;
+}
+
+
 
 /*
  * Repopulate areas periodically.
@@ -1357,265 +1929,18 @@ void area_update( void )
 
 
 
-/*
+/* OLC
  * Reset one area.
  */
 void reset_area( AREA_DATA *pArea )
 {
-    CHAR_DATA  *mob;
-    RESET_DATA *pReset;
-    int         level;
-    bool        last;
+    ROOM_INDEX_DATA *pRoom;
+    int  vnum;
 
-    mob 	= NULL;
-    last	= TRUE;
-    level	= 0;
-    for ( pReset = pArea->reset_first; pReset; pReset = pReset->next )
+    for ( vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++ )
     {
-	OBJ_DATA        *obj;
-	OBJ_DATA        *obj_to;
-	EXIT_DATA       *pexit;
-	MOB_INDEX_DATA  *pMobIndex;
-	OBJ_INDEX_DATA  *pObjIndex;
-	OBJ_INDEX_DATA  *pObjToIndex;
-	ROOM_INDEX_DATA *pRoomIndex;
-
-	switch ( pReset->command )
-	{
-	default:
-	    bug( "Reset_area: bad command %c.", pReset->command );
-	    break;
-
-	case 'M':
-	    if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'M': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
-	    {
-		bug( "Reset_area: 'R': bad vnum %d.", pReset->arg3 );
-		continue;
-	    }
-
-	    if ( ( pMobIndex->spec_fun == spec_lookup( "spec_cast_ghost" )
-		  && ( weather_info.sunlight != SUN_DARK ) ) )
-	    {
-		last = FALSE;
-		continue;
-	    }
-
-	    level = URANGE( 0, pMobIndex->level - 2, LEVEL_HERO );
-
-	    /* If sentinel, then maximum number indicates in room instead
-	       of in world. -Kahn */
-	    /* Midgaard mayor is special case as it has a spec proc which
-	       moves it.  Dislike such specific coding.  Shrug.  -Kahn */
-	    if ( IS_SET( pMobIndex->act, ACT_SENTINEL )
-		&& pMobIndex->vnum != MOB_VNUM_MIDGAARD_MAYOR )
-	    {
-		CHAR_DATA *ch;
-		int        count = 0;
-		
-		for ( ch = pRoomIndex->people; ch; ch = ch->next_in_room )
-		    if ( IS_NPC( ch ) && ch->pIndexData == pMobIndex )
-		        count++;
-		if ( count >= pReset->arg2 )
-		{
-		    last = FALSE;
-		    break;
-		}
-	    }
-	    else
-	        if ( pMobIndex->count >= pReset->arg2 )
-		{
-		    last = FALSE;
-		    break;
-		}
-
-	    mob = create_mobile( pMobIndex );
-
-	    /*
-	     * Check for pet shop.
-	     */
-	    {
-		ROOM_INDEX_DATA *pRoomIndexPrev;
-
-		pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 );
-		if ( pRoomIndexPrev
-		    && IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) )
-		    SET_BIT( mob->act, ACT_PET);
-	    }
-
-	    if ( room_is_dark( pRoomIndex ) )
-		SET_BIT( mob->affected_by, AFF_INFRARED );
-
-	    char_to_room( mob, pRoomIndex );
-	    level = URANGE( 0, mob->level - 2, LEVEL_HERO );
-	    last  = TRUE;
-	    break;
-
-	case 'O':
-	    if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'O': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
-	    {
-		bug( "Reset_area: 'R': bad vnum %d.", pReset->arg3 );
-		continue;
-	    }
-
-	    if ( pArea->nplayer > 0
-		|| count_obj_list( pObjIndex, pRoomIndex->contents ) > 0 )
-	    {
-		last = FALSE;
-		break;
-	    }
-
-	    obj       = create_object( pObjIndex, number_fuzzy( level ) );
-	    obj->cost = 0;
-	    obj_to_room( obj, pRoomIndex );
-	    last = TRUE;
-	    break;
-
-	case 'P':
-	    if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'P': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) )
-	    {
-		bug( "Reset_area: 'P': bad vnum %d.", pReset->arg3 );
-		continue;
-	    }
-
-	    if ( pArea->nplayer > 0
-		|| !( obj_to = get_obj_type( pObjToIndex ) )
-		|| count_obj_list( pObjIndex, obj_to->contains ) > 0 )
-	    {
-		last = FALSE;
-		break;
-	    }
-	    
-	    obj = create_object( pObjIndex, number_fuzzy( obj_to->level ) );
-	    obj_to_obj( obj, obj_to );
-	    last = TRUE;
-	    break;
-
-	case 'G':
-	case 'E':
-	    if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'E' or 'G': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    if ( !last )
-		break;
-
-	    if ( !mob )
-	    {
-		bug( "Reset_area: 'E' or 'G': null mob for vnum %d.",
-		    pReset->arg1 );
-		last = FALSE;
-		break;
-	    }
-
-	    if ( mob->pIndexData->pShop )
-	    {
-		int olevel;
-
-		switch ( pObjIndex->item_type )
-		{
-		default:                olevel = 0;                      break;
-		case ITEM_PILL:         olevel = number_range(  0, 10 ); break;
-		case ITEM_POTION:	olevel = number_range(  0, 10 ); break;
-		case ITEM_SCROLL:	olevel = number_range(  5, 15 ); break;
-		case ITEM_WAND:		olevel = number_range( 10, 20 ); break;
-		case ITEM_STAFF:	olevel = number_range( 15, 25 ); break;
-		case ITEM_ARMOR:	olevel = number_range(  5, 15 ); break;
-		case ITEM_FURNITURE:    olevel = number_range(  5, 15 ); break;
-		case ITEM_WEAPON:	if ( pReset->command == 'G' )
-		                            olevel = number_range( 5, 15 );
-		                        else
-					    olevel = number_fuzzy( level );
-		  break;
-		}
-
-		obj = create_object( pObjIndex, olevel );
-		if ( pReset->command == 'G' )
-		    SET_BIT( obj->extra_flags, ITEM_INVENTORY );
-	    }
-	    else
-	    {
-		obj = create_object( pObjIndex, number_fuzzy( level ) );
-	    }
-	    obj_to_char( obj, mob );
-	    if ( pReset->command == 'E' )
-		equip_char( mob, obj, pReset->arg3 );
-	    last = TRUE;
-	    break;
-
-	case 'D':
-	    if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'D': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    if ( !( pexit = pRoomIndex->exit[pReset->arg2] ) )
-		break;
-
-	    /* Bashed doors persist across resets */
-	    if ( !IS_SET( pexit->exit_info, EX_BASHED ) )
-	        switch ( pReset->arg3 )
-		{
-		case 0:
-		    REMOVE_BIT( pexit->exit_info, EX_CLOSED );
-		    REMOVE_BIT( pexit->exit_info, EX_LOCKED );
-		    break;
-
-		case 1:
-		    SET_BIT(    pexit->exit_info, EX_CLOSED );
-		    REMOVE_BIT( pexit->exit_info, EX_LOCKED );
-		    break;
-
-		case 2:
-		    SET_BIT(    pexit->exit_info, EX_CLOSED );
-		    SET_BIT(    pexit->exit_info, EX_LOCKED );
-		    break;
-		}
-
-	    last = TRUE;
-	    break;
-
-	case 'R':
-	    if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
-	    {
-		bug( "Reset_area: 'R': bad vnum %d.", pReset->arg1 );
-		continue;
-	    }
-
-	    {
-		int d0;
-		int d1;
-
-		for ( d0 = 0; d0 < pReset->arg2 - 1; d0++ )
-		{
-		    d1                   = number_range( d0, pReset->arg2-1 );
-		    pexit                = pRoomIndex->exit[d0];
-		    pRoomIndex->exit[d0] = pRoomIndex->exit[d1];
-		    pRoomIndex->exit[d1] = pexit;
-		}
-	    }
-	    break;
-	}
+        if ( ( pRoom = get_room_index(vnum) ) )
+            reset_room(pRoom);
     }
 
     return;
@@ -1649,10 +1974,10 @@ CHAR_DATA *create_mobile( MOB_INDEX_DATA
     clear_char( mob );
     mob->pIndexData     = pMobIndex;
 
-    mob->name		= pMobIndex->player_name;
-    mob->short_descr	= pMobIndex->short_descr;
-    mob->long_descr	= pMobIndex->long_descr;
-    mob->description	= pMobIndex->description;
+    mob->name		= str_dup( pMobIndex->player_name );
+    mob->short_descr	= str_dup( pMobIndex->short_descr );
+    mob->long_descr	= str_dup( pMobIndex->long_descr );
+    mob->description	= str_dup( pMobIndex->description );
     mob->spec_fun	= pMobIndex->spec_fun;
 
     mob->level		= number_fuzzy( pMobIndex->level );
@@ -1713,9 +2038,9 @@ OBJ_DATA *create_object( OBJ_INDEX_DATA 
     obj->level		= level;
     obj->wear_loc	= -1;
 
-    obj->name		= pObjIndex->name;
-    obj->short_descr	= pObjIndex->short_descr;
-    obj->description	= pObjIndex->description;
+    obj->name		= str_dup( pObjIndex->name );
+    obj->short_descr	= str_dup( pObjIndex->short_descr );
+    obj->description	= str_dup( pObjIndex->description );
     obj->item_type	= pObjIndex->item_type;
     obj->extra_flags	= pObjIndex->extra_flags;
     obj->wear_flags	= pObjIndex->wear_flags;
diff -u -p stock/handler.c src/handler.c
--- stock/handler.c	Tue Dec 26 23:17:55 1995
+++ src/handler.c	Wed May 28 16:09:33 1997
@@ -1829,6 +1829,18 @@ int race_lookup( const char *race )
 
 }
 
+int race_full_lookup( const char *race )
+{
+    int index;
+
+    for ( index = 0; index < MAX_RACE; index++ )
+        if ( !str_cmp( race, race_table[index].name ) )
+            return index;
+
+    return NO_FLAG;
+
+}
+
 int affect_lookup( const char *affectname )
 {
     int index;
diff -u -p stock/interp.c src/interp.c
--- stock/interp.c	Tue Dec 26 23:17:55 1995
+++ src/interp.c	Sun May 11 16:05:52 1997
@@ -304,6 +304,18 @@ const	struct	cmd_type	cmd_table	[ ] =
 
     { ":",		do_immtalk,	POS_DEAD,    L_HER,  LOG_NORMAL	},
 
+     /*
+     * OLC 1.1b
+     * Change L_HER to your minimum builder level
+     */
+    { "aedit",          do_aedit,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "redit",          do_redit,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "oedit",          do_oedit,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "medit",          do_medit,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "asave",          do_asave,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "alist",          do_alist,       POS_DEAD,    L_HER,  LOG_NORMAL },
+    { "resets",         do_resets,      POS_DEAD,    L_HER,  LOG_NORMAL },
+
     /*
      * End of list.
      */
diff -u -p stock/magic.c src/magic.c
--- stock/magic.c	Tue Dec 26 23:17:55 1995
+++ src/magic.c	Wed May 28 15:37:16 1997
@@ -210,7 +210,8 @@ void do_cast( CHAR_DATA *ch, char *argum
 	return;
     }
 
-    if ( IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+    if ( IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) 
+         || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
     {
 	send_to_char( "You can't...you are in a Cone of Silence!\n\r", ch );
 	return;
@@ -806,9 +807,9 @@ void spell_cone_of_silence( int sn, int 
 	return;
     }
 
-    if ( !IS_SET( pRoomIndex->room_flags, ROOM_CONE_OF_SILENCE ) )
+    if ( !IS_SET( pRoomIndex->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
     {
-	SET_BIT( pRoomIndex->room_flags, ROOM_CONE_OF_SILENCE );
+	SET_BIT( pRoomIndex->room_flags, ROOM_TEMP_CONE_OF_SILENCE );
 	send_to_char( "You have created a cone of silence!\n\r", ch );
 	act( "$n has created a cone of silence!", ch, NULL, NULL, TO_ROOM );
     }
@@ -2306,9 +2307,9 @@ void spell_remove_silence( int sn, int l
 	pRoomIndex   = ch->in_room;
 	DidSomething = FALSE;
 
-	if ( IS_SET( pRoomIndex->room_flags, ROOM_CONE_OF_SILENCE ) )
+	if ( IS_SET( pRoomIndex->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
         {
-	    REMOVE_BIT( pRoomIndex->room_flags, ROOM_CONE_OF_SILENCE );
+	    REMOVE_BIT( pRoomIndex->room_flags, ROOM_TEMP_CONE_OF_SILENCE );
 	    send_to_char( "You have lifted the cone of silence!\n\r", ch );
 	    act( "$n has lifted the cone of silence!",
 		ch, NULL, NULL,   TO_ROOM );
Only in src: mem.c
diff -u -p stock/merc.h src/merc.h
--- stock/merc.h	Tue Dec 26 23:17:56 1995
+++ src/merc.h	Wed May 28 16:03:08 1997
@@ -132,7 +132,7 @@ typedef void GAME_FUN                   
 #define PULSE_MOBILE		  (  5 * PULSE_PER_SECOND )
 #define PULSE_TICK		  ( 30 * PULSE_PER_SECOND )
 #define PULSE_AREA		  ( 60 * PULSE_PER_SECOND )
-
+#define PULSE_DB_DUMP             (1800* PULSE_PER_SECOND ) /* 30 minutes */
 
 
 /*
@@ -250,6 +250,9 @@ struct	descriptor_data
     char *		outbuf;
     int			outsize;
     int			outtop;
+    void *              pEdit;          /* OLC */
+    char **             pString;        /* OLC */
+    int                 editor;         /* OLC */
 };
 
 
@@ -307,6 +310,7 @@ struct	help_data
     int 	        level;
     char *      	keyword;
     char *      	text;
+    AREA_DATA *                area;
 };
 
 
@@ -647,6 +651,7 @@ struct	kill_data
 #define ROOM_PET_SHOP		   4096
 #define ROOM_NO_RECALL		   8192
 #define ROOM_CONE_OF_SILENCE      16384
+#define ROOM_TEMP_CONE_OF_SILENCE 32768 /* So spell doesn't save into areas */
 
 
 /*
@@ -835,6 +840,7 @@ struct	mob_index_data
     int 		damplus;		/* Unused */
     int			gold;			/* Unused */
     int			race;
+    AREA_DATA *         area;           /* OLC */
 };
 
 
@@ -926,6 +932,7 @@ struct	pc_data
     int                 pagelen;
     int 		learned		[ MAX_SKILL ];
     bool                switched;
+    int                 security;       /* OLC - Builder security */
 };
 
 /*
@@ -975,6 +982,7 @@ struct	obj_index_data
     int 		weight;
     int			cost;			/* Unused */
     int			value	[ 4 ];
+    AREA_DATA *         area;           /* OLC */
 };
 
 
@@ -1021,6 +1029,9 @@ struct	exit_data
     int 		key;
     char *		keyword;
     char *		description;
+    EXIT_DATA *         next;           /* OLC */
+    int                 rs_flags;       /* OLC */
+    int                 orig_door;      /* OLC */
 };
 
 
@@ -1064,6 +1075,13 @@ struct	area_data
     int                 recall;
     int 		age;
     int 		nplayer;
+    char *              filename;       /* OLC */
+    char *              builders;       /* OLC - Listing of builders */
+    int                 security;       /* OLC - Value 0-infinity  */
+    int                 lvnum;          /* OLC - Lower vnum */
+    int                 uvnum;          /* OLC - Upper vnum */
+    int                 vnum;           /* OLC - Area vnum  */
+    int                 area_flags;     /* OLC */
 };
 
 
@@ -1085,6 +1103,8 @@ struct	room_index_data
     int 		room_flags;
     int 		light;
     int 		sector_type;
+    RESET_DATA *        reset_first;    /* OLC */
+    RESET_DATA *        reset_last;     /* OLC */
 };
 
 
@@ -1666,6 +1686,150 @@ DECLARE_SPELL_FUN(      spell_thought_sh
 DECLARE_SPELL_FUN(      spell_ultrablast        );
 
 
+/*****************************************************************************
+ *                                    OLC                                    *
+ *****************************************************************************/
+
+/*
+ * This structure is used in special.c to lookup spec funcs and
+ * also in olc_act.c to display listings of spec funcs.
+ */
+struct spec_type
+{
+    char *      spec_name;
+    SPEC_FUN *  spec_fun;
+};
+
+
+
+/*
+ * This structure is used in bit.c to lookup flags and stats.
+ */
+struct flag_type
+{
+    char * name;
+    int  bit;
+    bool settable;
+};
+
+
+
+
+
+/*
+ * Area flags.
+ */
+#define         AREA_NONE       0
+#define         AREA_CHANGED    1       /* Area has been modified. */
+#define         AREA_ADDED      2       /* Area has been added to. */
+#define         AREA_LOADING    4       /* Used for counting in db.c */
+#define         AREA_VERBOSE    8       /* OLC */
+
+
+
+#define MAX_DIR 6
+#define NO_FLAG -99     /* Must not be used in flags or stats. */
+
+
+
+/*
+ * Interp.c
+ */
+DECLARE_DO_FUN( do_aedit        );      /* OLC 1.1b */
+DECLARE_DO_FUN( do_redit        );      /* OLC 1.1b */
+DECLARE_DO_FUN( do_oedit        );      /* OLC 1.1b */
+DECLARE_DO_FUN( do_medit        );      /* OLC 1.1b */
+DECLARE_DO_FUN( do_asave        );
+DECLARE_DO_FUN( do_alist        );
+DECLARE_DO_FUN( do_resets       );
+
+
+/*
+ * Global Constants
+ */
+extern  char *  const   dir_name        [];
+extern  const   int     rev_dir         [];
+extern  const   struct  spec_type       spec_table      [];
+
+
+
+/*
+ * Global variables
+ */
+extern          AREA_DATA *             area_first;
+extern          AREA_DATA *             area_last;
+extern          SHOP_DATA *             shop_last;
+
+extern          int                     top_affect;
+extern          int                     top_area;
+extern          int                     top_ed;
+extern          int                     top_exit;
+extern          int                     top_help;
+extern          int                     top_mob_index;
+extern          int                     top_obj_index;
+extern          int                     top_reset;
+extern          int                     top_room;
+extern          int                     top_shop;
+
+extern          int                     top_vnum_mob;
+extern          int                     top_vnum_obj;
+extern          int                     top_vnum_room;
+
+extern          char                    str_empty       [1];
+
+extern  MOB_INDEX_DATA *        mob_index_hash  [MAX_KEY_HASH];
+extern  OBJ_INDEX_DATA *        obj_index_hash  [MAX_KEY_HASH];
+extern  ROOM_INDEX_DATA *       room_index_hash [MAX_KEY_HASH];
+
+
+/* db.c */
+void    reset_area      args( ( AREA_DATA * pArea ) );
+void    reset_room      args( ( ROOM_INDEX_DATA *pRoom ) );
+void    do_abort        args( ( void ) );
+
+/* string.c */
+void    string_edit     args( ( CHAR_DATA *ch, char **pString ) );
+void    string_append   args( ( CHAR_DATA *ch, char **pString ) );
+char *  string_replace  args( ( char * orig, char * old, char * new ) );
+void    string_add      args( ( CHAR_DATA *ch, char *argument ) );
+char *  format_string   args( ( char *oldstring /*, bool fSpace */ ) );
+char *  first_arg       args( ( char *argument, char *arg_first, bool fCase ) );
+char *  string_unpad    args( ( char * argument ) );
+char *  string_proper   args( ( char * argument ) );
+char *  all_capitalize  args( ( const char * argument ) );
+
+/* olc.c */
+bool    run_olc_editor  args( ( DESCRIPTOR_DATA *d ) );
+char    *olc_ed_name    args( ( CHAR_DATA *ch ) );
+char    *olc_ed_vnum    args( ( CHAR_DATA *ch ) );
+
+/* special.c */
+char *  spec_string     args( ( SPEC_FUN *fun ) );      /* OLC */
+
+/* bit.c */
+extern const struct flag_type   area_flags[];
+extern const struct flag_type   sex_flags[];
+extern const struct flag_type   exit_flags[];
+extern const struct flag_type   door_resets[];
+extern const struct flag_type   room_flags[];
+extern const struct flag_type   sector_flags[];
+extern const struct flag_type   type_flags[];
+extern const struct flag_type   extra_flags[];
+extern const struct flag_type   wear_flags[];
+extern const struct flag_type   act_flags[];
+extern const struct flag_type   affect_flags[];
+extern const struct flag_type   apply_flags[];
+extern const struct flag_type   wear_loc_strings[];
+extern const struct flag_type   wear_loc_flags[];
+extern const struct flag_type   weapon_flags[];
+extern const struct flag_type   container_flags[];
+extern const struct flag_type   liquid_flags[];
+
+/*****************************************************************************
+ *                             END OF OLC                                    *
+ *****************************************************************************/
+
+
 /*
  * OS-dependent declarations.
  * These are all very standard library functions,
@@ -1957,6 +2121,7 @@ bool    longstring      args( ( CHAR_DAT
 bool    authorized      args( ( CHAR_DATA *ch, char *skllnm ) );
 void    end_of_game     args( ( void ) );
 int     race_lookup     args( ( const char *race ) );
+int	race_full_lookup args( ( const char *race ) );
 int     affect_lookup   args( ( const char *race ) );
 
 /* interp.c */
Only in src: olc.c
Only in src: olc.h
Only in src: olc_act.c
Only in src: olc_save.c
diff -u -p stock/save.c src/save.c
--- stock/save.c	Tue Dec 26 23:17:55 1995
+++ src/save.c	Wed May 28 16:00:55 1997
@@ -139,6 +139,7 @@ void fwrite_char( CHAR_DATA *ch, FILE *f
 
     fprintf( fp, "Lvl         %d\n",	ch->level		);
     fprintf( fp, "Trst        %d\n",	ch->trust		);
+    fprintf( fp, "Security    %d\n",    ch->pcdata->security    );  /* OLC */
     fprintf( fp, "Playd       %d\n",
 	ch->played + (int) ( current_time - ch->logon )		);
     fprintf( fp, "Note        %ld\n",   (unsigned long)ch->last_note );
@@ -388,6 +389,7 @@ bool load_char_obj( DESCRIPTOR_DATA *d, 
     ch->pcdata->condition[COND_THIRST]	= 48;
     ch->pcdata->condition[COND_FULL]	= 48;
     ch->pcdata->pagelen                 = 20;
+    ch->pcdata->security		= 0;		/* OLC */
 
     ch->pcdata->switched                = FALSE;
 
@@ -661,6 +663,7 @@ void fread_char( CHAR_DATA *ch, FILE *fp
 	    KEY( "SavThr",	ch->saving_throw,	fread_number( fp ) );
 	    KEY( "Sx",		ch->sex,		fread_number( fp ) );
 	    KEY( "ShtDsc",	ch->short_descr,	fread_string( fp ) );
+            KEY( "Security",    ch->pcdata->security,   fread_number( fp ) );
 
 	    if ( !str_cmp( word, "Skll" ) )
 	    {
diff -u -p stock/special.c src/special.c
--- stock/special.c	Tue Dec 26 23:17:55 1995
+++ src/special.c	Wed May 28 15:34:39 1997
@@ -63,36 +63,76 @@ DECLARE_SPEC_FUN(	spec_thief		);
 
 /*
  * Given a name, return the appropriate spec fun.
+ * Name:          spec_lookup
+ * Purpose:       Given a name, return the appropriate spec fun.
+ * Called by:     do_mset(act_wiz.c) load_specials,reset_area(db.c)
  */
-SPEC_FUN *spec_lookup( const char *name )
+SPEC_FUN *spec_lookup( const char *name )       /* OLC */
 {
-    if ( !str_cmp( name, "spec_breath_any"	  ) ) return spec_breath_any;
-    if ( !str_cmp( name, "spec_breath_acid"	  ) ) return spec_breath_acid;
-    if ( !str_cmp( name, "spec_breath_fire"	  ) ) return spec_breath_fire;
-    if ( !str_cmp( name, "spec_breath_frost"	  ) ) return spec_breath_frost;
-    if ( !str_cmp( name, "spec_breath_gas"	  ) ) return spec_breath_gas;
-    if ( !str_cmp( name, "spec_breath_lightning"  ) ) return
-							spec_breath_lightning;
-    if ( !str_cmp( name, "spec_cast_adept"	  ) ) return spec_cast_adept;
-    if ( !str_cmp( name, "spec_cast_cleric"	  ) ) return spec_cast_cleric;
-    if ( !str_cmp( name, "spec_cast_ghost"        ) ) return spec_cast_ghost;
-    if ( !str_cmp( name, "spec_cast_judge"	  ) ) return spec_cast_judge;
-    if ( !str_cmp( name, "spec_cast_mage"	  ) ) return spec_cast_mage;
-    if ( !str_cmp( name, "spec_cast_psionicist"   ) ) return
-                                                        spec_cast_psionicist;
-    if ( !str_cmp( name, "spec_cast_undead"	  ) ) return spec_cast_undead;
-    if ( !str_cmp( name, "spec_executioner"	  ) ) return spec_executioner;
-    if ( !str_cmp( name, "spec_fido"		  ) ) return spec_fido;
-    if ( !str_cmp( name, "spec_guard"		  ) ) return spec_guard;
-    if ( !str_cmp( name, "spec_janitor"		  ) ) return spec_janitor;
-    if ( !str_cmp( name, "spec_mayor"		  ) ) return spec_mayor;
-    if ( !str_cmp( name, "spec_poison"		  ) ) return spec_poison;
-    if ( !str_cmp( name, "spec_repairman"	  ) ) return spec_repairman;
-    if ( !str_cmp( name, "spec_thief"		  ) ) return spec_thief;
+    int cmd;
+
+    for ( cmd = 0; *spec_table[cmd].spec_name; cmd++ )  /* OLC 1.1b */
+        if ( !str_cmp( name, spec_table[cmd].spec_name ) )
+            return spec_table[cmd].spec_fun;
+
     return 0;
 }
 
 
+/*****************************************************************************
+ Name:          spec_string
+ Purpose:       Given a function, return the appropriate name.
+ Called by:     <???>
+ ****************************************************************************/
+char *spec_string( SPEC_FUN *fun )      /* OLC */
+{
+    int cmd;
+
+    for ( cmd = 0; *spec_table[cmd].spec_fun; cmd++ )   /* OLC 1.1b */
+        if ( fun == spec_table[cmd].spec_fun )
+            return spec_table[cmd].spec_name;
+
+    return 0;
+}
+
+/*
+ * Special Functions Table.     OLC
+ * Add any new spec_funs here
+ */
+const   struct  spec_type       spec_table      [ ] =
+{
+    /*
+     * Special function commands.
+     */
+    { "spec_breath_any",        spec_breath_any         },
+    { "spec_breath_acid",       spec_breath_acid        },
+    { "spec_breath_fire",       spec_breath_fire        },
+    { "spec_breath_frost",      spec_breath_frost       },
+    { "spec_breath_gas",        spec_breath_gas         },
+    { "spec_breath_lightning",  spec_breath_lightning   },
+    { "spec_cast_adept",        spec_cast_adept         },
+    { "spec_cast_cleric",       spec_cast_cleric        },
+    { "spec_cast_ghost",        spec_cast_ghost         },
+    { "spec_cast_judge",        spec_cast_judge         },
+    { "spec_cast_mage",         spec_cast_mage          },
+    { "spec_cast_psionicist",   spec_cast_psionicist    },
+    { "spec_cast_undead",       spec_cast_undead        },
+    { "spec_executioner",       spec_executioner        },
+    { "spec_fido",              spec_fido               },
+    { "spec_guard",             spec_guard              },
+    { "spec_janitor",           spec_janitor            },
+    { "spec_mayor",             spec_mayor              },
+    { "spec_poison",            spec_poison             },
+    { "spec_repairman",         spec_repairman          },
+    { "spec_thief",             spec_thief              },
+    
+    /*
+     * End of list.
+     */
+    { "",                       0       }
+};  
+
+
 
 /*
  * Core procedure for dragons.
@@ -200,7 +240,8 @@ bool spec_cast_adept( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -274,7 +315,8 @@ bool spec_cast_cleric( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -329,7 +371,8 @@ bool spec_cast_judge( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -361,7 +404,8 @@ bool spec_cast_mage( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -417,7 +461,8 @@ bool spec_cast_undead( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -798,7 +843,8 @@ bool spec_cast_psionicist( CHAR_DATA *ch
         return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
@@ -873,7 +919,8 @@ bool spec_cast_ghost( CHAR_DATA *ch )
 	return FALSE;
 
     if ( IS_AFFECTED( ch, AFF_MUTE )
-        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE ) )
+        || IS_SET( ch->in_room->room_flags, ROOM_CONE_OF_SILENCE )  
+        || IS_SET( ch->in_room->room_flags, ROOM_TEMP_CONE_OF_SILENCE ) )
 	return FALSE;
 
     for ( victim = ch->in_room->people; victim; victim = victim->next_in_room )
diff -u -p stock/start src/start
--- stock/start	Tue Dec 26 23:17:56 1995
+++ src/start	Sun May 11 19:26:41 1997
@@ -1,3 +1,3 @@
 #! /bin/csh -f
-nohup /EnvyMud/src/startup 1234 >! /EnvyMud/log/errors.out &
+nohup ../src/startup 1234 >! ../log/errors.out &
 
diff -u -p stock/startup src/startup
--- stock/startup	Tue Dec 26 23:17:56 1995
+++ src/startup	Sun May 11 19:26:01 1997
@@ -8,7 +8,7 @@ set port = 4000
 if ( "$1" != "" ) set port="$1"
 
 # Change to area directory.
-cd /EnvyMud/area
+cd ../area
 
 # Set limits.
 nohup
diff -u -p stock/startupSH src/startupSH
--- stock/startupSH	Tue Dec 26 23:17:56 1995
+++ src/startupSH	Sun May 11 19:27:07 1997
@@ -53,7 +53,7 @@ do
 
     # Run envy.
     # Thanks to Alan and Grodyn for their help on the redirecting stuff - Loki
-    ../src/envy $port >$logfile 2>&1
+    ../src/envy2 $port >$logfile 2>&1
 
     if [ -r core ]
     then
Only in src: string.c
diff -u -p stock/update.c src/update.c
--- stock/update.c	Tue Dec 26 23:17:56 1995
+++ src/update.c	Sun May 11 19:04:40 1997
@@ -1061,6 +1061,7 @@ void time_update( void )
     }
     if ( current_time > down_time )
     {
+        do_asave( NULL, "" );			/* OLC */
         sprintf( buf, "%s by system.\n\r", Reboot ? "Reboot" : "Shutdown" );
 	send_to_all_char( buf );
 	log_string( buf );
@@ -1319,6 +1320,14 @@ void update_handler( void )
     static int pulse_mobile;
     static int pulse_violence;
     static int pulse_point;
+    static int pulse_db_dump;   /* OLC 1.1b */
+
+    /* OLC 1.1b */
+    if ( --pulse_db_dump  <= 0 )
+    {
+        pulse_db_dump   = PULSE_DB_DUMP;
+        do_asave( NULL, "" );
+    }
 
     if ( --pulse_area     <= 0 )
     {