/****************************************************************************

  Keypad snippet, made by -Riketsu. Use this to your discretion. I am not
responsible for damage to area files, so, before installing this code, BACK
UP YOUR AREA FILES. Even tho, it shouldnt bug, since I already tested it in
a MUD.

-Enderandrew:
Made minor changes to port to SWFotE - If they're wrong, throw something at
me via gangrel@punkass.com

****************************************************************************/
--------------------------------------------------------------------------
MUD.H ---- at the end of struct	exit_data
--------------------------------------------------------------------------
After: sh_int		distance;	/* how far to the next room	*/
Add:   int                 keypad;         /* Key Pad Password             */

--------------------------------------------------------------------------
DB.C
--------------------------------------------------------------------------
Find:
		  sscanf( ln, "%d %d %d %d",
		      &x1, &x2, &x3, &x4);

		  locks			= x1;
		  pexit->key		= x2;
		  pexit->vnum		= x3;
		  pexit->vdir		= door;
		  pexit->distance	= x4;

Change to:
		  sscanf( ln, "%d %d %d %d %d",
		      &x1, &x2, &x3, &x4, &x5);

		  locks			= x1;
		  pexit->key		= x2;
		  pexit->vnum		= x3;
		  pexit->vdir		= door;
		  pexit->distance	= x4;
		  pexit->keypad         = x5;

NOTE: You gotta change also...
        sscanf( ln, "%d %d %d %d %d %d %d",
          &x1, &x2, &x3, &x4, &x5, &x6, &x7 );
    -You gotta make it that it holds also the pexit->keypad
Enderandrew's Note: I'm not sure the above line needs changing.  I could
be wrong!
--------------------------------------------------------------------------
BUILD.C
--------------------------------------------------------------------------
Before: if ( !str_cmp( arg, "sector" ) )
Add:
    if ( !str_cmp( arg, "keypad" ) )
    {
        argument = one_argument( argument, arg2 );
        argument = one_argument( argument, arg3 );
        if ( arg2[0] == '\0' || arg3[0] == '\0' )
        {
            send_to_char( "Usage: redit keypad <dir> #####\n\r", ch );
            return;
        }

        if ( arg2[0] == '#' )
        {
            edir = atoi( arg2+1 );
            xit = get_exit_num( location, edir );
        }
        else
        {
            edir = get_dir( arg2 );
            xit = get_exit( location, edir );
        }
        value = atoi( arg3 );
        if ( strlen(arg3) != 5 )
        {
            send_to_char( "Usage: redit keypad <dir> #####\n\r", ch );
            return;
        }
        if (!is_number(arg3))
        {
            send_to_char( "Usage: redit keypad <dir> #####\n\r", ch );
            return;
        }
        if ( !xit )
        {
            send_to_char( "No exit in that direction.  Use 'redit exit ...' first.\n\r", ch );
            return;
        }
        xit->keypad = value;
        send_to_char( "Done.\n\r", ch );
        return;
    }
--------------------------------------------------------
Change:
         sprintf( buf, "Flags for exit direction: %d  Keywords: %s  Key: %d\n\r[ ",
             xit->vdir, xit->keyword, xit->key);
To:
         sprintf( buf, "Flags for exit direction: %d  Keywords: %s  Key: %d KeyPad: %d\n\r[ ",
             xit->vdir, xit->keyword, xit->key, xit->keypad );

--------------------------------------------------------
Change:
	     fprintf( fpout, "%d %d %d %d\n",	xit->exit_info & ~EX_BASHED,
	   					xit->key,
	   					xit->vnum,
	   					xit->distance );
	   else
	     fprintf( fpout, "%d %d %d\n",	xit->exit_info & ~EX_BASHED,
	   					xit->key,
	   					xit->vnum );
To:
	     fprintf( fpout, "%d %d %d %d %d\n",	xit->exit_info & ~EX_BASHED,
	   					xit->key,
	   					xit->vnum,
	   					xit->distance,
	   					xit->keypad );
	   else
	     fprintf( fpout, "%d %d %d %d\n",	xit->exit_info & ~EX_BASHED,
	   					xit->key,
	   					xit->vnum,
	   					xit->keypad );

