/* /lib/languages.c
* from the Dead Souls LPC Library
* language module for linguistic people
* created by Descartes of Borg 950412
*/
#include <function.h>
class comprehension {
function check;
int time;
function end;
}
private mapping Languages = ([]);
private static class comprehension Comprehension = 0;
// abstract methods
int GetHeartRate();
int GetStatLevel(string stat);
// end abstract methods
int GetNextLevel(string lang, int curr_level);
varargs static void SetLanguage(string lang, int level, int native) {
string key;
key = convert_name(lang);
if( !Languages[key] ) Languages[key] = ([]);
Languages[key] = ([ "name" : lang, "points" : 0, "level" : level,
"native" : native ]);
}
mapping RemoveLanguage(string lang) {
lang = convert_name(lang);
map_delete(Languages, lang);
return Languages;
}
varargs void SetLanguageComprehension(function check, int time, function end) {
if( !check ) {
Comprehension = 0;
}
else {
Comprehension = new(class comprehension);
Comprehension->check = check;
Comprehension->time = time;
Comprehension->end = end;
}
}
int GetLanguageLevel(string lang) {
if( Comprehension ) {
int fp = functionp(Comprehension->check);
if( fp && !(fp & FP_OWNER_DESTED) ) {
return evaluate(Comprehension->check, this_object(), lang);
}
}
lang = convert_name(lang);
if( !Languages[lang] ) return 0;
else return Languages[lang]["level"];
}
string GetLanguageName(string lang) {
lang = convert_name(lang);
if( !Languages[lang] ) return 0;
else return Languages[lang]["name"];
}
int AddLanguagePoints(string lang, int points) {
string key;
int y;
key = convert_name(lang);
if( !Languages[key] ) SetLanguage(lang, 0, 0);
Languages[key]["points"] += points;
while( Languages[key]["points"] >
(y = GetNextLevel(key, Languages[key]["level"])) ) {
Languages[key]["points"] -= y;
Languages[key]["level"]++;
}
while( Languages[key]["points"] < 0 ) {
y = GetNextLevel(key, Languages[key]["level"] - 1);
Languages[key]["points"] = y + Languages[key]["points"];
Languages[key]["level"]--;
}
return Languages[key]["points"];
}
int GetLanguagePoints(string lang) {
lang = convert_name(lang);
if( !Languages[lang] ) return 0;
else return Languages[lang]["points"];
}
string array GetLanguages() {
return map(keys(Languages), (: Languages[$1]["name"] :));
}
int GetNextLevel(string lang, int curr_level) {
int y;
lang = lower_case(lang);
if( !Languages[lang] ) return 0;
y = (1 + Languages[lang]["native"]) * GetStatLevel("intelligence");
y = (2000 * curr_level) / y;
return y;
}
int GetStatLevel(string stat) { return 0; }
string GetNativeLanguage() {
mapping val;
string lang;
foreach(lang, val in Languages)
if( val["native"] ) return Languages[lang]["name"];
}
static void heart_beat() {
if( Comprehension ) {
Comprehension->time -= GetHeartRate();
if( Comprehension->time < 1 ) {
function tmp = Comprehension->end;
Comprehension = 0;
if( functionp(tmp) && !(functionp(tmp) & FP_OWNER_DESTED) ) {
evaluate(tmp, this_object());
}
}
}
}