#include <ctype.h>
#include <sys/types.h>
#include <stdio.h>
#include <syslog.h>
#include "define.h"
#include "struct.h"
/*
* MAIN PRINT ROUTINE
*/
void act_social( char_data* to, const char* msg, char_data* ch,
char_data* victim, obj_data* obj = NULL )
{
bool heard = ( *msg == '!' );
if( heard )
msg++;
if( heard || ch->Seen( to )
|| ( victim != NULL && victim->Seen( to ) ) )
act( to, msg, ch, victim, obj );
}
void act_social( char_data* to, const char* msg, char_data* ch,
const char* word )
{
bool heard = ( *msg == '!' );
if( heard )
msg++;
if( heard || ch->Seen( to ) )
act( to, msg, ch, NULL, word );
}
void act_social( char_data* to, const char* msg, char_data* ch,
obj_data* obj )
{
bool heard = ( *msg == '!' );
if( heard )
msg++;
if( heard || ch->Seen( to ) )
act( to, msg, ch, obj );
}
/*
* SOCIAL ACTING ON CHARACTER
*/
void social_no_arg( char_data* ch, social_type* soc1, social_type* soc2 )
{
char tmp [ THREE_LINES ];
char_data* rch;
if( soc1->char_no_arg == empty_string )
soc1 = soc2;
convert_to_ansi( ch, soc1->char_no_arg, tmp );
send( ch, "%s\n\r", tmp );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch->position > POS_SLEEPING )
act_social( rch, soc1->others_no_arg, ch,
(char_data*) NULL );
}
void social_auto( char_data* ch, social_type* soc1, social_type* soc2 )
{
char tmp [ THREE_LINES ];
char_data* rch;
if( soc1->char_auto == empty_string )
soc1 = soc2;
convert_to_ansi( ch, soc1->char_auto, tmp );
send( ch, "%s\n\r", tmp );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch->position > POS_SLEEPING )
act_social( rch, soc1->others_auto, ch, (char_data*) NULL );
}
void social_victim( char_data* ch, social_type* soc1,
social_type* soc2, char_data* victim )
{
char_data* rch;
if( soc1->char_found == empty_string ) {
if( soc2->char_found == empty_string ) {
send( ch, "%s and %s do nothing together.\n\r",
soc1->name, victim );
return;
}
soc1 = soc2;
}
act( ch, soc1->char_found, ch, victim );
act_social( victim, victim->position == POS_SLEEPING ?
soc1->vict_sleep : soc1->vict_found, ch, victim );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch != victim && rch->position > POS_SLEEPING )
act_social( rch, soc1->others_found, ch, victim );
}
/*
* DIRECTION AND SOCIAL
*/
void social_dir( char_data* ch, social_type* soc1, social_type* soc2,
int dir )
{
char_data* rch;
if( soc1->char_found == empty_string ) {
soc1 = soc2;
if( soc1->dir_self == empty_string ) {
send( ch, "%s and a direction does nothing.\n\r",
soc1->name );
return;
}
}
act( ch, soc1->dir_self, ch, NULL, dir_table[dir].name );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch->position > POS_SLEEPING )
act_social( rch, soc1->dir_others, ch,
dir_table[dir].name );
}
/*
* OBJECT AND SOCIAL
*/
void social_obj( char_data* ch, social_type* soc1, social_type* soc2,
obj_data* obj )
{
char_data* rch;
if( soc1->obj_self == empty_string ) {
if( soc2->obj_self == empty_string ) {
send( ch, "%s and an object does nothing.\n\r", soc2->name );
return;
}
soc1 = soc2;
}
act( ch, soc1->obj_self, obj );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch->position > POS_SLEEPING )
act_social( rch, soc1->obj_others, ch, obj );
}
/*
* OBJECT, VICTIM AND SOCIAL
*/
void social_self_obj( char_data* ch, social_type* soc1, social_type* soc2,
obj_data* obj )
{
char_data* rch;
if( soc1->self_obj_self == empty_string ) {
if( soc2->self_obj_self == empty_string ) {
fsend( ch, "Mixing %s and %s does nothing interesting.\n\r",
soc2->name, obj );
return;
}
soc1 = soc2;
}
act( ch, soc1->self_obj_self, ch, obj );
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch->position > POS_SLEEPING )
act_social( rch, soc1->self_obj_others, ch, obj );
}
void social_ch_obj( char_data* ch, social_type* soc1, social_type* soc2,
char_data* victim, obj_data* obj )
{
char_data* rch;
if( ch == victim ) {
social_self_obj( ch, soc1, soc2, obj );
return;
}
if( soc1->ch_obj_self == empty_string ) {
if( soc2->ch_obj_self == empty_string ) {
fsend( ch, "Mixing %s, %s and %s does nothing interesting.\n\r",
soc2->name, victim, obj );
return;
}
soc1 = soc2;
}
act( ch, soc1->ch_obj_self, ch, victim, obj );
if( victim->position >= POS_SLEEPING ) {
act( victim, victim->position == POS_SLEEPING
? soc1->ch_obj_sleep : soc1->ch_obj_victim,
ch, victim, obj );
}
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && rch != victim && rch->position > POS_SLEEPING )
act_social( rch, soc1->ch_obj_others, ch, victim, obj );
}
social_type* find_social( social_type* table, int max, char* command )
{
int cmd;
if( max == 0 )
return NULL;
if( ( cmd = search( table, max, command ) ) < 0 )
cmd = -cmd-1;
if( cmd == max
|| strncasecmp( command, table[cmd].name, strlen( command ) ) )
return NULL;
return &table[cmd];
}
/*
* MAIN HANDLER
*/
bool check_social( char_data* ch, char* command, char* argument )
{
char arg [ MAX_INPUT_LENGTH ];
social_type* soc1 = NULL;
social_type* soc2 = NULL;
char_data* victim;
obj_data* obj;
// int dir;
thing_data* t1;
thing_data* t2;
if( ch->shdata->race < MAX_PLYR_RACE )
soc1 = find_social( social_table[ ch->shdata->race+1 ],
table_max[ ch->shdata->race+1 ], command );
soc2 = find_social( social_table[0],
table_max[TABLE_SOC_DEFAULT], command );
if( soc1 == NULL && ( soc1 = soc2 ) == NULL )
return FALSE;
if( soc2 == NULL )
soc2 = soc1;
if( ch->pcdata != NULL
&& is_set( ch->pcdata->pfile->flags, PLR_NO_EMOTE ) ) {
send( ch, "You are anti-social!\n\r" );
return TRUE;
}
if( ch->position < soc1->position ) {
switch( ch->position ) {
case POS_DEAD:
send( ch, "You have died and are unable to move.\n\r" );
return TRUE;
case POS_INCAP:
case POS_MORTAL:
send( ch, "The bright white light has you distracted.\n\r" );
return TRUE;
case POS_STUNNED:
send( ch, "You are stunned and cannot move.\n\r" );
return TRUE;
case POS_MEDITATING:
send( ch, "You are deep in meditation.\n\r" );
return TRUE;
case POS_SLEEPING:
send( "You cannot do that while sleeping.\n\r", ch );
return TRUE;
case POS_RESTING:
send( "You must be standing to do that.\n\r", ch );
return TRUE;
case POS_FIGHTING:
send( "You are unable to do that while fighting.\n\r", ch );
return TRUE;
}
}
if( *argument == '\0' ) {
social_no_arg( ch, soc1, soc2 );
return TRUE;
}
argument = one_argument( argument, arg );
if( ( t1 = one_thing( ch, arg, "social",
&ch->contents, ch->array ) ) == NULL )
return TRUE;
obj = object( t1 );
victim = character( t1 );
if( *argument == '\0' ) {
if( obj != NULL )
social_obj( ch, soc1, soc2, obj );
else if( victim == ch )
social_auto( ch, soc1, soc2 );
else
social_victim( ch, soc1, soc2, victim );
return TRUE;
}
if( ( t2 = one_thing( ch, argument, "social",
&ch->contents, ch->array ) ) == NULL )
return TRUE;
if( obj == NULL )
obj = object( t2 );
else
victim = character( t2 );
if( obj != NULL && victim != NULL )
social_ch_obj( ch, soc1, soc2, victim, obj );
else
fsend( ch, "Mixing %s, %s, and %s does nothing interesting.",
soc1->name, t1, t2 );
return TRUE;
}
/*
* DISPLAY SOCIAL LIST
*/
void do_socials( char_data* ch, char* argument )
{
int i;
int table = TABLE_SOC_DEFAULT;
if( *argument == '\0' ) {
page_title( ch, "Default Socials" );
}
else {
for( table = 0; ; table++ ) {
if( table == MAX_PLYR_RACE ) {
send( ch, "Syntax: Social [race]\n\r" );
return;
}
if( matches( argument, plyr_race_table[table].name ) )
break;
}
page_title( ch, "%s Socials", plyr_race_table[table].name );
table++;
}
for( i = 0; i < table_max[table]; ) {
page( ch, "%16s ", social_table[table][i].name );
if( ++i%4 == 0 )
page( ch, "\n\r" );
}
if( i%4 != 0 )
page( ch, "\n\r" );
}