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.76 by root, Fri Mar 26 01:04:45 2010 UTC vs.
Revision 1.79 by root, Thu Apr 15 02:51:40 2010 UTC

110 return 0; 110 return 0;
111 } 111 }
112 112
113 int number = tmp->number_of (); 113 int number = tmp->number_of ();
114 114
115 if (QUERY_FLAG (tmp, FLAG_IDENTIFIED) || !need_identify (tmp) || identified) 115 if (tmp->flag [FLAG_IDENTIFIED] || !tmp->need_identify () || identified)
116 { 116 {
117 if (!not_cursed && (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) 117 if (!not_cursed && (tmp->flag [FLAG_CURSED] || tmp->flag [FLAG_DAMNED]))
118 return 0; 118 return 0;
119 else 119 else
120 val = tmp->value * number; 120 val = tmp->value * number;
121 } 121 }
122 /* This area deals with objects that are not identified, but can be */ 122 /* This area deals with objects that are not identified, but can be */
134 else 134 else
135 { 135 {
136 /* Get 2/3'rd value for applied objects, 1/3'rd for totally 136 /* Get 2/3'rd value for applied objects, 1/3'rd for totally
137 * unknown objects 137 * unknown objects
138 */ 138 */
139 if (QUERY_FLAG (tmp, FLAG_BEEN_APPLIED)) 139 if (tmp->flag [FLAG_BEEN_APPLIED])
140 val = number * tmp->arch->value * 2 / 3; 140 val = number * tmp->arch->value * 2 / 3;
141 else 141 else
142 val = number * tmp->arch->value / 3; 142 val = number * tmp->arch->value / 3;
143 } 143 }
144 } 144 }
151 * tmp->arch->magic for any magic. The check for archetype 151 * tmp->arch->magic for any magic. The check for archetype
152 * magic is to not give extra money for archetypes that are by 152 * magic is to not give extra money for archetypes that are by
153 * default magical. This is because the archetype value should have 153 * default magical. This is because the archetype value should have
154 * already figured in that value. 154 * already figured in that value.
155 */ 155 */
156 if ((QUERY_FLAG (tmp, FLAG_IDENTIFIED) || !need_identify (tmp) || identified || 156 if ((tmp->flag [FLAG_IDENTIFIED] || !tmp->need_identify () || identified || tmp->flag [FLAG_BEEN_APPLIED])
157 QUERY_FLAG (tmp, FLAG_BEEN_APPLIED)) && tmp->magic && (tmp->arch == NULL || !tmp->arch->magic)) 157 && tmp->magic && (!tmp->arch || !tmp->arch->magic))
158 { 158 {
159 if (tmp->magic > 0) 159 if (tmp->magic > 0)
160 val *= (3 * tmp->magic * tmp->magic * tmp->magic); 160 val *= (3 * tmp->magic * tmp->magic * tmp->magic);
161 else 161 else
162 /* Note that tmp->magic is negative, so that this 162 /* Note that tmp->magic is negative, so that this
169 { 169 {
170 /* Value of the wand is multiplied by the number of 170 /* Value of the wand is multiplied by the number of
171 * charges. the treasure code already sets up the value 171 * charges. the treasure code already sets up the value
172 * 50 charges is used as the baseline. 172 * 50 charges is used as the baseline.
173 */ 173 */
174 if (QUERY_FLAG (tmp, FLAG_IDENTIFIED) || !need_identify (tmp) || identified) 174 if (tmp->flag [FLAG_IDENTIFIED] || !tmp->need_identify () || identified)
175 val = (val * tmp->stats.food) / 50; 175 val = (val * tmp->stats.food) / 50;
176 else /* if not identified, presume one charge */ 176 else /* if not identified, presume one charge */
177 val /= 50; 177 val /= 50;
178 } 178 }
179 179
242 */ 242 */
243 if ((sint64) val < 0) 243 if ((sint64) val < 0)
244 val = 0; 244 val = 0;
245 245
246 /* Unidentified stuff won't sell for more than 60gp */ 246 /* Unidentified stuff won't sell for more than 60gp */
247 if (flag == F_SELL && !QUERY_FLAG (tmp, FLAG_IDENTIFIED) && need_identify (tmp) && !identified) 247 if (flag == F_SELL && !tmp->flag [FLAG_IDENTIFIED] && tmp->need_identify () && !identified)
248 { 248 min_it (val, 600);
249 val = (val > 600) ? 600 : val;
250 }
251 249
252 /* if we are in a shop, check how the type of shop should affect the price */ 250 /* if we are in a shop, check how the type of shop should affect the price */
253 if (shop && who) 251 if (shop && who)
254 { 252 {
255 if (flag == F_SELL) 253 if (flag == F_SELL)
267 * be sold for (otherwise players could camp map resets to make money). 265 * be sold for (otherwise players could camp map resets to make money).
268 * In game terms, a non-specialist shop, might not recognise the true 266 * In game terms, a non-specialist shop, might not recognise the true
269 * value of the items they sell (much like how people sometimes find 267 * value of the items they sell (much like how people sometimes find
270 * antiques in a junk shop in real life). 268 * antiques in a junk shop in real life).
271 */ 269 */
272 if (QUERY_FLAG (tmp, FLAG_PLAYER_SOLD)) 270 if (tmp->flag [FLAG_PLAYER_SOLD])
273 val = (val * shop_greed (who->map) * shop_specialisation_ratio (tmp, who->map) / shopkeeper_approval (who->map, who)); 271 val = (val * shop_greed (who->map) * shop_specialisation_ratio (tmp, who->map) / shopkeeper_approval (who->map, who));
274 else 272 else
275 val = (val * shop_greed (who->map) / (shop_specialisation_ratio (tmp, who->map) * shopkeeper_approval (who->map, who))); 273 val = (val * shop_greed (who->map) / (shop_specialisation_ratio (tmp, who->map) * shopkeeper_approval (who->map, who)));
276 } 274 }
277 275
449 } 447 }
450 448
451 for (tmp = op->inv; tmp; tmp = tmp->below) 449 for (tmp = op->inv; tmp; tmp = tmp->below)
452 if (tmp->type == MONEY) 450 if (tmp->type == MONEY)
453 total += tmp->nrof * (sint64)tmp->value; 451 total += tmp->nrof * (sint64)tmp->value;
454 else if (tmp->type == CONTAINER && QUERY_FLAG (tmp, FLAG_APPLIED) && (!tmp->race || tmp->race.contains ("gold"))) 452 else if (tmp->type == CONTAINER && tmp->flag [FLAG_APPLIED] && (!tmp->race || tmp->race.contains ("gold")))
455 total += query_money (tmp); 453 total += query_money (tmp);
456 454
457 return total; 455 return total;
458} 456}
459 457
474 return 0; 472 return 0;
475 473
476 pay_from_container (pl, pl, to_pay); 474 pay_from_container (pl, pl, to_pay);
477 475
478 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) 476 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below)
479 if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (!pouch->race || pouch->race.contains ("gold"))) 477 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains ("gold")))
480 pay_from_container (pl, pouch, to_pay); 478 pay_from_container (pl, pouch, to_pay);
481 479
482 pl->update_stats (); 480 pl->update_stats ();
483 return 1; 481 return 1;
484} 482}
511 change_exp (pl, saved_money, "bargaining", SK_EXP_NONE); 509 change_exp (pl, saved_money, "bargaining", SK_EXP_NONE);
512 510
513 pay_from_container (pl, pl, to_pay); 511 pay_from_container (pl, pl, to_pay);
514 512
515 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) 513 for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below)
516 if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (!pouch->race || pouch->race.contains ("gold"))) 514 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && (!pouch->race || pouch->race.contains ("gold")))
517 pay_from_container (pl, pouch, to_pay); 515 pay_from_container (pl, pouch, to_pay);
518 516
519 pl->update_stats (); 517 pl->update_stats ();
520 518
521 return 1; 519 return 1;
640 LOG (llevError, "can_pay(): called against something that isn't a player\n"); 638 LOG (llevError, "can_pay(): called against something that isn't a player\n");
641 return 0; 639 return 0;
642 } 640 }
643 641
644 for (object::depth_iterator item = pl->begin (); item != pl->end (); ++item) 642 for (object::depth_iterator item = pl->begin (); item != pl->end (); ++item)
645 if (QUERY_FLAG (item, FLAG_UNPAID)) 643 if (item->flag [FLAG_UNPAID])
646 { 644 {
647 unpaid_count++; 645 unpaid_count++;
648 unpaid_price += query_cost (item, pl, F_BUY | F_SHOP); 646 unpaid_price += query_cost (item, pl, F_BUY | F_SHOP);
649 } 647 }
650 648
679 { 677 {
680 next_item: 678 next_item:
681 679
682 for (object::depth_iterator op = pl->begin (); op != pl->end (); ++op) 680 for (object::depth_iterator op = pl->begin (); op != pl->end (); ++op)
683 { 681 {
684 if (QUERY_FLAG (op, FLAG_UNPAID)) 682 if (op->flag [FLAG_UNPAID])
685 { 683 {
686 char buf[MAX_BUF]; 684 char buf[MAX_BUF];
687 snprintf (buf, MAX_BUF, "%s", query_cost_string (op, pl, F_BUY | F_SHOP)); 685 snprintf (buf, MAX_BUF, "%s", query_cost_string (op, pl, F_BUY | F_SHOP));
688 686
689 if (!pay_for_item (op, pl)) 687 if (!pay_for_item (op, pl))
690 { 688 {
691 sint64 i = query_cost (op, pl, F_BUY | F_SHOP) - query_money (pl); 689 sint64 i = query_cost (op, pl, F_BUY | F_SHOP) - query_money (pl);
692 690
693 CLEAR_FLAG (op, FLAG_UNPAID); 691 op->clr_flag (FLAG_UNPAID);
694 new_draw_info_format (NDI_UNIQUE, 0, pl, "You lack %s to buy %s.", cost_string_from_value (i, 0), query_name (op)); 692 new_draw_info_format (NDI_UNIQUE, 0, pl, "You lack %s to buy %s.", cost_string_from_value (i, 0), query_name (op));
695 SET_FLAG (op, FLAG_UNPAID); 693 op->set_flag (FLAG_UNPAID);
696 return 0; 694 return 0;
697 } 695 }
698 else 696 else
699 { 697 {
700 CLEAR_FLAG (op, FLAG_UNPAID); 698 op->clr_flag (FLAG_UNPAID);
701 CLEAR_FLAG (op, FLAG_PLAYER_SOLD); 699 op->clr_flag (FLAG_PLAYER_SOLD);
702 new_draw_info_format (NDI_UNIQUE, 0, op, "You paid %s for %s.", buf, query_name (op)); 700 new_draw_info_format (NDI_UNIQUE, 0, op, "You paid %s for %s.", buf, query_name (op));
703 701
704 if (!merge_ob (op, op->env->inv)) 702 if (!merge_ob (op, op->env->inv))
705 esrv_update_item (UPD_FLAGS, pl, op); 703 esrv_update_item (UPD_FLAGS, pl, op);
706 704
739 LOG (llevError, "Could not find %s archetype\n", coins[count]); 737 LOG (llevError, "Could not find %s archetype\n", coins[count]);
740 else if ((amount / at->value) > 0) 738 else if ((amount / at->value) > 0)
741 { 739 {
742 for (pouch = pl->inv; pouch; pouch = pouch->below) 740 for (pouch = pl->inv; pouch; pouch = pouch->below)
743 { 741 {
744 if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && pouch->race.contains ("gold")) 742 if (pouch->type == CONTAINER && pouch->flag [FLAG_APPLIED] && pouch->race.contains ("gold"))
745 { 743 {
746 int w = at->weight * (100 - pouch->stats.Str) / 100; 744 int w = at->weight * (100 - pouch->stats.Str) / 100;
747 int n = amount / at->value; 745 int n = amount / at->value;
748 746
749 if (w == 0) 747 if (w == 0)
837 835
838 new_draw_info_format (NDI_UNIQUE, 0, pl, "You receive %s for %s.", 836 new_draw_info_format (NDI_UNIQUE, 0, pl, "You receive %s for %s.",
839 query_cost_string (op, pl, F_SELL | F_SHOP), query_name (op)); 837 query_cost_string (op, pl, F_SELL | F_SHOP), query_name (op));
840 pl->play_sound (sound_find ("shop_sell")); 838 pl->play_sound (sound_find ("shop_sell"));
841 839
842 SET_FLAG (op, FLAG_UNPAID); 840 op->set_flag (FLAG_UNPAID);
843 identify (op); 841 identify (op);
844 842
845 return true; 843 return true;
846} 844}
847 845
1078 /* clear unpaid flag so that doesn't come up in query 1076 /* clear unpaid flag so that doesn't come up in query
1079 * string. We clear nrof so that we can better sort 1077 * string. We clear nrof so that we can better sort
1080 * the object names. 1078 * the object names.
1081 */ 1079 */
1082 1080
1083 CLEAR_FLAG (tmp, FLAG_UNPAID); 1081 tmp->clr_flag (FLAG_UNPAID);
1084 items[*numitems].nrof = tmp->nrof; 1082 items[*numitems].nrof = tmp->nrof;
1085 /* Non mergable items have nrof of 0, but count them as one 1083 /* Non mergable items have nrof of 0, but count them as one
1086 * so the display is properly. 1084 * so the display is properly.
1087 */ 1085 */
1088 if (tmp->nrof == 0) 1086 if (tmp->nrof == 0)
1111 items[*numitems].item_real = strdup (query_base_name (tmp, 1)); 1109 items[*numitems].item_real = strdup (query_base_name (tmp, 1));
1112 (*numitems)++; 1110 (*numitems)++;
1113 break; 1111 break;
1114 } 1112 }
1115 1113
1116 SET_FLAG (tmp, FLAG_UNPAID); 1114 tmp->set_flag (FLAG_UNPAID);
1117} 1115}
1118 1116
1119void 1117void
1120shop_listing (object *sign, object *op) 1118shop_listing (object *sign, object *op)
1121{ 1119{
1143 items = (shopinv *)malloc (sizeof (shopinv) * numallocated); 1141 items = (shopinv *)malloc (sizeof (shopinv) * numallocated);
1144 1142
1145 /* Find all the appropriate items */ 1143 /* Find all the appropriate items */
1146 for (i = x1; i <= x2; i++) 1144 for (i = x1; i <= x2; i++)
1147 for (j = y1; j < y2; j++) 1145 for (j = y1; j < y2; j++)
1148 if (is_in_shop (op->map, i, j)) 1146 if (op->map->is_in_shop (i, j))
1149 { 1147 {
1150 stack = GET_MAP_OB (op->map, i, j); 1148 stack = GET_MAP_OB (op->map, i, j);
1151 1149
1152 while (stack) 1150 while (stack)
1153 { 1151 {
1154 if (QUERY_FLAG (stack, FLAG_UNPAID)) 1152 if (stack->flag [FLAG_UNPAID])
1155 { 1153 {
1156 if (numitems == numallocated) 1154 if (numitems == numallocated)
1157 items = (shopinv *)realloc (items, sizeof (shopinv) * (numallocated *= 2)); 1155 items = (shopinv *)realloc (items, sizeof (shopinv) * (numallocated *= 2));
1158 1156
1159 add_shop_item (stack, items, &numitems, &numallocated); 1157 add_shop_item (stack, items, &numitems, &numallocated);
1183 op->contr->infobox (MSG_CHANNEL ("shopitems"), buf); 1181 op->contr->infobox (MSG_CHANNEL ("shopitems"), buf);
1184 1182
1185 free (items); 1183 free (items);
1186} 1184}
1187 1185
1188/* elmex: this function checks whether the object is in a shop */
1189bool
1190is_in_shop (object *o)
1191{
1192 if (!o->is_on_map ())
1193 return false;
1194
1195 return is_in_shop (o->map, o->x, o->y);
1196}
1197
1198/* elmex: this function checks whether we are in a shop or not 1186/* elmex: this function checks whether we are in a shop or not
1199 - change 2007-11-26: enhanced the O(n) case by stopping at the first 1187 - change 2007-11-26: enhanced the O(n) case by stopping at the first
1200 floor tile. this possibly will make map bugs where shopfloors are above 1188 floor tile. this possibly will make map bugs where shopfloors are above
1201 floors more obvious. 1189 floors more obvious.
1202*/ 1190*/
1203
1204bool 1191bool
1205is_in_shop (maptile *map, int x, int y) 1192maptile::is_in_shop (int x, int y) const
1206{ 1193{
1207 for (object *floor = GET_MAP_OB (map, x, y); floor; floor = floor->above) 1194 for (object *floor = at (x, y).bot; floor; floor = floor->above)
1208 if (QUERY_FLAG (floor, FLAG_IS_FLOOR)) 1195 if (floor->flag [FLAG_IS_FLOOR])
1209 return floor->type == SHOP_FLOOR; 1196 return floor->type == SHOP_FLOOR;
1210 1197
1211 return false; 1198 return false;
1212} 1199}
1213 1200

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines