ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/shop.C
(Generate patch)

Comparing deliantra/server/server/shop.C (file contents):
Revision 1.83 by root, Fri Apr 30 21:00:40 2010 UTC vs.
Revision 1.87 by root, Sat Apr 23 04:56:57 2011 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 6 * Copyright (©) 1992 Frank Tore Johansen
7 * 7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 9 * the terms of the Affero GNU General Public License as published by the
169 /* Value of the wand is multiplied by the number of 169 /* Value of the wand is multiplied by the number of
170 * charges. the treasure code already sets up the value 170 * charges. the treasure code already sets up the value
171 * 50 charges is used as the baseline. 171 * 50 charges is used as the baseline.
172 */ 172 */
173 if (tmp->flag [FLAG_IDENTIFIED] || !tmp->need_identify () || identified) 173 if (tmp->flag [FLAG_IDENTIFIED] || !tmp->need_identify () || identified)
174 val *= tmp->stats.food / 50; 174 val *= tmp->stats.food;
175 else /* if not identified, presume one charge */ 175 /* if not identified, presume one charge */
176 val /= 50; 176 val /= 50;
177 } 177 }
178 178
179 /* Limit amount of money you can get for really great items. */ 179 /* Limit amount of money you can get for really great items. */
180 if (flag == F_SELL) 180 if (flag == F_SELL)
181 val = value_limit (val, number, who, shop); 181 val = value_limit (val, number, who, shop);
189 * AND Cha = 30 will get optimal price. 189 * AND Cha = 30 will get optimal price.
190 * Thus charisma will never get useless. 190 * Thus charisma will never get useless.
191 * -b.e. edler@heydernet.de 191 * -b.e. edler@heydernet.de
192 */ 192 */
193 193
194 if (who && who->type == PLAYER) 194 if (who && who->is_player ())
195 { 195 {
196 int lev_bargain = 0; 196 int lev_bargain = 0;
197 int lev_identify = 0; 197 int lev_identify = 0;
198 198
199 if (!no_bargain) 199 if (!no_bargain)
217 /* ratio determines how much of the price modification 217 /* ratio determines how much of the price modification
218 * will come from the basic stat charisma 218 * will come from the basic stat charisma
219 * the rest will come from the level in bargaining skill 219 * the rest will come from the level in bargaining skill
220 */ 220 */
221 const double cha_ratio = 0.40; 221 const double cha_ratio = 0.40;
222 double bargaining = min (0., 1. - powf (lev_bargain / MAXLEVEL_TREASURE, 0.25)); 222 double bargaining = max (0., 1. - powf (double (lev_bargain) / MAXLEVEL_TREASURE, 0.25));
223 double charisma = (cha_bonus[who->stats.Cha] - 1.) / (cha_bonus[who->stats.Cha] + 1.); 223 double charisma = (cha_bonus[who->stats.Cha] - 1.) / (cha_bonus[who->stats.Cha] + 1.);
224 224
225 double factor = (1. - cha_ratio) * bargaining + cha_ratio * charisma; 225 double factor = (1. - cha_ratio) * bargaining + cha_ratio * charisma;
226 226
227 // scale 0..1 to 2 .. 80% 227 // scale 0..1 to 2 .. 80%
443 } 443 }
444 444
445 for (tmp = op->inv; tmp; tmp = tmp->below) 445 for (tmp = op->inv; tmp; tmp = tmp->below)
446 if (tmp->type == MONEY) 446 if (tmp->type == MONEY)
447 total += tmp->nrof * (sint64)tmp->value; 447 total += tmp->nrof * (sint64)tmp->value;
448 else if (tmp->type == CONTAINER && tmp->flag [FLAG_APPLIED] && (!tmp->race || tmp->race.contains ("gold"))) 448 else if (tmp->type == CONTAINER && tmp->flag [FLAG_APPLIED] && (!tmp->race || tmp->race.contains (shstr_gold)))
449 total += query_money (tmp); 449 total += query_money (tmp);
450 450
451 return total; 451 return total;
452} 452}
453 453
468 return 0; 468 return 0;
469 469
470 pay_from_container (pl, pl, to_pay); 470 pay_from_container (pl, pl, to_pay);
471 471
472 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) 472 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below)
473 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains ("gold"))) 473 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains (shstr_gold)))
474 pay_from_container (pl, pouch, to_pay); 474 pay_from_container (pl, pouch, to_pay);
475 475
476 pl->update_stats (); 476 pl->update_stats ();
477 return 1; 477 return 1;
478} 478}
505 change_exp (pl, saved_money, shstr_bargaining, SK_EXP_NONE); 505 change_exp (pl, saved_money, shstr_bargaining, SK_EXP_NONE);
506 506
507 pay_from_container (pl, pl, to_pay); 507 pay_from_container (pl, pl, to_pay);
508 508
509 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) 509 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below)
510 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains ("gold"))) 510 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains (shstr_gold)))
511 pay_from_container (pl, pouch, to_pay); 511 pay_from_container (pl, pouch, to_pay);
512 512
513 pl->update_stats (); 513 pl->update_stats ();
514 514
515 return 1; 515 return 1;
732 LOG (llevError, "Could not find %s archetype\n", coins[count]); 732 LOG (llevError, "Could not find %s archetype\n", coins[count]);
733 else if ((amount / at->value) > 0) 733 else if ((amount / at->value) > 0)
734 { 734 {
735 for (pouch = pl->inv; pouch; pouch = pouch->below) 735 for (pouch = pl->inv; pouch; pouch = pouch->below)
736 { 736 {
737 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && pouch->race.contains ("gold")) 737 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && pouch->race.contains (shstr_gold))
738 { 738 {
739 int w = at->weight * (100 - pouch->stats.Str) / 100; 739 int w = at->weight * (100 - pouch->stats.Str) / 100;
740 int n = amount / at->value; 740 int n = amount / at->value;
741 741
742 if (w == 0) 742 if (w == 0)
1034 1034
1035struct shopinv 1035struct shopinv
1036{ 1036{
1037 char *item_sort; 1037 char *item_sort;
1038 char *item_real; 1038 char *item_real;
1039 sint64 value;
1039 uint16 type; 1040 uint16 type;
1040 uint32 nrof; 1041 uint32 nrof;
1041}; 1042};
1042 1043
1043/* There are a lot fo extra casts in here just to suppress warnings - it 1044/* There are a lot fo extra casts in here just to suppress warnings - it
1076 * so the display is properly. 1077 * so the display is properly.
1077 */ 1078 */
1078 if (tmp->nrof == 0) 1079 if (tmp->nrof == 0)
1079 items[*numitems].nrof++; 1080 items[*numitems].nrof++;
1080 items[*numitems].type = tmp->type; 1081 items[*numitems].type = tmp->type;
1082
1083 items[*numitems].value = tmp->value;
1081 1084
1082 switch (tmp->type) 1085 switch (tmp->type)
1083 { 1086 {
1084#if 0 1087#if 0
1085 case BOOTS: 1088 case BOOTS:
1097#endif 1100#endif
1098 1101
1099 default: 1102 default:
1100 items[*numitems].item_sort = strdup (query_base_name (tmp, 0)); 1103 items[*numitems].item_sort = strdup (query_base_name (tmp, 0));
1101 items[*numitems].item_real = strdup (query_base_name (tmp, 1)); 1104 items[*numitems].item_real = strdup (query_base_name (tmp, 1));
1105 items[*numitems].value += tmp->value;
1102 (*numitems)++; 1106 (*numitems)++;
1103 break; 1107 break;
1104 } 1108 }
1105 1109
1106 tmp->set_flag (FLAG_UNPAID); 1110 tmp->set_flag (FLAG_UNPAID);
1162 { 1166 {
1163 /* Collapse items of the same name together */ 1167 /* Collapse items of the same name together */
1164 if ((i + 1) < numitems && !strcmp (items[i].item_real, items[i + 1].item_real)) 1168 if ((i + 1) < numitems && !strcmp (items[i].item_real, items[i + 1].item_real))
1165 items[i + 1].nrof += items[i].nrof; 1169 items[i + 1].nrof += items[i].nrof;
1166 else 1170 else
1167 buf.printf (" %4d %s\n", items[i].nrof ? items[i].nrof : 1, items[i].nrof == 1 ? items[i].item_sort : items[i].item_real); 1171 {
1172 buf.printf (
1173 " %4d %s\n for %s\n",
1174 items[i].nrof ? items[i].nrof : 1,
1175 items[i].nrof == 1 ? items[i].item_sort : items[i].item_real,
1176 cost_string_from_value (items[i].value, op->flag [FLAG_WIZ] ? 0 : 1));
1177 }
1168 1178
1169 free (items[i].item_sort); 1179 free (items[i].item_sort);
1170 free (items[i].item_real); 1180 free (items[i].item_real);
1171 } 1181 }
1172 1182

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines