// _shout.c
// Command to have players shout. Shouts reach your room and the adjacent
// rooms only - this is NOT a global shout!
// Written by Mobydick, 11-10-92
// Rewritten to suit languages, Megadeath@TMI-2, 15/7 93
// Fixed messed up vars, and types
// Leto 94-13-11
#include <mudlib.h>
#include <language.h>
#include <daemons.h>
inherit DAEMON ;
string g_string, g_lang;
void do_shout(object where, string str, string p_language, int success );
int cmd_shout (string str) {
mapping rooms, languages ;
string *roomnames, p_language, ostr ;
object ob ;
int i, p_chance, flag, success, loop ;
string nstr, how, what ;
if (!str) {
notify_fail("Shout what?\n");
return 0;
}
nstr = str;
#ifdef LANGUAGES
// Fetch the languages X speaks.
languages=previous_object()->query("languages");
if (!languages) languages = LANGUAGE_D->get_mapping() ;
// filter out which language to use
flag = 0 ;
ostr = str;
if ( sscanf (str, "in %s %s", how, what)==2) {
p_language = lower_case(how) ;
str = what ;
} else {
how = previous_object()->query("default_language") ;
if (!how) how="common" ;
p_language = lower_case(how) ;
}
if (languages[lower_case(how)] > 0 )
{
flag=1 ;
p_language=lower_case(how);
p_chance=languages[p_language];
}
if (flag==0)
{
p_language = "common";
p_chance = languages[p_language];
how = "common";
str = ostr;
}
// Now we want to determine success or not, in speaking the language
success=0;
if ( random (100) < p_chance )
success=1;
if ( ! success )
write ("You stumble out some words, unfamiliar with the tongue.\n");
// Now fetch the garbled versions of the string from the language daemon.
g_string=(string)LANGUAGE_D->garble_string(str, p_language);
g_lang=(string)LANGUAGE_D->transform_string(str, p_language);
ostr = "in " + capitalize(p_language) + ": " + str;
str = ostr;
#endif
#ifndef LANGUAGES
ostr =": " + str;
str = ostr;
#endif
write ("You shout "+str+"\n") ;
ob = environment(this_player());
if (!ob) {
notify_fail("Your shouts go unheard in the void.\n");
return 0;
}
do_shout (environment(previous_object()),nstr, p_language, success) ;
rooms = ob->query("exits");
roomnames = sizeof(rooms) ? keys(rooms) : ({});
for (i=0;i<sizeof(roomnames);i++) {
ob = find_object(rooms[roomnames[i]]) ;
if (ob) do_shout (ob, nstr, p_language, success ) ;
}
return 1 ;
}
int help() {
write ("Usage: shout <message>\n\n"+
"Shout will broadcast <message> to everyone in the room and in all\n"+
"adjacent rooms. It does not reach anyone else in the MUD. If you are\n"+
"trapped by a bug and need help, use \"wizcall\" instead. Do NOT use\n"+
"wizcall for any other reason.\n"+
#ifdef LANGUAGES
"If <language> is passed, this will override your spoken language.\n"+
#endif
"See also: say, tell, wizcall\n") ;
return 1 ;
}
// Added this for the possibility of a filtered, language based shout.
void do_shout(object where, string str, string p_language, int success )
{
object *inv;
int loop;
inv=all_inventory(where);
loop=sizeof(inv);
while (loop--)
{
string nstr;
if (interactive(inv[loop]) )
{
nstr=str;
#ifdef LANGUAGES
nstr=(string)LANGUAGE_D->get_string(str, inv[loop], p_language, success, g_string, g_lang );
#endif
if (previous_object() != inv[loop] )
message("say", wrap(previous_object()->query("cap_name") +
" shouts" +
#ifndef LANGUAGES
": " +
#endif
nstr ),inv[loop]);
}
}
}