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
