player/a/
player/b/
player/c/
player/d/
player/e/
player/f/
player/g/
player/i/
player/j/
player/k/
player/m/
player/n/
player/r/
player/s/
player/v/
player/w/
player/x/
player/z/
player_fst/e/
player_fst/f/
player_fst/h/
player_fst/i/
player_fst/j/
player_fst/n/
player_fst/o/
player_fst/p/
player_fst/player/a/
player_fst/player/b/
player_fst/player/c/
player_fst/player/d/
player_fst/player/e/
player_fst/player/f/
player_fst/player/g/
player_fst/player/j/
player_fst/player/k/
player_fst/player/m/
player_fst/player/n/
player_fst/player/r/
player_fst/player/s/
player_fst/player/v/
player_fst/player/w/
player_fst/player/x/
player_fst/player/z/
player_fst/u/
player_fst/v/
player_fst/w/
player_fst/x/
/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 ~  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.                              ~
 ~                                                                         ~
 ~  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              ~
 ~  ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~
 ~                                                                         ~
 ~  In order to use any part of this  PA  Diku Mud, you must comply with   ~
 ~  both the original Diku license in 'license.doc' as well the Merc       ~
 ~  license in 'license.txt', and the Ack!Mud license in 'ack_license.txt'.~
 ~  In particular, you may not remove any of these copyright notices.      ~
 ~                                                                         ~
 ~           _______      _____                                            ~
 ~          /  __  /\    / ___ \       222222        PA_MUD by Amnon Kruvi ~
 ~         /______/ /   / /___\ \            2       PA_MUD is modified    ~
 ~        / _______/   / _______ \           2       Ack!Mud, v4.3         ~
 ~       /_/          /_/       \_\        2                               ~
 ~                                      2                                  ~
 ~                                     2222222                             ~
 ~                                                                         ~
 ~                                                                         ~
 ~   Years of work have been invested to create DIKU, Merc, Ack and PA.    ~
 ~   Please show your respect by following the licenses, and issuing       ~
 ~   credits where due.                                                    ~
 ~                                                                         ~
 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include "ack.h"
#define NOWHERE -1
bool    check_valid_ride ( CHAR_DATA *  ch );
char *  const	compass_name	[]		=
{
    "north", "east", "south", "west", "up", "down"
};

char *  const   dir_name        []              =
{
    "to the North", "to the East", "to the South", "to the West", "Up", "Down"
};

char *  const   dir_name_2      []              =
{
    "the north", "the east", "the south", "the west", "above", "below"
};

/* rev_name used to indicate where ch has come from when entering -S- */

char * const    rev_name        []              =
{
   "the South", "the West", "the North", "the East", "Below", "Above"
};


const   sh_int  rev_dir         []              =
{
    2, 3, 0, 1, 5, 4
};

const   sh_int  movement_loss   [SECT_MAX]      =
{
    1, 3, 4, 2, 5, 2, 2, 1, 1, 1, 4, 1, 1,
};



/*
 * Local functions.
 */
int     find_door       args( ( CHAR_DATA *ch, char *arg ) );
bool    has_key         args( ( CHAR_DATA *ch, int key ) );
/*
struct fol_data
{
  struct fol_data *next;
  CHAR_DATA *ch;
};

struct fol_data *fol_stack;
struct fol_data *fol_free;

*/

