AddToMenu()

FUNKTION:
        varargs string AddToMenu(string  menuetext,
                                 mixed   ids,
                                 mapping minfo,
                                 mixed   rate,
                                 mixed   msg,
                                 mixed   refresh,
                                 mixed   delay,
                                 mixed   d_msg);

DEFINIERT IN:
        /std/pub.c

ARGUMENTE:
        Die Erlaeuterung der Parameter beschraenkt sich im Folgenden
        zunaechst auf die Grundfunktionalitaet bei Verwendung fester
        Werte. Die Moeglichkeiten zur Realisierung dynamischen Verhaltens
        sind in den Fussnoten zu den einzelnen Parametern beschrieben.

        menuetext
          Der Text steht als kurze Beschreibung im Menue.
        ids
          String oder Array von Strings, mit denen sich die Speise bzw. das
          Getraenk beim Bestellen ansprechen laesst.
        minfo
          Mapping mit Eintraegen fuer:
          P_HP      LP-Heilung in Punkten [*]
          P_SP      KP-Heilung in Punkten [*]
          P_FOOD    Saettigungswirkung der Speise [*]
          P_DRINK   Saettigungswirkung des Getraenks [*]
          P_ALCOHOL Alkoholgehalt des Getraenks [*]
          P_VALUE   Preis der Speise bzw. des Getraenks [*]
        rate [*]
          Heilrate in Punkten pro HeartBeat.
        msg [**]
          Meldung beim Essen:
          Array mit 2 Strings: (1) fuer Empfaenger, (2) fuer Andere.
          Verfuegbare Platzhalter sind weiter unten im Abschnitt "Beispiel"
          dokumentiert.
        refresh
          Mapping mit Eintraegen fuer:
            PR_USER (Kontingent fuer einzelnen Spieler) [*]
            PR_ALL  (Zusatzkontingent fuer alle) [*]
          Alternativ: 0 fuer unbegrenzte Verfuegbarkeit
          Einem Key muessen dabei zwei Werte zugeordnet werden:
          Der Erste gibt die Hoehe des Kontingents an, der Zweite legt
          fest, alle wieviel reset()s das Kontingent wieder aufgefuellt
          wird.
          Verwendung des Mappings erfordert Inkludieren von pub.h.
        delay [*]
          Zahl der Sekunden, um die verzoegert die Heilung eintritt,
          z.B. weil das Essen erst zubereitet werden muss.
        d_msg [**]
          Meldung beim Bestellen, falls die Heilung verzoegert wird
          Array mit 2 Strings: (1) fuer Empfaenger, (2) fuer Andere.

          
        [*] Dieser Parameter kann statt eines festen Zahlenwerts mit 
            folgenden Werten gefuellt werden:

            1) Mapping <racemodifier> der Form:
                   ([ 0 : <standardwert> ,
                    <rasse_1> : <wert_1>, 
                    ... , 
                    <rasse_n> : <wert_n> ]).
               Die Eintraege in diesem Mapping werden gegen die Rasse des
               bestellenden Spielers geprueft und entsprechend die 
               zugehoerigen Werte verwendet.
            2) string <func>: Aufruf erfolgt mittels 
                 call_other(this_object(), func, empfaenger);
               gerufen (aber: siehe Hinweise).
            3) closure <func>: Aufruf erfolgt mittels
                 funcall(func, empfaenger);
            4) Array der Form  ({string <obj>, string <func>}) oder
                               ({object <obj>, string <func>})
               Aufruf erfolgt mittels
                 call_other(obj, func, empfaenger);
               (aber: siehe Hinweise). <obj> ist folglich als Objektpointer 
               oder dessen object_name() anzugeben. <func> wird mittels 
               function_exists() auf Existenz ueberprueft.

               HINWEISE: im Falle von Lieferverzoegerung ("delay") und
               Preis (P_VALUE) wird bei allen Funktionsaufrufen NICHT der 
               Empfaenger, sondern der Zahler uebergeben.
               Im Falle der Kontingent-Liste ("refresh") kann nur die
               verfuegbare Menge modifiziert werden, nicht die Zeit
               bis zum Wieder-Auffuellen.

        [**] Zur Erzeugung variabler Meldungen koennen folgende Werte
             eingetragen werden:

             1) closure <func>: Aufruf erfolgt mittels 
                  funcall(func, zahler, empfaenger, ident, minfo);
             2) string <func>: Aufruf erfolgt mittels
                  call_other(this_object(), func, zahler, empfaenger, 
                             ident, minfo);
             <func> bekommt Zahler und Empfaenger als Objektpointer,
             ident als String und minfo als Mapping mit den 
             jeweiligen Heilwerten uebergeben. minfo entspricht hierbei
             den Daten, die als dritter Parameter an AddToMenu()
             uebergeben wurden.
             HINWEIS: wenn in das minfo-Mapping keine int-Festwerte 
             eingetragen wurden, werden diese gemaess den Regeln unter [*]
             geprueft; Funktionen/Closures werden ggf. ausgewertet und 
             deren Rueckgabewerte an die Funktion <func> uebergeben.
             WICHTIG: Die Rueckgabewerte der Funktion werden nicht 
             ausgewertet. Jeder, der anstatt einer Meldung einen 
             Funktionsaufruf programmiert, muss fuer die Ausgabe der
             Meldungen selbst sorgen.
                   
BESCHREIBUNG:
        Mit dieser Funktion werden Speisen oder Getraenke in die Karte
        von Kneipen und Restaurants eingefuegt.

