/
Sapphire/bin/
Sapphire/db/
Sapphire/db/OLC_rooms/
Sapphire/db/abi/
Sapphire/db/em_src/
Sapphire/db/helps/
Sapphire/db/helps/emman/ifunc/
Sapphire/db/npcs/Tatt/
Sapphire/db/objects/Tatt/
Sapphire/db/q_data/
Sapphire/db/rooms/Tatt/
Sapphire/doc/
Sapphire/doc/em/
Sapphire/etc/
Sapphire/src/abic/
Sapphire/src/areacon/
Sapphire/src/client/
Sapphire/src/embc/
Sapphire/src/emi/
Sapphire/src/emi/test/
Sapphire/src/include/
Sapphire/src/sapphire/em/
Sapphire/src/tcon/
/*
 * Copyright (C) 1995-1997 Christopher D. Granz
 *
 * This header may not be removed.
 *
 * Refer to the file "License" included in this package for further
 * information and before using any of the following.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

#include "sapphire.h"


/*
 * Functions
 */
void cmd_control( CHAR_DATA *pChar, char *pArgument )
{
    ROOM_INDEX_DATA *pRoom = pChar->pInRoom;
    CHAR_DATA *pToChar;

    if ( pChar->pTerm == NULL )
        return;

    if ( IS_NPC( pChar ) )
    {
        send_string( pChar, "NPCs cannot control other NPCs.\n\r" );
        return;
    }

#ifdef DEBUG
    if ( pRoom == NULL )
    {
        wcdebug( "Character not in room." );
        char_to_room( pChar, uDefaultRoom.pRoom );
        pRoom = pChar->pInRoom;
    }
#endif

    if ( pArgument[0] == '\0' )
    {
        send_string( pChar, "Usage: control <NPC name>\n\r" );
        return;
    }

    for ( pToChar = pRoom->pPeople; pToChar != NULL;
      pToChar = pToChar->pNextInRoom )
    {
        if ( IS_NPC( pToChar )
          && multi_compare_2( pArgument, pToChar->pNPCData->pNameList )
          == TRUE )
            break;
    }

    if ( pToChar == NULL )
    {
        send_string( pChar, "No NPC with that name here.\n\r" );
        return;
    }

    if ( pToChar->pTerm != NULL )
    {
        send_string( pChar,
          "That NPC is already being controlled by someone else.\n\r" );
        return;
    }

    if ( pToChar == pChar )
    {
        send_string( pChar, "You already control yourself.\n\r" );
        return;
    }

    if ( pChar->pTerm->pControlled != NULL )
        pChar->pTerm->pControlled->pTerm = NULL;

    send_game_message( "~c has left this world.", MESSAGE_DEST_ROOM,
      TRUE, pChar, NULL, pChar->pInRoom, TRUE, NUMBER_POSITION_RESTING,
      pChar );
    char_from_room( pChar );
    term_send_string( pChar->pTerm,
      "%s\n\rType `$return' to return to your character.\n\r",
      make_ansi_code( ANSI_CODEREF_EF_CSCREEN, NULL, NULL,
      pChar->pTerm ) );

    pChar->pTerm->pControlled            = pToChar;
    pToChar->pTerm                       = pChar->pTerm;
    pChar->pTerm                         = NULL;
}


void cmd_return( CHAR_DATA *pChar, char *pArgument )
{
    TERM_DATA *pTerm;

    if ( ( pTerm = pChar->pTerm ) == NULL )
        return;

    if ( pChar->pTerm->pControlled == NULL )
    {
        send_string( pChar,
          "You are not controlling an NPC right now.\n\r" );
        return;
    }

    pTerm->pControlled  = NULL;
    pTerm->pChar->pTerm = pTerm;
    pChar->pTerm        = NULL;
    char_to_room( pTerm->pChar, uDefaultRoom.pRoom );

    send_game_message( "~h appears out of nothingness.",
      MESSAGE_DEST_ROOM, TRUE, pTerm->pChar, NULL, pTerm->pChar->pInRoom,
      TRUE, NUMBER_POSITION_RESTING, pTerm->pChar );
    term_send_string( pTerm, "%s", make_ansi_code( ANSI_CODEREF_EF_CSCREEN,
      NULL, NULL, pTerm ) );
}


/*
 * Lists all currently connected users.
 */
void cmd_users( CHAR_DATA *pChar, char *pArgument )
{
    TERM_DATA *pTerm;
    char cBuf[128];

    if ( pChar->pTerm == NULL )
        return;

    setup_string_pager( pChar->pTerm );

    for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
    {
        sprintf( cBuf, "[%3d %3d] [%s] : %-50.50s\n\r",
          pTerm->sTelnetSocket, pTerm->sBinarySocket,
          state_string( pTerm->iConState ), pTerm->pHostname );
        page_string( pChar->pTerm, cBuf );
    }

    finish_string_pager( pChar->pTerm );
}


