diff -ur src/db.c new/db.c --- src/db.c Mon Sep 14 17:46:38 1998 +++ new/db.c Mon Sep 14 19:20:47 1998 @@ -44,7 +44,7 @@ #include "music.h" #include "tables.h" #include "lookup.h" - +#include "olc.h" #if !defined(macintosh) extern int _filbuf args( (FILE *) ); @@ -417,8 +417,6 @@ AREA_DATA *pArea; pArea = alloc_perm( sizeof(*pArea) ); -/* pArea->reset_first = NULL; - pArea->reset_last = NULL; */ pArea->file_name = fread_string(fp); pArea->area_flags = AREA_LOADING; /* OLC */ @@ -961,7 +959,8 @@ pR->reset_last->next = NULL; } - top_reset++; +/* top_reset++; no estamos asignando memoria!!!! */ + return; } @@ -971,8 +970,9 @@ void load_resets( FILE *fp ) { RESET_DATA *pReset; - int iLastRoom = 0; - int iLastObj = 0; + EXIT_DATA *pexit; + ROOM_INDEX_DATA *pRoomIndex; + int rVnum = -1; if ( !area_last ) { @@ -982,10 +982,7 @@ for ( ; ; ) { - ROOM_INDEX_DATA *pRoomIndex; - EXIT_DATA *pexit; char letter; - OBJ_INDEX_DATA *temp_index; if ( ( letter = fread_letter( fp ) ) == 'S' ) break; @@ -996,7 +993,7 @@ continue; } - pReset = alloc_perm( sizeof(*pReset) ); + pReset = new_reset_data(); pReset->command = letter; /* if_flag */ fread_number( fp ); pReset->arg1 = fread_number( fp ); @@ -1007,97 +1004,56 @@ ? fread_number(fp) : 0; fread_to_eol( fp ); - /* - * Validate parameters. - * We're calling the index functions for the side effect. - */ - switch ( letter ) + switch( pReset->command ) { - default: - bug( "Load_resets: bad command '%c'.", letter ); - exit( 1 ); - break; - - case 'M': - get_mob_index ( pReset->arg1 ); - if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) ) - { - new_reset( pRoomIndex, pReset ); - iLastRoom = pReset->arg3; - } - break; - - case 'O': - temp_index = get_obj_index ( pReset->arg1 ); - temp_index->reset_num++; - if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) ) - { - new_reset( pRoomIndex, pReset ); - iLastObj = pReset->arg3; - } - break; - - case 'P': - temp_index = get_obj_index ( pReset->arg1 ); - temp_index->reset_num++; - if ( ( pRoomIndex = get_room_index ( iLastObj ) ) ) - { - new_reset( pRoomIndex, pReset ); - } - break; - - case 'G': - case 'E': - temp_index = get_obj_index ( pReset->arg1 ); - temp_index->reset_num++; - 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 > (MAX_DIR - 1) - || !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 ) - { - default: - bug( "Load_resets: 'D': bad 'locks': %d." , pReset->arg3); - case 0: break; - case 1: SET_BIT( pexit->rs_flags, EX_CLOSED ); - SET_BIT( pexit->exit_info, EX_CLOSED ); break; - case 2: SET_BIT( pexit->rs_flags, EX_CLOSED | EX_LOCKED ); - SET_BIT( pexit->exit_info, EX_CLOSED | EX_LOCKED ); break; - } - - break; + case 'M': + case 'O': + rVnum = pReset->arg3; + break; - case 'R': - pRoomIndex = get_room_index( pReset->arg1 ); + case 'P': + case 'G': + case 'E': + break; - if ( pReset->arg2 < 0 || pReset->arg2 > MAX_DIR ) - { - bug( "Load_resets: 'R': bad exit %d.", pReset->arg2 ); - exit( 1 ); - } + case 'D': + pRoomIndex = get_room_index( (rVnum = pReset->arg1) ); + if ( pReset->arg2 < 0 + || pReset->arg2 >= MAX_DIR + || !pRoomIndex + || !( pexit = pRoomIndex->exit[pReset->arg2] ) + || !IS_SET( pexit->rs_flags, EX_ISDOOR ) ) + { + bugf( "Load_resets: 'D': exit %d, room %d not door.", pReset->arg2, pReset->arg1 ); + exit( 1 ); + } - if ( pRoomIndex ) - new_reset( pRoomIndex, pReset ); + switch ( pReset->arg3 ) + { + default: bug( "Load_resets: 'D': bad 'locks': %d." , pReset->arg3); break; + case 0: break; + case 1: SET_BIT( pexit->rs_flags, EX_CLOSED ); + SET_BIT( pexit->exit_info, EX_CLOSED ); break; + case 2: SET_BIT( pexit->rs_flags, EX_CLOSED | EX_LOCKED ); + SET_BIT( pexit->exit_info, EX_CLOSED | EX_LOCKED ); break; + } + break; - break; + case 'R': + rVnum = pReset->arg1; + break; } + if ( rVnum == -1 ) + { + bugf( "load_resets : rVnum == -1" ); + exit(1); + } + + if ( pReset->command != 'D' ) + new_reset( get_room_index(rVnum), pReset ); + else + free_reset_data( pReset ); } return; @@ -1361,6 +1317,8 @@ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; + RESET_DATA *pReset; + ROOM_INDEX_DATA *iLastRoom, *iLastObj; int iHash; int door; @@ -1371,6 +1329,64 @@ pRoomIndex = pRoomIndex->next ) { bool fexit; + + iLastRoom = iLastObj = NULL; + + /* OLC : nuevo chequeo de resets */ + for ( pReset = pRoomIndex->reset_first; pReset; pReset = pReset->next ) + { + switch( pReset->command ) + { + default: + bugf( "fix_exits : cuarto %d con reset cmd %c", pRoomIndex->vnum, pReset->command ); + exit(1); + break; + + case 'M': + get_mob_index( pReset->arg1 ); + iLastRoom = get_room_index( pReset->arg3 ); + break; + + case 'O': + get_obj_index( pReset->arg1 ); + iLastObj = get_room_index( pReset->arg3 ); + break; + + case 'P': + get_obj_index( pReset->arg1 ); + if (iLastObj == NULL) + { + bugf( "fix_exits : reset en cuarto %d con iLastObj NULL", pRoomIndex->vnum ); + exit(1); + } + break; + + case 'G': + case 'E': + get_obj_index( pReset->arg1 ); + if (iLastRoom == NULL) + { + bugf( "fix_exits : reset en cuarto %d con iLastRoom NULL", pRoomIndex->vnum ); + exit(1); + } + iLastObj = iLastRoom; + break; + + case 'D': + bugf( "???" ); + break; + + case 'R': + get_room_index( pReset->arg1 ); + if ( pReset->arg2 < 0 || pReset->arg2 > MAX_DIR ) + { + bugf( "fix_exits : reset en cuarto %d con arg2 %d >= MAX_DIR", + pRoomIndex->vnum, pReset->arg2 ); + exit(1); + } + break; + } /* switch */ + } /* for */ fexit = FALSE; for ( door = 0; door <= 5; door++ ) diff -ur src/hedit.c new/hedit.c --- src/hedit.c Mon Sep 14 17:46:43 1998 +++ new/hedit.c Mon Sep 14 19:29:18 1998 @@ -151,6 +151,7 @@ had->area = ch->in_room->area; had->first = NULL; had->last = NULL; + had->changed = TRUE; had->next = had_list; had_list = had; ch->in_room->area->helps = had; @@ -207,6 +208,7 @@ void hedit( CHAR_DATA *ch, char *argument) { HELP_DATA * pHelp; + HELP_AREA *had; char arg[MAX_INPUT_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; @@ -217,6 +219,15 @@ EDIT_HELP(ch, pHelp); + had = get_help_area(pHelp); + + if (had == NULL) + { + bugf( "hedit : had para help %s NULL", pHelp->keyword ); + edit_done(ch); + return; + } + if (ch->pcdata->security < 9) { send_to_char("HEdit: Insuficiente seguridad para editar help.\n\r",ch); @@ -241,19 +252,7 @@ if (!str_prefix(command, hedit_table[cmd].name) ) { if ((*hedit_table[cmd].olc_fun) (ch, argument)) - { - HELP_DATA * pHelp; - HELP_AREA * hArea; - AREA_DATA * area; - - EDIT_HELP(ch, pHelp); - - if (pHelp - && (hArea = get_help_area(pHelp)) - && (area = hArea->area) ) - SET_BIT(area->area_flags, AREA_CHANGED); - } - + had->changed = TRUE; return; } } diff -ur src/merc.h new/merc.h --- src/merc.h Mon Sep 14 17:46:39 1998 +++ new/merc.h Mon Sep 14 19:23:08 1998 @@ -342,6 +342,7 @@ HELP_DATA * last; AREA_DATA * area; char * filename; + bool changed; }; @@ -1660,8 +1661,6 @@ struct area_data { AREA_DATA * next; - RESET_DATA * reset_first; - RESET_DATA * reset_last; HELP_AREA * helps; char * file_name; char * name; diff -ur src/olc_act.c new/olc_act.c --- src/olc_act.c Mon Sep 14 17:46:44 1998 +++ new/olc_act.c Mon Sep 14 17:56:48 1998 @@ -31,6 +31,18 @@ char * mprog_type_to_name ( int type ); +#define ALT_FLAGVALUE_SET( _blargh, _table, _arg ) \ + { \ + int blah = flag_value( _table, _arg ); \ + _blargh = (blah == NO_FLAG) ? 0 : blah; \ + } + +#define ALT_FLAGVALUE_TOGGLE( _blargh, _table, _arg ) \ + { \ + int blah = flag_value( _table, _arg ); \ + _blargh ^= (blah == NO_FLAG) ? 0 : blah; \ + } + /* Return TRUE if area changed, FALSE if not. */ #define REDIT( fun ) bool fun( CHAR_DATA *ch, char *argument ) #define OEDIT( fun ) bool fun( CHAR_DATA *ch, char *argument ) @@ -2477,7 +2489,7 @@ return FALSE; case 0: send_to_char( "WEAPON CLASS SET.\n\r\n\r", ch ); - pObj->value[0] = flag_value( weapon_class, argument ); + ALT_FLAGVALUE_SET( pObj->value[0], weapon_class, argument ); break; case 1: send_to_char( "NUMBER OF DICE SET.\n\r\n\r", ch ); @@ -2493,8 +2505,7 @@ break; case 4: send_to_char( "SPECIAL WEAPON TYPE TOGGLED.\n\r\n\r", ch ); - pObj->value[4] ^= (flag_value( weapon_type2, argument ) != NO_FLAG - ? flag_value( weapon_type2, argument ) : 0 ); + ALT_FLAGVALUE_TOGGLE( pObj->value[4], weapon_type2, argument ); break; } break; @@ -2512,11 +2523,11 @@ break; case 1: send_to_char( "EXIT FLAGS SET.\n\r\n\r", ch); - pObj->value[1] = flag_value( exit_flags, argument ); + ALT_FLAGVALUE_SET( pObj->value[1], exit_flags, argument ); break; case 2: send_to_char( "PORTAL FLAGS SET.\n\r\n\r", ch); - pObj->value[2] = flag_value( portal_flags, argument ); + ALT_FLAGVALUE_SET( pObj->value[2], portal_flags, argument ); break; case 3: send_to_char( "EXIT VNUM SET.\n\r\n\r", ch); @@ -2542,8 +2553,7 @@ break; case 2: send_to_char( "FURNITURE FLAGS TOGGLED.\n\r\n\r", ch); - pObj->value[2] ^= (flag_value( furniture_flags, argument ) != NO_FLAG - ? flag_value( furniture_flags, argument ) : 0); + ALT_FLAGVALUE_TOGGLE( pObj->value[2], furniture_flags, argument ); break; case 3: send_to_char( "HEAL BONUS SET.\n\r\n\r", ch); @@ -2569,9 +2579,8 @@ pObj->value[0] = atoi( argument ); break; case 1: - if ( ( value = flag_value( container_flags, argument ) ) - != NO_FLAG ) - TOGGLE_BIT(pObj->value[1], value); + if ( ( value = flag_value( container_flags, argument ) ) != NO_FLAG ) + TOGGLE_BIT(pObj->value[1], value); else { do_help ( ch, "ITEM_CONTAINER" ); diff -ur src/olc_save.c new/olc_save.c --- src/olc_save.c Mon Sep 14 17:46:44 1998 +++ new/olc_save.c Mon Sep 14 19:33:14 1998 @@ -884,17 +884,19 @@ fprintf( fp, "-1 $~\n\n" ); + ha->changed = FALSE; + return; } -void save_other_helps( void ) +void save_other_helps( CHAR_DATA *ch ) { extern HELP_AREA * had_list; HELP_AREA *ha; FILE *fp; for ( ha = had_list; ha; ha = ha->next ) - if ( ha->area == NULL ) + if ( ha->changed == TRUE ) { fp = fopen( ha->filename, "w" ); @@ -905,6 +907,10 @@ } save_helps( fp, ha ); + + if (ch) + printf_to_char( ch, "%s\n\r", ha->filename ); + fprintf( fp, "#$\n" ); fclose( fp ); } @@ -1048,8 +1054,7 @@ if ( ch ) send_to_char( "You saved the world.\n\r", ch ); - if ( sec == 9 ) - save_other_helps( ); + save_other_helps( NULL ); return; } @@ -1091,6 +1096,8 @@ } } + save_other_helps( ch ); + if ( !str_cmp( buf, "None.\n\r" ) ) if ( ch ) send_to_char( buf, ch ); @@ -1138,6 +1145,10 @@ case ED_MOBILE: pArea = ( (MOB_INDEX_DATA *)ch->desc->pEdit )->area; break; + case ED_HELP: + send_to_char( "Grabando area : ", ch ); + save_other_helps( ch ); + return; default: pArea = ch->in_room->area; break; diff -ur src/recycle.c new/recycle.c --- src/recycle.c Mon Sep 14 17:46:39 1998 +++ new/recycle.c Mon Sep 14 19:23:44 1998 @@ -678,6 +678,7 @@ HELP_AREA * new_had ( void ) { HELP_AREA * had; +static HELP_AREA zHad; if ( had_free ) { @@ -686,6 +687,8 @@ } else had = alloc_perm( sizeof( *had ) ); + + *had = zHad; return had; }