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