
QueryArticle()
**************


FUNKTION
========

   varargs string QueryArticle(int casus, int dem, int force);


DEFINIERT IN
============

   /std/thing/language.c


ARGUMENTE
=========

   casus
        Der Fall, in dem der Artikel gewuenscht wird.
        (Konstanten aus /sys/thing/language.h: WER, WEM, WESSEN, WEN.)

   dem
        Wird ein bestimmter oder ein unbestimmter Artikel verlangt?
           + dem = 0: Unbestimmter Artikel!
           + dem = 1: Bestimmter Artikel!
           + dem = 2: Finde selbst heraus, welcher Artikel passt!

   force
        Falls ungleich Null, so wird auf jeden Fall ein Artikel
        zurueckgegeben, trotz P_ARTICLE == 0.


BESCHREIBUNG
============

   Diese Funktion gibt einen zum Geschlecht des Objektes passenden Artikel
   zurueck, der in den passenden Fall dekliniert wird.

   Das Herausfinden des passenden Artikels bei 'dem' = 2 bezieht sich auf
   Situationen, in denen mehrere gleichnamige Objekte im selben Environment
   sind. Man 'nimmt' dann z.B. nicht "den Stamm" sondern "einen Stamm".

   Ist P_ARTICLE = 0, so wird ein Leerstring zurueckgegeben, es sei denn,
   man uebergibt in dem Argument 'force' einen Wert ungleich Null.


BEMERKUNGEN
===========

   Achtung: bei gueltigem Artikel wird ein Leerzeichen angehaengt!

   Name()/name() nutzen bereits QueryArticle(), wenn P_ARTICLE gesetzt
   ist. Deshalb muss man sich "Eines Orks" nicht selbst aus dem
   QueryArticle() und dem Namen zusammenbasteln, wenn mehrere Orks
   im Raum herumstehen und man eine Nachricht wie:
     "Du haust den Ork." und folgend
     "[Des|Eines] Orks Nase schwillt an."
   haben moechte:
     "Du haust "+ork->name(WEN, 1)+". "
     ork->Name(WESSEN, 2)+" Nase schwillt an."


RUeCKGABEWERT
=============

   * gewuenschter Artikel als String plus Leerzeichen (!) ODER
   * Leerstring


BEISPIELE
=========

   // "X haut Y auf die Nase. [Der|Die|Das] ist nicht beeindruckt."
   // Man will:
   // * auf jeden Fall einen Artikel, auch wenn kein P_ARTICLE gesetzt ist
   // * nur den bestimmten Artikel
   send_room(this_object(),
     pl1->Name(WER)+" haut "+pl2->name(WEM)+" auf die Nase. "+
     capitalize(pl2->QueryArticle(WER, 1, 1))+"ist nicht beeindruckt.",
     MT_LOOK|MT_LISTEN, 0, 0, ({pl1, pl2}));

   // "X gibt Dir Y. [Er|Sie|Es] prueft [den|die|das] ..."
   // Man will:
   // * auf jeden Fall einen Artikel, auch wenn kein P_ARTICLE gesetzt ist
   // * nur den bestimmten Artikel
   send_room(this_object(),
     pl1->Name(WER)+" gibt "+pl2->name(WEM)+" "+obj->name(WER)+". "+
     capitalize(pl2->QueryPronoun(WER))+" prueft "+
     ob->QueryArticle(WEN, 1, 1)+"...",
     MT_LOOK|MT_LISTEN, 0, 0, ({pl1, pl2}));

   // "Dir faellt X auf den Kopf. Du siehst [die|den|das|eine|einen|eines "
   // "auf dem Boden liegen. [Sie|Er|Es] sieht blutig aus. Aua. Ist das "
   // "von dir?"
   // Man will:
   // * auf jeden Fall einen Artikel, auch wenn kein P_ARTICLE gesetzt ist
   // * bestimmte/unbestimmte Artikel, wenn bereits gleiche Gegenstaende
   //   (zB Kokosnuesse) auf dem Boden liegen ...
   ob->move(environment(), M_PUT); // vorher machen!
   pl->ReceiveMsg(
     "Dir faellt "+ob->name(WER, 0)+" auf den Kopf. Du siehst "+
     ob->QueryArticle(WEN, 2, 1)+" auf dem Boden liegen. "+
     capitalize(ob->QueryPronoun(WER))+" sieht blutig ...


SIEHE AUCH
==========

   Aehnlich:  SuggestArticle(), query_c_article(), query_g_suffix()
   Sonstiges: QueryOwn(), QueryDu(),
              QueryPronoun(), QueryPossPronoun()
              DeclAdj()
              name()

9. Jun 2016, Gloinson