void cmd_servers( CHAR_DATA *pChar, char *pArgument )
{
    MUD_COMM_DATA *pMUDComm;
    char cBuf[128];

    if ( pChar->pTerm == NULL )
        return;

    setup_string_pager( pChar->pTerm );

    for ( pMUDComm = pMUDCommList; pMUDComm; pMUDComm = pMUDComm->pNext )
    {
        sprintf( cBuf, "[%3d] [%s] : %-50.50s\n\r",
          pMUDComm->sMUDCommSocket, mstate_string( pMUDComm->iConState ),
          pMUDComm->pHostname );
        page_string( pChar->pTerm, cBuf );
    }

    finish_string_pager( pChar->pTerm );
}


/*
 * Returns a human readable string given a terminal connected state.
 */
char *state_string( int iState )
{
    switch ( iState )
    {
      case CON_SAPPHIRE_IDENT   : return ( "sap_ident" );
      case CON_SYSTEM_SHELL     : return ( "dev_shell" );
      case CON_NPC_EDITOR       : return ( "npc_edit " );
      case CON_OBJECT_EDITOR    : return ( "obj_edit " );
      case CON_ROOM_EDITOR      : return ( "room_edit" );
      case CON_RUNNING_CHILD    : return ( "run_child" );
      case CON_PLAYING          : return ( " playing " );
      case CON_GET_LOCAL_ECHO_ON: return ( "get_lecho" );
      case CON_GET_CLIENT_TYPE  : return ( "get_ctype" );
      case CON_MAIN_MENU        : return ( "main_menu" );
      case CON_GET_NAME         : return ( "get_name " );
      case CON_GET_CREATION_CODE: return ( "get_ccode" );
      case CON_GET_PASSWORD     : return ( "get_passw" );
      case CON_CREATION_MENU    : return ( "crea_menu" );
      case CON_GET_RACE         : return ( "get_race " );
      case CON_ROLL_STATS       : return ( "roll_stat" );
      case CON_GET_SEX          : return ( " get_sex " );
      case CON_GET_HAIR_COLOR   : return ( "get_hclr " );
      case CON_GET_EYE_COLOR    : return ( "get_eclr " );
      case CON_GET_HEIGHT       : return ( "get_hight" );
      case CON_GET_WEIGHT       : return ( "get_wight" );
      case CON_READ_MOTD        : return ( "read_motd" );
      case CON_RECONNECT        : return ( "reconnect" );
      default                   : break;
    }

    return ( " unknown " );
}


char *mstate_string( int iState )
{
    switch ( iState )
    {
      case MUD_COMM_CON_IDENT   : return ( " ident " );
      case MUD_COMM_CON_READY   : return ( " ready " );
      default                   : break;
    }

    return ( "unknown" );
}


/*
 * Disconnects a site.
 */
void cmd_disconnect( CHAR_DATA *pChar, char *pArgument )
{
    MUD_COMM_DATA *pMUDComm;
    TERM_DATA *pTerm;
    char cArg[MAX_INPUT];
    int iDesc;

    pArgument = one_arg( pArgument, cArg );

    if ( cArg[0] == '\0' || is_number( cArg ) != TRUE
      || ( iDesc = atoi( cArg ) ) < 0 )
    {
        send_string( pChar, "Usage: disconnect <socket>\n\r" );
        return;
    }

    for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
    {
        if ( pTerm->sTelnetSocket == iDesc
          || pTerm->sBinarySocket == iDesc )
            break;
    }

    if ( pTerm == NULL )
    {
        for ( pMUDComm = pMUDCommList; pMUDComm != NULL;
          pMUDComm = pMUDComm->pNext )
        {
            if ( pMUDComm->sMUDCommSocket == iDesc )
                break;
        }
    }

    if ( pTerm == NULL && pMUDComm == NULL )
    {
        send_string( pChar, "No such socket.\n\r" );
        return;
    }

    send_string( pChar, "Disconnecting.\n\r" );
    term_send_string( pTerm, "You have been disconnected.\n\r" );
    close_connection( &pTerm );
}


/*
 * Shows the current creation code.
 */
void cmd_ccode( CHAR_DATA *pChar, char *pArgument )
{
    if ( iCreationCodeTimer < 0 )
    {
        send_string( pChar, "Creation codes are not activated.\n\r" );
        return;
    }

    send_string( pChar, "The current creation code is: `%s'\n\r",
      cCreationCode );
    iCreationCodeTimer = 300; /* Five minutes. */
}


/*
 * Creates an instance of an NPC or object.
 */
