//--------------------------------------------------------------------------------
// Name des Objects:    Kleiderschrank
// Letzte Aenderung:    17.03.2001
// Magier:              Swift
//--------------------------------------------------------------------------------
#pragma strong_types,rtt_checks

#include "schrankladen.h"
#include <ansi.h>
inherit LADEN("swift_std_container");

#define VERSION_OBJ "3"

string strall;

protected void create()
{
  if (!clonep(TO)) return;
  swift_std_container::create();
  SetProp(P_SHORT, "Ein Kleiderschrank");
  SetProp(P_LONG, BS(
     "In diesem massiven Holzschrank kannst Du die Ausruestung fuer eine "
    +"halbe Armee unterbringen. Mehrere Regale sorgen dafuer, dass alles "
    +"seinen geordneten Platz findet, damit Du es auch schnell "
    +"wiederfindest.")+"@@cnt_status@@");
  AddId(({"kleiderschrank", "holzschrank", "schrank"}));
  SetProp("cnt_version_obj", VERSION_OBJ);
  SetProp(P_NAME, "Kleiderschrank");
  SetProp(P_GENDER, MALE);
  SetProp(P_WEIGHT, 5000);         // Gewicht 5 Kg
  SetProp(P_MAX_WEIGHT, 1000000);  // Es passen fuer 1000 kg Sachen rein.
  SetProp(P_WEIGHT_PERCENT, 100);  // Dafuer macht er auch nix leichter :)
  SetProp(P_MAX_OBJECTS, 100);     // Mehr sollte nicht sein, lt. Tiamak.
  SetProp(P_VALUE, 0);             // Kein materieller Wert. Ist eh nicht verkaufbar.
  SetProp(P_NOBUY, 1);             // Wird im Laden zerstoert, falls er verkauft wird.
  SetProp(P_NOGET, "Das geht nicht. "+Name(WER,1)+" haftet wie magisch am Boden.\n");
  SetProp(P_MATERIAL, ({MAT_MISC_WOOD, MAT_MISC_MAGIC}) );
  SetProp(P_INFO, "Versuchs mal mit: \"skommandos "+QueryProp(P_IDS)[1]+"\" !\n");
  SetProp("obj_cmd", "sliste [Objekt-Id] [Kleidungs-/Ruestungstyp|\"alles\"]\n"
                    +"  Kleidungs-/Ruestungstypen: Helme, Umhaenge, Ruestungen, Hosen, Schuhe,\n"
                    +"                             Handschuhe, Guertel, Amulette, Ringe, Koecher,\n"
                    +"                             Schilde, Sonstiges\n");
  AD(({"regal", "regale"}), BS("Durch die Regale kommt etwas Ordnung in die "
    +"vielen Sachen, die man in den Schrank stecken kann. Du kannst Dir z.B. "
    +"eine Liste bestimmter Kleidungs-/Ruestungstypen des Schrankinhaltes "
    +"mit dem Befehl \"sliste\" anschauen. (Das geht natuerlich nur bei "
    +"offenem Schrank!"));

  AddCmd(({"sliste"}), "auflistung");
}

varargs int PreventInsert(object ob)
{
  // Nur Ruestung/Kleidung hat in diesem Container was verloren!
  if ((ob->IsClothing() || ob->QueryProp(P_ARMOUR_TYPE))
      && !ob->QueryProp(P_WEAPON_TYPE) )
  {
    return ::PreventInsert(ob);
  }

  write( BS("In "+name(WEN,1)+" kannst Du nur Ruestungs-/Kleidungsstuecke legen!"));
  return 1;
}

