FUNKTION:
nomask public varargs
mixed DoAttackEvent(mixed enemy, int damage, mixed damage_type,
object weapon, mixed msgs, int spell)
IMPLEMENTIERT IN:
/std/living/combat.c
ARGUMENTE:
enemy : Angriffsobjekt (living) oder
Array aus Objekten fuer "Flaechenangriffe" (experimentell)
damage : Schadenswert des Angriffs analog Defend(E)
damage_type : Der Schadenstyp des Angriffs als String oder Array aus
Schadenstypen analog Defend(E)
weapon : (optional) Waffe die beim Angriff benutzt wird oder 0, wenn
der Angriff ohne Waffe erfolgt (etwa mit blossen Haenden)
msgs : (optional) Angriffsmessage als String im Stil von P_HANDS
(ohne fuehrendes Leerzeichen)
ODER Array aus 4 Strings oder 0 fuer die Standard-Texte.
Ist es ein Array, enthaelt das erste Element das 'Adverb' im
Sinne von P_HANDS, das zweite geht an den Angreifer, das
Dritte an das Opfer und das Vierte an alle anderen. Die
Strings haben ein Format analog den ET_SOUL Texten.
spell : (optional) Spelllevel des Angriffs, Standard 0.
RÜCKGABEWERT:
Die Funktion liefert ein Array oder einen int-Fehlercode zurueck.
Ist es ein Array, enthaelt es den tatsaechlich zugefuegten Schaden an
den Zielobjekten in Lebenspunkten. Das Array hat daher mindestens die
Groesse 1, wenn es nur ein 'enemy' Objekt gab. Richtet sich der An-
griff gegen mehrere Ziele muss Groesse und Reihenfolge des Rueckgabe-
arrays NICHT mit Groesse und Reihenfolge des Zielobjekt-Arrays ueber-
einstimmen! Siehe unten SCHADENSZUORDNUNG.
Ansonsten werden folgende Codes (aus sys/combat.h) zurueckgegeben:
ATTACK_ERROR (0) : Argumentfehler zu DoAttackEvent().
ATTACK_FORBIDDEN (-1): Angriff verboten.
ATTACK_DISABLED (-2): Angreifer ist gelaehmt.
ATTACK_NOVICTIM (-3): Angriffsziel existiert nicht.
ATTACK_NOLIVING (-4): Angriffsziel ist kein Lebewesen.
ATTACK_NOTREACHABLE (-5): Angriffsziel ist nicht im gleichen Raum.
ATTACK_VIC_GHOST (-6): Angriffsziel ist ein Geist.
ATTACK_VIC_INVINCIBLE (-7): Angriffsziel ist unangreifbar (Text).
ATTACK_CANCELLED (-42): Event wurde abgebrochen (Text).
BESCHREIBUNG:
Die Funktion erzeugt einen Angriff auf ein oder mehrere Lebewesen
(livings). Dabei wird ein ET_ATTACK Event erzeugt und ueber den
combat-Handler ausgewertet. Die Funktion wird normalerweise im Living
waehrend des Kampfes automatisch aufgerufen.
Es ist aber auch moeglich (und erwuenscht) diese Funktion auch aus
Spellbooks heraus aufzurufen. Der Vorteil ist dann, das der Angriff
aus dem Spellbook wie jeder andere Angriff verarbeitet wird und als
Event abgebrochen oder veraendert werden kann.
Richtet sich der Angriff gegen mehrere Zielobjekte, dann werden nur
die angegriffen, die tatsaechlich angegriffen werden koennen. Solange
mindestens eines der Opfer angegriffen werden kann, wird der Event
durchgefuehrt. Nur wenn kein Objekt angegriffen werden kann, wird
ein Fehlercode zurueckgegeben, der die jeweils letzte Ursache nennt,
warum der Angriff fehlschlug.
Nicht angreifen kann ein Lebewesen wenn:
- der Angriff verboten ist (Sanktion, o. ae.)
- der Angreifer gelaehmt ist (P_DISABLE_ATTACK)
- ein Spieler, wenn er Geist ist
Nicht angegriffen werden koennen folgende Objekte:
- Nicht-Lebewesen (Fackeln, andere Dinge)
- tote Lebewesen (P_GHOST gesetzt)
- unangreifbare Wesen (P_INVINCIBLE gesetzt)
- entfernte Wesen (nicht im gleichen Raum befindliche)
Gecheckt wird zusaetzlich:
- das P_NOMAGIC des oder der Opfer (NICHT P_NOMAGIC im Raum)
- P_BLIND des Angreifers (halbiert den Schaden)
- P_GHOST bei Spielern, falls der Spieler im Event stirbt
Ist der Angriff erfolgreich, werden die Meldungen ausgegeben. Wird
der Angriff abgebrochen (ET_ATTACK gecancelt), werden die Abbruch-
meldungen ebenfalls ausgegeben. Wirkt ein P_NOMAGIC Schutz des Opfers,
wird eine Standardmeldung ausgegeben, der Angriff wird aber zuende
gefuehrt. Ist das Opfer unangreifbar, wird ebenfalls eine Meldung
ausgegeben, in allen anderen Faellen NICHT.
Richtet sich der Angriff gegen mehrere Opfer und stirbt der
Angreifer waehrend des Angriffs, wird der Angriff normal zuende
gefuehrt, es werden jedoch eventuell verbleibende Opfer nicht mehr
getroffen.
P_NOMAGIC im Raum wird derzeit nicht gecheckt. Das ist Sache des
Aufrufers (z.B. macht das der Skillmaster fuer alle Spells).
DoAttackEvent() soll in Zukunft die einzige Methode darstellen einen
'Angriff' auf ein anderes Objekt durchzufuehren.
SCHADENSZUORDNUNG:
Richtet sich der Angriff gegen mehrere Opfer (enemy ist ein Array aus
Zielobjekten), dann ist das Rueckgabearray nicht zwangslaeufig gleich
gross oder in der gleichen Reihenfolge, da alle Nicht-Angreifbaren
Opfer bereits vorher aussortiert werden. Will man doch eine ganz
genaue Zuordnung zwischen angegriffenem Objekt und Rueckgabewerten
haben, muss man das 'enemy' Array als Referenz uebergeben. Dann er-
haelt man das Array so, wie es vom ET_ATTACK Event verwendet wurde.
Zu beachten ist dann allerdings, dass auch Nullen im 'enemy' Array
sein koennen, wenn/falls durch den Angriff ein NPC gestorben ist.
BEMERKUNG:
Die Funktion wird derzeit erprobt. Bitte aktuellen Status bei einem
Erzmagier erfragen.
Der Angriff auf mehrere Objekte ist experimentell.
BEISPIEL:
monster->DoAttackEvent(opfer, 42, DT_SLASH, 0, "mit Schafskaese", 0);
Erzeugt einen physischen (magielosen) Angriff vom Objekt 'monster' auf
Objekt 'opfer' ohne Waffe mit der Angriffsmeldung "mit Schafskaese",
Schaden 42, Schadenstyp DT_SLASH. Dabei wird ein ET_ATTACK Event aus-
geloest und verarbeitet. Die Funktion gibt zurueck, wieviel Schaden
der Angriff bei 'opfer' angerichtet wird, zum Beispiel:
({3})
oder warum der Angriff fehlgeschlagen ist, zum Beispiel:
ATTACK_VIC_INVINCIBLE
Weil 'opfer' unangreifbar ist. Die Meldungen wurden in diesem Fall
bereits ausgegeben.
SIEHE AUCH:
Defend(E), ET_ATTACK, P_HANDS, P_GHOST, P_BLIND, P_DISABLE_ATTACK,
P_ATTACK_RATE
|