sell_obj()
**********

sell_obj()

Funktion:
   static string sell_obj(object ob, int short)

Definiert in:
   /std/room/shop

Argumente:
   ob:
      Das anzukaufende Objekt

   short:
      Gibt an, ob der Verkaeufer nur ein Objekt (0) oder mehrere (1)
      verkauft. (Verkaufe alles etc.)

Beschreibung:
   Ermittelt ob der Laden bereit ist, <ob> anzukaufen.

Rueckgabewert:
   Meldung die ausgegeben wird, wenn ein Objekt abgelehnt wird oder 0.

Bemerkung:
   Man sollte im normalfall _niemals_ einfach 0 zurueckgeben, sondern
   das geerbte sell_obj() aus /std/room/shop, damit beispielsweise
   P_NOBUY beachtet wird.

Beispiel:
   Ein Schmied, der nur Waffen ankauft:

   protected void create() {

      ...

   }

   static string sell_obj(object ob, int short) {

      if(!ob->QueryProp(P_WEAPON_TYPE)) {

         return "Ich bin nur an Waffen interessiert.";

      } return ::sell_obj(ob,short);

   }

Siehe auch:
   Funktionen:
      AddFixedObject(), RemoveFixedObject(), SetStorageRoom(),
      QueryStorageRoom(), QueryBuyValue(), QueryBuyFact(), buy_obj()

   Properties:
      P_KEEPER, P_MIN_STOCK, P_STORE_CONSUME

Letzte Aenderung: 21.05.2014, Bugfix
