/*--------------------------------------------------------------------------*
* ** WolfPaw 1.0 ** *
*--------------------------------------------------------------------------*
* WolfPaw 1.0 (c) 1997,1998 by Dale Corse *
*--------------------------------------------------------------------------*
* The WolfPaw Coding Team is headed by: Greywolf *
* With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag *
* Scryn, Thoric, Justice, Tricops and Mask. *
*--------------------------------------------------------------------------*
* Room Saving Module For NON-Clan Storeroom Saving *
*--------------------------------------------------------------------------*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/dir.h>
#include "mud.h"
void load_save_rooms( void );
void load_save_room( char *filename );
void save_save_room( CHAR_DATA *ch );
void clean_save_room( ROOM_INDEX_DATA *room );
static OBJ_DATA * rgObjNest [MAX_NEST];
void load_save_rooms( void )
{
FILE *fpList;
char *filename;
char clanlist[256];
sprintf( clanlist, "%s%s", SAVE_ROOM_DIR, SAVE_ROOM_LIST );
if ( ( fpList = fopen( clanlist, "r" ) ) == NULL )
{
perror( clanlist );
exit( 1 );
}
for ( ; ; )
{
filename = feof( fpList ) ? "$" : fread_word( fpList );
if ( filename[0] == '$' )
break;
if ( filename[0] != '\0' )
load_save_room( filename );
}
new_fclose( fpList );
log_string("Done SaveRooms" );
return;
}
void load_save_room( char *filename )
{
FILE *fp;
ROOM_INDEX_DATA *save_room;
int vnum, zone;
char buf[MSL], log_string[MSL];
char *temp=NULL;
int objloaded=0;
strcpy( temp, &filename[0]);
zone = atoi(temp);
strcpy(temp,filename);
filename++;
filename++;
vnum = atoi(filename);
strcpy(filename,temp);
sprintf( buf, "%s%s", SAVE_ROOM_DIR, filename );
if ( ( fp = fopen( buf, "r" ) ) != NULL )
{
int iNest;
bool found;
OBJ_DATA *tobj, *tobj_next;
sprintf( buf, "Loading SAVE-ROOM: Z:%d R:%d",zone,vnum);
log_string( buf );
if ( ( save_room = get_room_index( vnum, zone ) )==NULL)
{
bug("Load_Save_Room: Bad room index! (Z:%d R:%d)",zone,vnum);
return;
}
rset_supermob(save_room);
for ( iNest = 0; iNest < MAX_NEST; iNest++ )
rgObjNest[iNest] = NULL;
found = TRUE;
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
bug( "Load_Save_Room: # not found.", 0 );
bug( "Z:%d R:%d", zone,vnum );
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "OBJECT" ) ) /* Objects */
{
fread_obj ( supermob, fp, OS_CARRY );
objloaded++;
}
else
if ( !str_cmp( word, "END" ) ) /* Done */
{
sprintf(log_string,"Loaded %d Objects.",objloaded);
log_string(log_string);
break;
}
else
{
bug( "Load_Save_Room: bad section.", 0 );
bug( "Z:%d R:%d", zone,vnum );
break;
}
}
new_fclose( fp );
for ( tobj = supermob->first_carrying; tobj; tobj = tobj_next )
{
tobj_next = tobj->next_content;
obj_from_char( tobj );
obj_to_room( tobj, save_room );
}
release_supermob();
if ( IS_SET( save_room->room_flags, ROOM_DONATION ) )
clean_save_room(save_room);
}
else
{
bug("Load_Save_Room: Cannot Open File (%s)!",filename);
return;
}
return;
}
void save_save_room( CHAR_DATA *ch )
{
FILE *fp;
char filename[256];
sh_int templvl;
OBJ_DATA *contents;
char buf[256];
if ( !ch )
{
bug ("Save_Save_Room: Null ch pointer!", 0);
return;
}
sprintf( buf, "%d-%d",ch->in_room->area->zone->number,
ch->in_room->vnum );
sprintf( filename, "%s%s.save-room", SAVE_ROOM_DIR, buf );
if ( ( fp = fopen( filename, "w" ) ) == NULL )
{
bug( "Save_Save_Room: fopen", 0 );
perror( filename );
}
else
{
templvl = ch->level;
ch->level = LEVEL_AVATAR; /* make sure EQ doesn't get lost */
contents = ch->in_room->last_content;
if (contents)
fwrite_obj(ch, contents, fp, 0, OS_SAVEROOM, FALSE );
fprintf( fp, "#END\n" );
ch->level = templvl;
new_fclose( fp );
}
return;
}
/*
* Donation Room Cleaner --GW
*/
void clean_save_room( ROOM_INDEX_DATA *room )
{
char log_str[MSL];
OBJ_DATA *pit, *tobj, *tobj_next, *tobj2, *tobj_next2;
sprintf(log_str,"Cleaning Save-Room: %d",room->vnum);
log_string(log_str);
/* Bringin the Super-Mob */
rset_supermob(room);
/* Find the Pit */
if ( !(pit = get_obj_here( supermob, "pit" ) ) )
{
bug("Clean_save_room: NO PIT!",0);
return;
}
/* Get all the stuff on the floor */
for ( tobj = supermob->in_room->first_content; tobj; tobj = tobj_next)
{
tobj_next = tobj->next_content;
if ( IS_SET(tobj->wear_flags, ITEM_TAKE ) )
{
obj_from_room( tobj );
obj_to_char( tobj, supermob );
} }
/* Put it all in the Pit */
for ( tobj2 = supermob->first_carrying; tobj2; tobj2 = tobj_next2)
{
tobj_next2 = tobj2->next_content;
if ( tobj2 != pit )
{
obj_from_char( tobj2 );
obj_to_obj( tobj2, pit );
}
}
/* drop the pit */
for ( tobj = supermob->first_carrying; tobj; tobj = tobj_next)
{
tobj_next = tobj->next_content;
obj_from_char( pit );
obj_to_room( pit, supermob->in_room );
}
/* Release Supermob */
release_supermob();
log_string("Done");
return;
}