| ModifySkillAttribute() |
| |
| FUNKTION: |
| public int ModifySkillAttribute(string atrname, mixed value, |
| int duration) |
| |
| DEFINIERT IN: |
| /std/living/skill_attributes.c |
| |
| ARGUMENTE: |
| <atrname> string |
| Name des zu veraendernden Attributes |
| (Definiert in /sys/living/skill_attributes.h) |
| |
| <value> int oder closure |
| Wert des Modifikators |
| oder |
| eine Closure, welche bei Abfrage des betreffenden SAs |
| abgefragt um den Modifikator zu bestimmen. |
| |
| <duration> int |
| Dauer in Sekunden |
| |
| BESCHREIBUNG: |
| Aendert temporaer, d.h. fuer eine bestimmte Zeit, ein Skill-Attribut eines |
| Lebewesen, indem ein Modifikator hinzugefuegt wird. |
| |
| Der Standardwert eines SA wird von P_SKILL_ATTRIBUTE_OFFSETS festgelegt |
| oder ist 100, wenn besagte Property leer ist. |
| Alle Modifikatoren (negativ wie positiv) werden addiert und bilden |
| zusammen mit dem Standardwert eine Gesamtsumme. |
| Bei allen SAs ausser SA_QUALITY wird diese Gesamtsumme noch mit |
| SA_QUALITY (welches sich damit auf alle anderen Skill-Attribute auswirkt) |
| multipliziert und das Ergebnis stellt den Endwert des SA dar. |
| (Beispiel s.u.) |
| |
| Der Wert eines Modifikators muss zwischen -1000 und 1000 liegen. Der |
| Gesamtwert eines SA kann 10 nicht unter- und 1000 nicht ueberschreiten. |
| |
| Falle <value> eine Closure ist, wird diese Closure jedesmal ausgefuehrt, |
| wenn das entsprechende SA abgefragt wird. Der Rueckgabewert dieser Closure |
| stellt dann den Wert des Modifikators dar. Auch dieser muss zwischen -1000 |
| und 1000 liegen. Gibt die Closure keinen int zurueck, wird der Modifikator |
| geloescht. |
| |
| Gueltige Skill-Attribute sind momentan: |
| * SA_QUALITY: Allgemeine Qualitaet |
| * SA_DAMAGE: Schaden, den das Lebewesen macht |
| * SA_SPEED: Geschwindigkeit des Lebewesens |
| * SA_DURATION: Spell-/Skilldauer |
| * SA_ENEMY_SAVE: identisch zu SA_SPELL_PENETRATION (OBSOLET!) |
| * SA_SPELL_PENETRATION: Chance des _Casters_, einen Spell durch ein |
| P_NOMAGIC durchzukriegen. |
| * SA_RANGE: Reichweite des Lebewesens (eher unbenutzt) |
| * SA_EXTENSION: "Ausdehnung" (unbenutzt) |
| |
| RUECKGABEWERT: |
| SA_MOD_OK wenn der Modifikator gesetzt wurde |
| SA_TOO_MANY_MODS wenn die max. Anzahl an Mods schon erreicht ist. |
| SA_MOD_TOO_SMALL wenn der Mod zu klein ist |
| SA_MOD_TOO_BIG wenn der Mod zu gross ist |
| SA_MOD_INVALID_ATTR wenn das gewuenschte SA gar nicht existiert |
| SA_MOD_INVALID_OBJECT wenn das setzende Objekt ungueltig ist |
| Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt es |
| sich, auf == SA_MOD_OK zu pruefen. |
| |
| BEMERKUNGEN: |
| Nachdem ein Objekt, welches Modifikatoren setzte, zerstoert wurde, werden |
| die Modifikatoren spaetestens ungueltig, sobald in dem manipulierten |
| Lebewesen erneut ModifySkillAttribute() gerufen wird! Bei Closures ist der |
| Mod sofort weg. |
| |
| BEISPIELE: |
| // sei PL ein Spieler, den mein NPC schwaechen will: |
| PL->ModifySkillAttribute(SA_QUALITY, -75, 13); |
| // Fuer 13s wird SA_QUALITY um 75 reduziert. Dies wirkt sich auf alle |
| // anderen SAs aus! (s. drittes Beispiel) |
| |
| // sei PL ein Lebewesen, welchem ich fuer 11s 2 Schlaege pro Kampfrunde |
| // zusaetzlich geben moechte: |
| PL->ModifySkillAttribute(SA_SPEED, 200, 11); |
| // wenn keine weiteres Modifikatoren wirken, hat PL jetzt 3 Schlaege pro |
| // Kampfrunde (Basiswert 100 + 200 == 300 => 3). |
| |
| Angenommen, ein Lebewesen hat einen Basiswert von 130 auf SA_SPEED und 100 |
| auf SA_QUALITY (P_SKILL_ATTRIBUTE_OFFSETS) und nun 3 Modifikatoren |
| gesetzt: SA_SPEED +100, SA_SPEED -30 und SA_QUALITY von -10: |
| Zunaechst wird SA_QUALITY bestimmt: 100 - 10 = 90 => 0.9 |
| Anschliessend wird SA_SPEED bestimmt: 130 + 100 - 30 = 200 => 2 |
| Nun wird SA_SPEED noch mit SA_QUALITY multipliziert: 2 * 0.9 = 1.8 |
| Das Lebewesen hat nun also im Endeffekt 1.8 Schlaege pro Kampfrunde. |
| |
| |
| SIEHE AUCH: |
| P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS, |
| QuerySkillAttribute(), QuerySkillAttributeModifier(), |
| RemoveSkillAttributeModifier() |
| |
| ----------------------------------------------------------------------------- |
| 07.08.2008, Zesstra |