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