Start Info Community Spielen
 
 

Morgengrauner Dokumentation

Dateipfad: /home/mud/mudlib/doc//lfun/AddCmd

AddCmd()
********


FUNKTION
========

   varargs void AddCmd(mixed cmd, mixed func, [mixed flag, [mixed
   id]]);


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

   /std/thing/commands.c


ARGUMENTE
=========

   cmd
      Verben, auf die reagiert werden soll

      ODER

      Regel mit Triggerverb und noetigen Keywords/Synonymen

   func
      Funktionsname im selben Objekt oder Closure (Funktionspointer)

   flag (optional)
      Unscharfe Ausfuehrung == 1

      ODER

      Fehlermeldungen bei Nutzung von Regeln

   id (optional)
      eine ID, ueber die das Kommando eindeutig wieder geloescht
      werden kann


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

   Wenn ein Spieler im Einflussbereich des Objektes das Verb benutzt,
   wird die entsprechende Funktion im Objekt aufgerufen:

   * die Verben sollten Imperative sein

   * die Funktion muss 1 fuer ERFOLG (und FPs!) und 0 sonst
     zurueckgeben (sonst werden evtl. weitere Funktionen mit diesem
     Kommandoverb gerufen)

   * innerhalb der Funktionen koennen Fehlermeldungen fuer den totalen
     Misserfolg des Kommandos mit notify_fail gesetzt werden (anstatt
     "Wie bitte?")

   AddCmd ist ein dynamischer Ersatz fuer add_action - im Gegensatz zu
   add_action koennen auch ohne erneuten Aufruf der init() neue
   Kommandos hinzugefuegt werden.

   AddCmd kann das Leben einfacher machen mit:

   ### REGELN: ###

   Bei komplexen Syntaxen kann ein String angegeben werden, der die
   _notwendigen_ (nicht die erlaubten!) Schluesselworte und deren
   zulaessige Synonyme beschreibt. Damit kann man sich einen grossen
   Teil eigener Auswertung ersparen.

   Nur wenn in richtiger Reihenfolge aus JEDER der durch & getrennten
   Synonymgruppen ein Wort im Spielerkommando enthalten ist, wird die
   zugehoerige Funktion ausgefuehrt.

   Trenner sind: | fuer Alternativen
      & fuer Konjunktionen

   Beispiel:
     "ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&"
     "herz|herzchen&rinde|baumrinde"
   wuerde z.B. durch
     "ritz mit dem Messer ein Herz in die Rinde des Baumes"
     "schnitz mit Messer Herzchen Baumrinde"
     "schnitz mit meinem Messer Herzchen in die harte Baumrinde"
   erfuellt werden.


   Spezialregelteile sind:

   * @PRESENT: entspricht einem Objekt in Inv oder Env des Spielers
   * @ID:      entspricht der ID des kommandobesitzenden Objektes
               (wo die Kommandomethode definiert ist, ist noch unwichtig)
   * @PUT_GET_DROP, @PUT_GET_TAKE, @PUT_GET_NONE:
               entsprechend den Filteroptionen fuer find_obs()
   ACHTUNG: Zusaetzliche Ziffern in Verbindung mit den @-Spezialregeln
            sind schlecht. @-Regeln versuchen gierig, Objekte exakt im
            Inventory zu matchen ("objekt 3" anstatt "objekt") und miss-
            interpretieren daher zB die 4 in "stopf objekt 3 in loch 4" als
            Teil des Objekt-ID-Strings.
            Interna: 3 Substrings fuer @PRESENT/@ID ("gruener kristall 2")
                     5 fuer @PUT... ("kristall 2 in beutel 3")

   ### FEHLERMELDUNGEN (bei Anwendung von Regeln): ###

   Als dritter Parameter koennen auch Fehlermeldungen fuer jeweils
   fehlende Synonymgruppen (ausser der ersten - den Kommandoverben)
   angegeben werden. Sie werden in derselben Reihenfolge (!) wie die
   Synonymgruppen angegeben.

   Mit nicht von Spielern erfuellbaren Regeln und ^-Fehlermeldungen
   kann man auch ohne Ausfuehrung einer Funktion Texte an Spieler
   und Umgebung ausgeben. Siehe dazu AddCmd_bsp.

   Trenner sind: | zum Trennen der einzelnen Fehlermeldungen
                 ^ um
                    - die Auswertung (ab dieser Fehlermeldung!) mit
                      "return 1;" zu beenden und
                    - eine write^say-Meldung zu trennen und
                    - (fuer funktionslose AddCmd auch FPs zu vergeben!)

   Beispielfehlermeldungen fuer obige Regel:
     "Womit willst Du schnitzen?|Was willst Du schnitzen?|"
     "Wohinein willst Du das schnitzen?"

   Es koennen in den Fehlermeldungen folgende Platzhalter benutzt
   werden:

   * @verb (ersetzt durch query_verb() ohne beendendes 'e')
   * @VERB (ersetzt durch capitalize(query_verb()) ohne beendendes 'e')
   * @WERx, @WESSENx, @WEMx, @WENx: siehe alles aus replace_personal()
     * @WE..1 ist immer der aktive Spieler
     * alle folgenden sind die matchenden Parameter der Spielereingabe
       * (x-1)<=Fehlermeldung (da x=1 Spieler und
                               (x-1)>Fehlermeldungsobjekt nicht existent)

   Ausfuehrungsbeispiel:
     AddCmd("ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&"
            "herz|herzchen&rinde|baumrinde",#'fun,
           "Willst Du mit etwas @verben?|Womit willst du @verben?|"
           "Was willst du mit dem @WEM3 @verben?|"
           "Wohinein willst Du das @WEN4 schnitzen?");
     1. "ritze" == "Willst Du mit etwas ritzen?"
     2. "schnitz mit" == "Womit willst du schnitzen?"
     3. "ritz mit messer" == "Was willst du mit dem messer ritzen?"
     4. "ritze mit dem messer ein herz" ==
          "Wohinein willst Du das herz schnitzen?"
     5. "ritze mit dem messer ein herzchen in die baumrinde"
          == Erfolg!

   ### UNSCHARFER AUSFUEHRUNG: ###

   Bei unscharfer Ausfuehrung wird die zugehoerige Methode auch dann
   ausgefuehrt, wenn das verwendete Verb ein Superstring ist und
   bisher noch nicht behandelt wurde.
   Dieses Verhalten sollte nur beim generellen Abfangen von
   Befehlsgruppen benutzt werden und ist ansonsten veraltet. Es
   entsprich add_action("fun","kommando",1).


   Beispiel:
     1. AddCmd("klett","fun",1);
     2. AddCmd("kletter|klettere&hoch",#'fun2,"Wohin klettern?");

     a) "klett"
     b) "kletter"
     c) "klettere hoch"

     Ausgefuehrte Funktion bei: 1a, 1b, 1c; 2c
     (1 wuerde also immer ausgefuehrt)
     Fehlermeldung bei: 2b ("Wohin klettern?")


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

   * Methoden der put_and_get (nimm/nehme) sollten so nicht versucht
     werden zu ueberschreiben - dazu sind invis Container da

   * benutzt man fuer  eine Closure, kann man die Fkt. auch
     protected oder private deklarieren _und_ sie kann in einem
     anderen Objekt sein

   * bei Regeln wird an die ggf. gerufene Methode als zweiter
     Parameter ein Array der erfuellenden Eingabeteile uebergeben:
     "steck&@PRESENT&in&loch" bei Erfuellung ->
     ({,"in","loch})

     ** bei Nutzung von @PUT_GET_XXX koennen die Parameter wiederum
        Arrays sein ("jede Hose" -> mehrere gueltige Objekte)

   * juengere AddCmd ueberschreiben aeltere, bzw. werden vor diesen
     ausgewertet

   * @PUT_GET_XXX kosten sehr viel Auswertungszeit


BEISPIELE (SIEHE AUCH ADDCMD_BSP):
==================================


// SIMPEL: ganz simpel, beinahe wie add_action AddCmd("befiehl","action_befehlen"); ... int action_befehlen(string str) { if(!str || !strlen(str)) // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt notify_fail("Was willst du befehlen?!\n"); else { write("Du befiehlst \""+str+"\", und alle folgen!\n"); say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n"); return 1; // ERFOLG - Abbruch der Kommandoauswertung } return 0; // MISSERFOLG - Fehlermeldung oben gesetzt }

// SIMPEL .. weitere Beispiele AddCmd(({"kletter","klettere"}),"action_klettern" ); AddCmd(({"renn","renne"}),#'action_rennen);

// REGELN: eine komplexere Regel AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke", "action_loeschen", "Was willst du loeschen?|Womit willst du loeschen?");

// REGELN: mit Platzhaltern im Fehlerstring AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche", #'action_huepfe, "Willst du von etwas @verben?|Von wo willst du @verben?");

// SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein (!) AddCmd("kletter","fun_klettern",1);

// FALSCH: sehr schlecht, kein Imperativ verwendet // ausserdem sollte man fuer solche Syntaxen AddReadDetail benutzen AddCmd("lese","eval_lesen");

// SIMPLE REGEL OHNE METHODE // mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine // Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler // unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit // dem ^ (write-Flag) versehen und entsprechend an den Spieler // (und den Raum (hinter dem ^)) ausgegeben AddCmd("spring|springe&herunter|runter&\n\bimpossible",0, "Wohin oder wovon willst Du springen?|" "Du springst vom Baum und kommst hart auf.^" "@WER1 springt vom Baum und kommt hart auf.");



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

AddCmd_bsp, RemoveCmd(L), init(E) Fehlermeldungen: notify_fail(E), _notify_fail(E) Argumentstring: query_verb(E), _unparsed_args(L) Sonstiges: replace_personal(E), enable_commands(E) Alternativen: AddAction(L), add_action(E)

30. Aug 2013 Gloinson


zurück zur Übersicht

YOUTUBE | FACEBOOK | TWITTER | DISCORD | FEEDBACK | IMPRESSUM | DATENSCHUTZ 1992–2023 © MorgenGrauen.