dw_fluffos_v1/
dw_fluffos_v1/fluffos-1.22c11/
dw_fluffos_v1/fluffos-1.22c11/ChangeLog.old/
dw_fluffos_v1/fluffos-1.22c11/Win32/
dw_fluffos_v1/fluffos-1.22c11/compat/
dw_fluffos_v1/fluffos-1.22c11/compat/simuls/
dw_fluffos_v1/fluffos-1.22c11/include/
dw_fluffos_v1/fluffos-1.22c11/mudlib/
dw_fluffos_v1/fluffos-1.22c11/testsuite/
dw_fluffos_v1/fluffos-1.22c11/testsuite/clone/
dw_fluffos_v1/fluffos-1.22c11/testsuite/command/
dw_fluffos_v1/fluffos-1.22c11/testsuite/data/
dw_fluffos_v1/fluffos-1.22c11/testsuite/etc/
dw_fluffos_v1/fluffos-1.22c11/testsuite/include/
dw_fluffos_v1/fluffos-1.22c11/testsuite/inherit/
dw_fluffos_v1/fluffos-1.22c11/testsuite/inherit/master/
dw_fluffos_v1/fluffos-1.22c11/testsuite/log/
dw_fluffos_v1/fluffos-1.22c11/testsuite/single/
dw_fluffos_v1/fluffos-1.22c11/testsuite/single/tests/compiler/
dw_fluffos_v1/fluffos-1.22c11/testsuite/single/tests/efuns/
dw_fluffos_v1/fluffos-1.22c11/testsuite/single/tests/operators/
dw_fluffos_v1/fluffos-1.22c11/testsuite/u/
dw_fluffos_v1/fluffos-1.22c11/tmp/
dw_fluffos_v1/lib/
dw_fluffos_v1/lib/binaries/cmds/
dw_fluffos_v1/lib/binaries/cmds/creator/
dw_fluffos_v1/lib/binaries/cmds/living/
dw_fluffos_v1/lib/binaries/cmds/player/
dw_fluffos_v1/lib/binaries/d/admin/obj/
dw_fluffos_v1/lib/binaries/d/liaison/
dw_fluffos_v1/lib/binaries/global/virtual/
dw_fluffos_v1/lib/binaries/global/virtual/setup_compiler/
dw_fluffos_v1/lib/binaries/obj/handlers/autodoc/
dw_fluffos_v1/lib/binaries/obj/handlers/terrain_things/
dw_fluffos_v1/lib/binaries/obj/misc/
dw_fluffos_v1/lib/binaries/obj/misc/buckets/
dw_fluffos_v1/lib/binaries/obj/monster/
dw_fluffos_v1/lib/binaries/obj/reactions/
dw_fluffos_v1/lib/binaries/obj/reagents/
dw_fluffos_v1/lib/binaries/secure/cmds/creator/
dw_fluffos_v1/lib/binaries/secure/master/
dw_fluffos_v1/lib/binaries/std/
dw_fluffos_v1/lib/binaries/std/dom/
dw_fluffos_v1/lib/binaries/std/effects/object/
dw_fluffos_v1/lib/binaries/std/guilds/
dw_fluffos_v1/lib/binaries/std/languages/
dw_fluffos_v1/lib/binaries/std/races/
dw_fluffos_v1/lib/binaries/std/room/
dw_fluffos_v1/lib/binaries/std/room/basic/
dw_fluffos_v1/lib/binaries/std/shops/
dw_fluffos_v1/lib/binaries/std/shops/inherit/
dw_fluffos_v1/lib/binaries/www/
dw_fluffos_v1/lib/cmds/guild-race/
dw_fluffos_v1/lib/cmds/guild-race/crafts/
dw_fluffos_v1/lib/cmds/guild-race/other/
dw_fluffos_v1/lib/cmds/playtester/
dw_fluffos_v1/lib/cmds/playtester/senior/
dw_fluffos_v1/lib/d/admin/
dw_fluffos_v1/lib/d/admin/log/
dw_fluffos_v1/lib/d/admin/mapper/31-10-01/mapmaker/event/
dw_fluffos_v1/lib/d/admin/meetings/
dw_fluffos_v1/lib/d/admin/obj/
dw_fluffos_v1/lib/d/admin/room/we_care/
dw_fluffos_v1/lib/d/admin/save/
dw_fluffos_v1/lib/d/dist/
dw_fluffos_v1/lib/d/dist/mtf/
dw_fluffos_v1/lib/d/dist/pumpkin/
dw_fluffos_v1/lib/d/dist/pumpkin/chars/
dw_fluffos_v1/lib/d/dist/pumpkin/desert/
dw_fluffos_v1/lib/d/dist/pumpkin/gumboot/
dw_fluffos_v1/lib/d/dist/pumpkin/hospital/
dw_fluffos_v1/lib/d/dist/pumpkin/inherit/
dw_fluffos_v1/lib/d/dist/pumpkin/map/
dw_fluffos_v1/lib/d/dist/pumpkin/plain/
dw_fluffos_v1/lib/d/dist/pumpkin/pumpkin/
dw_fluffos_v1/lib/d/dist/pumpkin/save/
dw_fluffos_v1/lib/d/dist/pumpkin/squash/
dw_fluffos_v1/lib/d/dist/pumpkin/terrain/
dw_fluffos_v1/lib/d/dist/pumpkin/woods/
dw_fluffos_v1/lib/d/dist/start/
dw_fluffos_v1/lib/d/learning/TinyTown/buildings/
dw_fluffos_v1/lib/d/learning/TinyTown/map/
dw_fluffos_v1/lib/d/learning/TinyTown/roads/
dw_fluffos_v1/lib/d/learning/add_command/
dw_fluffos_v1/lib/d/learning/arms_and_weps/
dw_fluffos_v1/lib/d/learning/chars/
dw_fluffos_v1/lib/d/learning/cutnpaste/
dw_fluffos_v1/lib/d/learning/examples/npcs/
dw_fluffos_v1/lib/d/learning/examples/player_houses/npcs/
dw_fluffos_v1/lib/d/learning/examples/terrain_map/basic/
dw_fluffos_v1/lib/d/learning/functions/
dw_fluffos_v1/lib/d/learning/handlers/
dw_fluffos_v1/lib/d/learning/help_topics/npcs/
dw_fluffos_v1/lib/d/learning/help_topics/objects/
dw_fluffos_v1/lib/d/learning/help_topics/rcs_demo/
dw_fluffos_v1/lib/d/learning/help_topics/rooms/
dw_fluffos_v1/lib/d/learning/help_topics/rooms/crowd/
dw_fluffos_v1/lib/d/learning/help_topics/rooms/situations/
dw_fluffos_v1/lib/d/learning/items/
dw_fluffos_v1/lib/d/learning/save/
dw_fluffos_v1/lib/d/liaison/
dw_fluffos_v1/lib/d/liaison/NEWBIE/doc/
dw_fluffos_v1/lib/d/liaison/NEWBIE/save/oldlog/
dw_fluffos_v1/lib/db/
dw_fluffos_v1/lib/doc/
dw_fluffos_v1/lib/doc/creator/
dw_fluffos_v1/lib/doc/creator/autodoc/include/reaction/
dw_fluffos_v1/lib/doc/creator/autodoc/include/ritual_system/
dw_fluffos_v1/lib/doc/creator/autodoc/include/talker/
dw_fluffos_v1/lib/doc/creator/autodoc/include/terrain_map/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/baggage/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/clock/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/clothing/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/cont_save/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/corpse/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/money/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/monster/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/scabbard/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/service_provider/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/state_changer/
dw_fluffos_v1/lib/doc/creator/autodoc/obj/wand/
dw_fluffos_v1/lib/doc/creator/autodoc/std/book_dir/
dw_fluffos_v1/lib/doc/creator/autodoc/std/key/
dw_fluffos_v1/lib/doc/creator/autodoc/std/learning/
dw_fluffos_v1/lib/doc/creator/autodoc/std/map/
dw_fluffos_v1/lib/doc/creator/autodoc/std/race/
dw_fluffos_v1/lib/doc/creator/autodoc/std/weapon_logic/
dw_fluffos_v1/lib/doc/creator/files/
dw_fluffos_v1/lib/doc/creator/policy/
dw_fluffos_v1/lib/doc/creator/room/
dw_fluffos_v1/lib/doc/effects/
dw_fluffos_v1/lib/doc/ideas/
dw_fluffos_v1/lib/doc/known_command/
dw_fluffos_v1/lib/doc/lpc/basic_manual/
dw_fluffos_v1/lib/doc/lpc/intermediate/
dw_fluffos_v1/lib/doc/new/add_command/
dw_fluffos_v1/lib/doc/new/handlers/
dw_fluffos_v1/lib/doc/new/living/
dw_fluffos_v1/lib/doc/new/living/race/
dw_fluffos_v1/lib/doc/new/living/spells/
dw_fluffos_v1/lib/doc/new/player/
dw_fluffos_v1/lib/doc/new/room/guild/
dw_fluffos_v1/lib/doc/new/room/outside/
dw_fluffos_v1/lib/doc/new/room/storeroom/
dw_fluffos_v1/lib/doc/object/
dw_fluffos_v1/lib/doc/playtesters/
dw_fluffos_v1/lib/doc/policy/
dw_fluffos_v1/lib/doc/weapons/
dw_fluffos_v1/lib/global/handlers/
dw_fluffos_v1/lib/global/virtual/setup_compiler/
dw_fluffos_v1/lib/include/
dw_fluffos_v1/lib/include/cmds/
dw_fluffos_v1/lib/include/effects/
dw_fluffos_v1/lib/include/npc/
dw_fluffos_v1/lib/include/shops/
dw_fluffos_v1/lib/net/daemon/chars/
dw_fluffos_v1/lib/net/inherit/
dw_fluffos_v1/lib/net/intermud3/
dw_fluffos_v1/lib/net/intermud3/services/
dw_fluffos_v1/lib/net/obj/
dw_fluffos_v1/lib/net/save/
dw_fluffos_v1/lib/net/smnmp/
dw_fluffos_v1/lib/net/snmp/
dw_fluffos_v1/lib/obj/amulets/
dw_fluffos_v1/lib/obj/b_day/
dw_fluffos_v1/lib/obj/examples/
dw_fluffos_v1/lib/obj/food/alcohol/
dw_fluffos_v1/lib/obj/food/chocolates/
dw_fluffos_v1/lib/obj/food/fruits/
dw_fluffos_v1/lib/obj/food/meat/
dw_fluffos_v1/lib/obj/food/nuts/
dw_fluffos_v1/lib/obj/food/seafood/
dw_fluffos_v1/lib/obj/food/vegetables/
dw_fluffos_v1/lib/obj/fungi/
dw_fluffos_v1/lib/obj/furnitures/artwork/
dw_fluffos_v1/lib/obj/furnitures/bathroom/
dw_fluffos_v1/lib/obj/furnitures/beds/
dw_fluffos_v1/lib/obj/furnitures/cabinets/
dw_fluffos_v1/lib/obj/furnitures/chairs/
dw_fluffos_v1/lib/obj/furnitures/chests/
dw_fluffos_v1/lib/obj/furnitures/clocks/
dw_fluffos_v1/lib/obj/furnitures/crockery/
dw_fluffos_v1/lib/obj/furnitures/cupboards/
dw_fluffos_v1/lib/obj/furnitures/cushions/
dw_fluffos_v1/lib/obj/furnitures/fake_plants/
dw_fluffos_v1/lib/obj/furnitures/lamps/
dw_fluffos_v1/lib/obj/furnitures/mirrors/
dw_fluffos_v1/lib/obj/furnitures/outdoor/
dw_fluffos_v1/lib/obj/furnitures/safes/
dw_fluffos_v1/lib/obj/furnitures/shelves/
dw_fluffos_v1/lib/obj/furnitures/sideboards/
dw_fluffos_v1/lib/obj/furnitures/sofas/
dw_fluffos_v1/lib/obj/furnitures/stoves/
dw_fluffos_v1/lib/obj/furnitures/tables/
dw_fluffos_v1/lib/obj/furnitures/wardrobes/
dw_fluffos_v1/lib/obj/handlers/
dw_fluffos_v1/lib/obj/handlers/autodoc/
dw_fluffos_v1/lib/obj/jewellery/anklets/
dw_fluffos_v1/lib/obj/jewellery/bracelets/
dw_fluffos_v1/lib/obj/jewellery/earrings/
dw_fluffos_v1/lib/obj/jewellery/misc/
dw_fluffos_v1/lib/obj/jewellery/necklaces/
dw_fluffos_v1/lib/obj/jewellery/rings/
dw_fluffos_v1/lib/obj/media/
dw_fluffos_v1/lib/obj/misc/buckets/
dw_fluffos_v1/lib/obj/misc/jars/
dw_fluffos_v1/lib/obj/misc/papers/
dw_fluffos_v1/lib/obj/misc/player_shop/
dw_fluffos_v1/lib/obj/misc/shops/
dw_fluffos_v1/lib/obj/misc/traps/
dw_fluffos_v1/lib/obj/monster/
dw_fluffos_v1/lib/obj/monster/godmother/
dw_fluffos_v1/lib/obj/monster/transport/
dw_fluffos_v1/lib/obj/plants/inherit/
dw_fluffos_v1/lib/obj/potions/
dw_fluffos_v1/lib/open/boards/
dw_fluffos_v1/lib/save/autodoc/
dw_fluffos_v1/lib/save/bank_accounts/
dw_fluffos_v1/lib/save/boards/frog/
dw_fluffos_v1/lib/save/books/bed_catalog/
dw_fluffos_v1/lib/save/creators/
dw_fluffos_v1/lib/save/mail/
dw_fluffos_v1/lib/save/mail/p/
dw_fluffos_v1/lib/save/newsrc/b/
dw_fluffos_v1/lib/save/newsrc/c/
dw_fluffos_v1/lib/save/newsrc/d/
dw_fluffos_v1/lib/save/newsrc/f/
dw_fluffos_v1/lib/save/newsrc/p/
dw_fluffos_v1/lib/save/newsrc/s/
dw_fluffos_v1/lib/save/newsrc/w/
dw_fluffos_v1/lib/save/players/c/
dw_fluffos_v1/lib/save/players/d/
dw_fluffos_v1/lib/save/players/g/
dw_fluffos_v1/lib/save/players/p/
dw_fluffos_v1/lib/save/players/s/
dw_fluffos_v1/lib/save/soul/data/
dw_fluffos_v1/lib/save/tasks/
dw_fluffos_v1/lib/save/vaults/
dw_fluffos_v1/lib/secure/cmds/lord/
dw_fluffos_v1/lib/secure/config/
dw_fluffos_v1/lib/secure/items/
dw_fluffos_v1/lib/secure/player/
dw_fluffos_v1/lib/soul/
dw_fluffos_v1/lib/soul/i/
dw_fluffos_v1/lib/soul/j/
dw_fluffos_v1/lib/soul/k/
dw_fluffos_v1/lib/soul/o/
dw_fluffos_v1/lib/soul/q/
dw_fluffos_v1/lib/soul/to_approve/
dw_fluffos_v1/lib/soul/u/
dw_fluffos_v1/lib/soul/v/
dw_fluffos_v1/lib/soul/wish_list/
dw_fluffos_v1/lib/soul/y/
dw_fluffos_v1/lib/soul/z/
dw_fluffos_v1/lib/std/creator/
dw_fluffos_v1/lib/std/effects/
dw_fluffos_v1/lib/std/effects/attached/
dw_fluffos_v1/lib/std/effects/external/
dw_fluffos_v1/lib/std/effects/fighting/
dw_fluffos_v1/lib/std/effects/other/
dw_fluffos_v1/lib/std/environ/
dw_fluffos_v1/lib/std/guilds/
dw_fluffos_v1/lib/std/hospital/
dw_fluffos_v1/lib/std/house/
dw_fluffos_v1/lib/std/house/onebedhouse/
dw_fluffos_v1/lib/std/house/onebedhut/
dw_fluffos_v1/lib/std/house/tworoomflat/
dw_fluffos_v1/lib/std/languages/
dw_fluffos_v1/lib/std/liquids/
dw_fluffos_v1/lib/std/nationality/
dw_fluffos_v1/lib/std/nationality/accents/
dw_fluffos_v1/lib/std/nationality/accents/national/
dw_fluffos_v1/lib/std/nationality/accents/regional/
dw_fluffos_v1/lib/std/npc/goals/
dw_fluffos_v1/lib/std/npc/goals/basic/
dw_fluffos_v1/lib/std/npc/goals/misc/
dw_fluffos_v1/lib/std/npc/inherit/
dw_fluffos_v1/lib/std/npc/plans/
dw_fluffos_v1/lib/std/npc/plans/basic/
dw_fluffos_v1/lib/std/outsides/
dw_fluffos_v1/lib/std/races/shadows/
dw_fluffos_v1/lib/std/room/basic/topography/
dw_fluffos_v1/lib/std/room/controller/
dw_fluffos_v1/lib/std/room/controller/topography/
dw_fluffos_v1/lib/std/room/furniture/games/
dw_fluffos_v1/lib/std/room/furniture/inherit/
dw_fluffos_v1/lib/std/room/inherit/carriage/
dw_fluffos_v1/lib/std/room/inherit/topography/
dw_fluffos_v1/lib/std/room/punishments/
dw_fluffos_v1/lib/std/room/topography/area/
dw_fluffos_v1/lib/std/room/topography/iroom/
dw_fluffos_v1/lib/std/room/topography/milestone/
dw_fluffos_v1/lib/std/shadows/
dw_fluffos_v1/lib/std/shadows/attached/
dw_fluffos_v1/lib/std/shadows/curses/
dw_fluffos_v1/lib/std/shadows/disease/
dw_fluffos_v1/lib/std/shadows/fighting/
dw_fluffos_v1/lib/std/shadows/room/
dw_fluffos_v1/lib/std/shops/controllers/
dw_fluffos_v1/lib/std/shops/objs/
dw_fluffos_v1/lib/std/shops/player_shop/
dw_fluffos_v1/lib/std/shops/player_shop/office_code/
dw_fluffos_v1/lib/std/socket/
dw_fluffos_v1/lib/www/
dw_fluffos_v1/lib/www/external/autodoc/
dw_fluffos_v1/lib/www/external/java/telnet/Documentation/
dw_fluffos_v1/lib/www/external/java/telnet/Documentation/images/
dw_fluffos_v1/lib/www/external/java/telnet/examples/
dw_fluffos_v1/lib/www/external/java/telnet/tools/
dw_fluffos_v1/lib/www/pics/
dw_fluffos_v1/lib/www/secure/creator/
dw_fluffos_v1/lib/www/secure/editors/
dw_fluffos_v1/lib/www/secure/survey_results/
/**
 * This object handles all the different types of clothing, their
 * locations etc.
 * @author Pinkfish
 *
 * Fiddled!  Actually added the cloak and dresses areas and fixed here and
 * there.
 * @Siel, Summer 2001
 */

