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