Crossfire Server, Trunk
R21670
|
#include "global.h"
#include <assert.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "shop.h"
#include "sproto.h"
Go to the source code of this file.
Macros | |
#define | DISAPPROVAL_RATIO 0.2 |
#define | LARGEST_COIN_GIVEN 2 |
#define | NEUTRAL_RATIO 0.8 |
#define | NUM_COINS 5 |
#define | SPECIALISATION_EFFECT 0.5 |
Functions | |
static void | add_value (object *coin_objs[], int64_t value) |
int | can_pay (object *pl) |
static bool | coords_in_shop (mapstruct *map, int x, int y) |
char * | cost_approx_str (const object *tmp, object *who) |
char * | cost_str (uint64_t cost) |
char * | cost_string_from_value (uint64_t cost, int largest_coin) |
static void | count_unpaid (object *pl, object *item, int *unpaid_count, uint64_t *unpaid_price, uint32_t *coincount) |
static archetype * | find_next_coin (uint64_t c, int *cointype) |
static void | insert_objects (object *pl, object *container, object *objects[], int objects_len) |
int | pay_for_amount (uint64_t to_pay, object *pl) |
int | pay_for_item (object *op, object *pl) |
static uint64_t | pay_from_container (object *pl, object *pouch, uint64_t to_pay) |
uint64_t | price_approx (const object *tmp, object *who) |
uint64_t | price_base (const object *obj) |
uint64_t | query_money (const object *op) |
static StringBuffer * | real_money_value (const object *coin, StringBuffer *buf) |
static int64_t | remove_value (object *coin_objs[], int64_t remain) |
void | sell_item (object *op, object *pl) |
double | shop_approval (const mapstruct *map, const object *player) |
static float | shop_bargain_multiplier (int lev_bargain) |
static float | shop_buy_multiplier (int charisma) |
bool | shop_contains (object *ob) |
int | shop_describe (const object *op) |
static double | shop_greed (const mapstruct *map) |
int | shop_pay_unpaid (object *pl, object *op) |
uint64_t | shop_price_buy (const object *tmp, object *who) |
uint64_t | shop_price_sell (const object *tmp, object *who) |
static double | shop_specialisation_ratio (const object *item, const mapstruct *map) |
static uint64_t | value_limit (uint64_t val, int quantity, const object *who, int isshop) |
Variables | |
static const char *const | coins [] |
Those functions deal with shop handling, bargaining, things like that.
Definition in file shop.c.
#define DISAPPROVAL_RATIO 0.2 |
#define LARGEST_COIN_GIVEN 2 |
Never give amber or jade, but accept them
Definition at line 54 of file shop.c.
Referenced by add_value(), cost_approx_str(), cost_str(), and sell_item().
#define NEUTRAL_RATIO 0.8 |
Price a shopkeeper will give someone they neither like nor dislike
Definition at line 45 of file shop.c.
Referenced by shop_approval().
#define NUM_COINS 5 |
Number of coin types
Definition at line 52 of file shop.c.
Referenced by add_value(), can_pay(), cost_string_from_value(), count_unpaid(), pay_from_container(), and remove_value().
#define SPECIALISATION_EFFECT 0.5 |
This is a measure of how effective store specialisation is. A general store will offer this proportion of the 'maximum' price, a specialised store will offer a range of prices around it such that the maximum price is always one therefore making this number higher, makes specialisation less effective. setting this value above 1 or to a negative value would have interesting, (though not useful) effects.
Definition at line 39 of file shop.c.
Referenced by shop_specialisation_ratio().
This function adds a given amount to a list of coins.
coin_objs | the list coins to add to; the list must be ordered from least to most valuable coin |
value | the value (in silver coins) to add |
Definition at line 639 of file shop.c.
References LARGEST_COIN_GIVEN, obj::nrof, NUM_COINS, and obj::value.
Referenced by pay_from_container().
int can_pay | ( | object * | pl | ) |
Checks all unpaid items in op's inventory, adds up all the money they have, and checks that they can actually afford what they want to buy. Prints appropriate messages to the player.
pl | player trying to bug. |
1 | player could buy the items. |
0 | some items can't be bought. |
Definition at line 830 of file shop.c.
References archt::clone, coins, cost_str(), count_unpaid(), draw_ext_info(), find_archetype(), obj::inv, llevError, LOG(), make_list_like(), MAX_BUF, MSG_TYPE_SHOP, MSG_TYPE_SHOP_PAYMENT, obj::name_pl, NDI_UNIQUE, NUM_COINS, PLAYER, query_money(), snprintf, and obj::type.
Referenced by cfapi_player_can_pay(), and shop_mat_type_move_on().
|
static |
Check if the given map coordinates are in a shop.
Definition at line 1267 of file shop.c.
References FOR_MAP_FINISH, FOR_MAP_PREPARE, and SHOP_FLOOR.
Referenced by shop_contains().
Return a textual cost approximation in a newly-allocated string.
obj | item to query the price of, must not be NULL. |
who | player asking for the price, must not be NULL. |
Definition at line 421 of file shop.c.
References archt::clone, cost_str(), find_next_coin(), find_skill_by_number(), get_typedata(), typedata::identifyskill, typedata::identifyskill2, LARGEST_COIN_GIVEN, MONEY, obj::name, obj::name_pl, price_approx(), real_money_value(), SK_BARGAINING, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_delete(), stringbuffer_finish(), stringbuffer_new(), obj::type, and obj::value.
Referenced by examine().
char* cost_str | ( | uint64_t | cost | ) |
Definition at line 417 of file shop.c.
References cost_string_from_value(), and LARGEST_COIN_GIVEN.
Referenced by can_pay(), cost_approx_str(), examine(), pick_up_object(), sell_item(), shop_describe(), and shop_pay_unpaid().
char* cost_string_from_value | ( | uint64_t | cost, |
int | largest_coin | ||
) |
Converts a price to number of coins.
While cost is 64 bit, the number of any coin is still really limited to 32 bit (size of nrof field). If it turns out players have so much money that they have more than 2 billion platinum coins, there are certainly issues - the easiest fix at that time is to add a higher denomination (mithril piece with 10,000 silver or something)
cost | value to transform to currency. |
largest_coin | maximum coin to give the price into, should be between 0 and NUM_COINS - 1. |
Definition at line 334 of file shop.c.
References archt::clone, find_next_coin(), obj::name, NUM_COINS, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_finish(), stringbuffer_new(), and obj::value.
Referenced by cfapi_cost_string_from_value(), and cost_str().
|
static |
Sum the amount to pay for all unpaid items and find available money.
pl | player we're checking for, used for buying price with bargaining. | |
item | item to check for. | |
[out] | unpaid_count | how many unpaid items are left. |
[out] | unpaid_price | total price unpaid. |
coincount | array of NUM_COINS size, will contain how many coins of the type the player has. |
Definition at line 796 of file shop.c.
References obj::arch, coins, FLAG_UNPAID, FOR_OB_AND_BELOW_FINISH, FOR_OB_AND_BELOW_PREPARE, obj::inv, archt::name, obj::nrof, NUM_COINS, QUERY_FLAG, and shop_price_buy().
Referenced by can_pay().
Find the coin type that is worth more than 'c'. Starts at the cointype placement.
c | value we're searching. |
cointype | first coin type to search. |
Definition at line 302 of file shop.c.
References archt::clone, coins, find_archetype(), and obj::value.
Referenced by cost_approx_str(), and cost_string_from_value().
|
static |
Insert a list of objects into a player object.
pl | the player to add to |
container | the container (inside the player object) to add to |
objects | the list of objects to add; the objects will be either inserted into the player object or freed |
objects_len | the length of objects |
Definition at line 663 of file shop.c.
References esrv_update_item(), object_free_drop_inventory(), object_insert_in_ob(), and UPD_WEIGHT.
Referenced by pay_from_container().
Takes the amount of money from the the player inventory and from it's various pouches using the pay_from_container() function.
to_pay | amount to pay. |
pl | player paying. |
Definition at line 513 of file shop.c.
References CONTAINER, fix_object(), FLAG_APPLIED, FMT64U, FOR_INV_FINISH, FOR_INV_PREPARE, llevError, LOG(), pay_from_container(), QUERY_FLAG, and query_money().
Referenced by cfapi_object_pay_amount().
Player attemps to buy an item, if she has enough money then remove coins as needed from active containers. Also handles bargaining experience.
op | object to buy. |
pl | player buying. |
Definition at line 551 of file shop.c.
References change_exp(), CONTAINER, FALSE, fix_object(), FLAG_APPLIED, FLAG_WAS_WIZ, FMT64U, FOR_INV_FINISH, FOR_INV_PREPARE, llevError, LOG(), pay_from_container(), price_base(), QUERY_FLAG, query_money(), Settings::real_wiz, SET_FLAG, settings, shop_price_buy(), and SK_EXP_NONE.
Referenced by cfapi_object_pay_item(), and shop_pay_unpaid().
This pays for the item, and takes the proper amount of money off the specified container (pouch or player), without recursing opened containers.
pl | player paying. |
pouch | container (pouch or player) to remove the coins from. |
to_pay | required amount. |
Definition at line 691 of file shop.c.
References add_value(), archt::clone, coins, CONTAINER, find_archetype(), FOR_INV_FINISH, FOR_INV_PREPARE, insert_objects(), llevError, LOG(), MONEY, obj::name, obj::nrof, NUM_COINS, object_copy(), object_free_drop_inventory(), object_new(), object_remove(), PLAYER, remove_value(), obj::type, and obj::value.
Referenced by pay_for_amount(), and pay_for_item().
Adjust the value of the given item based on the player's skills. This function should only be used when calculating "you reckon" prices.
obj | item in question. Must not be NULL. |
who | player trying to judge the value of the item. Must not be NULL. |
Definition at line 128 of file shop.c.
References obj::count, find_skill_by_number(), get_typedata(), typedata::identifyskill, typedata::identifyskill2, obj::level, llevError, LOG(), obj::name, price_base(), and obj::type.
Referenced by cost_approx_str().
Price an item based on its value or archetype value, type, identification/BUC status, and other heuristics.
Shopkeepers always know the BUC status of items. Adjust the base price of items based on their BUC status. Note that later in shop_price_sell, we further decrease the sell price of cursed and damned items.
Definition at line 70 of file shop.c.
References obj::arch, archt::clone, FLAG_BLESSED, FLAG_CURSED, FLAG_DAMNED, liv::food, GEM, is_identified(), obj::magic, MONEY, NROF(), object_get_value(), QUERY_FLAG, obj::stats, obj::type, obj::value, and WAND.
Referenced by alchemy_object(), attempt_do_alchemy(), check_pick(), pay_for_item(), price_approx(), sell_item(), shop_price_buy(), and shop_price_sell().
Determine the amount of money the given object contains, including what is inside containers.
op | Player or container object |
Definition at line 482 of file shop.c.
References CONTAINER, FLAG_APPLIED, FOR_INV_FINISH, FOR_INV_PREPARE, llevError, LOG(), MONEY, PLAYER, QUERY_FLAG, and obj::type.
Referenced by can_pay(), cfapi_object_query_money(), pay_for_amount(), pay_for_item(), and shop_pay_unpaid().
|
static |
Returns a string representing the money's value, in plain coins.
coin | coin. Must be of type MONEY. |
buf | buffer to append to. Must not be NULL. |
Definition at line 409 of file shop.c.
References MONEY, obj::name, obj::name_pl, obj::nrof, stringbuffer_append_printf(), and obj::type.
Referenced by cost_approx_str().
This function removes a given amount from a list of coins.
coin_objs | the list coins to remove from; the list must be ordered from least to most valuable coin. |
remain | the value (in silver coins) to remove |
Definition at line 598 of file shop.c.
References obj::nrof, NUM_COINS, and obj::value.
Referenced by pay_from_container().
Player is selling an item. Give money, print appropriate messages.
Will fill applied money containers before dumping remaining coins in character's inventory.
op | object to sell. |
pl | player. Shouldn't be NULL or non player. |
Definition at line 951 of file shop.c.
References change_exp(), archt::clone, coins, CONTAINER, cost_str(), obj::custom_name, draw_ext_info_format(), esrv_update_item(), EVENT_SELLING, execute_event(), find_archetype(), FLAG_APPLIED, FLAG_UNPAID, FOR_INV_FINISH, FOR_INV_PREPARE, FREE_AND_CLEAR_STR, identify(), LARGEST_COIN_GIVEN, llevDebug, llevError, LOG(), MAX_BUF, MSG_TYPE_SHOP, MSG_TYPE_SHOP_SELL, NDI_UNIQUE, obj::nrof, object_copy(), object_insert_in_ob(), object_new(), PLAYER, price_base(), QUERY_FLAG, query_name(), SCRIPT_FIX_ALL, SET_FLAG, shop_price_sell(), SK_EXP_NONE, obj::type, UPD_WEIGHT, obj::value, and obj::weight.
Referenced by drop_object().
Return the approval ratio for a shop for a given player. This is based on both the race of the shopkeeper and the player.
map | Map with a shop |
player | Player in question |
Definition at line 1108 of file shop.c.
References NEUTRAL_RATIO, obj::race, and mapdef::shoprace.
Referenced by shop_describe(), shop_mat_type_move_on(), shop_price_buy(), and shop_price_sell().
|
static |
Calculate the buy price multiplier based on a player's bargaining skill. The reciprocal of this result can be used as a sell multiplier.
lev_bargain | player's bargaining level. |
Definition at line 188 of file shop.c.
References Settings::max_level, and settings.
Referenced by shop_price_buy().
|
static |
Calculate the buy price multiplier based on a player's charisma.
charisma | player's charisma. |
Definition at line 169 of file shop.c.
Referenced by shop_price_buy().
bool shop_contains | ( | object * | ob | ) |
Check if an object is in a shop.
Definition at line 1274 of file shop.c.
References coords_in_shop(), obj::map, obj::x, and obj::y.
Referenced by convert_item(), drop_object(), examine(), kill_player_not_permadeath(), shop_mat_type_move_on(), and transport_type_apply().
int shop_describe | ( | const object * | op | ) |
A player is examining a shop, so describe it.
op | who is examining the shop. |
Definition at line 1172 of file shop.c.
References cost_str(), draw_ext_info(), draw_ext_info_format(), shopitem::index, make_list_like(), obj::map, MAX_BUF, MSG_TYPE_SHOP, MSG_TYPE_SHOP_LISTING, MSG_TYPE_SHOP_MISC, shopitem::name, shopitem::name_pl, NDI_UNIQUE, PLAYER, shop_approval(), mapdef::shopgreed, mapdef::shopitems, mapdef::shopmax, mapdef::shopmin, mapdef::shoprace, snprintf, shopitem::strength, and obj::type.
Referenced by do_skill().
|
static |
Gets shop's greed.
map | map to get greed. |
Definition at line 1100 of file shop.c.
References mapdef::shopgreed.
Referenced by shop_price_buy(), and shop_price_sell().
Pay as many unpaid items as possible, recursing on op->inv and op->below.
pl | player who is buying items. |
op | first potentially unpaid item. |
Definition at line 883 of file shop.c.
References obj::below, CLEAR_FLAG, cost_str(), draw_ext_info_format(), esrv_update_item(), EVENT_BOUGHT, execute_event(), FLAG_PLAYER_SOLD, FLAG_UNPAID, obj::inv, MAX_BUF, MSG_TYPE_SHOP, MSG_TYPE_SHOP_PAYMENT, NDI_UNIQUE, object_merge(), pay_for_item(), PLAYER, QUERY_FLAG, query_money(), query_name(), SCRIPT_FIX_ALL, SET_FLAG, shop_price_buy(), obj::type, UPD_FLAGS, and UPD_NAME.
Referenced by shop_mat_type_move_on().
Adjust the value of an item to be bought based on the player's bargaining skill and charisma. This should only be used if the player is in a shop.
obj | item in question. Must not be NULL. |
who | player trying to judge the value of the item. Must not be NULL. |
Definition at line 192 of file shop.c.
References liv::Cha, find_skill_by_number(), FLAG_CURSED, FLAG_DAMNED, FLAG_PLAYER_SOLD, GEM, obj::level, obj::map, object_get_value(), PLAYER, price_base(), QUERY_FLAG, shop_approval(), shop_bargain_multiplier(), shop_buy_multiplier(), shop_greed(), shop_specialisation_ratio(), SK_BARGAINING, obj::stats, and obj::type.
Referenced by count_unpaid(), examine(), pay_for_item(), pick_up_object(), and shop_pay_unpaid().
Adjust the value of an item to be sold based on the player's bargaining skill and charisma. This should only be used if the player is in a shop.
obj | item in question. Must not be NULL. |
who | player trying to judge the value of the item. Must not be NULL. |
Definition at line 250 of file shop.c.
References obj::arch, FLAG_BEEN_APPLIED, GEM, is_identified(), obj::map, NROF(), object_get_value(), PLAYER, price_base(), QUERY_FLAG, shop_approval(), shop_greed(), shop_specialisation_ratio(), obj::type, and value_limit().
Referenced by examine(), sell_item(), and START_TEST().
Returns a double that is the ratio of the price that a shop will offer for item based on the shops specialisation. Does not take account of greed, returned value is between (2*SPECIALISATION_EFFECT-1) and 1 and in any event is never less than 0.1 (calling functions divide by it).
item | item to get ratio of. |
map | shop map. |
Definition at line 1055 of file shop.c.
References shopitem::index, llevDebug, llevError, LOG(), mapdef::path, mapdef::shopitems, SPECIALISATION_EFFECT, shopitem::strength, obj::type, and shopitem::typenum.
Referenced by shop_price_buy(), and shop_price_sell().
Limit the value of items based on the wealth of the shop. If the item is close to the maximum value a shop will offer, we start to reduce it, if the item is below the minimum value the shop is prepared to trade in, then we don't want it and offer nothing. If it isn't a shop, check whether we should do generic value reduction.
val | current price. |
quantity | number of items. |
who | player selling. |
isshop | 0 if not a shop, 1 if a shop. |
Definition at line 1138 of file shop.c.
References isqrt(), llevError, LOG(), obj::map, MIN, obj::name, mapdef::shopmax, and mapdef::shopmin.
Referenced by shop_price_sell().
|
static |
Coins to use for shopping.
Definition at line 57 of file shop.c.
Referenced by can_pay(), count_unpaid(), find_next_coin(), pay_from_container(), and sell_item().