/*
 * This is the effect skelton docs.  This effect
 * has a classification of "body.damage.arm.broken".
 * <p>
 * 
 * The argument returned is an array:
 *   (*string) Arg[0] - a list of limbs which are broken
 * 
 * To add a new break: add_effect( player, ({ limb }) ), where limb
 *   is a string, usually "right" or "left".
 *
 * This effect has a shadow associated with it.
 * @classification body.damage.arm.broken
 * @see help::effects
 */
#define CLASS  "body.damage.arm.broken"
#define SHADOW "/std/shadows/other/broken_arm"
#include "/std/effects/other/path.h"
#include <effect.h>
/** @ignore yes */
string query_classification() { return CLASS; }
/** @ignore yes */
void beginning( object player, string *which ) {
  int handicap;
  object item;
  if( !playtesterp(player) ) return;
  player->add_extra_look( this_object() );
  handicap = (int)player->query_real_dex();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_dex( -handicap );
  handicap = (int)player->query_real_str();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_str( -handicap );
  if( member_array( "right", which ) != -1 ) {
    item = player->query_holding()[0];
    if( item ) {
      tell_object( player, sprintf( "You drop %s.\n",
          item->the_short() ) );
      item->move( environment( player ) );
    }
  }
  if( member_array( "left", which ) != -1 ) {
    item = player->query_holding()[1];
    if( item ) {
      tell_object( player, sprintf( "You drop %s.\n",
          item->the_short() ) );
      item->move( environment( player ) );
    }
  }
} /* beginning() */
/** @ignore yes */
void restart( object player, string *which ) {
  int handicap;
  player->add_extra_look( this_object() );
  handicap = (int)player->query_real_dex();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_dex( -handicap );
  handicap = (int)player->query_real_str();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_str( -handicap );
} /* restart() */
/** @ignore yes */
string *merge_effect( object player, string *which1, string *which2 ) {
  int i, handicap;
  object item;
  string *which;
  handicap = (int)player->query_real_dex();
  handicap = ( sizeof( which1 ) * handicap ) / ( 2 + sizeof( which1 ) );
  player->adjust_bonus_dex( handicap );
  handicap = (int)player->query_real_str();
  handicap = ( sizeof( which1 ) * handicap ) / ( 2 + sizeof( which1 ) );
  player->adjust_bonus_str( handicap );
  which = which1;
  for ( i = 0; i < sizeof( which2 ); i++ )
    if ( member_array( which2[ i ], which ) == -1 )
      which += ({ which2[ i ] });
  handicap = (int)player->query_real_dex();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_dex( -handicap );
  handicap = (int)player->query_real_str();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_str( -handicap );
  if( member_array( "right", which ) != -1 ) {
    item = player->query_holding()[0];
    if( item ) {
      tell_object( player, sprintf( "You drop %s.\n",
          item->the_short() ) );
      item->move( environment( player ) );
    }
  }
  if( member_array( "left", which ) != -1 ) {
    item = player->query_holding()[1];
    if( item ) {
      tell_object( player, sprintf( "You drop %s.\n",
          item->the_short() ) );
      item->move( environment( player ) );
    }
  }
  return which;
} /* merge_effect() */
/** @ignore yes */
void end( object player, string *which ) {
  int handicap;
  player->remove_extra_look( this_object() );
  handicap = (int)player->query_real_dex();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_dex( handicap );
  handicap = (int)player->query_real_str();
  handicap = ( sizeof( which ) * handicap ) / ( 2 + sizeof( which ) );
  player->adjust_bonus_str( handicap );
} /* end() */
/** @ignore yes */
string extra_look( object player ) {
  int *enums;
  string *which;
  enums = (int *)player->effects_matching( CLASS );
  if ( !sizeof( enums ) ) return "";
  which = (string *)player->arg_of( enums[ 0 ] );
  return capitalize( (string)player->query_pronoun() ) +" has broken "+
      (string)player->query_possessive() +" "+
      query_multiple_short( which ) +" arm"+
      ( sizeof( which ) == 1 ? "" : "s" ) +".\n";
} /* extra_look() */
/** @ignore yes */
int query_indefinite() { return 1; }
/** @ignore yes */
string query_shadow_ob() { return SHADOW; }
int query_theft_command() { return 1; }