/**
* \file act.comm.c
* Provides services for verbal and non-verbal communication between players
*
* The purpose of this module is to provide services for speech in various
* modes from whispers to shouts, as well as personal, object, vocal and travel
* emotes.
*
* Copyright 2005, Mary C. Huston, All rights reserved.
* Copyright (C) 2004, Shadows of Isildur: Traithe
*
* The program(s) may be used and/or copied only with written
* permission or in accordance with the terms and conditions
* stipulated in the license from DIKU GAMMA (0.0) and SOI.
*
* \author Mary Huston
* \author Email: auroness@gmail.com
*
******************************************************************************
*/
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "structs.h"
#include "protos.h"
#include "utils.h"
/* extern variables */
extern ROOM_DATA *world;
extern DESCRIPTOR_DATA *descriptor_list;
extern struct lang_info speak_tab [];
extern struct lang_info script_tab [];
#define TOK_WORD 0
#define TOK_NEWLINE 1
#define TOK_PARAGRAPH 2
#define TOK_END 3
#define TOK_SENTENCE 4
#define VOICE_RESET "normal" /* Users use this to unset their voices*/
void reformat_say_string (char *source, char **target)
{
int token_value = 0;
int first_line = 1;
int line_len = 0;
char *sourc = NULL;
char token [MAX_STRING_LENGTH] = {'\0'};
char result [MAX_STRING_LENGTH] = {'\0'};
sourc = source;
line_len = 0;
while ( token_value != TOK_END ) {
token_value = get_token (&sourc, token);
if ( token_value == TOK_PARAGRAPH ) {
if ( first_line )
first_line = 0;
else
strcat (result, "\n");
strcat (result, " ");
line_len = 3;
continue;
}
if ( token_value == TOK_NEWLINE ) {
if ( line_len != 0 )
strcat (result, "\n"); /* Catch up */
strcat (result, "\n");
line_len = 0;
continue;
}
if ( token_value == TOK_WORD ) {
if ( line_len + strlen (token) > 72 ) {
strcat (result, "\n ");
line_len = 0;
}
strcat (result, token);
strcat (result, " ");
line_len += strlen (token) + 1;
}
}
result [strlen(result) - 1] = '\0';
if ( result [strlen(result) - 1] != '.' &&
result [strlen(result) - 1] != '!' &&
result [strlen(result) - 1] != '?' )
result [strlen(result)] = '.';
*target = str_dup (result);
}
void do_ooc (CHAR_DATA *ch, char *argument, int cmd)
{
int i = 0;
char buf[MAX_STRING_LENGTH] = { '\0' };
if ( ch->room->virtual == AMPITHEATRE && IS_MORTAL(ch) ) {
if ( !get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->right_hand) &&
!get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->left_hand) ) {
send_to_char ("You decide against making a commotion. PETITION to request to speak.\n", ch);
return;
}
}
for (i = 0; *(argument + i) == ' '; i++);
if ( (argument + i) == NULL )
send_to_char ("Surely you can think of more to say than that!\n", ch);
else {
CAP (argument);
reformat_say_string (argument, &argument);
snprintf (buf, MAX_STRING_LENGTH, "$n says, out of character,\n \"%s\"", argument + i);
act (buf, FALSE, ch, 0, 0, TO_ROOM);
snprintf (buf, MAX_STRING_LENGTH, "You say, out of character,\n \"%s\"\n", argument + i);
send_to_char (buf, ch);
}
}
void do_pmote(CHAR_DATA *ch, char *argument, int cmd)
{
char buf [MAX_STRING_LENGTH] = { '\0' };
char *temp_arg = NULL;
if (!ch)
return;
while(isspace(*argument))
argument++;
if(!*argument) {
snprintf (buf, MAX_STRING_LENGTH, "Your current pmote: (#2%s#0)\n",
(ch->pmote_str) ? ch->pmote_str : "#2none#0");
send_to_char(buf, ch);
}
else if(!strcmp(argument, "normal")) {
snprintf (buf, MAX_STRING_LENGTH, "Your current pmote has been cleared.");
act(buf,FALSE,ch,0,0,TO_CHAR);
clear_pmote(ch);
}
else {
temp_arg = char_short(ch);
if ( *argument == '\'' )
snprintf (buf, MAX_STRING_LENGTH, "You pmote: %s%s", temp_arg, argument);
else
snprintf (buf, MAX_STRING_LENGTH, "You pmote: %s %s", temp_arg, argument);
ch->pmote_str = add_hash(argument);
act(buf,FALSE,ch,0,0,TO_CHAR | TO_ACT_FORMAT);
}
return;
}
void do_omote(CHAR_DATA *ch, char *argument, int cmd)
{
char buf [MAX_STRING_LENGTH] = { '\0' };
char arg1 [MAX_STRING_LENGTH] = { '\0' };
OBJ_DATA *obj = NULL;
argument = one_argument (argument, arg1);
if(arg1 == NULL){
send_to_char("What would you like to omote on?\n", ch);
return;
}
if(!(obj = get_obj_in_list_vis (ch, arg1, ch->room->contents))) {
send_to_char("You don't see that here.\n", ch);
return;
}
if (!CAN_WEAR (obj, ITEM_TAKE) && IS_MORTAL(ch) ) {
send_to_char("You can't omote on that.\n", ch);
return;
}
if ( IS_SET (ch->room->room_flags, OOC) ) {
send_to_char ("You can't do this in an OOC area.\n", ch);
return;
}
if(argument == NULL) {
send_to_char("What will you omote?\n", ch);
return;
}
obj->omote_str = add_hash(argument);
snprintf (buf, MAX_STRING_LENGTH, "You omote: %s %s", obj->short_description,
obj->omote_str);
act(buf,FALSE,ch,0,0,TO_CHAR | TO_ACT_FORMAT);
}
void do_think(CHAR_DATA *ch, char *argument, int cmd)
{
CHAR_DATA *tch = NULL;
char *p = NULL;
char buf[MAX_STRING_LENGTH] = {'\0'};
char buf1[MAX_STRING_LENGTH] = {'\0'};
char buf2[MAX_STRING_LENGTH] = {'\0'};
char *temp_arg = NULL;
while (isspace(*argument))
argument++;
if(argument == NULL) {
send_to_char("What would you like to think?\n", ch);
return;
}
if ( IS_SET (ch->plr_flags, NOPETITION) ) {
act ("Your ability to petition/think has been revoked by an admin.", FALSE, ch, 0, 0, TO_CHAR);
return;
}
temp_arg = char_short(ch);
snprintf (buf, MAX_STRING_LENGTH, "You thought: %s", argument);
snprintf (buf1, MAX_STRING_LENGTH, "%s thinks, \"%s\"", GET_NAME(ch), argument);
reformat_say_string (argument, &p);
snprintf (buf2, MAX_STRING_LENGTH, "#6You hear #3%s#6 think,\n \"%s\"#0\n", temp_arg, p);
mem_free (p);
act (buf, FALSE, ch, 0, 0, TO_CHAR | TO_ACT_FORMAT);
for ( tch = character_list; tch; tch = tch->next ) {
if ( tch->deleted )
continue;
if ( IS_MORTAL(tch) )
continue;
if ( tch == ch )
continue;
if ( !IS_SET (tch->flags, FLAG_TELEPATH) )
continue;
act (buf1, FALSE, tch, 0, 0, TO_CHAR | TO_ACT_FORMAT);
}
for ( tch = ch->room->people; tch; tch = tch->next_in_room ) {
if ( !IS_MORTAL(ch) )
continue;
if ( tch == ch )
continue;
if ( !IS_MORTAL(tch) )
continue;
if ( skill_use (tch, SKILL_TELEPATHY, ch->skills[SKILL_TELEPATHY]/3) )
send_to_char (buf2, tch);
}
return;
}
void personalize_string (CHAR_DATA *src, CHAR_DATA *tar, char *emote)
{
char desc [MAX_STRING_LENGTH] = { '\0' };
char output [MAX_STRING_LENGTH] = { '\0' };
char buf [MAX_STRING_LENGTH] = { '\0' };
CHAR_DATA *tch = NULL, *target = NULL;
char *charshortbuf = NULL;
*output = '\0';
while ( *emote ) {
*desc = '\0';
if ( *emote == '#' ) {
emote++;
if ( *emote == '5' ) {
emote++;
while ( *emote != '#' ) {
snprintf (desc + strlen(desc), MAX_STRING_LENGTH, "%c", *emote);
emote++;
}
/** find first character in the room matching desc **/
for ( tch = tar->room->people; tch; tch = tch->next_in_room )
charshortbuf = char_short(tch);
if ( !str_cmp (charshortbuf, desc) ) {
break;
}
emote++;
emote++;
if ( *emote == '\'' ) {
strcat (desc, "\'");
emote++;
if ( *emote == 's' ) {
strcat (desc, "s");
}
else {
emote--;
}
}
else {
emote--;
emote--;
}
if ( !tch )
continue;
if ( tch == tar ) {
snprintf (buf, MAX_STRING_LENGTH, "%c", desc[strlen(desc)-1]);
if ( desc[strlen(desc)-1] == '\'' || desc[strlen(desc)-2] == '\'' ) {
strcat (output, "#5your#0");
emote--;
}
else{
strcat (output, "#5you#0");
}
target = tch;
emote++;
}
else {
charshortbuf = char_short(tch);
snprintf (buf, MAX_STRING_LENGTH, "#5%s#0", charshortbuf);
strcat (output, buf);
emote--;
if ( *emote == '\'' )
emote--;
}
}
else{
snprintf (output + strlen(output), MAX_STRING_LENGTH, "#%c", *emote);
}
}
else {
snprintf (output + strlen(output), MAX_STRING_LENGTH, "%c", *emote);
}
emote++;
}
if ( target ) {
if ( *output == '#' )
output[2] = toupper (output[2]);
act (output, FALSE, src, 0, target, TO_VICT | TO_ACT_FORMAT);
magic_add_affect (target, MAGIC_SENT, -1, 0, 0, 0, 0);
}
return;
}
void personalize_emote (CHAR_DATA *src, char *emote)
{
char desc [MAX_STRING_LENGTH] = { '\0' };
char copy [MAX_STRING_LENGTH] = { '\0' };
char *charshortbuf = NULL;
CHAR_DATA *tch = NULL;
AFFECTED_TYPE *af_targ = NULL;
snprintf (copy, MAX_STRING_LENGTH, "%s", emote);
while ( *emote ) {
*desc = '\0';
if ( *emote == '#' ) {
emote++;
if ( *emote == '5' ) {
emote++;
while ( *emote != '#' ) {
snprintf (desc + strlen(desc), MAX_STRING_LENGTH, "%c", *emote);
emote++;
}
tch = get_char_room_vis (src, desc);
/** Find the first person who matches the description **/
for ( tch = src->room->people; tch; tch = tch->next_in_room ) {
charshortbuf = (char_short(tch));
if ( !str_cmp (charshortbuf, desc) )
break;
if ( !tch )
continue;
if ( !get_affect (tch, MAGIC_SENT) ){
personalize_string (src, tch, copy);
}
}
} /* end emote == '5'*/
}/* end emote == '#'*/
emote++;
}
for ( tch = src->room->people; tch; tch = tch->next_in_room ) {
if ( tch == src )
continue;
if ( get_affect (tch, MAGIC_SENT) )
continue;
act (copy, TRUE, tch, 0, 0, TO_CHAR | TO_ACT_FORMAT);
}
for ( tch = src->room->people; tch; tch = tch->next_in_room ) {
af_targ = get_affect (tch, MAGIC_SENT);
if ( af_targ )
affect_remove (tch, af_targ);
}
free(af_targ);
return;
}
void do_emote(CHAR_DATA *ch, char *argument, int cmd)
{
char buf [MAX_STRING_LENGTH] = { '\0' };
char copy[MAX_STRING_LENGTH] = { '\0' };
char key [MAX_STRING_LENGTH] = { '\0' };
bool tochar = FALSE;
bool is_imote = FALSE;
OBJ_DATA *obj = NULL;
int key_e = 0;
char *p = NULL;
char *char_desc = NULL;
char *obj_desc = NULL;
CHAR_DATA *char_vis = NULL;
while (isspace(*argument))
argument++;
if ( ch->room->virtual == AMPITHEATRE && IS_MORTAL(ch) ) {
if ( !get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->right_hand) &&
!get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->left_hand) ) {
send_to_char ("You decide against making a commotion. PETITION to request to speak.\n", ch);
return;
}
}
if ( strstr (argument, "\"") ) {
send_to_char ("Conveying speech via emote is considered code abuse here. Please use SAY instead.\n", ch);
return;
}
if (argument == NULL)
send_to_char("What would you like to emote?\n", ch);
else {
p = copy;
while(*argument) {
if ( *argument == '@' ) {
is_imote = TRUE;
char_desc = char_short(ch);
snprintf (p, MAX_STRING_LENGTH, "#5%s#0", char_desc);
p += strlen(p);
argument++;
}
if(*argument == '*') {
argument++;
while(*argument>='0' && *argument<='9'){
key[key_e++] = *(argument++);
}
if(*argument=='.'){
key[key_e++] = *(argument++);
}
while(isalpha(*argument) || *argument=='-') {
key[key_e++] = *(argument++);
}
key[key_e] = '\0';
key_e = 0;
if (!get_obj_in_list_vis(ch, key, ch->room->contents) &&
!get_obj_in_list_vis(ch, key, ch->right_hand) &&
!get_obj_in_list_vis (ch, key, ch->left_hand) &&
!get_obj_in_list_vis(ch, key, ch->equip) ) {
snprintf (buf, MAX_STRING_LENGTH, "I don't see %s here.\n",key);
send_to_char(buf,ch);
return;
}
obj = get_obj_in_list_vis (ch, key, ch->right_hand);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->left_hand);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->room->contents);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->equip);
obj_desc = obj_short_desc(obj);
snprintf (p, MAX_STRING_LENGTH, "#2%s#0", obj_desc);
p += strlen(p);
} /*end if(*argument == '*')*/
else if(*argument == '~') {
argument++;
while(*argument>='0' && *argument<='9'){
key[key_e++] = *(argument++);
}
if(*argument=='.'){
key[key_e++] = *(argument++);
}
while(isalpha(*argument) || *argument=='-') {
key[key_e++] = *(argument++);
}
key[key_e] = '\0';
key_e = 0;
if (!get_char_room_vis(ch,key)) {
snprintf (buf, MAX_STRING_LENGTH, "Who is %s?\n",key);
send_to_char(buf,ch);
return;
}
char_vis = get_char_room_vis (ch,key);
if (char_vis == ch) {
send_to_char ("You shouldn't refer to yourself using the token system.\n", ch);
free(char_vis);
return;
}
char_desc = char_short(char_vis);
snprintf (p, MAX_STRING_LENGTH, "#5%s#0", char_desc);
p += strlen(p);
tochar = TRUE;
} /* end if(*argument == '~')*/
else
*(p++) = *(argument++);
}/* end while *argument*/
*p = '\0';
if ( copy [0] == '\'' ) {
if ( !is_imote ) {
char_desc = char_short(ch);
snprintf (buf, MAX_STRING_LENGTH, "#5%s#0%s", char_desc, copy);
buf[2] = toupper (buf[2]);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "%s", copy);
}
}
else {
if ( !is_imote ) {
char_desc = char_short(ch);
snprintf (buf, MAX_STRING_LENGTH, "#5%s#0 %s", char_desc, copy);
buf[2] = toupper (buf[2]);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "%s", copy);
}
}
if ( buf[strlen(buf)-1] != '.' && buf[strlen(buf)-1] != '!' && buf[strlen(buf)-1] != '?' )
strcat (buf, ".");
if ( !tochar )
act(buf,FALSE,ch,0,0,TO_ROOM | TO_ACT_FORMAT);
else
personalize_emote (ch, buf);
act(buf,FALSE,ch,0,0,TO_CHAR | TO_ACT_FORMAT);
}
return;
}
void reply_reset (CHAR_DATA *ch, CHAR_DATA *target, char *buf, int cmd)
{
static int avoid_loop = 0;
RESET_DATA *reset = NULL;
char *argument = NULL;
char keywords [MAX_STRING_LENGTH] = { '\0' };
char reply [MAX_STRING_LENGTH] = { '\0' };
char question [MAX_STRING_LENGTH] = { '\0' };
char buf2 [MAX_STRING_LENGTH] = { '\0' };
if ( avoid_loop ) /* Don't get into infinite loops between mobs */
return;
for ( reset = target->mob->resets; reset; reset = reset->next ) {
if ( reset->type != RESET_REPLY )
continue;
argument = one_argument (reset->command, keywords);
while ( isspace (*argument) )
argument++;
strcpy (reply, argument);
(void)one_argument (buf, question);
for ( argument = one_argument (keywords, buf2);
*buf2;
argument = one_argument (argument, buf2) ) {
if ( !str_cmp (buf2, question) ) {
name_to_ident (ch, buf2);
snprintf (buf2 + strlen (buf2), MAX_STRING_LENGTH, " %s", reply);
avoid_loop = 1;
send_to_char ("\n", ch);
if ( cmd == 4 )
do_whisper (target, buf2, cmd);
else
do_say (target, buf2, cmd);
avoid_loop = 0;
return;
}
}
}
}
void do_speak (CHAR_DATA *ch, char *argument, int cmd)
{
int i = 0;
char buf [MAX_INPUT_LENGTH] = { '\0' };
argument = one_argument (argument, buf);
for ( i = 0; speak_tab [i].skill; i++ )
if ( !str_cmp (buf, speak_tab [i].lang) )
break;
if ( !speak_tab [i].skill ) {
snprintf(buf, MAX_INPUT_LENGTH, "The possible choices are:\n %s\n ", speak_tab[0].lang);
for ( i = 1; speak_tab [i].skill; i++ ) {
snprintf(ADDBUF, MAX_INPUT_LENGTH, " %s\n", speak_tab[i].lang);
}
send_to_char(buf, ch);
return;
}
if ( !real_skill (ch, speak_tab [i].skill) && !get_affect (ch, MAGIC_AFFECT_TONGUES) ) {
snprintf (buf, MAX_STRING_LENGTH, "You are unfamiliar with %s.\n",
(speak_tab [i].lang));
send_to_char (buf, ch);
return;
}
if ( ch->speaks == speak_tab [i].skill ) {
snprintf (buf, MAX_STRING_LENGTH, "You are already speaking %s.\n",
(speak_tab [i].lang));
send_to_char (buf, ch);
return;
}
ch->speaks = speak_tab [i].skill;
snprintf (buf, MAX_STRING_LENGTH, "You begin speaking %s.\n",
(speak_tab [i].lang));
send_to_char (buf, ch);
return;
}
void do_select_script (CHAR_DATA *ch, char *argument, int cmd)
{
int i = 0;
char buf [MAX_INPUT_LENGTH] = { '\0' };
argument = one_argument (argument, buf);
for ( i = 0; script_tab [i].skill; i++ )
if ( !str_cmp (buf, script_tab [i].lang) )
break;
if ( !script_tab [i].skill ) {
snprintf(buf, MAX_INPUT_LENGTH, "The possible choices are:\n %s\n", script_tab[0].lang);
for ( i = 1; script_tab [i].skill; i++ ) {
snprintf(ADDBUF, MAX_INPUT_LENGTH, " %s\n", script_tab[i].lang);
}
send_to_char(buf, ch);
return;
}
if ( !real_skill (ch, script_tab [i].skill) && !get_affect (ch, MAGIC_AFFECT_TONGUES) ) {
snprintf (buf, MAX_STRING_LENGTH, "You are unfamiliar with %s.\n",
(script_tab [i].lang));
send_to_char (buf, ch);
return;
}
if ( ch->speaks == script_tab [i].skill ) {
snprintf (buf, MAX_STRING_LENGTH, "You are already writing in %s.\n",
(script_tab [i].lang));
send_to_char (buf, ch);
return;
}
ch->writes = script_tab [i].skill;
snprintf (buf, MAX_STRING_LENGTH, "You will now write in %s.\n",
(script_tab [i].lang));
send_to_char (buf, ch);
return;
}
void do_mute (CHAR_DATA *ch, char *argument, int cmd)
{
char buf[MAX_STRING_LENGTH] = { '\0' };
AFFECTED_TYPE *af = NULL;
if(!real_skill(ch, SKILL_LISTEN)) {
snprintf (buf, MAX_STRING_LENGTH, "You don't have any skill to try and overhear conversations, so you are already muted by default.\n");
send_to_char(buf, ch);
return;
}
while(isspace(*argument))
argument++;
if(argument == NULL) {
snprintf (buf, MAX_STRING_LENGTH, "You %s listening to others' conversations.\n",
get_affect(ch, MUTE_EAVESDROP) ? "aren't" : "are");
send_to_char(buf, ch);
return;
}
if(strcasecmp(argument, "on") == 0) {
if(!get_affect(ch, MUTE_EAVESDROP)) {
af = (AFFECTED_TYPE *)alloc(sizeof(AFFECTED_TYPE), 13);
af->type = MUTE_EAVESDROP;
af->a.listening.duration = -1;
af->a.listening.on = 1;
affect_to_char (ch, af);
}
snprintf (buf, MAX_STRING_LENGTH, "You will now not listen to others' conversations.\n");
send_to_char(buf, ch);
} else
if(strcasecmp(argument, "off") == 0) {
if(get_affect(ch, MUTE_EAVESDROP)) {
remove_affect_type(ch, MUTE_EAVESDROP);
}
snprintf (buf, MAX_STRING_LENGTH, "You will now listen to others' conversations.\n");
send_to_char(buf, ch);
} else {
snprintf (buf, MAX_STRING_LENGTH, "You can change your mute status by 'mute on' or 'mute off'. To see what your mute status is use 'mute'\n");
send_to_char(buf, ch);
}
}
void do_voice (CHAR_DATA *ch, char *argument, int cmd)
{
char buf [MAX_STRING_LENGTH] = { '\0' };
while(isspace(*argument))
argument++;
if ( strchr (argument, '~') ) {
send_to_char ("Sorry, but you can't use tildae when setting a voice string.\n", ch);
return;
}
if(argument == NULL) {
if ( ch->voice_str ) {
snprintf (buf, MAX_STRING_LENGTH, "Your current voice string: (#2%s#0)\n",ch->voice_str);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You do not currently have a voice string set.\n");
}
send_to_char(buf, ch);
}
else {
if(strcasecmp(argument, VOICE_RESET) == 0) {
clear_voice(ch);
snprintf (buf, MAX_STRING_LENGTH, "Your voice string has been cleared.");
}
else {
snprintf (buf, MAX_STRING_LENGTH, "Your voice string has been set to: (#2%s#0)", argument);
ch->voice_str = add_hash(argument);
}
act(buf,FALSE,ch,0,0,TO_CHAR | TO_ACT_FORMAT);
}
}
int decipher_speaking (CHAR_DATA *ch, int skillnum, int skill)
{
int check = 0;
if ( skill > 0 && skill <= 15 )
check = 70;
else if ( skill > 15 && skill < 30 )
check = 50;
else if ( skill >= 30 && skill < 50 )
check = 30;
else if ( skill >= 50 && skill < 70 )
check = 20;
else if ( skill >= 70 )
check = 10;
skill_use (ch, skillnum, 0);
if ( ch->skills [skillnum] >= check )
return 1;
else return 0;
}
char *accent_desc (int skill)
{
if ( skill < 10 ){
return accent[0];
}
else if ( skill >= 10 && skill < 20 ){
return accent[1];
}
else if ( skill >= 20 && skill < 30 ){
return accent[2];
}
else if ( skill >= 30 && skill < 40 ){
return accent[3];
}
else if ( skill >= 40 && skill < 50 ){
return accent[4];
}
else{
return accent[5];
}
}
void do_say (CHAR_DATA *ch, char *argument, int cmd)
{
int talked_to_another = 0,
i = 0,
key_e = 0; /* index to key[]*/
CHAR_DATA *tch = NULL; /* target character index in loops*/
CHAR_DATA *target = NULL; /* target character */
OBJ_DATA *obj = NULL;
AFFECTED_TYPE *tongues = NULL;
AFFECTED_TYPE *af_table = NULL;
bool deciphered = FALSE,
allocd = FALSE,
voice_changed = FALSE;
char key [MAX_STRING_LENGTH]; /* person or item used in string */
char buf [MAX_STRING_LENGTH]; /* to manipulate arguments */
char buf2 [MAX_STRING_LENGTH]; /* to manipulate arguments */
char buf3 [MAX_STRING_LENGTH]; /* Staff use: names */
char buf4 [MAX_STRING_LENGTH]; /* Message, sent to the player */
char buf5 [MAX_STRING_LENGTH]; /* used to decipher languages */
char target_key [MAX_STRING_LENGTH];
char voice [MAX_STRING_LENGTH];
char argbuf [MAX_STRING_LENGTH];
char *char_desc = NULL;
char *obj_desc = NULL;
CHAR_DATA *char_vis = NULL;
char *acc_desc = NULL;
char *utters [] = { "say", "sing", "tell", "murmur",
"wouldbewhisper" };
/** cmd == 0 Talk, not at table, or Say **/
/** cmd == 1 Singing **/
/** cmd == 2 Tell **/
/** cmd == 3 Talk, at table **/
*key = '\0';
*target_key = '\0';
*buf = '\0';
*buf2 = '\0';
*buf3 = '\0';
*buf4 = '\0';
*buf5 = '\0';
*voice = '\0';
*argbuf = '\0';
if ( ch->room->sector_type == SECT_UNDERWATER ) {
send_to_char ("You can't do that underwater!\n", ch);
return;
}
strcpy (argbuf, argument); /* We modify *argument, make sure we don't*/
argument = argbuf; /* have a problem with const arguments */
while ( isspace (*argument) )
argument++;
if ( ch->room->virtual == AMPITHEATRE && IS_MORTAL(ch) ) {
if ( !get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->right_hand) &&
!get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->left_hand) ) {
send_to_char ("You decide against speaking out of turn. PETITION to request to speak.\n", ch);
return;
}
}
if ( argument == NULL ) {
send_to_char ("What would you like to say?\n", ch);
return;
}
if ( cmd == 2 ) { /** Tell, select target **/
*target_key = '\0';
argument = one_argument (argument, target_key);
}
if ( *argument == '(' ) {
*voice = '\0';
if ( ch->voice_str ) {
snprintf (voice, MAX_STRING_LENGTH, "%s", ch->voice_str);
clear_voice (ch);
}
*buf = '\0';
snprintf (buf, MAX_STRING_LENGTH, "%s", argument);
i = 1;
*buf2 = '\0';
while ( buf[i] != ')' ) {
if ( buf[i] == '\0' ) {
send_to_char ("What did you wish to say?\n", ch);
return;
}
if ( buf[i] == '*' ) {
i++;
while(buf[i]>='0' && buf[i]<='9'){
key[key_e++] = buf[i++];
}
if(buf[i] =='.'){
key[key_e++] = buf[i++];
}
while(isalpha(buf[i]) || buf[i] =='-') {
key[key_e++] = buf[i++];
}
key[key_e] = '\0';
key_e = 0;
if ( !get_obj_in_list_vis(ch, key, ch->room->contents) &&
!get_obj_in_list_vis(ch, key, ch->right_hand) &&
!get_obj_in_list_vis(ch, key, ch->left_hand) &&
!get_obj_in_list_vis(ch, key, ch->equip) ) {
snprintf (buf, MAX_STRING_LENGTH, "I don't see %s here.\n",key);
send_to_char(buf,ch);
return;
}
obj = get_obj_in_list_vis (ch, key, ch->right_hand);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->left_hand);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->room->contents);
if ( !obj )
obj = get_obj_in_list_vis (ch, key, ch->equip);
obj_desc = obj_short_desc(obj);
snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH, "#2%s#0", obj_desc);
*key = '\0';
continue;
}
if ( buf[i] == '~' ) {
i++;
while(buf[i]>='0' && buf[i]<='9'){
key[key_e++] = buf[i++];
}
if(buf[i]=='.'){
key[key_e++] = buf[i++];
}
while(isalpha(buf[i]) || buf[i]=='-') {
key[key_e++] = buf[i++];
}
key[key_e] = '\0';
key_e = 0;
if ( !get_char_room_vis (ch, key)) {
snprintf (buf, MAX_STRING_LENGTH, "I don't see %s here.\n", key);
send_to_char (buf, ch);
return;
}
char_vis = get_char_room_vis(ch, key);
char_desc = char_short(char_vis);
snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH, "#5%s#0", char_desc);
*key = '\0';
continue;
}
snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH, "%c", buf[i]);
i++;
}
ch->voice_str = str_dup(buf2);
while ( *argument != ')' )
argument++;
argument += 2;
voice_changed = TRUE;
i = 0;
*buf = '\0';
if ( cmd == 2 && *target_key )
snprintf (buf, MAX_STRING_LENGTH, "%s %s", target_key, argument);
else snprintf (buf, MAX_STRING_LENGTH, "%s", argument);
*argument = '\0';
argument = buf;
if ( argument == NULL ) {
send_to_char ("What did you wish to say?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
}
return;
}
}
else if ( cmd == 2 && *target_key ) {
snprintf (buf, MAX_STRING_LENGTH, "%s %s", target_key, argument);
snprintf (argument, MAX_STRING_LENGTH, "%s", buf);
}
if ( argument == NULL ) {
send_to_char ("What did you wish to say?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
}
return;
}
if ( cmd == 2 ) { /* Tell message */
argument = one_argument (argument, buf);
reformat_say_string (argument, &argument);
if ( argument == NULL ) {
send_to_char ("What did you wish to tell?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice )
ch->voice_str = str_dup(voice);
}
return;
}
if ( !(target = get_char_room_vis (ch, buf)) ) {
send_to_char ("Tell who?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
}
return;
}
if ( target == ch ) {
send_to_char ("You want to tell yourself?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
}
return;
}
while ( isspace (*argument) )
argument++;
}
else reformat_say_string (argument, &argument);
if ( argument == NULL ) {
if ( cmd == 1 ) { /** Singing **/
send_to_char ("What are the words to the song?\n", ch);
}
else if ( cmd == 2 ) {
send_to_char ("What would you like to tell?\n", ch);
}
else
send_to_char ("What would you like to say?\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
}
return;
}
tongues = get_affect (ch, MAGIC_AFFECT_TONGUES);
if ( cmd == 3 ) {
af_table = get_affect (ch, MAGIC_SIT_TABLE);
}
if ( !tongues && !real_skill (ch, ch->speaks) ) {
send_to_char ("You can't even make a guess at the language you want to speak.\n", ch);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice ) {
ch->voice_str = str_dup(voice);
}
return;
}
}
snprintf (buf4, MAX_STRING_LENGTH, "%s", argument); /* Intended message, sent to the player.*/
snprintf (buf5, MAX_STRING_LENGTH, "%s", argument); /* manipulate arguments */
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument); /* manipulate arguments */
if ( cmd == 0 ) {
if ( buf4 [strlen(buf4)-1] == '?' ) {
utters [cmd] = str_dup("ask");
allocd = TRUE;
}
else if ( buf4 [strlen(buf4)-1] == '!' ) {
utters [cmd] = str_dup("exclaim");
allocd = TRUE;
}
}
else if ( cmd == 2 ) {
if ( buf4 [strlen(buf4)-1] == '?' ) {
utters [cmd] = str_dup("ask");
allocd = TRUE;
}
else if ( buf4 [strlen(buf4)-1] == '!' ) {
utters [cmd] = str_dup("emphatically tell");
allocd = TRUE;
}
}
skill_use (ch, ch->speaks, 0);
for ( tch = vtor (ch->in_room)->people; tch; tch = tch->next_in_room ) {
if ( tch == ch ) /* Don't say it to ourselves */
continue;
if ( !tch->desc )
continue;
if ( af_table && !is_at_table (tch, af_table->a.table.obj) ) {
/* If the guy is muting, punt */
if(get_affect(tch, MUTE_EAVESDROP))
continue;
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument);
if ( !tch->skills [ch->speaks] && !tongues )
continue;
if ( !whisper_it (tch, SKILL_LISTEN, buf2, buf2) )
continue;
if ( decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) || IS_SET(ch->room->room_flags, OOC) ) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $N say in %s,", skill_data[ch->speaks].skill_name);
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $N say,");
}
if (ch->voice_str)
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
deciphered = TRUE;
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $N say something in %s,", skill_data[ch->speaks].skill_name);
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if (ch->voice_str)
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " but you are unable to decipher %s words.", HSHR(ch));
deciphered = FALSE;
}
act(buf,FALSE,tch,0,ch,TO_CHAR | TO_ACT_FORMAT);
if ( tch->desc && deciphered ) {
*buf2 = toupper (*buf2);
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf2);
send_to_char (buf, tch);
}
continue;
}
if ( tch->desc )
talked_to_another = 1;
if ( GET_TRUST (tch) && !IS_NPC (tch) && GET_FLAG (tch, FLAG_SEE_NAME) )
snprintf (buf3, MAX_STRING_LENGTH, " (%s)", GET_NAME (ch));
else
*buf3 = '\0';
if ( cmd == 0 || cmd == 1 ) {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss in %s,", buf3, utters [cmd],
(tch->skills [ch->speaks] || tongues) ? skill_data[ch->speaks].skill_name :
"an unknown tongue");
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
deciphered = TRUE;
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss something in %s,", buf3, utters [cmd],
(tch->skills [ch->speaks] || tongues) ? skill_data[ch->speaks].skill_name:
"an unknown tongue");
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " but you are unable to decipher %s words.", HSHR(ch));
deciphered = FALSE;
}
else if ( IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss,", buf3, utters [cmd]);
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
deciphered = TRUE;
}
}
else if ( cmd == 2 ) {
if ( tch == target ) {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking(tch, ch->speaks, ch->skills[ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss you in %s,", buf3,
utters [cmd], (tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
deciphered = TRUE;
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss you something in %s,", buf3,
utters [cmd], (tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " but you are unable to decipher %s words.", HSHR(ch));
deciphered = FALSE;
}
else {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss you,", buf3, utters [cmd]);
deciphered = TRUE;
}
}
else {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) ) {
char_desc = char_short(target);
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss %s in %s,", buf3, utters [cmd], char_desc, (tch->skills [ch->speaks] || tongues) ?skill_data[ch->speaks].skill_name : "an unknown tongue");
deciphered = TRUE;
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss %s something in %s,", buf3, utters [cmd], char_desc, (tch->skills [ch->speaks] || tongues) ? skill_data[ch->speaks].skill_name : "an unknown tongue");
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " but you are unable to decipher %s words.", HSHR(ch));
deciphered = FALSE;
}
else {
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss %s,", buf3, utters [cmd], char_desc);
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
deciphered = TRUE;
}
}
}
else if ( cmd == 3 ) {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss in %s,", buf3,
utters [cmd],
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
deciphered = TRUE;
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss something in %s,", buf3,
utters [cmd],
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
if ( ch->voice_str )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", ch->voice_str);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " but you are unable to decipher %s words.", HSHR(ch));
deciphered = FALSE;
}
else {
snprintf (buf, MAX_STRING_LENGTH, "$N%s %ss,", buf3, utters[cmd]);
deciphered = TRUE;
}
}
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
if ( tch->desc && deciphered ) {
*buf4 = toupper (*buf4);
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
send_to_char (buf, tch);
}
snprintf (argument, MAX_STRING_LENGTH, "%s", buf5);
deciphered = FALSE;
}
*buf4 = toupper(*buf4);
if ( cmd == 2 ) {
if(ch->voice_str) {
if ( !IS_SET (ch->room->room_flags, OOC) ){
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "You %s #5%s#0 in %s, %s,\n \"%s\"\n", utters [cmd], char_desc,skill_data[ch->speaks].skill_name, ch->voice_str, buf4);
}
else{
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "You %s #5%s#0, %s,\n \"%s\"\n", utters [cmd], char_desc, ch->voice_str, buf4);
}
}
else {
if ( !IS_SET (ch->room->room_flags, OOC) ){
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "You %s #5%s#0 in %s,\n \"%s\"\n", utters [cmd], char_desc,skill_data[ch->speaks].skill_name, buf4);
}
else{
char_desc = char_short (target);
snprintf (buf, MAX_STRING_LENGTH, "You %s #5%s#0,\n \"%s\"\n", utters [cmd], char_desc, buf4);
}
}
}
else {
if(ch->voice_str) {
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, "You %s in %s, %s,\n \"%s\"\n",
utters [cmd],skill_data[ch->speaks].skill_name, ch->voice_str,
buf4);
else
snprintf (buf, MAX_STRING_LENGTH, "You %s, %s,\n \"%s\"\n", utters [cmd], ch->voice_str, buf4);
}
else {
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, "You %s in %s,\n \"%s\"\n", utters [cmd],
skill_data[ch->speaks].skill_name, buf4);
else
snprintf (buf, MAX_STRING_LENGTH, "You %s,\n \"%s\"\n", utters [cmd], buf4);
}
}
send_to_char (buf, ch);
trigger (ch, argument, TRIG_SAY);
if ( cmd == 2 && IS_NPC (target) )
reply_reset (ch, target, argument, cmd);
if ( voice_changed ) {
clear_voice (ch);
if ( *voice )
ch->voice_str = str_dup(voice);
}
if ( cmd == 0 ) {
if ( allocd )
mem_free (utters[cmd]);
}
mem_free (argument);
}
void do_sing (CHAR_DATA *ch, char *argument, int cmd)
{
do_say (ch, argument, 1); /* 1 = sing */
}
void do_ichat(CHAR_DATA *ch, char *argument, int cmd)
{
char buf1 [MAX_STRING_LENGTH] = { '\0' };
char *p = NULL;
DESCRIPTOR_DATA *i = NULL;
if ( !GET_TRUST(ch) && !IS_SET (ch->flags, FLAG_ISADMIN) ) {
send_to_char ("Eh?\n", ch);
return;
}
for (; *argument == ' '; argument++);
if (argument == NULL) {
send_to_char("What message would you like to send?\n", ch);
return;
} else {
if ( !GET_FLAG(ch, FLAG_WIZNET) && !IS_NPC(ch) ) {
send_to_char ("You are not currently tuned into the wiznet. Type SET WIZNET to change this.\n", ch);
return;
}
if ( IS_NPC (ch) && ch->desc->original )
snprintf (buf1, MAX_STRING_LENGTH, "#1[Wiznet: %s (%s)]#0 %s\n",
GET_NAME (ch->desc->original), GET_NAME (ch), argument);
else
snprintf (buf1, MAX_STRING_LENGTH, "#1[Wiznet: %s]#0 %s\n",GET_NAME(ch), CAP(argument));
reformat_string (buf1, &p);
CAP (p);
for (i = descriptor_list; i; i = i->next)
if ( i->character && (GET_TRUST (i->character) || IS_SET (i->character->flags, FLAG_ISADMIN)) ) {
if (!i->connected) {
*s_buf='\0';
if(!IS_SET(i->character->act, PLR_QUIET) && (GET_FLAG(i->character, FLAG_WIZNET) || i->original) ) {
send_to_char(p,i->character);
} else {
if ( IS_SET(i->character->act, PLR_QUIET) )
snprintf (s_buf, MAX_STRING_LENGTH, "#2[%s is editing.]#0\n",GET_NAME(i->character));
else if ( !GET_FLAG (i->character, FLAG_WIZNET) && !IS_MORTAL (i->character) )
snprintf (s_buf, MAX_STRING_LENGTH, "#2[%s is not listening to the wiznet.]#0\n",GET_NAME(i->character));
send_to_char(s_buf,ch);
}
}
}
}
mem_free (p);
}
void do_fivenet(CHAR_DATA *ch, char *argument, int cmd)
{
char buf1 [MAX_STRING_LENGTH] = { '\0' };
char *p = NULL;
DESCRIPTOR_DATA *i = NULL;
for (; *argument == ' '; argument++);
if (!(*argument)) {
send_to_char("What message would you like to send?\n", ch);
return;
} else {
if ( !GET_FLAG(ch, FLAG_WIZNET) && !IS_NPC(ch) ) {
send_to_char ("You are not currently tuned into the wiznet. Type SET WIZNET to change this.\n", ch);
return;
}
if ( IS_NPC (ch) && ch->desc->original )
snprintf (buf1, MAX_STRING_LENGTH, "#C[Fivenet: %s (%s)]#0 %s\n",
GET_NAME (ch->desc->original), GET_NAME (ch), argument);
else
snprintf (buf1, MAX_STRING_LENGTH, "#C[Fivenet: %s]#0 %s\n",GET_NAME(ch), CAP(argument));
reformat_string (buf1, &p);
for (i = descriptor_list; i; i = i->next)
if ( i->character && GET_TRUST (i->character) == 5 ) {
if (!i->connected) {
*s_buf='\0';
if(!IS_SET(i->character->act, PLR_QUIET) && (GET_FLAG(i->character, FLAG_WIZNET) || i->original) ) {
send_to_char(p,i->character);
} else {
if ( IS_SET(i->character->act, PLR_QUIET) )
snprintf (s_buf, MAX_STRING_LENGTH, "#2[%s is editing.]#0\n",GET_NAME(i->character));
else if ( !GET_FLAG (i->character, FLAG_WIZNET) )
snprintf (s_buf, MAX_STRING_LENGTH, "#2[%s is not listening to the wiznet.]#0\n",GET_NAME(i->character));
send_to_char(s_buf,ch);
}
}
}
}
mem_free (p);
}
void do_tell (CHAR_DATA *ch, char *argument, int cmd)
{
do_say (ch, argument, 2);
}
void do_immtell (CHAR_DATA *ch, char *argument, int cmd)
{
CHAR_DATA *vict = NULL;
DESCRIPTOR_DATA *d = NULL;
char *p = NULL;
char name [MAX_STRING_LENGTH] = { '\0' };
char message [MAX_STRING_LENGTH] = { '\0' };
char buf [MAX_STRING_LENGTH] = { '\0' };
half_chop (argument, name, message);
if ( !*name || !*message )
send_to_char ("Who do you wish to tell what??\n", ch);
else if ( !(vict = get_char_nomask (name)) || IS_NPC (vict) ||
(!GET_TRUST (vict) && IS_SET (vict->flags, FLAG_WIZINVIS)) )
send_to_char ("There is nobody playing the mud by that name.\n", ch);
else if ( ch == vict )
send_to_char ("You try to tell yourself something.\n", ch);
else if ( IS_SET (vict->act, PLR_QUIET) ) {
send_to_char ("That player is editing, try again later.\n", ch);
return;
}
else {
if ( IS_MORTAL (ch) && IS_SET (vict->flags, FLAG_ANON) ) {
send_to_char ("There is nobody playing the mud by that name.\n", ch);
return;
}
if ( !vict->desc && !IS_NPC (vict) ) {
for ( d = descriptor_list; d; d = d->next ) {
if ( d == vict->pc->owner )
break;
}
if ( !d ) {
send_to_char ("That player has disconnected.\n", ch);
return;
}
}
snprintf (buf, MAX_STRING_LENGTH, "#2[From %s]#0 %s\n", (IS_NPC(ch) ? ch->short_descr : GET_NAME(ch)), CAP(message));
reformat_string (buf, &p);
send_to_char (p, vict);
mem_free (p);
snprintf (buf, MAX_STRING_LENGTH, "#5[To %s]#0 %s\n", GET_NAME(vict), CAP(message));
reformat_string (buf, &p);
send_to_char (p, ch);
mem_free (p);
}
}
int whisper_it (CHAR_DATA *ch, int skill, char *source, char *target)
{
int missed = 0;
int got_one = 0;
int bonus = 0;
char *in = NULL;
char *out = NULL;
char buf [MAX_STRING_LENGTH] = { '\0' };
if ( !real_skill (ch, skill) )
return 0;
skill_use (ch, skill, 0);
if ( skill == SKILL_TELEPATHY )
bonus = 20;
in = source;
out = buf;
*out = '\0';
while ( *in ) {
while ( *in == ' ' ) {
in++;
*out = ' ';
out++;
}
*out = '\0';
if ( ch->skills [skill] + bonus < number (1, 100) ) {
if ( !missed ) {
strcat (out, " . . .");
out += strlen (out);
}
missed = 1;
while ( *in && *in != ' ' )
in++;
}
else {
while ( *in && *in != ' ' ) {
*out = *in;
out++;
in++;
}
got_one = 1;
missed = 0;
}
*out = '\0';
}
strcpy (target, buf);
return got_one;
}
void do_whisper (CHAR_DATA *ch, char *argument, int cmd)
{
int heard_something = 0;
CHAR_DATA *vict = NULL;
CHAR_DATA *tch = NULL;
char *acc_desc = NULL;
AFFECTED_TYPE *tongues = NULL;
char *p = NULL;
char name [MAX_STRING_LENGTH] = { '\0' };
char message [MAX_STRING_LENGTH] = { '\0' };
char buf [MAX_STRING_LENGTH] = { '\0' };
char buf2 [MAX_STRING_LENGTH] = { '\0' };
char buf3 [MAX_STRING_LENGTH] = { '\0' };
char buf4 [MAX_STRING_LENGTH] = { '\0' };
if ( ch->room->sector_type == SECT_UNDERWATER ) {
send_to_char ("You can't do that underwater!\n", ch);
return;
}
half_chop (argument, name, message);
*message = toupper (*message);
reformat_say_string (message, &p);
if ( ch->room->virtual == AMPITHEATRE && IS_MORTAL(ch) ) {
if ( !get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->right_hand) &&
!get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->left_hand) ) {
send_to_char ("You decide against speaking out of turn. PETITION to request to speak.\n", ch);
return;
}
}
if ( !*name || !*message ) {
send_to_char ("Who do you want to whisper to.. and what?\n", ch);
return;
}
if ( !(vict = get_char_room_vis (ch, name)) ) {
send_to_char ("No-one by that name here.\n", ch);
return;
}
else if ( vict == ch ) {
act ("$n whispers quietly to $mself.", FALSE, ch, 0, 0, TO_ROOM);
send_to_char ("You whisper to yourself.\n", ch);
return;
}
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, "You whisper to $N in %s,\n \"%s\"",
skill_data[ch->speaks].skill_name, p);
else
snprintf (buf, MAX_STRING_LENGTH, "You whisper to $N,\n \"%s\"", p);
act (buf, TRUE, ch, 0, vict, TO_CHAR);
tongues = get_affect (ch, MAGIC_AFFECT_TONGUES);
if ( !tongues && !real_skill (ch, ch->speaks) && !IS_SET (ch->room->room_flags, OOC) ) {
send_to_char ("You don't know the language you want to "
"whisper\n", ch);
return;
}
snprintf (buf4, MAX_STRING_LENGTH, "%s", p);
*buf4 = toupper(*buf4);
snprintf (buf3, MAX_STRING_LENGTH, "%s", p);
*buf3 = toupper(*buf3);
skill_use (ch, ch->speaks, 0);
for ( tch = vtor (ch->in_room)->people; tch; tch = tch->next_in_room ) {
if ( tch == ch ) /* Don't say it to ourselves */
continue;
snprintf (buf2, MAX_STRING_LENGTH, "%s", p);
heard_something = 1;
if ( tch != vict ) {
if(get_affect(tch, MUTE_EAVESDROP))
continue;
heard_something = whisper_it (tch, SKILL_LISTEN, buf2, buf2);
}
if ( !heard_something ) {
act ("$n whispers something to $3, but you can't quite make out the words.",
TRUE, ch, (OBJ_DATA *) vict, tch, TO_VICT | TO_ACT_FORMAT);
continue;
}
if ( tch == vict ) {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, "$3 whispers to you in %s,",
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
act (buf, FALSE, tch, (OBJ_DATA *)ch, 0, TO_CHAR | TO_ACT_FORMAT);
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"", buf3);
act (buf, FALSE, tch, 0, 0, TO_CHAR);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$3 whispers something to you in %s, but you cannot decipher %s words.",
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue", HSHR(ch));
act (buf, FALSE, tch, (OBJ_DATA *)ch, 0, TO_CHAR | TO_ACT_FORMAT);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "$3 whispers to you,\n \"%s\"", buf4);
act (buf, FALSE, tch, (OBJ_DATA *)ch, 0, TO_CHAR);
}
if ( IS_NPC (vict) )
reply_reset (ch, vict, buf2, 4); /* 4 = whisper */
}
else {
if ( !IS_SET (ch->room->room_flags, OOC) && decipher_speaking (tch, ch->speaks, ch->skills[ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $3 whispering in %s to $N,",
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue");
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
act (buf, FALSE, tch, (OBJ_DATA *)ch, vict, TO_CHAR | TO_ACT_FORMAT);
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"", buf2);
act (buf, FALSE, tch, 0, 0, TO_CHAR);
}
else if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $3 whispering something in %s to $N, but you cannot decipher %s words.",
(tch->skills [ch->speaks] || tongues) ?
skill_data[ch->speaks].skill_name : "an unknown tongue", HSHR(ch));
act (buf, FALSE, tch, (OBJ_DATA *)ch, vict, TO_CHAR | TO_ACT_FORMAT);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You overhear $3 whisper to $N,\n \"%s\"", buf2);
act (buf, FALSE, tch, (OBJ_DATA *)ch, vict, TO_CHAR);
}
}
snprintf (p, MAX_STRING_LENGTH, "%s", buf3);
}
mem_free (p);
trigger (ch, argument, TRIG_WHISPER);
}
void do_ask (CHAR_DATA *ch, char *argument, int cmd)
{
CHAR_DATA *vict = NULL;
char name [MAX_STRING_LENGTH] = { '\0' };
char message [MAX_STRING_LENGTH] = { '\0' };
char buf [MAX_STRING_LENGTH] = { '\0' };
half_chop(argument,name,message);
if(!*name || !*message)
send_to_char("Who do you want to ask something.. and what??\n", ch);
else if (!(vict = get_char_room_vis(ch, name)))
send_to_char("No-one by that name here.\n", ch);
else if (vict == ch)
{
act("$n quietly asks $mself a question.",FALSE,ch,0,0,TO_ROOM);
send_to_char("You think about it for a while...\n", ch);
}
else
{
snprintf (buf, MAX_STRING_LENGTH, "$n asks you '%s'",message);
act(buf, FALSE, ch, 0, vict, TO_VICT);
send_to_char("Ok.\n", ch);
act("$n asks $N a question.",FALSE,ch,0,vict,TO_NOTVICT);
}
}
void do_talk (CHAR_DATA *ch, char *argument, int cmd)
{
if ( !is_at_table (ch, NULL) )
do_say (ch, argument, 0);
else
do_say (ch, argument, 3);
}
void do_petition (CHAR_DATA *ch, char *argument, int cmd)
{
CHAR_DATA *admin = NULL;
char buf [MAX_STRING_LENGTH] = { '\0' };
char *p = NULL;
bool sent = FALSE;
char *date = NULL;
argument = one_argument (argument, buf);
while ( isspace (*argument) )
argument++;
if ( argument == NULL ) {
send_to_char ("Petition what message?\n", ch);
return;
}
if ( IS_SET (ch->plr_flags, NOPETITION) ) {
act ("Your ability to petition/think has been revoked by an admin.", FALSE, ch, 0, 0, TO_CHAR);
return;
}
if ( ch->desc->account && IS_SET (ch->desc->account->flags, ACCOUNT_NOPETITION) ) {
act ("Your ability to petition has been revoked by an admin.", FALSE, ch, 0, 0, TO_CHAR);
return;
}
if ( !str_cmp (buf, "all") ) {
snprintf (buf, MAX_STRING_LENGTH, "#6[Petition: %s]#0 %s\n", IS_NPC(ch) ? ch->short_descr : GET_NAME(ch), CAP(argument));
reformat_string (buf, &p);
for ( admin = character_list; admin; admin = admin->next ) {
if ( admin->deleted )
continue;
if ( !GET_TRUST (admin) )
continue;
if ( !admin->desc )
continue;
send_to_char (p, admin);
sent = TRUE;
}
mem_free (p);
snprintf (buf, MAX_STRING_LENGTH, "You petitioned: %s\n", CAP(argument));
reformat_string (buf, &p);
send_to_char(p,ch);
mem_free (p);
if ( !get_affect (ch, MAGIC_PETITION_MESSAGE) ) {
snprintf (buf, MAX_STRING_LENGTH, "\n#6Please understand that, as we are a staff of volunteers, we cannot be online\n"
"to respond to petitions 24 hours a day. If you find your petitions going largely\n"
"unanswered, email may be a more efficient recourse: "STAFF_EMAIL".#0\n");
send_to_char (buf, ch);
snprintf (buf, MAX_STRING_LENGTH, "\n#6If there are no staff currently online, your petition will be logged for review\n"
"and responded to within a few days by an administrator via email if necessary.#0\n");
send_to_char (buf, ch);
snprintf (buf, MAX_STRING_LENGTH, "\n#6If you have not already, please read #0HELP PETITION#6 for petitioning guidelines.\n#0");
send_to_char (buf, ch);
magic_add_affect (ch, MAGIC_PETITION_MESSAGE, 480, 0, 0, 0, 0);
}
if ( !sent ) {
date = timestr(date);
snprintf (buf, MAX_STRING_LENGTH, "From: %s [%d]\n\n", ch->tname, ch->in_room);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, "%s\n", argument);
add_message ("Petitions", 2, ch->tname, date, "Logged Petition", "", buf, 0);
mem_free (date);
}
return;
}
admin = load_pc (buf);
if ( !admin ) {
send_to_char ("Are you sure you didn't mistype the name?\n", ch);
return;
}
if ( admin == ch ) {
send_to_char ("Petition yourself? I see...\n", ch);
unload_pc (admin);
return;
}
if ( !is_he_somewhere (admin) || !IS_SET (admin->flags, FLAG_AVAILABLE) || !admin->pc->level ) {
send_to_char ("Sorry, but that person is currently unavailable.\n", ch);
unload_pc (admin);
return;
}
if ( IS_SET (admin->act, PLR_QUIET) ) {
send_to_char ("That admin is editing. Please try again in a minute.\n",
ch);
unload_pc (admin);
return;
}
snprintf (buf, MAX_STRING_LENGTH, "#5[Private Petition: %s]#0 %s\n", IS_NPC(ch) ? ch->short_descr : GET_NAME(ch), CAP(argument));
reformat_string (buf, &p);
send_to_char(p, admin);
mem_free (p);
snprintf (buf, MAX_STRING_LENGTH, "You petitioned %s: %s\n", GET_NAME(admin), CAP(argument));
reformat_string (buf, &p);
send_to_char(p,ch);
mem_free (p);
unload_pc (admin);
}
void do_shout(CHAR_DATA *ch, char *argument, int cmd)
{
ROOM_DATA *room;
CHAR_DATA *tch = NULL;
OBJ_DATA *tobj = NULL;
AFFECTED_TYPE *tongues = NULL;
int door = 0;
int return_to = 0;
int to = 0;
char buf [MAX_STRING_LENGTH] = { '\0' };
char buf2 [MAX_STRING_LENGTH] = { '\0' };
char buf3 [MAX_STRING_LENGTH] = { '\0' };
char buf4 [MAX_STRING_LENGTH] = { '\0' };
char *acc_desc = NULL;
char *obj_desc = NULL;
char *rev_d[] = {
"the south,",
"the west,",
"the north,",
"the east,",
"below,",
"above,"
};
if ( ch->room->sector_type == SECT_UNDERWATER ) {
send_to_char ("You can't do that underwater!\n", ch);
return;
}
tongues = get_affect (ch, MAGIC_AFFECT_TONGUES);
for(;isspace(*argument);argument++);
if ( ch->room->virtual == AMPITHEATRE && IS_MORTAL(ch) ) {
if ( !get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->right_hand) &&
!get_obj_in_list_num (VNUM_SPEAKER_TOKEN, ch->left_hand) ) {
send_to_char ("You decide against speaking out of turn. PETITION to request to speak.\n", ch);
return;
}
}
if ( !tongues && !real_skill (ch, ch->speaks) ) {
send_to_char ("You don't know that language!\n", ch);
return;
}
if ( argument == NULL ) {
send_to_char ("What would you like to shout?\n", ch);
return;
}
CAP (argument);
reformat_say_string (argument, &argument);
snprintf (buf4, MAX_STRING_LENGTH, "%s", argument); /* The intended message, sent to the player.*/
for ( tch = vtor (ch->in_room)->people; tch; tch = tch->next_in_room ) {
if ( tch == ch ) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "You shout in %s,",
skill_data[ch->speaks].skill_name);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You shout,");
}
snprintf (buf2, MAX_STRING_LENGTH, " \"%s\"", buf4);
act (buf, FALSE, ch, 0, 0, TO_CHAR);
act (buf2, FALSE, ch, 0, 0, TO_CHAR);
continue;
}
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, "$N shouts in %s,",
skill_data[ch->speaks].skill_name);
else
snprintf (buf, MAX_STRING_LENGTH, "$N shouts,");
if ( !tch->skills [ch->speaks] && !tongues && !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf, MAX_STRING_LENGTH, "$N shouts, in an unknown tongue,");
}
acc_desc = accent_desc(ch->skills[ch->speaks]);
if ( tch->skills [ch->speaks] >= 50 && ch->skills[ch->speaks] < 50 )
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
if ( !decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) && !IS_SET (ch->room->room_flags, OOC) ) {
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " something that you fail to decipher.");
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
}
else if ( tch->desc ) {
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
if ( decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
send_to_char (buf, tch);
}
}
if ( GET_TRUST (tch) && !IS_NPC (tch) && GET_FLAG (tch, FLAG_SEE_NAME) )
snprintf (buf3, MAX_STRING_LENGTH, " (%s)", GET_NAME (ch));
else
*buf3 = '\0';
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument); /* Reset, for next listener. */
continue;
}
if ( ch->in_room > 100000 && ch->room->entrance ) {
return_to = ch->in_room;
to = ch->room->entrance;
char_from_room (ch);
char_to_room (ch, to);
}
for(door=0; door<6; door++) {
if(PASSAGE(ch,door) && (PASSAGE(ch,door)->to_room != -1)) {
for ( tch = vtor (PASSAGE(ch,door)->to_room)->people; tch; tch = tch->next_in_room ) {
if ( tch == ch )
continue;
if (GET_SEX(ch) == SEX_MALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in an unknown tongue from %s",
rev_d[door]);
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in %s from %s",
skill_data[ch->speaks].skill_name, rev_d[door]);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout from %s", rev_d[door]);
}
if (GET_SEX(ch) == SEX_FEMALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in an unknown tongue from %s",
rev_d[door]);
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in %s from %s",
skill_data[ch->speaks].skill_name, rev_d[door]);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout from %s", rev_d[door]);
}
if (GET_SEX(ch) == SEX_NEUTRAL) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in an unknown tongue from %s",
rev_d[door]);
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in %s from %s",
skill_data[ch->speaks].skill_name, rev_d[door]);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout from %s", rev_d[door]);
}
if ( tch->skills[ch->speaks] >= 50 && ch->skills [ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( !decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " though you cannot decipher the words.");
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
}
else if ( tch->desc ) {
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
if ( decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
else
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
send_to_char (buf, tch);
}
}
if ( GET_TRUST (tch) && !IS_NPC (tch) && GET_FLAG (tch, FLAG_SEE_NAME) )
snprintf (buf3, MAX_STRING_LENGTH, " (%s)", GET_NAME (ch));
else
*buf3 = '\0';
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument); /* Reset. */
}
}
}
if ( return_to > 100000 ) {
char_from_room (ch);
char_to_room (ch, return_to);
for ( tobj = vtor(ch->room->entrance)->contents; tobj; tobj = tobj->next_content ) {
if ( tobj->o.od.value[0] == ch->in_room )
break;
}
if ( tobj ) {
for ( tch = vtor (ch->room->entrance)->people; tch; tch = tch->next_in_room ) {
if ( tch == ch )
continue;
if (GET_SEX(ch) == SEX_MALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks]){
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in an unknown tongue from inside #2%s#0,", obj_desc);
}
else{
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in %s from inside #2%s#0,",skill_data[ch->speaks].skill_name, obj_desc);
}
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout from the stands,");
}
if (GET_SEX(ch) == SEX_FEMALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks]){
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in an unknown tongue from inside #2%s#0,", obj_desc);
}
else{
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in %s from inside #2%s#0,",skill_data[ch->speaks].skill_name, obj_desc);
}
}
else{
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout from inside #2%s#0,", obj_desc);
}
}
if (GET_SEX(ch) == SEX_NEUTRAL) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks]){
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in an unknown tongue from inside #2%s#0,", obj_desc);
}
else{
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in %s from inside #2%s#0,",skill_data[ch->speaks].skill_name, obj_desc);
}
}
else{
obj_desc = obj_short_desc(tobj);
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout from inside #2%s#0,", obj_desc);
}
}
if ( tch->skills[ch->speaks] >= 50 && ch->skills [ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( !decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " though you cannot decipher the words.");
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
}
else if ( tch->desc ) {
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
if ( decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
else
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
send_to_char (buf, tch);
}
}
if ( GET_TRUST (tch) && !IS_NPC (tch) && GET_FLAG (tch, FLAG_SEE_NAME) )
snprintf (buf3, MAX_STRING_LENGTH, " (%s)", GET_NAME (ch));
else
*buf3 = '\0';
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument); /* Reset. */
}
}
}
for ( room = full_room_list; room; room = room->lnext ) {
if ( room->entrance == ch->in_room ) {
for ( tch = room->people; tch; tch = tch->next_in_room ) {
if ( tch == ch )
continue;
if (GET_SEX(ch) == SEX_MALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in an unknown tongue from the outside,");
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout in %s from the outside,",
skill_data[ch->speaks].skill_name);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a male voice shout from the outside,");
}
if (GET_SEX(ch) == SEX_FEMALE) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in an unknown tongue from the outside,");
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout in %s from the outside,",
skill_data[ch->speaks].skill_name);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a female voice shout from the outside,");
}
if (GET_SEX(ch) == SEX_NEUTRAL) {
if ( !IS_SET (ch->room->room_flags, OOC) ) {
if (!tch->skills [ch->speaks])
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in an unknown tongue from the outside,");
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout in %s from the outside,",
skill_data[ch->speaks].skill_name);
}
else
snprintf (buf, MAX_STRING_LENGTH, "You hear a voice shout from the outside,");
}
if ( tch->skills[ch->speaks] >= 50 && ch->skills [ch->speaks] < 50 ){
acc_desc = accent_desc(ch->skills[ch->speaks]);
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " %s,", acc_desc);
}
if ( !decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
snprintf (buf + strlen(buf), MAX_STRING_LENGTH, " though you cannot decipher the words.");
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
}
else if ( tch->desc ) {
act (buf, FALSE, tch, 0, ch, TO_CHAR | TO_ACT_FORMAT);
if ( decipher_speaking (tch, ch->speaks, ch->skills [ch->speaks]) ) {
if ( !IS_SET (ch->room->room_flags, OOC) )
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
else
snprintf (buf, MAX_STRING_LENGTH, " \"%s\"\n", buf4);
send_to_char (buf, tch);
}
}
if ( GET_TRUST (tch) && !IS_NPC (tch) && GET_FLAG (tch, FLAG_SEE_NAME) )
snprintf (buf3, MAX_STRING_LENGTH, " (%s)", GET_NAME (ch));
else
*buf3 = '\0';
snprintf (buf2, MAX_STRING_LENGTH, "%s", argument); /* Reset. */
}
}
}
mem_free (argument);
return;
}
int add_to_list (ROOM_DATA **list, ROOM_DATA *start_room, int *elements)
{
int i = 0;
for ( i = 0; i < *elements; i++ )
if ( list [i] == start_room )
return 0;
list [*elements] = start_room;
(*elements)++;
return 1;
}
void get_room_list (int radius, ROOM_DATA *base_room, ROOM_DATA **near_rooms,
int *num_rooms)
{
int room_set_top = 0;
int room_set_bot = 0;
int dir = 0;
ROOM_DATA *this_room = NULL;
*num_rooms = 0;
add_to_list (near_rooms, base_room, num_rooms);
room_set_top = 0;
room_set_bot = 0;
while ( radius-- ) {
while ( room_set_top <= room_set_bot ) {
for ( dir = 0; dir < 6; dir++ )
if ( near_rooms [room_set_top]->dir_option [dir] ){
this_room = vtor (near_rooms [room_set_top]->
dir_option [dir]->to_room);
add_to_list (near_rooms, this_room, num_rooms);
}
room_set_top++;
}
room_set_bot = *num_rooms - 1;
if ( room_set_top >= *num_rooms )
break; /* Ran out of rooms */
}
return;
}
void wolf_howl (CHAR_DATA *ch)
{
int num_rooms = 0;
int i = 0;
int dir = 0;
ROOM_DATA *near_rooms [220];
CHAR_DATA *tch = NULL;
char buf [MAX_STRING_LENGTH] = { '\0' };
for ( i = 0; i <= 219; i++ )
near_rooms [i] = NULL;
get_room_list (3, ch->room, near_rooms, &num_rooms);
act ("$n howls mournfully.", FALSE, ch, 0, 0, TO_ROOM);
act ("You howl mournfully.", FALSE, ch, 0, 0, TO_CHAR);
for ( tch = ch->room->people; tch; tch = tch->next_in_room ) {
if ( !IS_NPC (tch) )
continue;
if ( tch->race != RACE_WOLF )
continue;
if ( !ch->fighting )
continue;
if ( tch->fighting ||
tch->delay)
continue;
set_fighting (ch, tch);
}
for ( i = 1; i < num_rooms; i++ ) {
if ( near_rooms [i]->people ) {
dir = track (near_rooms [i]->people, ch->room->virtual);
if ( dir == -1 )
continue;
snprintf (buf, MAX_STRING_LENGTH, "There is a loud, mournful howl coming from the %s.\n",
dirs [dir]);
send_to_room (buf, near_rooms [i]->virtual);
}
for ( tch = near_rooms [i]->people; tch; tch = tch->next_in_room ) {
if ( !IS_NPC (tch) )
continue;
if ( tch->race != RACE_WOLF )
continue;
if ( tch->fighting ||
tch->delay ||
IS_SET (tch->act, ACT_SENTINEL) )
continue;
act ("$n stands upright suddenly, cocking $s head.",
TRUE, tch, 0, 0, TO_ROOM);
tch->delay = 2;
tch->delay_type = DEL_ALERT;
tch->delay_info1 = ch->in_room;
tch->delay_info2 = 8;
if ( ch->fighting )
add_threat (tch, ch->fighting, 3);
}
}
}
void do_alert (CHAR_DATA *ch, char *argument, int cmd)
{
int num_rooms = 0;
int i = 0;
int dir = 0;
ROOM_DATA *rooms [220];
CHAR_DATA *tch = NULL;
char buf [MAX_STRING_LENGTH] = { '\0' };
for ( i = 0; i <= 219; i++ )
rooms [i] = NULL;
if ( GET_POS (ch) < REST )
return;
if ( ch->race == RACE_WOLF ) {
wolf_howl (ch);
return;
}
get_room_list (3, ch->room, rooms, &num_rooms);
act ("$n whistles very loudly.", FALSE, ch, 0, 0, TO_ROOM);
act ("You whistle very loudly.", FALSE, ch, 0, 0, TO_CHAR);
for ( tch = ch->room->people; tch; tch = tch->next_in_room ) {
if ( !IS_NPC (tch) )
continue;
if ( !ch->fighting )
continue;
if ( tch->fighting ||
tch->delay)
continue;
if ( !is_brother (ch, tch) )
continue;
set_fighting (ch, tch);
}
for ( i = 1; i < num_rooms; i++ ) {
if ( rooms [i]->people ) {
dir = track (rooms [i]->people, ch->room->virtual);
if ( dir == -1 )
continue;
snprintf (buf, MAX_STRING_LENGTH, "There is a loud whistle coming from the %s.\n",
dirs [dir]);
send_to_room (buf, rooms [i]->virtual);
}
for ( tch = rooms [i]->people; tch; tch = tch->next_in_room ) {
if ( !IS_NPC (tch) )
continue;
if ( tch->fighting ||
tch->delay ||
IS_SET (tch->act, ACT_SENTINEL) )
continue;
if ( !is_brother (ch, tch) )
continue;
act ("$n glances up suddenly with a concerned look on $s face.",
TRUE, tch, 0, 0, TO_ROOM);
tch->delay = 2;
tch->delay_type = DEL_ALERT;
tch->delay_info1 = ch->in_room;
tch->delay_info2 = 8;
if ( ch->fighting )
add_threat (tch, ch->fighting, 3);
}
}
}
void delayed_alert (CHAR_DATA *ch)
{
int dir = 0;
int save_speed = 0;
int current_room = 0;
ROOM_DATA *to_room = NULL;
char buf [MAX_STRING_LENGTH] = { '\0' };
dir = track (ch, ch->delay_info1);
if ( dir == -1 ) {
send_to_char ("You can't figure out where the whistle came from.\n",
ch);
ch->delay = 0;
ch->delay_type = 0;
ch->delay_info1 = 0;
ch->delay_info2 = 0;
return;
}
current_room = ch->in_room;
if ( IS_HITCHEE (ch) )
return;
if ( IS_SUBDUEE (ch) )
return;
if ( !PASSAGE (ch, dir) )
return;
to_room = vtor (PASSAGE (ch, dir)->to_room);
if ( !(to_room) )
return;
if ( IS_SET (to_room->room_flags, NO_MOB) ){
free(to_room);
return;
}
if ( IS_SET (ch->flags, FLAG_KEEPER) && IS_SET (to_room->room_flags, NO_MERCHANT) ){
free(to_room);
return;
}
if ( ch->mob && ch->mob->access_flags &&
!(ch->mob->access_flags & to_room->room_flags) ){
free(to_room);
return;
}
if ( IS_SET (ch->act, ACT_STAY_ZONE) &&
ch->room->zone != to_room->zone )
return;
save_speed = ch->speed;
ch->speed = SPEED_RUN;
snprintf (buf, MAX_STRING_LENGTH, "%s", dirs [dir]);
command_interpreter (ch, buf);
ch->speed = save_speed;
ch->delay_info2--;
if ( current_room == ch->in_room || ch->delay_info2 <= 0 ) {
send_to_char ("You can't locate the whistle.\n", ch);
ch->delay = 0;
ch->delay_type = 0;
ch->delay_info1 = 0;
ch->delay_info2 = 0;
ch->delay_ch = 0;
return;
}
if ( ch->in_room != ch->delay_info1 )
ch->delay = 8;
else {
ch->delay = 0;
ch->delay_type = 0;
ch->delay_info1 = 0;
ch->delay_info2 = 0;
}
}
void clear_voice(CHAR_DATA *ch)
{
if(ch->voice_str) {
mem_free(ch->voice_str);
ch->voice_str = NULL;
}
}
/****************************************************************************
* TRAVEL STRING *
****************************************************************************/
#define TRAVEL_RESET "normal" /* keyword to reset user travel string */
/* *
* function: clear_travel < e.g.> travel normal *
* */
void clear_travel(CHAR_DATA *ch)
{
if(ch->travel_str) {
mem_free(ch->travel_str);
ch->travel_str = NULL;
send_to_char("Your travel string has been cleared.\n", ch);
}
}
/* *
* function: clear_travel < e.g.> travel [ normal|<string> ] *
* */
void do_travel (CHAR_DATA *ch, char *argument, int cmd)
{
char buf [MAX_STRING_LENGTH] = { '\0' };
while(isspace(*argument))
argument++;
if ( strchr (argument, '~') ) {
send_to_char ("Sorry, but you can't use tildae when setting a travel string.\n", ch);
return;
}
if(argument == NULL) {
if ( ch->travel_str ) {
snprintf (buf, MAX_STRING_LENGTH, "Your current travel string: (#2%s#0)\n",ch->travel_str);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "You do not currently have a travel string set.\n");
}
send_to_char(buf, ch);
}
else {
if(strcasecmp(argument, TRAVEL_RESET) == 0) {
clear_travel(ch);
}
else {
snprintf (buf, MAX_STRING_LENGTH, "Your travel string has been set to: (#2%s#0)", argument);
ch->travel_str = add_hash(argument);
}
act(buf,FALSE,ch,0,0,TO_CHAR | TO_ACT_FORMAT);
}
}