/* -*- LPC -*- */
/*
* $Locker: pinkfish $
* $Id: sh_out.c,v 1.29 2002/08/03 23:16:49 danbala Exp pinkfish $
*/
#include <player.h>
#include <drinks.h>
#include <language.h>
#include <cmds/options.h>
#include "/d/am/path.h"
inherit "/cmds/base";
inherit "/cmds/speech";
#define TP this_player()
#define BEEP sprintf("%c",7)
#define NO_QUIT_INVENTORY 1
#define NO_QUIT_COMBAT 2
#define BROADCASTER "/obj/handlers/broadcaster"
int query_no_quit();
string query_shout_word_type(string str);
void my_mess(string fish, string erk);
/* ok... the shout cost is charged for every 5 letters, plus a bonus
* one for the start charge.. SO a shout of yes will cost 1 social
* point... where as a shout of lots a letters will cost lots
*/
mixed cmd(string str) {
string s1, s2, s;
object g;
string cur_lang;
object lag;
int tim, cost;
if(!str || str == "")
return notify_fail("Syntax : shout <text>\n");
if (!environment(this_player()))
return notify_fail( "You appear to be in limbo...\n" );
if(TP->query_property("dead") == 1)
return notify_fail("You don't have any lungs, how can you shout?\n");
if (TP->check_earmuffs("shout"))
return notify_fail("Why shout when you can't hear people "
"shout back?\n");
cur_lang = TP->query_current_language();
if (!LANGUAGE_HAND->query_language_spoken(cur_lang))
return notify_fail(capitalize(cur_lang)+" is not a spoken language.\n");
if (!LANGUAGE_HAND->query_language_distance(cur_lang))
return notify_fail(capitalize(cur_lang)+" is not able to spoken "
"at a distance.\n");
if (TP->query_invis())
return notify_fail("Invisible people cannot shout, they cannot "
"see their arm in front of their face. Shouting is "
"out of the question.\n");
// Added by Obilix 9/4/97
if (TP->query_property("gagged"))
return notify_fail("You have been gagged! You will not be able "
"to shout again until the gag is removed. Perhaps "
"you should talk to a creator about this.\n");
if (TP->query_property("recently shouted")) {
return notify_fail("You have shouted very recently, perhaps you "
"should give your lungs a small break and try again "
"in a couple seconds.\n");
}
if(TP->query_property("player") == 1 && !TP->query_creator()) {
cost = SHOUT_COST * ((strlen(str) / 5) + 1);
// Capitals and punctuation cost extra.
cost += sizeof(filter(explode(str, ""), (: $1 <= "Z" :))) / 2;
if(TP->adjust_sp(-cost) < 0)
return notify_fail(NO_POWER);
TP->adjust_max_sp(- (cost / 5));
}
if (!interactive(TP)) {
str = TP->convert_message( str );
str = TP->fit_message( str );
}
s1 = query_shout_word_type(str);
if (s1 != "yell")
s = "shouts" + s1;
else
s = s1 + "s";
if(TP->query_property(SHORTHAND_PROP))
str = fix_shorthand(str);
if(TP->query_volume( D_ALCOHOL))
str = drunk_speech( str );
TP->remove_hide_invis("hiding");
if (s1 != "yell") {
if (cur_lang != "common") s1 += " in " + capitalize(cur_lang);
my_mess("You shout" + s1 + ": ", str);
} else {
if (cur_lang != "common") s1 += " in " + capitalize(cur_lang);
my_mess("You " + s1 + ": ", str);
}
s2 = " " + lower_case(str);
/* Who zapped the old 8 code? */
/* Damn it used to be quite clever... grrr. could have least #ifdefed it
* - pf */
/* Remove this and face the wrath of Bel-Shamharoth. */
/* And yes, this is in the books.... */
if (sscanf(" "+s2, "%s eight%s", s1, s1)==2 ||
sscanf(s2, "%s8%s", s1, s1)==2) {
s1 = replace(str, ({ "8", "", " eight", "", " ", "" }));
switch (query_no_quit()) {
case NO_QUIT_INVENTORY:
return notify_fail("You only just arrived. You are far too "
"busy strapping on equipment to shout like that.\n");
case NO_QUIT_COMBAT:
return notify_fail("You are too busy fighting to shout "
"like that.\n");
default:
if (s1 == "") {
/* Was just a string of 8's and spaces.... */
write("Oops...\n");
call_out( "summon_bel_shamharoth", 10, TP );
}
else {
g = (object)TP->query_guild_ob();
if (random(100) < 40 ||
(g && (string)g->query_name() == "wizards"))
write("Oops...\n");
call_out( "summon_bel_shamharoth", 10, TP );
}
}
}
/* Check for lag shouts... */
/* This isn't in the books, but I don't care */
lag = load_object(SHORT + "short20")->lag_for_shout();
if(lag && sscanf(" "+lower_case(s2), "%*s lag%*s") == 2) {
// catch(lag = LAG_ROOM->lag_for_shout());
tim = TP->query_property("lag shout time");
/* Make it time out so it does not clutter up stuff */
TP->add_property("lag shout time", time(), 300);
// that'll teach them! Ceres
if((tim + 300 > time()) && lag != TP) {
switch (query_no_quit()) {
case NO_QUIT_INVENTORY:
lag->init_command("hug "+ TP->query_name() +
" Welcome to " + mud_name() + "", 0);
return notify_fail("The air is suddenly squeezed out "
"of you.\n");
case NO_QUIT_COMBAT:
lag->init_command("wedgie " + TP->query_name(), 0);
return notify_fail("You are rudely interrupted "
"mid-shout. Fortunately you are not distracted "
"from the fight.\n");
default:
call_out( "summon_bel_shamharoth", 10, TP, 1);
}
}
}
if(environment(this_player()) &&
environment(this_player())->query_property("location") == "inside")
tim = 10;
else
tim = 3;
user_event( this_player(), "person_shout",
(string)this_player()->a_short() +" "+ s,
str, cur_lang,
(int *)environment( this_player() )->query_co_ord(),
( 100 * ( (int)this_player()->query_con() +
(int)this_player()->query_str() ) ) / tim );
/*
TP->comm_event(users(), "person_shout", "$a_short:"+ file_name(TP) +
"$ "+ s, str, cur_lang);
*/
environment(TP)->event_person_shout( 0, (string)TP->a_short() +" "+ s,
str + "%^RESET%^", cur_lang );
BROADCASTER->npc_shout_event(TP, (string)TP->a_short() +" "+ s,
str + "%^RESET%^", cur_lang,
(int *)environment(TP)->query_co_ord(),
(100 * ((int)TP->query_con() +
(int)TP->query_str() ) ) / 3);
if (TP->query_property("player") == 1 && !TP->query_creator()) {
TP->add_property("recently shouted", 1, 2);
}
return 1;
}
string query_shout_word_type(string str) {
switch (str[<1]) {
case '!':
return "yell";
case '?':
return " asking";
default:
return "";
}
}
void my_mess(string fish, string erk) {
if(!interactive(TP))
return;
printf("%s%-=*s\n", fish, TP->query_cols() - strlen(fish),
TP->fix_string(erk));
}
void summon_bel_shamharoth(object who, int lag_shout) {
object env;
if (!who || !objectp(who))
return;
if (!random(3))
who->adjust_tmp_con(-2);
if (!random(3))
who->adjust_tmp_int(-2);
if (!random(3))
who->adjust_tmp_wis(-2);
if (!random(3))
who->adjust_tmp_dex(-2);
env = environment(who);
if ("/secure/master"->query_lord(geteuid(who))) {
BROADCASTER->broadcast_event(users(),
(int *)env->query_co_ord(),
"The heavens shake with a hideous roar and just as suddenly "
"all is quiet.\n$C$"+ who->query_name() + " chuckles in the "
"distance.\n",
( 100 * ( (int)who->query_con() +
(int)who->query_str() ) ) / 3,
1, 0);
tell_object(who, "Your lordliness saves you from a grizzly "
"encounter with the Sender of Eight.\n");
} else {
BROADCASTER->broadcast_event(users(),
(int *)env->query_co_ord(),
"a sudden chill passes through the land as $C$" +
who->query_name() + " is carried off screaming "
"to the land of shades.\n",
( 100 * ( (int)who->query_con() +
(int)who->query_str() ) ) / 3,
1, 0);
tell_object( who, "You think you'd best be careful what you "
"shout in the future as shadowy tentacles drag you "
"into the ground...\n" );
if(lag_shout)
BROADCASTER->broadcast_event(users(),
(int *)env->query_co_ord(),
( 100 * ( (int)who->query_con() +
"The heavens shake with a hideous chuckle and in the "
"distance a booming yet apologetic voice says: Oops.\n",
(int)who->query_str() ) ) / 3,
1, 0);
if(base_name(env) != "/room/departures")
who->quit();
}
}
/**
* check to see if player can quit voluntarily
* @returns non zero code if the player may not voluntarily quit
*/
int query_no_quit() {
/* "You cannot quit yet: your inventory is still being generated.\n" */
if (TP->query_save_inhibit() || TP->query_auto_loading()) {
return NO_QUIT_INVENTORY;
}
/* "You cannot quit while in combat.\n" */
if (sizeof(filter_array(TP->query_attacker_list(), (: living($1) :)))) {
return NO_QUIT_COMBAT;
}
return 0;
}