From: despair@seeker.hermesnet.net

Here's another -- I coded this way back for a merc type mud...back before
OLC and portal spells and such...however, I think it still makes for a
really cool IMMORTAL command.

Portal essentually creates a door from the room you're in, to another room
with the description 'portal'.  It will accept the argument as a number
(vnum of the room to connect with), or a character name (will connect the
room they're in -- also, you specify whether the door will be openpath,
closed..etc... and you can specify a key.  Portals will not save through
reboot.

Type 'portal' with no arguments to see correct syntax.  

I hope that it ports correctly..I really havn't taken a great amount of
time to make sure that it's working spic-n-span with ROM; however, I did
enable it on my mud and it seemed to work fine :)


Amadeus
--------------


 /* An 'Amadeus Contribution' */
void do_portal( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char arg3 [MAX_INPUT_LENGTH];
    char arg4 [MAX_INPUT_LENGTH];
    char buf  [MAX_STRING_LENGTH];
    EXIT_DATA *pexit;  
    ROOM_INDEX_DATA *location;
    CHAR_DATA *victim;
    int door, j;
    char *dir[] =
     {
       "north", "east", "south", "west", "up", "down" 
     };


    char *stat[] =
     {
       "openpath", "isdoor", "pickproof", "passproof" 
     };
    

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );
    one_argument( argument, arg4 );

      for ( door = 0; door < 6; door++)
        if ( !str_prefix( arg1, dir[door]) )
             break;
    
      for ( j = 0; j < 4; j++ )
        if ( !str_prefix( arg2, stat[j]) )
            break;

      if ( !str_cmp( arg2, "remove") )
      {
	 if ( ( pexit = ch->in_room->exit[door] ) == NULL )
          {
           send_to_char( "\n\rNo exit exists in that direction.\n\r", ch );
           return;
          } 

         if ( str_cmp( pexit->keyword, "portal") )
         {
             send_to_char( "Exit is an area preset, not a portal.\n\r", ch );
             return;
         }

         pexit = ch->in_room->exit[door];
         free_string(pexit->keyword);
         free_string(pexit->description);

/*   Do you have anymore pexit-> strings that should be freed if it were 
 *   removed ( with free_string) ?
 */
	 if (pexit)
           free_mem(pexit,sizeof(EXIT_DATA));
         ch->in_room->exit[door] = NULL;
         sprintf( buf, "\n\rExit to the %s removed.\n\r", dir[door]);
         send_to_char( buf, ch);
         sprintf( buf, "%s concentrates for a moment...and the %s exit suddenly vanishes!\n\r", capitalize( ch->name ), dir[door]);
         act( buf, ch, NULL, NULL, TO_ROOM);     
         return;
      }


      if ( arg1[0] == '\0' || arg2[0] == '\0' 
	   || j == 4 || door == 10 || arg3[0] == '\0'
  	   || ( arg4[0] != '\0' && !is_number(arg4)) )
      {
	send_to_char( "Syntax: portal <direction> <status> <vnum of room to connect> <key vnum>\n\r",         ch );
	send_to_char( "    Or: portal <direction> <status> <person/mob>\n\r", ch );
	send_to_char( "    Or: portal <direction> remove\n\r\n\r",        ch );
        send_to_char( "direction being one of:\n\r",                      ch );
	send_to_char( "  north, south, east, west, up, down\n\r",         ch );
	send_to_char( "status being either:\n\r",                         ch );
        send_to_char( "  openpath, isdoor, pickproof, passproof\n\r\n\r", ch );
        send_to_char( "note:  It is not necessary to set a key vnum.\n\r\n\r", ch);
        return;
      }  
      

      if ( ( pexit = ch->in_room->exit[door] ) != NULL )
      {
           send_to_char( "\n\rAn exit already exists in that direction.\n\r", ch );
           return;
      } 
 
      if ( ( location = find_location( ch, arg3) ) == NULL )
      {
           send_to_char( "The room that you wish to connect to does not exist.\n\r", ch);
           return;
      }

      if ( room_is_private( location = find_location( ch, arg3 )) && get_trust(ch) < MAX_LEVEL )
      {
           send_to_char( "The room that you wish to connect to is private.\n\r", ch);
           return;
      }

      if ( ( location = find_location( ch, arg3 ) ) == ch->in_room )
      {
           send_to_char( "Why would you want to create a portal to this room?\n\r", ch );
           return;
      }
  
       

      pexit                    = alloc_mem( sizeof( EXIT_DATA ) );
      ch->in_room->exit[door]  = pexit;
      pexit->description       = str_dup( "A mysterious portal.\n\r" ); 
      pexit->keyword           = str_dup( "portal");
      pexit->key               = is_number(arg4)?atoi(arg4):-1;
      
      if ( is_number( arg3 ) )
         pexit->u1.vnum              = atoi(arg3);
      else
      {
           victim                 = get_char_world( ch, arg3 );
 	   pexit->u1.vnum	          = victim->in_room->vnum;
      }
      pexit->u1.to_room	       = location;
      pexit->exit_info         = 0; 
	
/*   Does your code have anymore pexit-> fields that need to be set other 
 *   than the ones listed above?  I don't think so..but better check :)
 */


      switch (j)
      {
         case 3: pexit->exit_info |= EX_NOPASS | EX_CLOSED | EX_LOCKED;
         case 2: pexit->exit_info |= EX_PICKPROOF | EX_CLOSED | EX_LOCKED;
         case 1: pexit->exit_info |= EX_ISDOOR;
      } 
         
      if ( is_number( arg3 ) )
	sprintf( buf, "\n\r'Portal' created %s, to room %d - key is object %d.\n\r", dir[door], atoi(arg3), atoi(arg4) );
      else
        sprintf( buf, "\n\r'Portal' created %s, to %s's room - key is object %d.\n\r", dir[door], str_dup(arg3), atoi(arg4) );
      send_to_char( buf, ch);
   
      sprintf( buf, "%s concentrates for a moment as a mysterious portal appears going %s.\n\r", capitalize( ch->name ), dir[door] );
      act( buf, ch, NULL, NULL, TO_ROOM);

      return;

}
