/**
 * This is a pocketed armour inherit.
 * @author Sandoz, 2002.
 */
#define AC_LIMIT 100 // This is used in pocket_armour as well.
inherit "/std/armour_logic";
inherit CLOTHING_OBJ;
/**
 * This method queries wether or not the object is a clothing object.
 * This is an override of the same function in the inherited
 * clothing object.
 * @return always return 0, because this is armour
 */
int query_clothing() { return 0; }
/**
 * This method returns 1 to tell us that it is armour.
 * @return always returns 1
 */
int query_armour() { return 1; }
/** @ignore yes */
void create() {
    do_setup++;
    armour_logic::create();
    clothing::create();
    remove_immune_to("blunt");
    remove_alias("clothing");
    remove_plural("clothes");
    do_setup--;
    if( !do_setup )
        TO->setup();
} /* create() */
/** @ignore yes */
varargs int query_ac( string type, int amount, string zone ) {
    int a_class;
#ifdef INFORM
    string message;
#endif
    a_class = armour_logic::query_ac( type, amount, zone );
#ifdef INFORM
    message = query_short() +": striking " + zone + ", basic value "+ a_class;
#endif
    if( a_class > AC_LIMIT )
        a_class = AC_LIMIT;
    a_class += ( a_class * query_enchant() ) / query_max_enchant() +
        query_enchant();
#ifdef INFORM
    message += "; after enchant "+ a_class;
    if( objectp( worn_by ) )
        event( ENV( worn_by ), "inform", message, "combat" );
#endif
    do_damage( type, amount );
    a_class = ( a_class * cond ) / max_cond;
    // damage may get through depending on how good the armour is.
    switch( random( a_class ) ) {
    case 0:
      return 0;
    case 1:
      return a_class / 2;
    case 2..3:
      return a_class * 2 / 3;
    default:
      // they'll always take a small amount of damage.
      if( a_class > amount )
          return amount - ( amount / ( 5 + random( 10 ) ) );
      return a_class - ( amount / ( 5 + random( 10 ) ) );
    }
} /* query_ac() */
/** @ignore yes */
void setup_armour( int i ) { return setup_clothing( i ); }
/** @ignore yes */
mixed stats() {
    return clothing::stats() + armour_logic::stats() +
        ({ ({ "max ac", AC_LIMIT }) });
} /* stat() */
/** @ignore yes */
mapping int_query_static_auto_load() {
    return ([
        "::" : clothing::int_query_static_auto_load(),
        "ac" : ac,
        "armour types" : armour_types,
        ]);
} /* query_static_auto_load() */
/** @ignore yes */
mapping query_static_auto_load() {
    if( base_name(TO) != __FILE__[0..<3] )
        return ([ ]);
    return int_query_static_auto_load();
} /* query_static_auto_load() */
/** @ignore yes */
void init_static_arg( mapping map ) {
    if( !mapp( map ) )
        return;
    if( map[ "::" ] )
        clothing::init_static_arg( map[ "::" ] );
    if( map[ "ac" ] )
        ac = map[ "ac" ];
    if( map["armour types"] )
        armour_types = map["armour types"];
} /* init_static_arg() */