void move_char( CHAR_DATA *ch, int door )
{
    CHAR_DATA *fch;
    CHAR_DATA *fch_next;
    char buf[MAX_STRING_LENGTH];
    char move_buf[MAX_STRING_LENGTH];
    char tmp[MAX_STRING_LENGTH];
    char door_name_leave[MSL];
    OBJ_DATA *obj;
    BUILDING_DATA *bld = ch->in_building;
    int xx,yy,x,y,z=ch->z;
    bool from_bld = FALSE;
    int movea = 1;     	
	
    buf[0] = '\0';
    move_buf[0] = '\0';
    door_name_leave[0] = '\0';
    door_name_leave[0] = '\0';
    tmp[0] = '\0';

    if ( !ch || ch == NULL )
	return;
    if ( ch->c_sn == gsn_move )
	ch->c_sn = -1;
    if ( ch->in_vehicle )
    {
	if ( AIR_VEHICLE(ch->in_vehicle->type) && z != Z_AIR )
	{
		send_to_char( "@@gYou must @@elift@@g up in order to fly the aircraft.@@N\n\r", ch );
		return;
	}
	if (SPACE_VEHICLE(ch->in_vehicle->type) && z != Z_SPACE_EARTH )
	{
		send_to_char( "@@gYou must @@elift@@g up in order to fly the spaceship.@@N\n\r", ch );
		return;
	}
    }
    if ( IS_SET(ch->pcdata->pflags,PLR_ASS) )
    {
	move(ch,1,1,0);
	do_look(ch,"");
	return;
    }

    xx = ch->x;
    yy = ch->y;
    if ( door < 0 || door > 3 )
    {
	bug( "Do_move: bad door %d.", door );
	return;
    }
    if ( IS_SET(ch->effect,EFFECT_CONFUSE) && number_percent() < 50 )
	door = number_range(0,3);
    
    if ( ch->carry_weight > can_carry_w( ch ) && !ch->in_vehicle )
    {
	send_to_char( "You are carrying too much weight!\n\r", ch);
	return;
    }
    if ( ch->carry_number > can_carry_n(ch) )
    {
	send_to_char( "You are carrying too many items.\n\r", ch );
	return;
    }

	if ( ch->in_building )
		from_bld = TRUE;
	if ( ch->in_vehicle )
	{
		if ( continual_flight(ch->in_vehicle) )
		{
			ch->c_sn = -1;
			ch->c_level = door;
		}
		else if ( IS_SET(ch->effect,EFFECT_DRUNK) && number_percent() < 33 )
		{
			send_to_char( "You swirve around in circles.. FUN!\n\r", ch );
			return;
		}
		if ( ch->c_sn == gsn_row )
		{
			ch->c_sn = -1;
			ch->in_vehicle->fuel = 1;
		}
		if ( ch->in_vehicle->fuel <= 0 )
		{
			send_to_char( "You are out of fuel.\n\r", ch );
			if ( AIR_VEHICLE(ch->in_vehicle->type) )
			{
				crash(ch,ch);
				return;
			}
			else if ( IS_SET(ch->in_vehicle->flags,VEHICLE_SWIM) )
			{
				ch->c_sn = gsn_row;
				ch->c_level = door;
				ch->c_time = 15 * PULSE_PER_SECOND;
				send_to_char( "You begin rowing with your hands!\n\r", ch );
			}
			return;
		}
	}
	{
		BUILDING_DATA *bld;
		bld = get_char_building(ch);
		if ( bld != NULL && bld && bld->exit[door] == FALSE && complete(bld) && ch->class != CLASS_PHASER)
		{
			send_to_char( "You cannot exit this way.\n\r", ch );
			if ( my_get_hours(ch,TRUE) == 0 )
				send_to_char( "@@WTIP: You can add more exits to buildings using the @@eMAKE@@W command. Example: make east@@N\n\r", ch );
			return;
		}
		
}

	if ( door == DIR_NORTH )
			ch->y += movea;
	else if ( door == DIR_EAST )
			ch->x += movea;
	else if ( door == DIR_SOUTH )
			ch->y -= movea;
	else if ( door == DIR_WEST )
			ch->x -= movea;
	else
		return;
	real_coords(&ch->x,&ch->y);

	bld = get_building(ch->x,ch->y,z);

	if ( ch->in_vehicle != NULL )
	{
		if ( !bld && (map_table.type[ch->x][ch->y][z] == SECT_WATER || map_table.type[ch->x][ch->y][z] == SECT_OCEAN) && !IS_SET(ch->in_vehicle->flags,VEHICLE_FLOATS) && !IS_SET(ch->in_vehicle->flags,VEHICLE_SWIM))
		{
			send_to_char( "You can't drive over water.\n\r", ch );
			ch->x = xx;
			ch->y = yy;
			return;
		}
	}
	if ((map_table.type[ch->x][ch->y][z] == SECT_NULL || map_table.type[ch->x][ch->y][z] == SECT_OCEAN || INVALID_COORDS(ch->x,ch->y) || ( bld && (!bld->active || (bld->protection > 0 && ch->in_building == NULL && str_cmp(bld->owned,ch->name) ) )) || ( bld && ch->in_vehicle != NULL && !from_bld && bld->type != BUILDING_GARAGE && bld->type != BUILDING_AIRFIELD && bld->type != BUILDING_SHIPYARD)))
	{
		bool cancel = FALSE;
		if ( ch->in_vehicle && AIR_VEHICLE(ch->in_vehicle->type) )
		{
			act( "You hit a wall!", ch, NULL, NULL, TO_CHAR );
			if ( z == Z_AIR )
				z = Z_GROUND;
			x = ch->x;
			y = ch->y;
			ch->x = xx;
			ch->y = yy;
			move(ch,x,y,z);
			crash(ch,ch);
			return;
		}
		else
		{
			if ( map_table.type[ch->x][ch->y][ch->z] == SECT_NULL || INVALID_COORDS(ch->x,ch->y) )
				send_to_char( "You cannot go that way.\n\r", ch );
			else if ( map_table.type[ch->x][ch->y][ch->z] == SECT_OCEAN )
			{
				if ( has_boat(ch) )
					cancel = TRUE;
				else
					send_to_char( "You need some way to cross the water!\n\r", ch );
			}
			else if ( bld && ch->in_vehicle != NULL )
				send_to_char( "You can't enter it while driving!\n\r", ch );
			else if ( bld && bld->protection > 0 )
				send_to_char( "This building is protected.\n\r", ch );
			else 
			{
				sprintf( buf, "You cannot enter %s's property while they are offline.\n\r", bld->owned );
				send_to_char(buf,ch);
			}
		}
		if ( !cancel )
		{
			ch->x = xx;
			ch->y = yy;
			return;
		}
	}
	if ( ch->in_vehicle )
		if ( IS_SET(ch->in_vehicle->flags,VEHICLE_SWIM) )
			if ( map_table.type[ch->x][ch->y][ch->z] != SECT_OCEAN && map_table.type[ch->x][ch->y][ch->z] != SECT_WATER 
			  && map_table.type[xx][yy][ch->z] != SECT_OCEAN && map_table.type[xx][yy][ch->z] != SECT_WATER
			)
			{
				send_to_char( "You cannot take it on land.\n\r", ch );
				ch->x = xx; ch->y = yy;
				return;
			}

	if ( bld )
	{
		int reverse = 1;
		if ( door == DIR_NORTH )
			reverse = DIR_SOUTH;
		if ( door == DIR_EAST )
			reverse = DIR_WEST;
		if ( door == DIR_SOUTH )
			reverse = DIR_NORTH;
		if ( door == DIR_WEST )
			reverse = DIR_EAST;

		if ( bld->exit[reverse] == FALSE && complete(bld) && ch->class != CLASS_PHASER)
		{
			send_to_char( "You cannot enter the building from that direction.\n", ch );
			ch->x = xx;
			ch->y = yy;
	
			return;
		}
	}
	if ( ch->in_vehicle )
	{
		if ( AIR_VEHICLE(ch->in_vehicle->type) )
			ch->in_vehicle->fuel--;
		else
			ch->in_vehicle->fuel -= wildmap_table[map_table.type[ch->x][ch->y][ch->z]].fuel;
		if ( IS_SET(ch->in_vehicle->flags,VEHICLE_EATS_FUEL) )
			ch->in_vehicle->fuel -= number_range(1,3);
	}
	for ( obj = ch->first_carry;obj;obj = obj->next_in_carry_list )
	{
		if ( obj->carried_by != ch )
			continue;
		obj->x = ch->x;
		obj->y = ch->y;
	}

	x = ch->x;
	y = ch->y;

	for ( fch = map_ch[xx][yy][z];fch;fch = fch_next )
	{
		fch_next = fch->next_in_room;
		if ( fch == ch )
			continue;
		if ( !can_see(fch,ch) )
			continue;
//		if ( NOT_IN_ROOM(ch,fch) )
//			continue;
		if ( fch->x != xx || fch->y != yy || fch->z != ch->z )
			continue;
		if ( ch->in_vehicle == NULL )
		{
			sprintf( move_buf, "%s moves away to %s.\n\r", ch->name, dir_name[door] );
		}
		else
		{
			if ( !AIR_VEHICLE(ch->in_vehicle->type))
				sprintf( move_buf, "%s drives away to %s.\n\r", ch->name, dir_name[door] );
			else
				sprintf( move_buf, "%s flies away to %s.\n\r", ch->name, dir_name[door] );
		}
		send_to_char( move_buf, fch );
	        if ( ( fch->leader == ch )  && !COMBAT_LAG(fch) && fch->position == POS_STANDING )
	        {
			if ( !ch->in_vehicle || !AIR_VEHICLE(ch->in_vehicle->type) )
			{
	           		act( "You follow $N $t.", fch, dir_name[door], ch, TO_CHAR );
	           		move_char( fch, door );
			}
		}
	}
	ch->x = xx;
	ch->y = yy;

	for ( fch = map_ch[x][y][z];fch;fch = fch->next_in_room )
	{
		if ( !can_see(fch,ch) || fch == ch )
			continue;
		if ( fch->x == x && fch->y == y && fch->z == ch->z )
		{
			if ( ch->in_vehicle == NULL )
			{
				sprintf( move_buf, "%s wanders in from %s.\n\r", ch->name, rev_name[door] );
			}
			else
			{
				if ( !AIR_VEHICLE(ch->in_vehicle->type))
					sprintf( move_buf, "%s drives in from %s.\n\r", ch->name, rev_name[door] );
				else
					sprintf( move_buf, "%s flies in from %s.\n\r", ch->name, rev_name[door] );
			}
			send_to_char( move_buf, fch );
		}
	}


	if ( ch )
	{
		move ( ch, x, y, ch->z );
		if ( !IS_SET(ch->effect,EFFECT_RUNNING) && !IS_SET(ch->config,CONFIG_CLIENT) )
			do_look( ch, "auto" );
		if ( map_table.type[x][y][ch->z] == SECT_ICE && !ch->in_vehicle )
		{
			ch->c_sn = gsn_move;
			ch->c_level = door;
			ch->c_time = 5;
		}
		ch->position = POS_STANDING;
    		if ( ch->in_vehicle )
			if ( ch->in_vehicle->fuel <= 15 )
				send_to_char( "\n\r@@eYou are low on fuel!!@@N\n\r", ch );
	}
    return;
}



