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
