/
rogue24b3/
rogue24b3/data/
/***************************************************************************
 *  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@efn.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			   *
***************************************************************************/

#include "merc.h"
#include "interp.h"

/* random room generation procedure */
ROOM_INDEX_DATA  *get_random_room(CHAR_DATA *ch)
{
    ROOM_INDEX_DATA *room;

    for ( ; ; )
    {
	room = get_room_index( number_range( 0, 65535 ) );
	if (room != NULL )
	if (can_see_room(ch,room)
	&& !AREA_FLAGGED(room->area, AREA_UNLINKED)
	&& !room_is_private(room)
        && !IS_SET(room->room_flags, ROOM_PRIVATE)
        && !IS_SET(room->room_flags, ROOM_SOLITARY) 
	&& !IS_SET(room->room_flags, ROOM_SAFE) 
	&& (IS_NPC(ch) || IS_SET(ch->act,ACT_AGGRESSIVE) 
	|| !IS_SET(room->room_flags,ROOM_LAW)))
            break;
    }

    return room;
}

ACMD(do_enter) {
    ROOM_INDEX_DATA *to_room;
    OBJ_DATA *vehicle, *portal;

    if (ch->fighting != NULL)
	return;

    vehicle = get_obj_list(ch, argument, IN_ROOM(ch)->contents);
    portal  = get_obj_list(ch, argument, IN_ROOM(ch)->contents);

    if (vehicle && vehicle->item_type == ITEM_VEHICLE) {
	if (IS_MOUNTABLE(vehicle))
	    act("You can ride $p, but not get into it.", ch, vehicle, 0, TO_CHAR);
	else if ((to_room = get_room_index(vehicle->value[0])) == NULL)
	    ch->Send("Serious problem: Vehicle has no insides!\n\r");
	else {
	    act("You climb into $p.", ch, vehicle, 0, TO_CHAR);
	    act("$n climbs into $p", ch, vehicle, 0, TO_ROOM);
	    char_from_room(ch);
	    char_to_room(ch, to_room);
	    act("$n climbs in.", ch, 0, 0, TO_ROOM);
	    if (ch->desc != NULL)
		look_at_room(ch, 0);
	}
	return;
    } else if (portal && portal->item_type == ITEM_PORTAL) {
	CHAR_DATA *fch, *fch_next;
	ROOM_INDEX_DATA *old_room = IN_ROOM(ch);

	if (IS_SET(portal->value[2], GATE_RANDOM) || portal->value[3] == -1) {
	    to_room = get_random_room(ch);
	    portal->value[3] = to_room->vnum;
	} else if (IS_SET(portal->value[2], GATE_BUGGY) && (number_percent() < 5))
	    to_room = get_random_room(ch);
	else
	    to_room = get_room_index(portal->value[3]);

	if (to_room == NULL
	|| to_room == old_room
	|| !can_see_room(ch, to_room)
	|| (room_is_private(to_room) && !IS_TRUSTED(ch, IMPLEMENTOR))) {
	    act("$p doesn't seem to go anywhere.", ch, portal, 0, TO_CHAR);
	    return;
	}

	if (MOB_FLAGGED(ch, ACT_AGGRESSIVE) && ROOM_FLAGGED(to_room, ROOM_LAW)) {
		ch->Send("Something prevents you from leaving...\n\r");
		return;
	}

	act("$n steps into $p.", ch, portal, NULL, TO_ROOM);

	if (IS_SET(portal->value[2], GATE_NORMAL_EXIT))
	    act("You enter $p.", ch, portal, NULL, TO_CHAR);
	else
	    act("You walk through $p and find yourself somewhere else...",
		ch, portal, NULL, TO_CHAR);

	char_from_room(ch);
	char_to_room(ch, to_room);

	if (IS_SET(portal->value[2], GATE_GOWITH)) {
	    obj_from_room(portal);
	    obj_to_room(portal, to_room);
	}

	if (IS_SET(portal->value[2], GATE_NORMAL_EXIT))
	    act("$n has arrived.", ch, portal, NULL, TO_ROOM);
	else
	    act("$n has arrived through $p.", ch, portal, NULL, TO_ROOM);

	look_at_room(ch, 0);

	if (portal->value[0] > 0) {
	    portal->value[0]--;
	    if (portal->value[0] == 0)
		portal->value[0] = -1;
	}

	if (old_room == to_room)
	    return;

	for (fch = old_room->people; fch != NULL; fch = fch->next) {
	    fch_next = fch->next_in_room;

	    if (portal == NULL || portal->value[0] == -1)
		continue;
	    if (fch->master != ch)
		continue;

	    if (AFF_FLAGGED(fch, AFF_CHARM) && fch->position < POS_STANDING)
		do_function(fch, &do_stand, "", 0);

	    if (fch->position == POS_STANDING) {
		if (ROOM_FLAGGED(to_room, ROOM_LAW)
		&& MOB_FLAGGED(fch, ACT_AGGRESSIVE)) {
		    act("You can't bring $N into the city.", ch, 0, fch, TO_CHAR);
		    act("You aren't allowed in the city.", fch, 0, 0, TO_CHAR);
		    continue;
		}
	    }
	    act("You follow $N.", fch, 0, ch, TO_CHAR);
	    do_function(fch, &do_enter, argument, 0);
	}

	if (portal != NULL && portal->value[0] == -1) {
	    act("$p fades out of existence.", ch, portal, 0, TO_CHAR);
	    if (ch->in_room == old_room)
		act("$p fades out of existence.",ch,portal,NULL,TO_ROOM);
	    else if (old_room->people != NULL) {
		act("$p fades out of existence.",
		old_room->people,portal,NULL,TO_CHAR);
		act("$p fades out of existence.", old_room->people, portal, 0, TO_ROOM);
	    }
	    extract_obj(portal);
	}
	if (IS_NPC(ch) && HAS_TRIGGER(ch, TRIG_ENTRY))
		mp_percent_trigger(ch, NULL, NULL, NULL, TRIG_ENTRY);
	if (!IS_NPC(ch))
		mp_greet_trigger(ch);
	return;
    } else if (vehicle || portal)
	ch->Send("You cannot enter that!\n\r");
    else
	ch->Send("You do not see that here.\n\r");
}

ACMD(do_leave) {
    OBJ_DATA *hatch, *vehicle;
    OBJ_DATA *find_vehicle_by_vnum(int vnum);

    if ((hatch = get_obj_list_type(ITEM_V_HATCH, IN_ROOM(ch)->contents))) {
	vehicle = find_vehicle_by_vnum(hatch->value[0]);

	if (!vehicle || IN_ROOM(vehicle) == NULL) {
	    ch->Send("The hatch seems to lead nowhere...\n\r");
	    return;
	}
	act("$n leaves $p.", ch, vehicle, 0, TO_ROOM);
	act("You climb out of $p.", ch, vehicle, 0, TO_CHAR);
	char_from_room(ch);
	char_to_room(ch, IN_ROOM(vehicle));
	act("$n climbs out of $p.", ch, vehicle, 0, TO_ROOM);

	if (ch->desc != NULL)
	    look_at_room(ch, 0);
	return;
    } else if (!ROOM_FLAGGED(IN_ROOM(ch), ROOM_INDOORS))
	ch->Send("You are outside.. where do you want to go?\n\r");
    else
	ch->Send("I see no obvious exits to the outside.\n\r");
    return;
}