| AddCmd(L) |
| 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 <function> 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 -> ({<Objekt>,"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 |