MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | ModifySkillAttribute() |
| 2 | FUNKTION: |
| 3 | public int ModifySkillAttribute(string atrname, mixed value, |
| 4 | int duration) |
| 5 | |
| 6 | DEFINIERT IN: |
| 7 | /std/living/skill_attributes.c |
| 8 | |
| 9 | ARGUMENTE: |
| 10 | <atrname> string |
| 11 | Name des zu veraendernden Attributes |
| 12 | (Definiert in /sys/living/skill_attributes.h) |
| 13 | |
| 14 | <value> int oder closure |
| 15 | Wert des Modifikators |
| 16 | oder |
| 17 | eine Closure, welche bei Abfrage des betreffenden SAs |
| 18 | abgefragt um den Modifikator zu bestimmen. |
| 19 | |
| 20 | <duration> int |
| 21 | Dauer in Sekunden |
| 22 | |
| 23 | BESCHREIBUNG: |
| 24 | Aendert temporaer, d.h. fuer eine bestimmte Zeit, ein Skill-Attribut |
| 25 | eines Lebewesen, indem ein Modifikator hinzugefuegt wird. |
| 26 | |
| 27 | Der Standardwert eines SA wird von P_SKILL_ATTRIBUTE_OFFSETS festgelegt |
| 28 | oder ist 100, wenn besagte Property leer ist. |
| 29 | Alle Modifikatoren (negativ wie positiv) werden addiert und bilden |
| 30 | zusammen mit dem Standardwert eine Gesamtsumme. |
| 31 | Bei allen SAs ausser SA_QUALITY wird diese Gesamtsumme noch mit |
| 32 | SA_QUALITY (welches sich damit auf alle anderen Skill-Attribute |
| 33 | auswirkt) multipliziert und das Ergebnis stellt den Endwert des SA dar. |
| 34 | (Beispiel s.u.) |
| 35 | |
| 36 | Der Wert eines Modifikators muss zwischen -1000 und 1000 liegen. Der |
| 37 | Gesamtwert eines SA kann 10 nicht unter- und 1000 nicht ueberschreiten. |
| 38 | |
| 39 | Falle <value> eine Closure ist, wird diese Closure jedesmal |
| 40 | ausgefuehrt, wenn das entsprechende SA abgefragt wird. Der |
| 41 | Rueckgabewert dieser Closure stellt dann den Wert des Modifikators |
| 42 | dar. Auch dieser muss zwischen -1000 und 1000 liegen. Gibt die |
| 43 | Closure keinen int zurueck, wird der Modifikator geloescht. |
| 44 | |
| 45 | Gueltige Skill-Attribute sind momentan: |
| 46 | * SA_QUALITY: Allgemeine Qualitaet: wirkt sich auf alle anderen |
| 47 | Attribute auch aus (multplikativ auf Basis 100) |
| 48 | * SA_DAMAGE: Schaden, den das Lebewesen macht |
| 49 | * SA_SPEED: Geschwindigkeit des Lebewesens (zB Angriffe/Runde) |
| 50 | * SA_DURATION: Spell-/Skilldauer |
| 51 | * SA_ENEMY_SAVE: identisch zu SA_SPELL_PENETRATION (OBSOLET!) |
| 52 | * SA_SPELL_PENETRATION: Chance des _Casters_, einen Spell durch ein |
| 53 | P_NOMAGIC durchzukriegen. |
| 54 | * SA_RANGE: Reichweite des Lebewesens (eher unbenutzt) |
| 55 | * SA_EXTENSION: "Ausdehnung" bei Gruppen-/Flaechenspells: FindGroupN/P |
| 56 | |
| 57 | RUECKGABEWERT: |
| 58 | SA_MOD_OK wenn der Modifikator gesetzt wurde |
| 59 | SA_TOO_MANY_MODS wenn die max. Anzahl an Mods schon erreicht ist. |
| 60 | SA_MOD_TOO_SMALL wenn der Modifikator zu klein ist |
| 61 | SA_MOD_TOO_BIG wenn der Modifikator zu gross ist |
| 62 | SA_MOD_INVALID_ATTR wenn das gewuenschte SA gar nicht existiert |
| 63 | SA_MOD_INVALID_OBJECT wenn das setzende Objekt ungueltig ist |
| 64 | SA_MOD_INVALID_VALUE wenn der Modifikator ungueltig ist |
| 65 | Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt |
| 66 | es sich, auf == SA_MOD_OK zu pruefen. |
| 67 | |
| 68 | BEMERKUNGEN: |
| 69 | Nachdem ein Objekt, welches Modifikatoren setzte, zerstoert wurde, |
| 70 | werden die Modifikatoren spaetestens ungueltig, sobald in dem |
| 71 | manipulierten Lebewesen erneut ModifySkillAttribute() gerufen wird! |
| 72 | Bei Closures ist der Mod sofort weg. |
| 73 | |
| 74 | BEISPIELE: |
| 75 | // sei PL ein Spieler, den mein NPC schwaechen will: |
| 76 | PL->ModifySkillAttribute(SA_QUALITY, -75, 13); |
| 77 | // Fuer 13s wird SA_QUALITY um 75 reduziert. Dies wirkt sich auf alle |
| 78 | // anderen SAs aus! (s. drittes Beispiel) |
| 79 | |
| 80 | // sei PL ein Lebewesen, welchem ich fuer 11s 2 Schlaege pro Kampfrunde |
| 81 | // zusaetzlich geben moechte: |
| 82 | PL->ModifySkillAttribute(SA_SPEED, 200, 11); |
| 83 | // wenn keine weiteres Modifikatoren wirken, hat PL jetzt 3 Schlaege |
| 84 | // pro Kampfrunde (Basiswert 100 + 200 == 300 => 3). |
| 85 | |
| 86 | Angenommen, ein Lebewesen hat einen Basiswert von 130 auf SA_SPEED und |
| 87 | 100 auf SA_QUALITY (P_SKILL_ATTRIBUTE_OFFSETS) und nun 3 Modifikatoren |
| 88 | gesetzt: SA_SPEED +100, SA_SPEED -30 und SA_QUALITY von -10: |
| 89 | Zunaechst wird SA_QUALITY bestimmt: 100 - 10 = 90 => 0.9 |
| 90 | Anschliessend wird SA_SPEED bestimmt: 130 + 100 - 30 = 200 => 2 |
| 91 | Nun wird SA_SPEED noch mit SA_QUALITY multipliziert: 2 * 0.9 = 1.8 |
| 92 | Das Lebewesen hat nun also im Endeffekt 1.8 Schlaege pro Kampfrunde. |
| 93 | |
| 94 | |
| 95 | SIEHE AUCH: |
| 96 | Skills Lernen: LearnSkill, ModifySkill, LimitAbility |
| 97 | * Nutzung: UseSpell, UseSkill |
| 98 | * Abfragen: QuerySkill |
| 99 | * Modifikation: QuerySkillAttribute, |
| 100 | QuerySkillAttributeModifier, RemoveSkillAttributeModifier |
| 101 | * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS |
| 102 | * sonstig: spruchermuedung, skill_info_liste |
| 103 | * Properties: P_NEWSKILLS |
| 104 | |
| 105 | 5. Okt 2011 Gloinson |