version 1.45 | | version 1.46 |
---|
| | |
/* | | /* |
* static char *rcsid_shop_c = | | * static char *rcsid_shop_c = |
* "$Id: shop.c,v 1.45 2005/10/06 21:25:43 ryo_saeba Exp $"; | | * "$Id: shop.c,v 1.46 2005/10/21 19:03:24 cavesomething Exp $"; |
*/ | | */ |
| | |
/* | | /* |
| | |
return(remain); | | return(remain); |
} | | } |
| | |
| | /* Checks all unpaid items in op's inventory, adds up all the money they |
| | * have, and checks that they can actually afford what they want to buy. |
| | * Returns 1 if they can, and 0 if they can't. also prints an appropriate message |
| | * to the player |
| | */ |
| | |
| | int can_pay(object *pl) { |
| | int unpaid_count = 0, i; |
| | uint64 unpaid_price = 0; |
| | uint64 player_wealth = query_money(pl); |
| | object *item; |
| | uint32 coincount[NUM_COINS]; |
| | if (!pl || pl->type != PLAYER) { |
| | LOG(llevError, "can_pay(): called against something that isn't a player"); |
| | return 0; |
| | } |
| | for (i=0; i< NUM_COINS; i++) coincount[i] = 0; |
| | for (item = pl->inv;item;) { |
| | if QUERY_FLAG(item, FLAG_UNPAID) { |
| | unpaid_count++; |
| | unpaid_price += query_cost(item, pl, F_BUY | F_SHOP); |
| | } |
| | /* merely converting the player's monetary wealth won't do, if we did that, |
| | * we could print the wrong numbers for the coins, so we count the money instead |
| | */ |
| | for (i=0; i< NUM_COINS; i++) |
| | if (!strcmp(coins[i], item->arch->name)) |
| | coincount[i] += item->nrof; |
| | if (item->inv) item = item->inv; |
| | else if (item->below) item = item->below; |
| | else item = NULL; |
| | } |
| | if (unpaid_price > player_wealth) { |
| | char buf[MAX_BUF], coinbuf[MAX_BUF]; |
| | int denominations = 0; |
| | sprintf(buf, "You have %d unpaid items that would cost you %s, but you only have", |
| | unpaid_count, cost_string_from_value(unpaid_price)); |
| | for (i=0; i< NUM_COINS; i++) { |
| | if (coincount[i] > 0 && coins[i]) { |
| | denominations++; |
| | sprintf(coinbuf, " %d %s,", coincount[i], find_archetype(coins[i])->clone.name_pl); |
| | strcat (buf, coinbuf); |
| | } |
| | } |
| | if (denominations > 1) make_list_like(buf); |
| | new_draw_info(NDI_UNIQUE, 0, pl, buf); |
| | return 0; |
| | } |
| | else return 1; |
| | } |
| | |
| | |
/* Better get_payment, descends containers looking for | | /* Better get_payment, descends containers looking for |
* unpaid items, and pays for them. | | * unpaid items, and pays for them. |
* returns 0 if the player still has unpaid items. | | * returns 0 if the player still has unpaid items. |
| | |
/*shopitems *items=map->shopitems;*/ | | /*shopitems *items=map->shopitems;*/ |
int pos=0, i; | | int pos=0, i; |
double opinion=0; | | double opinion=0; |
char *p, tmp[MAX_BUF]="\0", tradesin[MAX_BUF]; | | char *p, tmp[MAX_BUF]="\0"; |
if (op->type != PLAYER) return 0; | | if (op->type != PLAYER) return 0; |
| | |
/*check if there is a shop specified for this map */ | | /*check if there is a shop specified for this map */ |
| | |
} | | } |
if (!pos) strcat(tmp, "a little of everything."); | | if (!pos) strcat(tmp, "a little of everything."); |
| | |
/* if we have multiple entries we need to change the second from last comma | | /* format the string into a list */ |
* for an 'and', in any event we need to remove the trailing comma first. */ | | make_list_like(tmp); |
p=strrchr(tmp, ','); | | new_draw_info_format(NDI_UNIQUE, 0, op, "%s", tmp); |
if (p) *p='\0'; | | |
| | |
p=strrchr(tmp, ','); | | |
if (p) { | | |
*p='\0'; | | |
strcpy(tradesin, tmp); | | |
p++; | | |
strcat(tradesin, " and"); | | |
strcat(tradesin, p); | | |
} | | |
else strcpy(tradesin, tmp); | | |
new_draw_info_format(NDI_UNIQUE, 0, op, "%s.", tradesin); | | |
| | |
if (map->shopmax) | | if (map->shopmax) |
new_draw_info_format(NDI_UNIQUE,0,op,"It won't trade for items above %s.", | | new_draw_info_format(NDI_UNIQUE,0,op,"It won't trade for items above %s.", |