mindor/area/
mindor/data/
mindor/data/bank/
mindor/data/hometown/
mindor/log/
mindor/player/
/***************************************************************************
 *  As the Wheel Weaves based on ROM 2.4. Original code by Dalsor, Caxandra,
 *	and Zy of AWW. See changes.log for a list of changes from the original
 *	ROM code. Credits for code created by other authors have been left
 *	intact at the head of each function.
 ***************************************************************************/


/**************************************************************************
*      Mindor 1.0 is copyright 2002-2004 by Shaun Mcbride                *
*      Portions of the code were inspired by other works                 *
*      found around the internet.                                        *
*                                                                        *
*      Please follow all previous copyrights and licenses.               *
**************************************************************************/



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

#define stc   send_to_char

/* Thanks to Kyndig and Sandi Fallon for assisting with arguments - Dalsor.
 * At the time I started on furnishings, I was about 12 hours straight into
 * the code and very brain dead. Thanks to them for pointing out my mistakes.
 */

/* Homes uses aspects of OLC, and it should be installed, or the necessary
 * componants installed in order for this to work
 */

/* Damn, this is a lot of defines :(
 * Each one of these vnums will need to be created. If this many items
 * aren't desired, removed the uneccesary ones and comment out the code
 */

RESET_DATA *new_reset_data args ( ( void ) );
void add_reset args ( ( ROOM_INDEX_DATA *room, RESET_DATA *loc_reset, int index ) );
void free_reset_data args ( ( RESET_DATA *pReset ) );
void home_buy ( CHAR_DATA *ch );
void home_sell ( CHAR_DATA *ch, char *argument );
void home_describe ( CHAR_DATA *ch );

void do_home ( CHAR_DATA *ch, char *argument )
{

    ROOM_INDEX_DATA *loc;
    AREA_DATA *loc_area;
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char arg3[MAX_INPUT_LENGTH];
	char buf[MSL];

	loc = ch->in_room;
	loc_area = ch->in_room->area;
	buf[0] = '\0';

	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	argument = one_argument( argument, arg3 );

	if ( IS_NPC(ch)
	|| ch == NULL )
		return;

	if ( arg1[0] == '\0' || !strcmp ( arg1, "list" ) )
	{
		stc("What about a home?\n\r",ch);
		stc("\n\rSyntax: Home (buy, sell, furnish, describe)\n\r",ch);
		stc("\n\rExtended:\n\rHome (buy, sell, furnish, describe)\n\r",ch);
		stc("Buy      (purchase a home in the room you are standing in)\n\r",ch);
		stc("Sell     (confirm - does not prompt for confirmation!)\n\r",ch);
		stc("Furnish  (allows purchases of items)\n\r",ch);
		stc("Describe (describe the room - uses the OLC editor)\n\r",ch);
		return;
	}
/*****************Disable MIndor Apartments Only Code, Maji 2003******	
	if ( !is_name( ch->in_room->area->file_name, "mhotel.are" ) )
	{
		stc("You aren't in Mindor Apartments.\n\r",ch);
		return;
	}
**********************************************************************/
	if ( !IS_SET ( loc->room_flags, ROOM_HOME ) )
	{
		stc("You cannot buy a home in this room.\n\r",ch);
		return;
	}

	/* Find out what the argument is, if any */
	if      ( !strcmp ( arg1, "buy" ) )        home_buy ( ch );
	else if ( !strcmp ( arg1, "sell" ) )       home_sell ( ch, arg2 );
	else if ( !strcmp ( arg1, "describe" ) )   home_describe ( ch );
	
	else
	{
		stc("No such Home Command. See HELP HOME for more informatio.\n\r",ch);
		return;
	}
	return;
}

