// File : /adm/daemons/language.c // Creator : Megadeath@TMI-2 // Version : 1.7 // // language daemon, handles the languages and translation. // Written by Megadeath@TMI-2 // // Fixed prototype for get_mapping 94-11-10 Leto@Earth #include <language.h> string *l_list; mapping l_mapp; void set_lists(); mapping get_mapping(); string transform_string (string str, string language) ; string garble_string (string str, string language) ; string *transform_array (string *chunks) ; // This function will shake out some nice signs in the text such as // , . ! ? etc.. string get_signs (string str); // This nifty little function is used if ya wanna check the capitalizing // of a word. int check_capitalizing (string str); string get_string ( string what, object who, string language, int success, string garbled_string, string garbled_lang ) { int t ; mapping lang_mapp; lang_mapp=who->query("languages"); if (!lang_mapp) lang_mapp = get_mapping(); if (lang_mapp[language] > 0) { if (success) { // Let's check and see if the listener understood the speech. if (random(100) < lang_mapp[language]) if (language!="common") return " in " + capitalize(language) + ": " + what ; return ": "+what ; // Oops, I guess he didn't... return " in " + capitalize(language) + ": " + garbled_string ; } // In this case the speaker failed, so we send out the tripe. return " in " + capitalize(language) + ": " + garbled_string ; } // OOps.. seems that this bloke don't know the language. Well.. lets // transform the string into a serie of strange sounds. ;) return " in some strange tongue: " + garbled_lang ; } string transform_string (string str, string language) { string *chunks, lfile; int loop, i; chunks=explode(str, " "); chunks=transform_array(chunks); lfile = "/adm/daemons/languages/" + language + ".c"; return (string)lfile->garble(chunks) ; } // This is called when we didn't succeeded to speak well. ;) // Remember, this can be done nicer. Like transforming the words or // shifting the order and such. string garble_string (string str, string language) { int t, left, rest ; string *chunks, actual_string; chunks=explode(str, " "); chunks=transform_array(chunks) ; left=sizeof(chunks) ; rest = random(sizeof(chunks)) ; if ( ! left ) left = 1; actual_string=""; while (left -- ) { int a; string chunk; if (! rest || (rest && random(101)<50 )) { a=random(sizeof(chunks)); actual_string+=" " + chunks[a]; chunk = chunks[a] ; chunks -= ({ chunk }) ; if (! sizeof(chunks)) break; } else { string dstring, lfile; lfile = "adm/daemons/languages/" + language + ".c"; dstring = (string)lfile->garble( ({ "dummy" }) ); actual_string += " " + dstring; rest -- ; } } return actual_string; } // Now we wanna check if there are any nice non-alphabetical characters // in the string string get_signs ( string str ) { string junk; if ( ! str ) return "" ; if (sscanf(str,"%s.",junk ) || str == "." ) return "."; if (sscanf(str,"%s,",junk ) || str == "," ) return ","; if (sscanf(str,"%s!",junk ) || str == "!" ) return "!"; if (sscanf(str,"%s:",junk ) || str == ":" ) return ":"; if (sscanf(str,"%s;",junk ) || str == ";" ) return ";"; if (sscanf(str,"%s?",junk ) || str == "?" ) return "?"; if (sscanf(str,"%s'",junk ) || str == "'" ) return "'"; return ""; } int check_capitalizing ( string str ) { string capstr; if (! str ) return 0; capstr=capitalize(str); if ( str[0] > capstr[0] ) return 0; return 1; } string *transform_array (string *chunks) { string *chunk2; int loop, i; chunk2=allocate(sizeof(chunks)) ; loop = sizeof(chunks); // this may be a bit cludgy but without it, the daemon crashes // due to the strange behaviour from explode when you deal with // stuff like " ". while ( loop-- ) { if ( chunks[loop] ) { chunk2[i]=chunks[loop]; i++; } else break; } return chunk2 ; } void set_lists() { int t; string *chunks; chunks = get_dir("/adm/daemons/language/"); l_mapp = ([]); l_list = allocate(sizeof(chunks)); for (t=0;t<sizeof(chunks);t++) { sscanf(chunks[t], "%s.c", l_list[t]); l_mapp += ([ l_list[t] : LANGUAGE_DEFAULT_SCORE ]); } } string *get_list() { if (!l_list) set_lists(); return l_list; } mapping get_mapping() { if (!l_mapp) set_lists(); return l_mapp; }