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 ) {