shadow/
shadow/data/command/
shadow/data/help/
shadow/data/religion/
shadow/data/skill/
/***************************************************************************
 *  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-1998 Russ Taylor                         *
*       ROM has been brought to you by the ROM consortium                  *
*           Russ Taylor (rtaylor@hypercube.org)                            *
*           Gabrielle Taylor (gtaylor@hypercube.org)                       *
*           Brian Moore (zump@rom.org)                                     *
*       By using this code, you have agreed to follow the terms of the     *
*       ROM license, in the file Rom24/doc/rom.license                     *
***************************************************************************/

/******************************************************************************
 *
 * Code all wrote, by Davion of ShadowStorm. (telnet://beyond.kyndig.com:5500 )
 * Z is depth, X is east to west, Y is north to south.
 *
 ******************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "include.h"

#define MIN_ALL 11

void		free_cord		args( (CHAR_DATA *ch) );
void		mine			args( (CHAR_DATA *ch, int mineral, ROOM_INDEX_DATA *pRoom ) );
bool		found_mineral	args( (CHAR_DATA *ch, ROOM_INDEX_DATA *pRoom, int mineral ) );
OBJ_DATA *	create_ore		args( (ROOM_INDEX_DATA *pRoom, int mineral ) );
void		shaft_to_mine	args( (SHAFT_DATA *pShaft, MINE_DATA *pMine, int x, int y, int z ) );
void    show_list_to_char       args( ( OBJ_DATA *list, CHAR_DATA *ch,
                                    bool fShort, bool fShowNothing ) );
void    show_char_to_char       args( ( CHAR_DATA *list, CHAR_DATA *ch ) ); 


int move_dir[6][3] = { {0, -1, 0 }, { 1, 0, 0 }, { 0, 1, 0 }, { -1, 0, 0 }, { 0, 0, -1 }, { 0, 0, 1 } };
int enter_cord[6][3] = { { 12, MAX_MINE_Y-1, 0 }, { 0, 12, 0 }, { 12, 0, 0 }, { MAX_MINE_X-1, 12, 0 }, { 0, 0, 0 }, { 12, 12, 0 } };

extern char *const dir_name[];

void do_mine( CHAR_DATA *ch, char *argument )
{
	ROOM_INDEX_DATA *pRoom;
	int mineral;

	pRoom = ch->in_room;

	if(argument[0] == '\0' )
	{   mine(ch, MIN_ALL, pRoom );
		return;
	}

	if( ( mineral = mineral_lookup(argument) ) == -1 )
	{
		send_to_char("What type of mineral is that!?\n\r",ch);
		return;
	}

	mine(ch, mineral, pRoom );
	return;
}

void mine( CHAR_DATA *ch, int mineral, ROOM_INDEX_DATA *pRoom )
{
	if(!IS_NPC(ch) && !IN_MINE(ch) )
	{	send_to_char("You must be in a mine!\n\r",ch);
		return;
	}
	switch (mineral)
	{
		case MIN_ALL:
			printf_to_char(ch, "You begin mining for all minerals.\n\r");
			WAIT_STATE(ch, 16*PULSE_PER_SECOND );
			found_mineral(ch, pRoom, MIN_ALL );
			break;
		default:
			printf_to_char(ch, "You begin searching for %s.\n\r", mineral_table[mineral].name );
			WAIT_STATE(ch, 16*PULSE_PER_SECOND );
			found_mineral(ch, pRoom, mineral );
			break;
	}
}

bool found_mineral(CHAR_DATA *ch, ROOM_INDEX_DATA *pRoom, int mineral )
{
	int i;
	char buf[MSL];
	OBJ_DATA *ore;

	if(mineral == MIN_ALL )
	{
		wait_act(2, "You bang your tools vigorously against the ground, trying to find some minerals.", ch, NULL, NULL, TO_CHAR );
		wait_act(6, "You wipe the sweat from your brow, as the work becomes strenuous.",ch, NULL, NULL, TO_CHAR );
		for( i = 0; mineral_table[i].name != NULL; i++ )
		{
			if(pRoom->mineral[i] <= 0 )
				continue;
			if(number_range(0, 100 ) < pRoom->mineral[i] )
			{	sprintf(buf, "You found some %s.", mineral_table[i].name );
				wait_act(8, buf, ch, NULL, NULL, TO_CHAR );
				ore = create_ore(pRoom, i );
				obj_to_char(ore, ch);
				return TRUE;
			}
		}
		wait_act(8, "Your search for minerals has turned up fruitless.", ch, NULL, NULL, TO_CHAR );
		return FALSE;
	}
	if(pRoom->mineral[mineral] <= 0 )
	{	wait_act(3, "You bang your tools vigorously against the ground, trying to find some minerals.", ch, NULL, NULL, TO_ROOM );
		wait_act(5, "You didn't find a hint of the mineral", ch, NULL, NULL, TO_CHAR );
		ch->wait = 0;
		return FALSE;
	}

	wait_act(3, "You bang your tools vigorously against the ground, trying to find the mineral.", ch, NULL, NULL, TO_CHAR );
	wait_act(6, "You wipe the sweat from your brow, as the work becomes strenuous.",ch, NULL, NULL, TO_CHAR );
	if(number_range(0, 100 ) < pRoom->mineral[mineral] )
	{	sprintf(buf, "You found some %s", mineral_table[mineral].name );
		wait_act(8, buf, ch, NULL, NULL, TO_CHAR );
		return TRUE;
	}
	wait_act(8, "Your search for minerals has turned up fruitless.", ch, NULL, NULL, TO_CHAR );
	return FALSE;
}


OBJ_DATA *create_ore(ROOM_INDEX_DATA *pRoom, int mineral )
{
	OBJ_DATA *pObj;
	char buf[MSL];
	int weight;
	char size[MSL];

	pObj = create_object(get_obj_index(OBJ_VNUM_ORE), 0 );
	free_string(pObj->name);
	free_string(pObj->short_descr);
	free_string(pObj->description);
	sprintf(buf, "ore %s", mineral_table[mineral].name );
	pObj->name = str_dup(buf );
	
	weight = number_range(0, pRoom->mineral[mineral]);
	if(weight > 15 )
		weight /= 2;
	if(weight <= 2) sprintf(size, "tiny");
	else if(weight <= 5 ) sprintf(size, "small" );
	else if(weight <= 15 ) sprintf(size, "nice" );
	else if(weight <= 30 ) sprintf(size, "descent" );
	else if(weight <= 50 ) sprintf(size, "big" );
	else if(weight <= 80  ) sprintf(size, "large" );
	else sprintf(size, "huge" );
	
	sprintf(buf, "a %s piece of %s ore", size, mineral_table[mineral].name );
	pObj->short_descr = str_dup(buf);
	pObj->description = str_dup(buf);
	pObj->weight = weight;
	pObj->value[0] = mineral;
	return pObj;

}

void move_char_mine(CHAR_DATA *ch, int door )
{
	ROOM_INDEX_DATA *pRoom;
	SHAFT_DATA *pShaft;
	char buf[MSL];
	pRoom = ch->in_room;

	if(IS_NPC(ch) )
	{	send_to_char("A mine is no place for a mob.\n\r",ch);
		return;
	}

	if( (pShaft = ch->pcdata->in_shaft ) == NULL )
	{	logf2("BUG: %s is moving around without a shaft!",ch->name );
		return;
	}
	
	if( !pShaft->exit[door] || !pShaft->exit[door]->to_shaft)
	{	send_to_char("Alas, you cannot go that way.\n\r",ch);
		return;
	}
	if(ch->pcdata->cordinate[CORD_X] == enter_cord[door][CORD_X] &&
		ch->pcdata->cordinate[CORD_Y] == enter_cord[door][CORD_Y] &&
		ch->pcdata->cordinate[CORD_Z] == 0 &&
		door == DIR_UP )
	{   char_from_mine(ch);
		return;
	}
	sprintf(buf, "$n leaves %s.", dir_name[door] );
	act(buf, ch, NULL, NULL, TO_ROOM);
	ch->pcdata->in_shaft = ch->pcdata->in_shaft->exit[door]->to_shaft;
	ch->pcdata->cordinate[CORD_X] += move_dir[door][CORD_X];
	ch->pcdata->cordinate[CORD_Y] += move_dir[door][CORD_Y];
	ch->pcdata->cordinate[CORD_Z] += move_dir[door][CORD_Z];
	sprintf(buf, "$n arrives from %s.", rev_move[door] );
	act(buf, ch, NULL, NULL, TO_ROOM );
	do_function( ch, &do_look, "mine" );
}

void put_char_mine( CHAR_DATA *ch, EXIT_DATA *pexit )
{	
	char buf[MSL];
	if(IS_NPC(ch) )
	{	send_to_char("A mine is no place for a mob.\n\r",ch);
		return;
	}

	if(!pexit->mine->shaft_first)
	{	send_to_char("Alas, you cannot go that way.\n\r",ch );
		return;
	}

	if(MOUNTED(ch)  )
	{   send_to_char("Dismount -then- enter the mine!\n\r",ch);
	    return;
	}

	if(ch->master)
	{   send_to_char("And hide from your beloved master?\n\r",ch);
		return;
	}
	sprintf(buf, "$n enters the mine %sward", dir_name[pexit->orig_door] );
	act(buf, ch, NULL, NULL, TO_ROOM );
	ch->pcdata->in_shaft = pexit->to_shaft;
	ch->pcdata->in_mine = pexit->mine;
	ch->pcdata->cordinate[CORD_X] = enter_cord[pexit->orig_door][CORD_X];
	ch->pcdata->cordinate[CORD_Y] = enter_cord[pexit->orig_door][CORD_Y];
	ch->pcdata->cordinate[CORD_Z] = 0;
	sprintf(buf, "$n enters the mine from %s", rev_move[pexit->orig_door]);
	act(buf, ch, NULL, NULL, TO_ROOM );
	do_function( ch, &do_look, "mine" );
}

void char_from_mine( CHAR_DATA *ch )
{	
	exit_mine(ch);
	do_function(ch, &do_look, "auto");
}

void exit_mine( CHAR_DATA *ch )
{
	ch->pcdata->in_shaft = NULL;
	free_cord(ch);
	ch->in_room = ch->pcdata->in_mine->entrance;
	ch->pcdata->in_mine = NULL;
}

void free_cord(CHAR_DATA *ch)
{
	int i;
	if(!ch)
		return;
	if(IS_NPC(ch) )
		return;
	for( i= 0 ; i < 3 ; i ++ )
		ch->pcdata->cordinate[i] = 0;
	return;
}

int dir_lookup (const char *name)
{
    int door;

    for (door = 0; door < 6 ; door++ )
    {
        if (LOWER(name[0]) == LOWER(dir_name[door][0])
        &&  !str_prefix(name,dir_name[door]))
            return door;
    }

    return -1;
}

void do_build( CHAR_DATA *ch, char *argument )
{	char arg[MSL], arg2[MSL];
	int door, new_x, new_y, new_z;
	ROOM_INDEX_DATA *pRoom;
	EXIT_DATA *pExit;
	MINE_DATA *pMine;
	SHAFT_DATA *pShaft, *nShaft;
	bool found = FALSE;

	arg[0] = '\0';
	arg2[0] = arg[0];

	if(IS_NPC(ch) )
	{	send_to_char("I dun think so!\n\r",ch);
		return;
	}

	if( ( pRoom = ch->in_room ) == NULL )
	{	send_to_char("You arn't in a room! Run!\n\r",ch);
		return;
	}
	
	if(!IS_SET(pRoom->room_flags, ROOM_MINE ) )
	{	send_to_char("You cannot build a mine here.\n\r",ch);
		return;
	}

	argument = one_argument(argument, arg);
	argument = one_argument(argument, arg2);

	if(arg[0] == '\0' || arg2[0] == '\0' )
	{	send_to_char("Syntax: build <shaft|entrance|link> <direction>\n\r",ch);
		return;
	}

	if( ( door = dir_lookup(arg2) ) == -1 )
	{	send_to_char("What type of direction is that?\n\r",ch);
		return;
	}

	if(!str_cmp(arg, "entrance" ) )
	{	if(IN_MINE(ch) )
		{	send_to_char("You can't build an entrance to a mine that your in!\n\r",ch);
			return;
		}
		if(door == DIR_UP )
		{	send_to_char("You can't mine upwards!\n\r",ch);
			return;
		}
		pMine = ch->pcdata->in_mine;
		
		if( (pExit = pRoom->exit[door] ) != NULL )
		{	send_to_char("There is already something in that direction.\n\r",ch);
			return;
		}
		new_x									= enter_cord[door][CORD_X]; 
		new_y									= enter_cord[door][CORD_Y];
		new_z									= 0;
		
		send_to_char("Mine created\n\r",ch);

		pExit									= new_exit();
		pMine									= new_mine();
		pShaft									= new_shaft();




		pExit->orig_door						= door;
		
	
		pShaft->desc							= str_dup("This is the entrance to a mine.\n\r");
		pShaft->exit[rev_dir[door]]				= new_exit();
		pShaft->exit[rev_dir[door]]->u1.to_room = pRoom;
		pShaft->exit[rev_dir[door]]->orig_door	= rev_dir[door];
		pShaft->cord[CORD_X]					= enter_cord[door][CORD_X];
		pShaft->cord[CORD_Y]					= enter_cord[door][CORD_Y];
		pShaft->cord[CORD_Z]					= 0;
		pMine->shaft_first						= pShaft;
		pMine->entrance							= pRoom;
		pExit->to_shaft							= pShaft;
		pExit->mine								= pMine;
		pRoom->exit[door]						= pExit;
		shaft_to_mine(pShaft, pMine, new_x, new_y, new_z );
		
		return;
	}
	if(!str_cmp(arg, "shaft" ) )
	{	if(!IN_MINE(ch) )
		{	send_to_char("If you want to build a new mine, try building an entrance\n\r",ch);
			return;
		}
		pMine = ch->pcdata->in_mine;
		if( ( pShaft = ch->pcdata->in_shaft ) == NULL )
		{	send_to_char("You arn't in a shaft! Tell an Imm.\n\r",ch);
			return;
		}

		new_x = ch->pcdata->cordinate[CORD_X] + move_dir[door][CORD_X];
		new_y = ch->pcdata->cordinate[CORD_Y] + move_dir[door][CORD_Y];
		new_z = ch->pcdata->cordinate[CORD_Z] + move_dir[door][CORD_Z];
		if(new_x >= MAX_MINE_X || new_y >= MAX_MINE_Y || new_z >= MAX_MINE_Z ||
		   new_x < 0 || new_y < 0 || new_z < 0 )
		{	send_to_char("You can't build anymore in that direction!\n\r",ch);
			return;
		}
		if( pMine->map[new_x][new_y][new_z] != 0 )
		{	send_to_char("There is already something in that direction, if you wish to link it, be my guest.\n\r",ch);
			return;
		}

		send_to_char("Shaft created\n\r",ch);
		pExit				= new_exit();
		pExit->orig_door	= door;
		nShaft				= new_shaft();

		nShaft->exit[rev_dir[door]]				= new_exit();
		nShaft->exit[rev_dir[door]]->to_shaft	= pShaft;
		nShaft->exit[rev_dir[door]]->orig_door	= rev_dir[door];
		nShaft->desc = str_dup("This is a shaft in the mine.\n\r" );
		
		nShaft->cord[CORD_X] = new_x;
		nShaft->cord[CORD_Y] = new_y;
		nShaft->cord[CORD_Z] = new_z;
		
		pExit->to_shaft		= nShaft;
		pShaft->exit[door]	= pExit;

		shaft_to_mine(nShaft, pMine, new_x, new_y, new_z );
		return;
	}
	if(!str_cmp(arg, "link" )  )
	{	if(!IN_MINE(ch) )
		{	send_to_char("You gotta be in a mine!\n\r",ch);
			return;
		}

		if( (pShaft = ch->pcdata->in_shaft ) == NULL )
		{	send_to_char("You arn't in a shaft! Tell an Imm.\n\r",ch);
			return;
		}
		pMine = ch->pcdata->in_mine;
		new_x = ch->pcdata->cordinate[CORD_X] + move_dir[door][CORD_X];
		new_y = ch->pcdata->cordinate[CORD_Y] + move_dir[door][CORD_Y];
		new_z = ch->pcdata->cordinate[CORD_Z] + move_dir[door][CORD_Z];
		if(new_x >= MAX_MINE_X || new_y >= MAX_MINE_Y || new_z >= MAX_MINE_Z ||
		   new_x < 0 || new_y < 0 || new_z < 0 )
		{	send_to_char("You can't build anymore in that direction!\n\r",ch);
			return;
		}

		if(pMine->map[new_x][new_y][new_z] == 0 )
		{	send_to_char("You can't link to something that doesn't exist!\n\r",ch);
			return;
		}
		if(pShaft->exit[door] && (pShaft->exit[door]->to_shaft || pShaft->exit[door]->u1.to_room ) )
		{	send_to_char("There is already a link in that direction.\n\r",ch);
			return;
		}
		for( nShaft = pMine->shaft_first ; nShaft ; nShaft = nShaft->next )
			if(new_x == nShaft->cord[CORD_X] && new_y == nShaft->cord[CORD_Y] && new_z == nShaft->cord[CORD_Z] )
			{	found = TRUE;
				break;
			}

		if(!found)
		{	send_to_char("It seems there isn't a room where you say there is, but there isn't. Sooo IMMMY!!!!\n\r",ch);
			return;
		}
		nShaft->exit[rev_dir[door]] = new_exit();
		nShaft->exit[rev_dir[door]]->to_shaft = pShaft;
		nShaft->exit[rev_dir[door]]->orig_door = rev_dir[door];		
		pExit = new_exit();
		pExit->orig_door = door;
		pExit->to_shaft = nShaft;
		pShaft->exit[door] = pExit;
		send_to_char("Link established.\n\r",ch);
		return;
	}
	return;
}


MINE_DATA *mine_free;

MINE_DATA *new_mine(void)
{
    static MINE_DATA mine_zero;
    MINE_DATA *mine;
	int i, x, y, z;

    if (mine_free == NULL)
        mine = (MINE_DATA *)alloc_perm(sizeof(*mine));
    else
    {
        mine = mine_free;
        mine_free = mine_free->next;
    }

    *mine = mine_zero;
    VALIDATE(mine);
	mine->name = str_dup("New Mine");
	mine->shaft_first = NULL;
	for(i = 0; i < MAX_MINERALS ; i++ )
		mine->mineral[i] = 0;
	for(x = 0; x < MAX_MINE_X; x++ )
		for(y = 0; y < MAX_MINE_Y; y++ )
			for(z = 0; z < MAX_MINE_Z; z++ )
				mine->map[x][y][z] = 0;

    return mine;
}

void shaft_to_mine(SHAFT_DATA *pShaft, MINE_DATA *pMine, int x, int y, int z )
{	pMine->map[x][y][z] = 1;
	if(pMine->shaft_last )
		pMine->shaft_last->next = pShaft;
	pMine->shaft_last = pShaft;
	
	if(!pMine->shaft_first )
		pMine->shaft_first = pShaft;
	return;
}

SHAFT_DATA *get_shaft_cord(MINE_DATA *pMine, int new_x, int new_y, int new_z )
{
	SHAFT_DATA *nShaft;

	for( nShaft = pMine->shaft_first ; nShaft ; nShaft = nShaft->next )
		if(new_x == nShaft->cord[CORD_X] && new_y == nShaft->cord[CORD_Y] && new_z == nShaft->cord[CORD_Z] )
			return nShaft;
			
	return NULL;
}
void free_mine(MINE_DATA *mine)
{
    if (!IS_VALID(mine))
        return;

    INVALIDATE(mine);
    mine->next = mine_free;
    mine_free = mine;
}

SHAFT_DATA *shaft_free;

SHAFT_DATA *new_shaft(void)
{
    static SHAFT_DATA shaft_zero;
    SHAFT_DATA *shaft;
	int i;

    if (shaft_free == NULL)
        shaft = (SHAFT_DATA *)alloc_perm(sizeof(*shaft));
    else
    {
        shaft = shaft_free;
        shaft_free = shaft_free->next;
    }

    *shaft = shaft_zero;
    VALIDATE(shaft);
	shaft->parts = 0;
	free_string(shaft->desc);
	for( i = 0; i < MAX_MINERALS; i++ )
		shaft->mineral[i] = 0;
	for(i = 0; i < 3; i++ )
		shaft->cord[i] = -1;
    return shaft;
}

void free_shaft(SHAFT_DATA *shaft)
{
    if (!IS_VALID(shaft))
        return;

    INVALIDATE(shaft);
    shaft->next = shaft_free;
    shaft_free = shaft;
}

void look_mine(CHAR_DATA *ch )
{
	SHAFT_DATA *pShaft = ch->pcdata->in_shaft;
	int door, i=0, x, y, x_map = 8, y_map = 6,sx,sy,linenum = 1;
	char buf[MSL*2], mine_map[y_map+1][MSL];
	bool found = FALSE;

	buf[0] = '\0';
	for(x = 0; x < y_map ;x++ )
		mine_map[x][0] = '\0';

	if(!pShaft)
	{	send_to_char("You arn't in a shaft.\n\r",ch);
		return;
	}
	sprintf(buf, "%s", pShaft->desc );
	sx = ch->pcdata->cordinate[CORD_X] - (x_map/2);
	sy = ch->pcdata->cordinate[CORD_Y] - (y_map/2);
	if(sx >= MAX_MINE_X ) sx = MAX_MINE_X;
	if(sx < 0		    ) sx = 0;
	if(sy >= MAX_MINE_Y ) sy = MAX_MINE_Y;
	if(sy < 0		    ) sy = 0;
	for(y = sy; y <= sy+y_map; y++, i++ )
	{	for(x = sx; x <= sx+x_map ; x++ )
		{   
			if(ch->pcdata->in_mine->map[x][y][ch->pcdata->cordinate[CORD_Z]] == 0 )
			{   strcat(mine_map[i], " " );
				continue;
			}
			if(x == ch->pcdata->cordinate[CORD_X] && y == ch->pcdata->cordinate[CORD_Y] )
			{	strcat(mine_map[i], "{RX{x" );
				continue;
			}
			strcat(mine_map[i], "*" );
		}
	}

	send_to_char( "{r+{D-----------{r+{c   Within a Mine{x\n\r",ch);
	printf_to_char(ch, "{D|{x %s {D%-4s{x   ", mine_map[0], "|" );

	for(i = 0; ;i++)
	{	if(buf[i] == '\0' )
			break;
		if(buf[i] == '\r' )
		{	printf_to_char(ch, "%c", buf[i]);
			if(linenum == y_map )
				send_to_char("\n\r{r+{D-----------{r+{x",ch);
			if(linenum >= y_map )
				continue;
			printf_to_char(ch, "{D|{x %s {D%-4s{x", mine_map[linenum], "|" );
			linenum++;	
			continue;
		}
		printf_to_char(ch, "%c", buf[i]);
	}

	if(linenum < y_map )
	{	for(i = linenum ; i < y_map ; i++ )
			printf_to_char(ch, "\n\r{D|{x %s {D|{x", mine_map[i]);
		send_to_char("\n\r{r+{D-----------{r+{x",ch);
	}
	sprintf(buf, "\n\r{r[{DExits:{x");

	for(door = 0; door < 6 ; door++ )
	{	if(pShaft->exit[door] && 
		(pShaft->exit[door]->u1.to_room || 
		 pShaft->exit[door]->to_shaft ) )
		{	found = TRUE;
			strcat(buf, " " );
			if(pShaft->exit[door]->u1.to_room )
				strcat(buf, "{ROutside{w-{x");
			strcat(buf, dir_name[door] );
		}
	}

	if(!found)
		strcat(buf, "none");
	strcat(buf, "{r]{x\n\r" );
	send_to_char(buf, ch);
	show_list_to_char(ch->in_room->contents, ch, FALSE, FALSE );
	show_char_to_char(ch->in_room->people, ch );
	return;
}

void fwrite_mine(EXIT_DATA *pExit, FILE *fp )
{
	SHAFT_DATA *pShaft;
	int i;
	MINE_DATA *pMine = pExit->mine;
	EXIT_DATA *exit;

	fprintf(fp, "Mine\n" );
	fprintf(fp, "Name %s~\n", pMine->name );
	fprintf(fp, "Door %d\n", pExit->orig_door );


	for(pShaft = pMine->shaft_first ; pShaft ; pShaft = pShaft->next )
	{	fprintf(fp, "Shaft\n" );
		fprintf(fp, "Cord %d %d %d\n", pShaft->cord[CORD_X], pShaft->cord[CORD_Y], pShaft->cord[CORD_Z]);
		fprintf(fp, "Desc %s~\n",pShaft->desc );
		fprintf ( fp, "X " );

		for( i = 0; i < MAX_MINERALS ; i++ )
			fprintf(fp, "%d ", pMine->entrance->mineral[i] );
		
		fprintf(fp, "\n" );
		fprintf(fp, "Flags %s~\n", print_flags(pShaft->parts ) );
		
		for( i = 0; i < 6; i++ )
		{	if( !( exit = pShaft->exit[i] ) || (!exit->u1.to_room && !exit->to_shaft) )
				continue;
			
			fprintf(fp, "Exit\n" );
			fprintf(fp, "%d\n", exit->orig_door );			
			if(exit->to_shaft)
				fprintf(fp, "ToCord %d %d %d\n", exit->to_shaft->cord[CORD_X], exit->to_shaft->cord[CORD_Y], exit->to_shaft->cord[CORD_Z] );
			else				
				fprintf(fp, "ToVnum %d\n", exit->u1.vnum );

		}
		fprintf(fp, "ENDSHAFT\n");
	}
	fprintf(fp, "End\n\n" );
}

void fread_mine( ROOM_INDEX_DATA *pRoom, FILE *fp )
{
	const char *word;
	MINE_DATA *pMine;
	SHAFT_DATA *pShaft;
	EXIT_DATA *pExit;
	int i, door, door_to;
	for( ;; )
	{
		word = feof (fp) ? "End" : fread_word (fp);
		if(word[0] == '$' )
			return;
		switch (UPPER(word[0] ))
		{
			case 'C':
				if(!str_cmp(word, "Cord" ) )
				{	if(!pShaft )
					{	logf2("BUG: fread_mine- Reading cordinate without a shaft.");
						return;
					}
					pShaft->cord[CORD_X] = fread_number(fp);
					pShaft->cord[CORD_Y] = fread_number(fp);
					pShaft->cord[CORD_Z] = fread_number(fp);
				}
				break;
			case 'D': 
				if(!str_cmp(word, "Desc" ) )
				{	pShaft->desc = fread_string(fp );
					break;
				}
				if(!str_cmp(word, "Door" ) )
				{	door_to = fread_number(fp);
					break;
				}
				break;
			case 'F': pShaft->parts = fread_flag(fp );
					break;
			case 'E':
				if(!str_cmp(word, "Exit" ) )
				{	pExit = new_exit();
					door = fread_number(fp );

					pExit->mine = pMine;
					pExit->orig_door = door;
					word = fread_word(fp);
					if(!str_cmp(word, "ToVnum" ) )
						pExit->u1.vnum = fread_number(fp);
					else if(!str_cmp( word, "ToCord" ) )
						for(i=0;i<3;i++)
							pExit->cord[i] = fread_number(fp );
					pShaft->exit[door] = pExit;
					
					break;
				}
				if(!str_cmp(word, "End" ) )
				{   pRoom->exit[door_to] = new_exit();
					pRoom->exit[door_to]->mine = pMine;
					pRoom->exit[door_to]->orig_door = door_to;
					pRoom->exit[door_to]->to_shaft = pMine->shaft_first;
					return;
				}
				
				if(!str_cmp(word, "ENDSHAFT" ) )
				{	shaft_to_mine(pShaft, pMine, pShaft->cord[CORD_X], pShaft->cord[CORD_Y], pShaft->cord[CORD_Z] );
					
					break;
				}
				break;


			case 'N': pMine = new_mine();
					  pMine->name = fread_string(fp );
					  pMine->entrance = pRoom;
					  break;
			case 'S': 
				if(!str_cmp(word, "Shaft" ) )
				{	
					pShaft = new_shaft();
					break;
				}
				break;
			case 'X':
				for(i=0;i < MAX_MINERALS ; i++ )
					pShaft->mineral[i] = fread_number(fp);
				break;
		}

	}

			

	return;
}