MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | RM - HOWTO |
| 2 | ********** |
| 3 | |
| 4 | Vorlaeufiges Inhaltsverzeichnis: |
| 5 | |
| 6 | 1) Allgemeines |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 7 | - Konzepte fuer neue Gebiete |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 8 | - Fehlerteufel |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 9 | - Kommentierung von Aenderungen |
| 10 | - eigene Anschluesse |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 11 | - "Datenhygiene" im Regionsverzeichnis |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 12 | 2) Abnahme von Code/Gebieten |
| 13 | - Balance/Genehmigungen |
| 14 | - Konzeptionelle Eignung |
| 15 | - formale Pruefung |
| 16 | - Gemeinschaftsarbeiten |
| 17 | 3) Verlegung von Dateien |
| 18 | 4) Seherhaeuser |
| 19 | - Sonderwuensche/Unsichtbarkeit |
| 20 | - anderer Befehl zum Betreten |
| 21 | - Verweise auf Beispielcode |
| 22 | 5) Debuggen von Code |
| 23 | 6) besondere Funktionen/Funktionaelitaeten |
| 24 | - catch_tell() / ReceiveMsg() |
| 25 | - move() |
| 26 | - Attack() / Defend() |
| 27 | - call_out() |
| 28 | - remove() / destruct() |
| 29 | - for()-Schleifen |
| 30 | - write_file() |
| 31 | - Verwalten von charakterbezogenen Daten |
| 32 | |
| 33 | 1) Allgemeines |
| 34 | ============== |
| 35 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 36 | 1a) Konzepte und Dokumentation |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 37 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 38 | o Die Erfahrung zeigt, dass es aus verschiedenen Gruenden wirklich dringend |
| 39 | zu empfehlen ist, sich fuer neue Gebiete ein Konzept vorlegen zu lassen, |
| 40 | dieses gruendlich zu pruefen und zu durchdenken und mit dem betreffenden |
| 41 | Regionsmitarbeiter zu diskutieren. Weiterhin empfiehlt es sich ebenfalls, |
| 42 | eine ueber das Konzept erzielte Einigung im Verzeichnis "doc" Deiner |
| 43 | Region zu dokumentieren. Hierdurch erreichst Du mehrere Dinge: |
| 44 | - Du vermeidest Ueberraschungen ("Hier ist mein neues Gebiet zur Abnahme, |
| 45 | sind nur 120 Raeume. Oh, hoppla, hab ich Dir nicht Bescheid gesagt?"); |
| 46 | auch fuer Deine etwaigen Nachfolger. |
| 47 | - Du vermeidest bei absehbaren technischen Schwierigkeiten Frustration |
| 48 | beim Deinem Regionsmitarbeiter. |
| 49 | - Du erhoehst die Wahrscheinlichkeit, dass das Gebiet tatsaechlich |
| 50 | fertiggestellt wird. |
| 51 | - Jeder kann weitgehend verbindlich nachlesen, was Du genehmigt hast. |
| 52 | - Es ist klar ersichtlich, welche Konzepte bekanntermassen schon in Arbeit |
| 53 | sind, so dass inhaltliche Aehnlichkeiten im Vorfeld vermieden werden |
| 54 | koennen. |
| 55 | |
| 56 | Du solltest den betreffenden Regionsmitarbeiter auch darauf hinweisen, |
| 57 | dass er Dich informieren moege, wenn er eine groessere konzeptionelle |
| 58 | Umstellung des neuen Gebietes durchfuehren will. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 59 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 60 | Welche Kriterien man als RM ansetzt, um ein Gebiet als regionstauglich |
| 61 | zu bewerten, liegt in der Entscheidung des RM. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 62 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 63 | o Wenn ein Konzept fuer ein Gesellenstueck eingereicht wird, und es handelt |
| 64 | sich um eine Gemeinschaftsarbeit mehrerer Magier (Kooperation mehrerer |
| 65 | Lehrlinge oder Lehrling(e) + erfahrene Magier), UEBERLEGT EUCH GUT, OB |
| 66 | IHR DAS ZULASSEN WOLLT! Erfahrungsgemaess laesst sich schwer beurteilen, |
| 67 | welcher Teil des Codes von wem ist. Wenn es zugelassen wird, sollten mit |
| 68 | den betreffenden Lehrlingen klare Vereinbarungen insbesondere ueber die |
| 69 | Trennung des Codes nach Autor getroffen werden. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 70 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 71 | 1b) Fehlerteufel / Abarbeitung von Bugs |
| 72 | |
| 73 | o Um stets einen Ueberblick ueber die in Deiner Region (hoffentlich selten) |
| 74 | auftretenden Bugs und Warnungen zu behalten, solltest Du einen |
| 75 | Fehlerteufel (/obj/tools/fehlerteufel.c) besitzen, bedienen koennen und |
| 76 | regelmaessig dessen Listen durchsehen. Deinen Regionsmitarbeitern solltest |
| 77 | Du, allein schon, um zusaetzliche Arbeit fuer Dich selbst zu reduzieren, |
| 78 | dieses Werkzeug ebenfalls an die Hand geben und sie auffordern, ihren |
| 79 | Kram moeglichst umfassend selbst zu reparieren. |
| 80 | Neuen Magiern wird dieses Tool uebrigens automatisch von Merlin in die |
| 81 | Hand gedrueckt, so dass sie sich vom ersten Tag an daran gewoehnen |
| 82 | koennen. |
| 83 | |
| 84 | o Wenn Du in fremdem Code Aenderungen vornehmen musst, die mehr beruehren |
| 85 | als nur ein paar Tippfehler in Details oder Infos, dann fuege den |
| 86 | reparierten Code mit Kommentar ein. Wenn in Deiner Region git/gerrit zur |
| 87 | Codeverwaltung verwendet werden, schreibe eine aussagekraeftige Commit- |
| 88 | Message, bei Bedarf ergaenzt durch einen Kommentar im Code. |
| 89 | |
| 90 | 1c) Anschluss eigener Gebiete in der eigenen Region |
| 91 | |
| 92 | o Willst Du in Deiner eigenen Region ein Gebiet anschliessen, solltest Du |
| 93 | diesen vor Anschluss entweder vom Co-RM oder von einem RM einer anderen |
| 94 | Region lesen lassen. Auch wenn Du ein guter Programmierer bist, findet ein |
| 95 | zweites Paar Augen oft Dinge, an die man nicht gedacht hat. |
| 96 | |
| 97 | 1d) "Hygiene" in den Regionsverzeichnissen |
| 98 | |
| 99 | o Wenn Du nicht angeschlossene Objekte aus Deiner Region aussortieren |
Arathorn | ee7ec86 | 2020-12-01 23:57:24 +0100 | [diff] [blame] | 100 | moechtest, sprich am besten einen EM an, der Dir dabei hilft: |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 101 | Einerseits kann man auf der Shell bequemer herausfinden, ob ein Objekt |
| 102 | tatsaechlich nicht verwendet wird. Andererseits soll der ungenutzte |
| 103 | Code in das /players-Verzeichnis des Autors verschoben werden, was |
| 104 | haeufig ebenfalls EM-Rechte benoetigt. |
| 105 | |
| 106 | o Es wird dringend empfohlen, neuen Regionscode nur noch in /players zu |
| 107 | entwickeln. |
| 108 | |
| 109 | o Als Regionsmagier hast Du aufgrund eines EM-Beschlusses die Moeglichkeit, |
| 110 | fuer Deine jeweilige(n) Region(en) verbindlich festzulegen, ob es erlaubt |
| 111 | ist, die Entwicklung neuer Gebiete im Regionsverzeichnis durchzufuehren. |
| 112 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 113 | |
| 114 | 2) Code wird zur Abnahme vorgelegt |
| 115 | ================================== |
| 116 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 117 | o Bei Waffen und Ruestungen unbedingt darauf achten, dass Objekte, die die |
| 118 | Genehmigungsgrenzen ueberschreiten, bei der Balance zur Genehmigung |
| 119 | vorgestellt wurden. Fuer alle Objekte mit Balance-relevanten Eigenschaften |
| 120 | bitte penibel darauf achten, dass die Balance-Vorgaben eingehalten werden. |
| 121 | Jeder Magier kann sich ein Balance-Tool "light" clonen, mit dem er den Text |
| 122 | der Genehmigung selbst anschauen kann, um den vorgelegten Code damit zu |
| 123 | vergleichen. Nicht genehmigte oder in der Funktion abweichende Objekte |
| 124 | duerfen nicht angeschlossen werden. (Bei schon sehr lange angeschlossenen |
| 125 | Objekten, deren Abweichung von der Genehmigung erst sehr spaet auffaellt, |
| 126 | kann man ggf. auf das temporaere Abhaengen verzichten.) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 127 | |
| 128 | o Sofern ein Objekt eine Balance-Genehmigung besitzt, muss die BTOP-Nummer, |
| 129 | die die Balance als eindeutige ID fuer jeden Antrag vergibt, im Header |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 130 | des betreffenden Objektes erkennbar eingetragen sein. Bevorzugt traegt |
| 131 | man auch die genehmigten Eigenschaften ein. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 132 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 133 | o Vor Anschluss sollte man kontrollieren, dass der Magier alle wesentlichen |
| 134 | Punkte beruecksichtigt hat: |
| 135 | - Liegen alle Balance-Genehmigungen vor? |
| 136 | BTool light gibt's fuer alle, damit kann jeder fuer Objekte in seinem |
| 137 | Zustaendigkeitsbereich die Genehmigungen einsehen. |
| 138 | - Sind die FP eingetragen? |
| 139 | FP kann der RM fuer das neue Gebiet selbst abfragen. |
| 140 | - Sind die ZTs eingetragen und getestet? |
| 141 | Dies laesst sich mit dem Magierkommando "traenke" herausfinden. |
| 142 | - Falls Sonder-EK-Stupse vorgesehen sind: sind diese genehmigt? |
| 143 | Die Eintragung bzw. Anpassung der Stufenpunkte fuer den Kill wird |
Arathorn | ee7ec86 | 2020-12-01 23:57:24 +0100 | [diff] [blame] | 144 | erledigt, sobald der NPC das erste Mal getoetet wurde, dies muss also |
| 145 | nicht gesondert ueberprueft werden. |
| 146 | - Gibt es Kollisionen zwischen NPC-Namen und Spielernamen? Falls noetig, |
| 147 | sollten die Namen von NPC gebanisht werden, sofern es sich um |
| 148 | Personennamen handelt. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 149 | |
| 150 | o Alle NPCs sollten vor Anschluss einmal gekillt werden, um sie auf |
| 151 | grundsaetzliche Kampf-Funktionsfaehigkeit zu pruefen. |
| 152 | |
| 153 | o Haben NPCs Namen, sollte ueberlegt werden, diese Namen ggf. zu banishen. |
| 154 | (hilfe banish). |
| 155 | |
| 156 | o Es existiert ein Shell-Skript, mit dessen Hilfe man offensichtliche |
| 157 | Formfehler in einem kompletten Verzeichnis ermitteln kann (Umlaute im |
| 158 | Code, zu lange Zeilen etc.), wobei bezueglich der Formalien auch auf |
| 159 | den Regionsmitarbeiter-Leitfaden fuer neue Projekte verwiesen werden |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 160 | soll. Das Skript liegt im oeffentlichen Git-Repo "static-lpc-check" auf |
| 161 | dem MG-Gerrit-Server. Man kann es mit git oder ueber das Webinterface |
| 162 | herunterladen. Der Regionsmagier hat hierbei die Entscheidungsfreiheit, |
| 163 | die Berichte dieses Skripts dem Programmierer des neuen Gebiets als |
| 164 | Anhaltspunkte zur Verfuegung zu stellen, oder die Abarbeitung der |
| 165 | gemeldeten Punkte zur Voraussetzung fuer den Anschluss zu machen, aber |
| 166 | auch jede Abstufung dazwischen ist OK. :-) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 167 | Zusaetzlicher Tip: Das Skript differenziert zwischen eigentlich nicht |
| 168 | akzeptablen Konstrukten und zumindest fragwuerdigen, d.h. man kann diese |
| 169 | Unterscheidung an den Verantwortlichen mit entsprechenden Forderungen |
| 170 | weitergeben. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 171 | |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 172 | o Sollte ein zur Abnahme anstehendes Gesellenstueck eine (grundsaetzlich |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 173 | selbstverstaendlich zulaessige) Gemeinschaftsarbeit sein, sollte man |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 174 | darauf bestehen, eine sauber getrennte Codebasis in unterschiedlichen |
| 175 | Verzeichnissen vorgelegt zu bekommen, oder aber eine Auflistung, welcher |
| 176 | Beitrag von welchem Magier stammt. Es sollte klar sein, dass die |
| 177 | Beurteilung der Faehigkeiten eines Lehrlings darauf angewiesen ist, dass |
| 178 | man den Code richtig zuordnen kann. |
| 179 | Wenn eine solche Auflistung sich bis auf Funktionsebene erstreckt |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 180 | (z.B. "DoWield() ist von X, Details von Y, DefendFunc von Z"), ist |
| 181 | das unschoen und an sich abzulehnen. |
| 182 | |
| 183 | |
| 184 | 3) Verlegung von Dateien |
| 185 | ======================== |
| 186 | |
| 187 | o Sollte ein Objekt aus einer anderen Region bzw. allgemein aus einem |
| 188 | anderen Verzeichnis (z.B. /players) in Deine Region verlegt werden |
| 189 | muessen, sind VOR dem Umhaengen folgende Punkte zu beachten: |
Arathorn | 454f176 | 2020-05-01 22:39:30 +0200 | [diff] [blame] | 190 | -- Forscherpunkte muessen umgetragen werden |
| 191 | -- Quests und Minquests muessen umgetragen werden |
| 192 | -- Erstkill-Stufenpunkte muessen umgetragen werden |
| 193 | -- Zaubertraenke umtragen lassen |
| 194 | -- Seherportal(e) verlegen lassen |
| 195 | -- Ruestungen in Padreics Ruestungsskill umtragen lassen |
Zesstra | 299bc49 | 2019-08-19 20:09:10 +0200 | [diff] [blame] | 196 | -- Waffen in der Liste legendaerer Waffen der Kaempfergilde umtragen |
Arathorn | 454f176 | 2020-05-01 22:39:30 +0200 | [diff] [blame] | 197 | (GM Kaempfer oder EM ansprechen) |
| 198 | -- im Gebiet vorhandene Seherhaeuser umziehen, an P_SEHERHAUS_ERLAUBT im |
| 199 | Zielraum denken |
| 200 | -- evtl. im Gebiet vorhandene Kraeuterskill-Kraeuter beruecksichtigen |
Arathorn | ae6dbc9 | 2020-07-27 23:36:15 +0200 | [diff] [blame] | 201 | -- evtl. vorhandene Autoload-Objekte pruefen; in einfachen Faellen kann |
| 202 | man ein Wrapper-Objekt erstellen, das das alte beim Clonen durch das |
| 203 | neue ersetzt. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 204 | -- evtl. Briefempfaenger der Postquest beruecksichtigen, |
Zesstra | 096e2f6 | 2021-05-07 09:48:37 +0200 | [diff] [blame] | 205 | -- evtl. Fotomotive von Notstroms Miniquest im Wald umstellen, |
| 206 | -- bei Kneipen: Pfad im Bierschuettler-Gildenmaster umtragen lassen |
| 207 | (GM Bierschuettler oder EM ansprechen), |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 208 | -- ueber die Mudlib greppen lassen, um eventuell in anderen Regionen |
| 209 | verwendete Referenzen auf die alten Pfade des umziehenden Codes |
| 210 | zu finden und dort umzustellen. Hierbei sind in Ausnahmefaellen von |
| 211 | fiesem Code auch in Spielersavefiles gespeicherte Pfade zu |
| 212 | beruecksichtigen (*ARGL*). |
| 213 | |
Arathorn | 454f176 | 2020-05-01 22:39:30 +0200 | [diff] [blame] | 214 | Sofern nichts anderes angegeben ist, muss Dir dabei ein EM helfen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 215 | |
| 216 | 4) Seherhaeuser |
| 217 | =============== |
| 218 | |
| 219 | o Die Erlaubnis zum Bau eines Seherhauses in einem Gebiet haengt einzig und |
| 220 | allein von dem verantwortlichen Magier ab. Sollte dieser laenger nicht |
| 221 | erreichbar sein (auch nicht ueber externe Mail!), liegt die Entscheidung |
| 222 | beim Regionsmagier, der aber in jedem Fall die Eignung des Bauplatzes |
| 223 | in der Umgebung bewerten muss. |
| 224 | |
| 225 | o Fuer Sonderwuensche bezueglich Unsichtbarkeit von Seherhaeusern oder |
| 226 | besonderer Kommandos zum Betreten des Hauses sei auf die Datei |
| 227 | /doc/beispiele/misc/seherhaus.c verwiesen, wo die Vorgehensweise |
| 228 | erlaeutert wird. Ein Beispiel einer sehr umfangreichen Implementierung |
| 229 | findet sich in /d/ebene/room/hp_str8a.c. |
| 230 | |
| 231 | o Bei geaenderten Befehlen zum Betreten muss beachtet werden, dass bei einer |
| 232 | Standardimplementierung die Erlaube-Liste umgangen wird, d.h. ohne |
| 233 | besondere Vorkehrungen u.U. JEDER das Haus ungehindert betreten kann. |
| 234 | Es ist hingegen moeglich, die Erlaube-Liste abzufragen und entsprechend |
| 235 | zu behandeln, ein Beispiel hierfuer ist in /d/ebene/room/hp_str8a.c |
| 236 | nachzulesen (derzeit jedoch auf Spielerwunsch deaktiviert). |
| 237 | |
| 238 | |
| 239 | 5) Debuggen von Code |
| 240 | ==================== |
| 241 | |
| 242 | o Nach dem Reparieren eines Objektes ist es meist erforderlich, das |
| 243 | betreffende Objekt neu zu laden. Falls es sich dabei um Objekte handelt, |
| 244 | die z.B. in einem Raum mittels AddItem() hinzugefuegt wurden (wie etwa |
| 245 | ein NPC), dann ist es am besten, die Datei mit dem Befehl |
| 246 | <upd -ad datei.c> zu aktualisieren und somit saemtliche Clones zu |
| 247 | zerstoeren. Wenn man mittels <upd -ar datei.c> die bestehenden Clones |
| 248 | ersetzen wuerde, wuerden diese aus der Item-Liste des clonenden Raumes |
| 249 | ausgetragen, so dass dieser Raum dann im reset() neue Items erzeugt und |
| 250 | diese in der Folge doppelt existieren wuerden. |
| 251 | |
| 252 | |
| 253 | 6) besondere Funktionen |
| 254 | ======================= |
| 255 | |
| 256 | Es kommt haeufig vor, dass Funktionen ueberschrieben werden muessen, und das |
| 257 | ist auch normalerweise vollkommen normal und nicht beanstandenswert. Jedoch |
| 258 | sollte man bei bestimmten Funktionen einiges Augenmerk auf die korrekte |
| 259 | Ausfuehrung richten. Einige Beispiele sind nachfolgend aufgefuehrt: |
| 260 | |
| 261 | o catch_tell() / ReceiveMsg() |
| 262 | Die Reaktion von Objekten, insbesondere NPCs, auf eingehende Textmeldungen |
| 263 | laesst sich nutzen, um schoene und stimmungsvolle Gebiete mit dynamisch |
| 264 | reagierenden Bewohnern zu schaffen. Es laesst sich auf der dunklen Seite |
| 265 | der Macht hingegen auch verwenden, um ueble Konstrukte zu realisieren, |
| 266 | fuer die es seit Ewigkeiten geeignete Implementierungen gibt, und die |
| 267 | demzufolge niemals durch eine Endabnahme durch einen RM durchschluepfen |
| 268 | duerfen. Ein paar reale NPC-Beispiele aus der Praxis: |
| 269 | |
| 270 | Schnipsel 1) |
| 271 | |
| 272 | if (sscanf(str, " %s greift den Priester %s",name1, dummy) == 2) |
| 273 | { |
| 274 | pl = find_player(lower_case(name1)); |
| 275 | if (!pl || !living(pl)) |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 276 | return; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 277 | else |
| 278 | Kill(pl); |
| 279 | } |
| 280 | Zweck: Simulation von AddDefender() und InformDefend()/DefendOther() |
| 281 | Kommentar: Absolutes No-Go! Mit Echo-Faehigkeiten von Spielern (Gilde oder |
| 282 | anderweitig) ist hiermit ein indirekter Playerkill moeglich. |
| 283 | Inakzeptable Implementierung. |
| 284 | |
| 285 | |
| 286 | Schnipsel 2) |
| 287 | |
| 288 | if (sscanf(str, "%s sagt: %s\n", wer,was)) |
| 289 | { |
| 290 | if (lower_case(was)=="ja" ) |
| 291 | this_player()->move(zielraum, M_TPORT); |
| 292 | } |
| 293 | Zweck: Ausloesen eines Kommandos, ohne "sage ..." als Befehl |
| 294 | ueberschreiben zu muessen. |
| 295 | Kommentar: Ausnutzbar als Remote-Fluchtteleport, indem man die Meldung |
| 296 | mittels teile-mit an den NPC sendet: |
| 297 | "Robert teilt Dir mit: sagt: ja", was ungeprueft ein move() |
| 298 | zur Folge hat. Offensichtlich ebenso ungeeignet wie das |
| 299 | vorige Beispiel. |
| 300 | |
| 301 | |
| 302 | Schnipsel 3) |
| 303 | |
| 304 | if (sscanf(lower_case(str),"%s sagt: %sversteck%s",s1,s2,s3)) |
| 305 | tell_room(environment(),sprintf("Der Fisch sagt: Das ist aber keine " |
| 306 | "grosse Hilfe, %s.\n",capitalize(s1)),({TO})); |
| 307 | |
| 308 | sieht erstmal harmlos aus, fuehrt aber mit der Anweisung |
| 309 | |
| 310 | SetChats(8, ({ "Der Fisch sagt: Wo kann ich mich nur verstecken?"}) ); |
| 311 | |
| 312 | dazu, dass der NPC dauernd mit sich selber schwatzt. Kein kritischer Bug |
| 313 | im eigentlichen Sinn, aber auf jeden Fall der Atmosphaere im Gebiet |
| 314 | sehr abtraeglich. |
| 315 | |
| 316 | o move() |
| 317 | Ueberschreiben von move() ist eine extrem heikle Angelegenheit, bei der |
| 318 | beim kleinsten Fehler massive Probleme resultieren koennen, jedoch meist |
| 319 | nicht offensichtlich ist, woher das resultiert. Als allgemeine Empfehlung |
| 320 | sollte gelten, dass move() NIE ueberschrieben wird, und wenn, dann muss |
| 321 | ausfuehrlich und aufmerksam geprueft werden, was da passiert, und ob der |
| 322 | gewuenschte Effekt nicht anders sauberer erreicht werden kann. |
| 323 | Als zusaetzlicher Hinweis sei auf NotifyMove() und PreventMove() verwiesen, |
| 324 | mit deren Hilfe sich die allermeisten Faelle erschlagen lassen, in denen |
| 325 | Magier faelschlicherweise glauben, move() ueberschreiben zu muessen. |
| 326 | |
| 327 | o Defend()/Attack() |
| 328 | hier ist ein beliebter Fehler einfach der, dass man am Ende der Funktion |
| 329 | ::Defend() bzw. ::Attack() ruft, aber im Codeblock vorher das Objekt |
| 330 | durch eigenen Tod oder anderes schon zerstoert wurde. Dann geht das schief. |
| 331 | Einfach mal hinschauen - es ist aber kein wirklich gravierender Fehler, |
| 332 | da sowas im Kampf meist ziemlich schnell auffaellt. |
| 333 | |
| 334 | o call_out() |
| 335 | Hierzu zwei Hinweise: zum einen fuehrt call_out("x",0) seit der Umstellung |
| 336 | auf LDmud als Driver nicht mehr implizit zu einem call_out("x",1), wie es |
| 337 | zuvor war, sondern tatsaechlich zu einem fast sofortigen Funktionsaufruf der |
| 338 | Funktion x() - mit allen Konsequenzen, inklusive eines "too long eval"- |
| 339 | Bugs. Wer eine echte Verzoegerung braucht, muss mindestens call_out("x",1) |
| 340 | verwenden. |
| 341 | Zum anderen wurde mit LDmud die Granularitaet des reset()-Aufrufes auf |
| 342 | Heartbeat-Genauigkeit (2 s) verfeinert, so dass man bequem laengere |
| 343 | Verzoegerungen auf die Verwendung von reset() umstellen kann. |
| 344 | |
| 345 | o Zerstoeren von Objekten mit remove() oder destruct() |
| 346 | Man sollte einen sehr kritischen Blick auf Konstrukte werfen, die |
| 347 | nach einem remove() noch weiteren Code ausfuehren (Ausnahme: echte efuns |
| 348 | und Compiler-Konstrukte wie return). |
| 349 | Wenn man Objekte zerstoeren will oder muss, sollte man immer zuerst |
| 350 | remove() verwenden. Destruct muss dem absoluten Ausnahmefall vorbehalten |
| 351 | bleiben. Man sollte im Hinterkopf behalten, dass Objekte gute Gruende haben |
| 352 | koennen, sich einem remove() zu verweigern. |
| 353 | |
| 354 | o for()-Schleifen |
| 355 | Eigentlich keine Funktion, aber an dieser Stelle doch passend: |
| 356 | for()-Schleifen sollten generell durch foreach()-Konstruktionen ersetzt |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 357 | werden, da dies signifikant und messbar schneller ist. Der groesste |
| 358 | Zeit- und Kostenfaktor ist die Verwendung von sizeof() als Abbruchkriterium |
| 359 | in einer for()-Schleife. Wenn sich die Schleife also nicht ersetzen laesst, |
| 360 | dann nehmt zumindest einen konstanten Wert als Abbruchkriterium. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 361 | |
| 362 | o write_file() |
| 363 | Benutzung dieser Funktion nur in begruendeten Ausnahmefaellen abnehmen, da |
| 364 | keinerlei Begrenzung der Dateigroesse existiert. Insbesondere bei Logfiles |
| 365 | entstehen hierdurch im Laufe der Zeit Monsterdateien, die nur Plattenplatz |
| 366 | verbrauchen, aber kaum zu ueberschauen sind. Statt write_file() wird in |
| 367 | den allermeisten Faellen log_file() mit der Standardgroesse von 50 kB fuer |
| 368 | Logfile und eine ggf. vorhandene Altversion (*.OLD) ausreichend sein. |
Arathorn | 41004de | 2020-10-18 22:03:28 +0200 | [diff] [blame] | 369 | Standardmaessig ist das Schreiben eines Questlog-Eintrages in /log/quest |
| 370 | der einzige Einsatzzweck, wo write_file() wirklich notwendig ist. |
| 371 | Ansonsten sind Ausnahmen vorstellbar, wenn die neuen Daten die alte Datei |
| 372 | komplett ersetzen, d.h. nicht angehaengt werden. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 373 | |
| 374 | o Verwalten von charakterbezogenen Daten |
| 375 | Als Beispiel seien hier Statusdaten fuer den Ablauf von Quests genannt, |
| 376 | oder Highscores in irgendwelchen Toplisten. Fuer die Umsetzung dieser |
| 377 | Datenerfassung werden typischerweise zwei Techniken eingesetzt. Zum |
| 378 | einen kann ein Masterobjekt erstellt werden, das die Daten sammelt und |
| 379 | mittels save_object() dauerhaft speichert. Zum anderen kann man auch |
| 380 | Daten in einer Property im Spieler ablegen und diese je nach Anwendungs- |
| 381 | fall auf SAVE setzen. |
| 382 | |
| 383 | Bei der ersten Variante wird man ueblicherweise die UID oder UUID des |
| 384 | Spielers als Indizierungsmerkmal verwenden. Der erste Fallstrick ist nun, |
| 385 | dass die UID bei Spielern (nicht Sehern) ggf. nach einer Selbstloeschung |
| 386 | neu vergeben werden kann, so dass die Daten inkonsistent werden bzw. der |
| 387 | Spieler scheinbar schon in Eurem Master eingetragen ist, obwohl es sich |
| 388 | eigentlich um jemand ganz anderes handelt. |
| 389 | Als Abhilfemassnahme bietet sich folgendes an: |
| 390 | a) UUID verwenden, da diese fuer jeden Spieler eindeutig ist. |
| 391 | b) Hinweis: find_player() kann auch mit UUIDs umgehen und das zugehoerige |
| 392 | Spielerobjekt ermitteln. |
| 393 | c) Man sollte ggf. auf das Mudlib-Event EVT_LIB_PLAYER_DELETION lauschen, |
| 394 | um Spieler auszutragen, die sich loeschen, wodurch die zugehoerigen |
| 395 | Daten obsolet werden. |
| 396 | |
| 397 | Bei der zweiten Variante muss man verschiedene Dinge beruecksichtigen: |
| 398 | a) nicht endlos viele Properties machen, sondern pro Thema (z.B. Quest) |
| 399 | einfach eine. |
| 400 | b) nur die Properties speichern, bei denen das wirklich noetig ist. |
| 401 | c) Speichert man Properties und die Aufgabe wird erledigt, d.h. der |
| 402 | Inhalt der Property obsolet, muss die Property wieder geloescht werden. |