blob: fa6d63364f7e9582e426d617595446db672560d2 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001P_SENSITIVE
2===========
3
4NAME
5----
6::
7
8 P_SENSITIVE "sensitive"
9
10DEFINIERT IN
11------------
12::
13
14 /sys/thing/moving.h
15
16BESCHREIBUNG
17------------
18::
19
20 Diese Property kann in Objekten gesetzt werden, die auf bestimmte
21 Schadensarten empfindlich reagieren sollen. Moegliche Anwendungsfaelle:
22 - Das Lebewesen, in dessen Inventar sich ein Objekt befindet, erleidet
23 einen Angriff mit der fraglichen Schadensart (Beispiel: eine
24 Pusteblume, die bei Angriff mit Luftschaden auseinanderfaellt).
25 - Zwei Objekte treffen im gleichen Environment aufeinander, wobei
26 eines empfindlich auf eine Schadensart reagiert, und das zweite diese
27 Schadensart mitbringt, d.h. die Empfindlichkeit ausloesen kann.
28 (Beispiel: ein feuerempfindlicher Postsack wird angesengt, wenn eine
29 brennende Fackel ins gleiche Inventar kommt.)
30 Das Ausloesen dieser Empfindlichkeit ist unabhaengig davon, welches
31 Objekt zuerst da war.
32
33 Die Property enthaelt ein Array aus Arrays:
34 ({<sensprops_1>, <sensprops_2>, ..., <sensprops_n>})
35
36
37
38 wobei jeder Eintrag <sensprops> jeweils folgende Struktur hat:
39 ({string list_key, string damtype, int treshold, mixed options })
40
41
42
43 Die Eintraege haben dabei folgende Bedeutung:
44
45
46
47 list_key: Kann einen von folgenden drei Werten annehmen
48 1) SENSITIVE_INVENTORY, passive Eigenschaft; zeigt an, dass das
49 Objekt empfindlich auf aktive Objekte reagiert, die in das
50 Inventory des Containers hineinbewegt werden
51 2) SENSITIVE_ATTACK, passive Eigenschaft; zeigt an, dass das
52 Objekt empfindlich auf aeussere Einfluesse bzw. Angriffe
53 auf ein Lebewesen reagiert, in dessen Inventar es sich befindet
54 3) SENSITIVE_INVENTORY_TRIGGER, aktive Eigenschaft; zeigt an, dass
55 das Objekt eine Ausstrahlung auf andere Objekte im Inventar
56 hat. Wird ausgeloest, wenn das Objekt ins Inventar hineinbewegt
57 wird.
58 damtype: eine Schadensart (DT_FIRE, DT_WATER, ...)
59 treshold: hat zwei Bedeutungen abhaengig von dem Wert in list_key:
60 1) Fuer Objekte mit SENSITIVE_INVENTORY oder SENSITIVE_ATTCK ist
61 dies der Schadenswert, ab dem das Objekt benachrichtigt werden
62 soll.
63 Hier wird ein Wert in "Defend-Einheiten" erwartet, d.h. das
64 Zehnfache dessen, was am Ende in LP abgezogen wuerde.
65 2) Fuer Objekte mit SENSITIVE_INVENTORY_TRIGGER ist dies der
66 Schadenswert, mit dem das Objekt andere bereits im Inventar
67 des Containers befindliche Objekte beeinflusst, die eine
68 entsprechende Empfindlichkeit gesetzt haben
69 options: Optionale Daten, die der programmierende Magier selbst
70 definieren kann. Werden an die in den betroffenen Objekten
71 aufgerufenen Funktionen durchgereicht.
72
73 Ein SENSITIVE_ATTACK-Objekt, dessen Trigger-Bedingungen erfuellt sind,
74 wird durch folgenden Funktionsaufruf darueber informiert:
75 trigger_sensitive_attack(object enemy, string damtype, int damage,
76 mixed spell, mixed options)
77
78
79
80 Ein SENSITIVE_INVENTORY-Objekt, dessen Trigger-Bedingungen erfuellt sind,
81 wird durch folgenden Funktionsaufruf darueber informiert:
82 trigger_sensitive_inv(object whodid, string damtype, int threshold,
83 mixed options, mixed options)
84
85 Die beiden Funktionen muessen selbst ge-/ueberschrieben werden.
86
87BEMERKUNGEN
88-----------
89::
90
91 1. P_SENSITIVE-Objekte kosten Rechenzeit bei jedem Angriff oder jedem
92 move() - daher bitte sparsam verwenden
93 2. Ist P_SENSITIVE nicht statisch, sondern wird es situationsabhaengig
94 geaendert, muss man das environment() jeweils selbst ueber seine
95 neue Empfindlichkeit benachrichtigen. Dies geschieht mit den
96 Funktionen RemoveSensitiveObject() bzw.InsertSensitiveObject(),
97 siehe deren Manpages.
98
99BEISPIEL
100--------
101::
102
103 Beispiel 1:
104 Beispielcode eines Objektes mit SENSITIVE_ATTACK und SENSITIVE_INVENTORY
105 siehe hier: /doc/beispiele/testobjekte/attack_busy_sensitive_testobj.c
106
107 Beispiel 2:
108 Ein Eiszapfen, der bei Feuerangriffen oder bei heissen Gegenstaenden im
109 gemeinsamen Environment zerschmelzen soll:
110
111 void create() {
112 SetProp( P_SENSITIVE, ({ ({SENSITIVE_ATTACK, DT_FIRE, 100}),
113 ({SENSITIVE_INVENTORY, DT_FIRE, 100}) }) );
114 [...]
115 }
116
117 varargs void trigger_sensitive_attack() {
118 remove();
119 }
120
121 varargs void trigger_sensitive_inv() {
122 call_out("remove",0); // verzoegert, wegen move()
123 }
124
125 varargs int remove(int silent) {
126 if(!silent) {
127 object room = all_environment(this_object())[<1];
128 tell_room(room, Name()+" zerschmilzt.\n");
129 }
130 return ::remove();
131 }
132
133 - wird eine Fackel mit
134 SetProp(P_SENSITIVE,({({SENSITIVE_INVENTORY_TRIGGER,DT_FIRE,250})}))
135 in das gleiche environment() wie dieser Zapfen bewegt wird, loest
136 diese im Zapfen trigger_sensitive_inv() aus
137 - wird ein Angriff mit DT_FIRE und initialem Schaden > 100 auf das
138 environment() veruebt, loest dies im Zapfen trigger_sensitive_attack()
139 aus
140
141SIEHE AUCH
142----------
143::
144
145 Properties: P_SENSITIVE_ATTACK, P_SENSITIVE_INVENTORY,
146 P_SENSITIVE_INVENTORY_TRIGGER
147 Funktionen: InsertSensitiveObject(L), RemoveSensitiveObject(L),
148 CheckSensitiveAttack(L), Defend(),
149 insert_sensitive_inv(L), insert_sensitive_inv_trigger(L),
150 trigger_sensitive_inv(L), trigger_sensitive_attack(L)
151 Defines: /sys/sensitive.h
152
153Letzte Aenderung: 10. Januar 2015, Arathorn
154