blob: 1683b3f35ebd5ccc2d4925a3c3d480e1ae3ac7e5 [file] [log] [blame]
DefendFunc()
************
DefendFunc(L)
=============
FUNKTION
========
int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);
DEFINIERT IN
============
eigenen Objekten; fuer /std/armour/combat.c
ARGUMENTE
=========
dtyp
Schadenstypen der Angriffsart.
Sollte heute ein string* sein.
spell
0 bei veralteten konventionellen Angriffen im Regelfall jedoch
ein Mapping mit weiteren Infos.
Bei einem konventionellen Angriff ist spell[SP_PHYSICAL_ATTACK] gleich
1.
enemy
Der angreifende Gegner
BESCHREIBUNG
============
Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus (oder
auch ein Ruestungsmalus) errechnet werden, der zu dem normalen
Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert wird.
RUeCKGABEWERT
=============
Der Ruestungsbonus, der zur Ruestungsklasse addiert werden soll.
BEMERKUNGEN
===========
Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen
die DefendFuncs nicht konstant wirken.
Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.
BEISPIELE
=========
Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
und bei Angriffen durch Geister geschwaecht wird:
void create()
{
::create();
SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
SetProp(P_AC, 20);
...
// Die DefendFunc() ist in der Ruestung selbst definiert
SetProp(P_DEFEND_FUNC, this_object());
}
int DefendFunc(string *dtyp, mixed spell, object enemy)
{
int prot;
// Zuerst fragen wir den Angriff durch Feuer ab:
if (member(dtyp, DT_FIRE) >= 0) // Feuer gehoert zu den Schadenstypen
prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
// kommt man also maximal auf 14+20 = 34,
// liegt also unter der fuer AT_ARMOUR
// geltenden Obergrenze
// Und jetzt der Geistertest
if (enemy->QueryProp(P_RACE) == "Geist" ||
enemy->is_class_member(CL_GHOST))
prot -= random(10);
// Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
return prot;
}
SIEHE AUCH
==========
P_DEFEND_FUNC, QueryDefend(), /std/armour/combat.c
Last modified: 18.Jul 2006 Muadib