void cmd_create( CHAR_DATA *pChar, char *pArgument )
{
    char cBuf1[MAX_INPUT];
    char cBuf2[MAX_INPUT];
    int iNumber;

    pArgument  = one_arg( pArgument, cBuf1 );
    one_arg( pArgument, cBuf2 );

    if ( cBuf1[0] == '\0' || cBuf2[0] == '\0'
      || is_number( cBuf2 ) != TRUE )
        goto usage;

    iNumber    = atoi( cBuf2 );

    if ( str_prefix( cBuf1, "npc" ) == TRUE )
    {
        NPC_INDEX_DATA *pNPCIndex;
        CHAR_DATA *pChar2;

        if ( iNumber <= 5 )
        {
            send_string( pChar, "Illegal object number `%d'.\n\r",
              iNumber );
            return;
        }

        if ( ( pNPCIndex = get_npc_index( iNumber ) ) == NULL )
        {
            send_string( pChar, "No NPC with the number `%d'.\n\r",
              iNumber );
            return;
        }

        pChar2 = new_npc( pNPCIndex, pChar );
        char_to_room( pChar2, pChar->pInRoom );
        send_string( pChar, "NPC created.\n\r" );
        return;
    }
    else if ( str_prefix( cBuf1, "object" ) == TRUE )
    {
        OBJ_INDEX_DATA *pObjIndex;
        OBJ_DATA *pObj;

        if ( iNumber <= 5 )
        {
            send_string( pChar, "Illegal object number `%d'.\n\r",
              iNumber );
            return;
        }

        if ( ( pObjIndex = get_object_index( iNumber ) ) == NULL )
        {
            send_string( pChar, "No object with the number `%d'.\n\r",
              iNumber );
            return;
        }

        pObj   = new_object( pObjIndex, pChar );

        if ( IS_SET( pObj->fObjFlags, FLAG_OBJECT_UNTAKEABLE ) )
            obj_to_room( pObj, pChar->pInRoom );
        else
            obj_to_char( pObj, pChar );

        send_string( pChar, "Object created.\n\r" );
        return;
    }

usage:
    send_string( pChar,
      "Usage: create <\"npc\"|\"object\"> <number>\n\r" );
}


/*
 * Destroys an instance of an NPC or object.
 */
void cmd_destroy( CHAR_DATA *pChar, char *pArgument )
{
    ROOM_INDEX_DATA *pRoom = pChar->pInRoom;
    char cBuf1[MAX_INPUT];
    char cBuf2[MAX_INPUT];

    pArgument              = one_arg( pArgument, cBuf1 );
    one_arg( pArgument, cBuf2 );
#ifdef DEBUG
    if ( pRoom == NULL )
    {
        wcdebug( "Character not in room." );
        return;
    }
#endif
    if ( cBuf1[0] == '\0' || cBuf2[0] == '\0' )
        goto usage;

    if ( str_prefix( cBuf1, "npc" ) == TRUE )
    {
        CHAR_DATA *pChar2;

        for ( pChar2 = pRoom->pPeople; pChar2;
          pChar2 = pChar2->pNextInRoom )
        {
            if ( IS_NPC( pChar2 )
              && multi_compare_2( cBuf2, pChar2->pNPCData->pNameList )
              == TRUE )
            {
                if ( pChar2->pTerm != NULL )
                {
                    pChar2->pTerm->pControlled  = NULL;
                    pChar2->pTerm->pChar->pTerm = pChar2->pTerm;
                    char_to_room( pChar2->pTerm->pChar,
                      uDefaultRoom.pRoom );
                }

                char_from_room( pChar2 );
                free_char( &pChar2 );
                send_string( pChar, "NPC destroyed.\n\r" );
                return;
            }
        }

        send_string( pChar, "No such NPC here.\n\r" );
        return;
    }
    else if ( str_prefix( cBuf1, "object" ) == TRUE )
    {
        OBJ_DATA *pObj;

        for ( pObj = pChar->pInven; pObj; pObj = pObj->pNextContent )
        {
            if ( multi_compare_2( cBuf2, pObj->pNameList ) == TRUE )
            {
                obj_from_char( pObj );
                free_obj( &pObj );
                send_string( pChar, "Object destroyed.\n\r" );
                return;
            }
        }

        for ( pObj = pRoom->pContents; pObj; pObj = pObj->pNextContent )
        {
            if ( multi_compare_2( cBuf2, pObj->pNameList ) == TRUE )
            {
                obj_from_room( pObj );
                free_obj( &pObj );
                send_string( pChar, "Object destroyed.\n\r" );
                return;
            }
        }

        send_string( pChar, "No such object here.\n\r" );
        return;
    }

usage:
    send_string( pChar,
      "Usage: destroy <\"npc\"|\"object\"> <name>\n\r" );
}


void cmd_lookup( CHAR_DATA *pChar, char *pArgument )
{
    send_string( pChar,
      "Sorry, this command is not ready for use yet.\n\r" );
}


