mirror of
https://github.com/tbamud/tbamud.git
synced 2026-02-18 01:21:45 +01:00
Adding of the appropropriate structs to the plrtoascii utility. Incoorporation of changes from old circlemud CVS snapshot this also gives more info on SYSERRors. cleanup of zmalloc language (shit->tmp) PRF_ROOMFLAGS has been renamed to PRF_SHOWVNUMS for clarity. "Deaf" has been changed to "No_shout" in preference_bits, for clarity. Addition of hindex (help index) command. who command added argument -g and -l to check who are grouped (and leaders) toggle has been expanded, and the commands nohassle, holylight, color, buildwalk, syslog and roomflags were moved to toggles. renaming of some vars in dg files (xxx -> dg_xxx) for clarity. set <player> password can now be used by other people than the first implementor - id check removed. fix of a couple of minor bugs: - crash bug related to freeing a pointer twice - ascii pfiles bug. - host was not updated correctly after switch to ascii pfiles. Todo: make "who #-#", "who #-" and "who -#" all work as "who -l #-#" did before Remove redundant commands which are now toggles. Make script variables save to pfile instead of its own file.
214 lines
5.4 KiB
C
214 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 '¨':
|
|
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);
|
|
}
|
|
|