// MorgenGrauen MUDlib
//
// clothing/container_description.c -- clothing_container description handling
//
// $Id: container_description.c 6198 2007-02-13 23:39:43Z Zesstra $

#pragma strict_types
#pragma save_types
#pragma no_clone
#pragma range_check

inherit "/std/thing/description";

#define NEED_PROTOTYPES

#include <thing/properties.h>
#include <thing/description.h>
#include <thing/language.h>
#include <container.h>
#include <combat.h>
#include <thing/material.h>
#include <defines.h>
#include <wizlevels.h>
#include <player/base.h>

void create()
{
  ::create();
  SetProp(P_TRANSPARENT, 1);
  AddId("Container");
}

string dam_descr()
{   string re;
    mixed desc;
    int maximum,dam,pos;

    if (!QueryProp(P_NAME) || !QueryProp(P_DAMAGED) || !QueryProp(P_SHORT) ||
        !(desc=QueryProp(P_DAM_DESC)) || (!stringp(desc) && !pointerp(desc)))
        return "";
    re = capitalize(name(WER,2))+" ";
    maximum = QueryProp(P_AC)+(dam=QueryProp(P_DAMAGED));
    if (stringp(desc))
        return (dam>(maximum/2))?(re+desc+".\n"):"";
    pos = (sizeof(desc)*dam/maximum);
    if (stringp(desc[pos]))
        return (re+desc[pos]+".\n");
    return "";
}

string short()
{   string s;
    if(!(s=process_string(QueryProp(P_SHORT))))
        return 0;
    return s+(QueryProp(P_WORN)?" (angezogen).\n":".\n");
}

varargs string long(int mode)
{   string descr, inv_descr;

    descr=(process_string(QueryProp(P_LONG)||"") + (dam_descr()||""));
    if (!QueryProp(P_TRANSPARENT))
      return descr;

    inv_descr = make_invlist(PL, all_inventory(ME), mode );
    if ( inv_descr != "" )
        descr += capitalize(QueryPronoun(WER)) + " enthaelt:\n" + inv_descr;
    return descr;
}

mapping _query_material() {
  mixed res,at;

  if (mappingp(res=Query(P_MATERIAL)))
    return res;
  at=QueryProp(P_ARMOUR_TYPE);
  switch(at) {
    case AT_ARMOUR:
    case AT_HELMET:
    case AT_RING:
    case AT_AMULET:
    case AT_SHIELD:
    return ([MAT_MISC_METAL:100]);
    case AT_CLOAK:
    case AT_TROUSERS:
    return ([MAT_CLOTH:100]);
    case AT_GLOVE:
    case AT_BOOT:
    return ([MAT_CLOTH:100]);
  }
  return ([MAT_CLOTH:100]);
}

// flags: 1 - wizard, 2 - don't collect equal objects '
// flags: 4 - don't append infos for wizards
private void stringenize(mixed obj, int flags, mixed objs, mixed info)
{
  string id, tmp;
  int idx;
  tmp = capitalize(({string})obj->short()||"")[0..<2]
      + (!(flags & 4) && (flags & 1) ? " ["+object_name(obj)+"]" : "");
  if(flags & 3 || living(obj)) id = object_name(obj);
  else
    id = explode(object_name(obj), "#")[0] + tmp;
  if((idx = member(objs, id)) == -1)
  {
    objs += ({ id });
    info += ({ ({ tmp, 1, obj}) });
  }
  else
    info[idx][1]++;
}

private string collect(mixed obj)
{
  if(!sizeof(obj[0])) return 0;
  return obj[0] + (obj[1] > 1 ? " ("+obj[1]+")" : "");
}

// flags: 1 - return array, 2 - don't collect equal objects '
// flags: 4 - don't append infos for wizards
varargs mixed make_invlist(object viewer, mixed inv, int flags)
{
  int iswiz;
  mixed objs, info;
  string descr;

  iswiz = IS_LEARNER( viewer ) && ({int})viewer->QueryProp(P_WANTS_TO_LEARN);
  descr = ""; objs = ({}); info = ({});
  map(inv, #'stringenize/*'*/, iswiz | (flags & 2) | (flags & 4), &objs, &info);
  if(flags & 1) return info;
  inv = map(info, #'collect/*'*/) - ({ 0 });
  if(!sizeof(inv)) return "";
  return sprintf("%"+(sizeof(inv) > 6 ? "#" : "=")+"-78s",
                 implode(inv, "\n")) + "\n";
}
