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 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
4 | * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Deliantra is free software: you can redistribute it and/or modify |
8 | * Deliantra is free software: you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
9 | * it under the terms of the GNU General Public License as published by |
… | |
… | |
74 | |
74 | |
75 | sint64 |
75 | sint64 |
76 | query_cost (const object *tmp, object *who, int flag) |
76 | query_cost (const object *tmp, object *who, int flag) |
77 | { |
77 | { |
78 | double val; |
78 | double val; |
79 | int number; /* used to better calculate value */ |
|
|
80 | int no_bargain; |
79 | int no_bargain; |
81 | int identified; |
80 | int identified; |
82 | int not_cursed; |
81 | int not_cursed; |
83 | int approximate; |
82 | int approximate; |
84 | int shop; |
83 | int shop; |
… | |
… | |
109 | |
108 | |
110 | LOG (llevError, "Query_cost: Gem type with unknown flag %d: %s\n", flag, tmp->debug_desc ()); |
109 | LOG (llevError, "Query_cost: Gem type with unknown flag %d: %s\n", flag, tmp->debug_desc ()); |
111 | return 0; |
110 | return 0; |
112 | } |
111 | } |
113 | |
112 | |
114 | number = tmp->nrof; |
113 | int number = tmp->number_of (); |
115 | if (number == 0) |
114 | |
116 | number = 1; |
|
|
117 | if (QUERY_FLAG (tmp, FLAG_IDENTIFIED) || !need_identify (tmp) || identified) |
115 | if (QUERY_FLAG (tmp, FLAG_IDENTIFIED) || !need_identify (tmp) || identified) |
118 | { |
116 | { |
119 | if (!not_cursed && (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) |
117 | if (!not_cursed && (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) |
120 | return 0; |
118 | return 0; |
121 | else |
119 | else |
122 | val = tmp->value * number; |
120 | val = tmp->value * number; |
123 | } |
121 | } |
124 | /* 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 */ |
125 | else |
123 | else |
126 | { |
124 | { |
127 | if (tmp->arch != NULL) |
|
|
128 | { |
|
|
129 | if (flag == F_BUY) |
125 | if (flag == F_BUY) |
|
|
126 | { |
|
|
127 | LOG (llevError | logBacktrace, "Asking for buy-value of unidentified object: %s\n", tmp->debug_desc ()); |
|
|
128 | val = tmp->arch->value * 50 * number; |
|
|
129 | } |
|
|
130 | else |
|
|
131 | { /* Trying to sell something, or get true value */ |
|
|
132 | if (tmp->type == POTION) |
|
|
133 | val = number * 40; /* Don't want to give anything away */ |
|
|
134 | else |
130 | { |
135 | { |
131 | LOG (llevError | logBacktrace, "Asking for buy-value of unidentified object.\n"); |
136 | /* Get 2/3'rd value for applied objects, 1/3'rd for totally |
132 | val = tmp->arch->value * 50 * number; |
137 | * unknown objects |
|
|
138 | */ |
|
|
139 | if (QUERY_FLAG (tmp, FLAG_BEEN_APPLIED)) |
|
|
140 | val = number * tmp->arch->value * 2 / 3; |
|
|
141 | else |
|
|
142 | val = number * tmp->arch->value / 3; |
133 | } |
143 | } |
134 | else |
|
|
135 | { /* Trying to sell something, or get true value */ |
|
|
136 | if (tmp->type == POTION) |
|
|
137 | val = number * 40; /* Don't want to give anything away */ |
|
|
138 | else |
|
|
139 | { |
|
|
140 | /* Get 2/3'rd value for applied objects, 1/3'rd for totally |
|
|
141 | * unknown objects |
|
|
142 | */ |
|
|
143 | if (QUERY_FLAG (tmp, FLAG_BEEN_APPLIED)) |
|
|
144 | val = number * tmp->arch->value * 2 / 3; |
|
|
145 | else |
|
|
146 | val = number * tmp->arch->value / 3; |
|
|
147 | } |
|
|
148 | } |
|
|
149 | } |
|
|
150 | else |
|
|
151 | { /* No archetype with this object */ |
|
|
152 | LOG (llevDebug, "In sell item: Have object with no archetype: %s\n", &tmp->name); |
|
|
153 | if (flag == F_BUY) |
|
|
154 | { |
|
|
155 | LOG (llevError | logBacktrace, "Asking for buy-value of unidentified object without arch.\n"); |
|
|
156 | val = number * tmp->value * 10; |
|
|
157 | } |
|
|
158 | else |
|
|
159 | val = number * tmp->value / 5; |
|
|
160 | } |
144 | } |
161 | } |
145 | } |
162 | |
146 | |
163 | /* If the item has been applied or identifed or does not need to be |
147 | /* If the item has been applied or identifed or does not need to be |
164 | * identified, AND the object is magical and the archetype is non |
148 | * identified, AND the object is magical and the archetype is non |
… | |
… | |
465 | } |
449 | } |
466 | |
450 | |
467 | for (tmp = op->inv; tmp; tmp = tmp->below) |
451 | for (tmp = op->inv; tmp; tmp = tmp->below) |
468 | if (tmp->type == MONEY) |
452 | if (tmp->type == MONEY) |
469 | total += tmp->nrof * (sint64)tmp->value; |
453 | total += tmp->nrof * (sint64)tmp->value; |
470 | else if (tmp->type == CONTAINER && QUERY_FLAG (tmp, FLAG_APPLIED) && (tmp->race == NULL || strstr (tmp->race, "gold"))) |
454 | else if (tmp->type == CONTAINER && QUERY_FLAG (tmp, FLAG_APPLIED) && (!tmp->race || tmp->race.contains ("gold"))) |
471 | total += query_money (tmp); |
455 | total += query_money (tmp); |
472 | |
456 | |
473 | return total; |
457 | return total; |
474 | } |
458 | } |
475 | |
459 | |
… | |
… | |
490 | return 0; |
474 | return 0; |
491 | |
475 | |
492 | pay_from_container (pl, pl, to_pay); |
476 | pay_from_container (pl, pl, to_pay); |
493 | |
477 | |
494 | for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) |
478 | for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) |
495 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (pouch->race == NULL || strstr (pouch->race, "gold"))) |
479 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (!pouch->race || pouch->race.contains ("gold"))) |
496 | pay_from_container (pl, pouch, to_pay); |
480 | pay_from_container (pl, pouch, to_pay); |
497 | |
481 | |
498 | pl->update_stats (); |
482 | pl->update_stats (); |
499 | return 1; |
483 | return 1; |
500 | } |
484 | } |
… | |
… | |
527 | change_exp (pl, saved_money, "bargaining", SK_EXP_NONE); |
511 | change_exp (pl, saved_money, "bargaining", SK_EXP_NONE); |
528 | |
512 | |
529 | pay_from_container (pl, pl, to_pay); |
513 | pay_from_container (pl, pl, to_pay); |
530 | |
514 | |
531 | for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) |
515 | for (pouch = pl->inv; pouch && to_pay; pouch = pouch->below) |
532 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (pouch->race == NULL || strstr (pouch->race, "gold"))) |
516 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && (!pouch->race || pouch->race.contains ("gold"))) |
533 | pay_from_container (pl, pouch, to_pay); |
517 | pay_from_container (pl, pouch, to_pay); |
534 | |
518 | |
535 | pl->update_stats (); |
519 | pl->update_stats (); |
536 | |
520 | |
537 | return 1; |
521 | return 1; |
… | |
… | |
577 | // This should not happen, but if it does, just merge the two. |
561 | // This should not happen, but if it does, just merge the two. |
578 | if (coin_objs [i]) |
562 | if (coin_objs [i]) |
579 | { |
563 | { |
580 | LOG (llevError, "%s has two money entries of (%s)\n", &pouch->name, coins[NUM_COINS - 1 - i]); |
564 | LOG (llevError, "%s has two money entries of (%s)\n", &pouch->name, coins[NUM_COINS - 1 - i]); |
581 | coin_objs[i]->nrof += tmp->nrof; |
565 | coin_objs[i]->nrof += tmp->nrof; |
582 | tmp->destroy (true); |
566 | tmp->destroy (); |
583 | } |
567 | } |
584 | else |
568 | else |
585 | { |
569 | { |
586 | tmp->remove (); |
570 | tmp->remove (); |
587 | coin_objs[i] = tmp; |
571 | coin_objs[i] = tmp; |
… | |
… | |
634 | |
618 | |
635 | for (i = 0; i < NUM_COINS; i++) |
619 | for (i = 0; i < NUM_COINS; i++) |
636 | if (coin_objs[i]->nrof) |
620 | if (coin_objs[i]->nrof) |
637 | insert_ob_in_ob (coin_objs [i], pouch); |
621 | insert_ob_in_ob (coin_objs [i], pouch); |
638 | else |
622 | else |
639 | coin_objs[i]->destroy (true); |
623 | coin_objs[i]->destroy (); |
640 | } |
624 | } |
641 | |
625 | |
642 | /* Checks all unpaid items in op's inventory, adds up all the money they |
626 | /* Checks all unpaid items in op's inventory, adds up all the money they |
643 | * have, and checks that they can actually afford what they want to buy. |
627 | * have, and checks that they can actually afford what they want to buy. |
644 | * Returns 1 if they can, and 0 if they can't. also prints an appropriate message |
628 | * Returns 1 if they can, and 0 if they can't. also prints an appropriate message |
… | |
… | |
669 | dynbuf_text buf; |
653 | dynbuf_text buf; |
670 | |
654 | |
671 | buf << "You have " << unpaid_count |
655 | buf << "You have " << unpaid_count |
672 | << " unpaid item(s) that would cost you " << cost_string_from_value (unpaid_price, 0) |
656 | << " unpaid item(s) that would cost you " << cost_string_from_value (unpaid_price, 0) |
673 | << ". You need another " << cost_string_from_value (unpaid_price - player_wealth, 0) |
657 | << ". You need another " << cost_string_from_value (unpaid_price - player_wealth, 0) |
674 | << " to be able to afford that."; |
658 | << " to be able to afford that. " |
|
|
659 | "H<You cannot leave a shop without paying - drop unpaid items first to be able to leave.>"; |
675 | |
660 | |
676 | pl->failmsg (buf); |
661 | pl->failmsg (buf); |
677 | |
662 | |
678 | return 0; |
663 | return 0; |
679 | } |
664 | } |
… | |
… | |
754 | LOG (llevError, "Could not find %s archetype\n", coins[count]); |
739 | LOG (llevError, "Could not find %s archetype\n", coins[count]); |
755 | else if ((amount / at->value) > 0) |
740 | else if ((amount / at->value) > 0) |
756 | { |
741 | { |
757 | for (pouch = pl->inv; pouch; pouch = pouch->below) |
742 | for (pouch = pl->inv; pouch; pouch = pouch->below) |
758 | { |
743 | { |
759 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && pouch->race && strstr (pouch->race, "gold")) |
744 | if (pouch->type == CONTAINER && QUERY_FLAG (pouch, FLAG_APPLIED) && pouch->race.contains ("gold")) |
760 | { |
745 | { |
761 | int w = at->weight * (100 - pouch->stats.Str) / 100; |
746 | int w = at->weight * (100 - pouch->stats.Str) / 100; |
762 | int n = amount / at->value; |
747 | int n = amount / at->value; |
763 | |
748 | |
764 | if (w == 0) |
749 | if (w == 0) |