//  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;
}