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.16 by root, Thu Sep 14 22:34:04 2006 UTC vs.
Revision 1.24 by root, Fri Dec 15 19:59:20 2006 UTC

23 23
24#include <global.h> 24#include <global.h>
25#include <spells.h> 25#include <spells.h>
26#include <skills.h> 26#include <skills.h>
27#include <living.h> 27#include <living.h>
28#include <newclient.h>
29#ifndef __CEXTRACT__
30# include <sproto.h> 28#include <sproto.h>
31#endif
32#include <math.h> 29#include <math.h>
33 30
34/* this is a measure of how effective store specialisation is. A general store 31/* this is a measure of how effective store specialisation is. A general store
35 * will offer this proportion of the 'maximum' price, a specialised store will 32 * will offer this proportion of the 'maximum' price, a specialised store will
36 * offer a range of prices around it such that the maximum price is always one 33 * offer a range of prices around it such that the maximum price is always one
43/* price a shopkeeper will give someone they neither like nor dislike */ 40/* price a shopkeeper will give someone they neither like nor dislike */
44#define NEUTRAL_RATIO 0.8 41#define NEUTRAL_RATIO 0.8
45 42
46static void pay_from_container (object *pl, object *pouch, sint64 &to_pay); 43static void pay_from_container (object *pl, object *pouch, sint64 &to_pay);
47static sint64 value_limit (sint64 val, int quantity, const object *who, int isshop); 44static sint64 value_limit (sint64 val, int quantity, const object *who, int isshop);
48static double shop_specialisation_ratio (const object *item, const mapstruct *map); 45static double shop_specialisation_ratio (const object *item, const maptile *map);
49static double shop_greed (const mapstruct *map); 46static double shop_greed (const maptile *map);
50 47
51#define NUM_COINS 4 /* number of coin types */ 48#define NUM_COINS 4 /* number of coin types */
52static const char *const coins[] = { "royalty", "platinacoin", "goldcoin", "silvercoin", NULL }; 49static const char *const coins[] = { "royalty", "platinacoin", "goldcoin", "silvercoin", NULL };
53 50
54/* Added F_TRUE flag to define.h to mean that the price should not 51/* Added F_TRUE flag to define.h to mean that the price should not
590 { 587 {
591 // This should not happen, but if it does, just merge the two. 588 // This should not happen, but if it does, just merge the two.
592 if (coin_objs [i]) 589 if (coin_objs [i])
593 { 590 {
594 LOG (llevError, "%s has two money entries of (%s)\n", &pouch->name, coins[NUM_COINS - 1 - i]); 591 LOG (llevError, "%s has two money entries of (%s)\n", &pouch->name, coins[NUM_COINS - 1 - i]);
595 remove_ob (tmp); 592 tmp->remove ();
596 coin_objs[i]->nrof += tmp->nrof; 593 coin_objs[i]->nrof += tmp->nrof;
597 esrv_del_item (pl->contr, tmp->count); 594 esrv_del_item (pl->contr, tmp->count);
598 free_object (tmp); 595 tmp->destroy ();
599 } 596 }
600 else 597 else
601 { 598 {
602 remove_ob (tmp); 599 tmp->remove ();
603 600
604 if (pouch->type == PLAYER) 601 if (pouch->type == PLAYER)
605 esrv_del_item (pl->contr, tmp->count); 602 esrv_del_item (pl->contr, tmp->count);
606 603
607 coin_objs[i] = tmp; 604 coin_objs[i] = tmp;
666 663
667 if (pl->type != PLAYER) 664 if (pl->type != PLAYER)
668 esrv_send_item (pl, pl); 665 esrv_send_item (pl, pl);
669 } 666 }
670 else 667 else
671 free_object (coin_objs[i]); 668 coin_objs[i]->destroy ();
672 } 669 }
673} 670}
674 671
675/* Checks all unpaid items in op's inventory, adds up all the money they 672/* Checks all unpaid items in op's inventory, adds up all the money they
676 * have, and checks that they can actually afford what they want to buy. 673 * have, and checks that they can actually afford what they want to buy.
681can_pay (object *pl) 678can_pay (object *pl)
682{ 679{
683 int unpaid_count = 0; 680 int unpaid_count = 0;
684 sint64 unpaid_price = 0; 681 sint64 unpaid_price = 0;
685 sint64 player_wealth = query_money (pl); 682 sint64 player_wealth = query_money (pl);
686 object *item;
687 683
688 if (!pl || pl->type != PLAYER) 684 if (!pl || pl->type != PLAYER)
689 { 685 {
690 LOG (llevError, "can_pay(): called against something that isn't a player\n"); 686 LOG (llevError, "can_pay(): called against something that isn't a player\n");
691 return 0; 687 return 0;
747 return 0; 743 return 0;
748 } 744 }
749 else 745 else
750 { 746 {
751 object *tmp; 747 object *tmp;
752 tag_t c = op->count;
753 748
754 CLEAR_FLAG (op, FLAG_UNPAID); 749 CLEAR_FLAG (op, FLAG_UNPAID);
755 CLEAR_FLAG (op, FLAG_PLAYER_SOLD); 750 CLEAR_FLAG (op, FLAG_PLAYER_SOLD);
756 new_draw_info_format (NDI_UNIQUE, 0, op, "You paid %s for %s.", buf, query_name (op)); 751 new_draw_info_format (NDI_UNIQUE, 0, op, "You paid %s for %s.", buf, query_name (op));
757 tmp = merge_ob (op, NULL); 752 tmp = merge_ob (op, NULL);
758 753
759 if (pl->type == PLAYER) 754 if (pl->type == PLAYER)
760 { 755 {
761 if (tmp) 756 if (tmp)
762 { /* it was merged */ 757 { /* it was merged */
763 esrv_del_item (pl->contr, c); 758 esrv_del_item (pl->contr, op->count);
764 op = tmp; 759 op = tmp;
765 } 760 }
766 761
767 esrv_send_item (pl, op); 762 esrv_send_item (pl, op);
768 } 763 }
840 } 835 }
841 } 836 }
842 } 837 }
843 838
844 if (amount != 0) 839 if (amount != 0)
845#ifndef WIN32
846 LOG (llevError, "Warning - payment in pay_player () not zero: %llu\n", amount); 840 LOG (llevError, "Warning - payment in pay_player () not zero: %llu\n", amount);
847#else
848 LOG (llevError, "Warning - payment in pay_player () not zero: %I64u\n", amount);
849#endif
850} 841}
851 842
852/* elmex: this is for the bank plugin :( */ 843/* elmex: this is for the bank plugin :( */
853sint64 844sint64
854pay_player_arch (object *pl, const char *arch, sint64 amount) 845pay_player_arch (object *pl, const char *arch, sint64 amount)
931 * item based on the shops specialisation. Does not take account of greed, 922 * item based on the shops specialisation. Does not take account of greed,
932 * returned value is between (2*SPECIALISATION_EFFECT-1) and 1 and in any 923 * returned value is between (2*SPECIALISATION_EFFECT-1) and 1 and in any
933 * event is never less than 0.1 (calling functions divide by it) 924 * event is never less than 0.1 (calling functions divide by it)
934 */ 925 */
935static double 926static double
936shop_specialisation_ratio (const object *item, const mapstruct *map) 927shop_specialisation_ratio (const object *item, const maptile *map)
937{ 928{
938 shopitems *items = map->shopitems; 929 shopitems *items = map->shopitems;
939 double ratio = SPECIALISATION_EFFECT, likedness = 0.001; 930 double ratio = SPECIALISATION_EFFECT, likedness = 0.001;
940 int i; 931 int i;
941 932
982 return ratio; 973 return ratio;
983} 974}
984 975
985/*returns the greed of the shop on map, or 1 if it isn't specified. */ 976/*returns the greed of the shop on map, or 1 if it isn't specified. */
986static double 977static double
987shop_greed (const mapstruct *map) 978shop_greed (const maptile *map)
988{ 979{
989 double greed = 1.0; 980 double greed = 1.0;
990 981
991 if (map->shopgreed) 982 if (map->shopgreed)
992 return map->shopgreed; 983 return map->shopgreed;
995 986
996/* Returns a double based on how much the shopkeeper approves of the player. 987/* Returns a double based on how much the shopkeeper approves of the player.
997 * this is based on the race of the shopkeeper and that of the player. 988 * this is based on the race of the shopkeeper and that of the player.
998 */ 989 */
999double 990double
1000shopkeeper_approval (const mapstruct *map, const object *player) 991shopkeeper_approval (const maptile *map, const object *player)
1001{ 992{
1002 double approval = 1.0; 993 double approval = 1.0;
1003 994
1004 if (map->shoprace) 995 if (map->shoprace)
1005 { 996 {
1020 */ 1011 */
1021static sint64 1012static sint64
1022value_limit (sint64 val, int quantity, const object *who, int isshop) 1013value_limit (sint64 val, int quantity, const object *who, int isshop)
1023{ 1014{
1024 sint64 newval, unit_price, tmpshopmax; 1015 sint64 newval, unit_price, tmpshopmax;
1025 mapstruct *map; 1016 maptile *map;
1026 1017
1027 unit_price = val / quantity; 1018 unit_price = val / quantity;
1028 1019
1029 if (!isshop || !who) 1020 if (!isshop || !who)
1030 { 1021 {
1060 1051
1061/* gives a desciption of the shop on their current map to the player op. */ 1052/* gives a desciption of the shop on their current map to the player op. */
1062int 1053int
1063describe_shop (const object *op) 1054describe_shop (const object *op)
1064{ 1055{
1065 mapstruct *map = op->map; 1056 maptile *map = op->map;
1066 1057
1067 /*shopitems *items=map->shopitems; */ 1058 /*shopitems *items=map->shopitems; */
1068 int pos = 0, i; 1059 int pos = 0, i;
1069 double opinion = 0; 1060 double opinion = 0;
1070 char tmp[MAX_BUF] = "\0"; 1061 char tmp[MAX_BUF] = "\0";
1184 case RING: 1175 case RING:
1185 case AMULET: 1176 case AMULET:
1186 case BRACERS: 1177 case BRACERS:
1187 case GIRDLE: 1178 case GIRDLE:
1188 sprintf (buf, "%s %s", query_base_name (tmp, 0), describe_item (tmp, NULL)); 1179 sprintf (buf, "%s %s", query_base_name (tmp, 0), describe_item (tmp, NULL));
1189 items[*numitems].item_sort = strdup_local (buf); 1180 items[*numitems].item_sort = strdup (buf);
1190 sprintf (buf, "%s %s", query_name (tmp), describe_item (tmp, NULL)); 1181 sprintf (buf, "%s %s", query_name (tmp), describe_item (tmp, NULL));
1191 items[*numitems].item_real = strdup_local (buf); 1182 items[*numitems].item_real = strdup (buf);
1192 (*numitems)++; 1183 (*numitems)++;
1193 break; 1184 break;
1194#endif 1185#endif
1195 1186
1196 default: 1187 default:
1197 items[*numitems].item_sort = strdup_local (query_base_name (tmp, 0)); 1188 items[*numitems].item_sort = strdup (query_base_name (tmp, 0));
1198 items[*numitems].item_real = strdup_local (query_base_name (tmp, 1)); 1189 items[*numitems].item_real = strdup (query_base_name (tmp, 1));
1199 (*numitems)++; 1190 (*numitems)++;
1200 break; 1191 break;
1201 } 1192 }
1202 SET_FLAG (tmp, FLAG_UNPAID); 1193 SET_FLAG (tmp, FLAG_UNPAID);
1203} 1194}
1296 return is_in_shop (o->map, o->x, o->y); 1287 return is_in_shop (o->map, o->x, o->y);
1297} 1288}
1298 1289
1299/* elmex: this function checks whether we are in a shop or not */ 1290/* elmex: this function checks whether we are in a shop or not */
1300bool 1291bool
1301is_in_shop (mapstruct *map, int x, int y) 1292is_in_shop (maptile *map, int x, int y)
1302{ 1293{
1303 for (object *floor = get_map_ob (map, x, y); floor; floor = floor->above) 1294 for (object *floor = get_map_ob (map, x, y); floor; floor = floor->above)
1304 if (floor->type == SHOP_FLOOR) 1295 if (floor->type == SHOP_FLOOR)
1305 return true; 1296 return true;
1306 1297

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines