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

