MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | AddCmd(L) |
| 2 | FUNKTION: |
| 3 | varargs void AddCmd(mixed cmd, mixed func, [mixed flag, [mixed id]]); |
| 4 | |
| 5 | DEFINIERT IN: |
| 6 | /std/thing/commands.c |
| 7 | |
| 8 | ARGUMENTE: |
| 9 | cmd |
| 10 | Verben, auf die reagiert werden soll |
| 11 | ODER |
| 12 | Regel mit Triggerverb und noetigen Keywords/Synonymen |
| 13 | func |
| 14 | Funktionsname im selben Objekt oder Closure (Funktionspointer) |
| 15 | flag (optional) |
| 16 | Unscharfe Ausfuehrung == 1 |
| 17 | ODER |
| 18 | Fehlermeldungen bei Nutzung von Regeln |
| 19 | id (optional) |
| 20 | eine ID, ueber die das Kommando eindeutig wieder geloescht |
| 21 | werden kann |
| 22 | |
| 23 | BESCHREIBUNG: |
| 24 | Wenn ein Spieler im Einflussbereich des Objektes das Verb benutzt, |
| 25 | wird die entsprechende Funktion im Objekt aufgerufen: |
| 26 | - die Verben sollten Imperative sein |
| 27 | - die Funktion muss 1 fuer ERFOLG (und FPs!) und 0 sonst zurueckgeben |
| 28 | (sonst werden evtl. weitere Funktionen mit diesem Kommandoverb gerufen) |
| 29 | - innerhalb der Funktionen koennen Fehlermeldungen fuer den totalen |
| 30 | Misserfolg des Kommandos mit notify_fail gesetzt werden |
| 31 | (anstatt "Wie bitte?") |
| 32 | |
| 33 | AddCmd ist ein dynamischer Ersatz fuer add_action - im Gegensatz |
| 34 | zu add_action koennen auch ohne erneuten Aufruf der init() neue |
| 35 | Kommandos hinzugefuegt werden. |
| 36 | |
| 37 | AddCmd kann das Leben einfacher machen mit: |
| 38 | ### REGELN: ### |
| 39 | Bei komplexen Syntaxen kann ein String angegeben werden, der die |
| 40 | _notwendigen_ (nicht die erlaubten!) Schluesselworte und deren |
| 41 | zulaessige Synonyme beschreibt. Damit kann man sich einen grossen |
| 42 | Teil eigener Auswertung ersparen. |
| 43 | |
| 44 | Nur wenn in richtiger Reihenfolge aus JEDER der durch & getrennten |
| 45 | Synonymgruppen ein Wort im Spielerkommando enthalten ist, wird |
| 46 | die zugehoerige Funktion ausgefuehrt. |
| 47 | |
| 48 | Trenner sind: | fuer Alternativen |
| 49 | & fuer Konjunktionen |
| 50 | |
| 51 | Beispiel: |
| 52 | "ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&" |
| 53 | "herz|herzchen&rinde|baumrinde" |
| 54 | wuerde z.B. durch |
| 55 | "ritz mit dem Messer ein Herz in die Rinde des Baumes" |
| 56 | "schnitz mit Messer Herzchen Baumrinde" |
| 57 | "schnitz mit meinem Messer Herzchen in die harte Baumrinde" |
| 58 | erfuellt werden. |
| 59 | |
| 60 | Spezialregelteile sind: |
| 61 | - @PRESENT: entspricht einem Objekt in Inv oder Env des Spielers |
| 62 | - @ID: entspricht der ID des kommandobesitzenden Objektes |
| 63 | (wo die Kommandomethode definiert ist, ist noch unwichtig) |
| 64 | - @PUT_GET_DROP, @PUT_GET_TAKE, @PUT_GET_NONE: |
| 65 | entsprechend den Filteroptionen fuer find_obs() |
| 66 | ACHTUNG: Zusaetzliche Ziffern in Verbindung mit den @-Spezialregeln |
| 67 | sind schlecht. @-Regeln versuchen gierig, Objekte exakt im |
| 68 | Inventory zu matchen ("objekt 3" anstatt "objekt") und miss- |
| 69 | interpretieren daher zB die 4 in "stopf objekt 3 in loch 4" als |
| 70 | Teil des Objekt-ID-Strings. |
| 71 | Interna: 3 Substrings fuer @PRESENT/@ID ("gruener kristall 2") |
| 72 | 5 fuer @PUT... ("kristall 2 in beutel 3") |
| 73 | |
| 74 | ### FEHLERMELDUNGEN (bei Anwendung von Regeln): ### |
| 75 | Als dritter Parameter koennen auch Fehlermeldungen fuer jeweils |
| 76 | fehlende Synonymgruppen (ausser der ersten - den Kommandoverben) |
| 77 | angegeben werden. Sie werden in derselben Reihenfolge (!) wie die |
| 78 | Synonymgruppen angegeben. |
| 79 | |
| 80 | Mit nicht von Spielern erfuellbaren Regeln und ^-Fehlermeldungen |
| 81 | kann man auch ohne Ausfuehrung einer Funktion Texte an Spieler |
| 82 | und Umgebung ausgeben. Siehe dazu AddCmd_bsp. |
| 83 | |
| 84 | Trenner sind: | zum Trennen der einzelnen Fehlermeldungen |
| 85 | ^ um |
| 86 | - die Auswertung (ab dieser Fehlermeldung!) mit |
| 87 | "return 1;" zu beenden und |
| 88 | - eine write^say-Meldung zu trennen und |
| 89 | - (fuer funktionslose AddCmd auch FPs zu vergeben!) |
| 90 | |
| 91 | Beispielfehlermeldungen fuer obige Regel: |
| 92 | "Womit willst Du schnitzen?|Was willst Du schnitzen?|" |
| 93 | "Wohinein willst Du das schnitzen?" |
| 94 | |
| 95 | Es koennen in den Fehlermeldungen folgende Platzhalter benutzt |
| 96 | werden: |
| 97 | - @verb (ersetzt durch query_verb() ohne beendendes 'e') |
| 98 | - @VERB (ersetzt durch capitalize(query_verb()) ohne beendendes 'e') |
| 99 | - @WERx, @WESSENx, @WEMx, @WENx: siehe alles aus replace_personal() |
| 100 | - @WE..1 ist immer der aktive Spieler |
| 101 | - alle folgenden sind die matchenden Parameter der Spielereingabe |
| 102 | - (x-1)<=Fehlermeldung (da x=1 Spieler und |
| 103 | (x-1)>Fehlermeldungsobjekt nicht existent) |
| 104 | |
| 105 | Ausfuehrungsbeispiel: |
| 106 | AddCmd("ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&" |
| 107 | "herz|herzchen&rinde|baumrinde",#'fun, |
| 108 | "Willst Du mit etwas @verben?|Womit willst du @verben?|" |
| 109 | "Was willst du mit dem @WEM3 @verben?|" |
| 110 | "Wohinein willst Du das @WEN4 schnitzen?"); |
| 111 | 1. "ritze" == "Willst Du mit etwas ritzen?" |
| 112 | 2. "schnitz mit" == "Womit willst du schnitzen?" |
| 113 | 3. "ritz mit messer" == "Was willst du mit dem messer ritzen?" |
| 114 | 4. "ritze mit dem messer ein herz" == |
| 115 | "Wohinein willst Du das herz schnitzen?" |
| 116 | 5. "ritze mit dem messer ein herzchen in die baumrinde" |
| 117 | == Erfolg! |
| 118 | |
| 119 | ### UNSCHARFER AUSFUEHRUNG: ### |
| 120 | Bei unscharfer Ausfuehrung wird die zugehoerige Methode auch dann |
| 121 | ausgefuehrt, wenn das verwendete Verb ein Superstring ist und |
| 122 | bisher noch nicht behandelt wurde. |
| 123 | Dieses Verhalten sollte nur beim generellen Abfangen von |
| 124 | Befehlsgruppen benutzt werden und ist ansonsten veraltet. Es |
| 125 | entsprich add_action("fun","kommando",1). |
| 126 | |
| 127 | |
| 128 | Beispiel: |
| 129 | 1. AddCmd("klett","fun",1); |
| 130 | 2. AddCmd("kletter|klettere&hoch",#'fun2,"Wohin klettern?"); |
| 131 | |
| 132 | a) "klett" |
| 133 | b) "kletter" |
| 134 | c) "klettere hoch" |
| 135 | |
| 136 | Ausgefuehrte Funktion bei: 1a, 1b, 1c; 2c |
| 137 | (1 wuerde also immer ausgefuehrt) |
| 138 | Fehlermeldung bei: 2b ("Wohin klettern?") |
| 139 | |
| 140 | BEMERKUNGEN: |
| 141 | - Methoden der put_and_get (nimm/nehme) sollten so nicht versucht |
| 142 | werden zu ueberschreiben - dazu sind invis Container da |
| 143 | - benutzt man fuer <function> eine Closure, kann man die Fkt. auch |
| 144 | protected oder private deklarieren _und_ sie kann in einem |
| 145 | anderen Objekt sein |
| 146 | - bei Regeln wird an die ggf. gerufene Methode als zweiter Parameter |
| 147 | ein Array der erfuellenden Eingabeteile uebergeben: |
| 148 | "steck&@PRESENT&in&loch" bei Erfuellung -> ({<Objekt>,"in","loch}) |
| 149 | - bei Nutzung von @PUT_GET_XXX koennen die Parameter wiederum |
| 150 | Arrays sein ("jede Hose" -> mehrere gueltige Objekte) |
| 151 | - juengere AddCmd ueberschreiben aeltere, bzw. werden vor diesen |
| 152 | ausgewertet |
| 153 | - @PUT_GET_XXX kosten sehr viel Auswertungszeit |
| 154 | |
| 155 | BEISPIELE (SIEHE AUCH ADDCMD_BSP): |
| 156 | // SIMPEL: ganz simpel, beinahe wie add_action |
| 157 | AddCmd("befiehl","action_befehlen"); |
| 158 | ... |
| 159 | int action_befehlen(string str) { |
| 160 | if(!str || !strlen(str)) |
| 161 | // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt |
| 162 | notify_fail("Was willst du befehlen?!\n"); |
| 163 | else { |
| 164 | write("Du befiehlst \""+str+"\", und alle folgen!\n"); |
| 165 | say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n"); |
| 166 | return 1; // ERFOLG - Abbruch der Kommandoauswertung |
| 167 | } |
| 168 | return 0; // MISSERFOLG - Fehlermeldung oben gesetzt |
| 169 | } |
| 170 | |
| 171 | // SIMPEL .. weitere Beispiele |
| 172 | AddCmd(({"kletter","klettere"}),"action_klettern" ); |
| 173 | AddCmd(({"renn","renne"}),#'action_rennen); |
| 174 | |
| 175 | // REGELN: eine komplexere Regel |
| 176 | AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke", |
| 177 | "action_loeschen", |
| 178 | "Was willst du loeschen?|Womit willst du loeschen?"); |
| 179 | |
| 180 | // REGELN: mit Platzhaltern im Fehlerstring |
| 181 | AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche", |
| 182 | #'action_huepfe, |
| 183 | "Willst du von etwas @verben?|Von wo willst du @verben?"); |
| 184 | |
| 185 | // SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein (!) |
| 186 | AddCmd("kletter","fun_klettern",1); |
| 187 | |
| 188 | // FALSCH: sehr schlecht, kein Imperativ verwendet |
| 189 | // ausserdem sollte man fuer solche Syntaxen AddReadDetail benutzen |
| 190 | AddCmd("lese","eval_lesen"); |
| 191 | |
| 192 | // SIMPLE REGEL OHNE METHODE |
| 193 | // mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine |
| 194 | // Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler |
| 195 | // unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit |
| 196 | // dem ^ (write-Flag) versehen und entsprechend an den Spieler |
| 197 | // (und den Raum (hinter dem ^)) ausgegeben |
| 198 | AddCmd("spring|springe&herunter|runter&\n\bimpossible",0, |
| 199 | "Wohin oder wovon willst Du springen?|" |
| 200 | "Du springst vom Baum und kommst hart auf.^" |
| 201 | "@WER1 springt vom Baum und kommt hart auf."); |
| 202 | |
| 203 | SIEHE AUCH: |
| 204 | AddCmd_bsp, RemoveCmd(L), init(E) |
| 205 | Fehlermeldungen: notify_fail(E), _notify_fail(E) |
| 206 | Argumentstring: query_verb(E), _unparsed_args(L) |
| 207 | Sonstiges: replace_personal(E), enable_commands(E) |
| 208 | Alternativen: AddAction(L), add_action(E) |
| 209 | |
| 210 | 30. Aug 2013 Gloinson |