// MorgenGrauen MUDlib
//
// thing/language.c -- language handling object
//
// $Id: language.c 8359 2013-02-09 11:43:39Z Zesstra $

#pragma strict_types
#pragma save_types
#pragma range_check
#pragma no_clone

#include <thing/language.h>
#include <thing/description.h>

#define NEED_PROTOTYPES
#include <thing/properties.h>

// Kein create()
void create()
{
  return;
}

//Inversion, damit Defaultwert von 0 einen Artikel ausgibt
static int _query_article() { return !Query(P_ARTICLE); }

static int _set_article(int art) { return !Set(P_ARTICLE,!art); }

// Bestimmten Artikel bestimmen
private string query_c_article(int casus)
{
  if (QueryProp(P_PLURAL))
    return ({ "die ", "der ", "den ", "die "})[casus];

  return ({ ({ "das ", "des ", "dem ", "das " }),
            ({ "der ", "des ", "dem ", "den " }),
            ({ "die ", "der ", "der ", "die " }) })
    [({int})QueryProp(P_GENDER)][casus];
}

// Ende fuer Artikel und Adjektive
private varargs string query_g_suffix(int gen, int casus, int anzahl)
{
  return ({ ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({  "","e"}) }),
	    ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
	    ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({ "e","e"}) }) })
    [gen][casus][anzahl];
}

// Artikel vorschlagen: gibt es noch mehr Objekte im inv?
protected varargs int SuggestArticle(string id)
{
  object ob,*obs;

  // Raum oder Master: Bestimmt.
  if (!environment()) return 1;

  // Keine id? Dann raus
  if (!id) return 1;

  // Objekt mit gleichem Namen im env? Dann unbestimmt
  for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
    if ( ob!=this_object()
         && id == ({string})ob->Name(RAW) )
      return 0;

  // sonst bestimmt
  return 1;
}

// Artikel bestimmen
public varargs string QueryArticle(int casus, int dem, int force)
{
  // Kein Artikel
  if (!force &&!(QueryProp(P_ARTICLE))) return "";

  // Artikelart aussuchen
  if ( dem==2 ) dem = SuggestArticle(QueryProp(P_NAME));

  // Bestimmter Artikel
  if (dem) return query_c_article(casus);

  // Unbestimmter Artikel
  if (QueryProp(P_PLURAL)) return "";
  
  return sprintf("ein%s ",query_g_suffix(({int})QueryProp(P_GENDER),casus));
}

// Besitzanzeiger fuer Objekt bestimmen
varargs string QueryOwn(int casus)
{
  return sprintf("Dein%s",query_g_suffix(QueryProp(P_GENDER),casus));
}

// Possessivpronomen bestimmen
public varargs string QueryPossPronoun(int|object what, int casus, int number)
{
  int gen2;

  // Geschlecht ermitteln
  gen2 = (objectp(what)?({int})what->QueryProp(P_GENDER):what);

  // Plural ist schoen einfach
  if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);

  return ((((({int})QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
          query_g_suffix(gen2%3, casus, number));
}

// Pronomen bestimmen nach KNG
public varargs string QueryPronoun(int casus)
{
  int gender;

  // Plural ist immer einfach ...
  if (QueryProp(P_PLURAL)) 
  {
     if (casus==WEM) return "ihnen";
     return "sie";
  }

  switch(QueryProp(P_GENDER))
  {
    case FEMALE:
      if (casus==WESSEN) return "ihrer";
      if (casus==WEM) return "ihr";
      return "sie";

    case MALE:
      if (casus==WER) return "er";
      if (casus==WESSEN) return "seiner";
      if (casus==WEM) return "ihm";
      return "ihn";
  }    
  if (casus==WESSEN) return "seiner";
  if (casus==WEM) return "ihm";
  return "es"; //fall-through
}

// Anrede fuer Spieler bestimmen
public varargs string QueryDu(int casus,int gender,int zahl)
{
  return
    ({ ({({    "du",   "ihr"}),({    "du",   "ihr"}),({    "du",   "ihr"})}),
       ({({"deiner",  "euer"}),({"deiner",  "euer"}),({"deiner",  "euer"})}),
       ({({   "dir",  "euch"}),({   "dir",  "euch"}),({   "dir",  "euch"})}),
       ({({  "dich",  "euch"}),({  "dich",  "euch"}),({  "dich",  "euch"})})
     })[casus][gender][zahl];
}

// Welches Geschlecht hat das Objekt als String?
public string QueryGenderString()
{
  switch( ({int})QueryProp( P_GENDER ))
  {
    case MALE:   return "maennlich";
    case FEMALE: return "weiblich";
  }
  return("saechlich"); //fall-through
}

// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
// des Artikels (demon==bestimmt)
public varargs string DeclAdj(string|string* adj, int casus, int demon)
{
	// Unregelmaessige Adjektive
	if( pointerp(adj) ) return adj[casus]+" ";

  // Falscher Typ? Und Tschuess ...
  if (!stringp(adj)) return "";

  // Plural ist einfach
  if (QueryProp(P_PLURAL))
  {
    // Bestimmt
    if (demon) return adj+"en ";

    // Unbestimmt
    return adj + ({ "e ", "er ", "en ", "e " })[casus];
  }
  
  if ( demon )
    return adj + ({ ({ "e " , "en ", "en ", "e "  }),
		    ({ "e " , "en ", "en ", "en " }),
		    ({ "e " , "en ", "en ", "e "  }) })
      [({int})QueryProp( P_GENDER )][casus];
  else
    return adj + ({ ({ "es ", "en ", "en ", "es " }),
		    ({ "er ", "en ", "en ", "en " }),
		    ({ "e " , "en ", "en ", "e "  }) })
      [({int})QueryProp( P_GENDER )][casus];
}

// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
static int _set_gender(int i)
{
  if (i>-1&&i<3) return Set(P_GENDER,i);
  return Query(P_GENDER);
}
