#include <properties.h>#include <language.h>#include <attributes.h>#include <combat.h>#include <wizlevels.h>#include <new_skills.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | LICHTKUGEL "/gilden/files.abenteurer/lichtkugel" |
| #define | LICHTMASTER "/gilden/files.abenteurer/lichtmaster" |
Funktionen | |
| void | create () |
| int | schaetz (object caster, mapping sinfo) |
| int | kampfschrei (object caster, mapping sinfo) |
| int | ausweichen (object caster, mapping sinfo) |
| mixed | Deckung (int dam, mixed dam_type, mixed spell, object enemy) |
| int | identifiziere (object caster, mapping sinfo) |
| int | licht (object caster, mapping sinfo) |
| int | saeurestrahl (object caster, mapping sinfo) |
| int | feuerball (object caster, mapping sinfo) |
| int | pfeil (object caster, mapping sinfo) |
| int | schnell (object caster, mapping sinfo) |
Variablen | |
| inherit std | spellbook |
| #define LICHTKUGEL "/gilden/files.abenteurer/lichtkugel" |
Definiert in Zeile 36 der Datei ab_spells.c.
Wird benutzt von licht().
| #define LICHTMASTER "/gilden/files.abenteurer/lichtmaster" |
Definiert in Zeile 37 der Datei ab_spells.c.
Wird benutzt von licht().
| int ausweichen | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 257 der Datei ab_spells.c.
Benutzt ERFOLG, MISSERFOLG, P_TMP_DEFEND_HOOK und SpellSuccess().
00258 { 00259 if (!caster->InFight()) 00260 { 00261 write("Ausweichen ausserhalb eines Kampfes ist ziemlich sinnlos.\n"); 00262 return 0; 00263 } 00264 00265 if (caster->QueryProp(P_TMP_DEFEND_HOOK)) 00266 { 00267 write("Das geht momentan nicht, Du wunderst Dich wieso!\n"); 00268 return 0; 00269 } 00270 00271 if (SpellSuccess(caster,sinfo)<=0) 00272 return MISSERFOLG; 00273 00274 caster->SetProp(P_TMP_DEFEND_HOOK, ({ time()+4, this_object(), "Deckung" })); 00275 return ERFOLG; 00276 }

