RemoveFunc()
============

FUNKTION
--------
::

     int RemoveFunc(object ruest, int info, object user);

DEFINIERT IN
------------
::

     eigenen Objekten (fuer /std/clothing/wear)

ARGUMENTE
---------
::

     ruest (object)
          Die Ruestung/Kleidung, die ausgezogen werden soll.
     info (int)
          Bei (info&M_SILENT) wird keine Meldung ueber das Ausziehen
          ausgegeben.
          Bei (info&M_NOCHECK) wird die Kleidung ausgezogen, egal was diese
          Funktion zurueckgibt. Dies tritt insbesondere dann auf, wenn der
          Spieler, der die Ruestung traegt, stirbt und die Ruestung in
          die Leiche bewegt wird.
     user (object)
          Das Lebewesen, welches die Ruestung/Kleidung gerade traegt und sie
          ausziehen will.

BESCHREIBUNG
------------
::

     Mit dieser Funktion kann man pruefen, ob sich das Kleidungsstueck bzw.
     Ruestung <ruest> von this_player() ausziehen laesst oder nicht.
     Kann die Ruestung ausgezogen werden, so muss ein Wert ungleich 0
     zurueckgegeben werden.

     

     Diese Funktion meldet nur einen _Wunsch_ an. Dieser kann ignoriert
     werden (z.B. bei bestimmten Bewegungen, Tod des Spielers etc.).
     Unabhaengig vom Wert dieser Funktion kann das Ausziehen noch Scheitern
     oder Erzwungen werden.
     Wenn ihr sicher sein wollt, dass der Spieler ein Objekt angezogen hat,
     benutzt bitte InformUnwear().

RUeCKGABEWERT
-------------
::

     0, wenn sich die Ruestung nicht ausziehen laesst, ansonsten ungleich 0.

BEMERKUNGEN
-----------
::

     Verfluchte Ruestungen, die sich erst nach Entfernung des Fluches wieder
     ausziehen lassen, sollte man besser mit P_CURSED realisieren (man spart
     die RemoveFunc() ein).
     Bitte nicht drauf verlassen, dass this_player() das ausziehende Lebewesen
     ist.
     Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
     erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
     Objekte zu aendern.

BEISPIELE
---------
::

     Ein Umhang, den man nur mit guter Einstellung wieder ausziehen kann:

     inherit "std/armour.c";

     #include <properties.h>
     #include <moving.h>

     create()
     {
       ::create();

       SetProp(P_ARMOUR_TYPE, AT_CLOAK);
       /* zig weitere SetProp's, um den Umhang zu konfigurieren */

       /* RemoveFunc() ist im Umhang selbst zu finden */
       SetProp(P_REMOVE_FUNC, this_object());
     }

     int RemoveFunc(object me, int info, object user)
     {
       if (user->QueryProp(P_ALIGN) >= 0 || (info&M_NOCHECK))
         return 1;   /* gute Charaktere koennen den Umhang ausziehen */

       /* Ansonsten geben wir evtl. einen entsprechenden Hinweis aus: */
       if (!(info&M_SILENT))
           write( "Der Umhang wird von Deiner Bosheit so sehr "
                 +"angezogen, dass Du ihn\nnicht mehr ausziehen kannst!\n");
       return 0;
     }

SIEHE AUCH
----------
::

     P_WEAR_MSG, P_UNWEAR_MSG, P_WIELD_MSG, P_UNWIELD_MSG
     DoUnwear(), DoWear(), InformWear(), InformUnwear()
     /std/clothing/wear.c


02.07.2013, Zesstra