void do_north( CHAR_DATA *ch, char *argument )
{
    if ( ch->z == Z_AIR && ch->c_level != -1 && ch->in_vehicle && ch->in_vehicle->type != VEHICLE_CHINOOK )
    {
	ch->c_level = DIR_NORTH;
	return;
    }
    if (!COMBAT_LAG(ch) || paintball(ch) )
    {
	move_char(ch, DIR_NORTH);
	return;
    }
    ch->c_sn = gsn_move;
    ch->c_time = 8;
    if ( ch->in_vehicle )
    {
	ch->c_time -= ch->in_vehicle->speed;
    	if ( ch->class == CLASS_DRIVER )
		ch->c_time /= 1.5;
    }
    else if ( ch->class == CLASS_SPRINTER || ch->effect2/100==EFFECT2_SPEED )
	ch->c_time /= 1.5;
    if ( IS_SET(ch->effect,EFFECT_SLOW) || ch->poison / 100 == POISON_TRANQ )
	ch->c_time *= 2;
    ch->c_time += wildmap_table[map_table.type[ch->x][ch->y][ch->z]].speed;
    ch->c_level = DIR_NORTH;
    return;
}



void do_east( CHAR_DATA *ch, char *argument )
{
    if ( ch->z == Z_AIR && ch->c_level != -1 && ch->in_vehicle && ch->in_vehicle->type != VEHICLE_CHINOOK )
    {
	ch->c_level = DIR_EAST;
	return;
    }
    if ( !COMBAT_LAG(ch) || paintball(ch) )
    {
	move_char(ch, DIR_EAST);
	return;
    }
    ch->c_sn = gsn_move;
    ch->c_time = 8;
    if ( ch->in_vehicle )
    {
	ch->c_time -= ch->in_vehicle->speed;
    	if ( ch->class == CLASS_DRIVER )
		ch->c_time /= 1.5;
    }
    else if ( ch->class == CLASS_SPRINTER || ch->effect2/100==EFFECT2_SPEED )
	ch->c_time /= 1.5;
    if ( IS_SET(ch->effect,EFFECT_SLOW) || ch->poison / 100 == POISON_TRANQ )
	ch->c_time *= 2;
    ch->c_time += wildmap_table[map_table.type[ch->x][ch->y][ch->z]].speed;
    ch->c_level = DIR_EAST;
    return;
}



void do_south( CHAR_DATA *ch, char *argument )
{
    if ( ch->z == Z_AIR && ch->c_level != -1 && ch->in_vehicle && ch->in_vehicle->type != VEHICLE_CHINOOK )
    {
	ch->c_level = DIR_SOUTH;
	return;
    }
    if ( !COMBAT_LAG(ch) || paintball(ch) )
    {
	move_char(ch, DIR_SOUTH);
	return;
    }
    ch->c_sn = gsn_move;
    ch->c_time = 8;
    if ( ch->in_vehicle )
    {
	ch->c_time -= ch->in_vehicle->speed;
    	if ( ch->class == CLASS_DRIVER )
		ch->c_time /= 1.5;
    }
    else if ( ch->class == CLASS_SPRINTER || ch->effect2/100==EFFECT2_SPEED )
	ch->c_time /= 1.5;
    if ( IS_SET(ch->effect,EFFECT_SLOW) || ch->poison / 100 == POISON_TRANQ )
	ch->c_time *= 2;
    ch->c_time += wildmap_table[map_table.type[ch->x][ch->y][ch->z]].speed;
    ch->c_level = DIR_SOUTH;
    return;
}

void do_west( CHAR_DATA *ch, char *argument )
{
    if ( ch->z == Z_AIR && ch->c_level != -1 && ch->in_vehicle && ch->in_vehicle->type != VEHICLE_CHINOOK )
    {
	ch->c_level = DIR_WEST;
	return;
    }
    if (!COMBAT_LAG(ch) || paintball(ch) )
    {
	move_char(ch, DIR_WEST);
	return;
    }
    ch->c_sn = gsn_move;
    ch->c_time = 8;
    if ( ch->in_vehicle )
    {
	ch->c_time -= ch->in_vehicle->speed;
    	if ( ch->class == CLASS_DRIVER )
		ch->c_time /= 1.5;
    }
    else if ( ch->class == CLASS_SPRINTER || ch->effect2/100==EFFECT2_SPEED )
	ch->c_time /= 1.5;
    if ( IS_SET(ch->effect,EFFECT_SLOW) || ch->poison / 100 == POISON_TRANQ )
	ch->c_time *= 2;
    ch->c_time += wildmap_table[map_table.type[ch->x][ch->y][ch->z]].speed;
    ch->c_level = DIR_WEST;
    return;
}