--------------------------------------------------------------------------
ACT_WIZ.C
--------------------------------------------------------------------------
Change:
		"%2d) %2s to %-5d.  Key: %d  Flags: %d  Keywords: '%s'.\n\rDescription: %sExit links back to vnum: %d  Exit's RoomVnum: %d  Distance: %d\n\r",
		++cnt,
		dir_text[pexit->vdir],
		pexit->to_room ? pexit->to_room->vnum : 0,
		pexit->key,
		pexit->exit_info,
		pexit->keyword,
		pexit->description[0] != '\0'
		    ? pexit->description : "(none).\n\r",
		pexit->rexit ? pexit->rexit->vnum : 0,
		pexit->rvnum,
		pexit->distance );
To:
		"%2d) %2s to %-5d.  Key: %d  Flags: %d  Keywords: '%s'.\n\rDescription: %sExit links back to vnum: %d  Exit's RoomVnum: %d  Distance: %d  Keypad: %d\n\r",
		++cnt,
		dir_text[pexit->vdir],
		pexit->to_room ? pexit->to_room->vnum : 0,
		pexit->key,
		pexit->exit_info,
		pexit->keyword,
		pexit->description[0] != '\0'
		    ? pexit->description : "(none).\n\r",
		pexit->rexit ? pexit->rexit->vnum : 0,
		pexit->rvnum,
		pexit->distance,
		pexit->keypad );

--------------------------------------------------------------------------
ACT_MOVE.C
--------------------------------------------------------------------------

void do_keypad( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char arg1[MAX_INPUT_LENGTH];
    EXIT_DATA *pexit;
    int password;
    argument = one_argument( argument, arg );
    argument = one_argument( argument, arg1 );

    password = atoi(arg1);

    if ( arg[0] == '\0' || arg1[0] == '\0')
    {
        send_to_char( "Syntax: Keypad <Direction> #####\n\r", ch );
        return;
    }
    if ( ( pexit = find_door( ch, arg, TRUE ) ) != NULL )
    {
        /* 'unlock door' */
        if (IS_SET(pexit->exit_info, EX_LOCKED)   )
        {
         if ( pexit->keypad == 0 )
             { send_to_char( "You can't do that.\n\r",      ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_ISDOOR) )
             { send_to_char( "You can't do that.\n\r",      ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_CLOSED) )
             { send_to_char( "It's not closed.\n\r",        ch ); return; }
         if ( pexit->keypad < 1 && !IS_SET(pexit->exit_info, EX_SECRET) )
             { send_to_char( "It can't be unlocked.\n\r",   ch ); return; }
         if ( password != pexit->keypad )
             { send_to_char( "&RACCESS DENIED.\n\r",       ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_SECRET)
         ||   (pexit->keyword && nifty_is_name( arg, pexit->keyword )) )
         {
             send_to_char( "&GACCESS GRANTED!\n\rUnlocking...\n\r", ch );
             act( AT_ACTION, "$n types a code on the keypad.", ch, NULL, NULL, TO_ROOM );
             remove_bexit_flag( pexit, EX_LOCKED );
             return;

         }
        }
        else if (!IS_SET(pexit->exit_info, EX_LOCKED)   )
        {
         /*lock door*/
         if ( pexit->keypad == 0 )
             { send_to_char( "You can't do that.\n\r",      ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_ISDOOR) )
             { send_to_char( "You can't do that.\n\r",      ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_CLOSED) )
             { send_to_char( "It's not closed.\n\r",        ch ); return; }
         if ( pexit->keypad < 1 && !IS_SET(pexit->exit_info, EX_SECRET) )
             { send_to_char( "It can't be unlocked.\n\r",   ch ); return; }
         if ( password != pexit->keypad )
             { send_to_char( "&RACCESS DENIED.\n\r",       ch ); return; }
         if ( !IS_SET(pexit->exit_info, EX_SECRET)
         ||   (pexit->keyword && nifty_is_name( arg, pexit->keyword )) )
         {
             send_to_char( "&GACCESS GRANTED!\n\rLocking...\n\r", ch );
             act( AT_ACTION, "$n types a code on the keypad.", ch, NULL, NULL, TO_ROOM );
             set_bexit_flag( pexit, EX_LOCKED );
             return;

         }
        }
    }
    ch_printf( ch, "You see no %s here.\n\r", arg );
    return;
}
--------------------------------------------------------------------------
None.C
--------------------------------------------------------------------------
Add the proper definitions for tables.c and mud.h
Add the command into the mud.
Make Clean
Make

-Done.