
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
   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.


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. Zusaetzlich wird
    'meldung' auf jeden Fall sauber umgebrochen.
    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().

   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
=========

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

   ### 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?\n",
           0,
           "fluestert @WEM etwas zu.\n");

   // "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."

   ### dynamisch ###
   // ein Prototyp, damit wir die Methode bekannt machen
   static string query_kekse();
   ...
   AddInfo(({"keks","kekse"}),
           #'query_kekse,             // ein Verweis auf die Funktion
           "sagt: ");
   ...
   static string query_kekse() {
    if(present("keks"))
     return("Ich hab noch welche. Aetsch!");
    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!

   ### dynamischer ###
   // ein Prototyp, damit wir die Methode bekannt machen
   static string query_kekse();
   static mixed case_fighting();
   ...
   AddInfo(({"keks","kekse"}),
           #'query_kekse,"            // ein Verweis auf die Funktion
           sagt: ",
           0,                         // nicht silent :)
           #'case_fighting);          // noch ein Funktionsverweis
   ...
   static string query_kekse() {
    if(present("keks"))
     return("Ich hab noch welche. Aetsch!");
    return("Menno. Keine mehr da!");
   }

   static 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!


   ### dynamisch und komplex ###
   // ein Prototyp, damit wir die Methode bekannt machen
   static 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
   static string question_gold() {
    int money;
    string *y, objstr;
    object o;
    // wieviel Kohle hat der Spieler
    money=this_player()->QueryMoney();
    y=allocate(0);
    // und jetzt suchen wir die Dinge aus Gold
    o=first_inventory(this_player());
    while(o) {
     if(o->QueryMaterial(MAT_GOLD)>0 &&
        strstr(object_name(o),"/obj/money"))
      y+=({o->name(WER,1)});
     o=next_inventory(o);
    }

    // das geht an alle anderen im Raum, silent bietet sich hier
    // nicht an, weil es mehrere Moeglichkeiten gibt
    say(break_string(
     Name(WER,1)+" murmelt "+
     this_player()->name(WEM,1)+
     " etwas zu"+
     ((money || sizeof(y))?
      " und glotzt "+
      this_player()->QueryPronoun(WEN)+" gierig an.":
      "."),78),({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)?" Aber was du so bei dir hast: "+
           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(L), RemoveInfo(L)
   Props:     P_PRE_INFO, P_DEFAULT_INFO
   Files:     /std/npc/info.c
   Loggen:    P_LOG_INFO
   Interna:   GetInfoArr, do_frage

7.Apr 2004 Gloinson
