MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | Gilden |
| 2 | ******* |
| 3 | |
| 4 | Gilden sind dazu da, Spielern besondere Faehigkeiten zu verleihen. Dies |
| 5 | koennen Zaubersprueche (Spells) sein, es kann aber auch andere Faehigkeiten |
| 6 | (Skills) geben. Als Spell gilt jede Faehigkeit, die ein Spieler mit einem |
| 7 | Befehl direkt aufrufen muss. Damit auch andere Gilden die gleichen |
| 8 | Zaubersprueche verwenden koennen, muessen die Sprueche in eigenen |
| 9 | Spellbooks abgelegt werden. Eine Gilde kann Sprueche aus beliebigen |
| 10 | Spellbooks verwenden und diese ggf. leicht modifizieren. |
| 11 | |
| 12 | Gildenobjekt |
| 13 | ============= |
| 14 | |
| 15 | Eine Gilde muss ein Objekt haben, bei dem der Spieler der Gilde beitreten |
| 16 | bzw. austreten und die Faehigkeiten der Gilde erwerben kann. Gewoehnlich |
| 17 | ist dies ein Raum, der "/std/gilden_room" inheritet, es kann aber auch ein |
| 18 | anderes Objekt sein, fuer diesen Fall ist "/std/gilden_ob" vorgesehen. |
| 19 | |
| 20 | Die Beitrittsbedingungen fuer die Gilde werden in Form eines |
| 21 | Restriction-Mappings in der Property P_GILDEN_RESTRICTIONS |
| 22 | abgelegt. |
| 23 | |
| 24 | Das Spellbook, in dem die Spells der Gilde stehen, muss in |
| 25 | P_GUILD_DEFAULT_SPELLBOOK genannt sein. Es wird automatisch |
| 26 | "/spellbooks/" vorne an den Namen angefuegt. Die Spells, die aus diesem |
| 27 | Spellbook verwendet werden sollen, koennen dann einfach mit |
| 28 | AddSpell(name) ausgewaehlt werden. Wenn ein Spruch modifiziert werden |
| 29 | soll so kann ein Mapping mit zusaetzlichen Informationen als zweites |
| 30 | Argument angegeben werden. In diesem kann man dann auch ein anderes |
| 31 | Spellbook als das Default-Spellbook mit ([SI_SPELLBOOK:name]) |
| 32 | angeben. In P_GLOBAL_SKILLPROPS kann ein Mapping angegeben |
| 33 | werden, das alle Spells und Skills modifiziert. P_GLOBAL_SKILLPROPS |
| 34 | und P_GILDEN_DEFAULT_SPELLBOOK muessen uebrigens gesetzt |
| 35 | werden bevor mit AddSpell/Skill Spells oder Skills hinzugefuegt werden. |
| 36 | |
| 37 | Fuer andere Faehigkeiten sind AddSkill und LearnSkill vorgesehen. |
| 38 | LearnSkill wird im Gegensatz zu LearnSpell jedoch nicht automatisch vom |
| 39 | /std/gilden_room mit "lerne" aufgerufen, weil i.A. diese Faehigkeiten auf |
| 40 | andere Art erworben werden, z.B. beim Gildeneintritt oder durch |
| 41 | Trainingsstunden. Mit LearnSkill kann man nur solche Faehigkeiten |
| 42 | erwerben, die mit AddSkill angefuegt wurden. |
| 43 | |
| 44 | Skills werden ueblicherweise durch den Aufruf von UseSkill im Spieler |
| 45 | verwendet. Wenn der Spieler in einer Gilde ist und eine Funktion unter |
| 46 | SI_SKILLFUNC zu finden ist, so wird diese im Gildenobjekt aufgerufen, |
| 47 | sonst wird versucht StdSkill_Name im Spieler aufzurufen. Wenn auch das |
| 48 | fehlschlaegt wird nur der Wert unter SI_ABILITY zurueckgegeben. |
| 49 | |
| 50 | Es stehen folgende Funktionen zur Benutzung zur Verfuegung: |
| 51 | |
| 52 | o QuerySpell(name) |
| 53 | Liefert die Informationen zu diesem Spell |
| 54 | o QuerySkill(name) |
| 55 | Liefert die Informationen zu dieser Faehigkeit |
| 56 | o AddSpell(name,info) |
| 57 | Spell wird hinzugefuegt |
| 58 | o AddSkill(name,info) |
| 59 | Faehigkeit wird zugefuegt |
| 60 | o LearnSpell(name) |
| 61 | Spieler lernt den angegebenen Spell, falls moeglich. Liste der Spells |
| 62 | wird ausgegeben, falls keiner angegeben ist. |
| 63 | o LearnSkill(name) |
| 64 | Spieler erwirbt diese Faehigkeit, falls moeglich. Liste aller |
| 65 | Faehigkeiten wird ausgegeben, falls keine angegeben ist. |
| 66 | o GildenName() |
| 67 | Liefert den Namen dieser Gilde. |
| 68 | o InitialSkillAbility(info,spieler) |
| 69 | Rechnet den Anfangswert fuer SI_SKILLABILITY aus. |
| 70 | o SkillListe(x) |
| 71 | Es wird angezeigt, welche Spells/Skills der Spieler lernen kann. |
| 72 | Dabei bedeutet x: |
| 73 | o 1: Nur Spells anzeigen |
| 74 | o 2: Nur Skills anzeigen |
| 75 | o 3: Beides anzeigen |
| 76 | |
| 77 | Von diesen Funktionen stehen in /std/gilden_room automatisch |
| 78 | bei_oder_austreten und LearnSpell dem Spieler zur Verfuegung. |
| 79 | |
| 80 | Spellbook |
| 81 | ========== |
| 82 | |
| 83 | Spellbooks stellen die Spells zur Verfuegung, die Spieler oder Monster |
| 84 | verwenden koennen. Alle Spellbooks sollten /std/spellbook inheriten. In der |
| 85 | einfachsten Form kann ein Spell wie folgt hinzugefuegt werden: |
| 86 | AddSpell(verb,kosten,level) |
| 87 | Dabei ist "verb" sowohl der Name des Verbs, mit dem der Spruch |
| 88 | aufgerufen werden soll, wie auch der Name der Funktion, die dabei |
| 89 | aufgerufen wird. "kosten" sind die Magiepunkte, die fuer den Spruch |
| 90 | benoetigt werden und "level" ist der Spielerlevel, der noetig ist, um diesen |
| 91 | Spruch zu lernen. |
| 92 | |
| 93 | In der flexibleren Form werden Spells mit |
| 94 | AddSpell(verb,kosten,info) |
| 95 | hinzugefuegt. Dabei ist "info" ein Mapping, in dem alle anderen |
| 96 | Spell-Informationen stehen. Dabei kann z.B. eine andere Funktion als das |
| 97 | Verb als Eintrag |
| 98 | SI_SKILLFUNC:name |
| 99 | angegeben werden. Wenn zum Lernen eine bestimmte Stufe erforderlich ist |
| 100 | so muss |
| 101 | SI_SKILLRESTR_LEARN:([P_LEVEL:level]) |
| 102 | eingetragen sein. Es sollten alle Werte, von denen ein Spell abhaengt, in dem |
| 103 | Mapping eingetragen sein. Dadurch haben Gilden die Moeglichkeit, Spells |
| 104 | mit Offsets und Faktoren zu modifizieren. |
| 105 | |
| 106 | In P_GLOBAL_SKILLPROPS kann ein Mapping stehen, dass bei jedem |
| 107 | Spell zum Info addiert wird. Dieses sollte gesetzt werden, bevor die Spells |
| 108 | mit AddSpell hinzugefuegt werden. |
| 109 | |
| 110 | Die Benutzung von Spells laeuft wie folgt ab: |
| 111 | |
| 112 | o Zuerst wird ueberprueft, ob der Spieler den Spruch verwenden darf. |
| 113 | Dazu wird die Funktion CanTrySpell aufgerufen. Diese prueft |
| 114 | normalerweise, ob der Spieler kein Geist ist und ob er die |
| 115 | Einschraenkungen erfuellt, die als SI_SKILLRESTR_USE |
| 116 | angegeben sind. |
| 117 | o Als naechstes wird geprueft, ob der Spieler noch genug Magiepunkte |
| 118 | hat. Diese stehen im Mapping unter SI_SPELLCOST. |
| 119 | o Als letztes wird geprueft, ob der Spieler noch erschoepft ist von |
| 120 | seinem letzten Spruch. |
| 121 | o Nun wird die eigentliche Funktion des Spells aufgerufen, wenn es die |
| 122 | Umgebung zulaesst. Die Funktion muss einen positiven Wert |
| 123 | zurueckgeben, wenn der Spruch gelungen ist, und einen negativen, |
| 124 | wenn er misslungen ist. Falls der Spruch aus irgend einem Grund |
| 125 | nicht anwendbar ist soll 0 zurueckgegeben werden. |
| 126 | o Bei Erfolg oder Misserfolg werden die Magiepunkte abgezogen und |
| 127 | der Spieler ist fuer die naechste Zeit erschoepft. Die Zeitspanne ist |
| 128 | im Mapping unter SI_SPELLFATIGUE zu finden. |
| 129 | o Bei Erfolg wird die Funktion "Erfolg" aufgerufen, bei Misserfolg |
| 130 | die Funktion "Misserfolg" |
| 131 | o Die Funktion "Misserfolg" ruft normalerweise die Funktion "Learn" |
| 132 | auf, damit der Spieler aus seinen Fehlern lernt. |
| 133 | |
| 134 | Die eigentliche Spellfunktion sollte, falls der Spell anwendbar ist, mit |
| 135 | SpellSuccess pruefen, ob er erfolgreich ist oder nicht. Dabei gelten Werte |
| 136 | groesser Null als Erfolg. In der Spellfunktion sollten, falls moeglich, |
| 137 | SkillAttribute des Spielers sowie Faktoren und Offsets beruecksichtigt |
| 138 | werden. Fuer beides stehen einfach zu handhabende Funktionen zur |
| 139 | Verfuegung. Dies ist zwar etwas mehr Arbeit, dafuer geschehen dann Dinge |
| 140 | wie Interaktionen zwischen den Spells fast automatisch. |
| 141 | |
| 142 | Folgende Funktionen stellt das Standard-Spellbook zur Verfuegung: |
| 143 | |
| 144 | o QuerySpell(name) |
| 145 | Liefert Informations-Mapping zu diesem Spell. |
| 146 | o AddSpell(name,kosten,info) |
| 147 | Fuegt Spell mit angegebenen Kosten und dem |
| 148 | Informations-Mapping ins Spellbook ein. |
| 149 | o TryAttackSpell(opfer,schaden,typen,is_spell,caster,info) |
| 150 | Versucht den Angriffs-Spruch auf den Gegner anzuwenden. Die |
| 151 | mittleren 4 Werte sind die, die auch bei Defend uebergeben werden. |
| 152 | Dabei wird die Abwehrfaehigkeit des Gegners gegen Magie und das |
| 153 | Skill-Attribut SA_DAMAGE automatisch beruecksichtigt. |
| 154 | o TryDefaultAttackSpell(opfer,caster,info,is_spell) |
| 155 | Wie TryAttackSpell, nur werden Schaden und Schadenstypen |
| 156 | automatisch aus dem Informations-Mapping entnommen. Bei beiden |
| 157 | Funktionen sollte als is_spell uebrigens ein String stehen, z.B. |
| 158 | "Feuerball", damit es leichter moeglich ist, Monster zu schreiben, die |
| 159 | auf diese reagieren. |
| 160 | o SpellSuccess(caster,info) |
| 161 | Ermittelt, ob der Spell funktioniert oder fehlschlaegt. Dabei wird |
| 162 | auch eine evtl. vorhandene Spellcasting-Faehigkeit (SK_CASTING) |
| 163 | beruecksichtigt. Ohne Spellcasting-Faehigkeit liegt das Ergebnis |
| 164 | zwischen -MAX_ABILITY und +MAX_ABILITY, mit dieser |
| 165 | Faehigkeit koennen die Werte zwischen -2*MAX_ABILITY und |
| 166 | +2*MAX_ABILITY liegen. Werte kleiner oder gleich Null sollen |
| 167 | als Fehlschlag interpretiert werden. |
| 168 | Wer will, kann Werte ueber +MAX_ABILITY als besonders gut |
| 169 | gelungene Spells interpretieren und bei Werten unter |
| 170 | -MAX_ABILITY unangenehme Wirkungen ausloesen, z.B. kann |
| 171 | sich der Spell dann gegen den Spieler richten... |
| 172 | Wenn ein Spieler die Spellcasting-Faehigkeit hat und ein Spruch |
| 173 | besonders gut gelingt, so freut er sich und verbessert diese |
| 174 | Faehigkeit. |
| 175 | o CanTrySpell(caster,info) |
| 176 | Ermittelt, ob der Spieler den Spruch anwenden darf. Normalerweise |
| 177 | ist diese der Fall, wenn er kein Geist ist und die Bedingungen |
| 178 | erfuellt, die unter SI_SKILLRESTR_USE im Mapping eingetragen |
| 179 | sind. |
| 180 | o Learn(caster,spell,info) |
| 181 | Diese Funktion wird normalerweise bei Misserfolg aufgerufen, |
| 182 | damit der Spieler aus seinen Fehlern lernt. Dabei wird |
| 183 | ueblicherweise die Intelligenz des Spielers beruecksichtigt. Fuer je 2 |
| 184 | Stufen A_INT bekommt der Spieler SI_SKILLLEARN hinzu. |
| 185 | |
| 186 | Moechte man ein anderes Attribut zum lernen verwenden kann man dies |
| 187 | in Form eines Mappings in SI_LEARN_ATTRIBUTE tun. |
| 188 | |
| 189 | SI_LEARN_ATTRIBUTE:([A_STR:1]) macht das Lernen rein staerkeabhaengig, |
| 190 | SI_LEARN_ATTRIBUTE:([A_STR:1,A_INT:2]) bildet den gewichteten Mittelwert |
| 191 | von STR und zweifacher INT. |
| 192 | |
| 193 | o Erfolg(caster,spell,info) |
| 194 | Diese Funktion wird bei Erfolg aufgerufen. |
| 195 | o Misserfolg (caster,spell,info) |
| 196 | Diese Funktion wird bei Misserfolg aufgerufen. |
| 197 | o FindVictim(wen,spieler,msg) |
| 198 | "wen" wird in der Umgebung des Spielers gesucht. Falls diese |
| 199 | Variable Null ist wird zufaellig ein Feind ausgewaehlt. Falls |
| 200 | niemand gefunden wird, so wird "msg" ausgegeben. |
| 201 | o FindLivingVictim(wen,spieler,msg) |
| 202 | Wie FindVictim, nur wird zusaetzlich ueberprueft, ob es ein |
| 203 | Lebewesen ist. |
| 204 | o FindEnemyVictim(wen,spieler,msg) |
| 205 | Wie FindLivingVictim, nur der Spieler selbst wird ausgenommen |
| 206 | und wenn es vorher noch kein Feind war, so wird Kill aufgerufen |
| 207 | damit es hinterher garantiert einer ist. |
| 208 | o FindGroup(spieler,wen) |
| 209 | Bei Spielern findet die Funktion alle Monster im Raum, wenn "wen" |
| 210 | negativ ist, alle Spieler wenn "wen" positiv ist und alle Lebewesen |
| 211 | wenn "wen" Null ist. Bei Monstern ist es genau umgekehrt. Es sollte |
| 212 | jedoch FindGroupP mit 100% verwendet werden. |
| 213 | o FindGroupN(spieler,wen,n) |
| 214 | Wie FindGroup, jedoch maximal n Personen. Das Skill-Attribut |
| 215 | SA_EXTENSION wird automatisch beruecksichtigt. |
| 216 | o FindGroupP(spieler,wen,prozent) |
| 217 | Wie FindGroup, jedoch jede Person mit der angegebenen |
| 218 | Wahrscheinlichkeit. Das Skill-Attribut SA_EXTENSION wird |
| 219 | automatisch beruecksichtigt. |
| 220 | |
| 221 | Neue Funktionen im Living |
| 222 | ========================== |
| 223 | |
| 224 | o QuerySkillAttribute(name) |
| 225 | Hiermit kann das Skill-Attribut mit dem angegebenen Namen |
| 226 | abgefragt werden. |
| 227 | o SetSkillAttribute(caster,name,wert,dauer,func) |
| 228 | Hiermit kann das angegebene Skill-Attribut vom caster fuer die |
| 229 | angegebene Dauer auf einen Wert gesetzt werden. Es kann eine |
| 230 | Funktion angegeben werden, die den Wert statt dessen liefern soll. |
| 231 | o QuerySkill(name) |
| 232 | Dies liefert die spielerspezifischen Skill-Informationen. |
| 233 | o QuerySkillAbility(name) |
| 234 | Dies liefert von den Skill-Informationen nur SI_ABILITY. |
| 235 | o ModifySkill(name,info,diff) |
| 236 | Modifiziert die Skill-Informationen. Wenn "info" ein Mapping ist, |
| 237 | so wird es zu dem alten Mapping "addiert" (also die angegebenen |
| 238 | Werte geaendert), wenn nur ein Wert angegeben ist, wird |
| 239 | angenommen dass es sich dabei um SI_ABILITY handelt. |
| 240 | o LearnSkill(name,add,diff) |
| 241 | Addiert den angegebenen Wert zu SI_ABILITY. Dabei ist "diff" der |
| 242 | Schwierigkeitsgrad von diesem Spell/Skill. Durch den |
| 243 | Schwierigkeitsgrad SI_ABILITY abhaengig vom Level begrenzt. |
| 244 | o UseSpell(arg,spell) |
| 245 | Das Lebewesen benutzt den Spell mit den angegebenen Argumenten. |
| 246 | Wenn kein Spell angegeben ist, so wird query_verb() verwendet. |
| 247 | o UseSkill(skill,arg) |
| 248 | Das Lebewesen benutzt die Faehigkeit. |
| 249 | |
| 250 | Neue Properties/Funktionen in Living/Combat |
| 251 | ============================================ |
| 252 | |
| 253 | Einige Sprueche erfordern es, das Verhalten bei Attack und Defend ziemlich |
| 254 | weitreichend zu aendern. Dafuer wurden folgende Properties und |
| 255 | Funktionen eingebaut: |
| 256 | |
| 257 | o P_TMP_ATTACK_HOOK |
| 258 | Hier kann ein Array der Form ({Endzeitpunkt,Objekt,Funktion}) |
| 259 | stehen. Solange der Endzeitpunkt noch nicht ueberschritten wurde |
| 260 | und das angegebene Objekt existiert, wird anstelle von Attack die |
| 261 | Funktion in dem Objekt aufgerufen. Wenn die Funktion 0 liefert |
| 262 | wird der Rest von Attack nicht mehr ausgefuehrt. |
| 263 | o P_TMP_DEFEND_HOOK |
| 264 | Wie P_ATTACK_HOOK, nur mit Defend. Damit sind z.B. |
| 265 | Sprueche moeglich, die fuer kurze Zeit eine magische Schutzhuelle |
| 266 | erschaffen. Wenn die Funktion 0 liefert wird der Rest von Defend |
| 267 | nicht mehr ausgefuehrt. Wenn es ein Array der Form |
| 268 | ({damage,dt,is_spell}) ergibt wird es wie bei DefendOther |
| 269 | interpretiert. |
| 270 | o P_DEFENDERS |
| 271 | Liste von Lebewesen, die mit InformDefend(enemy) informiert |
| 272 | werden sollen, sobald ein neuer Feind hinzukommt. Bei einem |
| 273 | zufaellig ausgewaehltem Lebewesen aus dieser Liste wird ausserdem |
| 274 | DefendOther mit den Argumenten von Defend aufgerufen. |
| 275 | o AddDefender(friend) |
| 276 | Fuegt Lebewesen in P_DEFENDERS ein, wenn es noch nicht in der |
| 277 | Liste ist. |
| 278 | o InformDefend(enemy) |
| 279 | Siehe oben. |
| 280 | o DefendOther(dam,dt,is_spell,enemy) |
| 281 | Mit dieser Funktion kann man Lebewesen erschaffen, die Schaden |
| 282 | von anderen abwenden oder modifizieren. Wenn diese Funktion ein |
| 283 | Array ({dam,dt,is_spell}) zurueckgibt so werden bei dem zu |
| 284 | verteidigenden Lebewesen diese Werte genommen anstelle der alten. |
| 285 | Man kann also z.B. ein Monster erschaffen, das ein |
| 286 | feuerempfindliches anderes Monster verteidigt, indem es z.B. |
| 287 | Feuerbaelle in Eishagel verwandelt. |
| 288 | |
| 289 | Standard-Skills |
| 290 | ================ |
| 291 | |
| 292 | Folgende Faehigkeiten werden schon beruecksichtigt und sind auch |
| 293 | vordefiniert. Wenn sie unveraendert uebernommen werden sollen muss nur |
| 294 | SI_ABILITY gesetzt werden. |
| 295 | |
| 296 | o SK_SWORDFIGHTING |
| 297 | Schwertkampf. Bis zu 33+A_STR+A_DEX Aufschlag bei |
| 298 | Schwertern, wenn jemand diese Faehigkeit zu 100% hat. |
| 299 | o SK_WEAPONLESS |
| 300 | Kampf mit blossen Haenden. Bis zu 100+A_STR+3*A_DEX |
| 301 | Aufschlag. |
| 302 | o SK_TWOHANDED |
| 303 | Kampf mit zweihaendigen Waffen. Bis zu 33+A_STR Aufschlag. |
| 304 | o SK_NIGHTVISION |
| 305 | Wer diese Faehigkeit zu 100% hat braucht 20 Sekunden pro |
| 306 | fehlendem Lichtlevel um sich an die Dunkelheit zu gewoehnen. |
| 307 | o SK_BOOZE |
| 308 | Mit 100% dieser Faehigkeit wird bei jedem alkoholischen Getraenk |
| 309 | 80% vom Alkoholgehalt abgezogen. |
| 310 | |
| 311 | Folgende Faehigkeiten werden beruecksichtigt, sind aber nicht vordefiniert: |
| 312 | |
| 313 | o SK_MAGIC_ATTACK |
| 314 | Wenn diese Faehigkeit vorhanden ist, wird die Funktion unter |
| 315 | SI_SKILLFUNC im Gildenobjekt aufgerufen, falls der Spieler sonst |
| 316 | mit blossen Haenden angreifen wuerde. Wenn dabei ein Mapping |
| 317 | zurueckgegeben wird, so werden die Werte von |
| 318 | SI_SKILLDAMAGE, SI_SKILLDAMAGE_TYPE und |
| 319 | SI_SKILLDAMAGE_MSG genommen anstelle der Werte in |
| 320 | P_HANDS. |
| 321 | o SK_MAGIC_DEFENSE |
| 322 | Wenn hier unter SI_SKILLFUNC eine Funktion eingetragen ist, so |
| 323 | wird sie bei Defend im Gildenobjekt aufgerufen und bekommt im |
| 324 | Informations-Mapping SI_SKILLDAMAGE, |
| 325 | SI_SKILLDAMAGE_TYPE und SI_SPELL uebergeben. Wenn sie |
| 326 | ein Mapping zurueckgibt werden hieraus SI_SKILLDAMAGE und |
| 327 | SI_SKILLDAMAGE_TYPE entnommen und ersetzen die alten |
| 328 | Werte von "dam" und "dam_type". |
| 329 | o FIGHT(Waffentyp) |
| 330 | Falls diese Faehigkeit vorhanden ist wird der entsprechenden |
| 331 | Funktion in SI_SKILLDAMAGE der bisherige Schaden uebergeben. |
| 332 | Falls sie ein Mapping zurueckliefert wird an dieser Stelle auch der |
| 333 | neue Schaden erwartet. |
| 334 | o SK_FIGHT |
| 335 | Wie Fight(Waffentyp), nur wird diese Faehigkeit, falls vorhanden, |
| 336 | bei jeder Waffe benutzt und kann auch zusaetzlich andere Werte fuer |
| 337 | SI_SKILLDAMAGE_TYPE ergeben. Waffe und Waffentyp werden |
| 338 | uebrigens in SI_WEAPON und SI_WEAPON_TYPE uebergeben. |
| 339 | o SK_CASTING |
| 340 | Spellcasting. Die Wahrscheinlichkeit, dass der Spell gelingt, steigt |
| 341 | bei 100% dieser Faehigkeit auf das Doppelte. Nur mit dieser |
| 342 | Faehigkeit ist es moeglich, ueber die Maximalgrenzen zu kommen, |
| 343 | so dass dann auch Spells besonders gut gelingen koennen. |
| 344 | |
| 345 | Temporaere Property-Aenderungen |
| 346 | ================================ |
| 347 | |
| 348 | Oft muessen Spells irgendwo Properties fuer kurze Zeit veraendern, wie |
| 349 | z.B. P_LIGHT oder P_NOMAGIC in Raeumen. Fuer diesen Zweck kann |
| 350 | man in /obj/tmp_prop_master die Funktion SetTmpProp aufrufen. Diese |
| 351 | Funktion erwartet das Objekt, in dem die Property zu setzen ist, den Namen |
| 352 | der Property, den zeitweiligen Wert und den Zeitpunkt, bis zu dem diese |
| 353 | Aenderung gelten soll. |
| 354 | |
| 355 | Skill Informationen |
| 356 | ++++++++++++++++++++ |
| 357 | |
| 358 | In den Informationsmappings zu den Spells/Skills sollten alle (zusaetzlich) |
| 359 | noetigen Informationen stehen, denn nur wenn z.B. ein Feuerball in einem |
| 360 | Spellbook als Schaden 300 eingetragen hat und diesen Wert dem Mapping |
| 361 | entnimmt, kann eine andere Gilde diesen Spruch recyclen und mit Schaden |
| 362 | 400 anbieten, natuerlich sollte er dann auch in der Gilde mehr kosten. |
| 363 | |
| 364 | SIEHE AUCH: skill_info_liste |
| 365 | |
| 366 | Faktoren und Offsets |
| 367 | --------------------- |
| 368 | |
| 369 | Man kann in dem Informations-Mapping zu jedem numerischen Wert |
| 370 | "Name" noch zwei zusaetzliche Werte FACTOR("Name") und |
| 371 | OFFSET("Name") eintragen und diese Werte automatisch zur eigentlichen |
| 372 | Wertbestimmung beruecksichtigen. Mit folgenden Funktionen sollte man |
| 373 | im Spellbook dem Mapping Werte entnehmen: |
| 374 | |
| 375 | o GetValue(name,map,spieler) |
| 376 | o GetOffset(name,map,spieler) |
| 377 | OFFSET(name). |
| 378 | o GetFactor(name,map,spieler) |
| 379 | Ergibt FACTOR(name), falls ungleich Null, sonst 100. |
| 380 | o GetFValue(name,map,spieler) |
| 381 | Ergibt (Wert*Faktor)/100. |
| 382 | o GetValueO(name,map,spieler) |
| 383 | Ergibt Wert+Offset. |
| 384 | o GetFValueO(name,map,spieler) |
| 385 | Ergibt (Wert*Faktor)/100+Offset. |
| 386 | |
| 387 | Nach Moeglichkeit sollte man davon im Spellbook GetFValueO benutzen, |
| 388 | wenn es angebracht ist. Auf jeden Fall sollten von den drei Werten |
| 389 | moeglicht viele auf eine angemessene Weise beruecksichtigt werden, denn |
| 390 | dadurch bekommt das Gildenobjekt feinere Kontrollmoeglichkeiten, wenn |
| 391 | ein Spruch modifiziert werden soll. Es ist dann fuer die Gilde aeusserst |
| 392 | einfach festzulegen, dass z.B. Zwerge bei allen Angriffsspruechen 20% |
| 393 | mehr Schaden verursachen und beim Feuerball Elfen einen hoeheren |
| 394 | garantierten Wert hinzubekommen. |
| 395 | |
| 396 | Funktionen |
| 397 | ----------- |
| 398 | |
| 399 | Wenn ein Spellbook eine der oben angesprochenen Funktionen benutz, um |
| 400 | einen numerischen Wert zu ermitteln und anstelle des Wertes steht etwas, |
| 401 | das als Funktion interprtiert werden kann, so wird diese Funktion |
| 402 | ausgewertet und das Ergebnis als Wert genommen. Als Funktion |
| 403 | interpretiert werden kann: |
| 404 | |
| 405 | o Eine Closure |
| 406 | o Ein Array ({objekt,funktionsname}) oder ({objektname,funktionsname}) |
| 407 | o Ein Funktionsname. Hierbei sollte man sich jedoch darueber im |
| 408 | klaren sein, in welchem Objekt versucht wird die Funktion |
| 409 | aufzurufen. Ueblicherweise geschieht dies im Spellbook, jedoch |
| 410 | werden SI_DIFFICULTY, SI_SKILLLEARN und SI_SPELLCOST |
| 411 | auch beim Lernen benoetigt und dies geschieht vom Gildenobjekt |
| 412 | aus. Wenn bei diesen 3 Eintraegen eine Funktion den Wert liefern |
| 413 | soll, so muss sie in eine der drei anderen Formen eingetragen werden, |
| 414 | damit das richtige Objekt ermittelt werden kann. |
| 415 | |
| 416 | SIEHE AUCH: execute_anything |
| 417 | |
| 418 | Fuer nicht-numerische Werte kann man GetData verwenden. Dabei werden |
| 419 | jedoch nur closures automatisch ausgewertet. |
| 420 | |
| 421 | Skill Attribute |
| 422 | ++++++++++++++++ |
| 423 | |
| 424 | Skill-Attribute sind Attribute, die alle anderen Skills beeinflussen koennen. |
| 425 | Normalerweise sind alle Skill-Attribute 100%, sie koennen jedoch fuer |
| 426 | kurze Zeit auf andere Werte zwischen 10% und 1000% gesetzt werden. Bei |
| 427 | der Abfrage der Attribute werden 3 Werte beruecksichtigt: |
| 428 | |
| 429 | o Wert, der vom Lebewesen selbst gesetzt wurde. |
| 430 | o Wert, der von einem anderen unter 100% gesetzt wurde. Wenn |
| 431 | mehrere andere Lebewesen den Wert unter 100% gesetzt haben so |
| 432 | gilt die Aenderung von dem mit dem hoechsten Level. Eine solche |
| 433 | Aenderung wird ueblicherweise von einem Gegner veranlasst. |
| 434 | o Wert, der von einem anderen ueber 100% gesetzt wurde. Auch hier |
| 435 | gilt die Aenderung von dem Lebewesen mit dem hoechsten Level. |
| 436 | |
| 437 | Wenn z.B. ein Spieler seine Geschwindigkeit fuer zwei Minuten auf 200% |
| 438 | und ein Monster sie fuer eine Minute auf 25% setzt, so ist sie eine Minute |
| 439 | lang 50% und die naechste Minute 200% bevor sie wieder auf 100% gesetzt |
| 440 | wird. |
| 441 | |
| 442 | SIEHE AUCH: ModifySkillAttribute |
| 443 | |
| 444 | Restriction Mappings |
| 445 | +++++++++++++++++++++ |
| 446 | |
| 447 | Mit Restriction Mappings koennen Einschraenkungen auesserst einfach |
| 448 | angegeben werden. In dem Mapping wird einfach nur angegeben, was durch |
| 449 | welchen Wert eingeschraenkt werden soll. Wenn z.B. mindestens Level 15 |
| 450 | und Intelligenz 10 verlangt wird, so ist das Mapping |
| 451 | ([P_LEVEL:15,A_INT:10]). Folgende Einschraenkungen koennen verlangt |
| 452 | werden: |
| 453 | |
| 454 | SIEHE AUCH: check_restrictions |
| 455 | |
| 456 | Einschraenkungen werden mit check_restrictions(spieler,mapping) |
| 457 | ueberprueft. Die Funktion liefert 0 zurueck wenn der Spieler alle |
| 458 | Einschraenkungen erfuellt und einen String mit der Begruendung, falls eine |
| 459 | Einschraenkung nicht erfuellt ist. |
| 460 | |
| 461 | Programmierrichtlinien |
| 462 | ======================= |
| 463 | |
| 464 | o In Spellbooks moeglichst oft Faktoren und Offsets beruecksichtigen. |
| 465 | o Die Skill-Attribute beruecksichtigen, falls moeglich. |
| 466 | o Alles Spells muessen eine Verzoegerungszeit haben, in der kein |
| 467 | weiterer Spell anwendbar ist. Hiervon kann es Ausnahmen geben, wenn |
| 468 | das Gildenkonzept es anders vorsieht (z.B. bei den Kaempfern) oder |
| 469 | sonst reguliert. |
| 470 | o Kostenlose Spells sollte es nicht geben. Falls doch, dann nur mit sehr |
| 471 | hoher Verzoegerungszeit, sonst lassen die Leute nur ihr Frontend |
| 472 | spielen. |
| 473 | o Jeder Skill sollte eine levelabhaengige maximale Faehigkeit haben. |
| 474 | D.h., wenn SI_DIFFICULTY gesetzt ist sollte der Wert groesser als |
| 475 | -100 sein. |
| 476 | o Spells duerfen nicht Monster beliebig hoher Staerke einfach |
| 477 | umhauen. Es sollte nur bis zu einer Maximalstaerke moeglich sein. |
| 478 | o Der Schaden, den ein Spruch bewirkt, darf von der Staerke nicht |
| 479 | groesser sein, als der, den eine Waffe mit WC 25*SP bewirken |
| 480 | wuerde. Auch hier sollte man ein wenig gesunden Menschenverstand |
| 481 | spielen lassen - es kommt auch immer drauf an, ob ein Angriff |
| 482 | magisch ist oder physikalisch. |
| 483 | o Die Heilung sollte nicht die dafuer noetigen SP ueberschreiten. |
| 484 | Ausnahmen fuer explizite Heilgilden (Klerus) kann es geben. |
| 485 | |
| 486 | Auswirkung von SI_DIFFICULTY |
| 487 | ----------------------------- |
| 488 | |
| 489 | Folgende Maximalwerte sind fuer SI_ABILITY bei den angegebenen Leveln |
| 490 | moeglich, wenn SI_DIFFICULTY auf den Wert in der linken Spalte gesetzt |
| 491 | ist. |
| 492 | |
| 493 | SIEHE AUCH: LimitAbility oder /std/living/skills::LimitAbility |
| 494 | |
| 495 | 5. Okt 2011 Gloinson |
| 496 | |