dawn/notes/
dawn/src/
dawn/src/docs/
/**************************************************************************/
// remort.cpp - Kals hacked up remort code :)
/***************************************************************************
 * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt                    *
 * >> A number of people have contributed to the Dawn codebase, with the   *
 *    majority of code written by Michael Garratt - www.dawnoftime.org     *
 * >> To use this source code, you must fully comply with the dawn license *
 *    in licenses.txt... In particular, you may not remove this copyright  *
 *    notice.                                                              *
 **************************************************************************/
/*
* remort code - written by Michael Garratt (c)2000
* - This code has been written to provide remort support, while Dawn didn't
*   officially have remort, a knew a lot of muds would want it and I 
*   couldn't stand the hardcoded nature of the available remort snippets.
*/
/**************************************************************************/
#include "include.h"
#include "nanny.h"

void save_char_obj_to_filename( char_data *ch, char *filename );
void display_race_selection(connection_data *d);
/**************************************************************************/
// oc = old_char
void begin_remort( char_data *oc) 
{
	char_data *ch;
	int stat;

	// no character name on old character - safety check
	if (IS_NULLSTR(oc->name)){
		bug("begin_remort(): No name attached to oc!!! - aborting!!!");
		do_abort();
	}

	oc->wraplnf("You are beginning remort %d rerolling!!!  You can reroll as many times "
		"as you like, just log in again if you are disconnected during creation to "
		"start again.", oc->beginning_remort);
		
	ch = new_char();
	ch->pcdata = new_pcdata();

	replace_string(ch->name				, oc->name );
	replace_string(ch->pcdata->unlock_id, oc->pcdata->unlock_id);
	replace_string(ch->pcdata->email,  oc->pcdata->email);
	ch->id							= oc->id;
	ch->race						= race_lookup("human");
	ch->act 						= PLR_NOSUMMON;
	ch->config 						= CONFIG_NOCHARM;
	ch->comm						= COMM_COMBINE | COMM_PROMPT;
	ch->prompt						= str_dup(oc->prompt);
	ch->mounted_on					=NULL;
	ch->ridden_by					=NULL;
	ch->tethered					=false;
	ch->bucking 					=false;
	ch->wildness					=100;
	ch->will						=100;
	ch->pcdata->confirm_delete		= false;
	ch->pcdata->pwd 				= str_dup(oc->pcdata->pwd);
	ch->pcdata->bamfin				= str_dup( "" );
	ch->pcdata->bamfout 			= str_dup( "" );
	for (stat =0; stat < MAX_STATS; stat++){
		ch->perm_stats[stat]		= 1;
	}
	ch->pcdata->condition[COND_THIRST]	= 48;
	ch->pcdata->condition[COND_FULL]	= 48;
	ch->pcdata->condition[COND_HUNGER]	= 48;
	ch->pcdata->security	= 0;
	ch->remort=oc->beginning_remort; 
	ch->lines=oc->lines;

	ch->clan=oc->clan;
	ch->clanrank=oc->clanrank;
	if(IS_LETGAINED(oc)){
		SET_BIT(ch->act,PLR_CAN_ADVANCE);
	}

	// swap over the connection to the new character
	ch->desc						= oc->desc;
	oc->desc = NULL;
	extract_char(oc, true);

	ch->desc->character				= ch;
	ch->desc->creation_remort_number=ch->remort;

	ch->desc->connected_state=CON_GET_NEW_RACE;

	ch->print("Please select your race from one of the following:`1 ");
	int count=0;
	for ( int race = 1; race_table[race]; race++ )
	{
		// creation selectable pc races only
		if (!race_table[race]->creation_selectable()
			|| (race_table[race]->remort_number > ch->desc->creation_remort_number)){
			continue;
		}
		ch->printf( " `S[`Y%12.12s`S]", race_table[race]->name);
		if (++count%5==0){
			ch->print( "`x\r\n ");
		}
	}
	ch->printf( "`1Type in the name of the race you wish to play now:`1");

}

/**************************************************************************/
void autonote(int type, char *sender, char *subject, char *to, char *text, bool reformat);

/**************************************************************************/
// remort <player_in_room>
void do_remort(char_data *ch, char *argument)
{
	char name[MIL];

	if(!GAMESETTING(GAMESET_REMORT_SUPPORTED)){
		ch->println("Game settings currently have remort support disabled.");
		ch->println("This can be turned on using the gameedit command.");
		if(IS_NPC(ch)){
			mpbug("Remort command used - nothing happened because remort is disabled in the game settings.");
		}
		return;
	}
	
	argument=one_argument(argument, name);
	if(IS_NULLSTR(name)){
		ch->println("syntax: remort <playername>");
		return;
	}

	char_data*v=get_char_room(ch, name);
	
	if(v==NULL){
		ch->printlnf("Couldn't find player '%s' in current room to remort.", name);
		return;
	}

	// found the player, if pass idiot checks remort them
	if(IS_NPC(v) || v->level!=LEVEL_HERO){
		ch->println("Can only remort mortal heros.");
		return;
	}

    // prevent players from connecting a character that is 
 	// beginning remort to get money 
	connection_data *d,*c_next;
    for (d = connection_list; d != NULL; d = c_next)
    {
        c_next = d->next;
		if (d!=v->desc && CH(d) && CH(d)->id == v->id )
        {
			logf("do_remort(): Kicking out an extra connection!.\r\n");
            extract_char(CH(d),true);
            connection_close(d);
        } 
    }

	// *** begin remorting them
	// create backup pfile
	char backname[MIL];
	sprintf(backname, "%s%d", pfilename(v->name, PFILE_REMORT_BACKUP), v->remort);	
	save_char_obj_to_filename(v,backname);	
	
	// flag the remort and update the pfile, so when they reconnect 
	// they start creation in the new remort
	v->beginning_remort=v->remort+1;
	save_char_obj(v);


	char subject[MIL];
	sprintf(subject,"%s beginning remort %d", v->name, v->beginning_remort);
	char text[MIL];
	sprintf(text,"%s beginning remort %d`1Pfile of player backed up to %s before remort begun.`1"
		"Sent on remort by '%s' %d.", 
		v->name, v->beginning_remort, 
		backname,
		ch->name, ch->pIndexData?ch->pIndexData->vnum:0);

	autonote(NOTE_INOTE, "remort system", subject, "imm", text, true);
	
	begin_remort(v);
	ch->println(text);
}
/**************************************************************************/