
AddInfo()
*********


FUNKTION
========

   varargs void AddInfo( frage, meldung
      [, indent [, [silent [, casebased] ] ] );


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

   /std/npc/info.c


ARGUMENTE
=========

   string/string* frage
      Schluesseltext(e) auf die Informationen gegeben werden sollen.

   string/closure meldung
      Information, die gegeben werden soll/Closure Bekommt nichts
      uebergeben.

   string indent
      Text, der sich bei mehrzeiligen Meldungen wiederholen soll.

   int/string silent
      Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.

   string/closure casebased
      Closure mit Returnwert string oder int. Bekommt nichts
      uebergeben.


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

   Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
   nach einer Information mit dem Schluessel 'frage' fragt, so wird
   die entsprechende 'meldung' ausgegeben (oder die Closure in
   'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
   Meldung wird der Name des Monsters vorangestellt.

   Frage:
      Schluessel muessen kleingeschrieben sein, koennen aber
      Leerzeichen enthalten.

   Meldung:
      Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
      umbrechen.

   Indent:
      Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
      Monsternamen noch das 'indent' vorangesetzt. Ein typisches
      indent ist "sagt: ".

   Silent:
      Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
      Raum, ist 'silent' ein String, so wird jener an alle anderen
      Spieler ausser dem Fragesteller im Raum ausgegeben.

   Casebased:
      Die als Closure angegebene Methode entscheidet, ob oder wie der
      NPC auf diese Frage antworten soll:

      # return 0:    normale Antwort mit "meldung"

      # return 1:    keine Antwort/Antwort mit DEFAULT_NOINFO

      # return string: Antwort mit string unter Beruecksichtigung
      eines indent

   Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
   koennen die @[...]-Tags von replace_personal() verwendet werden,
   Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
   automatisch gross geschrieben. AddInfo() konvertiert die alten
   Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
   replace_personal(), jedoch nicht in den Rueckgabe- werten von
   Closures.

   Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
   Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
   etwas fragt, auf das keine Antwort vorgegeben ist (das loest
   SetProp(P_DEFAULT_INFO, <text>) ab).


BEISPIELE
=========

   Siehe auch: /doc/beispiele/AddInfo/

   // Beispiel 1: ### eine Standardantwort setzen ###
   AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
   // identisch zu
   // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");

   // Beispiel 2: einfache Beispiele, auch mit casebased
   AddInfo(({"knete","kohle"}),
       "sagt: ich habe so etwas nicht.\n");
   AddInfo("geld",
       "Ich habe zwar kein Geld, aber [...] blablabla [...]",
       "sagt: ");
   AddInfo("muenzen",
       "fluestert: Du willst Geld?",
       0,
       "fluestert @WEM etwas zu.");

   // "frage monster nach geld": alle im Raum hoeren
   //  Das Monster sagt: Ich habe zwar kein Geld, aber [...]
   //  Das Monster sagt: [...] blablabla [...]

   // "frage monster nach muenzen":
   // - der Fragensteller hoert:
   //   "Das Monster fluestert: Du willst Geld?"
   // - alle andere hoeren:
   //   "Das Monster fluestert <Fragenstellernamen> etwas zu."

   // Beispiel 3: dynamisch
   // ein Prototyp, damit wir die Methode bekannt machen
   protected string query_kekse();

   AddInfo(({"keks","kekse"}),
       #'query_kekse,        // ein Verweis auf die Funktion
       "sagt: ");

   protected string query_kekse() {
     if(present("keks", this_object()))
       return("Ich hab noch welche. Aetsch!");
     else if(present("keks", environment()))
       return("Da liegt einer!");
     return("Menno. Keine mehr da!");
   }
   // "frage monster nach keks":
   // - wenn es noch Kekse hat, hoeren alle:
   //   "Das Monster sagt: Ich hab noch welche. Aetsch!
   // - sonst:
   //   "Das Monster sagt: "Menno. Keine mehr da!

   // Beispiel 4: dynamischer
   // ein Prototyp, damit wir die Methode bekannt machen
   protected string query_kekse();
   protected mixed case_fighting();

   AddInfo(({"keks","kekse"}),
       #'query_kekse,"        // ein Verweis auf die Funktion
       sagt: ",
       0,                     // nicht silent :)
       #'case_fighting);      // noch ein Funktionsverweis

   protected string query_kekse() {
     if(present("keks"))
       return("Ich hab noch welche. Aetsch!");
     return("Menno. Keine mehr da!");
   }

   protected mixed case_fighting() {
     if(InFight())
       return("Keine Zeit fuer Kekse. Muss kaempfen.");
     return 0;
   }

   // "frage monster nach keks":
   // - wenn es kaempft, hoeren alle:
   //   "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
   // - sonst, wenn es noch Kekse hat, hoeren alle:
   //   "Das Monster sagt: Ich hab noch welche. Aetsch!
   // - sonst:
   //   "Das Monster sagt: "Menno. Keine mehr da!

   // Beispiel 5: ### dynamisch und komplex ###
   // ein Prototyp, damit wir die Methode bekannt machen
   protected string question_gold();

   // "gold" wird eine Closure auf die Methode question_gold()
   // zugewiesen, ausserdem soll es still bleiben (wir informieren
   // den Restraum selbst)
   AddInfo("gold", #'question_gold, "murmelt: ", 1);

   // los gehts, wir generieren unsere Antwort selbst
   protected string question_gold() {
     // wieviel Kohle hat der Spieler
     int money = this_player()->QueryMoney();
     string *y = map(deep_inventory(this_player()),
                   function string(object o) {
                     if(o->QueryMaterial(MAT_GOLD)>0 &&
                        strstr(object_name(o),"/items/money")<0 &&
                        o->QueryProp(P_NAME))
                       return o->name(WER,1);
                   })-({0});

     // das geht an alle anderen im Raum, silent bietet sich hier
     // nicht an, weil es mehrere Moeglichkeiten gibt
     send_room(environment(),
       (Name(WER,1)+" murmelt "+
        this_player()->name(WEM,1)+
        " etwas zu"+
        ((money || sizeof(y))?
          " und glotzt "+this_player()->QueryPronoun(WEN)+" gierig an.":
          ".")),
       MT_LOOK|MT_LISTEN,
       MA_EMOTE, 0, ({this_player()}));

     // und hier die Antwort an den Spieler selbst, mit vielen
     // Verzweigungen fuer dessen Besitztum
     return("Ich hab kein Gold bei mir."+
       ((money || sizeof(y))?
         " Aber du "+
         (money?
           "hast ja jede Menge Kohle bei dir, so etwa "+money+
           " Muenzen."+
           (sizeof(y)?
             " Ausserdem "+
             ((sizeof(y)==1)?"ist":"sind")+
             " auch noch "+CountUp(y)+" aus Gold.":
             ""):
           (sizeof(y)?"hast ja ein paar Wertsachen dabei: "+
           CountUp(y)+
           (sizeof(y)==1?" ist":" sind")+
           " aus Gold.":"")):
         ""));
   }

   // "frage monster nach gold"
   // - der Fragesteller hoert zB:
   //   Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
   //   Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
   //   Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
   //   Das Monster murmelt: und <object2> aus Gold."
   // - die Umstehenden hoeren:
   //   "Das Monster murmelt @WEM etwas zu."
   //   oder
   //   "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."


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

   Verwandt:
      *AddSpecialInfo()*, *RemoveInfo()*

   Props:
      *P_PRE_INFO*

   Files:
      /std/npc/info.c

   Loggen:
      *P_LOG_INFO*

   Interna:
      *GetInfoArr()* , *do_frage()*

7. Mar 2017 Gloinson
