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;
}