blob: 463f77c4158766d18e4026413c335b984668be8d [file] [log] [blame]
MG Mud User3c1f5a82016-06-25 09:57:34 +02001/* Gildenobjekt fuer Abenteurer - MorgenGrauen */
2/* Boing, 1993-1998 */
3/* Sprueche:
4 Lichtkugel herbeizaubern: licht
5 Magiepunkte 5, Stufe 4
6 Dauer: Level * 20 Sekunden
7 Identifizieren: identifiziere
8 Magiepunkte 10, Stufe 3
9 Monster einschaetzen: schaetz <name>
10 Magiepunkte 3, Stufe 10
11 Pfeilangriff: pfeil <name>
12 Schaden maximal 20, Magiepunkte 10, Stufe 11
13 Gegenstaende untersuchen: identifiziere <objekt>
14 Wenn P_INFO exisitiert, wird dies ausgegeben
15 Magiepunkte 10, stufe 8
16 Ausweichen: ausweichen
17 Geht nur im Kampf, genau einer Attacke wird ausgewichen.
18 Magiepunkte 10, Stufe 12
19 Kampfschrei: kampfschrei <opfer> bzw. kampfschrei meldung <meldung>
20 Der Kampfschrei wird ausgestossen und verlangsamt den Gegner.
21 Magiepunkte 30, stufe 13
22 Feuerball: feuerball <name>
23 Schaden maximal 40, Magiepunkte 20, Stufe 15
24 Schnelligkeit: schnell
25 Gibt fuer eine bestimmte Zeit zusaetzliche Angriffe
26 Magiepunkte 100, Stufe 17
27 Saeurestrahl: saeurestrahl <name>
28 Schaden maximal 60, Magiepunkte 25, Stufe 30
29*/
30
31#include <properties.h>
32#include <language.h>
33#include <attributes.h>
34#include <combat.h>
35#include <wizlevels.h>
36#include <new_skills.h>
Bugfixba09bfd2022-10-06 11:01:32 +020037#include <hook.h>
MG Mud User3c1f5a82016-06-25 09:57:34 +020038
39#define LICHTKUGEL "/gilden/files.abenteurer/lichtkugel"
40
41inherit "/std/spellbook";
42
Bugfixba09bfd2022-10-06 11:01:32 +020043public <int|<int|string*|mapping|object>*>* Deckung(object caster,
44 int hookid, <int|string*|mapping|object>* data);
45
MG Mud User3c1f5a82016-06-25 09:57:34 +020046void create() {
47 ::create();
48 SetProp(P_GLOBAL_SKILLPROPS,
49 ([SI_SPELLFATIGUE:2, // 2 Sekunden kein neuer Spell
50 SI_SKILLLEARN:5, // 0.05% pro 2 A_INT
51 OFFSET(SI_SKILLLEARN):10 // plus 0.1% in jedem Fall
52 ]));
53
54 AddSpell("steinschlag",5,
55 ([SI_SKILLRESTR_LEARN:([P_LEVEL:1]),
56 SI_SKILLDAMAGE:40,
57 OFFSET(SI_SKILLDAMAGE):40,
58 SI_SKILLDAMAGE_TYPE: ({DT_BLUDGEON}),
59 SI_MAGIC_TYPE:({MT_ANGRIFF}),
60 SI_SPELL:([SP_NAME:"steinschlag"])]));
61
62 AddSpell("identifiziere",10,
63 ([SI_SKILLRESTR_LEARN:([P_LEVEL:3]),
64 SI_MAGIC_TYPE: ({ MT_HELLSICHT }),
65 SI_SPELL: ([P_NAME: "identifiziere"]),
66 ]) );
67 AddSpell("licht",5,
68 ([SI_SKILLRESTR_LEARN:([P_LEVEL:6]),
69 SI_SPELL: ([P_NAME: "licht"])
70 ]) );
71 AddSpell("schaetz",3,
72 ([SI_SKILLRESTR_LEARN:([P_LEVEL:8]),
73 SI_MAGIC_TYPE: ({ MT_HELLSICHT }),
74 SI_SPELL: ([SP_NAME: "schaetz"]),
75 ]));
76 AddSpell("pfeil",10,
77 ([SI_SKILLRESTR_LEARN:([P_LEVEL:10]),
78 // Um diesen Spruch lernen zu koennen muss
79 // der Level mindestens 11 sein
80 SI_SKILLDAMAGE:200,
81 // Schaden: Random(200) ...
82 SI_SKILLDAMAGE_TYPE:({DT_MAGIC}),
83 // Damage Type: Magic
84 SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
85 SI_SPELL: ([ SP_NAME: "pfeil" ]),
Zesstra1c7da1d2019-10-24 23:01:15 +020086 // Boni für hintere Kampfreihen
MG Mud User3c1f5a82016-06-25 09:57:34 +020087 SI_SKILLDAMAGE_BY_ROW: ([2:110,3:50,4:10]),
88 OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:50,3:20,4:5])
89 ]));
90 AddSpell("ausweichen", 10,
91 ([SI_SKILLRESTR_LEARN:([P_LEVEL:13]),
92 SI_SPELL: ([P_NAME: "ausweichen"]),
93 ]));
94 AddSpell("kampfschrei", 30,
95 ([SI_SKILLRESTR_LEARN:([P_LEVEL:16]),
96 SI_MAGIC_TYPE: ({ MT_PSYCHO }),
97 SI_SPELL: ([SP_NAME: "kampfschrei"]),
98 ]));
99 AddSpell("feuerball",20,
100 ([SI_SKILLRESTR_LEARN:([P_LEVEL:18]),
101 SI_SKILLDAMAGE:300,
102 // Schaden: Random(300) ...
103 OFFSET(SI_SKILLDAMAGE):100,
104 // ... plus 100
105 SI_SKILLDAMAGE_TYPE:({DT_FIRE}),
106 // Damage Type: Fire
107 SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
108 SI_SPELL: ([SP_NAME: "feuerball"]),
109 SI_SKILLDAMAGE_BY_ROW: ([2:80,3:150,4:80,5:20]),
110 OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:30,3:80,4:30,5:10])
111 ]));
112 AddSpell("schnell",100,
113 ([SI_SKILLRESTR_LEARN:([P_LEVEL:21]),
114 SI_SPELL: ([P_NAME: "schnell"]) ]));
115 AddSpell("saeurestrahl",25,
116 ([SI_SKILLRESTR_LEARN:([P_LEVEL:28]),
117 OFFSET(SI_SKILLLEARN):1,
118 FACTOR(SI_SKILLLEARN):20,
119 SI_SKILLDAMAGE:400,
120 // Schaden: Random(400) ...
121 OFFSET(SI_SKILLDAMAGE):200,
122 // ... plus 200
123 SI_SKILLDAMAGE_TYPE:({DT_ACID}),
124 // Damage Type: Saeure
125 SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
126 SI_SPELL: ([SP_NAME: "saeurestrahl"]),
127 SI_SKILLDAMAGE_BY_ROW:([2:60,3:150,4:210,5:150,6:60]),
128 OFFSET(SI_SKILLDAMAGE_BY_ROW):([2:30,3:80,4:120,5:80,6:30])
129 ]));
130
131}
132
133int
134steinschlag(object caster, mapping sinfo) {
135 object victim;
Bugfixd8a984b2022-10-06 11:08:08 +0200136 string vnw, cn;
MG Mud User3c1f5a82016-06-25 09:57:34 +0200137 int suc;
138
139 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
140 "Ueber wem willst Du einen Steinschlag niedergehen lassen?\n");
141 if (!victim)
142 return 0;
143 if ((suc=SpellSuccess(caster,sinfo))<=0)
144 return MISSERFOLG;
145 if (suc < victim->SpellDefend(caster, sinfo))
146 {
147 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
148 return ERFOLG;
149 }
150
151 cn = caster->Name();
152 vnw = victim->name(WEN, 2);
153 say(sprintf("%s laesst kleine Kiesel auf %s fallen.\n",cn, vnw),
154 victim);
155 printf("Du konzentrierst Dich darauf, kleine Kiesel auf %s fallen zu lassen.\n", vnw);
156 tell_object(victim,sprintf("%s laesst kleine Kiesel auf Dich fallen.\n",
157 cn));
158 TryDefaultAttackSpell(victim,caster,sinfo,
159 ([SP_NAME:"steinschlag", SP_PHYSICAL_ATTACK:1,SP_SHOW_DAMAGE:1]));
160 return ERFOLG;
161}
162
163int
164schaetz(object caster, mapping sinfo) {
165 object victim;
166 int hpdiff, wcdiff, acdiff;
167 int hp, vhp, wc, vwc, ac, vac;
168 string result;
169 string vname, vnamegen;
170 int suc;
171
172 victim=FindLivingVictim(sinfo[SI_SKILLARG],caster,
173 "Wen moechtest Du einschaetzen?\n");
174 if (!victim)
175 return 0;
176 if ((suc=SpellSuccess(caster,sinfo))<=0)
177 return MISSERFOLG;
178 if (suc < victim->SpellDefend(caster, sinfo))
179 {
180 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
181 return ERFOLG;
182 }
183
184 hp = caster->QueryProp(P_HP); vhp = victim->QueryProp(P_HP);
185 wc = caster->QueryProp(P_TOTAL_WC); vwc = victim->QueryProp(P_TOTAL_WC);
186 ac = caster->QueryProp(P_TOTAL_AC); vac = victim->QueryProp(P_TOTAL_AC);
187 hpdiff = hp - vhp;
188 wcdiff = wc - vwc;
189 acdiff = ac - vac;
190 vname = victim->name(WER, 1);
191 vnamegen = victim->name(WESSEN, 1);
192
193 if (hpdiff > 10*vhp)
194 result = capitalize(victim->name(WER, 1))+" sollte sich besser schon mal einen Sarg besorgen.\n";
195 else if (hpdiff > 7*vhp)
196 result = "Du bist " + victim->name(WEM, 1) + " haushoch ueberlegen.\n";
197 else if (hpdiff > 4*vhp)
198 result = "Du bist sehr viel staerker als " + vname + ".\n";
199 else if (hpdiff > 2*vhp)
200 result = "Du bist viel staerker als " + vname + ".\n";
201 else if (2*hpdiff > 3*vhp)
202 result = "Du bist spuerbar staerker als " + vname + ".\n";
203 else if (hpdiff > vhp)
204 result = "Du bist staerker als " + vname + ".\n";
205 else if (hpdiff > vhp/5)
206 result = "Du bist etwas staerker als " + vname + ".\n";
207 else if (-hpdiff > 10*hp)
208 result = "Besorg Dir besser schon mal einen Sarg.\n";
209 else if (-hpdiff > 7*hp)
210 result = capitalize(vname) + " ist Dir haushoch ueberlegen.\n";
211 else if (-hpdiff > 4*hp)
212 result = capitalize(vname) + " ist sehr viel staerker als Du.\n";
213 else if (-hpdiff > 2*hp)
214 result = capitalize(vname) + " ist viel staerker als Du.\n";
215 else if (-2*hpdiff > 3*hp)
216 result = capitalize(vname) + " ist spuerbar staerker als Du.\n";
217 else if (-hpdiff > hp)
218 result = capitalize(vname) + " ist staerker als Du.\n";
219 else if (-hpdiff > hp/5)
220 result = capitalize(vname) + " ist etwas staerker als Du.\n";
221 else
222 result = capitalize(vname) + " ist etwa gleich stark wie Du.\n";
223 write(result);
224
225 if (acdiff > 2*vac)
226 result = "Deine Ruestung ist unglaublich viel besser als die "
227 + vnamegen + ".\n";
228 else if (acdiff > vac)
229 result = "Deine Ruestung ist viel besser als die " + vnamegen + ".\n";
230 else if (acdiff >vac/5)
231 result = "Deine Ruestung ist besser als die " + vnamegen + ".\n";
232 else if (-acdiff > 2*ac)
233 result = "Die Ruestung " + vnamegen
234 + " ist unglaublich viel besser als Deine.\n";
235 else if (-acdiff > ac)
236 result = "Die Ruestung " + vnamegen + " ist viel besser als Deine.\n";
237 else if (-acdiff > ac/5)
238 result = "Die Ruestung " + vnamegen + " ist besser als Deine.\n";
239 else
240 result = "Eure Ruestungen sind etwa gleich gut.\n";
241 write(result);
242
243 if (wcdiff > 2*vwc)
244 result = "Deine Waffe ist eigentlich zu gut fuer diesen Gegner.\n";
245 else if (wcdiff > vwc)
246 result = "Deine Waffe ist viel besser als die " +vnamegen + ".\n";
247 else if (wcdiff > vwc/5)
248 result = "Deine Waffe ist besser als die " +vnamegen + ".\n";
249 else if (-wcdiff > 2*wc)
250 result = "Die Waffe " + vnamegen
251 + " laesst Deine ganz mickrig aussehen.\n";
252 else if (-wcdiff > wc)
253 result = "Die Waffe " + vnamegen + " ist viel besser als Deine.\n";
254 else if (-wcdiff > wc/5)
255 result = "Die Waffe " + vnamegen + " ist besser als Deine.\n";
256 else
257 result = "Eure Waffen sind etwa gleich gut.\n";
258 write(result);
259 return ERFOLG;
260}
261
262int kampfschrei(object caster, mapping sinfo)
263{
264 object ob;
265 string cmdline, meldung;
266 int suc, dauer;
267
268 cmdline = this_player()->_unparsed_args();
269 if (cmdline)
270 {
271 if (sscanf(cmdline, "meldung %s", meldung))
272 {
273 caster->Set("ab_kampfschrei", SAVE, F_MODE_AS);
274 caster->SetProp("ab_kampfschrei", meldung);
275 printf("Dein Kampfschrei ist jetzt: %s\n", meldung);
276 return 0;
277 }
278 }
279 ob = FindEnemyVictim(sinfo[SI_SKILLARG], caster,
280 "Wem willst Du Deinen Kampfschrei entgegenschleudern?\n");
281
282 if (!ob)
283 return 0;
284
285 if ((suc=SpellSuccess(caster, sinfo)) <= 0)
286 return MISSERFOLG;
287 if (suc < ob->SpellDefend(caster, sinfo))
288 {
289 tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n");
290 return ERFOLG;
291 }
292
293 meldung = caster->QueryProp("ab_kampfschrei");
294 if (!meldung)
295 meldung = "Aaaaaaaiiiiieeeeeeeeeeeeeeeehhhhhhhhhhhhhhh!!!!!!!\n";
296
297 write(break_string(meldung, 78, "Du kreischst: "));
298 tell_room(environment(caster),
299 break_string(meldung, 78, caster->Name()+" kreischt: "),
300 ({caster}));
301 tell_object(ob, "Du fuehlst Dich wie gelaehmt.\n");
302
303 dauer = 1 + (suc/1000 + random(caster->QueryProp(P_LEVEL)/2))/2;
304 if (dauer>25)
305 dauer = 25;
306 ob->ModifySkillAttribute(SA_SPEED, -50, dauer);
307
308 return ERFOLG;
309}
310
311int ausweichen(object caster, mapping sinfo)
312{
313 if (!caster->InFight())
314 {
315 write("Ausweichen ausserhalb eines Kampfes ist ziemlich sinnlos.\n");
316 return 0;
317 }
318
MG Mud User3c1f5a82016-06-25 09:57:34 +0200319 if (SpellSuccess(caster,sinfo)<=0)
320 return MISSERFOLG;
321
Bugfixba09bfd2022-10-06 11:01:32 +0200322 int hres = caster->HRegisterToHook(
323 H_HOOK_DEFEND,
324 #'Deckung,
325 H_HOOK_GUILDPRIO(0),
326 H_HOOK_MODIFICATOR,
327 4);
328 if(hres != 1)
329 {
330 caster->ReceiveMsg(
331 "Das geht momentan nicht, Du wunderst Dich wieso!",
332 MT_NOTIFICATION,
333 MA_SPELL);
334 return 0;
335 }
336
MG Mud User3c1f5a82016-06-25 09:57:34 +0200337 return ERFOLG;
338}
339
Bugfixba09bfd2022-10-06 11:01:32 +0200340// Diese Funktion wird auch von d/inseln/tilly/volgonen/rooms/std/para_vulkan.c
341// verwendet und muss daher public sein.
342public <int|<int|string*|mapping|object>*>* Deckung(object caster,
343 int hookid, <int|string*|mapping|object>* data)
MG Mud User3c1f5a82016-06-25 09:57:34 +0200344{
Bugfixba09bfd2022-10-06 11:01:32 +0200345 if (sizeof(data[1] & m_indices(PHYSICAL_DAMAGE_TYPES)))
MG Mud User3c1f5a82016-06-25 09:57:34 +0200346 {
Bugfixba09bfd2022-10-06 11:01:32 +0200347 tell_object(caster, "Du weichst gekonnt aus.\n");
348 caster->HUnregisterFromHook(H_HOOK_DEFEND, #'Deckung);
349 return ({H_CANCELLED, data});
MG Mud User3c1f5a82016-06-25 09:57:34 +0200350 }
Bugfixba09bfd2022-10-06 11:01:32 +0200351 tell_object(caster, "Dein Ausweichversuch ist vergebens.\n");
352 return ({H_NO_MOD, data});
MG Mud User3c1f5a82016-06-25 09:57:34 +0200353}
354
355int
356identifiziere(object caster, mapping sinfo) {
357 object ob;
MG Mud User3c1f5a82016-06-25 09:57:34 +0200358 string result, info;
359 int suc;
360 ob=FindVictim(sinfo[SI_SKILLARG], caster,
361 "Was moechtest Du identifizieren?\n");
362 if (!ob)
363 return 0;
364
MG Mud User3c1f5a82016-06-25 09:57:34 +0200365 if ((suc=SpellSuccess(caster,sinfo))<=0)
366 return MISSERFOLG;
367 if (suc < ob->SpellDefend(caster, sinfo))
368 {
369 tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n");
370 return ERFOLG;
371 }
372
373 result="Du identifizierst "+ob->name(WEN,1)+". "
374 +capitalize(ob->QueryPronoun())
375 +" besteh"
376 +(ob->QueryProp(P_PLURAL) ? "en" : "t")
377 +" aus "
378 +(ob->MaterialList(WEM, caster))+". ";
379 if (info=ob->QueryProp(P_INFO))
380 result+="Ausserdem bemerkst Du folgendes:\n"+info;
381 else result+="Du kannst sonst nichts besonderes an "+ob->QueryPronoun(WEM)
382 +" erkennen.";
383 write(break_string(result, 78, 0, 1));
384 return ERFOLG;
385}
386
387int
388licht(object caster, mapping sinfo)
389{
390 object l;
391
392 tell_object(caster, "Du machst eine magische Bewegung.\n");
393 tell_room(environment(caster),
394 sprintf("%s macht eine magische Bewegung.\n",
395 capitalize(caster->name(WER))), ({caster}));
396
397 int suc=SpellSuccess(caster,sinfo);
398 if (suc<=0)
399 return MISSERFOLG;
400
401 l = clone_object(LICHTKUGEL);
402 if (l->move(this_player()) > 0)
403 {
404 int lvl;
405 // fuer Spruchrollen-Support.
406 if (!sinfo[SI_USR] || !(lvl=sinfo[SI_USR][P_LEVEL]) )
407 lvl = caster->QueryProp(P_LEVEL);
408 lvl = min(lvl,42);
409 // wenn der Spell nicht ganz so gut gelingt, ist die Kugel auch etwas
410 // dunkler.
411 if (suc<6000)
412 {
413 l->SetProp(P_LIGHT,1);
414 tell_object(caster,
415 "Wie aus dem Nichts erscheint eine leuchtende Kugel.\n");
416 }
417 else
418 tell_object(caster,
419 "Wie aus dem Nichts erscheint eine hell leuchtende Kugel.\n");
420 l->start_remove(lvl * 20 * min(suc+3333,10000) / 10000);
421 }
422 else
423 {
424 l->remove();
425 tell_object(caster,
426 "Eine Lichtkugel erscheint, zerplatzt aber sofort mit einem sanften 'plopp'.\n");
427 }
428
429 return ERFOLG;
430}
431
432int
433saeurestrahl(object caster, mapping sinfo) {
434 object victim;
MG Mud User3c1f5a82016-06-25 09:57:34 +0200435 string vnw;
436 int suc;
437
438 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
439 "Wen willst Du mit einem Saeurestrahl beschiessen?\n");
440 if (!victim)
441 return 0;
442 if ((suc=SpellSuccess(caster,sinfo))<=0)
443 return MISSERFOLG;
444 if (suc < victim->SpellDefend(caster, sinfo))
445 {
446 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
447 return ERFOLG;
448 }
449
450 vnw = victim->name(WEN, 2);
451 say(break_string(
452 sprintf(
453 "%s fuchtelt seltsam in der Luft herum und schiesst einen Saeurestrahl auf %s.\n",
454 caster->Name(), vnw), 78), victim);
455 printf("Du schiesst einen Saeurestrahl auf %s.\n", vnw);
456 tell_object(victim, sprintf("%s schiesst einen Saeurestrahl auf Dich.\n",
457 caster->Name()));
458
459 TryDefaultAttackSpell(victim,caster,sinfo,
460 ([SP_NAME:"Saeurestrahl", SP_SHOW_DAMAGE:1]));
461
462 return ERFOLG;
463}
464
465int
466feuerball(object caster, mapping sinfo) {
467 object victim;
MG Mud User3c1f5a82016-06-25 09:57:34 +0200468 string vnw;
469 int suc;
470
471 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
472 "Auf wen willst Du einen Feuerball schleudern?\n");
473 if (!victim)
474 return 0;
475 if ((suc=SpellSuccess(caster,sinfo))<=0)
476 return MISSERFOLG;
477 if (suc < victim->SpellDefend(caster, sinfo))
478 {
479 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
480 return ERFOLG;
481 }
482
483 vnw = victim->name(WEM, 2);
484 say(sprintf("%s wirft einen Feuerball nach %s.\n",
485 caster->Name(), vnw), victim);
486 printf("Du wirfst einen Feuerball nach %s.\n", vnw);
487 tell_object(victim, sprintf("%s wirft einen Feuerball nach Dir.\n",
488 caster->Name()));
489
490 TryDefaultAttackSpell(victim,caster,sinfo,
491 ([SP_NAME:"Feuerball", SP_SHOW_DAMAGE:1]));
492
493 return ERFOLG;
494}
495
496int
497pfeil(object caster, mapping sinfo) {
498 object victim;
Bugfixd8a984b2022-10-06 11:08:08 +0200499 string vnw, cn;
MG Mud User3c1f5a82016-06-25 09:57:34 +0200500 int suc;
501
502 victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
503 "Nach wem willst Du einen magischen Pfeil werfen?\n");
504 if (!victim)
505 return 0;
506 if ((suc=SpellSuccess(caster,sinfo))<=0)
507 return MISSERFOLG;
508 if (suc < victim->SpellDefend(caster, sinfo))
509 {
510 tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
511 return ERFOLG;
512 }
513
514 cn = caster->Name();
515 vnw = victim->name(WEN, 2);
516 say(sprintf("%s feuert einen magischen Pfeil auf %s ab.\n",cn, vnw),
517 victim);
518 printf("Du feuerst einen magischen Pfeil auf %s ab.\n", vnw);
519 tell_object(victim,sprintf("%s feuert einen magischen Pfeil auf Dich ab.\n",
520 cn));
521 TryDefaultAttackSpell(victim,caster,sinfo,
522 ([SP_NAME:"Pfeil", SP_SHOW_DAMAGE:1]));
523 return ERFOLG;
524}
525
526int
527schnell(object caster, mapping sinfo) {
528 int dauer;
529
530 if (SpellSuccess(caster,sinfo)<=0)
531 return MISSERFOLG;
532 write("Du fuehlst Dich ploetzlich deutlich schneller.\n");
533 dauer = 2 * (caster->QueryAttribute(A_DEX) +
534 random(sinfo[SI_SKILLABILITY]/1000));
535 if (dauer>60)
536 dauer = 60;
537 caster->ModifySkillAttribute(SA_SPEED, 100, dauer);
538
Zesstra47b7cdd2018-01-08 22:14:36 +0100539 call_out(function void (object pl)
540 {if (pl) tell_object(pl, "Du wirst wieder langsamer.\n"); },
541 dauer-__HEART_BEAT_INTERVAL__, caster);
542
MG Mud User3c1f5a82016-06-25 09:57:34 +0200543 return ERFOLG;
544}