/*
* Playground+ - talking.c
* A large proportion of the communication commands
* ---------------------------------------------------------------------------
*/
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include "include/config.h"
#include "include/player.h"
#include "include/fix.h"
#include "include/proto.h"
/* this fxn determines if there should be a space between p->name and str
-- default characters to be like this are ' (39) and , -- adding others
that you deem appropriate should be very simple. */
int emote_no_break(char x)
{
if (x == 39 || x == ',')
return 1;
return 0;
}
void do_format(player * p, player * s, char *str, char *mid, char *pip, int type)
{
char tname[MAX_PRETITLE + MAX_NAME + 3];
if (s->custom_flags & (NOPREFIX | NOEPREFIX))
strcpy(tname, p->name);
else
strcpy(tname, full_name(p));
switch (type)
{
case 0: /* say */
if (s->custom_flags & NOPREFIX)
sprintf(stack, "%s %s '%s^N'\n", p->name, mid, pip);
else
sprintf(stack, "%s %s '%s^N'\n", full_name(p), mid, pip);
break;
case 1: /* emote, pemote, socials */
if (emote_no_break(*str))
sprintf(stack, "%s%s^N\n", tname, pip);
else
sprintf(stack, "%s %s^N\n", tname, pip);
break;
case 2: /* echo */
sprintf(stack, "%s^N\n", pip);
break;
case 3: /* think */
if (s->custom_flags & NOPREFIX)
sprintf(stack, "%s thinks . o O ( %s ^N)\n", p->name, pip);
else
sprintf(stack, "%s thinks . o O ( %s ^N)\n", full_name(p), pip);
break;
case 4: /* sing */
if (s->custom_flags & NOPREFIX)
sprintf(stack, "%s sings o/~ %s ^No/~\n", p->name, pip);
else
sprintf(stack, "%s sings o/~ %s ^No/~\n", full_name(p), pip);
break;
default:
break;
}
stack = end_string(stack);
}
int send_to_room(player * p, char *str, char *mid, int type)
{
char *prepipe, *pip, *text;
player *s;
for (s = p->location->players_top; s; s = s->room_next)
{
if (s != current_player)
{
prepipe = stack;
pip = do_pipe(s, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
sys_color_atm = SYSsc;
return 0;
}
text = stack;
do_format(p, s, str, mid, pip, type);
tell_player(s, text);
#ifdef INTELLIBOTS
if (s->residency & ROBOT_PRIV)
intelligent_robot(p, s, text, IR_ROOM);
#endif
stack = prepipe;
}
}
return 1;
}
int send_to_everyone(player * p, char *str, char *mid, int type)
{
player *s;
char *pip, *prepipe, *text;
for (s = flatlist_start; s; s = s->flat_next)
{
if (s != current_player)
{
prepipe = stack;
pip = do_pipe(s, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
sys_color_atm = SYSsc;
return 0;
}
text = stack;
do_format(p, s, str, mid, pip, type);
tell_player(s, text);
#ifdef INTELLIBOTS
if (s->residency & ROBOT_PRIV)
intelligent_robot(p, s, text, IR_SHOUT);
#endif
stack = prepipe;
}
}
return 1;
}
void process_review(player * p, char *message, int length)
{
int i, j;
for (i = 0; i < MAX_HISTORY_LINES; i++)
{ /* count from 0 to 5 */
if (strlen(p->rev[i].review) < 1)
{ /* if the element is empty */
memset(p->rev[i].review, 0, MAX_REVIEW);
strncpy(p->rev[i].review, message, MAX_REVIEW - 3);
return;
}
}
for (j = 0; j < MAX_REVIEW; j++)
p->rev[0].review[j] = 0;
for (i = 0; i < (MAX_HISTORY_LINES - 1); i++)
{
strncpy(p->rev[i].review, p->rev[i + 1].review, strlen(p->rev[i + 1].review));
for (j = 0; j < MAX_REVIEW; j++)
p->rev[i + 1].review[j] = 0;
}
strncpy(p->rev[i].review, message, length);
}
void view_review(player * p)
{
int i, sanity = 0;
char *oldstack;
tell_player(p, "\n");
oldstack = stack;
for (i = 0; i < MAX_HISTORY_LINES; i++)
{
if (strlen(p->rev[i].review) > 0)
{
sanity++;
command_type |= HIGHLIGHT;
sprintf(stack, " -)%s", p->rev[i].review);
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
command_type &= ~HIGHLIGHT;
}
}
if (sanity == 0)
tell_player(p, " There is nothing in your review buffer.\n");
}
void reportto(player * p, char *str)
{
char *oldstack;
player *p2;
int i, sanity = 0;
if (!*str)
{
TELLPLAYER(p, " Format : reportto <name of %s>\n",
get_config_msg("staff_name"));
return;
}
p2 = find_player_global(str);
if (!p2)
return;
if (p2 == p)
{
tell_player(p, " Sorry, you cant report to yourself silly!\n");
return;
}
if (!(p2->residency & SU))
{
TELLPLAYER(p, " Sorry, you can only report to %ss.\n",
get_config_msg("staff_name"));
return;
}
for (i = 0; i < MAX_HISTORY_LINES; i++)
{
if (strlen(p->rev[i].review) > 0)
{
sanity++;
}
}
if (sanity == 0)
{
tell_player(p, " There is nothing in your review buffer to report!\n");
return;
}
else
{
oldstack = stack;
sprintf(stack, " -=*> %s is reporting to %s\n", p->name, p2->name);
stack = end_string(stack);
su_wall(oldstack);
command_type = PERSONAL | NO_HISTORY;
stack = oldstack;
sprintf(stack, "%s reported to %s", p->name, p2->name);
stack = end_string(stack);
log("reportto", oldstack);
stack = oldstack;
sprintf(stack, "\n -=> %s is reporting the following to you:\n", p->name);
stack = end_string(stack);
tell_player(p2, oldstack);
stack = oldstack;
}
for (i = 0; i < MAX_HISTORY_LINES; i++)
{
if (strlen(p->rev[i].review) > 0)
{
sanity++;
sprintf(stack, " -)%s", p->rev[i].review);
stack = strchr(stack, 0);
}
}
stack = end_string(stack);
tell_player(p2, oldstack);
stack = oldstack;
command_type = 0;
sprintf(stack, " You have reported to %s. Contact them for info.\n", p2->name);
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
}
void end_emergency(player * p)
{
if (p->script <= 1)
{
SUWALL(" -=*> Emergency scripting of %s complete.\n", p->name);
tell_player(p, "\n -=*> Emergency scripting finished.\n\n");
}
else
{
SUWALL(" -=*> Emergency scripting of %s prematurely aborted.\n", p->name);
TELLPLAYER(p, " -=*> Time is now %s.\n"
" -=*> Scripting stopped at your request.\n",
convert_time(time(0)));
}
p->script = 0;
}
/* emergency command (updated by phypor) */
void emergency(player * p, char *str)
{
if (p->script)
{
if (!strcasecmp(str, "off") || !strcasecmp(str, "stop"))
{
end_emergency(p);
return;
}
tell_player(p, " You are already scripting ... use "
"'emergency stop' to stop.\n");
return;
}
if (!*str)
{
tell_player(p,
" You must give a reason for starting emergency scripting as an argument.\n"
" (And the reason better be good ...)\n");
return;
}
else if (!strcasecmp(str, "stop"))
{
tell_player(p, " OK, stop being silly, you hadn't yet STARTED emergency"
" scripting. Read 'help emergency' to learn how to use"
" 'emergency' properly.\n");
return;
}
command_type = EMERGENCY;
p->script = atoi(get_config_msg("emergency_len")) * ONE_MINUTE;
TELLPLAYER(p, " -=*> Emergency scripting started for %s.\n"
" -=*> Reason : %s\n"
" -=*> Time is presently %s.\n",
word_time(p->script), str, convert_time(time(0)));
SUWALL(" -=*> %s begins emergency scripting ...\n"
" -=*> Reason : %s\n", p->name, str);
LOGF("emergencies", "%s begins emergency scripting, reason: %s",
p->name, str);
}
/* converse mode on and off */
void converse_mode_on(player * p, char *str)
{
if (p->custom_flags & CONVERSE)
{
tell_player(p, " But you are already in converse mode!\n");
return;
}
p->custom_flags |= CONVERSE;
tell_player(p, " Entering 'converse' mode. Everything you type will get"
" said.\n"
" Start the line with '/' to use normal commands, and /end"
" to\n"
" leave this mode.\n");
p->mode |= CONV;
return;
}
void converse_mode_off(player * p, char *str)
{
if (!(p->custom_flags & CONVERSE))
{
tell_player(p, " But you are not in converse mode !\n");
return;
}
p->custom_flags &= ~CONVERSE;
p->mode &= ~CONV;
tell_player(p, " Ending converse mode.\n");
return;
}
/* say command */
void say(player * p, char *str)
{
char *oldstack, *mid, *scan, *temp, *pip, *text;
oldstack = stack;
command_type = ROOM;
temp = str;
if (!*str)
{
tell_player(p, " Format: say <msg>\n");
return;
}
if ((p->flags & FROGGED) && (p->location != prison))
str = get_frog_msg("say");
#ifdef INTERCOM
if (p->location == intercom_room)
{
do_intercom_say(p, str);
return;
}
#endif
extract_pipe_local(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
str = temp;
return;
}
for (scan = str; *scan; scan++);
switch (*(--scan))
{
case '?':
mid = "asks";
break;
case '!':
mid = "exclaims";
break;
default:
mid = "says";
break;
}
sys_color_atm = ROMsc;
if (!send_to_room(p, str, mid, 0))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
switch (*scan)
{
case '?':
mid = "ask";
break;
case '!':
mid = "exclaim";
break;
default:
mid = "say";
break;
}
text = stack;
sprintf(stack, " You %s '%s^N'\n", mid, pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
int check_sing_ability(player * p, char *str)
{
if (p->no_sing || p->system_flags & SAVE_NO_SING)
{
if (p->no_sing > 0)
TELLPLAYER(p, " You have been prevented from singing for the next %s.\n", word_time(p->no_sing));
else
TELLPLAYER(p, " You have been prevented from singing for the long haul, friend...\n");
return 0;
}
if (p->location->flags & ANTISING)
{
tell_player(p, " But this is a chambered room !!\n");
return 0;
}
if (p->tag_flags & SINGBLOCK)
{
tell_player(p, " You can't sing when you're ignoring other singers.\n");
return 0;
}
if (p->shout_index > 60 || strstr(str, "SFSU") || strstr(str, "S F S U"))
{
tell_player(p, " You seem to have gotten a sore throat by singing too"
" much!\n");
return 0;
}
return 1;
}
int isannoy(char c)
{
switch (c)
{
case '!':
case '@':
case '$':
case '%':
case '&':
case '*':
case '#':
return 1;
}
return 0;
}
char unannoy(char c)
{
if (isupper(c))
return tolower(c);
switch (c)
{
case '!':
case '@':
case '$':
case '%':
case '&':
case '*':
case '#':
return '.';
}
return c;
}
/* Count !!s and caps in a str */
int check_shout_ability(player * p, char *str)
{
char *ptr = str;
int cap = 0, tot = 0, oct = command_type;
if (p->tag_flags & BLOCK_SHOUT)
{
tell_player(p, " You can't shout whilst ignoring shouts yourself.\n");
return 0;
}
if (p->location->flags & SOUNDPROOF)
{
tell_player(p, " But this is a soundproof room !!\n");
return 0;
}
if (p->location == relaxed)
{
TELLPLAYER(p, " You cannot shout whilst in the %s ...\n", RELAXED_ROOM);
return 0;
}
if (p->no_shout || p->system_flags & SAVENOSHOUT)
{
if (p->no_shout > 0)
TELLPLAYER(p, " You have been prevented from shouting for the next %s.\n", word_time(p->no_shout));
else if (p->no_shout == -1 || p->system_flags & SAVENOSHOUT)
TELLPLAYER(p, " You have been prevented from shouting for the forseeable future.\n");
return 0;
}
if (p->shout_index > 60 || strstr(str, "SFSU") || strstr(str, "S F S U"))
{
tell_player(p, " You seem to have gotten a sore throat by shouting too"
" much!\n");
return 0;
}
/* inline unannoyance */
if (strlen(str) < 10)
return 1;
for (; *ptr; ptr++, tot++)
if (isupper(*ptr) || isannoy(*ptr))
cap++;
if ((cap * 2) > tot || cap > 100)
{
for (ptr = str; *ptr; ptr++)
*ptr = unannoy(*ptr);
if (current_player)
{
command_type = 0;
SUWALL(" -=*> %s tried to use way too many annoying chars, %d/%d\n",
current_player->name, cap, tot);
LOGF("caps", "%s is annoying, %d/%d",
current_player->name, cap, tot);
command_type = oct;
}
}
return 1;
}
int count_caps(char *str)
{
int count = -2;
char *mark;
for (mark = str; *mark; mark++)
if (isupper(*mark) || *mark == '!')
count++;
return (count > 0 ? count : 0);
}
/* shout command */
void shout(player * p, char *str)
{
char *oldstack, *text, *mid, *scan, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = EVERYONE;
if (!*str)
{
tell_player(p, " Format: shout <msg>\n");
return;
}
if (p->flags & FROGGED)
str = get_frog_msg("shout");
if (!check_shout_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (count_caps(str) * 2) + 20;
}
extract_pipe_global(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
stack = oldstack;
str = temp;
return;
}
for (scan = str; *scan; scan++);
switch (*(--scan))
{
case '?':
mid = "shouts, asking";
break;
case '!':
mid = "yells";
break;
default:
mid = "shouts";
break;
}
sys_color_atm = SHOsc;
if (!send_to_everyone(p, str, mid, 0))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
switch (*scan)
{
case '?':
mid = "shout, asking";
break;
case '!':
mid = "yell";
break;
default:
mid = "shout";
break;
}
text = stack;
sprintf(stack, " You %s '%s^N'\n", mid, pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
/* emote command */
void emote(player * p, char *str)
{
char *oldstack, *text, *pip;
char tname[MAX_PRETITLE + MAX_NAME + 3];
char *temp;
temp = str;
oldstack = stack;
command_type = ROOM;
if (!*str)
{
tell_player(p, " Format: emote <msg>\n");
return;
}
if ((p->flags & FROGGED) && (p->location != prison))
str = get_frog_msg("emote");
#ifdef INTERCOM
if (p->location == intercom_room)
{
do_intercom_emote(p, str);
return;
}
#endif
extract_pipe_local(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
str = temp;
return;
}
sys_color_atm = ROMsc;
if (!send_to_room(p, str, 0, 1))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
if (p->custom_flags & (NOPREFIX | NOEPREFIX))
strcpy(tname, p->name);
else
strcpy(tname, full_name(p));
if (emote_no_break(*str))
sprintf(stack, " You emote : %s%s\n", tname, pip);
else
sprintf(stack, " You emote : %s %s\n", tname, pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
/* echo command */
void echo(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = ROOM | ECHO_COM;
if (!*str)
{
tell_player(p, " Format: echo <msg>\n");
return;
}
extract_pipe_local(str);
if (p->flags & FROGGED)
str = get_frog_msg("echo");
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
return;
}
sys_color_atm = ROMsc;
if (!send_to_room(p, str, 0, 2))
{
temp = str;
stack = oldstack;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
return;
}
text = stack;
sprintf(stack, " You echo : %s\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
}
/* the tell command */
void tell(player * p, char *str)
{
char *msg, *pstring, *final, *mid, *scan;
char *oldstack;
player **list, **step;
int i, n;
#ifdef INTERCOM
char *intercom_pointer;
#endif
command_type = PERSONAL | SEE_ERROR;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't tell other people when you yourself "
"are blocking tells.\n");
return;
}
if (p->location->flags & ISOLATED_ROOM)
{
tell_player(p, " But this is an isolated room !!\n");
return;
}
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : tell <player(s)> <msg>\n");
return;
}
#ifdef INTERCOM
intercom_pointer = strchr(str, '@');
if (intercom_pointer && intercom_pointer < msg)
{
do_intercom_tell(p, str);
stack = oldstack;
return;
}
#endif
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("tell");
}
else
{
*msg++ = 0;
}
if (tell_command_channel(p, str, msg))
return;
if (!(strcasecmp(str, "everyone")))
{
command_type = 0;
if (config_flags & cfNOSWEAR)
shout(p, filter_rude_words(msg));
else
shout(p, msg);
return;
}
if (!strcasecmp(str, "friends") && p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends \n");
return;
}
if (strstr(str, "friends"))
sys_color_atm = FRTsc;
else if (strcasecmp(str, "room"))
sys_color_atm = TELsc;
else
sys_color_atm = ROMsc;
/* for the repeat command ... */
p->last_remote_command = 1;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
for (scan = msg; *scan; scan++);
switch (*(--scan))
{
case '?':
mid = "asks of";
break;
case '!':
mid = "exclaims to";
break;
default:
mid = "tells";
break;
}
command_type |= SORE;
#ifdef ALLOW_MULTIS
if (isdigit(*str))
n = 2;
else
n = global_tag(p, str, 1);
if (n > 1)
if (!(sys_flags & ROOM_TAG))
{
multi_tell(p, str, msg);
stack = oldstack;
return;
}
#else
n = global_tag(p, str);
#endif
if ((n == 1 ) && (sys_flags & ROOM_TAG))
{
cleanup_tag(list, n);
tell_player(p, " You are alone in the room.\n");
stack = oldstack;
return;
}
if (!n)
{
stack = oldstack;
sys_color_atm = SYSsc;
return;
}
/* for reply */
if (strcasecmp(str, "everyone") && strcasecmp(str, "room") &&
strcasecmp(str, "friends"))
{
make_reply_list(p, list, n);
}
else
{
p->shout_index += count_caps(str) + 17;
}
for (step = list, i = 0; i < n; i++, step++)
{
if (*step != p)
{
pstring = tag_string(*step, list, n);
final = stack;
if ((*step)->custom_flags & NOPREFIX)
sprintf(stack, "%s %s %s '%s^N'\n", p->name, mid, pstring, msg);
else
sprintf(stack, "%s %s %s '%s^N'\n", full_name(p), mid, pstring, msg);
stack = end_string(stack);
tell_player(*step, final);
#ifdef INTELLIBOTS
if ((*step)->residency & ROBOT_PRIV)
intelligent_robot(p, *step, final, IR_PRIVATE);
#endif
/* process_review(*step, final); */
stack = pstring;
}
}
sys_color_atm = SYSsc;
if (sys_flags & EVERYONE_TAG || sys_flags & (FRIEND_TAG | OFRIEND_TAG)
|| sys_flags & ROOM_TAG || !(sys_flags & FAILED_COMMAND))
{
switch (*scan)
{
case '?':
mid = "ask of";
break;
case '!':
mid = "exclaim to";
break;
default:
mid = "tell";
break;
}
pstring = tag_string(p, list, n);
final = stack;
sprintf(stack, " You %s %s '%s^N'\n", mid, pstring, msg);
stack = strchr(stack, 0);
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, final);
}
cleanup_tag(list, n);
stack = oldstack;
}
/* the wake command */
void wake(player * p, char *str)
{
char *oldstack;
player *p2;
command_type = PERSONAL | SEE_ERROR;
oldstack = stack;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't wake other people when you yourself are "
"blocking tells.\n");
return;
}
if (!*str)
{
tell_player(p, " Format : wake <player>\n");
return;
}
p2 = find_player_global(str);
if (!p2)
return;
if (p2->tag_flags & NOBEEPS)
{
if (p2->custom_flags & NOPREFIX)
sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
"to you.\n", p->name);
else
sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
"to you.\n", full_name(p));
}
else
{
if (p2->custom_flags & NOPREFIX)
sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
"to you.\007\n", p->name);
else
sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
"to you.\007\n", full_name(p));
}
stack = end_string(stack);
sys_color_atm = TELsc;
tell_player(p2, oldstack);
sys_color_atm = SYSsc;
if (sys_flags & FAILED_COMMAND)
{
stack = oldstack;
return;
}
stack = oldstack;
sprintf(stack, " You scream loudly at %s in an attempt to wake %s up.\n",
full_name(p2), get_gender_string(p2));
stack = strchr(stack, 0);
if (p2->idle_msg[0] != 0)
sprintf(stack, " Idling> %s %s\n", p2->name, p2->idle_msg);
stack = end_string(stack);
tell_player(p, oldstack);
stack = oldstack;
}
void nopropose(player * p, char *str)
{
if (p->system_flags & MARRIED)
{
tell_player(p, " You're married, dont worry so much! :) \n");
return;
}
else if (p->tag_flags & NO_PROPOSE)
{
tell_player(p, " You are seeing proposals again. \n");
p->tag_flags &= ~NO_PROPOSE;
return;
}
else
{
tell_player(p, " You are now blocking proposals. \n");
p->tag_flags |= NO_PROPOSE;
return;
}
}
/* remote command */
void remote_cmd(player * p, char *str, int manual)
{
char *msg, *pstring, *final;
char *oldstack;
player **list, **step;
int i, n, s;
char tname[MAX_NAME + MAX_PRETITLE + 3];
#ifdef INTERCOM
char *intercom_pointer;
#endif
s = (command_type & SOCIAL);
command_type = PERSONAL | SEE_ERROR;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't remote to other people when you yourself are"
" blocking tells.\n");
return;
}
if (p->location->flags & ISOLATED_ROOM)
{
tell_player(p, " But this is an isolated room !!\n");
return;
}
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : remote <player(s)> <msg>\n");
stack = oldstack;
return;
}
#ifdef INTERCOM
intercom_pointer = strchr(str, '@');
if (intercom_pointer && intercom_pointer < msg)
{
do_intercom_remote(p, str);
stack = oldstack;
return;
}
#endif
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("remote");
}
else
{
*msg++ = 0;
}
if (remote_command_channel(p, str, msg))
return;
if (!(strcasecmp(str, "everyone")))
{
command_type = 0;
if (config_flags & cfNOSWEAR)
emote_shout(p, filter_rude_words(msg));
else
emote_shout(p, msg);
return;
}
command_type |= SORE;
if (!strcasecmp(str, "friends") && p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends \n");
return;
}
if (strstr(str, "friends"))
sys_color_atm = FRTsc;
else if (strcasecmp(str, "room"))
sys_color_atm = TELsc;
else
sys_color_atm = ROMsc;
/* for the repeat command ... */
p->last_remote_command = 2;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
#ifdef ALLOW_MULTIS
if (isdigit(*str))
n = 2;
else
n = global_tag(p, str, 1);
if (n > 1)
if (!(sys_flags & ROOM_TAG))
{
if (s)
command_type |= SOCIAL;
multi_remote(p, str, msg);
stack = oldstack;
return;
}
#else
n = global_tag(p, str);
#endif
if ((n == 1 ) && (sys_flags & ROOM_TAG))
{
cleanup_tag(list, n);
tell_player(p, " You are alone in the room.\n");
stack = oldstack;
return;
}
if (!n)
{
stack = oldstack;
sys_color_atm = SYSsc;
return;
}
for (step = list, i = 0; i < n; i++, step++)
{
if ((*step)->custom_flags & (NOPREFIX | NOEPREFIX))
strcpy(tname, p->name);
else
strcpy(tname, full_name(p));
if (*step != p)
{
final = stack;
if (emote_no_break(*msg))
sprintf(stack, "%s%s^N\n", tname, msg);
else
sprintf(stack, "%s %s^N\n", tname, msg);
stack = end_string(stack);
tell_player(*step, final);
#ifdef INTELLIBOTS
if ((*step)->residency & ROBOT_PRIV)
intelligent_robot(p, *step, final, IR_PRIVATE);
#endif
/* process_review(*step, final); */
stack = final;
}
}
sys_color_atm = SYSsc;
if (manual)
{
if (sys_flags & EVERYONE_TAG || sys_flags & (FRIEND_TAG | OFRIEND_TAG)
|| sys_flags & ROOM_TAG || !(sys_flags & FAILED_COMMAND))
{
pstring = tag_string(p, list, n);
final = stack;
if (p->custom_flags & (NOPREFIX | NOEPREFIX))
strcpy(tname, p->name);
else
strcpy(tname, full_name(p));
if (emote_no_break(*msg))
sprintf(stack, " You emote '%s%s^N' to %s.\n", tname, msg, pstring);
else
sprintf(stack, " You emote '%s %s^N' to %s.\n", tname, msg, pstring);
stack = strchr(stack, 0);
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, final);
}
}
cleanup_tag(list, n);
stack = oldstack;
}
/* manual use of remote (socials go through with p, str, 0) */
void remote(player * p, char *str)
{
remote_cmd(p, str, 1);
}
/* recho command */
void recho(player * p, char *str)
{
char *msg, *pstring, *final;
char *oldstack;
player **list, **step;
int i, n;
command_type = PERSONAL | ECHO_COM | SEE_ERROR;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't recho to other people when you yourself are "
"blocking tells.\n");
return;
}
if (p->location->flags & ISOLATED_ROOM)
{
tell_player(p, " But this is an isolated room !!\n");
return;
}
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : recho <player(s)> <msg>\n");
stack = oldstack;
return;
}
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("recho");
}
else
*msg++ = 0;
command_type |= SORE;
if (!(strcasecmp(str, "everyone")))
{
command_type = 0;
if (config_flags & cfNOSWEAR)
echo_shout(p, filter_rude_words(msg));
else
echo_shout(p, msg);
return;
}
if (!strcasecmp(str, "friends") && p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends \n");
return;
}
if (strstr(str, "friends"))
sys_color_atm = FRTsc;
else if (strcasecmp(str, "room"))
sys_color_atm = TELsc;
else
sys_color_atm = ROMsc;
/* for the repeat command ... */
p->last_remote_command = 3;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
#ifdef ALLOW_MULTIS
if (isdigit(*str))
n = 2;
else
n = global_tag(p, str, 1);
if (n > 1)
{
stack = oldstack;
multi_recho(p, str, msg);
return;
}
#else
n = global_tag(p, str);
#endif
if (!n)
{
stack = oldstack;
sys_color_atm = SYSsc;
return;
}
for (step = list, i = 0; i < n; i++, step++)
{
if (*step != p)
{
final = stack;
sprintf(stack, "%s^N\n", msg);
stack = end_string(stack);
tell_player(*step, final);
#ifdef INTELLIBOTS
if ((*step)->residency & ROBOT_PRIV)
intelligent_robot(p, *step, final, IR_PRIVATE);
#endif
/* process_review(*step, final); */
stack = final;
}
}
sys_color_atm = SYSsc;
if (sys_flags & EVERYONE_TAG || !(sys_flags & FAILED_COMMAND))
{
pstring = tag_string(p, list, n);
final = stack;
sprintf(stack, " You echo '%s^N' to %s\n", msg, pstring);
while (*stack)
stack++;
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, final);
}
cleanup_tag(list, n);
stack = oldstack;
}
/* whisper command */
void whisper(player * p, char *str)
{
char *oldstack, *msg, *everyone, *text, *pstring, *mid, *s;
player **list, *scan;
int n;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't whisper to other people when you yourself "
"are blocking tells.\n");
return;
}
command_type = ROOM | SEE_ERROR;
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : whisper <person(s)> <msg>\n");
stack = oldstack;
return;
}
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("whisper");
}
else
*msg++ = 0;
for (s = msg; *s; s++);
/* for the repeat command ... */
p->last_remote_command = 4;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
switch (*(--s))
{
case '?':
mid = "asks in a whisper";
break;
case '!':
mid = "exclaims in a whisper";
break;
default:
mid = "whispers";
break;
}
n = local_tag(p, str);
if (!n)
{
sys_color_atm = SYSsc;
return;
}
everyone = tag_string(0, list, n);
for (scan = p->location->players_top; scan; scan = scan->room_next)
if (p != scan)
if (scan->flags & TAGGED)
{
pstring = tag_string(scan, list, n);
text = stack;
if (scan->custom_flags & NOPREFIX)
sprintf(stack, "%s %s '%s^N' to %s.\n", p->name, mid, msg, pstring);
else
sprintf(stack, "%s %s '%s^N' to %s.\n", full_name(p), mid, msg,
pstring);
stack = end_string(stack);
sys_color_atm = TELsc;
tell_player(scan, text);
#ifdef INTELLIBOTS
if (scan->residency & ROBOT_PRIV)
intelligent_robot(p, scan, text, IR_PRIVATE);
#endif
sys_color_atm = SYSsc;
/* process_review(scan, text); */
stack = pstring;
}
if (!(sys_flags & FAILED_COMMAND))
{
switch (*s)
{
case '?':
mid = "ask in a whisper";
break;
case '!':
mid = "exclaim in a whisper";
break;
default:
mid = "whisper";
break;
}
pstring = tag_string(p, list, n);
text = stack;
sprintf(stack, " You %s '%s^N' to %s.\n", mid, msg, pstring);
stack = strchr(stack, 0);
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, text);
}
cleanup_tag(list, n);
stack = oldstack;
}
/* exclude command */
void exclude(player * p, char *str)
{
char *oldstack, *msg, *everyone, *text, *pstring, *mid, *s;
player **list, *scan;
int n;
command_type = ROOM | SEE_ERROR | EXCLUDE;
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : exclude <person(s)> <msg>\n");
stack = oldstack;
return;
}
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("exclude");
}
else
*msg++ = 0;
for (s = msg; *s; s++);
switch (*(--s))
{
case '?':
mid = "asks";
break;
case '!':
mid = "exclaims to";
break;
default:
mid = "tells";
break;
}
n = local_tag(p, str);
if (!n)
return;
everyone = tag_string(0, list, n);
sys_color_atm = ROMsc;
for (scan = p->location->players_top; scan; scan = scan->room_next)
{
if (p != scan)
{
if ((scan->flags & TAGGED) && !(scan->residency & (SU | ADMIN)))
{
pstring = tag_string(scan, list, n);
text = stack;
sprintf(stack, "%s tells everyone something about %s\n",
full_name(p), pstring);
stack = end_string(stack);
tell_player(scan, text);
stack = pstring;
}
else
{
text = stack;
sprintf(stack, "%s %s everyone but %s '%s^N'\n",
full_name(p), mid, everyone, msg);
stack = end_string(stack);
tell_player(scan, text);
#ifdef INTELLIBOTS
if (scan->residency & ROBOT_PRIV)
intelligent_robot(p, scan, text, IR_ROOM);
#endif
stack = text;
}
}
}
sys_color_atm = SYSsc;
if (!(sys_flags & FAILED_COMMAND))
{
switch (*s)
{
case '?':
mid = "ask";
break;
case '!':
mid = "exclaim to";
break;
default:
mid = "tell";
break;
}
pstring = tag_string(p, list, n);
text = stack;
sprintf(stack, " You %s everyone but %s '%s^N'\n", mid, pstring, msg);
stack = end_string(stack);
tell_player(p, text);
}
cleanup_tag(list, n);
stack = oldstack;
}
/* pemote command */
void pemote(player * p, char *str)
{
char *oldstack, *scan;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: pemote <msg>\n");
return;
}
if (!(p->flags & FROGGED))
{
for (scan = p->lower_name; *scan; scan++);
if (*(scan - 1) == 's')
*stack++ = 39;
else
{
*stack++ = 39;
*stack++ = 's';
}
*stack++ = ' ';
while (*str)
*stack++ = *str++;
*stack++ = 0;
emote(p, oldstack);
stack = oldstack;
}
else
emote(p, str);
}
/* premote command */
void premote(player * p, char *str)
{
char *oldstack, *scan;
oldstack = stack;
scan = next_space(str);
if (!*scan)
{
tell_player(p, " Format: pemote <person> <msg>\n");
return;
}
if (!(p->flags & FROGGED))
{
while (*str && *str != ' ')
*stack++ = *str++;
*stack++ = ' ';
if (*str)
str++;
for (scan = p->lower_name; *scan; scan++);
if (*(scan - 1) == 's')
*stack++ = 39;
else
{
*stack++ = 39;
*stack++ = 's';
}
*stack++ = ' ';
while (*str)
*stack++ = *str++;
*stack++ = 0;
remote(p, oldstack);
stack = oldstack;
}
else
remote(p, str);
}
/* the 'check' command */
void check(player * p, char *str)
{
if (!*str)
{
tell_player(p, " Format: check <sub command>\n");
return;
}
sub_command(p, str, check_list);
}
/* view check commands */
void view_check_commands(player * p, char *str)
{
view_sub_commands(p, check_list);
}
/* new think, tryig to fix the NOPREFIX thang by copying from say */
void newthink(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
command_type = ROOM;
temp = str;
if (!*str)
{
tell_player(p, " Format: think <msg>\n");
return;
}
if (p->flags & FROGGED)
str = get_frog_msg("think");
#ifdef INTERCOM
if (p->location == intercom_room)
{
do_intercom_think(p, str);
return;
}
#endif
extract_pipe_local(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
str = temp;
return;
}
sys_color_atm = ROMsc;
if (!send_to_room(p, str, 0, 3))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
sprintf(stack, " You think . o O ( %s ^N)\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
/* tell to your friends, the short way */
void tell_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: tf <message>\n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s", str);
stack = end_string(stack);
tell(p, oldstack);
stack = oldstack;
}
/* remote to your friends, the short way */
void remote_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: rf <remote>\n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s", str);
stack = end_string(stack);
remote(p, oldstack);
stack = oldstack;
}
/* remote think */
void remote_think(player * p, char *str)
{
char *oldstack, *msg;
oldstack = stack;
msg = strchr(str, ' ');
if (!msg)
{
tell_player(p, " Format: rt <player(s)> <think>\n");
return;
}
*msg++ = '\0';
sprintf(stack, "%s thinks . o O ( %s ^N)", str, msg);
stack = end_string(stack);
remote(p, oldstack);
stack = oldstack;
}
/* the shoutted emote, pemote, think, and echo... */
void emote_shout(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = EVERYONE;
if (!*str)
{
tell_player(p, " Format: yemote <msg>\n");
return;
}
if (p->flags & FROGGED)
str = get_frog_msg("yemote");
if (!check_shout_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (count_caps(str) * 2) + 20;
}
extract_pipe_global(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
stack = oldstack;
str = temp;
return;
}
sys_color_atm = SHOsc;
if (!send_to_everyone(p, str, 0, 1))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
if (p->custom_flags & (NOPREFIX | NOEPREFIX))
{
if (emote_no_break(*str))
sprintf(stack, " You yemote: %s%s\n", p->name, pip);
else
sprintf(stack, " You yemote: %s %s\n", p->name, pip);
}
else
{
if (emote_no_break(*str))
sprintf(stack, " You yemote: %s%s\n", full_name(p), pip);
else
sprintf(stack, " You yemote: %s %s\n", full_name(p), pip);
}
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
void pemote_shout(player * p, char *str)
{
char *oldstack, *scan;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: pyemote <msg>\n");
return;
}
if (!(p->flags & FROGGED))
{
for (scan = p->lower_name; *scan; scan++);
if (*(scan - 1) == 's')
*stack++ = 39;
else
{
*stack++ = 39;
*stack++ = 's';
}
*stack++ = ' ';
while (*str)
*stack++ = *str++;
*stack++ = 0;
emote_shout(p, oldstack);
stack = oldstack;
}
else
emote_shout(p, str);
}
void think_shout(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = EVERYONE;
if (!*str)
{
tell_player(p, " Format: ythink <msg>\n");
return;
}
if (p->flags & FROGGED)
str = get_frog_msg("ythink");
if (!check_shout_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (count_caps(str) * 2) + 20;
}
extract_pipe_global(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
stack = oldstack;
str = temp;
return;
}
sys_color_atm = SHOsc;
if (!send_to_everyone(p, str, 0, 3))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
sprintf(stack, " You ythink . o O ( %s ^N)\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
void echo_shout(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = EVERYONE | ECHO_COM;
if (!*str)
{
tell_player(p, " Format: yecho <msg>\n");
return;
}
if (p->flags & FROGGED)
str = get_frog_msg("yecho");
if (!check_shout_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (count_caps(str) * 2) + 20;
}
extract_pipe_global(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
stack = oldstack;
str = temp;
return;
}
sys_color_atm = SHOsc;
if (!send_to_everyone(p, str, 0, 2))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
sprintf(stack, " You yecho: %s\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
/* think to your friends, the short way */
void rthink_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: rtf <message>\n");
return;
}
oldstack = stack;
sprintf(stack, "friends thinks . o O ( %s ^N)", str);
stack = end_string(stack);
remote(p, oldstack);
stack = oldstack;
}
/* possessive emote to your friends, the short way */
void premote_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: pf <message>\n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s ", str);
stack = end_string(stack);
premote(p, oldstack);
stack = oldstack;
}
/* echo to your friends, the short way */
void recho_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: ef <echo>\n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s", str);
stack = end_string(stack);
recho(p, oldstack);
stack = oldstack;
}
void sing(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
command_type = ROOM | BAD_MUSIC;
temp = str;
if (!*str)
{
tell_player(p, " Format: sing <song>\n");
return;
}
if (!check_sing_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (count_caps(str) * 2) + 20;
}
if (p->flags & FROGGED)
str = get_frog_msg("sing");
extract_pipe_local(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
str = temp;
return;
}
sys_color_atm = ROMsc;
if (!send_to_room(p, str, 0, 4))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
sprintf(stack, " You sing o/~ %s ^No/~\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
void rsing(player * p, char *str)
{
char *msg, *pstring, *final, *mid, *scan;
char *oldstack;
player **list, **step;
int i, n;
command_type = PERSONAL | SEE_ERROR | BAD_MUSIC;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't sing to other people when you yourself "
"are blocking tells.\n");
return;
}
if (!check_sing_ability(p, str))
{
return;
}
if (p->location->flags & ISOLATED_ROOM)
{
tell_player(p, " But this is an isolated room !!\n");
return;
}
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : rsing <player(s)> <song>\n");
return;
}
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("rsing");
}
else
*msg++ = 0;
if (!(strcasecmp(str, "everyone")))
{
command_type = 0;
if (config_flags & cfNOSWEAR)
sing_shout(p, filter_rude_words(msg));
else
sing_shout(p, msg);
return;
}
if (!(strcasecmp(str, "room")))
{
command_type = 0;
sing(p, msg);
return;
}
if (!strcasecmp(str, "friends") && p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends \n");
return;
}
if (strstr(str, "friends"))
sys_color_atm = FRTsc;
else if (strcasecmp(str, "room"))
sys_color_atm = TELsc;
else
sys_color_atm = ROMsc;
/* for the repeat command ... */
p->last_remote_command = 5;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
for (scan = msg; *scan; scan++);
mid = "sings";
command_type |= SORE;
#ifdef ALLOW_MULTIS
if (isdigit(*str))
n = 2;
else
n = global_tag(p, str, 1);
if (n > 1)
{
stack = oldstack;
multi_rsing(p, str, msg);
return;
}
#else
n = global_tag(p, str);
#endif
if (!n)
{
stack = oldstack;
sys_color_atm = SYSsc;
return;
}
/* for reply */
if (strcasecmp(str, "everyone") && strcasecmp(str, "room") &&
strcasecmp(str, "friends"))
make_reply_list(p, list, n);
else
p->shout_index += count_caps(str) + 17;
for (step = list, i = 0; i < n; i++, step++)
{
if (*step != p)
{
pstring = tag_string(*step, list, n);
final = stack;
if ((*step)->custom_flags & NOPREFIX)
sprintf(stack, "%s %s o/~ %s ^No/~ to %s.\n", p->name, mid, msg, pstring);
else
sprintf(stack, "%s %s o/~ %s ^No/~ to %s.\n", full_name(p), mid, msg, pstring);
stack = end_string(stack);
tell_player(*step, final);
#ifdef INTELLIBOTS
if ((*step)->residency & ROBOT_PRIV)
intelligent_robot(p, *step, final, IR_PRIVATE);
#endif
stack = pstring;
}
}
sys_color_atm = SYSsc;
if (sys_flags & EVERYONE_TAG || sys_flags & (FRIEND_TAG | OFRIEND_TAG)
|| sys_flags & ROOM_TAG || !(sys_flags & FAILED_COMMAND))
{
mid = "sing";
pstring = tag_string(p, list, n);
final = stack;
sprintf(stack, " You %s o/~ %s ^No/~ to %s.\n", mid, msg, pstring);
stack = strchr(stack, 0);
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, final);
}
cleanup_tag(list, n);
stack = oldstack;
}
/* sing to your friends - the easy way {B-> */
void sing_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: sf <song> \n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s", str);
stack = end_string(stack);
rsing(p, oldstack);
stack = oldstack;
}
void sing_shout(player * p, char *str)
{
char *oldstack, *text, *pip;
char *temp;
oldstack = stack;
temp = str;
command_type = EVERYONE | BAD_MUSIC;
if (!*str)
{
tell_player(p, " Format: ysing <song>\n");
return;
}
if (!check_sing_ability(p, str))
{
str = temp;
return;
}
if (!check_shout_ability(p, str))
{
str = temp;
return;
}
if (!(p->residency & PSU))
{
p->shout_index += (2 * ((count_caps(str) * 2) + 20));
}
if (p->flags & FROGGED)
str = get_frog_msg("ysing");
extract_pipe_global(str);
if (sys_flags & FAILED_COMMAND)
{
sys_flags &= ~FAILED_COMMAND;
stack = oldstack;
str = temp;
return;
}
sys_color_atm = SHOsc;
if (!send_to_everyone(p, str, 0, 4))
{
temp = str;
return;
}
sys_color_atm = SYSsc;
pip = do_pipe(p, str);
if (!pip)
{
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
str = temp;
return;
}
text = stack;
sprintf(stack, " You ysing o/~ %s ^No/~\n", pip);
stack = end_string(stack);
tell_player(p, text);
cleanup_tag(pipe_list, pipe_matches);
stack = oldstack;
sys_flags &= ~PIPE;
str = temp;
}
/* a kind of really LOUD tell... */
void beep_tell(player * p, char *str)
{
char *msg, *pstring, *final, *mid, *scan;
char *oldstack;
player **list, **step;
int i, n;
command_type = PERSONAL | SEE_ERROR;
if (p->tag_flags & BLOCK_TELLS)
{
tell_player(p, " You can't yell at other people when you yourself "
"are blocking tells.\n");
return;
}
if (p->location->flags & ISOLATED_ROOM)
{
tell_player(p, " But this is an isolated room !!\n");
return;
}
oldstack = stack;
align(stack);
list = (player **) stack;
msg = next_space(str);
if (!*msg)
{
tell_player(p, " Format : yell <player(s)> <msg>\n");
return;
}
if (p->flags & FROGGED)
{
*msg = 0;
msg = get_frog_msg("yell");
}
else
{
*msg++ = 0;
}
if (!(strcasecmp(str, "everyone")))
{
tell_player(p, " You can't yell at _everyone_!! \n");
stack = oldstack;
return;
}
if (!(strcasecmp(str, "room")))
{
tell_player(p, " You can't yell at everyone in the room! \n");
stack = oldstack;
return;
}
if (!strcasecmp(str, "friends") && p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends \n");
return;
}
if (strstr(str, "friends"))
sys_color_atm = FRTsc;
else if (strcasecmp(str, "room"))
sys_color_atm = TELsc;
else
sys_color_atm = ROMsc;
/* for the repeat command ... */
p->last_remote_command = 6;
strncpy(p->last_remote_msg, msg, MAX_REPLY - 3);
for (scan = msg; *scan; scan++);
switch (*(--scan))
{
case '?':
mid = "boggles at";
break;
case '!':
mid = "hollers at";
break;
default:
mid = "yells at";
break;
}
command_type |= SORE;
#ifdef ALLOW_MULTIS
if (isdigit(*str))
n = 2;
else
n = global_tag(p, str, 1);
if (n > 1)
{
stack = oldstack;
multi_yell(p, str, msg);
return;
}
#else
n = global_tag(p, str);
#endif
if (!n)
{
stack = oldstack;
sys_color_atm = SYSsc;
return;
}
/* for reply */
if (strcasecmp(str, "friends"))
{
make_reply_list(p, list, n);
}
else
{
p->shout_index += count_caps(str) + 17;
}
for (step = list, i = 0; i < n; i++, step++)
{
if (*step != p)
{
pstring = tag_string(*step, list, n);
final = stack;
if ((*step)->tag_flags & NOBEEPS)
{
if ((*step)->custom_flags & NOPREFIX)
sprintf(stack, "%s %s %s -> %s ^N<-\n", p->name, mid, pstring, msg);
else
sprintf(stack, "%s %s %s -> %s ^N<-\n", full_name(p), mid, pstring,
msg);
}
else
{
if ((*step)->custom_flags & NOPREFIX)
sprintf(stack, "%s %s %s -> %s ^N<-\007\n", p->name, mid, pstring,
msg);
else
sprintf(stack, "%s %s %s -> %s ^N<-\007\n", full_name(p), mid,
pstring, msg);
}
stack = end_string(stack);
tell_player(*step, final);
#ifdef INTELLIBOTS
if ((*step)->residency & ROBOT_PRIV)
intelligent_robot(p, *step, final, IR_PRIVATE);
#endif
/* process_review(*step, final); */
stack = pstring;
}
}
sys_color_atm = SYSsc;
if (sys_flags & EVERYONE_TAG || sys_flags & (FRIEND_TAG | OFRIEND_TAG)
|| sys_flags & ROOM_TAG || !(sys_flags & FAILED_COMMAND))
{
switch (*scan)
{
case '?':
mid = "boggle at";
break;
case '!':
mid = "holler at";
break;
default:
mid = "yell at";
break;
}
pstring = tag_string(p, list, n);
final = stack;
sprintf(stack, " You %s %s -> %s ^N<-\n", mid, pstring, msg);
stack = strchr(stack, 0);
if (idlingstring(p, list, n))
strcpy(stack, idlingstring(p, list, n));
stack = end_string(stack);
tell_player(p, final);
}
cleanup_tag(list, n);
stack = oldstack;
}
void repeat_mistell(player * p, char *str)
{
char *oldstack;
oldstack = stack;
if (!*str)
{
tell_player(p, " Format: repeat <name>\n");
stack = oldstack;
return;
}
sprintf(stack, "%s %s", str, p->last_remote_msg);
stack = end_string(stack);
/* hope dis works ... */
switch (p->last_remote_command)
{
case 1:
/* tell */
tell(p, oldstack);
break;
case 2:
/* remote, rthink, premote */
remote(p, oldstack);
break;
case 3:
/* recho */
recho(p, oldstack);
break;
case 4:
/* whisper */
whisper(p, oldstack);
break;
case 5:
/* rsing */
rsing(p, oldstack);
break;
case 6:
/* beep_at */
beep_tell(p, oldstack);
break;
default:
/* error */
tell_player(p, " Error - no previous remote command used.\n");
break;
}
stack = oldstack;
}
void tell_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: tfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: tfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
tell(p, oldstack);
stack = oldstack;
}
void remote_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: rfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: rfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
remote(p, oldstack);
stack = oldstack;
}
void rt_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: rtfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: rtfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends thinks . o O ( %s )", str, msg);
stack = end_string(stack);
remote(p, oldstack);
stack = oldstack;
}
void premote_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: pfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: pfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
premote(p, oldstack);
stack = oldstack;
}
void recho_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: efo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: efo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
recho(p, oldstack);
stack = oldstack;
}
void rsing_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: sfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: sfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
rsing(p, oldstack);
stack = oldstack;
}
void beepat_friends(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, " Format: yfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
oldstack = stack;
sprintf(stack, "friends %s", str);
stack = end_string(stack);
beep_tell(p, oldstack);
stack = oldstack;
}
void beepat_others_friends(player * p, char *str)
{
char *oldstack, *msg;
if (!*str)
{
tell_player(p, " Format: yfo <player> <message>\n");
return;
}
msg = next_space(str);
*msg++ = 0;
if (!*msg)
{
tell_player(p, " Format: yfo <player> <message>\n");
return;
}
if (p->tag_flags & BLOCK_FRIENDS)
{
tell_player(p, " You dork. You can not friendspam when you're blocking friends\n");
return;
}
if (msg == strchr(str, ' '))
*msg = '\0';
oldstack = stack;
sprintf(stack, "%s.friends %s", str, msg);
stack = end_string(stack);
beep_tell(p, oldstack);
stack = oldstack;
}
/* Go to the relaxed room, where you can be as offensive as you like */
/* Well, nearly */
void go_relaxed(player * p, char *str)
{
player *p2;
char *oldstack;
oldstack = stack;
if ((p->residency & SU) && (*str))
/* Move someone else to the relaxed room */
{
/* find them */
p2 = find_player_global(str);
if (!p2)
return;
else
{
/* no relaxing your superiors... */
if (p2->residency >= p->residency)
{
tell_player(p, " You try and try, but you're just to weak to"
" budge them!\n");
return;
}
/* and they might already be there */
if (!strcmp(p2->location->owner->lower_name, SYS_ROOM_OWNER)
&& !strcmp(p2->location->id, RELAXED_ROOM))
{
TELLPLAYER(p, " They're already in the %s!\n", RELAXED_ROOM);
return;
}
/* tell the SU channel */
command_type |= ADMIN_BARGE;
sprintf(stack, " -=> %s puts %s in the %s.\n", p->name,
p2->name, RELAXED_ROOM);
stack = end_string(stack);
su_wall(oldstack);
stack = oldstack;
/* tell the player */
tell_player(p2,
" -=*> You suddenly find yourself picked up out of the room,\n"
" -=*> and you fly through the air, landing in...\n");
/* move them */
move_to(p2, sys_room_id(RELAXED_ROOM), 0);
/* stick them in place for 60 secs */
p2->no_move = 60;
return;
}
return;
}
/* no argument specified or player is not an SU */
/* check if they're in the can already */
if (!strcmp(p->location->owner->lower_name, SYS_ROOM_OWNER)
&& !strcmp(p->location->id, RELAXED_ROOM))
{
TELLPLAYER(p, " You're already in the %s!\n", RELAXED_ROOM);
return;
}
/* or if they're stuck */
if (p->no_move)
{
tell_player(p, " You seem to be stuck to the ground.\n");
return;
}
/* otherwise move them */
move_to(p, sys_room_id(RELAXED_ROOM), 0);
}