Uebergabe Schluesselphrase an dyn. Infos

Closures fuer Infos und casebased werden die von der
Spielerin gefragten Schluesselphrasen uebergeben, um
generische Funktionenn fuer Infos zu ermoeglichen.

Change-Id: I31147d023df9641644800914f37dc1f81db30e45
diff --git a/doc/sphinx/lfun/AddInfo.rst b/doc/sphinx/lfun/AddInfo.rst
index 8b5914a..533a581 100644
--- a/doc/sphinx/lfun/AddInfo.rst
+++ b/doc/sphinx/lfun/AddInfo.rst
@@ -17,12 +17,13 @@
 ---------
 
      string|string* frage
-       Schluesselwoerter, fuer die der NPC eine Antwort geben soll, wenn
+       Schluesselphrase(n), fuer die der NPC eine Antwort geben soll, wenn
        man ihn danach fragt
 
      string|closure meldung
-       Information, die gegeben werden soll; wenn 'meldung' eine Closure 
-       ist, wird der gerufenen Funktion nichts uebergeben.
+       Information, die gegeben werden soll; wenn 'meldung' eine
+       Closure ist, wird der gerufenen Funktion die vom Spieler gefragte
+       Schluesselphrase uebergeben.
 
      string indent    (optional)
        Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
@@ -31,8 +32,8 @@
        Ist silent gesetzt, so erfolgt Antwort nur an Fragenden. 
 
      string|closure casebased   (optional)
-       Closure mit Returnwert string oder int.
-       Der Funktion werden keine Argumente uebergeben.
+       Closure mit Returnwert string oder int. Der Funktion wird die vom
+       Spieler gefragte Schluesselphrase uebergeben.
 
 BESCHREIBUNG
 ------------
@@ -44,8 +45,8 @@
      der Name des Monsters vorangestellt.
 
      Frage:
-      Schluessel muessen kleingeschrieben sein, koennen aber Leerzeichen
-      enthalten.
+      Schluesselphrasen muessen kleingeschrieben sein, koennen aber
+      Leerzeichen enthalten.
 
      Meldung:
       Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
@@ -124,13 +125,13 @@
 
      // Beispiel 3: dynamisch
      // ein Prototyp, damit wir die Methode bekannt machen
-     protected string query_kekse();
+     protected string query_kekse(string key);
 
      AddInfo(({"keks","kekse"}),
          #'query_kekse,        // ein Verweis auf die Funktion
          "sagt: ");
 
-     protected string query_kekse() {
+     protected string query_kekse(string key) {
        if(present("keks", this_object()))
          return("Ich hab noch welche. Aetsch!");
        else if(present("keks", environment()))
@@ -147,8 +148,8 @@
 
      // Beispiel 4: dynamischer
      // ein Prototyp, damit wir die Methode bekannt machen
-     protected string query_kekse();
-     protected mixed case_fighting();
+     protected string query_kekse(string key);
+     protected mixed case_fighting(string key);
      
      AddInfo(({"keks","kekse"}),
          #'query_kekse,"        // ein Verweis auf die Funktion
@@ -156,13 +157,13 @@
          0,                     // nicht silent :)
          #'case_fighting);      // noch ein Funktionsverweis
 
-     protected string query_kekse() {
+     protected string query_kekse(string key) {
        if(present("keks"))
          return("Ich hab noch welche. Aetsch!");
        return("Menno. Keine mehr da!");
      }
 
-     protected mixed case_fighting() {
+     protected mixed case_fighting(string key) {
        if(InFight())
          return("Keine Zeit fuer Kekse. Muss kaempfen.");
        return 0;
@@ -180,7 +181,7 @@
 
      // Beispiel 5: ### dynamisch und komplex ###
      // ein Prototyp, damit wir die Methode bekannt machen
-     protected string question_gold();
+     protected string question_gold(string key);
 
      // "gold" wird eine Closure auf die Methode question_gold()
      // zugewiesen, ausserdem soll es still bleiben (wir informieren
@@ -188,7 +189,7 @@
      AddInfo("gold", #'question_gold, "murmelt: ", 1);
 
      // los gehts, wir generieren unsere Antwort selbst
-     protected string question_gold() {
+     protected string question_gold(string key) {
        // wieviel Kohle hat der Spieler
        int money = this_player()->QueryMoney();
        string* valuables = ({});
@@ -265,4 +266,4 @@
      Interna:
        :doc:`GetInfoArr` , :doc:`do_frage`
 
-24.09.2020, Arathorn
+09.08.2021, Zesstra
diff --git a/doc/sphinx/lfun/AddSpecialInfo.rst b/doc/sphinx/lfun/AddSpecialInfo.rst
index fd67141..d8ca7c2 100644
--- a/doc/sphinx/lfun/AddSpecialInfo.rst
+++ b/doc/sphinx/lfun/AddSpecialInfo.rst
@@ -14,13 +14,13 @@
 ::
 
      string|string* frage
-       Schluesselwoerter, fuer die der NPC eine Antwort geben soll, wenn
+       Schluesselphrase(n), fuer die der NPC eine Antwort geben soll, wenn
        man ihn danach fragt
 
      string functionname
        Name der Funktion, die gerufen werden soll, um den Informationstext
-       des NPCs zu ermitteln. Der gerufenen Funktion werden keine Argumente
-       uebergeben.
+       des NPCs zu ermitteln. Der gerufenen Funktion wird die vom Spieler
+       gefragte Schluesselphrase uebergeben.
 
      string indent    (optional)
        Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
@@ -29,8 +29,8 @@
        Ist silent gesetzt, so erfolgt Antwort nur an Fragenden. 
 
      string|closure casebased   (optional)
-       Closure mit Returnwert string oder int.
-       Der Funktion werden keine Argumente uebergeben.
+       Closure mit Returnwert string oder int. Der Funktion wird die vom
+       Spieler gefragte Schluesselphrase uebergeben.
 
 DEFINIERT IN
 ------------
@@ -69,13 +69,13 @@
 		    "query_kekse",	// der Methodenname
 		    "sagt: ");
      // ist uebrigens das gleiche wie:
-     // static string query_kekse();
+     // static string query_kekse(string key);
      // ...
      // AddInfo(({"keks","kekse"}),
      //		#'query_kekse,		// ein Verweis auf die Methode
      //		"sagt: ");
      ...
-     static string query_kekse() {
+     static string query_kekse(string key) {
       if(present("keks"))
        return("Ich hab noch welche. Aetsch!");
       return("Menno. Keine mehr da!");
@@ -101,5 +101,4 @@
      Interna:
        :doc:`GetInfoArr` , :doc:`do_frage`
 
-24.09.2020, Arathorn
-
+09.08.2021, Zesstra
diff --git a/std/npc/info.c b/std/npc/info.c
index 160aa69..cba2985 100644
--- a/std/npc/info.c
+++ b/std/npc/info.c
@@ -215,7 +215,7 @@
   }
 
   if (closurep(info[0]) ) {
-    answer=funcall(info[0]);
+    answer=funcall(info[0], text);
     if( !answer || answer=="") return 1;
   } else {
     answer=process_string(info[0]);
@@ -223,13 +223,13 @@
 
   if (closurep(info[3]) )
    {
-    noanswer=funcall(info[3]);
+    noanswer=funcall(info[3], text);
     if ( intp(noanswer) && noanswer > 0)
      {
        text = DEFAULT_NOINFO;
        info = GetInfoArr(text);
        if (closurep(info[0]) ) {
-         answer=funcall(info[0]);
+         answer=funcall(info[0], text);
          if( !answer || answer=="") return 1;
        } else {
          answer=process_string(info[0]);