void cmd_stat( CHAR_DATA *pChar, char *pArgument )
{
    ROOM_INDEX_DATA *pRoom = pChar->pInRoom;
    char cBuf1[MAX_INPUT];
    char cBuf2[MAX_INPUT];
    char cBuf3[MAX_STRING];

    pArgument              = one_arg( pArgument, cBuf1 );
    one_arg( pArgument, cBuf2 );
#ifdef DEBUG
    if ( pRoom == NULL )
    {
        wcdebug( "Character not in room." );
        return;
    }
#endif
    if ( cBuf1[0] == '\0' || cBuf2[0] == '\0' )
        goto usage;

    setup_string_pager( pChar->pTerm );

    if ( str_prefix( cBuf1, "character" ) == TRUE )
    {
        CHAR_DATA *pChar2;

        for ( pChar2 = pRoom->pPeople; pChar2;
          pChar2 = pChar2->pNextInRoom )
        {
            if ( IS_NPC( pChar2 ) )
            {
                if ( multi_compare_2( cBuf2, pChar2->pNPCData->pNameList )
                  == TRUE )
                    break;
            }
            else
            {
                if ( multi_compare( cBuf2, pChar2->pPCData->sName )
                  == TRUE )
                    break;
            }
        }

        if ( pChar2 == NULL )
            page_string( pChar->pTerm, "No such character here.\n\r" );
        else
        {
            snprintf( cBuf3, MAX_STRING,
              "NPC                      %s\n\r"
              "Name                     \"%s\"\n\r",
              ( IS_NPC( pChar2 ) ? "Yes" : "No" ),
              ( IS_NPC( pChar2 ) ? pChar2->pNPCData->pNameList[0]
              : pChar2->pPCData->sName ) );
            page_string( pChar->pTerm, cBuf3 );

            if ( IS_NPC( pChar2 ) )
            {
                snprintf( cBuf3, MAX_STRING, "\n\r"
                  "Short description        \"%s\"\n\r",
                  pChar2->pNPCData->sShortDesc );
                page_string( pChar->pTerm, cBuf3 );
                snprintf( cBuf3, MAX_STRING, "\n\r"
                  "Dying description    (1)\n\r  \"%s\"\n\r",
                  pChar2->pNPCData->sDescs[0] );
                page_string( pChar->pTerm, cBuf3 );
                snprintf( cBuf3, MAX_STRING,
                  "Sleeping description (2)\n\r  \"%s\"\n\r",
                  pChar2->pNPCData->sDescs[1] );
                page_string( pChar->pTerm, cBuf3 );
                snprintf( cBuf3, MAX_STRING,
                  "Resting description  (3)\n\r  \"%s\"\n\r",
                  pChar2->pNPCData->sDescs[2] );
                page_string( pChar->pTerm, cBuf3 );
                snprintf( cBuf3, MAX_STRING,
                  "Sitting description  (4)\n\r  \"%s\"\n\r",
                  pChar2->pNPCData->sDescs[3] );
                page_string( pChar->pTerm, cBuf3 );
                snprintf( cBuf3, MAX_STRING,
                  "Standing description (5)\n\r  \"%s\"\n\r",
                  pChar2->pNPCData->sDescs[4] );
                page_string( pChar->pTerm, cBuf3 );
            }
            else
            {
                snprintf( cBuf3, MAX_STRING,
                  "Prompt                   \"%s\"\n\r",
                  pChar2->pPCData->sPrompt );
                page_string( pChar->pTerm, cBuf3 );
            }

            snprintf( cBuf3, MAX_STRING, "\n\r"
              "Long description\n\r  \"%s\"\n\r",
              pChar2->sLongDesc );
            page_string( pChar->pTerm, cBuf3 );
            snprintf( cBuf3, MAX_STRING, "\n\r"
              "Race                     %s\n\r"
              "Sex                      %s\n\r\n\r",
              get_race_string( pChar2->iRace ),
              get_sex_string( pChar2->iSex ) );
            page_string( pChar->pTerm, cBuf3 );

            if ( IS_NPC( pChar2 ) )
            {
                snprintf( cBuf3, MAX_STRING,
                  "NPC flags                [%s]\n\r",
                  uncapit( npc_flags_string(
                  pChar2->pNPCData->fNPCFlags ) ) );
                page_string( pChar->pTerm, cBuf3 );
            }

            snprintf( cBuf3, MAX_STRING,
              "Part flags               [%s]\n\r"
              "Action flags             [%s]\n\r",
              uncapit( part_flags_string( pChar2->fPartFlags ) ),
              uncapit( act_flags_string( pChar2->fActFlags ) ) );
            page_string( pChar->pTerm, cBuf3 );
            snprintf( cBuf3, MAX_STRING, "\n\r"
              "Position                 %s\n\r"
              "Level                    %d\n\r"
              "Experience               %d\n\r"
              "Alignment                %d\n\r"
              "Height                   %d inches\n\r"
              "Weight                   %d pounds\n\r"
              "Maximum carry weight     %d pounds\n\r"
              "Hit Points               %d\n\r"
              "Magic Points             %d\n\r"
              "Movement points          %d\n\r"
              "Gold                     %ld\n\r"
              "Hit roll                 %d\n\r"
              "Armor class              [%d %d %d %d]\n\r",
              get_position_string( pChar2->iPosition ), pChar2->iLevel,
              pChar2->iExp, pChar2->iAlignment, pChar2->iHeight,
              pChar2->iWeight, pChar2->iMaxCarry, pChar2->iHP,
              pChar2->iMP, pChar2->iMV, pChar2->iGold, pChar2->iHitRoll,
              pChar2->iAC[0], pChar2->iAC[1], pChar2->iAC[2],
              pChar2->iAC[3] );
            page_string( pChar->pTerm, cBuf3 );

            if ( IS_NPC( pChar2 ) )
            {
                snprintf( cBuf3, MAX_STRING, "\n\r"
                  "Chance of wander         %d%%\n\r",
                  pChar2->pNPCData->iWander );
                page_string( pChar->pTerm, cBuf3 );

                if ( pChar2->pNPCData->pReset != NULL )
                {
                    snprintf( cBuf3, MAX_STRING,
                      "Reset time               %d seconds\n\r",
                      pChar2->pNPCData->pReset->iResetTime );
                    page_string( pChar->pTerm, cBuf3 );
                }
            }

#ifdef DEBUG
            if ( pChar2->pInRoom == NULL )
            {
                wcdebug( "Character not in room." );
                return;
            }
#endif

            snprintf( cBuf3, MAX_STRING, "\n\r"
              "In room                  %ld\n\r",
              pChar2->pInRoom->iNumber );
            page_string( pChar->pTerm, cBuf3 );
        }
    }
    else if ( str_prefix( cBuf1, "object" ) == TRUE )
    {

    }
    else if ( str_prefix( cBuf1, "room" ) == TRUE )
    {

    }
    else
    {
usage:
        send_string( pChar,
          "Usage: stat <\"character\"|\"object\"|\"room\"> <name>\n\r" );
        return;
    }

    finish_string_pager( pChar->pTerm );
}


