lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

#include <bodyslots.h>

inherit CLASS_BODYSLOTS;

private mapping default_slots();

private mapping slots = default_slots();

// Set some defaults. If you want other ones, override this.
private mapping default_slots()
{
  return ([
    TORSO  : new(class slot, howmany: 1, name: TORSO, max_size: LARGE,
                 stuff: ({ })),
    HEAD   : new(class slot, howmany: 1, name: HEAD,  max_size: SMALL,
                 stuff: ({ })),
    ARMS   : new(class slot, howmany: 1, name: ARMS,  max_size: MEDIUM,
                 stuff: ({ })),
    LEGS   : new(class slot, howmany: 1, name: LEGS,  max_size: MEDIUM, 
                 stuff: ({ })),
    HANDS  : new(class slot, howmany: 1, name: HANDS, max_size: SMALL,
                 stuff: ({ })),
    FEET   : new(class slot, howmany: 1, name: FEET,  max_size: SMALL,
                 stuff: ({ })),

    /* These are non-armor slots. You can wear things here, but they
       don't offer any standard protection. */
    "right hand" : new(class slot, howmany : 1, name : "right hand",
                       max_size : SMALL, non_armor : 1, stuff : ({ })),
    "left hand"  : new(class slot, howmany : 1, name : "left hand",
                       max_size : SMALL, non_armor : 1, stuff : ({ })),
    "neck"       : new(class slot, howmany : 1, name : "neck",
                       max_size : SMALL, non_armor : 1, stuff : ({ })),
    ]);
}

void reset_slots() { slots = default_slots(); }

protected nomask void set_body_slots(mapping what){ slots = what; }

protected nomask void add_body_slot(string sname, int num, int maxsize)
{
  if(slots[sname])
    error("Duplicate slot\n");

  slots[sname] = new(class slot, howmany: num, name: sname, stuff: ({ }),
                     max_size: maxsize);
}

#define SLOT(x) ((class slot)slots[x])

//:FUNCTION wear_item
// nomask int wear_item(object what, string sname);
// Wear object 'what' on slot 'sname'.
nomask int wear_item(object what, string sname)
{
  object array athere;
  int num;
  int slot_max_size;

  if(!slots[sname])
    return 0;

  SLOT(sname)->stuff -= ({ 0 });

  athere = SLOT(sname)->stuff;
  num = SLOT(sname)->howmany;
  if(sizeof(athere) >= num)
    return 0;
  slot_max_size = SLOT(sname)->max_size;
  if(what->get_size() > slot_max_size && slot_max_size)
    return 0;

  SLOT(sname)->stuff += ({ what });
  return 1;
}

nomask int remove_item(object what, string sname)
{
  int num;
    
  if(!slots[sname])
    return 0;

  num = sizeof(SLOT(sname)->stuff);

  SLOT(sname)->stuff -= ({ what });
    
  return sizeof(SLOT(sname)->stuff) < num;
}

nomask string query_random_armor_slot()
{
  string tmp;

  if(!sizeof(slots))
    return 0;

  tmp = choice(keys(slots));
  if(!tmp)
    return 0;

  return tmp;
}

nomask mixed get_random_clothing()
{
  class slot tmp;
    
  if(!sizeof(slots))
    return 0;

  tmp = choice(values(slots));
  if(!tmp)
    return 0;

  if(!sizeof(tmp->stuff))
    return 0;

  return choice(tmp->stuff);
}

protected nomask void reset_body_slots()
{
  slots = ([ ]);
}

//:FUNCTION has_body_slot
// nomask int has_body_slot(string what);
// Returns 1 if the adversary has a 'what' body slot.
nomask int has_body_slot(string what)
{
  return !!slots[what];
}

//:FUNCTION query_armor_slots
// string array query_armor_slots()
// Returns a list of all armor slots on the adversary.
string array query_armor_slots()
{
  return keys(slots);
}

varargs object array event_get_armors()
{
  object array tmp = ({ get_random_clothing() }) - ({ 0 });
  if(!sizeof(tmp))
    return 0;
  else return tmp;
}