
P_SENSITIVE
***********


NAME
====

   P_SENSITIVE                   "sensitive"


DEFINIERT IN
============

   /sys/thing/moving.h


BESCHREIBUNG
============

   Diese Property kann in Objekten gesetzt werden, die auf bestimmte
   Schadensarten empfindlich reagieren sollen. Moegliche Anwendungsfaelle:
   - Das Lebewesen, in dessen Inventar sich ein Objekt befindet, erleidet
     einen Angriff mit der fraglichen Schadensart (Beispiel: eine
     Pusteblume, die bei Angriff mit Luftschaden auseinanderfaellt).
   - Zwei Objekte treffen im gleichen Environment aufeinander, wobei
     eines empfindlich auf eine Schadensart reagiert, und das zweite diese
     Schadensart mitbringt, d.h. die Empfindlichkeit ausloesen kann.
     (Beispiel: ein feuerempfindlicher Postsack wird angesengt, wenn eine
      brennende Fackel ins gleiche Inventar kommt.)
     Das Ausloesen dieser Empfindlichkeit ist unabhaengig davon, welches
     Objekt zuerst da war.

   Die Property enthaelt ein Array aus Arrays:
     ({<sensprops_1>, <sensprops_2>, ..., <sensprops_n>})



   wobei jeder Eintrag <sensprops> jeweils folgende Struktur hat:
     ({string list_key, string damtype, int treshold, mixed options })



   Die Eintraege haben dabei folgende Bedeutung:



   list_key: Kann einen von folgenden drei Werten annehmen
        1) SENSITIVE_INVENTORY, passive Eigenschaft; zeigt an, dass das
           Objekt empfindlich auf aktive Objekte reagiert, die in das
           Inventory des Containers hineinbewegt werden
        2) SENSITIVE_ATTACK, passive Eigenschaft; zeigt an, dass das
           Objekt empfindlich auf aeussere Einfluesse bzw. Angriffe
           auf ein Lebewesen reagiert, in dessen Inventar es sich befindet
        3) SENSITIVE_INVENTORY_TRIGGER, aktive Eigenschaft; zeigt an, dass
           das Objekt eine Ausstrahlung auf andere Objekte im Inventar
           hat. Wird ausgeloest, wenn das Objekt ins Inventar hineinbewegt
           wird.
   damtype: eine Schadensart (DT_FIRE, DT_WATER, ...)
   treshold: hat zwei Bedeutungen abhaengig von dem Wert in list_key:
        1) Fuer Objekte mit SENSITIVE_INVENTORY oder SENSITIVE_ATTCK ist
           dies der Schadenswert, ab dem das Objekt benachrichtigt werden
           soll.
           Hier wird ein Wert in "Defend-Einheiten" erwartet, d.h. das
           Zehnfache dessen, was am Ende in LP abgezogen wuerde.
        2) Fuer Objekte mit SENSITIVE_INVENTORY_TRIGGER ist dies der
           Schadenswert, mit dem das Objekt andere bereits im Inventar
           des Containers befindliche Objekte beeinflusst, die eine
           entsprechende Empfindlichkeit gesetzt haben
   options: Optionale Daten, die der programmierende Magier selbst
          definieren kann. Werden an die in den betroffenen Objekten
          aufgerufenen Funktionen durchgereicht.

   Ein SENSITIVE_ATTACK-Objekt, dessen Trigger-Bedingungen erfuellt sind,
   wird durch folgenden Funktionsaufruf darueber informiert:
     trigger_sensitive_attack(object enemy, string damtype, int damage,
               mixed spell, mixed options)



   Ein SENSITIVE_INVENTORY-Objekt, dessen Trigger-Bedingungen erfuellt sind,
   wird durch folgenden Funktionsaufruf darueber informiert:
     trigger_sensitive_inv(object whodid, string damtype, int threshold,
               mixed options, mixed options)

   Die beiden Funktionen muessen selbst ge-/ueberschrieben werden.


BEMERKUNGEN
===========

   1. P_SENSITIVE-Objekte kosten Rechenzeit bei jedem Angriff oder jedem
      move() - daher bitte sparsam verwenden
   2. Ist P_SENSITIVE nicht statisch, sondern wird es situationsabhaengig
      geaendert, muss man das environment() jeweils selbst ueber seine
      neue Empfindlichkeit benachrichtigen. Dies geschieht mit den
      Funktionen RemoveSensitiveObject() bzw.InsertSensitiveObject(),
      siehe deren Manpages.


BEISPIEL
========

   Beispiel 1:
   Beispielcode eines Objektes mit SENSITIVE_ATTACK und SENSITIVE_INVENTORY
   siehe hier: /doc/beispiele/testobjekte/attack_busy_sensitive_testobj.c

   Beispiel 2:
   Ein Eiszapfen, der bei Feuerangriffen oder bei heissen Gegenstaenden im
   gemeinsamen Environment zerschmelzen soll:

   void create() {
     SetProp( P_SENSITIVE, ({ ({SENSITIVE_ATTACK,     DT_FIRE, 100}),
                               ({SENSITIVE_INVENTORY, DT_FIRE, 100}) }) );
     [...]
   }

   varargs void trigger_sensitive_attack() {
     remove();
   }

   varargs void trigger_sensitive_inv() {
     call_out("remove",0);  // verzoegert, wegen move()
   }

   varargs int remove(int silent) {
     if(!silent) {
       object room = all_environment(this_object())[<1];
       tell_room(room, Name()+" zerschmilzt.\n");
     }
     return ::remove();
   }

   - wird eine Fackel mit
     SetProp(P_SENSITIVE,({({SENSITIVE_INVENTORY_TRIGGER,DT_FIRE,250})}))
     in das gleiche environment() wie dieser Zapfen bewegt wird, loest
     diese im Zapfen trigger_sensitive_inv() aus
   - wird ein Angriff mit DT_FIRE und initialem Schaden > 100 auf das
     environment() veruebt, loest dies im Zapfen trigger_sensitive_attack()
     aus


SIEHE AUCH
==========

   Properties: P_SENSITIVE_ATTACK, P_SENSITIVE_INVENTORY,
               P_SENSITIVE_INVENTORY_TRIGGER
   Funktionen: InsertSensitiveObject(L), RemoveSensitiveObject(L),
               CheckSensitiveAttack(L), Defend(),
               insert_sensitive_inv(L), insert_sensitive_inv_trigger(L),
               trigger_sensitive_inv(L), trigger_sensitive_attack(L)
   Defines:    /sys/sensitive.h

Letzte Aenderung: 10. Januar 2015, Arathorn
