AddSpell: Defend() nur bei Schaden > 0.
Defend() wird nur gerufen, wenn der eingetragene
Schaden >0 ist. Ist ist nicht der Fall, wird nur
die Funktion/Closure fuer den Spell gerufen. In
diesem Fall ist diese nicht-optional.
Change-Id: I78ac3cfc5fffa8179fd0c53bc4963b60d5f5dc66
diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index 602292f..2ac4932 100644
--- a/doc/sphinx/lfun/AddSpell.rst
+++ b/doc/sphinx/lfun/AddSpell.rst
@@ -22,7 +22,8 @@
rate - Relative Haeufigkeit der Anwendung (*),
muss >= 0 sein
damage - Der Schadenswert fuer Defend(),
- muss > 0 sein
+ muss >= 0 sein. Bei Schaden von 0 MUSS eine Funktion
+ eingetragen werden.
TextForEnemy - Text, den der Feind erhalten soll
TextForOthers - Text, den andere im Raum erhalten sollen
dam_type - Schadenstyp(en) fuer Defend(),
diff --git a/std/npc/combat.c b/std/npc/combat.c
index e209967..f49a3c2 100644
--- a/std/npc/combat.c
+++ b/std/npc/combat.c
@@ -193,6 +193,14 @@
}
}
+ if(damage==0 && !closurep(cl))
+ {
+ catch(raise_error(
+ "AddSpell(): Bei damage=0 muss eine Funktion eingetragen werden.");
+ publish);
+ return 0;
+ }
+
// Falls vorhanden, alte Syntax auf die von replace_personal() anpassen,
// die im heart_beat() beim Ausgeben der Meldung verwendet wird.
if ( strstr(TextForOthers, "@", 0) != -1 )
@@ -345,10 +353,15 @@
({ enemy, this_object()}));
return ;
}
- int damage = random(spells[i][SPELL_DAMAGE])+1;
- enemy->Defend(damage, spells[i][SPELL_DAMTYPE],
- spells[i][SPELL_ARG],
- this_object());
+ int damage;
+ // Bei 0 sparen wir uns das Defend() und rufen nur die Funktion auf.
+ if(spells[i][SPELL_DAMAGE])
+ {
+ damage=random(spells[i][SPELL_DAMAGE])+1;
+ enemy->Defend(damage, spells[i][SPELL_DAMTYPE],
+ spells[i][SPELL_ARG],
+ this_object());
+ }
// Falls der Gegner (oder wir) im Defend stirbt, hier abbrechen
if ( !objectp(ME) || !objectp(enemy)