void cmd_set( CHAR_DATA *pChar, char *pArgument )
{
    send_string( pChar,
      "Sorry, this command is not ready for use yet.\n\r" );
}


/*
 * Transfers the executing character to a given room.
 */
void cmd_goto( CHAR_DATA *pChar, char *pArgument )
{
    ROOM_INDEX_DATA *pToRoom;
    char cArg[MAX_INPUT];
    int i;

    pArgument           = one_arg( pArgument, cArg );

    if ( cArg[0] == '\0' || is_number( cArg ) != TRUE )
        goto usage;

    if ( ( i = atoi( cArg ) ) <= 5 )
    {
        send_string( pChar, "Illegal room number `%d'.\n\r", i );
        return;
    }

    if ( ( pToRoom = get_room_index( i ) ) == NULL )
    {
        send_string( pChar, "No room with the number `%d' exists.\n\r",
          i );
        return;
    }

    if ( pToRoom == pChar->pInRoom )
    {
        send_string( pChar, "You are already here.\n\r" );
        return;
    }

    if ( pChar->pInRoom != NULL )
    {
        send_game_message( "~c disappears in a puff of smoke.",
          MESSAGE_DEST_ROOM, TRUE, pChar, NULL, pChar->pInRoom, FALSE,
          NUMBER_POSITION_RESTING, pChar );
        char_from_room( pChar );
    }

    char_to_room( pChar, pToRoom );
    send_game_message( "~c appears in a puff of smoke.",
      MESSAGE_DEST_ROOM, TRUE, pChar, NULL, pToRoom, FALSE,
      NUMBER_POSITION_RESTING, pChar );
    cmd_look( pChar, "" );
    return;

usage:
    send_string( pChar, "Usage: goto <room number>\n\r" );
}


/*
 * Transfers a character to the given room.
 */