void do_enter( CHAR_DATA *ch, char *argument )
{
	VEHICLE_DATA *vhc;
	char buf[MSL];

	if ( ( vhc = get_vehicle_char(ch,argument) ) == NULL )
	{
		if ( ( vhc = get_vehicle_from_vehicle( ch->in_vehicle ) ) == NULL )
		{
			send_to_char( "I don't see such vehicle here.\n\r", ch );
			return;
		}
	}
	if ( vhc->driving != NULL )
	{
		if ( vhc->driving == ch )
			send_to_char( "You are already inside.\n\r", ch );
		else
			send_to_char( "There is already someone inside!\n\r", ch );
		return;
	}
	if ( ch->victim != ch )
	{
		send_to_char( "You have lost track of your target.\n\r", ch );
		ch->victim = ch;
	}
	if ( ch->in_vehicle )
	{
		if ( TRANSPORT_VEHICLE(vhc->type) )
		{
			if ( AIR_VEHICLE(ch->in_vehicle->type) )
			{
				send_to_char( "Aircrafts cannot enter other vehicles.\n\r", ch );
				return;
			}
			if ( get_vehicle_from_vehicle(vhc) )
			{
				send_to_char( "There is already a vehicle inside.\n\r", ch );
				return;
			}
			sprintf( buf, "You drive %s into %s's hanger, and enter it.", ch->in_vehicle->desc, vhc->desc );
			act( buf, ch, NULL, NULL, TO_CHAR );
			sprintf( buf, "$n drives %s into %s's hanger, and enters it.", ch->in_vehicle->desc, vhc->desc );
			act( buf, ch, NULL, NULL, TO_ROOM );
			ch->in_vehicle->in_vehicle = vhc;
			vhc->vehicle_in = ch->in_vehicle;
			ch->in_vehicle->driving = NULL;
			ch->in_vehicle = vhc;
			ch->in_vehicle->driving = ch;
			return;
		}
		else
		{
			if ( vhc->in_vehicle == ch->in_vehicle )
			{
				if ( ch->in_vehicle->type == VEHICLE_CHINOOK )
				{
					if ( map_table.type[ch->x][ch->y][ch->z] == SECT_FIELD || map_table.type[ch->x][ch->y][ch->z] == SECT_ROCK || map_table.type[ch->x][ch->y][ch->z] == SECT_SNOW || map_table.type[ch->x][ch->y][ch->z] == SECT_SAND || ch->in_building )
					{
						act( "You land $t on the ground.", ch, ch->in_vehicle->desc, NULL, TO_CHAR );
						act( "$n lands $t on the ground.", ch, ch->in_vehicle->desc, NULL, TO_ROOM );
					}
					else
					{
						send_to_char( "You can't land it here!\n\r", ch );
						return;
					}
				}
				sprintf( buf, "You enter %s, and exit %s's hanger.", vhc->desc, ch->in_vehicle->desc );
				act( buf, ch, NULL, NULL, TO_CHAR );
				sprintf( buf, "$n exits %s's hanger in %s.", ch->in_vehicle->desc, vhc->desc );
				act( buf, ch, NULL, NULL, TO_ROOM );
				vhc->in_vehicle->vehicle_in = NULL;
				vhc->in_vehicle = NULL;
				vhc->driving = ch;
				ch->in_vehicle->driving = NULL;
				ch->in_vehicle = vhc;
				move_vehicle(ch->in_vehicle,ch->x,ch->y,ch->z);
				ch->in_vehicle->timer = 0;
				if ( AIR_VEHICLE(ch->in_vehicle->type) ) do_lift(ch,"");
				if ( SPACE_VEHICLE(ch->in_vehicle->type)) do_lift(ch, "");
			}
			else
				send_to_char( "You are already in a vehicle.\n\r", ch );
			return;
		}
	}
	sprintf( buf, "You climb into %s.\n\r", vhc->desc );
	send_to_char( buf, ch );
	sprintf( buf, "$n climbs into %s.", vhc->desc );
	act( buf, ch, NULL, NULL, TO_ROOM );
	if ( AIR_VEHICLE(vhc->type) )
		ch->c_level = -1;
	if ( vhc->fuel < 10 && AIR_VEHICLE(vhc->type) )
		send_to_char( "@@f@@eWARNING! Your aircraft is LOW on fuel! It will crash!@@N\n\r", ch );
	ch->in_vehicle = vhc;
	vhc->driving = ch;
	vhc->timer = 0;
	return;
}  
void do_exit( CHAR_DATA *ch, char *argument )
{
	char buf[MSL];

	if ( ch->in_vehicle == NULL )
	{
		send_to_char( "You are not inside a vehicle.\n\r", ch );
		return;
	}
	if ( ch->in_vehicle->type == VEHICLE_CREEPER )
	{
		send_to_char( "You are locked in! (If you must go out, use the @@eDestroy@@N command)\n\r", ch );
		sprintf( buf, "%s attempted to get out of the creeper.", ch->name );
		monitor_chan( ch, buf, MONITOR_GEN_MORT);
		return;
	}
	if ( map_table.type[ch->x][ch->y][ch->z]==SECT_OCEAN && !IS_IMMORTAL(ch))
	{
		send_to_char("And what, walk on water?\n\r", ch );
		return;
	}
	if ( AIR_VEHICLE(ch->in_vehicle->type) && ch->z == Z_AIR && ( !ch->in_vehicle->in_building || ch->in_vehicle->in_building->type != BUILDING_AIRFIELD ) )
	{
		BUILDING_DATA *bld = map_bld[ch->x][ch->y][Z_GROUND];
		if ( bld && !bld->owner && 0 )
		{
		}
		else if ( bld )
		{
			move(ch,ch->x,ch->y,Z_GROUND);
			act( "You jump out of $t, and crash into a building! You hit the roof and get staked by metal bars.", ch, ch->in_vehicle->desc, NULL, TO_CHAR );
			act( "$n crashes into the building!", ch, NULL, NULL, TO_ROOM );
			sprintf( buf, "%s is left without a pilot, and crashes on the ground!", ch->in_vehicle->desc );
			send_to_loc(buf,ch->x,ch->y,Z_AIR);
			send_to_loc(buf,ch->x,ch->y,Z_GROUND);
			ch->in_vehicle->driving = NULL;
			extract_vehicle(ch->in_vehicle,FALSE);
			ch->in_vehicle = NULL;
			if ( bld->owner )
				damage(bld->owner,ch,ch->hit*2+1000,DAMAGE_PSYCHIC);
			else
			{
				damage(ch,ch,ch->hit*2+1000,DAMAGE_PSYCHIC);
				return;
			}
			return;
		}
		else
		{
			move(ch,ch->x,ch->y,Z_GROUND);
			act( "You jump out of $t, and land safely on the ground!", ch, ch->in_vehicle->desc, NULL, TO_CHAR );
			act( "$n jumps out of $t, and lands safely on the ground!", ch, ch->in_vehicle->desc, NULL, TO_ROOM );
		}
		sprintf( buf, "%s is left without a pilot, and crashes on the ground!", ch->in_vehicle->desc );
		send_to_loc(buf,ch->x,ch->y,Z_AIR);
		send_to_loc(buf,ch->x,ch->y,Z_GROUND);
		ch->in_vehicle->driving = NULL;
		extract_vehicle(ch->in_vehicle,FALSE);
		ch->in_vehicle = NULL;
		return;
	}
	if(SPACE_VEHICLE(ch->in_vehicle->type))
        {
    		if(ch->z != Z_GROUND)
		{
			if(get_obj_wear(ch,"spacesuit") == NULL)
			{
				send_to_char("You need a space suit before you can travel outside to space without a ship!\r\n", ch);
				return;
			} else {
				ch->in_vehicle->driving = NULL;
				ch->in_vehicle = NULL;
				return;
			}
		}
	}

	sprintf( buf, "You climb out of %s.\n\r", ch->in_vehicle->desc );
	send_to_char( buf, ch );
	sprintf( buf, "$n climbes out of %s.", ch->in_vehicle->desc );
	act( buf, ch, NULL, NULL, TO_ROOM );
	if ( ch->in_vehicle->type == VEHICLE_JEEP )
	{
		if ( !str_cmp(ch->in_vehicle->name, "Escape Pod") )
		{
			ch->in_vehicle->driving = NULL;
			extract_vehicle(ch->in_vehicle,TRUE);
			ch->in_vehicle = NULL;
			return;
		}
	}
	ch->in_vehicle->driving = NULL;
	ch->in_vehicle = NULL;
	ch->position = POS_STANDING;
	return;
}
void do_pit( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	char buf[MSL];

	if ( ch->fighttimer > 0 )
	{
		send_to_char( "You cannot enter or leave the pit yet! You are fighting!\n\r", ch);
		return;
	}
	if ( IN_PIT(ch) )
	{
		sprintf( buf, "%s has gone out of the pit!", ch->name );
		info( buf, 0 );
		ch->fighttimer += 200;
                if(map_bld[ch->homex][ch->homey][Z_GROUND] != NULL && map_bld[ch->homex][ch->homey][Z_GROUND]->owner == ch && map_bld[ch->homex][ch->homey][Z_GROUND]->type == BUILDING_HQ)
                {
                    act( "$n has gone out of the pit!", ch, NULL, NULL, TO_ROOM );
                    move ( ch, ch->homex, ch->homey, Z_GROUND );
                    act( "You have gone out of the pit!", ch, NULL, NULL, TO_CHAR );
                    act( "$n has gone out of the pit!", ch, NULL, NULL, TO_ROOM );
                    do_look(ch,"");
                    return;
                }
                send_to_char("@@eYour choosen \"home\" is not valid. Searching for a HQ.@@n\r\n", ch);
		for ( bld = ch->first_building;bld;bld = bld->next_owned )
		{
			if ( bld->type == BUILDING_HQ )
			{
				act( "$n has gone out of the pit!", ch, NULL, NULL, TO_ROOM );
				move ( ch, bld->x, bld->y, bld->z );
				act( "You have gone out of the pit!", ch, NULL, NULL, TO_CHAR );
				act( "$n has gone out of the pit!", ch, NULL, NULL, TO_ROOM );
				do_look(ch,"");
				return;
			}
		}
		send_to_char( "You have no HQ! Setting default coordinates!\n\r", ch );

		int ranx = number_range(1, 1499);
                int rany = number_range(1, 1499);
                while (map_table.type[ranx][rany][Z_GROUND] == SECT_OCEAN && map_bld[ranx][rany][Z_GROUND] == NULL)
                {
                        ranx = number_range(1, 1499);
                        rany = number_range(1, 1499);
                }
		move ( ch, ranx, rany, Z_GROUND );
//		move ( ch, number_range(4,400), number_range(4,400), Z_GROUND );
		do_look(ch,"");
		return;
	}
	else
	{
		if ( ch->in_vehicle )
			mreturn("Get out of your vehicle first.\n\r", ch );
		if ( ch->z == Z_PAINTBALL )
		{
			send_to_char( "You cannot enter the pit from the game arena.\n\r", ch );
			return;
		}
		if ( ch->in_vehicle && ( AIR_VEHICLE(ch->in_vehicle->type) ))
		{
			send_to_char( "Heh, no.\n\r", ch );
			return;
		}
		for ( bld = ch->first_building;bld;bld = bld->next_owned )
		{
			if ( bld->type == BUILDING_HQ )
			{
				sprintf( buf, "%s has entered the pit!", ch->name );
				info( buf, 0 );
				act( "$n has entered the pit!", ch, NULL, NULL, TO_ROOM );
				move( ch, number_range(PIT_BORDER_X+1,MAX_MAPS-2), number_range(PIT_BORDER_Y+1,MAX_MAPS-2), Z_PAINTBALL );
				act( "$n has entered the pit!", ch, NULL, NULL, TO_ROOM );
				act( "You have entered the pit!", ch, NULL, NULL, TO_CHAR );
				if ( !IS_IMMORTAL(ch) )
				ch->fighttimer = 360;
				do_look(ch,"");
				return;
			}
		}
		send_to_char( "You must have a headquarters in order to enter the pit!\n\r", ch );
		return;
	}
	return;
}

