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