int auflistung2(string was, string nf_str1, string nf_str2, int alles)
{
  string obshort, suche, *strs;
  object *obs;
  int i;
  mapping suchobs;
  switch(was)
  {
    case "helme"      : suche=AT_HELMET; break;
    case "umhaenge"   : suche=AT_CLOAK; break;
    case "ruestungen" : suche=AT_ARMOUR; break;
    case "hosen"      : suche=AT_TROUSERS; break;
    case "schuhe"     : suche=AT_BOOT; break;
    case "handschuhe" : suche=AT_GLOVE; break;
    case "guertel"    : suche=AT_BELT; break;
    case "amulette"   : suche=AT_AMULET; break;
    case "ringe"      : suche=AT_RING; break;
    case "koecher"    : suche=AT_QUIVER; break;
    case "schilde"    : suche=AT_SHIELD; break;
    case "sonstiges"  : suche=AT_MISC; break;
    default           : write("Fehler: Ungueltiger Kleidungs-/Ruestungstyp. "
                             +"Folgende Typen gibt es:\n"+nf_str1+nf_str2);
                        return 1; break;
  }
  obs=all_inventory();
  suchobs=([]);
  for(i=0;i<sizeof(obs);i++)
  {
    obshort=obs[i]->QueryProp(P_SHORT);
    if(obshort=="Nichts besonderes") // keine P_SHORT ?
      obshort=obs[i]->Name(WER);     //   Hoffen wir mal dass das Obj. nen Namen hat.
    if(obs[i]->QueryProp(P_ARMOUR_TYPE)==suche)    // Gesuchter ArmourType gefunden...
    {
      if(suchobs[obshort])                         // P_SHORT des Obj. schon im mapping?
      {
        if( obs[i]->QueryProp(P_AMOUNT) )
          suchobs[obshort]+=obs[i]->QueryProp(P_AMOUNT); //   Dann den Zaehler um Amount hoch!
        else
          suchobs[obshort]+=1;                     //   Dann den Zaehler um 1 hoch!
      }
      else
      {
        if( obs[i]->QueryProp(P_AMOUNT) )
          suchobs+=([obshort: obs[i]->QueryProp(P_AMOUNT)]);
        else
          suchobs+=([obshort: 1]);
      }
    }
  }
  strs=m_indices(suchobs);
  if(sizeof(strs))
  {
    if(!alles)
    {
      strall+=Name(WER,1)+" enthaelt folgende "+CAP(was)+":\n";
      strall+="------------------------------------------------------------\n";
    }
    else
      strall+=ANSI_BOLD+"=== "+CAP(was)+":\n"+ANSI_NORMAL;
    for(i=0;i<sizeof(strs);i++)
    {
      if(suchobs[strs[i]] > 1)
        strall+=strs[i]+". ("+suchobs[strs[i]]+")\n";
      else
        strall+=strs[i]+".\n";
    }
  }
  else
    if(!alles)
      strall+=Name(WER,1)+" enthaelt keine "+CAP(was)+"!\n";
  return 1;
}

int auflistung(string str)
{
  string *strs, ob_id, was, nf_str1,nf_str2;
  strall="";
  nf_str1="   (Helme, Umhaenge, Ruestungen, Hosen, Schuhe, Handschuhe,\n"
         +"    Guertel, Amulette, Ringe, Koecher, Schilde, Sonstiges)\n";
  nf_str2="Syntax: sliste [Objekt-Id] [Kleidungs-/Ruestungstyp|\"alles\"]\n"
         +"Bsp.:   sliste "+QueryProp(P_IDS)[1]+" "+"helme\n"
         +"        sliste "+QueryProp(P_IDS)[1]+" alles\n";
  notify_fail("Fehler: Ohne Parameter klappt das nicht.\n"+nf_str2);
  if(!str) return 0;
  if(present(str)==TO)   // Ueberpruefe, ob dieses Objekt gemeint ist!
  {
    write("Fehler: Es fehlt ein Kleidungs-/Ruestungstyp. Folgende Typen gibt es:\n"
         +nf_str1+nf_str2);
    return 1;
  }
  strs=old_explode(str, " ");
  notify_fail("Fehler: Du musst eine gueltige Objekt-Id angeben!\n"
             +nf_str2);
  if( sizeof(strs) < 2 ) return 0;   // Nur 1 Par. und der ist nicht die Objekt-Id
  if( sizeof(strs) == 2 )   // Anzahl Par. = 2
  {
    ob_id=strs[0];
    was=strs[1];
    if( IST_ZAHL(was) )     // Objekt-Id z.B. mit "schrank 2" angesprochen?
      if(present(ob_id+" "+was)==TO)   // Falls dieses Objekt gemeint ist und kein 3. Par!
      {
        write("Fehler: Es fehlt ein Kleidungs-/Ruestungstyp. Folgende Typen gibt es:\n"
              +nf_str1+nf_str2);
        return 1;
      }
      else
        return 0;
  }
  else if( sizeof(strs) == 3 )
  {
    ob_id=strs[0]+" "+strs[1];
    was=strs[2];
  }
  else        // Anzahl erforderlicher Parameter ueberschritten!
    return 0;
  if(present(ob_id)!=TO)   // Ueberpruefe, ob auch dieses Objekt gemeint ist!
    return 0;
  if(QueryProp(P_CNT_STATUS)!=CNT_STATUS_OPEN)
  {
    write("Dazu muesste "+name(WER,1)+" geoeffnet sein.\n");
    return 1;
  }
//--- Hier ist Parameterpruefung zu Ende.
  was=LOWER(was);
  if(was!="alles")
    auflistung2(was, nf_str1, nf_str2, 0);
  else
  {
    auflistung2("helme", nf_str1, nf_str2, 1);
    auflistung2("umhaenge", nf_str1, nf_str2, 1);
    auflistung2("ruestungen", nf_str1, nf_str2, 1);
    auflistung2("hosen", nf_str1, nf_str2, 1);
    auflistung2("schuhe", nf_str1, nf_str2, 1);
    auflistung2("handschuhe", nf_str1, nf_str2, 1);
    auflistung2("guertel", nf_str1, nf_str2, 1);
    auflistung2("amulette", nf_str1, nf_str2, 1);
    auflistung2("ringe", nf_str1, nf_str2, 1);
    auflistung2("koecher", nf_str1, nf_str2, 1);
    auflistung2("schilde", nf_str1, nf_str2, 1);
    auflistung2("sonstiges", nf_str1, nf_str2, 1);
  }
  TP->More(strall);
  return 1;
}