| void create | ( | ) |
Definiert in Zeile 42 der Datei ab_spells.c.
Benutzt AddSpell(), create(), DT_ACID, DT_FIRE, DT_MAGIC, FACTOR, MT_ANGRIFF, MT_HELLSICHT, MT_PSYCHO, OFFSET, P_GLOBAL_SKILLPROPS, P_LEVEL, SetProp(), SI_MAGIC_TYPE, SI_SKILLDAMAGE, SI_SKILLDAMAGE_BY_ROW, SI_SKILLDAMAGE_TYPE, SI_SKILLLEARN, SI_SKILLRESTR_LEARN, SI_SPELLFATIGUE und SP_NAME.
00042 { 00043 ::create(); 00044 SetProp(P_GLOBAL_SKILLPROPS, 00045 ([SI_SPELLFATIGUE:2, // 2 Sekunden kein neuer Spell 00046 SI_SKILLLEARN:5, // 0.05% pro 2 A_INT 00047 OFFSET(SI_SKILLLEARN):10 // plus 0.1% in jedem Fall 00048 ])); 00049 AddSpell("licht",5,4); 00050 AddSpell("schaetz",3, 00051 ([SI_SKILLRESTR_LEARN:([P_LEVEL:10]), 00052 SI_MAGIC_TYPE: ({ MT_HELLSICHT }), 00053 SP_NAME: "schaetz"])); 00054 AddSpell("pfeil",10, 00055 ([SI_SKILLRESTR_LEARN:([P_LEVEL:11]), 00056 // Um diesen Spruch lernen zu koennen muss 00057 // der Level mindestens 11 sein 00058 SI_SKILLDAMAGE:200, 00059 // Schaden: Random(200) ... 00060 SI_SKILLDAMAGE_TYPE:DT_MAGIC, 00061 // Damage Type: Magic 00062 SI_MAGIC_TYPE: ({ MT_ANGRIFF }), 00063 SP_NAME: "pfeil", 00064 // Boni für hintere Kampfreihen 00065 SI_SKILLDAMAGE_BY_ROW: ([2:110,3:50,4:10]), 00066 OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:50,3:20,4:5]) 00067 ])); 00068 AddSpell("ausweichen", 10, 12); 00069 AddSpell("kampfschrei", 30, 00070 ([SI_SKILLRESTR_LEARN:([P_LEVEL:13]), 00071 SI_MAGIC_TYPE: ({ MT_PSYCHO }), 00072 SP_NAME: "kampfschrei"])); 00073 AddSpell("identifiziere",10, 00074 ([SI_SKILLRESTR_LEARN:([P_LEVEL:8]), 00075 SI_MAGIC_TYPE: ({ MT_HELLSICHT }), 00076 SP_NAME: "identifiziere"])); 00077 AddSpell("feuerball",20, 00078 ([SI_SKILLRESTR_LEARN:([P_LEVEL:15]), 00079 SI_SKILLDAMAGE:300, 00080 // Schaden: Random(300) ... 00081 OFFSET(SI_SKILLDAMAGE):100, 00082 // ... plus 100 00083 SI_SKILLDAMAGE_TYPE:DT_FIRE, 00084 // Damage Type: Fire 00085 SI_MAGIC_TYPE: ({ MT_ANGRIFF }), 00086 SP_NAME: "feuerball", 00087 SI_SKILLDAMAGE_BY_ROW: ([2:80,3:150,4:80,5:20]), 00088 OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:30,3:80,4:30,5:10]) 00089 ])); 00090 AddSpell("schnell",100,17); 00091 AddSpell("saeurestrahl",25, 00092 ([SI_SKILLRESTR_LEARN:([P_LEVEL:30]), 00093 OFFSET(SI_SKILLLEARN):1, 00094 FACTOR(SI_SKILLLEARN):20, 00095 SI_SKILLDAMAGE:400, 00096 // Schaden: Random(400) ... 00097 OFFSET(SI_SKILLDAMAGE):200, 00098 // ... plus 200 00099 SI_SKILLDAMAGE_TYPE:DT_ACID, 00100 // Damage Type: Saeure 00101 SI_MAGIC_TYPE: ({ MT_ANGRIFF }), 00102 SP_NAME: "saeurestrahl", 00103 SI_SKILLDAMAGE_BY_ROW:([2:60,3:150,4:210,5:150,6:60]), 00104 OFFSET(SI_SKILLDAMAGE_BY_ROW):([2:30,3:80,4:120,5:80,6:30]) 00105 ])); 00106 00107 }

| mixed Deckung | ( | int | dam, | |
| mixed | dam_type, | |||
| mixed | spell, | |||
| object | enemy | |||
| ) |
Definiert in Zeile 278 der Datei ab_spells.c.
Benutzt P_TMP_DEFEND_HOOK, PHYSICAL_DAMAGE_TYPES und QueryProp().
00279 { 00280 if (!pointerp(dam_type)) 00281 dam_type = ({ dam_type }); 00282 if (sizeof(dam_type & m_indices(PHYSICAL_DAMAGE_TYPES))) 00283 { 00284 tell_object(previous_object(), "Du weichst gekonnt aus.\n"); 00285 if (previous_object()->QueryProp(P_TMP_DEFEND_HOOK)[1] == this_object()) 00286 previous_object()->SetProp(P_TMP_DEFEND_HOOK, 0); 00287 return 0; 00288 } 00289 tell_object(previous_object(), "Dein Ausweichversuch ist vergebens.\n"); 00290 return ({ dam, dam_type, spell, enemy }); 00291 }

| int feuerball | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 396 der Datei ab_spells.c.
Benutzt ERFOLG, FindEnemyVictim(), hands, MISSERFOLG, SI_SKILLARG, SP_NAME, SP_SHOW_DAMAGE, SpellDefend(), SpellSuccess(), TryDefaultAttackSpell() und WEM.
00396 { 00397 object victim; 00398 int hands; 00399 string vnw; 00400 int suc; 00401 00402 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster, 00403 "Auf wen willst Du einen Feuerball schleudern?\n"); 00404 if (!victim) 00405 return 0; 00406 if ((suc=SpellSuccess(caster,sinfo))<=0) 00407 return MISSERFOLG; 00408 if (suc < victim->SpellDefend(caster, sinfo)) 00409 { 00410 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n"); 00411 return ERFOLG; 00412 } 00413 00414 vnw = victim->name(WEM, 2); 00415 say(sprintf("%s wirft einen Feuerball nach %s.\n", 00416 caster->Name(), vnw), victim); 00417 printf("Du wirfst einen Feuerball nach %s.\n", vnw); 00418 tell_object(victim, sprintf("%s wirft einen Feuerball nach Dir.\n", 00419 caster->Name())); 00420 00421 TryDefaultAttackSpell(victim,caster,sinfo, 00422 ([SP_NAME:"Feuerball", SP_SHOW_DAMAGE:1])); 00423 00424 return ERFOLG; 00425 }

| int identifiziere | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 294 der Datei ab_spells.c.
Benutzt break_string(), ERFOLG, FindVictim(), info, MISSERFOLG, ob(), P_INFO, P_PLURAL, result(), SI_SKILLARG, SpellDefend(), SpellSuccess(), WEM und WEN.
00294 { 00295 object ob; 00296 string* fi; 00297 string cn; 00298 string result, info; 00299 int suc; 00300 ob=FindVictim(sinfo[SI_SKILLARG], caster, 00301 "Was moechtest Du identifizieren?\n"); 00302 if (!ob) 00303 return 0; 00304 00305 cn = caster->name(); 00306 if ((suc=SpellSuccess(caster,sinfo))<=0) 00307 return MISSERFOLG; 00308 if (suc < ob->SpellDefend(caster, sinfo)) 00309 { 00310 tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n"); 00311 return ERFOLG; 00312 } 00313 00314 result="Du identifizierst "+ob->name(WEN,1)+". " 00315 +capitalize(ob->QueryPronoun()) 00316 +" besteh" 00317 +(ob->QueryProp(P_PLURAL) ? "en" : "t") 00318 +" aus " 00319 +(ob->MaterialList(WEM, caster))+". "; 00320 if (info=ob->QueryProp(P_INFO)) 00321 result+="Ausserdem bemerkst Du folgendes:\n"+info; 00322 else result+="Du kannst sonst nichts besonderes an "+ob->QueryPronoun(WEM) 00323 +" erkennen."; 00324 write(break_string(result, 78, 0, 1)); 00325 /* 00326 if (result=ob->QueryProp(P_INFO)) 00327 printf("Du identifizierst %s.\n%s", ob->name(WEN, 1), result); 00328 else 00329 printf("Du kannst nichts besonderes an %s erkennen.\n", ob->name(WEM, 1)); 00330 */ 00331 return ERFOLG; 00332 }

| int kampfschrei | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 208 der Datei ab_spells.c.
Benutzt break_string(), cmdline(), ERFOLG, F_MODE_AS, FindEnemyVictim(), MISSERFOLG, ob(), P_LEVEL, SA_SPEED, SAVE, SI_SKILLARG, SpellDefend() und SpellSuccess().
00209 { 00210 object ob; 00211 string cmdline, meldung; 00212 int suc, dauer; 00213 00214 cmdline = this_player()->_unparsed_args(); 00215 if (cmdline) 00216 { 00217 if (sscanf(cmdline, "meldung %s", meldung)) 00218 { 00219 caster->Set("ab_kampfschrei", SAVE, F_MODE_AS); 00220 caster->SetProp("ab_kampfschrei", meldung); 00221 printf("Dein Kampfschrei ist jetzt: %s\n", meldung); 00222 return 0; 00223 } 00224 } 00225 ob = FindEnemyVictim(sinfo[SI_SKILLARG], caster, 00226 "Wem willst Du Deinen Kampfschrei entgegenschleudern?\n"); 00227 00228 if (!ob) 00229 return 0; 00230 00231 if ((suc=SpellSuccess(caster, sinfo)) <= 0) 00232 return MISSERFOLG; 00233 if (suc < ob->SpellDefend(caster, sinfo)) 00234 { 00235 tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n"); 00236 return ERFOLG; 00237 } 00238 00239 meldung = caster->QueryProp("ab_kampfschrei"); 00240 if (!meldung) 00241 meldung = "Aaaaaaaiiiiieeeeeeeeeeeeeeeehhhhhhhhhhhhhhh!!!!!!!\n"; 00242 00243 write(break_string(meldung, 78, "Du kreischst: ")); 00244 tell_room(environment(caster), 00245 break_string(meldung, 78, caster->Name()+" kreischt: "), 00246 ({caster})); 00247 tell_object(ob, "Du fuehlst Dich wie gelaehmt.\n"); 00248 00249 dauer = 1 + (suc/1000 + random(caster->QueryProp(P_LEVEL)/2))/2; 00250 if (dauer>25) 00251 dauer = 25; 00252 ob->ModifySkillAttribute(caster, SA_SPEED, 50, dauer); 00253 00254 return ERFOLG; 00255 }

| int licht | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 335 der Datei ab_spells.c.
Benutzt ERFOLG, LICHTKUGEL, LICHTMASTER, MISSERFOLG, P_LEVEL und SpellSuccess().
00336 { 00337 object l; 00338 00339 printf("Du machst eine magische Bewegung.\n"); 00340 say(sprintf("%s macht eine magische Bewegung.\n", 00341 capitalize(caster->name()))); 00342 00343 if (SpellSuccess(caster,sinfo)<=0) 00344 return MISSERFOLG; 00345 00346 l = clone_object(LICHTKUGEL); 00347 if (l->move(this_player()) > 0) 00348 { 00349 LICHTMASTER->add_kugel(l, caster->QueryProp(P_LEVEL)*20); 00350 printf("Wie aus dem Nichts erscheint eine leuchtende Kugel.\n"); 00351 } 00352 else 00353 { 00354 l->remove(); 00355 printf("Eine Lichtkugel erscheint, zerplatzt aber sofort mit einem sanften 'plopp'.\n"); 00356 } 00357 00358 return ERFOLG; 00359 }

| int pfeil | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 428 der Datei ab_spells.c.
Benutzt ERFOLG, FindEnemyVictim(), hands, MISSERFOLG, SI_SKILLARG, SP_NAME, SP_SHOW_DAMAGE, SpellDefend(), SpellSuccess(), TryDefaultAttackSpell() und WEN.
00428 { 00429 object victim; 00430 int hands; 00431 string vn, vnw, cn; 00432 int suc; 00433 00434 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster, 00435 "Nach wem willst Du einen magischen Pfeil werfen?\n"); 00436 if (!victim) 00437 return 0; 00438 if ((suc=SpellSuccess(caster,sinfo))<=0) 00439 return MISSERFOLG; 00440 if (suc < victim->SpellDefend(caster, sinfo)) 00441 { 00442 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n"); 00443 return ERFOLG; 00444 } 00445 00446 cn = caster->Name(); 00447 vnw = victim->name(WEN, 2); 00448 say(sprintf("%s feuert einen magischen Pfeil auf %s ab.\n",cn, vnw), 00449 victim); 00450 printf("Du feuerst einen magischen Pfeil auf %s ab.\n", vnw); 00451 tell_object(victim,sprintf("%s feuert einen magischen Pfeil auf Dich ab.\n", 00452 cn)); 00453 TryDefaultAttackSpell(victim,caster,sinfo, 00454 ([SP_NAME:"Pfeil", SP_SHOW_DAMAGE:1])); 00455 return ERFOLG; 00456 }

| int saeurestrahl | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 362 der Datei ab_spells.c.
Benutzt break_string(), ERFOLG, FindEnemyVictim(), hands, MISSERFOLG, SI_SKILLARG, SP_NAME, SP_SHOW_DAMAGE, SpellDefend(), SpellSuccess(), TryDefaultAttackSpell() und WEN.
00362 { 00363 object victim; 00364 int hands; 00365 string vnw; 00366 int suc; 00367 00368 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster, 00369 "Wen willst Du mit einem Saeurestrahl beschiessen?\n"); 00370 if (!victim) 00371 return 0; 00372 if ((suc=SpellSuccess(caster,sinfo))<=0) 00373 return MISSERFOLG; 00374 if (suc < victim->SpellDefend(caster, sinfo)) 00375 { 00376 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n"); 00377 return ERFOLG; 00378 } 00379 00380 vnw = victim->name(WEN, 2); 00381 say(break_string( 00382 sprintf( 00383 "%s fuchtelt seltsam in der Luft herum und schiesst einen Saeurestrahl auf %s.\n", 00384 caster->Name(), vnw), 78), victim); 00385 printf("Du schiesst einen Saeurestrahl auf %s.\n", vnw); 00386 tell_object(victim, sprintf("%s schiesst einen Saeurestrahl auf Dich.\n", 00387 caster->Name())); 00388 00389 TryDefaultAttackSpell(victim,caster,sinfo, 00390 ([SP_NAME:"Saeurestrahl", SP_SHOW_DAMAGE:1])); 00391 00392 return ERFOLG; 00393 }

| int schaetz | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 110 der Datei ab_spells.c.
Benutzt ERFOLG, FindLivingVictim(), MISSERFOLG, P_HP, P_TOTAL_AC, P_TOTAL_WC, result(), SI_SKILLARG, SpellDefend(), SpellSuccess(), WEM, WER und WESSEN.
00110 { 00111 object victim; 00112 int hpdiff, wcdiff, acdiff; 00113 int hp, vhp, wc, vwc, ac, vac; 00114 string result; 00115 string vname, vnamegen; 00116 int suc; 00117 00118 victim=FindLivingVictim(sinfo[SI_SKILLARG],caster, 00119 "Wen moechtest Du einschaetzen?\n"); 00120 if (!victim) 00121 return 0; 00122 if ((suc=SpellSuccess(caster,sinfo))<=0) 00123 return MISSERFOLG; 00124 if (suc < victim->SpellDefend(caster, sinfo)) 00125 { 00126 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n"); 00127 return ERFOLG; 00128 } 00129 00130 hp = caster->QueryProp(P_HP); vhp = victim->QueryProp(P_HP); 00131 wc = caster->QueryProp(P_TOTAL_WC); vwc = victim->QueryProp(P_TOTAL_WC); 00132 ac = caster->QueryProp(P_TOTAL_AC); vac = victim->QueryProp(P_TOTAL_AC); 00133 hpdiff = hp - vhp; 00134 wcdiff = wc - vwc; 00135 acdiff = ac - vac; 00136 vname = victim->name(WER, 1); 00137 vnamegen = victim->name(WESSEN, 1); 00138 00139 if (hpdiff > 10*vhp) 00140 result = capitalize(victim->name(WER, 1))+" sollte sich besser schon mal einen Sarg besorgen.\n"; 00141 else if (hpdiff > 7*vhp) 00142 result = "Du bist " + victim->name(WEM, 1) + " haushoch ueberlegen.\n"; 00143 else if (hpdiff > 4*vhp) 00144 result = "Du bist sehr viel staerker als " + vname + ".\n"; 00145 else if (hpdiff > 2*vhp) 00146 result = "Du bist viel staerker als " + vname + ".\n"; 00147 else if (2*hpdiff > 3*vhp) 00148 result = "Du bist spuerbar staerker als " + vname + ".\n"; 00149 else if (hpdiff > vhp) 00150 result = "Du bist staerker als " + vname + ".\n"; 00151 else if (hpdiff > vhp/5) 00152 result = "Du bist etwas staerker als " + vname + ".\n"; 00153 else if (-hpdiff > 10*hp) 00154 result = "Besorg Dir besser schon mal einen Sarg.\n"; 00155 else if (-hpdiff > 7*hp) 00156 result = capitalize(vname) + " ist Dir haushoch ueberlegen.\n"; 00157 else if (-hpdiff > 4*hp) 00158 result = capitalize(vname) + " ist sehr viel staerker als Du.\n"; 00159 else if (-hpdiff > 2*hp) 00160 result = capitalize(vname) + " ist viel staerker als Du.\n"; 00161 else if (-2*hpdiff > 3*hp) 00162 result = capitalize(vname) + " ist spuerbar staerker als Du.\n"; 00163 else if (-hpdiff > hp) 00164 result = capitalize(vname) + " ist staerker als Du.\n"; 00165 else if (-hpdiff > hp/5) 00166 result = capitalize(vname) + " ist etwas staerker als Du.\n"; 00167 else 00168 result = capitalize(vname) + " ist etwa gleich stark wie Du.\n"; 00169 write(result); 00170 00171 if (acdiff > 2*vac) 00172 result = "Deine Ruestung ist unglaublich viel besser als die " 00173 + vnamegen + ".\n"; 00174 else if (acdiff > vac) 00175 result = "Deine Ruestung ist viel besser als die " + vnamegen + ".\n"; 00176 else if (acdiff >vac/5) 00177 result = "Deine Ruestung ist besser als die " + vnamegen + ".\n"; 00178 else if (-acdiff > 2*ac) 00179 result = "Die Ruestung " + vnamegen 00180 + " ist unglaublich viel besser als Deine.\n"; 00181 else if (-acdiff > ac) 00182 result = "Die Ruestung " + vnamegen + " ist viel besser als Deine.\n"; 00183 else if (-acdiff > ac/5) 00184 result = "Die Ruestung " + vnamegen + " ist besser als Deine.\n"; 00185 else 00186 result = "Eure Ruestungen sind etwa gleich gut.\n"; 00187 write(result); 00188 00189 if (wcdiff > 2*vwc) 00190 result = "Deine Waffe ist eigentlich zu gut fuer diesen Gegner.\n"; 00191 else if (wcdiff > vwc) 00192 result = "Deine Waffe ist viel besser als die " +vnamegen + ".\n"; 00193 else if (wcdiff > vwc/5) 00194 result = "Deine Waffe ist besser als die " +vnamegen + ".\n"; 00195 else if (-wcdiff > 2*wc) 00196 result = "Die Waffe " + vnamegen 00197 + " laesst Deine ganz mickrig aussehen.\n"; 00198 else if (-wcdiff > wc) 00199 result = "Die Waffe " + vnamegen + " ist viel besser als Deine.\n"; 00200 else if (-wcdiff > wc/5) 00201 result = "Die Waffe " + vnamegen + " ist besser als Deine.\n"; 00202 else 00203 result = "Eure Waffen sind etwa gleich gut.\n"; 00204 write(result); 00205 return ERFOLG; 00206 }

| int schnell | ( | object | caster, | |
| mapping | sinfo | |||
| ) |
Definiert in Zeile 459 der Datei ab_spells.c.
Benutzt A_DEX, ERFOLG, MISSERFOLG, SA_SPEED, SI_SKILLABILITY und SpellSuccess().
00459 { 00460 int dauer; 00461 00462 if (SpellSuccess(caster,sinfo)<=0) 00463 return MISSERFOLG; 00464 write("Du fuehlst Dich ploetzlich deutlich schneller.\n"); 00465 dauer = 2 * (caster->QueryAttribute(A_DEX) + 00466 random(sinfo[SI_SKILLABILITY]/1000)); 00467 if (dauer>60) 00468 dauer = 60; 00469 caster->ModifySkillAttribute(caster,SA_SPEED,200,dauer); 00470 00471 return ERFOLG; 00472 }

| inherit std spellbook |
Definiert in Zeile 39 der Datei ab_spells.c.
Wird benutzt von QuerySpell() und UseSpell().
1.6.3