void cmd_transfer( CHAR_DATA *pChar, char *pArgument )
{
    ROOM_INDEX_DATA *pToRoom;
    CHAR_DATA *pChar2   = NULL;
    char cArg1[MAX_INPUT];
    char cArg2[MAX_INPUT];
    int i;

    pArgument           = one_arg( pArgument, cArg1 );
    pArgument           = one_arg( pArgument, cArg2 );

    if ( cArg1[0] == '\0' )
        goto usage;

    if ( cArg2[0] != '\0' )
    {
        if ( is_number( cArg2 ) != TRUE )
            goto usage;

        if ( ( i = atoi( cArg2 ) ) <= 5 )
        {
            send_string( pChar, "Illegal room number `%d'.\n\r", i );
            return;
        }

        if ( ( pToRoom = get_room_index( i ) ) == NULL )
        {
            send_string( pChar, "No room with the number `%d' exists.\n\r",
              i );
            return;
        }
    }
    else
        pToRoom = pChar->pInRoom;

    for ( i = 0; i < iHashListSize; i++ )
    {
        for ( pChar2 = ppCharList[i]; pChar2; pChar2 = pChar2->pNext )
        {
            if ( IS_NPC( pChar2 ) )
            {
                if ( multi_compare_2( cArg1, pChar2->pNPCData->pNameList )
                  == TRUE )
                    goto found;
            }
            else
            {
                if ( str_compare( cArg1, pChar2->pPCData->sName ) == TRUE )
                    goto found;
            }
        }
    }

    send_string( pChar, "Character not found.\n\r" );
    return;

found:
    if ( pChar == pChar2 )
    {
        send_string( pChar,
          "Use the `goto' command to transfer yourself.\n\r" );
        return;
    }

    if ( pToRoom == pChar2->pInRoom )
    {
        send_string( pChar, "They are already here.\n\r" );
        return;
    }

    if ( pChar2->pInRoom != NULL )
    {
        send_game_message( "~c disappears in a puff of smoke.",
          MESSAGE_DEST_ROOM, TRUE, pChar2, NULL, pChar2->pInRoom, FALSE,
          NUMBER_POSITION_RESTING, pChar2 );
        char_from_room( pChar2 );
    }

    char_to_room( pChar2, pToRoom );
    send_game_message( "~c appears in a puff of smoke.",
      MESSAGE_DEST_CHAR, pChar, NUMBER_POSITION_RESTING, pChar2 );
    send_game_message( "~c appears in a puff of smoke.",
      MESSAGE_DEST_ROOM, TRUE, pChar2, pChar, pToRoom, FALSE,
      NUMBER_POSITION_RESTING, pChar2 );
    send_string( pChar2, "\n\r" );
    cmd_look( pChar2, "" );
    return;

usage:
    send_string( pChar, "Usage: transfer <name> [room number]\n\r" );
}


void cmd_ltell( CHAR_DATA *pChar, char *pArgument )
{
    CHAR_DATA *pChar2;
    char cArg[MAX_INPUT];

    if ( pChar->pTerm != NULL && pChar->pTerm->pControlled != NULL )
        pChar2 = pChar->pTerm->pChar;
    else
        pChar2 = pChar;

    if ( IS_NPC( pChar2 ) )
    {
        send_string( pChar, "Trying to get in on the action, huh?\n\r" );
        return;
    }

    if ( pArgument[0] == '\0' )
    {
        if ( !IS_SET( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_LOCAL_TELL ) )
        {
            SET_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_LOCAL_TELL );
            send_string( pChar, "Local Tell channel is now off.\n\r" );
        }
        else
        {
            REMOVE_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_LOCAL_TELL );
            send_string( pChar, "Local Tell channel is now on.\n\r" );
        }

        return;
    }

    if ( IS_SET( pChar2->pPCData->fChanFlags,
      FLAG_CHANNEL_NO_LOCAL_TELL ) )
    {
        REMOVE_FLAG( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_LOCAL_TELL );
        send_string( pChar, "Local Tell channel is now on.\n\r" );
    }

    pArgument               = one_arg( pArgument, cArg );

    if ( cArg[0] == '\0' || pArgument[0] == '\0' )
    {
        send_string( pChar, "Usage: ltell <player name> <string>\n\r" );
        return;
    }

    send_string( pChar, "You tell %s, `%s'\n\r", cap_first( cArg ),
      pArgument );
}


