/**************************************************************************
* File: dg_comm.c Part of tbaMUD *
* Usage: Contains routines to handle mud to player communication. *
* *
* All rights reserved. See license for complete information. *
* *
* Death's Gate MUD is based on CircleMUD, Copyright (C) 1993, 94. *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
* *
* $Author: Mark A. Heilpern/egreen/Welcor $ *
* $Date: 2004/10/11 12:07:00$ *
* $Revision: 1.0.14 $ *
**************************************************************************/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "dg_scripts.h"
#include "utils.h"
#include "comm.h"
#include "handler.h"
#include "db.h"
#include "constants.h"
/* local functions */
static void sub_write_to_char(char_data *ch, char *tokens[], void *otokens[], char type[]);
/* same as any_one_arg except that it stops at punctuation */
char *any_one_name(char *argument, char *first_arg)
{
char* arg;
/* Find first non blank */
while(isspace(*argument))
argument++;
/* Find length of first word */
for(arg = first_arg ;
*argument && !isspace(*argument) && (!ispunct(*argument) || *argument == '#' || *argument == '-') ;
arg++, argument++)
*arg = LOWER(*argument);
*arg = '\0';
return argument;
}
static void sub_write_to_char(char_data *ch, char *tokens[], void *otokens[], char type[])
{
char sb[MAX_STRING_LENGTH];
int i;
strcpy(sb,"");
for (i = 0; tokens[i + 1]; i++) {
strcat(sb,tokens[i]);
switch (type[i]) {
case '~':
if (!otokens[i])
strcat(sb,"someone");
else if ((char_data *)otokens[i] == ch)
strcat(sb,"you");
else
strcat(sb,PERS((char_data *)otokens[i], ch));
break;
case '|':
if (!otokens[i])
strcat(sb,"someone's");
else if ((char_data *)otokens[i] == ch)
strcat(sb,"your");
else {
strcat(sb,PERS((char_data *) otokens[i], ch));
strcat(sb,"'s");
}
break;
case '^':
if (!otokens[i] || !CAN_SEE(ch, (char_data *) otokens[i]))
strcat(sb,"its");
else if (otokens[i] == ch)
strcat(sb,"your");
else
strcat(sb,HSHR((char_data *) otokens[i]));
break;
case '&':
if (!otokens[i] || !CAN_SEE(ch, (char_data *) otokens[i]))
strcat(sb,"it");
else if (otokens[i] == ch)
strcat(sb,"you");
else
strcat(sb,HSSH((char_data *) otokens[i]));
break;
case '*':
if (!otokens[i] || !CAN_SEE(ch, (char_data *) otokens[i]))
strcat(sb,"it");
else if (otokens[i] == ch)
strcat(sb,"you");
else
strcat(sb,HMHR((char_data *) otokens[i]));
break;
case '`':
if (!otokens[i])
strcat(sb,"something");
else
strcat(sb,OBJS(((obj_data *) otokens[i]), ch));
break;
}
}
strcat(sb,tokens[i]);
strcat(sb,"\n\r");
sb[0] = toupper(sb[0]);
send_to_char(ch, "%s", sb);
}
void sub_write(char *arg, char_data *ch, byte find_invis, int targets)
{
char str[MAX_INPUT_LENGTH * 2];
char type[MAX_INPUT_LENGTH], name[MAX_INPUT_LENGTH];
char *tokens[MAX_INPUT_LENGTH], *s, *p;
void *otokens[MAX_INPUT_LENGTH];
char_data *to;
obj_data *obj;
int i, tmp;
int to_sleeping = 1; /* mainly for windows compiles */
if (!arg)
return;
tokens[0] = str;
for (i = 0, p = arg, s = str; *p;) {
switch (*p) {
case '~':
case '|':
case '^':
case '&':
case '*':
/* get char_data, move to next token */
type[i] = *p;
*s = '\0';
p = any_one_name(++p, name);
otokens[i] =
find_invis ? (void *)get_char_in_room(&world[IN_ROOM(ch)], name) : (void *)get_char_room_vis(ch, name, NULL);
tokens[++i] = ++s;
break;
case '`':
/* get obj_data, move to next token */
type[i] = *p;
*s = '\0';
p = any_one_name(++p, name);
if (find_invis) obj = get_obj_in_room(&world[IN_ROOM(ch)], name);
else if (!(obj = get_obj_in_list_vis(ch, name, NULL, world[IN_ROOM(ch)].contents))) ;
else if (!(obj = get_obj_in_equip_vis(ch, name, &tmp, ch->equipment))) ;
else obj = get_obj_in_list_vis(ch, name, NULL, ch->carrying);
otokens[i] = (void *)obj;
tokens[++i] = ++s;
break;
case '\\':
p++;
*s++ = *p++;
break;
default:
*s++ = *p++;
}
}
*s = '\0';
tokens[++i] = NULL;
if (IS_SET(targets, TO_CHAR) && SENDOK(ch))
sub_write_to_char(ch, tokens, otokens, type);
if (IS_SET(targets, TO_ROOM))
for (to = world[IN_ROOM(ch)].people;
to; to = to->next_in_room)
if (to != ch && SENDOK(to))
sub_write_to_char(to, tokens, otokens, type);
}
void send_to_zone(char *messg, zone_rnum zone)
{
struct descriptor_data *i;
if (!messg || !*messg)
return;
for (i = descriptor_list; i; i = i->next)
if (!i->connected && i->character && AWAKE(i->character) &&
(IN_ROOM(i->character) != NOWHERE) &&
(world[IN_ROOM(i->character)].zone == zone))
write_to_output(i, "%s", messg);
}