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
