/* * Give an obj to a char. */ void Object::obj_to_char (Character * ch) { ch->carrying.push_back(this); carried_by = ch; in_room = NULL; in_obj = NULL; ch->carry_number += get_obj_number(); ch->carry_weight += get_obj_weight(); }
/* * Move an object into an object. */ void Object::obj_to_obj (Object * obj_to) { obj_to->contains.push_back(this); in_obj = obj_to; in_room = NULL; carried_by = NULL; for (; obj_to != NULL; obj_to = obj_to->in_obj) { if (obj_to->carried_by != NULL) { obj_to->carried_by->carry_number += get_obj_number(); obj_to->carried_by->carry_weight += get_obj_weight(); } } return; }
/* * Take an obj from its character. */ void Object::obj_from_char () { Character *ch = carried_by; if (ch == NULL) { bug_printf ("Obj_from_char: null ch."); return; } if (wear_loc != WEAR_NONE) ch->unequip_char(this); ch->carrying.erase(find(ch->carrying.begin(),ch->carrying.end(), this)); carried_by = NULL; ch->carry_number -= get_obj_number(); ch->carry_weight -= get_obj_weight(); return; }
/* * Move an object out of an object. */ void Object::obj_from_obj () { Object *obj_from = in_obj; if (obj_from == NULL) { bug_printf ("Obj_from_obj: null obj_from."); return; } obj_from->contains.erase(find(obj_from->contains.begin(), obj_from->contains.end(), this)); in_obj = NULL; for (; obj_from != NULL; obj_from = obj_from->in_obj) { if (obj_from->carried_by != NULL) { obj_from->carried_by->carry_number -= get_obj_number(); obj_from->carried_by->carry_weight -= get_obj_weight(); } } return; }
void get_obj(struct char_data *ch, struct gameobject *obj, struct gameobject *container) { struct char_data *gch; int members; char buffer[100]; if (!CAN_WEAR(obj, ITEM_TAKE)) { send_to_char("You can't take that.\n\r", ch); return; } if ((ch->carry_number + get_obj_number(obj)) > can_carry_n(ch) && (!IS_IMMORTAL(ch))) { act("$d: you can't carry that many items.", ch, NULL, object_name_get(obj), TO_CHAR); return; } if ((ch->carry_weight + get_obj_weight(obj)) > can_carry_w(ch)) { act("$d: you can't carry that much weight.", ch, NULL, object_name_get(obj), TO_CHAR); return; } if (obj->in_room != NULL) { for (gch = obj->in_room->people; gch != NULL; gch = gch->next_in_room) { if (gch->on == obj) { act("$N appears to be using $p.", ch, obj, gch, TO_CHAR); return; } } } if (container != NULL) { if (container->objprototype->vnum == OBJ_VNUM_PIT && get_trust(ch) < obj->level) { send_to_char("You are not powerful enough to use it.\n\r", ch); return; } if (container->objprototype->vnum == OBJ_VNUM_PIT && !CAN_WEAR(container, ITEM_TAKE) && !IS_OBJ_STAT(obj, ITEM_HAD_TIMER)) obj->timer = 0; act_new("You get $p from $P.", ch, obj, container, TO_CHAR, POS_RESTING, true); act_new("$n gets $p from $P.", ch, obj, container, TO_ROOM, POS_RESTING, true); REMOVE_BIT(obj->extra_flags, ITEM_HAD_TIMER); obj_from_obj(obj); } else { act_new("You get $p.", ch, obj, container, TO_CHAR, POS_RESTING, true); act_new("$n gets $p.", ch, obj, container, TO_ROOM, POS_RESTING, true); obj_from_room(obj); } if (obj->item_type == ITEM_MONEY) { ch->silver += obj->value[0]; ch->gold += obj->value[1]; if (IS_SET(ch->act, PLR_AUTOSPLIT)) { members = 0; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) if (!IS_AFFECTED(gch, AFF_CHARM) && is_same_group(gch, ch)) members++; if (members > 1 && (obj->value[0] > 1 || obj->value[1])) { sprintf(buffer, "%ld %ld", obj->value[0], obj->value[1]); do_split(ch, buffer); } } extract_obj(obj); } else { obj_to_char(obj, ch); } return; }
void do_buy( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; int maxgold; bool debit; OBJ_DATA *obj; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Buy what?\n\r", ch ); return; } if ( IS_SET(ch->in_room->room_flags, ROOM_PET_SHOP) ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *pet; ROOM_INDEX_DATA *pRoomIndexNext; ROOM_INDEX_DATA *in_room; if ( argument[0] == '\0' ) debit = FALSE; else if ( !str_cmp( "atm", argument ) || !str_cmp( "debit", argument ) ) { bool has_card = FALSE; for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if ( obj->item_type == ITEM_DEBIT_CARD ) has_card = TRUE; } if ( has_card == TRUE ) debit = TRUE; else { send_to_char( "You don't even have your card with you!\n\r", ch ); return; } } if ( IS_NPC(ch) ) return; pRoomIndexNext = get_room_index( ch->in_room->vnum + 1 ); if ( !pRoomIndexNext ) { bug( "Do_buy: bad pet shop at vnum %d.", ch->in_room->vnum ); send_to_char( "Sorry, you can't buy that here.\n\r", ch ); return; } in_room = ch->in_room; ch->in_room = pRoomIndexNext; pet = get_char_room( ch, arg ); ch->in_room = in_room; if ( pet == NULL || !IS_NPC( pet ) || !IS_SET(pet->act, ACT_PET) ) { send_to_char( "Sorry, you can't buy that here.\n\r", ch ); return; } if (( ch->gold < 10 * pet->top_level * pet->top_level ) && debit == FALSE) { send_to_char( "You can't afford it.\n\r", ch ); return; } else if ( (ch->pcdata->bank < 10 * pet->top_level * pet->top_level) && debit == TRUE ) { send_to_char( "You dont have enough money in your bank account for it.\n\r", ch ); return; } maxgold = 10 * pet->top_level * pet->top_level; if ( debit == FALSE ) ch->gold -= maxgold; /* this was already here, btw */ else ch->pcdata->bank -= maxgold; boost_economy( ch->in_room->area, maxgold ); pet = create_mobile( pet->pIndexData ); SET_BIT(pet->act, ACT_PET); SET_BIT(pet->affected_by, AFF_CHARM); argument = one_argument( argument, arg ); if ( arg[0] != '\0' ) { sprintf( buf, "%s %s", pet->name, arg ); STRFREE( pet->name ); pet->name = STRALLOC( buf ); } sprintf( buf, "%sA neck tag says 'I belong to %s'.\n\r", pet->description, ch->name ); STRFREE( pet->description ); pet->description = STRALLOC( buf ); char_to_room( pet, ch->in_room ); add_follower( pet, ch ); send_to_char( "Enjoy your pet.\n\r", ch ); act( AT_ACTION, "$n bought $N as a pet.", ch, NULL, pet, TO_ROOM ); return; } else { CHAR_DATA *keeper; int cost; int noi = 1; /* Number of items */ sh_int mnoi = 20; /* Max number of items to be bought at once */ if ( ( keeper = find_keeper( ch ) ) == NULL ) return; maxgold = keeper->top_level * 10; if ( is_number( arg ) ) { noi = atoi( arg ); argument = one_argument( argument, arg ); if ( noi > mnoi ) { act( AT_TELL, "$n tells you 'I don't sell that many items at" " once.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } } if ( argument[0] == '\0' ) debit = FALSE; else if ( !str_cmp( "atm", argument ) || !str_cmp( "debit", argument ) ) { bool has_card = FALSE; for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if ( obj->item_type == ITEM_DEBIT_CARD ) has_card = TRUE; } if ( has_card == TRUE ) debit = TRUE; else { send_to_char( "You don't even have your card with you!\n\r", ch ); return; } } obj = get_obj_carry( keeper, arg ); if ( !obj && arg[0] == '#' ) { int onum, oref; bool ofound = FALSE; onum =0; oref = atoi(arg+1); for ( obj = keeper->last_carrying; obj; obj = obj->prev_content ) { if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) ) onum++; if ( onum == oref ) { ofound = TRUE; break; } else if ( onum > oref ) break; } if (!ofound) obj = NULL; } if (keeper->home != NULL && obj->cost > 0) cost= obj->cost; cost = ( get_cost( ch, keeper, obj, TRUE ) * noi ); if( !IS_NPC(ch) && ch->pcdata->learned[gsn_bargain] > 0 && ch->pcdata->learned[gsn_bargain] > number_percent()) { ch_printf(ch,"You are able to bargain from %d credits to %d credits!\n\r", cost, (cost/3)+(cost/2)); cost = (cost/3) + (cost/2); if(number_percent() > 50) learn_from_success(ch, gsn_bargain); } if ( cost <= 0 || !can_see_obj( ch, obj ) ) { act( AT_TELL, "$n tells you 'I don't sell that -- try 'list'.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if ( !IS_OBJ_STAT( obj, ITEM_INVENTORY ) && ( noi > 1 ) ) { interpret( keeper, "laugh" ); act( AT_TELL, "$n tells you 'I don't have enough of those in stock" " to sell more than one at a time.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if ( ch->gold < cost && debit == FALSE) { act( AT_TELL, "$n tells you 'You can't afford to buy $p.'", keeper, obj, ch, TO_VICT ); ch->reply = keeper; return; } if ( ch->pcdata->bank < cost && debit == TRUE) { send_to_char( "You are almost slide your card through, but you remember you don't have enough money!\n\r", ch ); return; } if ( IS_SET(obj->extra_flags, ITEM_PROTOTYPE) && get_trust( ch ) < LEVEL_IMMORTAL ) { act( AT_TELL, "$n tells you 'This is a only a prototype! I can't sell you that...'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if ( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) ) { send_to_char( "You can't carry that many items.\n\r", ch ); return; } if ( ch->carry_weight + ( get_obj_weight( obj ) * noi ) + (noi > 1 ? 2 : 0) > can_carry_w( ch ) ) { send_to_char( "You can't carry that much weight.\n\r", ch ); return; } if ( noi == 1 ) { if ( !IS_OBJ_STAT( obj, ITEM_INVENTORY ) ) separate_obj( obj ); act( AT_ACTION, "$n buys $p.", ch, obj, NULL, TO_ROOM ); act( AT_ACTION, "You buy $p.", ch, obj, NULL, TO_CHAR ); } else { sprintf( arg, "$n buys %d $p%s.", noi, ( obj->short_descr[strlen(obj->short_descr)-1] == 's' ? "" : "s" ) ); act( AT_ACTION, arg, ch, obj, NULL, TO_ROOM ); sprintf( arg, "You buy %d $p%s.", noi, ( obj->short_descr[strlen(obj->short_descr)-1] == 's' ? "" : "s" ) ); act( AT_ACTION, arg, ch, obj, NULL, TO_CHAR ); act( AT_ACTION, "$N puts them into a bag and hands it to you.", ch, NULL, keeper, TO_CHAR ); } if ( debit == FALSE ) ch->gold -= cost; /* this line was already here, btw */ else if ( debit == TRUE ) ch->pcdata->bank -= cost; keeper->gold += cost; if ( keeper->gold > maxgold ) { boost_economy( keeper->in_room->area, keeper->gold - maxgold/2 ); keeper->gold = maxgold/2; act( AT_ACTION, "$n puts some credits into a large safe.", keeper, NULL, NULL, TO_ROOM ); } if ( IS_OBJ_STAT( obj, ITEM_INVENTORY ) ) { OBJ_DATA *buy_obj, *bag; buy_obj = create_object( obj->pIndexData, obj->level ); /* * Due to grouped objects and carry limitations in SMAUG * The shopkeeper gives you a bag with multiple-buy, * and also, only one object needs be created with a count * set to the number bought. -Thoric */ if ( noi > 1 ) { bag = create_object( get_obj_index( OBJ_VNUM_SHOPPING_BAG ), 1 ); /* perfect size bag ;) */ bag->value[0] = bag->weight + (buy_obj->weight * noi); buy_obj->count = noi; obj->pIndexData->count += (noi - 1); numobjsloaded += (noi - 1); obj_to_obj( buy_obj, bag ); obj_to_char( bag, ch ); } else obj_to_char( buy_obj, ch ); } else { obj_from_char( obj ); obj_to_char( obj, ch ); } return; } }
/* * Apply or remove an affect to a character. */ void affect_modify( CHAR_DATA *ch, AFFECT_DATA *paf, bool fAdd ) { OBJ_DATA *wield; int mod,i; mod = paf->modifier; if ( fAdd ) { SET_BIT( ch->affected_by, paf->bitvector ); SET_BIT( ch->affected_by_2, paf->bitvector_2 ); } else { REMOVE_BIT( ch->affected_by, paf->bitvector ); REMOVE_BIT( ch->affected_by_2, paf->bitvector_2 ); mod = 0 - mod; } switch ( paf->location ) { default: bug( "Affect_modify: unknown location %d.", paf->location ); return; case APPLY_NONE: break; case APPLY_STR: ch->mod_stat[STAT_STR] += mod; break; case APPLY_DEX: ch->mod_stat[STAT_DEX] += mod; break; case APPLY_INT: ch->mod_stat[STAT_INT] += mod; break; case APPLY_WIS: ch->mod_stat[STAT_WIS] += mod; break; case APPLY_CON: ch->mod_stat[STAT_CON] += mod; break; case APPLY_CHR: ch->mod_stat[STAT_CHR] += mod; break; case APPLY_LUK: ch->mod_stat[STAT_LUK] += mod; break; case APPLY_AGI: ch->mod_stat[STAT_AGI] += mod; break; case APPLY_SEX: ch->sex += mod; break; case APPLY_CLASS: break; case APPLY_LEVEL: break; case APPLY_AGE: break; case APPLY_HEIGHT: break; case APPLY_WEIGHT: break; case APPLY_HIT: ch->max_hit += mod; break; case APPLY_STAMINA: ch->max_stamina += mod; break; case APPLY_GOLD: break; case APPLY_EXP: break; case APPLY_AC: for (i = 0; i < 4; i ++) ch->armor[i] += mod; break; case APPLY_HITROLL: ch->hitroll += mod; break; case APPLY_DAMROLL: ch->damroll += mod; break; case APPLY_SPELL: apply_spell( ch, mod ); break; case APPLY_SKILL: if ( !IS_NPC(ch) ) { if ( mod >= 0 ) { if ( ch->pcdata->skill_mod[slot_lookup(mod)] > 0 ) ch->pcdata->skill_mod[slot_lookup(mod)] += 5; } else { if ( ch->pcdata->skill_mod[slot_lookup(abs(mod))] > 0 ) ch->pcdata->skill_mod[slot_lookup(abs(mod))] -= 5; } } break; } /* * Check for weapon wielding. * Guard against recursion (for weapons with affects). */ if ( !IS_NPC(ch) && ( wield = get_eq_char( ch, WEAR_WIELD ) ) != NULL && get_obj_weight(wield) > str_app[get_curr_stat(ch,STAT_STR)].wield ) { static int depth; if ( depth == 0 ) { depth++; act( "You drop $p.", ch, wield, NULL, TO_CHAR ); act( "$n drops $p.", ch, wield, NULL, TO_ROOM ); obj_from_char( wield ); obj_to_room( wield, ch->in_room ); depth--; } } return; }
void do_buy( CHAR_DATA * ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; int maxgold = 0; argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Buy what?\r\n", ch ); return; } /* in case of different shop types */ { CHAR_DATA *keeper = NULL; OBJ_DATA *obj = NULL; int cost = 0; int noi = 1; /* Number of items */ short mnoi = 20; /* Max number of items to be bought at once */ if( ( keeper = find_keeper( ch ) ) == NULL ) return; maxgold = keeper->top_level * 10; if( is_number( arg ) ) { noi = atoi( arg ); argument = one_argument( argument, arg ); if( noi > mnoi ) { act( AT_TELL, "$n tells you 'I don't sell that many items at" " once.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } } obj = get_obj_carry( keeper, arg ); if( !obj && arg[0] == '#' ) { int onum = 0, oref = atoi( arg + 1 ); bool ofound = FALSE; for( obj = keeper->last_carrying; obj; obj = obj->prev_content ) { if( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) ) onum++; if( onum == oref ) { ofound = TRUE; break; } else if( onum > oref ) break; } if( !ofound ) obj = NULL; } cost = ( get_cost( ch, keeper, obj, TRUE ) * noi ); if( cost <= 0 || !can_see_obj( ch, obj ) ) { act( AT_TELL, "$n tells you 'I don't sell that -- try 'list'.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if( !IS_OBJ_STAT( obj, ITEM_INVENTORY ) && ( noi > 1 ) ) { char buf[MAX_STRING_LENGTH]; snprintf( buf, MAX_STRING_LENGTH, "%s", "laugh" ); interpret( keeper, buf ); act( AT_TELL, "$n tells you 'I don't have enough of those in stock" " to sell more than one at a time.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if( ch->gold < cost ) { act( AT_TELL, "$n tells you 'You can't afford to buy $p.'", keeper, obj, ch, TO_VICT ); ch->reply = keeper; return; } if( IS_SET( obj->extra_flags, ITEM_PROTOTYPE ) && IS_IMMORTAL( ch ) ) { act( AT_TELL, "$n tells you 'This is a only a prototype! I can't sell you that...'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) ) { send_to_char( "You can't carry that many items.\r\n", ch ); return; } if( ch->carry_weight + ( get_obj_weight( obj ) * noi ) + ( noi > 1 ? 2 : 0 ) > can_carry_w( ch ) ) { send_to_char( "You can't carry that much weight.\r\n", ch ); return; } if( noi == 1 ) { if( !IS_OBJ_STAT( obj, ITEM_INVENTORY ) ) separate_obj( obj ); act( AT_ACTION, "$n buys $p.", ch, obj, NULL, TO_ROOM ); act( AT_ACTION, "You buy $p.", ch, obj, NULL, TO_CHAR ); } else { sprintf( arg, "$n buys %d $p%s.", noi, ( obj->short_descr[strlen( obj->short_descr ) - 1] == 's' ? "" : "s" ) ); act( AT_ACTION, arg, ch, obj, NULL, TO_ROOM ); sprintf( arg, "You buy %d $p%s.", noi, ( obj->short_descr[strlen( obj->short_descr ) - 1] == 's' ? "" : "s" ) ); act( AT_ACTION, arg, ch, obj, NULL, TO_CHAR ); act( AT_ACTION, "$N puts them into a bag and hands it to you.", ch, NULL, keeper, TO_CHAR ); } ch->gold -= cost; keeper->gold += cost; if( keeper->gold > maxgold ) { keeper->gold = maxgold / 2; act( AT_ACTION, "$n puts some credits into a large safe.", keeper, NULL, NULL, TO_ROOM ); } if( IS_OBJ_STAT( obj, ITEM_INVENTORY ) ) { OBJ_DATA *buy_obj = create_object( obj->pIndexData ); OBJ_DATA *bag = NULL; /* * Due to grouped objects and carry limitations in SMAUG * The shopkeeper gives you a bag with multiple-buy, * and also, only one object needs be created with a count * set to the number bought. -Thoric */ if( noi > 1 ) { bag = create_object( get_obj_index( OBJ_VNUM_SHOPPING_BAG ) ); /* perfect size bag ;) */ bag->value[0] = bag->weight + ( buy_obj->weight * noi ); buy_obj->count = noi; obj->pIndexData->count += ( noi - 1 ); numobjsloaded += ( noi - 1 ); obj_to_obj( buy_obj, bag ); obj_to_char( bag, ch ); } else obj_to_char( buy_obj, ch ); } else { obj_from_char( obj ); obj_to_char( obj, ch ); } return; } }
void remove_artefact_remote( char *name, unsigned int vnum ) { CHAR_DATA * ch; OBJ_DATA *obj; char buf[ MAX_STRING_LENGTH ]; char buf1[ MAX_STRING_LENGTH ]; sprintf( buf1, "imie: %s vnum: %d", name, vnum ); log_string( buf1 ); //sprawdzalismy juz czy istnieje plik wiec: ch = load_char_remote( name ); if ( ch == NULL ) { bugf( "load_char_remote: no match '%s'.", name ); remove_name_from_artefact_list( ch->name ); return; } if ( !ch->carrying ) { free_char( ch ); return; } //dobra to szuka i od razu wywala z listy if ( ch->carrying->pIndexData->vnum == vnum ) { obj = ch->carrying; ch->carrying = ch->carrying->next_content; } else if ( ( obj = przeszukanie( ch->carrying, vnum, NULL ) ) == NULL ) { remove_name_from_artefact_list( ch->name ); restore_char_on_artefact_list( ch ); return ; } sprintf( buf, "ZABRANO PRZETRZYMYWANY ARTEFAKT: Posiadacz:%s Avnum:%s,%d", ch->name, obj->name, obj->pIndexData->vnum ); log_string( buf ); append_file_format_daily(NULL, ARTEFACT_LOG_FILE, "%s -> PRZETRZYMANY :%s vnum:%d (DEL)",ch->name, obj->short_descr, obj->pIndexData->vnum); get_money_from_rent( ch, obj ); //sprawdzic czy kase zapisuje na nowo //daty nie zmieniac przypadkiem !!! //logowac to //tu koncowe rzeczy obj->carried_by = NULL; obj->next_content = NULL; //to sprawdzic czy w workach tez liczone ch->carry_number -= get_obj_number( obj ); ch->carry_weight -= get_obj_weight( obj ); save_char_obj( ch, FALSE, TRUE ); //z TRUE nei zapisuje nowej daty //to cos zle dziala, dodaje zamiast odejmowac ;) remove_name_from_artefact_list( ch->name ); restore_char_on_artefact_list( ch ); free_char( ch ); return ; }
void do_cdonate( CHAR_DATA *ch, char *arg ) { OBJ_DATA *container; OBJ_DATA *obj; OBJ_DATA *obj_next; char arg1 [ MAX_INPUT_LENGTH ]; if ( !is_clan( ch ) ) { send_to_char( "You aren't a clansman!\n\r", ch ); return; } arg = one_argument( arg, arg1 ); if ( arg1[0] == '\0' ) { send_to_char( "Donate to your clan what?\n\r", ch ); return; } for ( container = object_list; container; container = container->next ) { if ( can_see_obj( ch, container ) && container->pIndexData->vnum == ch->pcdata->clan->donation ) break; } if ( !container ) { send_to_char( "The donation pit is missing from the world.\n\r", ch ); return; } if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) ) { if ( !( obj = get_obj_carry( ch, arg1 ) ) ) { send_to_char( "You do not have that item.\n\r", ch ); return; } if ( !can_drop_obj( ch, obj ) ) { send_to_char( "You can't let go of it.\n\r", ch ); return; } if ( get_obj_weight( obj ) + get_obj_weight( container ) > container->value[0] ) { send_to_char( "It won't fit.\n\r", ch ); return; } if ( obj->item_type == ITEM_TRASH || obj->item_type == ITEM_FOOD || obj->item_type == ITEM_KEY || obj->item_type == ITEM_PILL ) { act( "You send $p flying to the $P.", ch, obj, container, TO_CHAR ); extract_obj( obj ); return; } obj_from_char( obj ); obj_to_obj( obj, container ); act( "$n sends $p flying to the $P.", ch, obj, container, TO_ROOM ); act( "You send $p flying to the $P.", ch, obj, container, TO_CHAR ); send_to_room( "A loud clank is heard from the pit!", container->in_room ); } else { for ( obj = ch->carrying; obj; obj = obj_next ) { obj_next = obj->next_content; if ( obj->deleted ) continue; if ( ( arg1[3] == '\0' || is_name( &arg1[4], obj->name ) ) && can_see_obj( ch, obj ) && obj->wear_loc == WEAR_NONE && obj != container && can_drop_obj( ch, obj ) && get_obj_weight( obj ) + get_obj_weight( container ) <= container->value[0] ) { if ( obj->item_type == ITEM_TRASH || obj->item_type == ITEM_FOOD || obj->item_type == ITEM_KEY || obj->item_type == ITEM_PILL ) { act( "You send $p flying to the $P.", ch, obj, container, TO_CHAR ); extract_obj( obj ); continue; } obj_from_char( obj ); obj_to_obj( obj, container ); act( "$n sends $p flying to the $P.", ch, obj, container, TO_ROOM ); act( "You send $p flying to the $P.", ch, obj, container, TO_CHAR ); send_to_room( "A loud clank is heard from the pit!\n\r", container->in_room ); ch->pcdata->clan->score += 1; } } } return; }