/*
// File : /cmds/std/_say.c
// Creator : Watcher@TMI (01/29/93)
//
// Standard say command with modification for loudness via race,
// special speech formats, and anonymous voices in dark areas.
//
// Revision history:
// Languages support by Megadeath@TMI-2
// Optimizations (?) by Robocoder@TMI-2
*/
#include <mudlib.h>
//#include <language.h>
inherit DAEMON ;
// Range of possible say verbs used in conjunction with user's
// speech loudnesss. If you don't want this feature, simply
// #undef VERBS
#define SIZEOF_VERBS 7
#define LONGEST_VERB 7
#define VERBS ({ "whisper", "mumble", "sing", "say", "holler", \
"yell", "scream" })
#undef VERBS
// #define VISUAL_CHECK to give anonymous voices in dark areas
// #undef VISUAL_CHECK to give the speaker's name regardless of light
// levels
#define VISUAL_CHECK 1
//#undef VISUAL_CHECK
// #undef LANGUAGES to disable LANGUAGE support from <language.h>
#undef LANGUAGES
#ifdef VERBS
int myloudness;
int compute_loudness(object target);
#endif
int cmd_optsay(string str) {
mixed *who;
object here;
string name, myname, tmp, special, *fmt, rest;
int loop, s, num;
int novision, otherlight;
// Block an attack from the queue as payment for the say use
this_player()->block_attack(2) ;
// Get user's environment
here = environment( previous_object() );
if (!str || str == "") {
notify_fail("You mutter to yourself.\n");
return 0;
}
#ifndef VERBS
// Check to see if user has a special say verb
special = (string) previous_object()->query("special_say");
if (special)
tmp = " " + special + "s: ";
else
tmp = " says: ";
#else
// Get my loudness
myloudness = (int)previous_object()->query("loudness");
#endif
myname = (string)previous_object()->query("cap_name");
// Rewrite string
#ifdef VERBS
num = 4 + LONGEST_VERB + ((loop = strlen(myname)) > 8 ? loop : 8);
#else
num = strlen(tmp) + ((loop = strlen(myname)) > 8 ? loop : 8);
#endif
loop = 79 - num;
if (strlen(str) > loop) {
rest = sprintf("%-=79s", sprintf("%" + num + "s", "") + str);
#if 1
fmt = explode(rest, "\n"); // until driver updated to 0.9.17.13
str = fmt[0][num..strlen(fmt[0])-1] + "
";
fmt[0] = 0;
rest = implode(fmt, "\n");
#else
loop = strsrch(rest, "\n");
if (loop != -1) {
str = rest[num .. loop - 1];
rest = rest[loop .. strlen(rest)-1];
} else
rest = "";
#endif
} else
rest = "";
// Get contents of the user's environment minus the user.
if (here)
who = all_inventory( here ) - ({ previous_object() });
else
who = ({ });
// Loop through and give the message to each member of the room
#ifdef VISUAL_CHECK
if (s = sizeof(who)) {
// Pre compute visual checks
if (here) {
novision = here->query("no_vision");
if (!novision) {
if (!(otherlight = (here->query("light") > 0))) {
for (loop = 0; loop < s; loop++) {
if (who[loop]->check_light()) {
otherlight = 1;
break;
}
}
}
}
}
}
#else
s = sizeof(who);
#endif
for (loop = 0; loop < s; loop ++) {
// This should be ok...if you want to catch_tell() you have to be
// living via enable_commands()
if (!living(who[loop])) continue;
#ifdef VERBS
// Get calculated say type corresponding to user's and
// target's loudness
num = compute_loudness( who[loop] );
#endif
#ifdef VISUAL_CHECK
if (!here || (!who[loop]->query("full_vision") &&
(who[loop]->query("blind") || novision) || !otherlight)) {
if(wizardp(this_player()))
name = "Someone";
else
name = "Somebody";
} else
#endif
name = myname;
#ifdef VERBS
message("say", sprintf("%s %s: %s%s\n",
name, VERBS[num], str, rest), who[loop]);
#else
message("say", sprintf("%s%s%s%s\n", name, tmp, str, rest), who[loop]);
#endif
}
if (special)
tmp = "You " + special + ": ";
else
tmp = "You say: ";
message("write", sprintf("%s%s%s\n", tmp, str, rest), this_player());
return 1;
}
#ifdef VERBS
// This function calculates the correct say verb to use by
// comparing the user's and target's loudness levels.
int compute_loudness(object target) {
int loudness;
loudness = ( myloudness - (int)target->query("loudness") +
SIZEOF_VERBS/2 );
if (loudness < 0)
return 0;
else if (loudness > SIZEOF_VERBS - 1)
return (SIZEVERBS - 1);
return loudness;
}
#endif
string help() {
return(
#ifdef LANGUAGES
@ENDSYNTAX
Syntax: say [in <language>] <message>
ENDSYNTAX
#else
@ENDSYNTAX
Syntax: say <message>
ENDSYNTAX
#endif
@ENDBASICHELP
The say command sends <message> to everyone listening within the current room.
However, if you are invisible, no one will be able to hear what you say.
ENDBASICHELP
#ifdef VERBS
@ENDLOUDNESSHELP
How you sound to others depends on how relatively loud you sound to others.
ENDLOUDNESSHELP
#endif
#ifdef LANGUAGES
@ENDLANGHELP
You may speak in a foreign tongue if you know it well enough. Otherwise
you'll have to speak in your race's native language.
ENDLANGHELP
#endif
@HELP
See also: converse, speak, languages
HELP
);
}