| DefendFunc() |
| ************ |
| |
| |
| FUNKTION |
| ======== |
| |
| public int DefendFunc(string* dtyp, mapping spell, object enemy); |
| |
| |
| DEFINIERT IN |
| ============ |
| |
| Eigenen Objekten; fuer /std/armour/combat.c |
| |
| |
| ARGUMENTE |
| ========= |
| |
| dtyp |
| Schadenstypen der Angriffsart. |
| |
| spell |
| 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. Ausserdem sind solche Ruestungen |
| immer genehmigungspflichtig. |
| |
| 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: |
| |
| protected 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()); |
| } |
| |
| public int DefendFunc(string* dtyp, mapping 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 |