envy22/
envy22/log/
envy22/player/
envy22/src/Contributions/
From wildcat@vantek.net  Wed Jun 19 04:28:49 1996
Received: from vtcom3.vantek.net (vtcom3.vantek.net [205.161.186.2]) by soda.CSUA.Berkeley.EDU (8.6.12/8.6.12) with ESMTP id VAA21386 for <michael@CSUA.Berkeley.EDU>; Tue, 18 Jun 1996 21:28:46 -0700
Received: from wildcat ([205.161.186.151]) by vtcom3.vantek.net (8.6.9/8.6.9) with SMTP id WAA11798 for <michael@CSUA.Berkeley.EDU>; Tue, 18 Jun 1996 22:24:20 -0500
Message-ID: <31C77465.2CFF@vantek.net>
Date: Tue, 18 Jun 1996 22:30:45 -0500
From: Bryan Cromartie <wildcat@vantek.net>
Reply-To: wildcat@vantek.net
X-Mailer: Mozilla 3.0B2 (Win95; I)
MIME-Version: 1.0
To: Michael Quan <michael@CSUA.Berkeley.EDU>
Subject: Scan Command contribution for Envy 2.2
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Status: RO

Greetings,

	My name is Bryan Cromartie in rl. I have not only enjoyed playing Merc
throughout it's original incarnations, but well into its release as
Envy 1 and 2. Given the imminent release of Envy 2.2, I would like to
contribute a custom scan command I created for Glass Dragon Mud. It
handles everything I can thing of and can be easily tweaked if you'd
like to modify it. It has been thoroughly tested with Merc2.2 and Envy
1 & 2.
	It checks carefully in all directions for exits, pcs/npcs, and informs
you of closed doors and distances. It is currently set to scan 4 hexes
away if memory serves me, and may be controlled for distance through
the parse variable.

Respectfully,
Bryan Cromartie aka Martek of Glass Dragon

Scan command as follows ( declare function in merc.h and command entry
in interp.c )

/* Scan command coded by Martek of Glass Dragon */
void do_scan( CHAR_DATA *ch, char *argument )
{
    ROOM_INDEX_DATA *pRoom;
    ROOM_INDEX_DATA *toRoom;
    int d, parse;
    bool nexit;
    bool seen;
    char buf[MAX_STRING_LENGTH];
    char *const exitname[] =
	{ "North", "East", "South", "West", "Up", "Down" };

    /* Look in all directions and assume we have no exits until we find one */
    nexit = TRUE;
    for (d = 0; d <= 5; d++)
    {
	pRoom = ch->in_room;
        if ( pRoom == NULL
	|| pRoom->exit[d] == NULL
	|| (toRoom = pRoom->exit[d]->to_room) == NULL )
	    continue;
	nexit = FALSE;

        sprintf(buf, "%s:", exitname[d]);
        send_to_char(buf, ch);

        /* We found an exit, so let's look in that direction */
        for (parse = 1; parse <= 4 ; parse++)
        {
            if (pRoom->exit[d] == NULL
	    || (toRoom = pRoom->exit[d]->to_room) == NULL )
                break;

	    /* We can't look through closed doors
	     * We stop here if we find one */
	    if ( IS_SET(pRoom->exit[d]->exit_info, EX_CLOSED) )
	    {
		sprintf( buf, " Closed Door (%d away).\n\r", parse - 1 );
		send_to_char( buf, ch );
		break;
	    }

	    /* If the room is valid we show the player who's inside */
            pRoom = pRoom->exit[d]->to_room;
	    seen = FALSE;
            if ( pRoom != NULL && pRoom->people !=NULL)
            {
		CHAR_DATA *rch;

		for ( rch = pRoom->people; rch != NULL;
		      rch = rch->next_in_room )
		{
		    if ( !can_see( ch, rch ) )
			continue;

		    seen = TRUE;
		    sprintf( buf, " %s,", PERS( rch, ch ) );
		    send_to_char( buf, ch );
		}

	        /* Only show the player who's inside if someone there */
		if ( seen )
		{
		    sprintf( buf, " (%d away).\n\r", parse );
		    send_to_char( buf, ch );
		}
            }
        }
    }

    /* Inform the character of an isolated room */
    if( nexit )
	send_to_char( "This room has no exits!\n\r", ch );

    return;
}