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