mirror of
https://github.com/tbamud/tbamud.git
synced 2026-01-04 16:38:49 +01:00
213 lines
5.4 KiB
C
213 lines
5.4 KiB
C
/* ************************************************************************
|
||
* File: dg_comm.c Part of Death's Gate MUD *
|
||
* *
|
||
* Usage: Contains routines to handle mud to player communication *
|
||
* *
|
||
* All rights reserved. See license.doc 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 */
|
||
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;
|
||
}
|
||
|
||
|
||
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 '<EFBFBD>':
|
||
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 '<EFBFBD>':
|
||
/* 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);
|
||
}
|
||
|