RUECKGABEWERT:
        Rueckgabewert ist ein String "menuentry%d", wobei %d eine Nummer
        ist, die darueber Auskunft gibt, den wievielten Eintrag in die
        interne Karte der Kneipe diese Speise bzw. dieses Getraenk
        darstellt. Im Prinzip handelt es sich bei dem String um einen Key
        fuer ein Mapping, in dem die Speisen bzw. Getraenke gespeichert
        sind.

BEMERKUNGEN:
        Die aelteren Funktionen 'AddDrink' bzw. 'AddFood' werden zwar mithilfe
        dieser maechtigeren Funktion aus Gruenden der Abwaertskompatibilitaet
        simuliert, sollen aber nicht mehr eingesetzt werden.
        
        Fuer das Testen der Kneipe gibt es in jeder Kneipe den Befehl
        'pubinit'. Hiermit lassen sich die Speisen und Getraenke durch-
        checken. Steht in der Ausgabe bei einem Getraenk/Essen ein FAIL,
        so wird die entsprechende Speise (oder Getraenk) NICHT an Spieler
        verkauft. Ausnahmen fuer Speisen/Getraenke mit hoeheren maximalen
        Werten sind durch Balance-EM zu genehmigen.

BEISPIEL:

        include <pub.h>

        create()
        {
        AddToMenu("'Opa's Drachenkeule'",({"drachenkeule","keule"}),
        ([P_HP:63,P_SP:63,P_FOOD:9,P_VALUE:528]), 5,
        ({"Du isst die Keule mit einem schlechten Gewissen.",
          "&& isst die Keule mit einem schlechten Gewissen."}),
        ([ PR_USER : 4; 1 , PR_ALL : 20; 3 ]), 9,
        ({"Der unsichtbare Kneipier schneidet einem Rentner ein grosses "
          "Stueck aus dessen Keule und bereitet sie Dir zu. Komisch, muss "
          "wohl ein Tippfehler auf der Karte gewesen sein.",
          "Der unsichtbare Kneipier schneidet einem hilflosen Opa ein "
          "Stueck aus dessen Keule und braet diese fuer &&."}) );
        }

        1) Name der Speise (des Getraenks) auf der Karte (bei menue).

           AddToMenu("'Opa's Drachenkeule'",     

        2) ids mit denen sich bestellen laesst (z.B. "kaufe keule").

           ({"drachen","drachenkeule","keule"}),

        3) Heilung fuer LP und KP, Saettigung (P_FOOD oder P_DRINK,
           P_ALCOHOL nach Belieben setzen), Preis (P_VALUE). 
           HP und SP muessen nicht gleich sein. Speisen und Getraenke,
           die nur eines von beiden heilen, sind auch moeglich.

           ([P_HP:63,P_SP:63,P_FOOD:9,P_VALUE:528]),

        4) Heilung pro Heartbeat (in diesem Beispiel je 5 KP/LP).
    
           5,

        5) Meldungen fuer Spieler und Umstehende die bei Genuss ausgege-
           ben werden (also NICHT der Bestell-Text).

           ({"Du isst die Keule mit einem schlechten Gewissen.",
             "&& isst die Keule mit einem schlechten Gewissen."}),

           Verfuegbare Platzhalter sind (pl = this_player()):

           &&  - pl->name(WER,2)
           &1& - pl->name(WER,2)
           &2& - pl->name(WESSEN,2)
           &3& - pl->name(WEM,2)
           &4& - pl->name(WEN,2)
           &1# - capitalize(pl->name(WER,2))
           &2# - capitalize(pl->name(WESSEN,2))
           &3# - capitalize(pl->name(WEM,2))
           &4# - capitalize(pl->name(WEN,2))
           &!  - pl->QueryPronoun(WER)
           &5& - pl->QueryPronoun(WE);
           &6& - pl->QueryPronoun(WESSEN)
           &7& - pl->QueryPronoun(WEM)
           &8& - pl->QueryPronoun(WEN)
           &5# - capitalize(pl->QueryPronoun(WER))
           &6# - capitalize(pl->QueryPronoun(WESSEN))
           &7# - capitalize(pl->QueryPronoun(WEM))
           &8# - capitalize(pl->QueryPronoun(WEN))
          
        6) Die Speise ist in ihrer Anzahl begrenzt. Fuer jeden Spieler
           sind 4 Keulen pro reset() da. Ausserdem gibt es noch einen
           "Notvorrat" von 20 Keulen, der alle 3 reset()s aufgefuellt
           wird. Aus diesem (so noch vorhanden) werden die Spieler
           versorgt, wenn ihr "persoenlicher Vorrat" aufgebraucht ist.

           ([ PR_USER : 4; 1 , PR_ALL : 20; 3 ]),
           
           HINWEIS: bei Benutzung des Mappings muss <pub.h> inkludiert 
           werden!
           
           Wenn man keine reset-abhaengigen Speisen haben moechte, traegt
           man hier eine 0 ein.

        7) Die Zahl ist die Wartezeit in Sekunden, die der Wirt z.B. fuer
           die Zubereitung und Auslieferung an den Spieler braucht.

           9,
         
        8) Letztendlich die Meldungen an Spieler und Umstehende, die bei Be-
           stellung (hier 'kaufe keule') ausgegeben werden.

           ({"Der unsichtbare Kneipier schneidet einem Rentner ein grosses "
           "Stueck aus dessen Keule und bereitet sie Dir zu. Komisch, muss "
           "wohl ein Tippfehler auf der Karte gewesen sein.",
           "Der unsichtbare Kneipier schneidet einem hilflosen Opa ein "
           "Stueck aus dessen Keule und braet diese fuer &&."}));

SIEHE AUCH:
        AddFood(), AddDrink(), /sys/pub.h
        RemoveFromMenu()
----------------------------------------------------------------------------
Last modified: Sam, 01. Okt 2011, 23:40 by Arathorn
