/*
* 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
*/