/*
 * $Locker:  $
 * $Id: single_shoulder.c,v 1.3 2000/05/08 03:56:57 pinkfish Exp $
 * $Log: single_shoulder.c,v $
 * Revision 1.3  2000/05/08 03:56:57  pinkfish
 * Fix up a problem caused by adding in the object as the arg to
 * wear effects.
 *
 * Revision 1.2  1998/09/30 09:37:00  pinkfish
 * Changed to handle only satchels and backpacks as possible things for
 * increasing the dexterity handicap.
 *
 * Revision 1.1  1998/01/06 04:35:11  ceres
 * Initial revision
 *
*/
#include "path.h"
inherit "/std/effect_shadow";
/**
 * @ignore yes
 * This method makes sure that we are opnly picking up backpacks and
 * satchels etc.
 * @return true if they are a satchel
 */
private int test_sash( object thing ) {
    return thing->query_type() == "sash" && sizeof( thing->query_pockets() );
} /* test_sash() */
/**
 * @ignore yes
 * This method checks to make sure the item has the effect on it.
 */
private int test_for_effect( object thing ) {
    return member_array( EFFECTS +"single_shoulder",
        (string *)thing->query_wear_effects() ) != -1;
} /* test_for_effect() */
/**
 * @ignore yes
 * This method checks the current handicap and sets it up nicely to
 * the correct value.
 */
void check_handicap() {
    mixed old_arg;
    int new_arg;
    object *things;
    things = (object *)player->query_wearing() - ({ 0 });
    if( objectp( old_arg = arg() ) )
        old_arg = 0;
    new_arg = sizeof( filter( things, (: test_sash :), TO ) ) *
              sizeof( filter( things, (: test_for_effect :), TO ) );
    if( !new_arg ) {
        remove_this_effect();
        return;
    }
    new_arg /= 2;
    if( old_arg == new_arg )
        return;
    player->adjust_bonus_dex( old_arg - new_arg );
    set_arg( new_arg );
} /* check_handicap() */
/** @ignore yes */
void now_worn( object thing ) {
    player->now_worn( thing );
    if( find_call_out("check_handicap") == -1 )
        call_out("check_handicap", 0 );
} /* now_worn() */
/** @ignore yes */
void now_removed( object thing ) {
    player->now_removed( thing );
    if( find_call_out("check_handicap") == -1 )
        call_out("check_handicap", 0 );
} /* now_removed() */