void cmd_rtell( CHAR_DATA *pChar, char *pArgument )
{
    MUD_COMM_DATA *pMUDComm;
    GENERIC_DATA *pGen;
    CHAR_DATA *pChar2;
    char cArg[MAX_INPUT];
    char cArg2[MAX_INPUT];
    short s;
    byte b;

    if ( pChar->pTerm != NULL && pChar->pTerm->pControlled != NULL )
        pChar2 = pChar->pTerm->pChar;
    else
        pChar2 = pChar;

    if ( IS_NPC( pChar2 ) )
    {
        send_string( pChar, "Trying to get in on the action, huh?\n\r" );
        return;
    }

    if ( pArgument[0] == '\0' )
    {
        if ( !IS_SET( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_REMOTE_TELL ) )
        {
            SET_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_REMOTE_TELL );
            send_string( pChar, "Remote Tell channel is now off.\n\r" );
        }
        else
        {
            REMOVE_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_REMOTE_TELL );
            send_string( pChar, "Remote Tell channel is now on.\n\r" );
        }

        return;
    }

    if ( IS_SET( pChar2->pPCData->fChanFlags,
      FLAG_CHANNEL_NO_REMOTE_TELL ) )
    {
        REMOVE_FLAG( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_REMOTE_TELL );
        send_string( pChar, "Remote Tell channel is now on.\n\r" );
    }

    pArgument               = one_arg( pArgument, cArg );
    pArgument               = one_arg( pArgument, cArg2 );

    if ( cArg[0] == '\0' || cArg2[0] == '\0' || pArgument[0] == '\0' )
    {
        send_string( pChar,
          "Usage: rtell <player name> <MUD name> <string>\n\r" );
        return;
    }

    for ( pMUDComm = pMUDCommList; pMUDComm; pMUDComm = pMUDComm->pNext )
    {
        if ( pMUDComm->iConState == MUD_COMM_CON_READY
          && str_compare( pMUDComm->pMUDName, cArg2 ) == TRUE )
            break;
    }

    if ( pMUDComm == NULL )
    {
        send_string( pChar, "No such MUD connected.\n\r" );
        return;
    }

    pGen                    = alloc_mem( sizeof( *pGen ) );
    pGen->pData             = pChar->pTerm;

    pGen->pNext             = pMUDComm->pWaitList;
    pMUDComm->pWaitList     = pGen;

    b                       = MUD_COMM_CMD_TELL_CHANNEL;
    s                       = 0;

    write_mudcomm_data_buffer( pMUDComm, &b, 1 );
    write_mudcomm_data_buffer( pMUDComm, cArg,
      ( strlen( cArg ) + 1 ) );
    write_mudcomm_data_buffer( pMUDComm, (byte *) &s, sizeof( s ) );
    write_mudcomm_data_buffer( pMUDComm, pChar2->pPCData->sName,
      ( strlen( pChar2->pPCData->sName ) + 1 ) );
    write_mudcomm_data_buffer( pMUDComm, pArgument,
      ( strlen( pArgument ) + 1 ) );

    send_string( pChar, "You tell %s@%s, `%s'\n\r", cap_first( cArg ),
      pMUDComm->pMUDName, pArgument );
    send_string( pChar,
      "Message sent to %s, waiting for confirmation.\n\r",
      pMUDComm->pMUDName );
}


void cmd_chat( CHAR_DATA *pChar, char *pArgument )
{
    TERM_DATA *pTerm;
    CHAR_DATA *pChar2;
    MUD_COMM_DATA *pMUDComm;
    char b;

    if ( pChar->pTerm != NULL && pChar->pTerm->pControlled != NULL )
        pChar2 = pChar->pTerm->pChar;
    else
        pChar2 = pChar;

    if ( IS_NPC( pChar2 ) )
    {
        send_string( pChar, "Trying to get in on the action, huh?\n\r" );
        return;
    }

    if ( pArgument[0] == '\0' )
    {
        if ( !IS_SET( pChar2->pPCData->fChanFlags, FLAG_CHANNEL_NO_CHAT ) )
        {
            SET_FLAG( pChar2->pPCData->fChanFlags, FLAG_CHANNEL_NO_CHAT );
            send_string( pChar, "Chat channel is now off.\n\r" );
        }
        else
        {
            REMOVE_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_CHAT );
            send_string( pChar, "Chat channel is now on.\n\r" );
        }

        return;
    }

    if ( IS_SET( pChar2->pPCData->fChanFlags, FLAG_CHANNEL_NO_CHAT ) )
    {
        REMOVE_FLAG( pChar2->pPCData->fChanFlags, FLAG_CHANNEL_NO_CHAT );
        send_string( pChar, "Chat channel is now on.\n\r" );
    }

    if ( iMode == MODE_RPG )
    {
        for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
        {
            if ( ( pTerm->iConState == CON_PLAYING
              || pTerm->iConState == CON_NPC_EDITOR
              || pTerm->iConState == CON_OBJECT_EDITOR
              || pTerm->iConState == CON_ROOM_EDITOR )
              && pTerm->pChar != NULL
              && pTerm->pChar->iLevel >= BUILDER_LEVEL )
            {
                term_send_string( pTerm, "%s[Chat] %s : %s\n\r",
                  ( pTerm == pChar->pTerm ? "" : "\n\r" ),
                  pChar2->pPCData->sName, pArgument );
            }
        }
    }
    else
    {
        for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
        {
            if ( ( pTerm->iConState == CON_PLAYING
              || pTerm->iConState == CON_NPC_EDITOR
              || pTerm->iConState == CON_OBJECT_EDITOR
              || pTerm->iConState == CON_ROOM_EDITOR )
              && pTerm->pChar != NULL )
            {
                term_send_string( pTerm, "%s[Chat] %s : %s\n\r",
                  ( pTerm == pChar->pTerm ? "" : "\n\r" ),
                  pChar2->pPCData->sName, pArgument );
            }
        }
    }

    b = MUD_COMM_CMD_CHAT_CHANNEL;

    for ( pMUDComm = pMUDCommList; pMUDComm; pMUDComm = pMUDComm->pNext )
    {
        if ( pMUDComm->iConState == MUD_COMM_CON_READY )
        {
            write_mudcomm_data_buffer( pMUDComm, &b, 1 );
            write_mudcomm_data_buffer( pMUDComm, pChar2->pPCData->sName,
              ( strlen( pChar2->pPCData->sName ) + 1 ) );
            write_mudcomm_data_buffer( pMUDComm, pArgument,
              ( strlen( pArgument ) + 1 ) );
        }
    }
}