void home_buy ( CHAR_DATA *ch )
{
    ROOM_INDEX_DATA *loc;
    AREA_DATA *loc_area;
	char buf[MSL];

	loc = ch->in_room;
	loc_area = ch->in_room->area;
	if ( loc->owner[0] == '\0' )
	{
		if ( ch->platinum < 250 )
		{
		stc("This command allows you to buy a home.\n\r",ch);
		stc("You must be standing in the room to buy.\n\r",ch);
		stc("You start with a blank, untitled room that is void of\n\r",ch);
		stc("furnishings and light. A single door allows entrance.\n\r",ch);
		stc("A home costs 250 PLATINUM. You must be carrying the coins.\n\r",ch);
		stc("\n\rSyntax: Home buy\n\r",ch);
		return;
		}
		else
		{
	    free_string ( loc->owner );
	    loc->owner = str_dup ( ch->name );
	    ch->platinum -= 250;
	    free_string ( loc->name );
	    sprintf ( buf, "%s's Home", ch->name );
	    loc->name = str_dup ( buf );
	    stc("Congratulations on purchasing your new home!\n\r",ch);
	    stc("You are now 250 platinum coins lighter and the owner\n\r",ch);
	    stc("of the room in which you now stand! Be sure to describe\n\r",ch);
	    stc("your home and purchase furnishings for it.\n\r",ch);
	    SET_BIT(loc_area->area_flags, AREA_CHANGED);
	    return;
		}
	}
	else
	{
		stc("This home is already owned.\n\r",ch);
		return;
	}
	return;
}

void home_sell ( CHAR_DATA *ch, char *argument )
{
    ROOM_INDEX_DATA *loc;
    AREA_DATA *loc_area;
	RESET_DATA *current_reset;
	RESET_DATA *next_reset;
    OBJ_DATA *furn;
    OBJ_DATA *furn_next;

	loc = ch->in_room;
	loc_area = ch->in_room->area;

	if ( !is_room_owner ( ch, loc ) )
	{
		stc("But you do not own this room!\n\r",ch);
		return;
	}
	if ( argument[0] == '\0' )
	{
		stc("This command allows you to sell your home.\n\r",ch);
		stc("You will no longer own your home once it is sold,\n\r",ch);
		stc("and you will be compensated half the cost of the home,\n\r",ch);
		stc("not including items you have purchased.\n\r",ch);
		stc("You must be standing in the room which you own.\n\r",ch);
		stc("\n\rSyntax: Home (sell) (confirm)\n\r",ch);
		return;
	}
	else if ( !strcmp ( argument, "confirm" ) )
	{
	    free_string ( loc->owner );
	    loc->owner = str_dup ( "" );
	    ch->platinum += 125;
	    free_string ( loc->name );
	    loc->name = str_dup ( "An Abandoned Home" );

	    if ( !ch->in_room->reset_first )
	    {
			return;
		}
		/* Thanks to Edwin and Kender for the help with killing
		 * resets. Pointed out some real problems with my handling
		 * of it. Thanks a bunch guys.
		 * This is the exact way Kender put it, and it works great!
		 */
		for( current_reset = ch->in_room->reset_first; current_reset;
		    current_reset = next_reset)
		{
		   next_reset = current_reset->next;
		   free_reset_data(current_reset);
		}

		ch->in_room->reset_first = NULL;

		for ( furn = ch->in_room->contents; furn != NULL; furn = furn_next )
		{
		    furn_next = furn->next_content;
	        extract_obj( furn );
		}
		stc("Your home has been sold and you are now 125 platinum coins richer!\n\r",ch);
        SET_BIT(loc_area->area_flags, AREA_CHANGED);
        return;
	}
	else
	{
		stc("This command allows you to sell your home.\n\r",ch);
		stc("You will no longer own your home once it is sold,\n\r",ch);
		stc("and you will be compensated half the cost of the home,\n\r",ch);
		stc("not including items you have purchased.\n\r",ch);
		stc("You must be standing in the room which you own.\n\r",ch);
		stc("\n\rSyntax: Home (sell) (confirm)\n\r",ch);
		return;
	}
}

void home_describe ( CHAR_DATA *ch )
{
    ROOM_INDEX_DATA *loc;
    AREA_DATA *loc_area;

	loc = ch->in_room;
	loc_area = ch->in_room->area;

	if ( !is_room_owner ( ch, loc ) )
	{
		stc("But you do not own this room!\n\r",ch);
		return;
	}
	else
	{
		stc("This command allows you to describe your home.\n\r",ch);
		stc("You should not describe items that are in the room,\n\r",ch);
		stc("rather allowing the furnishing of the home to do that.\n\r",ch);
		stc("If you currently own this room, you will be placed into.\n\r",ch);
		stc("the room editor. Be warned that while in the room editor,\n\r",ch);
		stc("you are only allowed to type the description. If you are\n\r",ch);
		stc("unsure or hesitant about this, please note the Immortals,\n\r",ch);
		stc("or better, discuss the how-to's with a Builder.\n\r",ch);
		stc("Syntax: Home (describe)\n\r",ch);
    	string_append( ch, &loc->description );
        SET_BIT(loc_area->area_flags, AREA_CHANGED);
		return;
	}

}