void do_sell( char_data* ch, char* argument ) { char_data* keeper; thing_array* array; obj_data* obj; if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( is_set( &ch->in_room->room_flags, RFLAG_PET_SHOP ) ) { process_tell( keeper, ch, "We don't buy pets." ); ch->reply = keeper; return; } if( *argument == '\0' ) { send( ch, "Sell what?\r\n" ); return; } if( ( array = several_things( ch, argument, "sell", &ch->contents ) ) == NULL ) return; thing_array subset [ 5 ]; thing_func* func [ 5 ] = { cursed, stolen, uninterested, not_empty, sold }; sort_objects( ch, *array, keeper, 5, subset, func ); page_priv( ch, NULL, empty_string ); page_priv( ch, &subset[1], "don't own" ); page_priv( ch, &subset[2], "isn't interested in", keeper ); page_priv( ch, &subset[0], "can't let go of" ); page_priv( ch, &subset[3], NULL, NULL, "isn't empty", "aren't empty" ); page_publ( ch, &subset[4], "sell", keeper, "to", "for" ); for( int i = 0; i < subset[4]; i++ ) { obj = (obj_data*) subset[4][i]; obj = (obj_data*) obj->From( obj->selected ); set_bit( obj->extra_flags, OFLAG_IDENTIFIED ); set_bit( obj->extra_flags, OFLAG_KNOWN_LIQUID ); if( obj->pIndexData->item_type == ITEM_WAND || obj->pIndexData->item_type == ITEM_STAFF ) obj->value[3] = obj->pIndexData->value[3]; free_string( obj->label, MEM_OBJECT ); obj->label = empty_string; obj->owner = NULL; add_coins( ch, obj->temp ); obj->To( keeper ); consolidate( obj ); } delete array; }
void do_value( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *keeper = NULL; OBJ_DATA *obj = NULL; int cost = 0; if( argument[0] == '\0' ) { send_to_char( "Value what?\r\n", ch ); return; } if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( ( obj = get_obj_carry( ch, argument ) ) == NULL ) { act( AT_TELL, "$n tells you 'You don't have that item.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if( !can_drop_obj( ch, obj ) ) { send_to_char( "You can't let go of it!\r\n", ch ); return; } if( ( cost = get_cost( ch, keeper, obj, FALSE ) ) <= 0 ) { act( AT_ACTION, "$n looks uninterested in $p.", keeper, obj, ch, TO_VICT ); return; } sprintf( buf, "$n tells you 'I'll give you %d credits for $p.'", cost ); act( AT_TELL, buf, keeper, obj, ch, TO_VICT ); ch->reply = keeper; return; }
void do_list( CHAR_DATA * ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *keeper = NULL; OBJ_DATA *obj = NULL; int cost = 0; int oref = 0; bool found = FALSE; one_argument( argument, arg ); if( ( keeper = find_keeper( ch ) ) == NULL ) return; for( obj = keeper->last_carrying; obj; obj = obj->prev_content ) { if( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) ) { oref++; if( ( cost = get_cost( ch, keeper, obj, TRUE ) ) > 0 && ( arg[0] == '\0' || nifty_is_name( arg, obj->name ) ) ) { if( !found ) { found = TRUE; send_to_char( "[Price] {ref} Item\r\n", ch ); } ch_printf( ch, "[%5d] {%3d} %s.\r\n", cost, oref, capitalize( obj->short_descr ) ); } } } if( !found ) { if( arg[0] == '\0' ) send_to_char( "You can't buy anything here.\r\n", ch ); else send_to_char( "You can't buy that here.\r\n", ch ); } }
void do_melt( char_data *ch, char *argument ) { char buf [ MAX_INPUT_LENGTH ]; char_data* keeper; obj_data* obj; int cost; int blocks; int metal; int length; if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( ( obj = one_object( ch, argument, "melt", &ch->contents ) ) == NULL ) return; for( metal = MAT_BRONZE; metal <= MAT_GOLD; metal++ ) if( is_set( &obj->materials, metal ) ) break; if( metal > MAT_GOLD ) { fsend( ch, "%s is not made out of metal.", obj ); return; } if( ( blocks = obj->pIndexData->blocks ) == 0 ) { fsend( ch, "%s does not contain enough metal to be worth melting.", obj ); return; } if( !obj->droppable( ) ) { send( ch, "You can't let go of %s.\r\n", obj ); return; } if( (keeper->pShop->materials & ( 1 << metal )) == 0 ) { process_tell( keeper, ch, "Sorry that is not made out of a metal I deal with." ); return; } cost = 100; sprintf( buf, "You hand %s to %s along with", obj->Seen_Name( ch ), keeper->Seen_Name( ch ) ); if( !remove_coins( ch, cost, buf ) ) { sprintf( buf, "You can't afford my fee of %d cp to melt %s.", cost, obj->Seen_Name( ch ) ); process_tell( keeper, ch, buf ); return; } fsend( ch, "%s has %s melted down.", ch, obj ); sprintf( buf, "%s takes %s and places it in the furnace. ", keeper->Seen_Name( ch ), obj->Seen_Name( ch ) ); buf[0] = toupper( buf[0] ); obj->Extract( 1 ); if( ( obj = create( get_obj_index( ingot_vnum[metal-MAT_BRONZE] ) ) ) == NULL ) { bug( "Repair: Ingot for %s does not exist.", material_table[metal].name ); return; } obj->number = blocks; obj->shown = blocks; set_bit( &obj->materials, metal ); length = strlen( buf ); sprintf( &buf[length], "%s then pulls it out and after much hammering and reheating hands you %s.", keeper->He_She( ), obj->Seen_Name( ch, blocks ) ); buf[length] = toupper( buf[length] ); fsend( ch, buf ); obj->To( &ch->contents ); }
void do_repair( char_data* ch, char* argument ) { char buf [ MAX_INPUT_LENGTH ]; char_data* keeper; obj_data* obj; int cost; int cond; if( *argument == '\0' ) { send( ch, "Repair what?\r\n" ); return; } if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( keeper->pShop->repair == 0 ) { process_tell( keeper, ch, "Sorry - I do not repair items." ); return; } if( ( obj = one_object( ch, argument, "repair", &ch->contents ) ) == NULL ) return; if( !obj->droppable( ) ) { send( ch, "You can't let go of %s.\r\n", obj ); return; } if( ( cost = repair_cost( keeper, obj ) ) <= 0 ) { process_tell( keeper, ch, "That isn't something I can repair" ); return; } if( ( cond = repair_condition( obj ) ) < 0 ) { process_tell( keeper, ch, "That item is too old to be worth repairing." ); return; } if( !obj->Damaged( ) ) { process_tell( keeper, ch, "That isn't damaged enough to be worth repairing." ); return; } sprintf( buf, "%s repairs %s for you at a cost of", keeper->Name( ch ), obj->Seen_Name( ch ) ); *buf = toupper( *buf ); if( !remove_coins( ch, cost, buf ) ) { sprintf( buf, "You can't afford the cost of repairing %s.", obj->Seen_Name( ch ) ); process_tell( keeper, ch, buf ); return; } fsend( ch, "%s gets %s repaired.\r\n", ch, obj ); obj = (obj_data*) obj->From( 1 ); obj->age += int( 1+obj->rust*pow(cond-obj->condition,1.5)/100. ); obj->condition = cond; obj->To( &ch->contents ); consolidate( obj ); }
void do_value( char_data* ch, char* argument ) { char buf [ MAX_STRING_LENGTH ]; char_data* keeper; obj_data* obj; int cost; int rcost; int blocks; if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( is_set( &ch->in_room->room_flags, RFLAG_PET_SHOP ) ) { process_tell( keeper, ch, "We don't buy pets" ); return; } if( ( obj = one_object( ch, argument, "value", &ch->contents ) ) == NULL ) return; if( !obj->droppable( ) ) { send( ch, "You can't let go of %s.\r\n", obj ); return; } if( !obj->Belongs( ch ) ) { sprintf( buf, "%s is stolen so I would never buy it.", obj->Seen_Name( ch ) ); process_tell( keeper, ch, buf ); return; } cost = get_cost( keeper, ch, obj, FALSE ); rcost = repair_cost( keeper, obj ); if( obj->Damaged( ) ) { if( rcost > 0 ) sprintf( buf, "I see %s is damaged. I can repair it for %d cp %s ", obj->Seen_Name( ch ), rcost, cost > 0 ? "or" : "but" ); else sprintf( buf, "I see %s is damaged. I am unable to repair it %s ", obj->Seen_Name( ch ), cost > 0 ? "but" : "and" ); if( cost > 0 ) sprintf( buf+strlen( buf ), "would give you %d cp for it.", cost ); else strcat( buf, "am uninterested in buying it." ); } else { if( cost > 0 ) sprintf( buf, "I would pay you %d cp for %s.", cost, obj->Seen_Name( ch ) ); else sprintf( buf, "I am uninterested in buying %s.", obj->Seen_Name( ch ) ); } blocks = obj->pIndexData->blocks; if( ( cost = melt_cost( keeper, obj ) ) != 0 ) sprintf( buf+strlen( buf ), " I would melt it down to produce %d block%s for %d cp.", blocks, blocks == 1 ? "" : "s", cost ); process_tell( keeper, ch, buf ); }
void do_list( char_data* ch, char* argument ) { char_data* keeper; char_data* pet; thing_array* array; obj_data* obj; room_data* room; int i; if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( *argument == '\0' ) argument = "all"; /* PET SHOP */ if( is_set( &ch->in_room->room_flags, RFLAG_PET_SHOP ) ) { if( ( room = get_room_index( ch->in_room->vnum+1 ) ) == NULL ) { send( ch, "The pet shop is still under construction.\r\n" ); return; } thing_array list; for( i = 0; i < room->contents; i++ ) if( ( pet = character( room->contents[i] ) ) != NULL && buyable_pet( pet ) ) list += pet; if( is_empty( list ) ) { process_tell( keeper, ch, "Sorry, I'm out of pets right now.\r\n" ); return; } if( ( array = several_things( ch, argument, "list", &list ) ) == NULL ) return; send( ch, "Copper Pieces: %d\r\n\r\n", get_money( ch ) ); send_underlined( ch, "Pet Cost Level\r\n" ); for( i = 0; i < *array; i++ ) { pet = (char_data*) array->list[i]; send( ch, "%-25s%8d%8d\r\n", pet->Seen_Name( ch, 1, TRUE ), pet->species->price, pet->shdata->level ); } delete array; return; } /* OBJECT SHOP */ thing_array list; for( i = 0; i < keeper->contents; i++ ) { obj = (obj_data*) keeper->contents[i]; obj->selected = 1; if( ( obj->temp = get_cost( keeper, ch, obj, TRUE ) ) > 0 ) list += obj; } if( is_empty( list ) ) { process_tell( keeper, ch, "Sorry, I have nothing to sell right now.\r\n" ); return; } if( ( array = several_things( ch, argument, "list", &list ) ) == NULL ) return; page( ch, "Copper Pieces: %d\r\n\r\n", get_money( ch ) ); page_underlined( ch, "Item Cost\ Level Number Condition\r\n" ); char level [ 5 ]; include_closed = FALSE; for( i = 0; i < *array; i++ ) { obj = (obj_data*) array->list[i]; if( !can_use( ch, obj->pIndexData, obj ) ) sprintf( level, "***" ); else sprintf( level, "%d", obj->pIndexData->level ); page( ch, "%-37s%8d%8s%8d%5s%-s\r\n", truncate( (char *) obj->Seen_Name( ch, 1, TRUE ), 37 ), obj->temp, level, obj->number, "", obj->condition_name( ch, TRUE ) ); } include_closed = TRUE; delete array; }
void do_buy( char_data *ch, char *argument ) { char buf [ MAX_INPUT_LENGTH ]; char_data* keeper; char_data* pet; obj_data* obj; room_data* room; thing_array* array; if( ( keeper = find_keeper( ch ) ) == NULL ) return; /* PET SHOP */ if( is_set( &ch->in_room->room_flags, RFLAG_PET_SHOP ) ) { if( ch->species != NULL ) { send( ch, "Monsters can't buy pets." ); return; } if( ( room = get_room_index( ch->in_room->vnum+1 ) ) == NULL ) { send( ch, "The pet shop is still under construction.\r\n" ); return; } thing_array list; for( int i = 0; i < room->contents; i++ ) if( ( pet = character( room->contents[i] ) ) != NULL && buyable_pet( pet ) ) list += pet; if( ( pet = one_character( ch, argument, "buy", &list ) ) == NULL ) return; if( pet->shdata->level > ch->shdata->level ) { send( ch, "%s is too high a level for you.\r\n", pet ); return; } if( pet->species->price == 0 ) { send( ch, "That pet is not for sale until a god sets a price for it.\r\n" ); return; } if( is_set( &pet->species->act_flags, ACT_MOUNT ) ) { if( has_mount( ch ) ) return; } else { if( number_of_pets( ch ) >= 2 ) { send( ch, "You already have two pets.\r\n" ); return; } } sprintf( buf, "You hand %s", keeper->descr->name ); if( !remove_coins( ch, pet->species->price, buf ) ) { if( ch->shdata->level < LEVEL_APPRENTICE ) { send( ch, "You can't afford it.\r\n" ); return; } send( ch, "You don't have enough gold, but it doesn't seem to\ matter.\r\n" ); } pet->From( ); pet->To( ch->array ); set_bit( &pet->status, STAT_PET ); add_follower( pet, ch ); send( ch, "Enjoy your pet.\r\n" ); fsend( ch, "%s bought %s as a pet.\r\n", ch, pet ); if( pet->reset != NULL ) { pet->reset->count--; pet->reset = NULL; } return; } /* OBJECT SHOP */ thing_array list; for( int i = 0; i < keeper->contents; i++ ) { obj = (obj_data*) keeper->contents[i]; if( will_trade( keeper, obj ) ) list += obj; } if( ( array = several_things( ch, argument, "buy", &list ) ) == NULL ) return; thing_array subset [ 4 ]; thing_func* func [ 4 ] = { heavy, many, cantafford, buy }; sort_objects( ch, *array, keeper, 4, subset, func ); page_priv( ch, NULL, empty_string ); page_priv( ch, &subset[0], "can't lift" ); page_priv( ch, &subset[1], "can't handle" ); page_priv( ch, &subset[2], "can't afford" ); page_publ( ch, &subset[3], "buy", keeper, "from", "for" ); delete array; }
void do_sell( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *keeper; OBJ_DATA *obj; int cost; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Sell what?\n\r", ch ); return; } if ( ( keeper = find_keeper( ch ) ) == NULL ) return; if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { act( AT_TELL, "$n tells you 'You don't have that item.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } /* Bug report and solution thanks to [email protected] */ if ( !can_see_obj( keeper, obj) ) { send_to_char("What are you trying to sell me? I don't buy thin air!\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 ( obj->timer > 0 ) { act( AT_TELL, "$n tells you, '$p is depreciating in value too quickly...'", keeper, obj, ch, TO_VICT ); return; } if ( ( cost = get_cost( ch, keeper, obj, FALSE ) ) <= 0 ) { act( AT_ACTION, "$n looks uninterested in $p.", keeper, obj, ch, TO_VICT ); return; } if ( cost > keeper->gold ) { act( AT_TELL, "$n makes a credit transaction.", keeper, obj, ch, TO_VICT ); lower_economy( ch->in_room->area, cost-keeper->gold ); } separate_obj( obj ); act( AT_ACTION, "$n sells $p.", ch, obj, NULL, TO_ROOM ); sprintf( buf, "You sell $p for %d credit%s.", cost, cost == 1 ? "" : "s" ); act( AT_ACTION, buf, ch, obj, NULL, TO_CHAR ); ch->gold += cost; keeper->gold -= cost; if ( keeper->gold < 0 ) keeper->gold = 0; if ( obj->item_type == ITEM_TRASH ) extract_obj( obj ); else if ( IS_SET( obj->extra_flags , ITEM_CONTRABAND) ) { long ch_exp; ch_exp = UMIN( obj->cost*10 , ( exp_level( ch->skill_level[SMUGGLING_ABILITY]+1) - exp_level( ch->skill_level[SMUGGLING_ABILITY]) ) / 10 ); ch_printf( ch, "You receive %ld smuggling experience for unloading your contraband.\n\r " , ch_exp ); gain_exp( ch, ch_exp , SMUGGLING_ABILITY ); if ( obj->item_type == ITEM_SPICE || obj->item_type == ITEM_RAWSPICE ) extract_obj( obj ); else { REMOVE_BIT( obj->extra_flags , ITEM_CONTRABAND ); obj_from_char( obj ); obj_to_char( obj, keeper ); } } else if ( obj->item_type == ITEM_SPICE || obj->item_type == ITEM_RAWSPICE ) extract_obj( obj ); else { obj_from_char( obj ); obj_to_char( obj, keeper ); } return; }
void do_list( CHAR_DATA *ch, char *argument ) { if ( IS_SET(ch->in_room->room_flags, ROOM_PET_SHOP) ) { ROOM_INDEX_DATA *pRoomIndexNext; CHAR_DATA *pet; bool found; pRoomIndexNext = get_room_index( ch->in_room->vnum + 1 ); if ( !pRoomIndexNext ) { bug( "Do_list: bad pet shop at vnum %d.", ch->in_room->vnum ); send_to_char( "You can't do that here.\n\r", ch ); return; } found = FALSE; for ( pet = pRoomIndexNext->first_person; pet; pet = pet->next_in_room ) { if ( IS_SET(pet->act, ACT_PET) && IS_NPC(pet) ) { if ( !found ) { found = TRUE; send_to_char( "Pets for sale:\n\r", ch ); } ch_printf( ch, "[%2d] %8d - %s\n\r", pet->top_level, 10 * pet->top_level * pet->top_level, pet->short_descr ); } } if ( !found ) send_to_char( "Sorry, we're out of pets right now.\n\r", ch ); return; } else { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *keeper; OBJ_DATA *obj; int cost; int oref = 0; bool found; one_argument( argument, arg ); if ( ( keeper = find_keeper( ch ) ) == NULL ) return; found = FALSE; for ( obj = keeper->last_carrying; obj; obj = obj->prev_content ) { if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) ) { oref++; if ( ( cost = get_cost( ch, keeper, obj, TRUE ) ) > 0 && ( arg[0] == '\0' || nifty_is_name( arg, obj->name ) ) ) { if (keeper->home != NULL) cost = obj->cost; if ( !found ) { found = TRUE; ch_printf( ch, "%s[Price] {ref} Item\n\r", color_str( AT_LIST, ch) ); } ch_printf( ch, "%s[%5d] {%3d} %s%s%s.\n\r", color_str(AT_LIST, ch), cost, oref, capitalize( obj->short_descr ), color_str(AT_LIST, ch), IS_SET(obj->extra_flags, ITEM_HUTT_SIZE) ? " (hutt size)" : ( IS_SET(obj->extra_flags, ITEM_LARGE_SIZE) ? " (large)" : ( IS_SET(obj->extra_flags, ITEM_HUMAN_SIZE) ? " (medium)" : ( IS_SET(obj->extra_flags, ITEM_SMALL_SIZE) ? " (small)" : "" ) ) ) ); } } } if ( !found ) { if ( arg[0] == '\0' ) send_to_char( "You can't buy anything here.\n\r", ch ); else send_to_char( "You can't buy that here.\n\r", 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; } }
void do_sell( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *keeper = NULL; OBJ_DATA *obj = NULL; int cost = 0; one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Sell what?\r\n", ch ); return; } if( ( keeper = find_keeper( ch ) ) == NULL ) return; if( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { act( AT_TELL, "$n tells you 'You don't have that item.'", keeper, NULL, ch, TO_VICT ); ch->reply = keeper; return; } if( !can_drop_obj( ch, obj ) ) { send_to_char( "You can't let go of it!\r\n", ch ); return; } if( obj->timer > 0 ) { act( AT_TELL, "$n tells you, '$p is depreciating in value too quickly...'", keeper, obj, ch, TO_VICT ); return; } if( ( cost = get_cost( ch, keeper, obj, FALSE ) ) <= 0 ) { act( AT_ACTION, "$n looks uninterested in $p.", keeper, obj, ch, TO_VICT ); return; } if( cost > keeper->gold ) { act( AT_TELL, "$n makes a credit transaction.", keeper, obj, ch, TO_VICT ); } separate_obj( obj ); act( AT_ACTION, "$n sells $p.", ch, obj, NULL, TO_ROOM ); sprintf( buf, "You sell $p for %d credit%s.", cost, cost == 1 ? "" : "s" ); act( AT_ACTION, buf, ch, obj, NULL, TO_CHAR ); ch->gold += cost; keeper->gold -= cost; if( keeper->gold < 0 ) keeper->gold = 0; if( obj->item_type == ITEM_TRASH ) extract_obj( obj ); else { obj_from_char( obj ); obj_to_char( obj, keeper ); } 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; } }