#include <clothing.h>

mapping _types;
mapping _equivilants;
mapping _zones;
string *_zone_level;

protected void add_clothing_type(string name,
                                 string *not_remove,
                                 string *hiding);
protected void add_clothing_zone(string zone, string *types);
private int fixup_types(string type, string *types);
protected void add_equivilant_type(string name, string equiv);
private void check_clothing_types();
string *query_clothing_zone(string zone);
string *query_clothing_cannot_remove(string type);
string can_wear_or_remove(object thing, object player);

void create() {
   _types = ([ ]);
   _equivilants = ([ ]);
   _zones = ([ ]);
   _zone_level = ({ });

   //
   // Special type for bandaids..
   //
   add_clothing_type("bandaid", ({ }), ({ }));

   /* Do not reorder this next section, is it in a nice order. */
   add_clothing_type("wig", 
       ({ "hood", "helmet", "coif", "hat", "all covering" }), 
       ({ "hood", "helmet", "coif", "hat", "all covering" }));
   add_clothing_type("hat", 
       ({ "hood", "helmet", "all covering" }),
       ({ "hood", "helmet", "all covering" }));
   add_clothing_type("helmet", 
       ({ "hood", "all covering" }),
       ({ "hood", "all covering" }));
   add_clothing_type("hood", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("earring", 
       ({ "coif", "all covering" }), 
       ({ "hood", "coif", "all covering" }));
   add_clothing_type("moustache", 
       ({ "coif", "mask", "all covering" }), 
       ({ "coif", "mask", "all covering" }));
   add_clothing_type("glasses", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("nosering", 
       ({ "mask", "coif", "all covering" }), 
       ({ "mask", "coif", "all covering" }));
   add_clothing_type("mask", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("headband", 
       ({ "hat", "hood", "helmet", "coif", "all covering" }), 
       ({ "hat", "hood", "helmet", "coif", "all covering" }));
   add_clothing_type("scarf", 
       ({ "hood", "all covering" }), 
       ({ "hood", "all covering"}));
   add_clothing_type("necklace", 
       ({ "coif", "all covering" }), 
       ({ "cloak", "coif", "all covering" }));
   add_clothing_type("collar", 
       ({ "hood", "all covering" }), 
       ({ "hood", "all covering"}));
   add_clothing_type( "shoulder",
       ({ "cloak", "cape", "sash", "robe",  "tabard", "breastplate", 
          "hauberk", "haubergon", "byrnie", "jacket","jumper", "waistcoat",
          "shirt", "undershirt", "all covering" }), 
       ({ "cloak", "robe", "tabard", "breastplate", "hauberk", "haubergon", 
          "byrnie", "jacket", "jumper", "waistcoat", "shirt", "undershirt",
          "all covering" }));
   add_clothing_type( "bra",
       ({ "cloak", "cape", "sash", "robe",  "tabard", "breastplate", 
          "hauberk", "haubergon", "byrnie", "jacket","jumper", "waistcoat",
          "shirt", "undershirt", "all covering", "long dress", "mini dress" }), 
       ({ "cloak", "robe", "tabard", "breastplate", "hauberk", "haubergon", 
           "byrnie", "jacket", "jumper", "waistcoat", "shirt", "undershirt",
           "all covering", "long dress", "mini dress" }));
   add_clothing_type("undershirt",
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate", 
          "haubergon", "hauberk", "byrnie", "jacket","jumper", "waistcoat",
          "shirt", "harness", "all covering" }),
       ({ "cloak", "robe", "tabard", "breastplate", "haubergon", "hauberk", 
          "byrnie", "jacket", "jumper", "waistcoat", "shirt",
          "all covering" }));
   add_clothing_type("shirt",
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate", 
          "haubergon", "hauberk", "byrnie", "jacket",  "jumper", "waistcoat",
          "harness", "all covering" }),
       ({ "cloak", "robe", "haubergon", "hauberk", "byrnie", "jacket", "jumper",
          "all covering" }));
   add_clothing_type("waistcoat",
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate",
          "haubergon", "hauberk", "byrnie", "jacket", "jumper", "harness",
          "all covering" }),
       ({ "cloak", "robe", "haubergon", "hauberk", "byrnie", "jacket", "jumper",
          "shirt", "all covering" }));
   add_clothing_type("harness", 
       ({ "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("jumper",
       ({ "cloak", "cape", "sash", "robe", "breastplate", "haubergon", 
          "hauberk", "byrnie", "tabard", "jacket",  "all covering" }),
       ({ "cloak", "robe", "haubergon", "hauberk", "jacket", "all covering" }));
   add_clothing_type("jacket", 
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate", 
           "haubergon", "hauberk", "byrnie", "all covering" }),
       ({ "cloak", "robe", "hauberk", "all covering" }));
   add_clothing_type("tabard", 
       ({ "cloak", "cape", "sash", "robe", "all covering" }),
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("robe", 
       ({ "cloak", "cape", "sash", "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("cloak", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("sash", 
       ({ "cloak", "cape", "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("cape", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("armband", 
       ({ "all covering" }), 
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("glove", 
       ({ "all covering" }), 
       ({ "all covering" }));
   add_clothing_type("bracelet", 
       ({ "glove", "all covering" }), 
       ({ "cloak", "glove", "all covering" }));
   add_clothing_type("ring", 
       ({ "glove", "all covering" }), 
       ({ "glove", "all covering" }));
   add_clothing_type("box", 
       ({ "cloak", "robe", "all covering" }), 
       ({ "cloak", "robe", "skirt", "all covering" }));
   add_clothing_type("apron", 
       ({ "cloak", "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("underwear",
       ({ "harness", "trousers", "greave", "hauberk", "haubergon", 
          "byrnie", "belt", "trousers", "all covering" }), 
       ({ "cloak", "robe", "skirt", "trousers", "all covering", 
          "long dress", "mini dress" }));
   add_clothing_type("garter",
       ({ "greave", "hauberk", "trousers", "all covering"}),
       ({ "cloak", "robe", "greave", "hauberk", "trousers", "skirt", 
          "all covering", "long dress", "mini dress"}));
   add_clothing_type("skirt", 
       ({ "belt", "all covering" }), 
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("trousers", 
       ({ "greave", "hauberk", "belt" }),
       ({ "cloak", "hauberk", "robe", "all covering" }));
   add_clothing_type("belt",   
       ({"hauberk", "haubergon", "byrnie", "all covering" }),
       ({ "cloak", "robe", "hauberk", "haubergon", "byrnie", "all covering" }));
   add_clothing_type("sock",
       ({ "overshoe", "boot", "chausse", "all covering" }),
       ({ "cloak", "overshoe", "boot", "chausse", "all covering",
          "long dress" }));
   add_clothing_type("anklet",
       ({ }),
       ({ "cloak", "overshoe", "chausse", "all covering" }));
   add_clothing_type("boot", 
       ({ "overshoe" }),
       ({ "overshoe", "all covering" }));
   add_clothing_type("overshoe", 
       ({ }), 
       ({ "all covering" }));
   add_clothing_type("long dress", 
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate", 
          "haubergon", "hauberk", "byrnie", "jacket",  "jumper", "harness", 
          "all covering","belt" }),
       ({ "cloak", "robe", "haubergon", "hauberk", "byrnie", "jacket", 
          "jumper", "all covering" }));
   add_clothing_type("mini dress", 
       ({ "cloak", "cape", "sash", "robe", "tabard", "breastplate", 
          "haubergon", "hauberk", "byrnie", "jacket",  "jumper", "harness", 
          "all covering","belt" }),
       ({ "cloak", "robe", "haubergon", "hauberk", "byrnie", "jacket", 
          "jumper", "all covering" }));


   add_clothing_type("small shield", 
       ({"all covering" }), 
       ({ "all covering" }));
   add_clothing_type("shield", 
       ({"all covering" }), 
       ({ "all covering" }));
   add_clothing_type("large shield", 
       ({"all covering" }), 
       ({ "all covering" }));
   add_clothing_type("badge", 
       ({ "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("scabbard", 
       ({ "all covering" }), 
       ({ "cloak", "all covering" }));
   add_clothing_type("small scabbard", 
       ({ "all covering" }), 
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("belt scabbard", 
       ({ "all covering" }), 
       ({ "cloak", "robe", "all covering" }));

   // Maille armour

   add_clothing_type("coif", 
       ({ "hood", "scarf", "mask", "helmet", "hat", "all covering"}),
       ({ "hood", "all covering"}));
   add_clothing_type("byrnie", 
       ({ "cloak", "breastplate", "backplate", "tabard", "small scabbard", 
          "belt scabbard", "robe", "cape", "sash", "all covering" }),
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("haubergon", 
       ({ "cloak", "breastplate", "backplate", "tabard", "vambrace", 
          "small scabbard", "belt scabbard", "robe", "cape", "sash", 
          "all covering"}), 
       ({ "cloak", "robe", "all covering"}));
   add_clothing_type("hauberk", 
       ({ "cloak", "tabard", "vambrace", "greave", "breastplate", "backplate", 
          "small scabbard", "belt scabbard", "robe", "cape", "sash", 
          "all covering"}), 
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("chausse", 
       ({ "boot", "overshoe", "all covering"}), 
       ({ "boot", "overshoe", "all covering"}));

   // Plate armour
   add_clothing_type("breastplate", 
       ({ "cloak", "small scabbard", "belt scabbard", "robe", "tabard", 
          "cape", "sash", "all covering" }),
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("backplate", 
       ({ "cloak", "cape", "sash", "robe", "tabard", "all covering"}), 
       ({ "cloak", "cape", "sash", "robe", "all covering"}));
   add_clothing_type("vambrace", 
       ({ "glove", "all covering" }),
       ({ "cloak", "robe", "all covering" }));
   add_clothing_type("greave", 
       ({ "all covering" }), 
       ({ "cloak", "robe", "all covering" }));

   add_clothing_type("all covering", ({}), ({}));


   /* The clothing zones... */
   add_clothing_zone("head", 
       ({ "hood", "helmet", "coif", "hat", "wig", "headband", "moustache", 
          "glasses", "mask" }));
   add_clothing_zone("neck", 
       ({ "cloak", "hood", "coif", "cape", "scarf", "collar" }));
   add_clothing_zone("chest", 
       ({ "cloak", "sash", "robe", "breastplate", "haubergon", "hauberk", 
          "byrnie", "tabard", "jacket","jumper", "shirt", "undershirt", 
          "shoulder", "bra","shield", "large shield", "long dress",
          "mini dress", "apron" }));
   add_clothing_zone("back", 
       ({ "cloak", "cape", "sash", "robe", "hauberk", "haubergon", "byrnie", 
          "jacket", "jumper", "shirt", "undershirt", "backplate", 
          "long dress", "mini dress" }));
   add_clothing_zone("abdomen", 
       ({ "large shield", "robe", "breastplate", "byrnie", "hauberk", 
          "skirt", "box", "trousers", "underwear", "long dress", 
          "mini dress", "apron" }));
   add_clothing_zone("arms", 
       ({ "cloak", "small shield", "shield", "large shield", "robe", 
          "vambrace", "hauberk", "haubergon", "jacket", "armband", 
          "jumper", "shirt", "long dress" }));
   add_clothing_zone("hands", 
       ({ "glove", "small shield", "shield", "large shield" }));
   add_clothing_zone("legs", 
       ({ "cloak", "robe", "greave", "hauberk", "skirt", "trousers",
          "long dress" }));
   add_clothing_zone("feet", 
       ({ "overshoe", "boot", "chausse", "sock", "anklet" }));

   /* The equivilant types. */
   add_equivilant_type("shoe", "boot");
   add_equivilant_type("sandal", "boot");
   add_equivilant_type("clog", "boot");
   add_equivilant_type("sabaton", "boot");
   add_equivilant_type("turban", "helmet");
   add_equivilant_type("gorget", "collar");
   add_equivilant_type("stocking", "sock");
   add_equivilant_type("coat", "cape");
   call_out((: check_clothing_types() :), 2);
} /* create() */

/**
 * This method returns the list of things that are blocking the removal
 * of the specific object.
 * @param thing the thing to find what it is being blocked by
 * @param player the player to look it up on
 * @return the array of objects blocking it
 */
object* query_items_blocking(object thing, object player) {
   int i;
   int j;
   int k;
   string *stuff;
   object *blocking;
   mixed junk;
   mixed main_types;
   object *wearing;

   main_types = thing->query_type();
   if (stringp(main_types)) {
      main_types = ({ main_types });
   }
   wearing = player->query_wearing() - ({ thing });
   blocking = ({ });
   for (k=0;k<sizeof(main_types);k++) {
      stuff = query_clothing_cannot_remove(main_types[k]);
      if (!sizeof(wearing) || !stuff) {
         return ({ });
      }
      for (i = 0; i < sizeof(wearing); i++) {
         junk = wearing[i]->query_type();
         if (stringp(junk)) {
            junk = ({ junk });
         }
         for (j = 0; j < sizeof(junk); j++) {
            if (member_array(junk[j], stuff) != -1 &&
                 member_array(wearing[i], blocking) == -1) {
               blocking += ({ wearing[i] });
               break;
            }
         }
      }
   }
   return blocking;
} /* query_items_blocking() */

/**
 * This method returns whether or not a player can wear or remove a given item.
 * @param thing the item to be worn or removed.
 * @param player the person doing the wearing or removing.
 * @return 0 for success, a string for failure.
 */
string can_wear_or_remove( object thing, object player ) {
   object *blocking;

   blocking = query_items_blocking(thing, player);
   if (sizeof(blocking)) {
     return "when you are wearing "+ query_multiple_short(blocking);
   }
   return 0;
} /* can_wear_or_remove() */

/**
 * This method adds a new clothing type into the existing clothing
 * type mapping.
 * @param name the name of the clothing type
 * @param not_remove the types which if worn you cannot remove this item
 * @param hiding the types which hides this clothing
 */
protected void add_clothing_type(string name,
                                 string *not_remove,
                                 string *hiding) {
   _types[name] = new (class clothing_type, _hiding : hiding,
                                           _not_remove : not_remove);
} /* add_clothing_type() */

/**
 * This method returns the information associated with the clothing
 * of a particular type.
 * <p>
 * This will returns a class containing the clothing type information
 * in it.
 * @param name the name of the type to lookup
 * @return the clothing type array, 0 if not found
 * @see query_clothing_cannot_remove()
 * @see query_clothing_cannot_remove()
 */
class clothing_type query_clothing_type(string name) {
   return _types[name];
} /* query_clothing_type() */

/**
 * This method returns the items you would be unable to remove the
 * type with.
 * @param type the type of clothing to check
 * @return array of types you would be unable to remove, 0 if invalid type
 * @see query_clothing_hiding()
 * @see query_clothing_depth()
 */
string *query_clothing_cannot_remove(string type) {
   class clothing_type bing;

   bing = _types[type];
   if (bing) {
      return bing->_not_remove;
   }
   return 0;
} /* query_clothing_not_remove() */

/**
 * This method returns the types which hide this type of thingy.
 * @param type the type of clothing to check
 * @return array of types which would hide this type, 0 if invalid type
 * @see query_clothing_cannot_remove()
 * @see query_clothing_depth()
 */
string *query_clothing_hiding(string type) {
   class clothing_type bing;
 
   bing = _types[type];
   if (bing) {
      return bing->_hiding;
   }
   return ({ });
} /* query_clothing_hiding() */

/**
 * This method returns the depth of the clothing type.  The parament
 * can also be an array, in which case it will return the minimum
 * non-zero depth.
 * @param type the type of clothing to check
 * @return the depth rating of the type
 * @see query_clothing_cannot_remove()
 * @see query_clothing_hiding()
 */
int query_clothing_depth(mixed type) {
   class clothing_type bing;
   int depth;
   string str;
   int min_depth;

   if (stringp(type)) { 
      bing = _types[type];
      if (bing) {
         return bing->_depth;
      }
   } else if (pointerp(type)) {
      min_depth = 100000;
      foreach (str in type) {
         depth = query_clothing_depth(str);
         if (depth < min_depth && depth > 0) {
            min_depth = depth;
         }
      }
      return min_depth;
   }
   return 0;
} /* query_clothing_depth() */

/**
 * This method returns the depth of the clothing type.  The parament
 * can also be an array, in which case it will return the maximum
 * non-zero depth.
 * @param type the type of clothing to check
 * @return the depth rating of the type
 * @see query_clothing_cannot_remove()
 * @see query_clothing_hiding()
 */
int query_clothing_maximum_depth(mixed type) {
   class clothing_type bing;
   int depth;
   string str;
   int max_depth;

   if (stringp(type)) { 
      bing = _types[type];
      if (bing) {
         return bing->_depth;
      }
   } else if (pointerp(type)) {
      max_depth = 0;
      foreach (str in type) {
         depth = query_clothing_depth(str);
         if (depth > max_depth) {
            max_depth = depth;
         }
      }
      return max_depth;
   }
   return 0;
} /* query_clothing_depth() */

/**
 * This method returns a mapping of the current clothing types.
 * <p>
 * The make up of this array is:<br>
 * <dl>
 * <dh>first element
 * <dd> is the items which if you're wearing this
 * one cannot be removed.
 * <dh>second element
 * <dd>is the items which hide the given item.
 * </dl>
 * i.e. The wig type cannot be removed if types hood, helmet
 * or hat are also worn, also the wig type is not visible
 * if the types hood, helmet or hat are worn.
 * @return the mapping of clothing types
 * @see add_clothing_type()
 */
mapping query_all_clothing_types() {
   return _types;
} /* query_clothing_types() */

/**
 * This method will go through all the current types and make sure the
 * hidden and the cannot remove types are valid.  It will also figure
 * out depth numbers for all the types.
 */
private void check_clothing_types() {
   string ty;
   class clothing_type bits;
   string *stuff;
   string bing;
   string type;
   int rank;

tell_creator("presto", "called check_clothing_types\n");
   foreach (ty, bits in _types) {
      foreach (bing in bits->_not_remove) {
         if (!query_clothing_type(bing)) {
            write("Unknown clothing type " + bing + " in the not remove "
                  " for " + ty + ".\n");
         }
      }
      foreach (bing in bits->_hiding) {
         if (!query_clothing_type(bing)) {
            write("Unknown clothing type " + bing + " in the hiding "
                  " for " + ty + ".\n");
         }
      }
   }
   /*
    * Go through each zone and assign levels to them...
    */
   rank = 1;
   foreach (bing in _zone_level) {
      stuff = query_clothing_zone(bing);
      /* Set the top levels. */
      foreach (type in stuff) {
         bits = _types[type];
         if (!bits->_depth &&
             (sizeof(bits->_not_remove) == 0  ||
             bits->_not_remove[0] == "all covering")) {
            bits->_depth = rank;
            rank = fixup_types(type, stuff);
         }
      }
      foreach (type in stuff) {
         bits = _types[type];
         if (!bits->_depth) {
tell_creator("presto", "setting depth of %O to %d\n", type, rank + 1);
            bits->_depth = rank++;
         }
      }
   }
} /* check_clothing_types() */

private int fixup_types(string type, string *types) {
   string bing;
   class clothing_type base;
   class clothing_type bits;
   int depth;

   base = _types[type];
   depth = base->_depth + 1;
   foreach (bing in types) {
      bits = _types[bing];
      /* Gravitate it upwards... */
      if (!bits->_depth &&
          member_array(type, bits->_not_remove) != -1) {
         bits->_depth = depth;
         depth = fixup_types(bing, types);
      }
   }
   return depth;
} /* fixup_types() */

/**
 * This method adds a clothing zone.
 * @param zone the zone name
 * @param types the types to add to the zone
 */
protected void add_clothing_zone(string zone, string *types) {
   string ty;

   /* Check to make sure each type exists. */
   foreach (ty in types) {
      if (!query_clothing_type(ty)) {
         write("Incorrect clothing type " + ty + " in zone " + zone + ".\n");
      }
   }
   _zones[zone] = types;
   _zone_level += ({ zone });
} /* add_clothing_zone() */

/**
 * This method sets the zones that a particular clothing type covers
 * @param type the clothing type
 * @zones the zones covered.
 */
protected void add_zone_coverage(string type, string *zones) {
  string zone;
  
  if(!query_clothing_type(type))
    write("Incorrect clothing type " + type + "\n");

  foreach(zone in zones)
    if(member_array(type, zones) != -1)
      _zones[zone] += ({ type });
}

/**
 * This method returns the clothing zones.  The mapping consists of
 * arrays of types which are in the particular zones.
 * @return the clothing zones
 */
mapping query_all_clothing_zones() {
   return _zones;
} /* query_clothing_zones() */

/**
 * This method returns the array of clothing types in the particular
 * zone.
 * @param zone the zone to get the types for
 * @return the clothing in the current zone
 */
string *query_clothing_zone(string zone) {
   return _zones[zone];
} /* query_clothing_zone() */

/**
 * This method finds the zone for the specific type.
 * @param type the type to find in the zones
 * @return the zone name, 0 if not found
 */
string query_zone_name(string type) {
   string zone;
   string *stuff;

   foreach (zone, stuff in _zones) {
      if (member_array(type, stuff) != -1) {
         return zone;
      }
   }
   return 0;
} /* query_zone_name() */

/**
 * This method finds all the zones for the specific type.
 * @param type the type to find in the zones
 * @return the zone names, 0 if not found
 */
string *query_zone_names(string type) {
   string zone;
   string *stuff;
   string *zones;
   
   if(_equivilants[type])
     type = _equivilants[type];
   
   zones = ({ });
   foreach (zone, stuff in _zones) {
     if (member_array(type, stuff) != -1 && zone) {
       zones += ({ zone });
     }
   }
   return zones;
} /* query_zone_name() */

/**
 * This method returns the level for the specified zone.
 * @param zone the zone to check
 * @return the level of the zone
 */
int query_zone_level(string zone) {
   int i;

   i = member_array(zone, _zone_level);
   return i * 100;
} /* query_zone_level() */

/**
 * This method adds an equivilant type.
 * @param name the name of the type
 * @param equiv what it is equivilant to
 */
protected void add_equivilant_type(string name, string equiv) {
   if (!query_clothing_type(equiv)) {
      write("Incorrect clothing type " + equiv + " in equivilant listing.\n");
   }
   _equivilants[name] = equiv;
} /*  add_equivilant_type() */

/**
 * This method returns all the equivilant types.
 * @return the equivilant types
 */
mapping query_all_equivilant_types() {
   return _equivilants;
} /* query_equivilant_types() */

/**
 * This method returns the equivilant type for the given type.
 * @param type the type to get the equivilant fo
 * @return the equivilant type
 */
string query_equivilant_type(string type) {
   return _equivilants[type];
} /* query_equivilant_type() */
 
/**
 * This method tells us if the type is valid.  It checks both normal
 * types and equivilant types.
 * @param type the type to check
 * @return 1 if it is valid, 0 if not
 * @query_equivilant_type()
 * @query_clothing_type()
 */
int query_valid_type(string type) {
   if (query_clothing_type(type) ||
       query_equivilant_type(type)) {
      return 1;
   }
   return 0;
} /* query_valid_type() */