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