void do_paintball( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	OBJ_DATA *gun;
	char buf[MSL];

	if ( ch->fighttimer > 0  )
	{
		send_to_char( "You cannot enter or leave the arena yet! You are fighting!\n\r", ch);
		return;
	}
	if ( ch->in_vehicle )
	{
		send_to_char( "In the vehicle?\n\r", ch );
		return;
	}
	if ( paintball(ch) )
	{
		sprintf( buf, "%s has gone out of the paintball arena%s!", ch->name, (!str_cmp(argument,"idler"))?" @@bfor suspected idling@@g" : "" );
		info( buf, 0 );
		if ( ( gun = get_eq_char(ch,WEAR_HOLD_HAND_L) ) != NULL )
			extract_obj(gun);
		ch->fighttimer += 200;
		if(map_bld[ch->homex][ch->homey][Z_GROUND] != NULL && map_bld[ch->homex][ch->homey][Z_GROUND]->owner == ch && map_bld[ch->homex][ch->homey][Z_GROUND]-> type == BUILDING_HQ)
		{
                    act( "$n has gone out of the paintball arena!", ch, NULL, NULL, TO_ROOM );
                    move ( ch, ch->homex, ch->homey, Z_GROUND );
                    act( "You have gone out of the paintball arena!", ch, NULL, NULL, TO_CHAR );
                    act( "$n has gone out of the paintball arena!", ch, NULL, NULL, TO_ROOM );
                    do_look(ch,"");
                    return;
		}
		send_to_char("@@eYour choosen \"home\" is not valid. Searching for a HQ.@@n\r\n", ch);
		for ( bld = ch->first_building;bld;bld = bld->next_owned )
		{
			if ( bld->owner != ch )
			{
				bld->owner = get_ch(bld->owned);
				continue;
			}
			if ( bld->type == BUILDING_HQ && complete(bld) )
			{
				act( "$n has gone out of the paintball arena!", ch, NULL, NULL, TO_ROOM );
				move ( ch, bld->x, bld->y, bld->z );
				act( "You have gone out of the paintball arena!", ch, NULL, NULL, TO_CHAR );
				act( "$n has gone out of the paintball arena!", ch, NULL, NULL, TO_ROOM );
				do_look(ch,"");
				return;
			}
		}
		send_to_char( "You have no HQ! Setting default coordinates!\n\r", ch );
		int ranx = number_range(1, 1499);
		int rany = number_range(1, 1499);
		while (map_table.type[ranx][rany][Z_GROUND] == SECT_OCEAN && map_bld[ranx][rany][Z_GROUND] == NULL)
		{
			ranx = number_range(1, 1499);
			rany = number_range(1, 1499);
		}
		move ( ch, ranx, rany, Z_GROUND );
//		move ( ch, PIT_BORDER_X -1, PIT_BORDER_Y - 1, Z_GROUND );
		do_look(ch,"");
		return;
	}
	else
	{
		extern bool paintlock;
		if ( ch->z == Z_PAINTBALL )
		{
			send_to_char( "You cannot enter from within the game arena.\n\r", ch );
			return;
		}
		if ( paintlock )
		{
			send_to_char( "The paintball arena is currently locked.\n\r", ch );
			return;
		}
		if ( ch->in_vehicle )
		{
			send_to_char( "Heh, no.\n\r", ch );
			return;
		}
		for ( bld = ch->first_building;bld;bld = bld->next_owned )
		{
			if ( bld->type == BUILDING_HQ && complete(bld) )
			{
				for ( gun=ch->first_carry;gun;gun = gun->next_in_carry_list )
				{
					if ( gun->item_type == ITEM_BOMB && gun->value[1] != 0 )
						gun->value[1] = 0;
				}
				if ( ( gun = create_object(get_obj_index(OBJ_VNUM_PAINT_GUN),0) ) == NULL )
					return;
				if ( ( get_eq_char(ch,WEAR_HOLD_HAND_L) ) != NULL )
                			unequip_char(ch,get_eq_char(ch,WEAR_HOLD_HAND_L));
				obj_to_char(gun,ch);
		        	equip_char(ch,gun,WEAR_HOLD_HAND_L);
				sprintf( buf, "%s has entered the paintball arena!", ch->name );
				info( buf, 0 );
				act( "$n has entered the paintball arena!", ch, NULL, NULL, TO_ROOM );
				move( ch, number_range(200,300), number_range(200,300), Z_PAINTBALL );
				ch->c_count = 0;
				if ( ch->in_vehicle )
				{
					ch->in_vehicle->driving = NULL;
					ch->in_vehicle = NULL;
				}
				act( "$n has entered the paintball arena!", ch, NULL, NULL, TO_ROOM );
				act( "You have entered the paintball arena!", ch, NULL, NULL, TO_CHAR );
				do_look(ch,"");
				if ( !IS_IMMORTAL(ch) )
					ch->fighttimer = 360;
				save_char_obj(ch);
				return;
			}
		}
		send_to_char( "You must have a headquarters in order to enter the paintball arena!\n\r", ch );
		return;
	}
	return;
}

