/
tgpub/area/notes/
tgpub/doc/
tgpub/player/
tgpub/player/backup/
tgpub/player/store/
/***************************************************************************
 *  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.                                                  *
 ***************************************************************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"

/* 
 * This is a variation of the recall command.  Costs more to do and set.
 * Inspired by Mortal Realms "gohome" command.
 */
void do_gohome ( CHAR_DATA *ch, char* argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *mount;
    ROOM_INDEX_DATA *location;
    sh_int move_cost = 0;
    sh_int primal_cost = 15;

    if (IS_NPC(ch)) return;

    if (ch->pcdata->legend < 5)
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    one_argument(argument, arg);

    if ( !str_cmp(arg, "set") )
    {
	if ( ch->pcdata->quest < 500 )
	{
	    send_to_char( "You need 500 qps to set your gohome location.\r\n", ch);	
	    return;
	}
	if ( ch->in_room->vnum == ch->home2 )
	{
            send_to_char( "You already go home to this location.\n\r", ch );
            return;
	}

	if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) ||
             IS_SET(ch->in_room->room_flags, ROOM_SAFE) )
	{
            send_to_char("You can't set your home here.\n\r", ch);
            return;
	}

	if ( ch->in_room->sector_type == SECT_HQ && 
		!char_can_hqedit(ch))
	{
	    /* 
	     * char_can_hqedit() compares the area name to the ch's class.
	     * This function is located in puck_wiz.c
	     */
	    send_to_char("You can't set your home here.\r\n", ch);
	    return;
	}

	send_to_char("You set your home here.\r\n", ch);
	ch->home2 = ch->in_room->vnum;
	ch->pcdata->quest -= 500;
	return;
    }

    move_cost = UMIN(1000, ch->move/10);

    if (ch->move < move_cost)
    {
	send_to_char("You're too fatigued to go home.\n\r",ch);
	return;
    }
    if (ch->practice < primal_cost)
    {
	send_to_char("You don't have the primal energy to go home.\r\n", ch);
	return;
    }

    act( "$n's body is consumed by blue flames.", ch, NULL, NULL, TO_ROOM );
    act( "Your body is consumed by blue flames.", ch, NULL, NULL, TO_CHAR );

    if ( ( location = get_room_index( ch->home2 ) ) == NULL )
    {
	send_to_char( "You are completely lost.\n\r", ch );
	return;
    }

    if ( ch->in_room == location )
	return;

    if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
    ||   IS_AFFECTED(ch, AFF_CURSE) )
    {
	send_to_char( "You are unable to go home.\n\r", ch );
	return;
    }

    if ( ch->position <= POS_FIGHTING )
    {
	send_to_char( "You can't go home right now.\r\n", ch);
	return;
    }

    ch->move -= move_cost;
    ch->practice -= primal_cost;

    act( "$n disappears in a puff of smoke.", ch, NULL, NULL, TO_ROOM );
    char_from_room( ch );
    char_to_room( ch, location );
    act( "$n materializes from a burst of blue flames.", ch, NULL, NULL, TO_ROOM );
    do_look( ch, "auto" );
    if ( ( mount = ch->mount ) == NULL ) return;
    char_from_room( mount );
    char_to_room( mount, ch->in_room );
    return;
}