/* * Just pop this into act_comm.c somewhere. (Or anywhere else) * It's pretty much say except modified to take args. * * Written by Kratas (moon@deathmoon.com) */ void do_say_to_char( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH], last_char; char buf[MAX_STRING_LENGTH]; CHAR_DATA *vch; CHAR_DATA *victim; EXT_BV actflags; int arglen; #ifndef SCRAMBLE int speaking = -1, lang; for ( lang = 0; lang_array[lang] != LANG_UNKNOWN; lang++ ) if ( ch->speaking & lang_array[lang] ) { speaking = lang; break; } #endif argument = one_argument( argument, arg ); if ( arg[0] == '\0' || argument[0] == '\0' ) { send_to_char( "Say what to whom?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL || ( IS_NPC(victim) && victim->in_room != ch->in_room ) || (!NOT_AUTHED(ch) && NOT_AUTHED(victim) && !IS_IMMORTAL(ch) ) ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_SET( ch->in_room->room_flags, ROOM_SILENCE ) ) { send_to_char( "You can't do that here.\n\r", ch ); return; } arglen = strlen( argument ) - 1; /* Remove whitespace and tabs. */ while( argument[arglen] == ' ' || argument[arglen] == '\t' ) --arglen; last_char = argument[arglen]; actflags = ch->act; if ( IS_NPC(ch) ) xREMOVE_BIT( ch->act, ACT_SECRETIVE ); for ( vch = ch->in_room->first_person; vch; vch = vch->next_in_room ) { char *sbuf = argument; if ( vch == ch ) continue; /* Check to see if character is ignoring speaker */ if (is_ignoring(vch, ch)) { /* continue unless speaker is an immortal */ if(!IS_IMMORTAL(ch) || get_trust(vch) > get_trust(ch)) continue; else { set_char_color(AT_IGNORE, vch); ch_printf( vch, "You attempt to ignore %s, but are unable to do so.\n\r", ch->name ); } } #ifndef SCRAMBLE if ( speaking != -1 && (!IS_NPC(ch) || ch->speaking) ) { int speakswell = UMIN(knows_language(vch, ch->speaking, ch), knows_language(ch, ch->speaking, vch) ); if ( speakswell < 75 ) sbuf = translate(speakswell, argument, lang_names[speaking]); } #else if ( !knows_language(vch, ch->speaking, ch) && (!IS_NPC(ch) || ch->speaking != 0) ) sbuf = scramble(argument, ch->speaking); #endif sbuf = drunk_speech( sbuf, ch ); MOBtrigger = FALSE; } ch->act = actflags; MOBtrigger = FALSE; switch( last_char ) { case '?': act( AT_SAY, "You ask $N, '$t&c'", ch, drunk_speech( argument, ch ), victim, TO_CHAR ); act( AT_SAY, "$n asks $N, '$t&c'", ch, drunk_speech( argument, ch), victim, TO_NOTVICT ); act( AT_SAY, "$n asks you '$t&c'", ch, drunk_speech( argument, ch), victim, TO_VICT ); break; case '!': act( AT_SAY, "You exclaim at $N, '$t&c'", ch, drunk_speech( argument, ch), victim, TO_CHAR ); act( AT_SAY, "$n exclaims at $N, '$t&c'", ch, drunk_speech( argument, ch), victim, TO_NOTVICT ); act( AT_SAY, "$n exclaims to you, '$t&c'", ch, drunk_speech( argument, ch), victim, TO_VICT ); break; default: act( AT_SAY, "You say to $N '$t&c'", ch, drunk_speech( argument, ch ), victim, TO_CHAR ); act( AT_SAY, "$n says to $N '$t&c'", ch, drunk_speech( argument, ch), victim, TO_NOTVICT ); act( AT_SAY, "$n says to you '$t&c'", ch, drunk_speech( argument, ch), victim, TO_VICT ); break; } if ( IS_SET( ch->in_room->room_flags, ROOM_LOGSPEECH ) ) { sprintf( buf, "%s: %s", IS_NPC( ch ) ? ch->short_descr : ch->name, argument ); append_to_file( LOG_FILE, buf ); } mprog_speech_trigger( argument, ch ); if ( char_died(ch) ) return; oprog_speech_trigger( argument, ch ); if ( char_died(ch) ) return; rprog_speech_trigger( argument, ch ); return; }