/*************************************************************************** * 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. * **************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1996 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /**************************************************************************** * Demon's Dance MUD, and source code are property of Eric Goetschalckx * * By compiling this code, you agree to include the following in your * * login screen: * * Derivative of Demon's Dance, by Enzo/Stan * ***************************************************************************/ #if defined(macintosh) #include <types.h> #elif defined(WIN32) #include <sys/types.h> #include <winsock.h> #include <io.h> #include <direct.h> #define NOCRYPT #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <malloc.h> #include "merc.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "interp.h" #include "magic.h" #include "arena.h" void do_remor( CHAR_DATA *ch, char *argument ) { send_to_char( "If you want to REMORT, you must spell it out.\n\r", ch ); return; } void do_remort( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; char strsave[MAX_INPUT_LENGTH], player_name[MAX_INPUT_LENGTH]; char player_pwd[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH]; int player_incarnations; if ( IS_NPC(ch) || ( d = ch->desc ) == NULL ) return; if ( ch->level < LEVEL_HERO && !IS_SET( ch->act, PLR_REMORT ) ) { sprintf( buf, "You must be level %d to remort\n\r", LEVEL_HERO ); send_to_char( buf, ch ); return; } if( ch->pcdata->incarnations >= 1) { send_to_char( "You have already reached the second tear of existance, no more can be achieved\n\r", ch ); return; } if ( ch->pcdata->confirm_remort ) { if ( argument[0] != '\0' ) { send_to_char( "Remort status removed.\n\r", ch ); ch->pcdata->confirm_remort = FALSE; return; } else { /* * Get ready to delete the pfile, send a nice informational message. */ sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) ); stop_fighting( ch, TRUE ); send_to_char( "You have chosen to remort. You will now be dropped in at the race\n\r", ch ); send_to_char( "selection section of character creation, and will be allowed to choose from\n\r", ch ); send_to_char( "a wider selection of races and classes.\n\r\n\r", ch ); send_to_char( "In the unlikely event that you are disconnected or the MUD\n\r", ch ); send_to_char( "crashes while you are creating your character, create a new character\n\r", ch ); send_to_char( "as normal and write a note to 'immortal'.\n\r", ch ); send_to_char( "\n\r[Hit Enter to Continue]\n\r", ch ); wiznet( "$N has remorted.", ch, NULL, 0, 0, 0 ); /* * I quote: * "After extract_char the ch is no longer valid!" */ sprintf( player_name, "%s", capitalize( ch->name ) ); sprintf( player_pwd, "%s", ch->pcdata->pwd ); do_function(ch, &do_remove, "all" ); player_incarnations = ++ch->pcdata->incarnations; save_remort_char(ch); extract_char( ch, TRUE ); /* * Delete the pfile, but don't boot the character. * Instead, do a load_char_obj to get a new ch, * saving the password, and the incarnations. Then, * set the PLR_REMORT bit and drop the player in at * CON_BEGIN_REMORT. */ unlink( strsave ); sprintf(buf, "%sremort", player_name); load_char_obj( d, buf ); save_char_obj( ch ); unlink( buf ); if( !IS_SET( ch->act, PLR_REMORT ) ) SET_BIT( ch->act, PLR_REMORT ); d->connected = CON_BEGIN_REMORT; return; } } if ( argument[0] != '\0' ) { send_to_char( "Just type remort. No argument.\n\r", ch ); return; } send_to_char("Type remort again to confirm this command.\n\r", ch ); send_to_char("WARNING: This command is irreversible.\n\r", ch ); send_to_char("Typing remort with an argument will undo remort status.\n\r", ch ); ch->pcdata->confirm_remort = TRUE; wiznet( "$N is contemplating remorting.",ch,NULL,0,0,get_trust(ch)); } void save_remort_char( CHAR_DATA *ch ) { char buf[MAX_STRING_LENGTH]; char strsave[MAX_INPUT_LENGTH]; FILE *fp; if ( IS_NPC(ch) ) return; if ( ch->desc != NULL && ch->desc->original != NULL ) ch = ch->desc->original; /* create god log */ if (IS_IMMORTAL(ch) || ch->level >= LEVEL_IMMORTAL) { send_to_char("Immortals cant remort moron", ch); return; } fclose( fpReserve ); sprintf( buf, "%sremort",capitalize( ch->name )); sprintf( strsave, "%s%s", PLAYER_DIR, buf ); if ( ( fp = fopen( TEMP_FILE, "w" ) ) == NULL ) { bug( "Save_remort_char: fopen", 0 ); perror( strsave ); } else { fwrite_remort( ch, fp ); if ( ch->carrying != NULL ) fwrite_obj( ch, ch->carrying, fp, 0 ); fprintf( fp, "#END\n" ); } fclose( fp ); if (remove (strsave) != 0) /* NJG - remove old file so we can rename onto it */ perror( strsave ); if (rename(TEMP_FILE,strsave) != 0) perror( strsave ); fpReserve = fopen( NULL_FILE, "r" ); return; } /* * Write the remort char. */ void fwrite_remort( CHAR_DATA *ch, FILE *fp ) { int sn, gn; fprintf( fp, "#%s\n", IS_NPC(ch) ? "MOB" : "PLAYER" ); fprintf( fp, "Name %s~\n", ch->name ); fprintf( fp, "Id %ld\n", ch->id ); fprintf( fp, "LogO %ld\n", current_time ); fprintf( fp, "Vers %d\n", 5 ); if (ch->short_descr[0] != '\0') fprintf( fp, "ShD %s~\n", ch->short_descr ); if( ch->long_descr[0] != '\0') fprintf( fp, "LnD %s~\n", ch->long_descr ); if (ch->description[0] != '\0') fprintf( fp, "Desc %s~\n", ch->description ); if (ch->prompt != NULL || !str_cmp(ch->prompt,"<%hhp %mm %vmv> ")) fprintf( fp, "Prom %s~\n", ch->prompt ); fprintf( fp, "Sex %d\n", ch->sex ); if (ch->trust != 0) fprintf( fp, "Scro %d\n", ch->lines ); if (ch->act != 0) fprintf( fp, "Act %s\n", print_flags(ch->act)); fprintf( fp, "Pass %s~\n", ch->pcdata->pwd ); fprintf( fp, "Incr %d\n", ch->pcdata->incarnations ); for ( sn = 0; sn < MAX_SKILL; sn++ ) { if ( skill_table[sn].name != NULL && ch->pcdata->learned[sn] > 0 ) { fprintf( fp, "Sk %d '%s'\n", ch->pcdata->learned[sn], skill_table[sn].name ); } } for ( gn = 0; gn < MAX_GROUP; gn++ ) { if ( group_table[gn].name != NULL && ch->pcdata->group_known[gn]) { fprintf( fp, "Gr '%s'\n",group_table[gn].name); } } fprintf( fp, "End\n\n" ); return; }