void cmd_lwizcomm( CHAR_DATA *pChar, char *pArgument )
{
    TERM_DATA *pTerm;
    CHAR_DATA *pChar2;

    if ( pChar->pTerm != NULL && pChar->pTerm->pControlled != NULL )
        pChar2 = pChar->pTerm->pChar;
    else
        pChar2 = pChar;

    if ( IS_NPC( pChar2 ) )
    {
        send_string( pChar, "Trying to get in on the action, huh?\n\r" );
        return;
    }

    if ( pArgument[0] == '\0' )
    {
        if ( !IS_SET( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_LOCAL_WIZCOMM ) )
        {
            SET_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_LOCAL_WIZCOMM );
            send_string( pChar, "Local WizComm channel is now off.\n\r" );
        }
        else
        {
            REMOVE_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_LOCAL_WIZCOMM );
            send_string( pChar, "Local WizComm channel is now on.\n\r" );
        }

        return;
    }

    if ( IS_SET( pChar2->pPCData->fChanFlags,
      FLAG_CHANNEL_NO_LOCAL_WIZCOMM ) )
    {
        REMOVE_FLAG( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_LOCAL_WIZCOMM );
        send_string( pChar, "Local WizComm channel is now on.\n\r" );
    }

    for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
    {
        if ( ( pTerm->iConState == CON_PLAYING
          || pTerm->iConState == CON_NPC_EDITOR
          || pTerm->iConState == CON_OBJECT_EDITOR
          || pTerm->iConState == CON_ROOM_EDITOR )
          && pTerm->pChar != NULL
          && pTerm->pChar->iLevel >= BUILDER_LEVEL )
        {
            term_send_string( pTerm, "%s[Local WizComm] %s : %s\n\r",
              ( pTerm == pChar->pTerm ? "" : "\n\r" ),
              pChar2->pPCData->sName, pArgument );
        }
    }
}


void cmd_wizcomm( CHAR_DATA *pChar, char *pArgument )
{
    TERM_DATA *pTerm;
    MUD_COMM_DATA *pMUDComm;
    CHAR_DATA *pChar2;
    char b;

    if ( pChar->pTerm != NULL && pChar->pTerm->pControlled != NULL )
        pChar2 = pChar->pTerm->pChar;
    else
        pChar2 = pChar;

    if ( IS_NPC( pChar2 ) )
    {
        send_string( pChar, "Trying to get in on the action, huh?\n\r" );
        return;
    }

    if ( pArgument[0] == '\0' )
    {
        if ( !IS_SET( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_WIZCOMM ) )
        {
            SET_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_WIZCOMM );
            send_string( pChar, "WizComm channel is now off.\n\r" );
        }
        else
        {
            REMOVE_FLAG( pChar2->pPCData->fChanFlags,
              FLAG_CHANNEL_NO_WIZCOMM );
            send_string( pChar, "WizComm channel is now on.\n\r" );
        }

        return;
    }

    if ( IS_SET( pChar2->pPCData->fChanFlags, FLAG_CHANNEL_NO_WIZCOMM ) )
    {
        REMOVE_FLAG( pChar2->pPCData->fChanFlags,
          FLAG_CHANNEL_NO_WIZCOMM );
        send_string( pChar, "WizComm channel is now on.\n\r" );
    }

    for ( pTerm = pTermList; pTerm != NULL; pTerm = pTerm->pNext )
    {
        if ( ( pTerm->iConState == CON_PLAYING
          || pTerm->iConState == CON_NPC_EDITOR
          || pTerm->iConState == CON_OBJECT_EDITOR
          || pTerm->iConState == CON_ROOM_EDITOR )
          && pTerm->pChar != NULL
          && pTerm->pChar->iLevel >= BUILDER_LEVEL )
        {
            term_send_string( pTerm, "%s[WizComm] %s : %s\n\r",
              ( pTerm == pChar->pTerm ? "" : "\n\r" ),
              pChar2->pPCData->sName, pArgument );
        }
    }

    b = MUD_COMM_CMD_WIZ_CHANNEL;

    for ( pMUDComm = pMUDCommList; pMUDComm; pMUDComm = pMUDComm->pNext )
    {
        if ( pMUDComm->iConState == MUD_COMM_CON_READY )
        {
            write_mudcomm_data_buffer( pMUDComm, &b, 1 );
            write_mudcomm_data_buffer( pMUDComm, pChar2->pPCData->sName,
              ( strlen( pChar2->pPCData->sName ) + 1 ) );
            write_mudcomm_data_buffer( pMUDComm, pArgument,
              ( strlen( pArgument ) + 1 ) );
        }
    }
}


/*
 * End of blr_cmd.c
 */