mud/lib/domains/Praxis/sage_room.c
2020-09-06 05:43:07 -07:00

284 lines
7.5 KiB
C

// /d/standard/sage_room
// by Valodin
// This is where you can learn new languages and fix old ones
#include <lib.h>
#include <daemons.h>
#include <clock.h>
// This is how many experience points == one second
#define SEC_TO_EXP 3
inherit "/lib/std/room";
#define OLD_LANGUAGES ({ "elvish", "giantish", "orcish", "artrellian", "mischief", "sensuous", "hobbitish", "pseudo-speak", "gnomish" })
mapping queue;
void create() {
::create();
queue = ([]);
SetProperty("light", 3);
SetProperty("indoors", 1);
SetProperty("no steal", 1);
SetProperty("no attack", 1);
SetProperty("no magic", 1);
SetShort( "Sage room");
SetLong( "The walls of this smoke-filled room are covered with trappings "
"from far off lands. In the center of a huge smoke cloud sits a small "
"white-haired man. He looks like he is very wise. There are books on "
"how to speak different languages.");
SetItems(
([({"sage", "man", "old man"}) : "The sage is a tiny little "
"wrinkled man. But he looks very wise.",
({"walls", "trappings"}) : "The walls are covered in strange "
"writings in many languages, but you can hardly see them "
"through all the smoke from the sage's pipe.",
"pipe" : "The sage puffs away on this small water pipe. "
"The wisps of smoke remind you of the man's beard.",
({"book", "books"}) : "As you flip through the books you "
"decide that you should study a new language."]) );
AddExit("south", "/domains/Praxis/w_boc_la2", (: "leave_the_room" :) );
}
void init() {
::init();
add_action("ask_sage", "ask");
add_action("study_lang", "study");
}
int remove_old_lang(object ob) {
string *langs;
int i, szl;
if(!function_exists("query_all_languages", ob))
return 0;
langs = ob->query_all_languages();
for(i = 0, szl = sizeof(langs); i < szl; i++)
if(member_array(langs[i], OLD_LANGUAGES) != -1)
ob->remove_language(langs[i]);
return 1;
}
int fix_languages() {
write("The sage peers at you intently.");
if(!remove_old_lang(this_player()))
{
write("The sage says: You need new flesh before I can help your mind.");
return 1;
}
//LANG_D->init_languages(this_player());
write("The sage says: You have been healed, my " +
((this_player()->query_gender() == "male") ? "son" :
"daughter") + ".");
return 1;
}
int ask_sage(string str)
{
string trash;
notify_fail("Ask who, what?\n");
if(!str)
return 0;
if(sscanf(str, "sage%s", trash, trash) == 1)
notify_fail("What do you want to ask the sage?\n");
if(sscanf(str, "sage%sfix%s", trash, trash) == 2)
{
return fix_languages();
}
return 0;
}
int able_to_study(int amount)
{
int exp;
exp = this_player()->query_exp();
if((exp - amount) <
ADVANCE_D->get_exp(this_player()->query_level()))
return 0;
else
return 1;
}
int coclean(mixed *element, object ob)
{
if(element[0] != ob)
return 0;
else
return 1;
}
void clean_call_outs(object ob)
{
mixed *all_callouts;
int i, acsz;
all_callouts = call_out_info();
all_callouts = filter_array(all_callouts, "coclean", this_object(),
this_object());
for(i = 0, acsz = sizeof(all_callouts); i < acsz; i++)
remove_call_out(all_callouts[i][1]);
for(i = 0, acsz = sizeof(all_callouts); i < acsz; i++)
if(all_callouts[i][3] != ob)
call_out(all_callouts[i][1], all_callouts[i][2], all_callouts[i][3]);
}
int convert_time(string str)
{
string *times;
int ret, i, j, tln;
times = explode(str, " ");
ret = 0;
tln = sizeof(times) / 2;
for(i = 0; i < tln; i++)
{
j = to_int(times[2 * i]);
switch(times[2 * i + 1])
{
case "seconds":
case "second":
j = j * SECOND;
break;
case "minutes":
case "minute":
j = j * MINUTE;
break;
case "hours":
case "hour":
j = j * HOUR;
break;
case "days":
case "day":
j = j * DAY;
break;
case "week":
case "weeks":
j = j * WEEK;
break;
case "month":
case "months":
j = j * MONTH;
break;
case "year":
case "years":
j = j * YEAR;
break;
default:
return 0;
}
ret += j;
}
return ret;
}
int study_lang(string str)
{
string lang, timestr;
int nmtimespan;
if(!str)
{
write("Study which language for how long?");
return 1;
}
if(queue[this_player()])
{
write("The sage says: I cannot teach you two languages at once, my " +
((this_player()->query_gender() == "male") ? "son." :
"daughter."));
return 1;
}
if(!function_exists("learn_language", this_player()))
{
write("The sage says: I am sorry, my " +
((this_player()->query_gender() == "male") ? "son" :
"daughter") + ", but I cannot teach you in your current body.");
return 1;
}
if((sscanf(str, "%s for %s", lang, timestr) != 2) || (lang == "") ||
(timestr == "") || !(nmtimespan = convert_time(timestr)))
{
write("Study which language for how long?");
return 1;
}
lang = lower_case(lang);
if(nmtimespan <= 0)
{
write("The sage shakes his head at you in disgust.");
return 1;
}
if(nmtimespan > DAY)
{
write("You decide that you will get hungry and bored long before then.");
return 1;
}
if(!able_to_study(SEC_TO_EXP * nmtimespan))
{
write("The sage says: I am sorry, my " +
((this_player()->query_gender() == "male") ? "son" :
"daughter") + ", but you are not experienced enough to study "
"for that long.");
return 1;
}
write("You begin studying " + capitalize(lang) + ". You must stay here and"
" study until your time has ended in order to learn the langauge.");
queue[this_player()] = ({ lang, (SEC_TO_EXP * nmtimespan) });
call_out("advance_em", nmtimespan, this_player());
//if(member_array(lang, (LANG_D->all_languages())) == -1)
//{
// write("The sage says: " + capitalize(lang) + " is an uncommon language. "
// "If you did not mean to study it, then you should leave now, my " +
// ((this_player()->query_gender() == "male") ? "son." :
// "daughter."));
// return 1;
//}
return 1;
}
int leave_the_room()
{
if(queue[this_player()])
{
write("You decide to quit studying and go do other things.");
map_delete(queue, this_player());
clean_call_outs(this_player());
}
return 1;
}
void advance_em(mixed arg)
{
object ob;
string lang;
int exp;
ob = (object)arg;
if(!ob || (environment(ob) != this_object()))
{
if(ob)
if(queue[ob])
map_delete(queue,ob);
return;
}
if(!queue[ob])
return;
lang = queue[ob][0];
exp = queue[ob][1];
ob->add_exp(-exp);
ob->learn_language(lang, exp);
write("You are done studying " + capitalize(lang) + ".");
map_delete(queue, ob);
}