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