
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