void crash( CHAR_DATA *ch, CHAR_DATA *attacker )
{
	VEHICLE_DATA *vhc;
	vhc = ch->in_vehicle;
	move(ch,ch->x,ch->y,Z_GROUND);
	act( "$t crashes!", ch, ch->in_vehicle->desc, NULL, TO_CHAR );
	act( "$t crashes!", ch, ch->in_vehicle->desc, NULL, TO_ROOM );
	ch->hit = number_range(-2,1);
	ch->in_vehicle->driving = NULL;
	ch->in_vehicle = NULL;
	extract_vehicle(vhc,TRUE);
	if ( ch->hit <= 0 )
	{
		char buf[MSL];
			if ( ch != attacker )
			sprintf( buf, "@@a%s @@Wshot @@a%s@@W down from the sky.@@N", attacker->name, ch->name );
		else
			sprintf( buf, "@@a%s @@Wshould have never missed those flight-school lessons.@@N", ch->name );
		damage(attacker,ch,1000,-1);
		info ( buf, 0 );
		return;
	}
	send_to_char( "You have survived the crash!\n\r", ch );
	act( "$n has survived the crash!", ch, NULL, NULL, TO_ROOM );
	return;
}

void do_teleport (CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;
	BUILDING_DATA *bld;
	int range;
	int x,y,xx,yy;
	int c,m;
	BUILDING_DATA *bld2;

	if ( ch->in_building && ch->in_building->type == BUILDING_TELEPORTER && complete(ch->in_building) )
	{
		do_teleport_b(ch,argument);
		return;
	}
	if ( argument[0] == '\0' )
	{
		send_to_char( "You must specify the name of a teleporter device you want to use.\n\r", ch );
		return;
	}
	if ( ( obj = get_obj_carry( ch, argument ) ) == NULL )
	{
		send_to_char( "You do not carry that teleporter device.\n\r", ch );
		return;
	}
	if ( obj->item_type != ITEM_TELEPORTER )
	{
		send_to_char( "That is not a teleporter.\n\r", ch );
		return;
	}
	if ( obj->value[2] > 0 )
	{
		char buf[MSL];
		sprintf(buf,"You must wait another estimated %d seconds for the teleporter to recharge.\n\r", obj->value[2]*(PULSE_OBJECTS/PULSE_PER_SECOND) );
		send_to_char(buf,ch);
		return;
	}
	range = obj->value[0];
	bld2 = NULL;
	m = -1;
	for ( xx=ch->x-range;xx<ch->x+range;xx++ )
	for ( yy=ch->y-range;yy<ch->y+range;yy++ )
	{
		x=xx;y=yy;real_coords(&x,&y);
		if ( ( bld = map_bld[x][y][ch->z] ) == NULL )
			continue;
		if ( bld->type != obj->value[1] || bld->owner != ch )
			continue;
		c = (abs(bld->x-ch->x)<abs(bld->y-ch->y))?abs(bld->x-ch->x):abs(bld->y-ch->y);
		if ( c < m || m == -1 ) 
		{
			bld2=bld;
			m = c;
		}
	}
	if ( !bld2 )
		mreturn("There is no building within range.\n\r",ch);

	bld = bld2;
	act( "$n presses a few buttons on $p, and vanishes!", ch, obj, NULL, TO_ROOM );
	act( "You press a few buttons on $p, and vanish!", ch, obj, NULL, TO_CHAR );
	move( ch, bld->x, bld->y, bld->z );
	if ( ch->in_vehicle )
	{
		ch->in_vehicle->driving = NULL;
		ch->in_vehicle = NULL;
	}
	act( "$n appears out of thin air!", ch, NULL, NULL, TO_ROOM );
	do_look(ch,"");
	obj->value[2] = 60;
	sendsound(ch,"telept",40,1,25,"misc","telept.wav"); 
	return;
}

