| version 1.25 | | version 1.26 |
|---|
| | |
| /* | | /* |
| * static char *rcsid_shop_c = | | * static char *rcsid_shop_c = |
| * "$Id: shop.c,v 1.25 2003/10/26 06:56:57 mwedel Exp $"; | | * "$Id: shop.c,v 1.26 2004/02/17 03:38:59 mwedel Exp $"; |
| */ | | */ |
| | | |
| /* | | /* |
| | |
| int query_cost(object *tmp, object *who, int flag) { | | int query_cost(object *tmp, object *who, int flag) { |
| int val; | | int val; |
| int number; /* used to better calculate value */ | | int number; /* used to better calculate value */ |
| int charisma; | | int no_bargain; |
| | | float diff; |
| | | float ratio; |
| | | |
| | | no_bargain = flag & F_NO_BARGAIN; |
| | | flag &= ~F_NO_BARGAIN; |
| | | |
| if (tmp->type==MONEY) return (tmp->nrof * tmp->value); | | if (tmp->type==MONEY) return (tmp->nrof * tmp->value); |
| if (tmp->type==GEM) { | | if (tmp->type==GEM) { |
| | |
| LOG(llevError, "Asking for buy-value of unidentified object."); | | LOG(llevError, "Asking for buy-value of unidentified object."); |
| val = tmp->arch->clone.value * 50 * number; | | val = tmp->arch->clone.value * 50 * number; |
| } | | } |
| else /* Trying to sell something, or get true value */ | | else { /* Trying to sell something, or get true value */ |
| if (tmp->type == POTION) | | if (tmp->type == POTION) |
| val = number * 1000; /* Don't want to give anything away */ | | val = number * 1000; /* Don't want to give anything away */ |
| else { | | else { |
| | |
| else | | else |
| val = number * tmp->arch->clone.value / 3; | | val = number * tmp->arch->clone.value / 3; |
| } | | } |
| | | } |
| } else { /* No archetype with this object */ | | } else { /* No archetype with this object */ |
| LOG(llevDebug,"In sell item: Have object with no archetype: %s\n", tmp->name); | | LOG(llevDebug,"In sell item: Have object with no archetype: %s\n", tmp->name); |
| if (flag == F_BUY) { | | if (flag == F_BUY) { |
| | |
| if (tmp->type==WAND) { | | if (tmp->type==WAND) { |
| /* Value of the wand is multiplied by the number of | | /* Value of the wand is multiplied by the number of |
| * charges. the treasure code already sets up the value | | * charges. the treasure code already sets up the value |
| | | * 50 charges is used as the baseline. |
| */ | | */ |
| if (QUERY_FLAG(tmp, FLAG_IDENTIFIED) || !need_identify(tmp)) | | if (QUERY_FLAG(tmp, FLAG_IDENTIFIED) || !need_identify(tmp)) |
| val=(val*tmp->stats.food) / 50; | | val=(val*tmp->stats.food) / 50; |
| | |
| } | | } |
| } | | } |
| | | |
| /* this modification is for merchant skill | | /* This modification is for bargaining skill. |
| * now players with readied merchant skill get | | * Now only players with max level in bargaining |
| * more Cha up to the limit of modified Cha = 30. | | * AND Cha = 30 will get optimal price. |
| * -b.t. thomas@nomad.astro.psu.edu | | * Thus charisma will never get useless. |
| | | * -b.e. edler@heydernet.de |
| */ | | */ |
| | | |
| if (who!=NULL && who->type==PLAYER) { | | if (who!=NULL && who->type==PLAYER) { |
| float diff; | | int lev_bargain = 0; |
| | | |
| charisma = who->stats.Cha; /* used for SK_BARGAINING modification */ | | /* ratio determines how much of the price modification |
| | | * will come from the basic stat charisma |
| | | * the rest will come from the level in bargaining skill |
| | | */ |
| | | ratio = 0.5; |
| | | |
| if (find_skill_by_number(who,SK_BARGAINING)) { | | if (find_skill_by_number(who,SK_BARGAINING)) { |
| charisma += (who->level+2)/3; | | lev_bargain = find_skill_by_number(who,SK_BARGAINING)->level; |
| if(charisma>30) charisma = 30; | | |
| } | | |
| if (cha_bonus[charisma]<=1.0) { | | |
| LOG(llevError,"Illegal charisma bonus, %d <=1.0", cha_bonus[charisma]); | | |
| diff=0.9; /*pretty bad case */ | | |
| } | | } |
| | | if ( !no_bargain && (lev_bargain>0) ) |
| | | diff = (0.8 - 0.6*((lev_bargain+settings.max_level*0.05) |
| | | /(settings.max_level*1.05))); |
| else | | else |
| /* Diff is now a float between 0 and 1 */ | | diff = 0.8; |
| diff=(cha_bonus[charisma]-1)/(1+cha_bonus[charisma]); | | |
| | | diff *= 1-ratio; |
| | | |
| | | /* Diff is now a float between 0.2 and 0.8 */ |
| | | diff+=(cha_bonus[who->stats.Cha]-1)/(1+cha_bonus[who->stats.Cha])*ratio; |
| | | |
| /* we need to multiply these by 4.0 to keep buy costs roughly the same | | /* we need to multiply these by 4.0 to keep buy costs roughly the same |
| * (otherwise, you could buy a potion of charisma for around 400 pp. | | * (otherwise, you could buy a potion of charisma for around 400 pp. |
| | |
| else val *=4; | | else val *=4; |
| } | | } |
| | | |
| /* I don't understand this code...., I'm changing it to | | /* I don't think this should really happen - if it does, it indicates and |
| use 0 instead of 1000000 if we're selling*/ | | * overflow of diff above. That shoudl only happen if |
| if(val<0) { | | * we are selling objects - in that case, the person just |
| if(flag==F_SELL) | | * gets no money. |
| | | */ |
| | | if(val<0) |
| val=0; | | val=0; |
| else | | |
| val=1000000; | | |
| } | | |
| | | |
| /* Unidentified stuff won't sell for more than 60gp */ | | /* Unidentified stuff won't sell for more than 60gp */ |
| if(flag==F_SELL && !QUERY_FLAG(tmp, FLAG_IDENTIFIED) && need_identify(tmp)) { | | if(flag==F_SELL && !QUERY_FLAG(tmp, FLAG_IDENTIFIED) && need_identify(tmp)) { |
| | |
| int pay_for_item(object *op,object *pl) { | | int pay_for_item(object *op,object *pl) { |
| int to_pay = query_cost(op,pl,F_BUY); | | int to_pay = query_cost(op,pl,F_BUY); |
| object *pouch; | | object *pouch; |
| | | int saved_money; |
| | | |
| if (to_pay==0) return 1; | | if (to_pay==0) return 1; |
| if(to_pay>query_money(pl)) return 0; | | if(to_pay>query_money(pl)) return 0; |
| | | |
| | | /* We compare the paid price with the one for a player |
| | | * without bargaining skill. |
| | | * This determins the amount of exp (if any) gained for bargaining. |
| | | */ |
| | | saved_money = query_cost(op,pl,F_BUY | F_NO_BARGAIN) - to_pay; |
| | | |
| | | if (saved_money > 0) |
| | | change_exp(pl,saved_money,"bargaining",SK_EXP_NONE); |
| | | |
| to_pay = pay_from_container(op, pl, to_pay); | | to_pay = pay_from_container(op, pl, to_pay); |
| | | |
| for (pouch=pl->inv; (pouch!=NULL) && (to_pay>0); pouch=pouch->below) { | | for (pouch=pl->inv; (pouch!=NULL) && (to_pay>0); pouch=pouch->below) { |
| | |
| object *tmp; | | object *tmp; |
| object *pouch; | | object *pouch; |
| archetype *at; | | archetype *at; |
| | | int extra_gain; |
| | | |
| if(pl==NULL||pl->type!=PLAYER) { | | if(pl==NULL||pl->type!=PLAYER) { |
| LOG(llevDebug,"Object other than player tried to sell something.\n"); | | LOG(llevDebug,"Object other than player tried to sell something.\n"); |
| | |
| identify(op); | | identify(op); |
| return; | | return; |
| } | | } |
| | | /* We compare the price with the one for a player |
| | | * without bargaining skill. |
| | | * This determins the amount of exp (if any) gained for bargaining. |
| | | * exp/10 -> 1 for each gold coin |
| | | */ |
| | | extra_gain = i - query_cost(op,pl,F_SELL | F_NO_BARGAIN); |
| | | |
| | | if (extra_gain > 0) |
| | | change_exp(pl,extra_gain/10,"bargaining",SK_EXP_NONE); |
| | | |
| for (count=0; coins[count]!=NULL; count++) { | | for (count=0; coins[count]!=NULL; count++) { |
| at = find_archetype(coins[count]); | | at = find_archetype(coins[count]); |
| if (at==NULL) LOG(llevError, "Could not find %s archetype", coins[count]); | | if (at==NULL) LOG(llevError, "Could not find %s archetype", coins[count]); |