sunder2.1a/clan/
sunder2.1a/class/
sunder2.1a/class/bak/
sunder2.1a/doc/ideas/
sunder2.1a/gods/
sunder2.1a/i3/
sunder2.1a/log/
sunder2.1a/msgbase/
sunder2.1a/player/
sunder2.1a/src/o/
sunder2.1a/time/
/**************************************************************************
 *  File: olc_save.c                                                       *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 *                                                                         *
 *  This code was freely distributed with the The Isles 1.1 source code,   *
 *  and has been used here for OLC - OLC would not be what it is without   *
 *  all the previous coders who released their source code.                *
 *                                                                         *
 ***************************************************************************/
/**********************************************************
 *************** S U N D E R M U D *** 2 . 0 **************
 **********************************************************
 * The unique portions of the SunderMud code as well as   *
 * the integration efforts for code from other sources is *
 * based primarily on the efforts of:                     *
 *                                                        *
 * Lotherius <aelfwyne@operamail.com> (Alvin W. Brinson)  *
 *    and many others, see "help sundermud" in the mud.   *
 **********************************************************/

/* OLC_SAVE.C
 * Notes:
 * -If a good syntax checker is used for setting vnum ranges of areas
 *  then it would become possible to just cycle through vnums instead
 *  of using the iHash stuff and checking that the room or reset or
 *  mob etc is part of that area.
 */

#include "everything.h"
#include "olc.h"

/*
 *  Verbose writes reset data in plain english into the comments
 *  section of the resets.  It makes areas considerably larger but
 *  may aid in debugging.
 */

/* #define VERBOSE */

/*
 * Remove carriage returns from a line
 */
char *strip_cr ( char *str )
{
     static char         newstr[MAX_STRING_LENGTH];
     int                 i, j;

     for ( i = j = 0; str[i] != '\0'; i++ )
          if ( str[i] != '\r' )
          {
               newstr[j++] = str[i];
          }
     newstr[j] = '\0';
     return newstr;
}

/*****************************************************************************
 Name:		fix_string
 Purpose:	Returns a string without \r and ~.
 ****************************************************************************/
char *fix_string ( const char *str )
{
     static char         strfix[MAX_STRING_LENGTH];
     int                 i;
     int                 o;

     if ( str == NULL )
          return '\0';

     for ( o = i = 0;( str[i + o] != '\0' && ( i + 1 ) <= MAX_STRING_LENGTH );i++ )
     {
          if ( str[i + o] == '\r' || str[i + o] == '~' )
               o++;
          strfix[i] = str[i + o];
     }
     strfix[i] = '\0';
     return strfix;
}

/*****************************************************************************
 Name:		save_area_list
 Purpose:	Saves the listing of files to be loaded at startup.
 Called by:	do_asave(db_area.c).
 ****************************************************************************/
void save_area_list (  )
{
     FILE               *fp;
     AREA_DATA          *pArea;

     if ( ( fp = fopen ( AREA_LIST, "w" ) ) == NULL )
     {
          bugf ( "Save_area_list: fopen" );
          perror ( AREA_LIST );
     }
     else
     {
          for ( pArea = area_first; pArea; pArea = pArea->next )
          {
               fprintf ( fp, "%s\n", pArea->filename );
          }

          fprintf ( fp, "$\n" );
          fclose ( fp );
     }

     return;
}

/*
 * ROM OLC
 * Used in save_mobile and save_object below.  Writes
 * flags on the form fread_flag reads.
 *
 * buf[] must hold at least 32+1 characters.
 *
 * -- Hugin
 *
 * Doesn't actually do an fwrite, simply returns a value --lotherius
 * Dunno why he called it fwrite but I'll leave it this way. Misleading,
 * because fread actually does work on files, but fwrite doesn't?
 *
 */
char *fwrite_flag ( long flags, char buf[] )
{
     char                offset;
     char               *cp;

     buf[0] = '\0';

     if ( flags == 0 )
     {
          SLCPY ( buf, "0" );
          return buf;
     }

     /* 32 -- number of bits in a long */
     for ( offset = 0, cp = buf; offset < 32; offset++ )
          if ( flags & ( ( long ) 1 << offset ) )
          {
               if ( offset <= 'Z' - 'A' )
                    *( cp++ ) = 'A' + offset;
               else
                    *( cp++ ) = 'a' + offset - ( 'Z' - 'A' + 1 );
          }
     *cp = '\0';
     return buf;
}

/* *******
 * Save the race table
 * Lotherius 2002
 * *******/

void save_races ( )
{
     FILE              *fp = NULL;
     char               buf[MAX_STRING_LENGTH];
     int		race;

     SNP ( buf, "%s%s", DATA_DIR, RACE_FILE );

     if ( !( fp = fopen ( buf, "w" ) ) )
     {
          bugf ( "Could Not Open Race File to save!" );
          return;
     }

     for ( race = 0; race_table[race].name != NULL; race++ )
     {
          fprintf ( fp, "%s~\n", race_table[race].name );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].act, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].off, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].imm, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].res, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].vuln, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].form, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].parts, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].aff, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].detect, buf ) );
          fprintf ( fp, "%s ", fwrite_flag ( race_table[race].protect, buf ) );
          fprintf ( fp, "%d\n", race_table[race].encumbrance );
     }

    /* the EOF marker !MUST! be followed by a CR or it will
     * result in a "string too long" error on bootup. */

     fprintf ( fp, "$\n" );      /* EOF $ */
     fclose ( fp );
}