void move( CHAR_DATA *ch, int x, int y, int z )
{
	CHAR_DATA *wch;

//	real_coords(&x,&y);
	if ( ch == map_ch[ch->x][ch->y][ch->z] )
	{
		map_ch[ch->x][ch->y][ch->z] = ch->next_in_room?ch->next_in_room:NULL;
	}
	else
		for ( wch = map_ch[ch->x][ch->y][ch->z];wch;wch = wch->next_in_room )
			if ( wch->next_in_room == ch )
				wch->next_in_room = ch->next_in_room;
	ch->x = x;
	ch->y = y;
	ch->z = z;
	ch->next_in_room = map_ch[ch->x][ch->y][ch->z];
	map_ch[ch->x][ch->y][ch->z] = ch;
	ch->in_building = map_bld[ch->x][ch->y][ch->z];
	if ( ch->position == POS_NUKEM )
		ch->position = POS_STANDING;
	if ( ch->victim != ch )
	{
		send_to_char( "You have lost track of your target.\n\r", ch );
		ch->victim = ch;
	}
	if ( ch->in_vehicle )
		move_vehicle(ch->in_vehicle,x,y,z); // ch->x = x;ch->y=y;ch->z=z;
	return;
}
void move_vehicle( VEHICLE_DATA *vhc, int x, int y, int z )
{
	VEHICLE_DATA *vhc2;

	real_coords(&x,&y);
	if ( vhc == map_vhc[vhc->x][vhc->y][vhc->z] )
	{
		map_vhc[vhc->x][vhc->y][vhc->z] = vhc->next_in_room;
	}
	else
		for ( vhc2 = map_vhc[vhc->x][vhc->y][vhc->z];vhc2;vhc2 = vhc2->next_in_room )
			if ( vhc2->next_in_room == vhc )
				vhc2->next_in_room = vhc->next_in_room;
	vhc->x = x;
	vhc->y = y;
	vhc->z = z;
	vhc->next_in_room = map_vhc[vhc->x][vhc->y][vhc->z];
	map_vhc[x][y][z] = vhc;
	if ( vhc->vehicle_in )
		move_vehicle(vhc->vehicle_in,x,y,z);
	return;
}
void move_obj( OBJ_DATA *obj, int x, int y, int z )
{
	extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS];
	OBJ_DATA *obj2;

	real_coords(&x,&y);
	if ( obj->carried_by == NULL )
	{
		if ( obj == map_obj[obj->x][obj->y] )
		{
			map_obj[obj->x][obj->y] = obj->next_in_room;
//			if ( !obj->next_in_room )
//				free(map_obj[obj->x][obj->y]);
		}
		else
		{
			for ( obj2 = map_obj[obj->x][obj->y];obj2;obj2 = obj2->next_in_room )
			{
				if ( obj2->next_in_room == obj )
				{
					obj2->next_in_room = obj->next_in_room;
					break;
				}
			}
		}

		obj->x = x;
		obj->y = y;
		obj->z = z;
		obj->in_building = map_bld[obj->x][obj->y][obj->z];
		if ( obj->in_building && str_cmp(obj->in_building->owned,"nobody") && obj->item_type != ITEM_BOMB )
			{
				free_string(obj->owner);
				obj->owner = str_dup(obj->in_building->owned);
			}
		obj->next_in_room = map_obj[obj->x][obj->y];
		map_obj[obj->x][obj->y] = obj;
	}
	return;
}

void do_lift( CHAR_DATA *ch, char *argument )
{
	int type;

	if ( ch->z != Z_GROUND )
	{
		send_to_char( "You can't lift from here.\n\r", ch );
		return;
	}
	if ( ch->in_vehicle == NULL )
	{
		send_to_char( "You are not even in a vehicle!\n\r", ch );
		return;
	}
	if ( AIR_VEHICLE(ch->in_vehicle->type) )
	{
		type = 2;
	}
	else if (SPACE_VEHICLE(ch->in_vehicle->type))
	{
		act( "You power on the launch sequence and start to glide up.", ch, NULL, NULL, TO_CHAR );
		act( "$t activates, and glides up.", ch, ch->in_vehicle->desc, NULL, TO_ROOM);
		move(ch, ch->x, ch->y, Z_SPACE_EARTH);
		ch->in_building = NULL;
		ch->in_vehicle->in_building = NULL;
		ch->in_vehicle->z = ch->z;
		do_look(ch, "");
		return;
	} else {
		send_to_char( "You can't lift in that!\n\r", ch );
		return;
	}
	if ( ( type == 2 && ch->z == Z_AIR ) )
	{
		send_to_char( "You're already there.\n\r", ch );
		return;
	}
	act( "You power the thrusters, and glide up.", ch, NULL, NULL, TO_CHAR );
	act( "$t's thrusters activate, and it slowly glides up.", ch,ch->in_vehicle->desc,NULL, TO_ROOM);
	move(ch,ch->x,ch->y,Z_AIR);
	ch->in_building = NULL;
	ch->in_vehicle->in_building = NULL;
	ch->in_vehicle->z = ch->z;
	do_look(ch,"");
	return;
}
void do_land( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	VEHICLE_DATA * vhc = ch->in_vehicle;
	int x=1,y=1,type;

	if ( ch->z == Z_AIR )
		type = 2;
	else if(ch->z == Z_SPACE_EARTH && ch->in_vehicle != NULL) {
		if(map_bld[ch->x][ch->y][Z_GROUND] == NULL || map_bld[ch->x][ch->y][Z_GROUND]->type != BUILDING_SPACEYARD)
		{
			send_to_char("@@lYou need to land in a @@CSpaceyard@@l.\r\n", ch);
			return;
		}
		else if(map_bld[ch->x][ch->y][Z_GROUND]->active == FALSE)
		{
			send_to_char("This spaceyard belongs to an offline player.\r\n", ch);
			return;
		}
		move(ch, ch->x, ch->y, Z_GROUND);
		move_vehicle(ch->in_vehicle,ch->x, ch->y, Z_GROUND);
		send_to_char("You land safely.\n\r", ch);
		do_look(ch, "");
		return;
	} else if(ch->z == Z_SPACE_EARTH && get_obj_here(ch, "spacesuit") != NULL && ch->in_vehicle == NULL) {
                        send_to_char("\r\nGo back to your @@espaceship@@n! You'll @@eburn@@n up in the atmosphere.\r\n", ch);
                        return;
	} else if(ch->z == Z_SPACE_EARTH && ch->in_vehicle == NULL) {
//		move(ch, ch->x, ch->y, Z_GROUND);
		send_to_char("@@eYou have NOT landed safely, without a ship. Please tell an immortal how you got up there without a ship/spacesuit.@@n\r\n", ch);
		return;
	} else {
		send_to_char( ".. Land where?\n\r", ch );
		return;
	}
	if ( !ch->in_vehicle || ch->in_vehicle == NULL )
	{
		ch->z = Z_GROUND;
		return;
	}

	if ( type == 2 )
	{
		if ( !vhc || vhc->type != VEHICLE_CHINOOK )
		{
			if ( ( bld = get_building(ch->x,ch->y,Z_GROUND) ) == NULL || bld->type != BUILDING_AIRFIELD || !bld->active )
			{
				VEHICLE_DATA *vhc2;
				for ( vhc2=map_vhc[ch->x][ch->y][Z_GROUND];vhc2;vhc2 = vhc2->next_in_room )
				{
					if ( !vhc2->driving && vhc2->type == VEHICLE_CARRIER )
					{
						act( "You land aboard the aircraft carrier.", ch, NULL, NULL, TO_CHAR );
						act( "$t lands aboard the aircraft carrier.", ch, ch->in_vehicle->desc, NULL, TO_CHAR );
						move(ch,ch->x,ch->y,Z_GROUND);
						ch->in_vehicle->in_vehicle = vhc2;
						vhc2->vehicle_in = ch->in_vehicle;
						ch->in_vehicle->driving = NULL;
						ch->in_vehicle = vhc2;
						ch->in_vehicle->driving = ch;
						ch->c_level = -1;
						return;
					}
				}
				send_to_char( "There is no airfield there.\n\rIf you must land now, you can try @@eEject@@Ning from the plane.", ch );
				return;
			}
/*			if ( !bld->owner || (bld->owner != ch && ( bld->owner->pcdata->alliance == -1 || 
bld->owner->pcdata->alliance != ch->pcdata->alliance ) ) )
			{
				send_to_char( "You do not have permission to land there.\n\r", ch );
				return;
			}*/
			act( "You turn the landing thrusters on, and lower your aircraft.", ch, NULL, NULL, TO_CHAR );
			act( "$t begins landing.", ch, ch->in_vehicle->desc, NULL, TO_ROOM );
		}
		else
		{
			int sect = map_table.type[ch->x][ch->y][Z_GROUND];

			if ( ( bld = get_building(ch->x,ch->y,Z_GROUND) ) != NULL && bld->type != BUILDING_AIRFIELD )
			{
				send_to_char( "You can't land it on top of the building.\n\r", ch );
				return;
			}
			if ( bld && !bld->active ) mreturn("Not inside an offline building.\n\r", ch );
			if ( !bld && sect != SECT_FIELD && sect != SECT_SAND && sect != SECT_ROCK && sect != SECT_SNOW)
			{
				send_to_char( "You can't find a good landing spot in this area.\n\r", ch );
				return;
			}
			act( "You land the chinook.", ch, NULL, NULL, TO_CHAR );
			act( "$n lands $s chinook.", ch, NULL, NULL, TO_ROOM );
		}
		x = ch->x;
		y = ch->y;
		ch->c_level = -1;
	}
	move(ch,x,y,Z_GROUND);
	act( "$n has landed $s $t in the room.", ch, (ch->in_vehicle)?ch->in_vehicle->desc:"", NULL, TO_ROOM );
	if ( ch->in_vehicle && ch->in_vehicle->z != ch->z )
		move_vehicle(ch->in_vehicle,x,y,ch->z);
	return;
}

