wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** 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;
}