Esempio n. 1
0
varargs int remove_armour(int silent) {
   object owner = environment(this_object()), obj;
   if (!worn)
      return 0;
   if (!owner->query_is_living())
      return 0;
   set_target(this_object());
   // check if they're wearing anything over this item
   foreach ( obj : all_inventory(owner) ) {
      if( obj->query_is_apparel() &&
         (obj->query_body_parts() & query_body_parts()) &&
         obj->query_layer() > layer) {
         if( !silent )
           msg("You can't remove ~targ, without first removing "+obj->query_name()+".");
         return 0;
      }
   }
   // returns true if on_remove() has been defined, so false means we have
   // to do this our selves as well
   if (this_object()->on_remove() == 0) {
      if (this_object()->query_cursed()) {
         if (!silent)
            msg_object(owner,"You can't remove ~targ! It appears to be cursed!");
      } else {
         if (!silent)
            owner->msg_local("~Name ~verbremove ~targ.");
         set_worn(0);
         owner->recalc();
         return 1;
      }
   }
}
Esempio n. 2
0
varargs int wear_armour(int silent) {
   object owner = environment(this_object());
   object obj;
   int tlayer = 0;
   set_target(this_object());
   if (worn) {
      if (!silent)
         msg("You are already wearing ~targ!");
      return 0;
   }
   if (!owner->query_is_living())
      return 0;
   if (!owner->query_has_bp(query_body_parts())) {
      if (!silent)
         msg("You lack the required appendages to wear ~targ!");
      return 0;
   }

   // returns non-zero if base requirements are not met
   if (this_object()->query_requirements_met(this_player()) != 0)
      return 0;

   if (this_object()->query_broken()) {
      if (!silent)
         msg("You can't wear ~targ, it's broken!");
      return 0;
   }
   //debug("size = "+query_size()+", flex = "+query_flexible());
   // check if they're wearing anything already
   foreach ( obj : all_inventory(owner) ) {
      if (obj->query_is_apparel() && obj->query_worn()) {
         if (obj->query_body_parts() & query_body_parts()) {
            int osize = obj->query_size();
            int oflex = obj->query_flexible();
            int ocloth = obj->query_cloth();
            int small;

            if (ocloth) {
               if (oflex && osize > query_size()) {
                  // flexible cloth
                  small = 1;
            } else if (!oflex && osize > query_size() - 3) {
                  // rigid cloth
                  small = 1;
               }
            } else {
               if (oflex && osize > query_size() - 5) {
                  // flexible metal (example: chainmail)
                  small = 1;
               }

               // can't wear rigid clothing over other rigid clothing.
               if (!oflex && !query_flexible()) {
                  small = 1;
               }
            }
            if (small) {
               msg("You can't wear ~targ over your "+obj->query_name()+".");
               return 0;
            }
            if (obj->query_layer() > tlayer)
               tlayer = obj->query_layer();
         }
      }
   }
   layer = tlayer + 1;
   // returns true if on_wear() has been defined, so false means we need
   // to manually wear the item for them
   if (this_object()->on_wear() == 0) {
      if (!silent) {
         owner->msg_local("~Name ~verbwear ~targ.");
      }
      set_worn(1);
      owner->recalc();
      return 1;
   }
}
Esempio n. 3
0
void player_morale::on_item_takeoff( const item &it )
{
    set_worn( it, false );
}
Esempio n. 4
0
void player_morale::on_item_wear( const item &it )
{
    set_worn( it, true );
}