blob: 507c51b58856cee0453dfec475816acc40a0cee1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001QuerySkillAttributeModifier()
2FUNKTION:
3 public varargs mapping QuerySkillAttributeModifier(object caster,
4 string *atrnames)
5
6DEFINIERT IN:
7 /std/living/skill_attributes.c
8
9ARGUMENTE:
10 <caster> object
11 Objekt, welches die gesuchten Mods gesetzt hat
12
13 <atrnames> string*
14 Array von Skill-Attributen, welche durchsucht werden sollen.
15
16BESCHREIBUNG:
17 Diese Funktion liefert alle Mods von <caster> auf den Skill-
18 Attributen <atrnames> in einem Mapping zurueck.
19 Wird <atrnames> nicht angegeben oder ist ein leeres Array, werden alle
20 Skill-Attribute nach Mods abgesucht.
21 Wird <caster> nicht angeben oder ist 0, so werden alle Mods der
22 gewuenschten Skill-Attribute geliefert.
23 Dementsprechend bekommt man alle Mods aller Skill-Attribute, wenn keins
24 von beidem angegeben wird.
25
26RUECKGABEWERT:
27 ([]), falls keine Modifikatoren gefunden wurden.
28 In anderen Faellen ist die Datenstruktur des Mappings wie folgt:
29 ([ atrname1: ([ <caster>: <value>; <duration> ]),
30 atrname2: ([ <caster>: <value>; <duration> ]) ])
31 Die Schluessel im Mapping sind die jeweiligen Skill-Attribute, die Werte
32 des Mappings sind erneut Mappings, welche als Schluessel die Objekte
33 haben, welche die Mods gesetzt haben. In diesem Mapping gehoeren zu jedem
34 Schluessel zwei Werte, den Wert des Modifikators und die Ablaufzeit.
35 <value> kann hierbei ein int oder eine closure sein, <duration> ist ein
36 int, <caster> ist ein Objekt.
37 Ggf. kann das innere Mapping natuerlich auch mehrere Modifikatoren
38 enthalten (also caster1, caster2, usw.).
39
40BEMERKUNGEN:
41
42BEISPIELE:
43 Ein Objekt moechte seinen bestehenden Modifikator um 20 und die
44 Gueltigkeit um 13 erhoehen.
45 mapping res = ob->QuerySkillAttributeModifier(this_object(),
46 ({SA_DAMAGE}) );
47 if (member(res, SA_DAMAGE) && member(res[SA_DAMAGE], this_object())) {
48 // alten Mod ueberschreiben und Werte dabei anheben.
49 ob->ModifySkillAttributeModifier(SA_DAMAGE,
50 res[SA_DAMAGE][this_object(),0] + 20,
51 res[SA_DAMAGE][this_object(),1] + 13 );
52 }
53 else
54 // neuen Mod setzen.
55 ob->ModifySkilAttributeModifier(SA_DAMAGE, 20, 13);
56
57 Ein Objekt hat den Fluch der unpraezisen Schnelligkeit, welcher SA_DAMAGE
58 reduziert, sofern das Lebewesen einen positiven Modifikator auf SA_SPEED
59 hat:
60 mapping res = ob->QuerySkillAttributeModifier(0, ({SA_SPEED}) );
61 if (member(res, SA_SPEED) {
62 int val, int dur;
63 foreach(object caster, int v, int d: res[SA_SPEED]) {
64 // groessten Mod rausfinden, dabei keine closures
65 // beruecksichtigen.
66 if (intp(v) && v>val) {
67 val=v;
68 dur=d;
69 }
70 }
71 if (val > 0) {
72 // pos. Mod auf SA_SPEED gefunden, entsprechenden neg. Mod auf
73 // SA_DAMAGE setzen, der zum gleichen Zeitpunkt ungueltig wird
74 // wie der Mod auf SA_SPEED.
75 if (ob->ModifySkillAttribute(SA_DAMAGE, -val, dur) == SA_MOD_OK)
76 tell_object(ob, "tolle Fluchmeldung.");
77 }
78 }
79
80SIEHE AUCH:
81 Skills Lernen: LearnSkill, ModifySkill, LimitAbility
82 * Nutzung: UseSpell, UseSkill
83 * Abfragen: QuerySkill, QuerySkillAbility
84 * Modifikation: ModifySkillAttribute, QuerySkillAttribute,
85 RemoveSkillAttributeModifier
86 * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
87 * sonstig: spruchermuedung, skill_info_liste
88 * Properties: P_NEWSKILLS
89
9014.08.2008, Zesstra