void do_teleport_b( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	BUILDING_DATA *bld2;
	char buf[MSL];
	int x = 1;

	bld = ch->in_building;
	if ( ch->in_vehicle )
	{
		send_to_char( "You can't teleport while driving.\n\r", ch );
		return;
	}
	if ( !bld->owner )
		return;
	if ( argument[0] == '\0' )
	{
		for ( bld2 = first_active_building;bld2;bld2 = bld2->next_active )
		{
			if ( bld2->type == BUILDING_TELEPORTER && bld2->owner && bld2->owner == bld->owner && bld2 != bld )
			{
				sprintf( buf, "@@a%d) @@c%s at %d/%d  %s\n\r", x, bld2->name, bld2->x, bld2->y, bld2->value[10] >= 1 ? "@@G(@@rPowered@@G)" : "@@R(@@ePowered Down@@R)" );
				send_to_char( buf, ch );
				x++;
			}
		}
		sprintf( buf, "\n\r@@NYou have %d battery packs stored in this teleporter.\n\r",bld->value[10] );
		send_to_char(buf,ch);
		send_to_char( "Select a teleporter number to teleport to.\n\r", ch );
		return;
	}
	x = atoi(argument);
	if ( x < 1 )
	{
		send_to_char( "Invalid teleporter number.\n\r", ch );
		return;
	}
	if ( bld->value[10] <= 0 )
	{
		send_to_char( "There are no more battery packs to power up the teleporter! Buy some more and try again.\n\r", ch );
		return;
	}
	for ( bld2 = first_active_building;bld2;bld2 = bld2->next_active )
	{
		if ( bld2->type == BUILDING_TELEPORTER && bld2->owner && bld2->owner == bld->owner && bld2 != bld )
		{
			if ( --x <= 0 )
			{
				act( "You teleport to another location!", ch, NULL, NULL, TO_CHAR );
				act( "$n teleports to another location!", ch, NULL, NULL, TO_ROOM );
				move(ch,bld2->x,bld2->y,bld2->z);
				act( "$n appears from the teleport portal.", ch, NULL, NULL, TO_ROOM );
				bld->value[10]--;
				return;
			}
		}
	}
	send_to_char( "Teleporter number not found.\n\r", ch );
	return;
}

void do_coords( CHAR_DATA *ch, char *argument )
{
	char arg[MSL];
	char buf[MSL];
	int num,dir,x,y;
	argument = one_argument(argument,arg);

	if ( argument[0] == '\0' || ( dir = parse_direction(ch,argument) ) == -1 )
	{
		if ( IS_SET(ch->config,CONFIG_BLIND) )
		{
			sprintf( buf, "You are at %d/%d\n\r", ch->x, ch->y );
			send_to_char(buf, ch);
			return;
		}
		send_to_char( "Syntax: coords <number of rooms> <direction>\n\rYou have provided an invalid direction.\n\r", ch );
		return;
	}
	num = atoi(arg);
	if ( num <= 0 )
	{
		send_to_char( "Syntax: coords <number of rooms> <direction>\n\rYou have provided an invalid number of rooms.\n\r", ch );
		return;
	}
	if ( ch->z == Z_AIR )
	{
		send_to_char( "This would lead to: Somewhere!\n\r", ch );
		return;
	}

	x = ch->x;
	y = ch->y;
	if ( dir == DIR_NORTH )
		y += num;
	else if ( dir == DIR_SOUTH )
		y -= num;
	else if ( dir == DIR_WEST )
		x -= num;
	else if ( dir == DIR_EAST )
		x += num;

	sprintf( buf, "That would lead to: %d/%d\n\r", x,y);
	send_to_char(buf,ch);
	return;
}

bool has_boat(CHAR_DATA *ch)
{
	if (IS_IMMORTAL(ch) )
		return TRUE;
	if ( ch->in_vehicle && (IS_SET(ch->in_vehicle->flags,VEHICLE_SWIM) || IS_SET(ch->in_vehicle->flags,VEHICLE_FLOATS) ))
		return TRUE;
/*	if ( my_get_minutes(ch,TRUE) < 10 )
	{
		send_to_char("\n\rFor the first 10 minutes, you are able to  walk across ocean terrain.\n\r", ch );
		return TRUE;
	}*/
	return FALSE;
}

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

  if(ch->in_vehicle != NULL)
  {
    send_to_char("Get out of the vehicle first!", ch);
    return;
  }

  if(map_bld[ch->x][ch->y][Z_GROUND] == NULL || map_bld[ch->x][ch->y][Z_GROUND]->type != BUILDING_TUNNEL)
  {
    send_to_char("You can't tunnel just anywhere! Find a tunnel building!\r\n", ch);
    return;
  }
  if(map_bld[ch->x][ch->y][Z_GROUND]->cost != 0)
  {
    send_to_char("Complete it first!\r\n", ch);
    return;
  } 
  if (map_bld[ch->x][ch->y][Z_GROUND]->active == FALSE)
  {
    send_to_char("You can't tunnel in offline players tunnels!\r\n", ch);
    return;
  } else {
    if(ch->z == Z_UNDER)
    {
      send_to_char("You start tunneling up.\r\n", ch);
      ch->c_sn = gsn_tunnel;
      ch->c_time = 6*PULSE_PER_SECOND;
      return;
    } else {
      send_to_char("You start tunelling down.\r\n", ch);
      ch->c_sn = gsn_tunnel;
      ch->c_time = 6*PULSE_PER_SECOND;
      return;
    }
  }

}