/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* 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. *
***************************************************************************/
#include <glib.h>
#include <sys/types.h>
#include <ctype.h>
#ifdef unix
#include <unistd.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <lookup.h>
#include <recycle.h>
#include <tables.h>
#include <interp.h>
#include <olc.h>
extern CHAR_DATA *reset_player args(( DESCRIPTOR_DATA *d, const char *name ));
bool deadbeat args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char *print_flags(int flag)
{
int count, pos = 0;
static char buf[52];
for (count = 0; count < 32; count++)
{
if (IS_SET(flag,1<<count))
{
if (count < 26)
buf[pos] = 'A' + count;
else
buf[pos] = 'a' + (count - 26);
pos++;
}
}
if (pos == 0)
{
buf[pos] = '0';
pos++;
}
buf[pos] = '\0';
return buf;
}
/*
* Local functions.
*/
void fwrite_char_old args( ( CHAR_DATA *ch, FILE *fp ) );
extern void fwrite_char args( ( CHAR_DATA *ch, FILE *fp ) );
void fwrite_pet args( ( CHAR_DATA *ch, FILE *fp ) );
void fwrite_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest ) );
void fread_char_old args( ( CHAR_DATA *ch, FILE *fp ) );
extern void fread_char args( ( CHAR_DATA *ch, FILE *fp ) );
void fread_pet args( ( CHAR_DATA *ch, FILE *fp ) );
void fread_obj args( ( CHAR_DATA *ch, FILE *fp ) );
void save_char_obj_finger args( ( CHAR_DATA *ch ) );
void convert_old_new args( ( CHAR_DATA *ch ) );
void save_char_obj_backup( CHAR_DATA *ch )
{
char chlevel [15];
char buf [MAX_INPUT_LENGTH];
char strsave[MAX_STRING_LENGTH];
FILE *fp;
/*players Don't save on Chaos Night!*/
if (IS_SET(mudsetting->mud_setting, MS_CHAOS_NIGHT))
return;
if ( IS_NPC(ch) || ch->level < 2 )
return;
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
ch->save_time = current_time;
fclose( fpReserve );
sprintf( strsave, "%sstore/%s", PLAYER_DIR, capitalize(ch->name->str) );
if ( ( fp = fopen( strsave, "w" ) ) == NULL )
{
fpReserve = fopen( NULL_FILE, "r" );
bug( "Save_char_obj: fopen", 0 );
fclose( fpReserve );
}
else
{
fwrite_char( ch, fp );
if ( ch->carrying != NULL )
fwrite_obj( ch, ch->carrying, fp, 0 );
if ( ch->pet != NULL )
fwrite_pet( ch, fp);
fprintf( fp, "#END\n" );
if (ch->level >= 11) sprintf(chlevel,"<Implementor>");
else if (ch->level == 10) sprintf(chlevel,"<High Judge>");
else if (ch->level == 9 ) sprintf(chlevel,"<Judge>");
else if (ch->level == 8 ) sprintf(chlevel,"<Enforcer>");
else if (ch->level == 7 ) sprintf(chlevel,"<Quest Maker>");
else if (ch->level == 6 ) sprintf(chlevel,"<Builder>");
else if (ch->level == 5 ) sprintf(chlevel,"<Avatar>");
else if (ch->level == 4 ) sprintf(chlevel,"<Avatar>");
else if (ch->level == 3 ) sprintf(chlevel,"<Avatar>");
else sprintf(chlevel,"<Mortal>");
if (ch->lasttime->len > 1)
sprintf(buf,"%s Last logged in on %s.\n\r", chlevel, ch->lasttime->str);
else
sprintf(buf,"%s New player logged in on %s.\n\r", chlevel, ch->createtime->str);
fprintf( fp, buf);
}
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
/*
* Load a char and inventory into a new ch structure.
*/
bool load_char_obj( DESCRIPTOR_DATA *d, char *name )
{
/*
static PC_DATA pcdata_zero;
*/
char strsave[MAX_STRING_LENGTH];
CHAR_DATA *ch;
FILE *fp;
bool found;
bool valid_player = TRUE;
int reason = 0;
ch = reset_player(d,name);
found = FALSE;
/*
* Close the NULL reserve and open our player file
*/
fclose( fpReserve );
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
if ( ( fp = fopen( strsave, "r" ) ) != NULL )
{
set_rObjNest_null();
found = TRUE;
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
valid_player = FALSE;
reason = 1;
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "PLAYERS" ) ) fread_char ( ch, fp );
else if ( !str_cmp( word, "OBJECT" ) ) fread_obj ( ch, fp );
else if ( !str_cmp( word, "PET" ) ) fread_pet ( ch, fp );
else if ( !str_cmp( word, "END" ) ) break;
else
{
valid_player = FALSE;
reason = 2;
break;
}
if (Player_Error == TRUE)
valid_player = FALSE;
}
fclose( fp );
}
fpReserve = fopen( NULL_FILE, "r" );
if (!valid_player){
if (reason == 2)
bug( "Load_char_obj: bad section.", 0 );
if (reason == 1)
bug( "Load_char_obj: # not found.", 0 );
return FALSE;
}
return found;
}
bool load_char_short( DESCRIPTOR_DATA *d, char *name )
{
/*
static PC_DATA pcdata_zero;
*/
char strsave[MAX_STRING_LENGTH];
CHAR_DATA *ch;
FILE *fp;
bool found;
ch = reset_player(d,name);
found = FALSE;
fclose( fpReserve );
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
if ( ( fp = fopen( strsave, "r" ) ) != NULL )
{
set_rObjNest_null();
found = TRUE;
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
fpReserve = fopen( NULL_FILE, "r" );
bug( "Load_char_obj: # not found.", 0 );
fclose( fpReserve );
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "PLAYERS" ) ) fread_char ( ch, fp );
else if ( !str_cmp( word, "OBJECT" ) ) break;
else if ( !str_cmp( word, "END" ) ) break;
else
{
fpReserve = fopen( NULL_FILE, "r" );
bug( "Load_char_obj: bad section.", 0 );
fclose( fpReserve );
break;
}
}
fclose( fp );
}
fpReserve = fopen( NULL_FILE, "r" );
return found;
}