/*
DaleMUD v2.0 Released 2/1994
See license.doc for distribution terms. DaleMUD is based on DIKUMUD
*/
#include <stdio.h>
#include <string.h>
#include "protos.h"
/* extern variables */
extern struct room_data *world;
extern struct descriptor_data *descriptor_list;
void do_say(struct char_data *ch, char *argument, int cmd)
{
int i;
char buf[MAX_INPUT_LENGTH+40];
dlog("in do_say");
if (apply_soundproof(ch))
return;
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
send_to_char("Yes, but WHAT do you want to say?\n\r", ch);
else {
sprintf(buf,"$n says '%s'", argument + i);
act(buf,FALSE,ch,0,0,TO_ROOM);
if (IS_NPC(ch)||(IS_SET(ch->specials.act, PLR_ECHO))) {
sprintf(buf,"You say '%s'\n\r", argument + i);
send_to_char(buf, ch);
}
}
}
void do_report(struct char_data *ch, char *argument, int cmd)
{
char buf[100];
int i,ii,iii;
dlog("in do_report");
if (apply_soundproof(ch))
return;
if (IS_NPC(ch))
return;
if (GET_HIT(ch) > GET_MAX_HIT(ch) || /* bug fix */
GET_MANA(ch) > GET_MAX_MANA(ch) ||
GET_MOVE(ch) > GET_MAX_MOVE(ch)) {
send_to_char("Sorry, cannot do that right now.\n\r",ch);
return;
}
sprintf(buf,"$c0014[$c0015$n$c0014] reports 'HP:%2.0f%% MANA:%2.0f%% MV:%2.0f%%'",
((float)GET_HIT(ch) / (int)GET_MAX_HIT(ch)) * 100.0 + 0.5,
((float)GET_MANA(ch) / (int)GET_MAX_MANA(ch)) * 100.0 + 0.5,
((float)GET_MOVE(ch) / (int)GET_MAX_MOVE(ch)) * 100.0 + 0.5);
act(buf,FALSE,ch,0,0,TO_ROOM);
sprintf(buf,"$c0014You report 'HP:%2.0f%% MANA:%2.0f%% MV:%2.0f%%'",
((float)GET_HIT(ch) / (int)GET_MAX_HIT(ch)) * 100.0 + 0.5,
((float)GET_MANA(ch) / (int)GET_MAX_MANA(ch)) * 100.0 + 0.5,
((float)GET_MOVE(ch) / (int)GET_MAX_MOVE(ch)) * 100.0 + 0.5);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
void do_shout(struct char_data *ch, char *argument, int cmd)
{
char buf1[MAX_INPUT_LENGTH+40];
struct descriptor_data *i;
extern int Silence;
dlog("in do_shout");
if (!IS_NPC(ch) && IS_SET(ch->specials.act, PLR_NOSHOUT)) {
send_to_char("You can't shout!!\n\r", ch);
return;
}
if (IS_NPC(ch) &&
(Silence == 1) &&
(IS_SET(ch->specials.act, ACT_POLYSELF)))
{
send_to_char("Polymorphed shouting has been banned.\n\r", ch);
send_to_char("It may return after a bit.\n\r", ch);
return;
}
if (apply_soundproof(ch))
return;
for (; *argument == ' '; argument++);
if (ch->master && IS_AFFECTED(ch, AFF_CHARM)) {
if (!IS_IMMORTAL(ch->master)) {
send_to_char("I don't think so :-)", ch->master);
return;
}
}
if (GET_MOVE(ch)<10 || GET_MANA(ch)<10 && GetMaxLevel(ch) < LOW_IMMORTAL) {
send_to_char("You do not have the strength to shout!\n\r",ch);
return;
}
if (!(*argument))
send_to_char("Shout? Yes! Fine! Shout we must, but WHAT??\n\r", ch);
else {
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf1,"$c0009You shout '%s'", argument);
act(buf1,FALSE, ch,0,0,TO_CHAR);
}
sprintf(buf1, "$c0009[$c0015$n$c0009] shouts '%s'", argument);
act("$c0009[$c0015$n$c0009] lifts up $s head and shouts loudly", FALSE, ch, 0, 0, TO_ROOM);
if (GetMaxLevel(ch)<LOW_IMMORTAL) {
GET_MOVE(ch) -= 10;
GET_MANA(ch) -= 10;
}
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected &&
(IS_NPC(i->character) ||
(!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
!IS_SET(i->character->specials.act, PLR_DEAF))) &&
!check_soundproof(i->character)) {
act(buf1, 0, ch, 0, i->character, TO_VICT);
}
}
}
void do_gossip(struct char_data *ch, char *argument, int cmd)
{
char buf1[MAX_INPUT_LENGTH+40];
struct descriptor_data *i;
extern int Silence;
dlog("in do_gossip");
if (!IS_NPC(ch) && IS_SET(ch->specials.act, PLR_NOSHOUT)) {
send_to_char("You can't shout, gossip or auction.\n\r", ch);
return;
}
if (IS_NPC(ch) &&
(Silence == 1) &&
(IS_SET(ch->specials.act, ACT_POLYSELF)))
{
send_to_char("Polymorphed gossiping has been banned.\n\r", ch);
send_to_char("It may return after a bit.\n\r", ch);
return;
}
if (apply_soundproof(ch))
return;
for (; *argument == ' '; argument++);
if (ch->master && IS_AFFECTED(ch, AFF_CHARM)) {
if (!IS_IMMORTAL(ch->master)) {
send_to_char("I don't think so :-)", ch->master);
return;
}
}
if (!(*argument))
send_to_char("Gossip? Yes! but what!\n\r", ch);
else {
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf1,"$c0011You gossip '%s'", argument);
act(buf1,FALSE, ch,0,0,TO_CHAR);
}
/* I really hate when people gossip about lag and it is not */
/* caused by this machine NOR IS IT ON this machine. This */
/* should grab all the gossips about it and make them think */
/* that is was punched over the wire to everyone else! */
if (strstr(argument,"lag") || strstr(argument,"LAG") || strstr(argument,"Lag") ||
strstr(argument,"LAg") || strstr(argument,"laG") || strstr(argument,"lAG")) {
/* do nothing.... */
} else
/* end lag checks */
{
sprintf(buf1, "$c0011[$c0015$n$c0011] gossips '%s'", argument);
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected &&
(IS_NPC(i->character) ||
(!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
!IS_SET(i->character->specials.act, PLR_NOGOSSIP))) &&
!check_soundproof(i->character)) {
#if ZONE_COMM_ONLY
/* gossip in zone only */
if (i->character->in_room != NOWHERE) {
if (real_roomp(ch->in_room)->zone ==
real_roomp(i->character->in_room)->zone
||GetMaxLevel(i->character) >=LOW_IMMORTAL
||GetMaxLevel(ch) >= LOW_IMMORTAL ) {
act(buf1, 0, ch, 0, i->character, TO_VICT);
}
}
#else
act(buf1, 0, ch, 0, i->character, TO_VICT);
#endif
} /* end for */
} /* not gosssing about lag */
}
}
void do_auction(struct char_data *ch, char *argument, int cmd)
{
char buf1[MAX_INPUT_LENGTH+40];
struct descriptor_data *i;
extern int Silence;
dlog("in do_auction");
if (!IS_NPC(ch) && IS_SET(ch->specials.act, PLR_NOSHOUT)) {
send_to_char("You can't shout, gossip or auction.\n\r", ch);
return;
}
if (IS_NPC(ch) &&
(Silence == 1) &&
(IS_SET(ch->specials.act, ACT_POLYSELF)))
{
send_to_char("Polymorphed auctioning has been banned.\n\r", ch);
send_to_char("It may return after a bit.\n\r", ch);
return;
}
if (apply_soundproof(ch))
return;
for (; *argument == ' '; argument++);
if (ch->master && IS_AFFECTED(ch, AFF_CHARM)) {
if (!IS_IMMORTAL(ch->master)) {
send_to_char("I don't think so :-)", ch->master);
return;
}
}
if (!(*argument))
send_to_char("Auction? Yes! But what!\n\r", ch);
else {
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf1,"$c0010You auction '%s'", argument);
act(buf1,FALSE, ch,0,0,TO_CHAR);
}
sprintf(buf1, "$c0010[$c0015$n$c0010] auctions '%s'", argument);
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected &&
(IS_NPC(i->character) ||
(!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
!IS_SET(i->character->specials.act, PLR_NOAUCTION))) &&
!check_soundproof(i->character)) {
#if ZONE_COMM_ONLY
/* gossip in zone only */
if (i->character->in_room != NOWHERE) {
if (real_roomp(ch->in_room)->zone ==
real_roomp(i->character->in_room)->zone
||GetMaxLevel(i->character) >=LOW_IMMORTAL
||GetMaxLevel(ch) >= LOW_IMMORTAL ) {
act(buf1, 0, ch, 0, i->character, TO_VICT);
}
}
#else
act(buf1, 0, ch, 0, i->character, TO_VICT);
#endif
}
}
}
void do_commune(struct char_data *ch, char *argument, int cmd)
{
static char buf1[MAX_INPUT_LENGTH];
struct descriptor_data *i;
dlog("in do_commune,think");
for (; *argument == ' '; argument++);
if (!(*argument))
send_to_char("Communing among the gods is fine, but WHAT?\n\r",ch);
else {
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf1,"$c0012You think '%s'", argument);
act(buf1,FALSE, ch,0,0,TO_CHAR);
}
sprintf(buf1, "$c0012::$c0015$n$c0012:: '%s'", argument);
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected && !IS_NPC(i->character) &&
!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
(GetMaxLevel(i->character) >= LOW_IMMORTAL))
act(buf1, 0, ch, 0, i->character, TO_VICT);
}
}
void do_tell(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
char name[100], message[MAX_INPUT_LENGTH+20],
buf[MAX_INPUT_LENGTH+60];
dlog("in do_tell");
if (apply_soundproof(ch))
return;
half_chop(argument,name,message);
if(!*name || !*message) {
send_to_char("Who do you wish to tell what??\n\r", ch);
return;
} else if (!(vict = get_char_vis(ch, name))) {
send_to_char("No-one by that name here..\n\r", ch);
return;
} else if (ch == vict) {
send_to_char("You try to tell yourself something.\n\r", ch);
return;
} else
if (GET_POS(vict) == POSITION_SLEEPING && !IS_IMMORTAL(ch))
{
act("$E is asleep, shhh.",FALSE,ch,0,vict,TO_CHAR);
return;
} else if (IS_NPC(vict) && !(vict->desc)) {
send_to_char("No-one by that name here..\n\r", ch);
return;
} else if (!(GetMaxLevel(ch) >= LOW_IMMORTAL) &&IS_SET(vict->specials.act,PLR_NOTELL)) {
act("$N is not listening for tells right now.",FALSE,ch,0,vict,TO_CHAR);
return;
} else if ((GetMaxLevel(vict) >= LOW_IMMORTAL) && (GetMaxLevel(ch) >= LOW_IMMORTAL) &&
(GetMaxLevel(ch) < GetMaxLevel(vict)) && IS_SET(vict->specials.act,PLR_NOTELL)) {
act("$N is not listening for tells right now!",FALSE,ch,0,vict,TO_CHAR);
return;
} else if (!vict->desc) {
send_to_char("They can't hear you, link dead.\n\r", ch);
return;
}
if (check_soundproof(vict)) {
send_to_char("In a silenced room, try again later.\n\r",ch);
return;
}
#if ZONE_COMM_ONLY
if (real_roomp(ch->in_room)->zone !=
real_roomp(vict->in_room)->zone
&& GetMaxLevel(ch) < LOW_IMMORTAL ) {
send_to_char("That person is not near enough for you to tell.\n\r",ch);
return;
}
#endif
sprintf(buf,"$c0013[$c0015%s$c0013] tells you '%s'",
(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), message);
act(buf,FALSE, vict,0,0,TO_CHAR);
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf,"$c0013You tell %s %s'%s'",
(IS_NPC(vict) ? vict->player.short_descr : GET_NAME(vict)), \
(IS_AFFECTED2(vict, AFF2_AFK) ? "(who is AFK) " : ""), message);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
}
void do_whisper(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
char name[100], message[MAX_INPUT_LENGTH],
buf[MAX_INPUT_LENGTH];
dlog("in do_whisper");
if (apply_soundproof(ch))
return;
half_chop(argument,name,message);
if(!*name || !*message)
send_to_char("Who do you want to whisper to.. and what??\n\r", ch);
else if (!(vict = get_char_room_vis(ch, name)))
send_to_char("No-one by that name here..\n\r", ch);
else if (vict == ch) {
act("$n whispers quietly to $mself.",FALSE,ch,0,0,TO_ROOM);
send_to_char
("You can't seem to get your mouth close enough to your ear...\n\r",ch);
} else {
if (check_soundproof(vict))
return;
sprintf(buf,"$c0005[$c0015$n$c0005] whispers to you, '%s'",message);
act(buf, FALSE, ch, 0, vict, TO_VICT);
if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
sprintf(buf,"$c0005You whisper to %s%s, '%s'",
(IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), \
(IS_AFFECTED2(vict, AFF2_AFK) ? " (who is AFK)" : ""), message);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
act("$c0005$n whispers something to $N.", FALSE, ch, 0, vict, TO_NOTVICT);
}
}
void do_ask(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
char name[100], message[MAX_INPUT_LENGTH],
buf[MAX_INPUT_LENGTH];
dlog("in do_ask");
if (apply_soundproof(ch))
return;
half_chop(argument,name,message);
if(!*name || !*message)
send_to_char("Who do you want to ask something.. and what??\n\r", ch);
else if (!(vict = get_char_room_vis(ch, name)))
send_to_char("No-one by that name here..\n\r", ch);
else if (vict == ch) {
act("$c0006[$c0015$n$c0006] quietly asks $mself a question.",FALSE,ch,0,0,TO_ROOM);
act("$c0006You think about it for a while...",FALSE, ch,0,0,TO_CHAR);
} else {
if (check_soundproof(vict))
return;
sprintf(buf,"$c0006[$c0015$n$c0006] asks you '%s'",message);
act(buf, FALSE, ch, 0, vict, TO_VICT);
if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
sprintf(buf,"$c0006You ask %s%s, '%s'",
(IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), \
(IS_AFFECTED2(vict, AFF2_AFK) ? " (who is AFK)" : ""), message);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
act("$c0006$n asks $N a question.",FALSE,ch,0,vict,TO_NOTVICT);
}
}
#define MAX_NOTE_LENGTH 1000 /* arbitrary */
void do_write(struct char_data *ch, char *argument, int cmd)
{
struct obj_data *paper = 0, *pen = 0;
char papername[MAX_INPUT_LENGTH], penname[MAX_INPUT_LENGTH],
buf[MAX_STRING_LENGTH];
dlog("in do_write");
argument_interpreter(argument, papername, penname);
if (!ch->desc)
return;
if (!*papername) /* nothing was delivered */ {
send_to_char("write (on) papername (with) penname.\n\r", ch);
return;
}
if (!*penname) {
send_to_char("write (on) papername (with) penname.\n\r", ch);
return;
}
if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying))) {
sprintf(buf, "You have no %s.\n\r", papername);
send_to_char(buf, ch);
return;
}
if (!(pen = get_obj_in_list_vis(ch, penname, ch->carrying))) {
sprintf(buf, "You have no %s.\n\r", papername);
send_to_char(buf, ch);
return;
}
/* ok.. now let's see what kind of stuff we've found */
if (pen->obj_flags.type_flag != ITEM_PEN) {
act("$p is no good for writing with.",FALSE,ch,pen,0,TO_CHAR);
} else if (paper->obj_flags.type_flag != ITEM_NOTE) {
act("You can't write on $p.", FALSE, ch, paper, 0, TO_CHAR);
} else if (paper->action_description) {
send_to_char("There's something written on it already.\n\r", ch);
return;
} else {
/* we can write - hooray! */
send_to_char
("Ok.. go ahead and write.. end the note with a @.\n\r", ch);
act("$n begins to jot down a note.", TRUE, ch, 0,0,TO_ROOM);
ch->desc->str = &paper->action_description;
ch->desc->max_str = MAX_NOTE_LENGTH;
}
}
char *RandomWord()
{
static char *rstring[] = {
"argle",
"bargle",
"glop",
"glyph",
"hussamah", /* 5 */
"rodina",
"mustafah",
"angina",
"the",
"fribble", /* 10 */
"fnort",
"frobozz",
"zarp",
"ripple",
"yrk", /* 15 */
"yid",
"yerf",
"oork",
"grapple",
"red", /* 20 */
"blue",
"you",
"me",
"ftagn",
"hastur", /* 25 */
"brob",
"gnort",
"lram",
"truck",
"kill", /* 30 */
"cthulhu",
"huzzah",
"acetacytacylic",
"hydrooxypropyl",
"summah", /* 35 */
"hummah",
"cookies",
"stan",
"will",
"wadapatang", /* 40 */
"pterodactyl",
"frob",
"yuma",
"gumma",
"lo-pan", /* 45 */
"sushi",
"yaya",
"yoyodine",
"yaazr",
"bipsnop", /* 50 */
"\n"
};
int i;
for (i=0;*rstring[i]!='\n';i++); /* count max number in array */
return(rstring[number(0,i)]);
}
void do_sign(struct char_data *ch, char *argument, int cmd)
{
int i;
char buf[MAX_INPUT_LENGTH+40];
char buf2[MAX_INPUT_LENGTH];
char *p;
int diff;
struct char_data *t;
struct room_data *rp;
dlog("in do_sign");
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
send_to_char("Yes, but WHAT do you want to sign?\n\r", ch);
else {
rp = real_roomp(ch->in_room);
if (!rp) return;
if (!HasHands(ch)) {
send_to_char("Yeah right... WHAT HANDS!!!!!!!!\n\r", ch);
return;
}
strcpy(buf, argument+i);
buf2[0] = '\0';
/*
work through the argument, word by word. if you fail your
skill roll, the word comes out garbled.
*/
p = strtok(buf, " "); /* first word */
diff = strlen(buf);
while (p) {
if (ch->skills && number(1,75+strlen(p))<ch->skills[SKILL_SIGN].learned){
strcat(buf2, p);
} else {
strcat(buf2, RandomWord());
}
strcat(buf2, " ");
diff -= 1;
p = strtok(0, " "); /* next word */
}
/*
if a recipient fails a roll, a word comes out garbled.
*/
/*
buf2 is now the "corrected" string.
*/
sprintf(buf,"$n signs '%s'", buf2);
for (t = rp->people;t;t=t->next_in_room) {
if (t != ch) {
if (t->skills && number(1,diff) < t->skills[SKILL_SIGN].learned) {
act(buf, FALSE, ch, 0, t, TO_VICT);
} else {
act("$n makes funny motions with $s hands",
FALSE, ch, 0, t, TO_VICT);
}
}
}
if (IS_NPC(ch)||(IS_SET(ch->specials.act, PLR_ECHO))) {
sprintf(buf,"You sign '%s'\n\r", argument + i);
send_to_char(buf, ch);
}
}
}
/* speak elvish, speak dwarvish, etc... */
void do_speak(struct char_data *ch, char *argument, int cmd)
{
char buf[255];
int i,ii;
#define MAX_LANGS 8
char *lang_list[MAX_LANGS] = {
"common",
"elvish",
"halfling",
"dwarvish",
"orcish",
"giantish",
"ogre",
"gnomish"
};
dlog("in do_speak");
only_argument(argument,buf);
if (buf[0] == '\0') {
send_to_char("Speak what language?\n\r",ch);
return;
}
if (strstr(buf,"common"))
i = SPEAK_COMMON; else
if (strstr(buf,"elvish"))
i = SPEAK_ELVISH; else
if (strstr(buf,"halfling"))
i = SPEAK_HALFLING; else
if (strstr(buf,"dwarvish"))
i = SPEAK_DWARVISH; else
if (strstr(buf,"orcish"))
i = SPEAK_ORCISH; else
if (strstr(buf,"giantish"))
i = SPEAK_GIANTISH; else
if (strstr(buf,"ogre"))
i = SPEAK_OGRE; else
if (strstr(buf,"gnomish"))
i = SPEAK_GNOMISH; else
i = -1;
if (i == -1) {
send_to_char("Un-recognized language!\n\r",ch);
return;
}
/* set language that we're gonna speak */
ch->player.speaks = i;
sprintf(buf,"You concentrate on speaking %s.\n\r",lang_list[i-1]);
send_to_char(buf,ch);
}
/* this is where we do the language says */
void do_new_say(struct char_data *ch, char *argument, int cmd)
{
int i,ii,learned,skill_num;
char buf[MAX_INPUT_LENGTH+40];
char buf2[MAX_INPUT_LENGTH];
char buf3[MAX_INPUT_LENGTH+40];
char *p;
int diff;
struct char_data *t;
struct room_data *rp;
dlog("in do_new_say");
if (!argument)
return;
for (ii = 0; *(argument + ii) == ' '; ii++);
if (!argument[ii])
send_to_char("Yes, but WHAT do you want to say?\n\r", ch);
else {
if (apply_soundproof(ch))
return;
rp = real_roomp(ch->in_room);
if (!rp) return;
if (!ch->skills) {
learned = 0;
skill_num = LANG_COMMON;
} else {
/* find the language we are speaking */
switch(ch->player.speaks) {
case SPEAK_COMMON:learned = ch->skills[LANG_COMMON].learned;
skill_num=LANG_COMMON;
break;
case SPEAK_ELVISH: learned = ch->skills[LANG_ELVISH].learned;
skill_num=LANG_ELVISH;
break;
case SPEAK_HALFLING:learned = ch->skills[LANG_HALFLING].learned;
skill_num=LANG_HALFLING;
break;
case SPEAK_DWARVISH: learned = ch->skills[LANG_DWARVISH].learned;
skill_num=LANG_DWARVISH;
break;
case SPEAK_ORCISH:learned = ch->skills[LANG_ORCISH].learned;
skill_num=LANG_ORCISH;
break;
case SPEAK_GIANTISH:learned = ch->skills[LANG_GIANTISH].learned;
skill_num=LANG_GIANTISH;
break;
case SPEAK_OGRE:learned = ch->skills[LANG_OGRE].learned;
skill_num=LANG_OGRE;
break;
case SPEAK_GNOMISH:learned = ch->skills[LANG_GNOMISH].learned;
skill_num=LANG_GNOMISH;
break;
default:learned = ch->skills[LANG_COMMON].learned;
skill_num = LANG_COMMON;
break;
} /* end switch */
}
/* end finding language */
strcpy(buf, argument+ii);
buf2[0] = '\0';
/* we use this for ESP and immortals and comprehend lang */
sprintf(buf3,"$c0015[$c0005$n$c0015] says '%s'",buf);
/*
work through the argument, word by word. if you fail your
skill roll, the word comes out garbled.
*/
p = strtok(buf, " "); /* first word */
diff = strlen(buf);
while (p) {
if (number(1,75+strlen(p))<learned || GetMaxLevel(ch) >= LOW_IMMORTAL){
strcat(buf2, p);
} else {
/* add case statement here to use random words from clips of elvish */
/* dwarvish etc so the words look like they came from that language */
strcat(buf2, RandomWord());
}
strcat(buf2, " ");
diff -= 1;
p = strtok(0, " "); /* next word */
}
/*
if a recipient fails a roll, a word comes out garbled.
*/
/*
buf2 is now the "corrected" string.
*/
if (!*buf2 || !buf2) {
send_to_char("Yes, but WHAT do you want to say?\n\r", ch);
return;
}
sprintf(buf,"$c0015[$c0005$n$c0015] says '%s'", buf2);
for (t = rp->people;t;t=t->next_in_room) {
if (t != ch) {
if ((t->skills) && number(1,diff) < t->skills[skill_num].learned ||
GetMaxLevel(t) >= LOW_IMMORTAL || IS_NPC(t) ||
affected_by_spell(t,SKILL_ESP) || affected_by_spell(t,SPELL_COMP_LANGUAGES)) {
/* these guys always understand */
if (GetMaxLevel(t) >= LOW_IMMORTAL || affected_by_spell(t,SKILL_ESP) ||
affected_by_spell(t,SPELL_COMP_LANGUAGES) || IS_NPC(t) )
act(buf3, FALSE,ch,0,t,TO_VICT); else
/* otherwise */
act(buf, FALSE, ch, 0, t, TO_VICT);
} else {
act("$c0010$n speaks in a language you can't quite understand.", FALSE, ch, 0, t, TO_VICT);
}
}
}
if (IS_NPC(ch)||(IS_SET(ch->specials.act, PLR_ECHO))) {
sprintf(buf,"$c0015You say '%s'", argument + ii);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
}
}
void do_gtell(struct char_data *ch, char *argument, int cmd)
{
int i;
struct char_data *victim, *k;
struct follow_type *f;
char buf[MAX_STRING_LENGTH];
dlog("in do_gtell");
if (apply_soundproof(ch))
return;
for (i = 0; *(argument + i) == ' '; i++);
if(!*(argument+i)) {
send_to_char("What do you want to group tell!??\n\r", ch);
return;
}
if (!IS_AFFECTED(ch, AFF_GROUP)) {
send_to_char("But you are a member of no group?!\n\r", ch);
return;
} else {
if (ch->master)
k = ch->master;
else
k = ch;
for(f=k->followers; f; f=f->next)
{
if (IS_AFFECTED(f->follower, AFF_GROUP))
if (!f->follower->desc) {
/* link dead */
} else
if (ch == f->follower) {
/* can't tell yourself! */
} else
if (!check_soundproof(f->follower)) {
sprintf(buf,"$c0012[$c0015%s$c0012] group tells you '%s'",
(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), argument+i);
act(buf, FALSE,f->follower,0,0,TO_CHAR);
} /* !soundproof */
} /* end for loop */
/* send to master now */
if (ch->master) {
if (IS_AFFECTED(ch->master, AFF_GROUP))
if (!ch->master->desc) {
/* link dead */
} else
if (ch == ch->master) {
/* can't tell yourself! */
} else
if (!check_soundproof(ch->master)) {
sprintf(buf,"$c0012[$c0015%s$c0012] group tells you '%s'",
(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), argument+i);
act(buf, FALSE,ch->master,0,0,TO_CHAR);
} /* !soundproof */
} /* end master send */
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf,"$c0012You group tell '%s'",argument+i);
act(buf, FALSE,ch,0,0,TO_CHAR);
} /* if echo */
} /* they where grouped... */
} /* end of gtel */
/*
* 'Split' originally by Gnort, God of Chaos. I stole it from Merc
* and changed it to work with mine :) Heh msw
*/
void do_split(struct char_data *ch, char *argument, int cmd)
{
bool is_same_group( struct char_data *ach, struct char_data *bch );
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
struct char_data *gch;
int members, amount, share, extra;
dlog("in do_split");
one_argument( argument, arg );
if ( arg[0] == '\0' ) {
send_to_char( "Split how much?\n\r", ch );
return;
}
amount = atoi( arg );
if ( amount < 0 ) {
send_to_char( "Your group wouldn't like that.\n\r", ch );
return;
}
if ( amount == 0 ) {
send_to_char( "You hand out zero coins, but no one notices.\n\r", ch );
return;
}
if ( ch->points.gold < amount ) {
send_to_char( "You don't have that much gold.\n\r", ch );
return;
}
members = 0;
for ( gch = real_roomp(ch->in_room)->people;gch != NULL; gch = gch->next_in_room )
{
if ( is_same_group( gch, ch ) )
members++;
}
if ( members < 2 ) {
send_to_char( "Just keep it all.\n\r", ch );
return;
}
share = amount / members;
extra = amount % members;
if ( share == 0 ) {
send_to_char( "Don't even bother, cheapskate.\n\r", ch );
return;
}
ch->points.gold -= amount;
ch->points.gold += share + extra;
sprintf( buf,
"You split %d gold coins. Your share is %d gold coins.\n\r",
amount, share + extra );
send_to_char( buf, ch );
sprintf( buf, "$n splits %d gold coins. Your share is %d gold coins.",
amount, share );
for ( gch = real_roomp(ch->in_room)->people; gch != NULL; gch = gch->next_in_room )
{
if ( gch != ch && is_same_group( gch, ch ) )
{
act( buf,FALSE,ch, NULL, gch, TO_VICT );
gch->points.gold += share;
}
}
return;
}
void do_pray(struct char_data *ch, char *argument, int cmd)
{
struct affected_type af;
char buf1[MAX_INPUT_LENGTH];
struct descriptor_data *i;
int ii=0;
dlog("in do_pray");
if (IS_NPC(ch))
return;
if (affected_by_spell(ch, SPELL_PRAYER)) {
send_to_char("You have already prayed today.\n\r",ch);
return;
}
for (; *argument == ' '; argument++);
if (!(*argument))
send_to_char("Pray to a deity, but what?!?! (pray <DeityName> <prayer>)\n\r",ch);
else
{
ii =((int)GetMaxLevel(ch)*1.5);
if (HasClass(ch,CLASS_CLERIC|CLASS_DRUID))
ii +=10; /* clerics get a 10% bonus :) */
if (ii>number(1,101)) {
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf1,"You pray '%s'\n\r", argument);
send_to_char(buf1, ch);
}
sprintf(buf1, ":*:$n:*: prays '%s'", argument);
for (i = descriptor_list; i; i = i->next) {
if (i->character != ch && !i->connected && !IS_NPC(i->character) &&
!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
(GetMaxLevel(i->character) >= LOW_IMMORTAL))
act(buf1, 0, ch, 0, i->character, TO_VICT);
} /* end for */
} /* failed prayer */
else
send_to_char("You prayer is ignored at this time.\n\r",ch);
af.type = SPELL_PRAYER;
af.duration = 24;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(ch, &af);
return;
}
}
/* modified by Aarcerak */
bool is_same_group( struct char_data *ach, struct char_data *bch )
{
if( !IS_AFFECTED(ach,AFF_GROUP) || !IS_AFFECTED(bch,AFF_GROUP))
return 0;
if ( ach->master != NULL )
ach = ach->master;
if ( bch->master != NULL )
bch = bch->master;
return (ach == bch);
}
void do_telepathy(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
char name[100], message[MAX_INPUT_LENGTH+20],
buf[MAX_INPUT_LENGTH+60];
dlog("in do_telepathy");
half_chop(argument,name,message);
if (!HasClass(ch,CLASS_PSI) && !IS_AFFECTED(ch,AFF_TELEPATHY)) {
send_to_char("What do you think you are? A Telepath?\n\r",ch);
return;
}
if (GET_MANA(ch) < 5 && !IS_AFFECTED(ch,AFF_TELEPATHY)) {
send_to_char("You do not have the mental power to bespeak anyone.\n\r",ch);
return;
}
if(!*name || !*message) {
send_to_char("Who do you wish to bespeak what??\n\r", ch);
return;
} else if (!(vict = get_char_vis(ch, name))) {
send_to_char("No-one by that name here..\n\r", ch);
return;
} else if (ch == vict) {
send_to_char("You try to bespeak yourself something.\n\r", ch);
return;
} else
if (GET_POS(vict) == POSITION_SLEEPING && !IS_IMMORTAL(ch))
{
act("$E is asleep, shhh.",FALSE,ch,0,vict,TO_CHAR);
return;
} else if (IS_NPC(vict) && !(vict->desc)) {
send_to_char("No-one by that name here..\n\r", ch);
return;
} else if (!(GetMaxLevel(ch) >= LOW_IMMORTAL) &&IS_SET(vict->specials.act,PLR_NOTELL)) {
act("$N is not listening for thoughts right now.",FALSE,ch,0,vict,TO_CHAR);
return;
} else if ((GetMaxLevel(vict) >= LOW_IMMORTAL) && (GetMaxLevel(ch) >= LOW_IMMORTAL) &&
(GetMaxLevel(ch) < GetMaxLevel(vict)) && IS_SET(vict->specials.act,PLR_NOTELL)) {
act("$N is not listening for thoughts right now!",FALSE,ch,0,vict,TO_CHAR);
return;
} else if (!vict->desc) {
send_to_char("They can't hear you, link dead.\n\r", ch);
return;
}
/*
if (check_soundproof(vict)) {
send_to_char("In a silenced room, try again later.\n\r",ch);
return;
}
*/
if (!IS_AFFECTED(ch,AFF_TELEPATHY))
GET_MANA(ch) -=5;
sprintf(buf,"$c0013[$c0015%s$c0013] bespeaks you '%s'",
(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), message);
act(buf,FALSE, vict,0,0,TO_CHAR);
if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
sprintf(buf,"$c0013You bespeak %s '%s'",
(IS_NPC(vict) ? vict->player.short_descr : GET_NAME(vict)), message);
act(buf,FALSE, ch,0,0,TO_CHAR);
}
}