Crossfire Server, Trunk  R20513
Functions
shop.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

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. More...
 
char * cost_approx_str (const object *obj, object *who)
 Return a textual cost approximation in a newly-allocated string. More...
 
char * cost_str (uint64_t cost)
 
char * cost_string_from_value (uint64_t cost, int largest_coin)
 Return the textual representation of a cost in a newly-allocated string. More...
 
int pay_for_amount (uint64_t to_pay, object *pl)
 Takes the amount of money from the the player inventory and from it's various pouches using the pay_from_container() function. More...
 
int pay_for_item (object *op, object *pl)
 DAMN: This is now a wrapper for pay_from_container, which is called for the player, then for each active container that can hold money until op is paid for. More...
 
uint64_t price_approx (const object *obj, object *who)
 Adjust the value of the given item based on the player's skills. More...
 
uint64_t price_base (const object *obj)
 Determine the base (intrinsic) value of an item. More...
 
uint64_t query_money (const object *op)
 Determine the amount of money the given object contains, including what is inside containers. More...
 
void sell_item (object *op, object *pl)
 Player is selling an item. More...
 
double shop_approval (const mapstruct *map, const object *player)
 Return the approval ratio for a shop for a given player. More...
 
bool shop_contains (object *ob)
 Check if an object is in a shop. More...
 
int shop_describe (const object *op)
 Give the player a description of the shop on their current map. More...
 
int shop_pay_unpaid (object *pl, object *op)
 Pay for each unpaid item carried by a player, including those inside containers. More...
 
uint64_t shop_price_buy (const object *obj, object *who)
 Adjust the value of an item to be bought based on the player's bargaining skill and charisma. More...
 
uint64_t shop_price_sell (const object *obj, object *who)
 Adjust the value of an item to be sold based on the player's bargaining skill and charisma. More...
 

Function Documentation

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.

Parameters
plplayer trying to bug.
Return values
1player could buy the items.
0some items can't be bought.

Definition at line 812 of file shop.c.

References 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, NDI_UNIQUE, NUM_COINS, PLAYER, query_money(), snprintf, and obj::type.

Referenced by cfapi_player_can_pay(), and shop_mat_type_move_on().

Here is the call graph for this function:

Here is the caller graph for this function:

char* cost_approx_str ( const object obj,
object who 
)

Return a textual cost approximation in a newly-allocated string.

Parameters
objitem to query the price of, must not be NULL.
whoplayer asking for the price, must not be NULL.
Returns
converted value the caller is responsible to free.

Definition at line 398 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().

Here is the call graph for this function:

Here is the caller graph for this function:

char* cost_str ( uint64_t  cost)

Definition at line 394 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().

Here is the call graph for this function:

Here is the caller graph for this function:

char* cost_string_from_value ( uint64_t  cost,
int  largest_coin 
)

Return the textual representation of a cost in a newly-allocated string.

Parameters
costvalue to convert to text.
Returns
converted value the caller is responsible to free.

Return the textual representation of a cost in a newly-allocated string.

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)

Parameters
costvalue to transform to currency.
largest_coinmaximum coin to give the price into, should be between 0 and NUM_COINS - 1.
bufbuffer to append to, if NULL a new one is returned.
Returns
buffer containing the price, either buf or if NULL a new StringBuffer.

Definition at line 311 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().

Here is the call graph for this function:

Here is the caller graph for this function:

int pay_for_amount ( uint64_t  to_pay,
object pl 
)

Takes the amount of money from the the player inventory and from it's various pouches using the pay_from_container() function.

Parameters
to_payamount to pay.
plplayer paying.
Returns
0 if not enough money, in which case nothing is removed, 1 if money was removed.
Todo:
check if pl is a player, as query_money() expects that. Check if fix_object() call is required.

Definition at line 490 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().

Here is the call graph for this function:

Here is the caller graph for this function:

int pay_for_item ( object op,
object pl 
)

DAMN: This is now a wrapper for pay_from_container, which is called for the player, then for each active container that can hold money until op is paid for.

Change will be left wherever the last of the price was paid from.

Parameters
opobject to buy.
plplayer buying.
Returns
1 if object was bought, 0 else.
Todo:
check if pl is a player, as query_money() expects a player.

Definition at line 529 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().

Here is the call graph for this function:

Here is the caller graph for this function:

uint64_t price_approx ( const object obj,
object who 
)

Adjust the value of the given item based on the player's skills.

This function should only be used when calculating "you reckon" prices.

Parameters
objitem in question. Must not be NULL.
whoplayer trying to judge the value of the item. Must not be NULL.
Returns
approximate value of tmp.

Definition at line 107 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().

Here is the call graph for this function:

Here is the caller graph for this function:

uint64_t price_base ( const object obj)

Determine the base (intrinsic) value of an item.

This should not include adjustments such as bargaining, charisma, or shop specialization.

Parameters
objitem in question.
Returns
base price.

Definition at line 66 of file shop.c.

References obj::arch, archt::clone, FLAG_CURSED, FLAG_DAMNED, liv::food, GEM, obj::magic, MONEY, obj::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().

Here is the call graph for this function:

Here is the caller graph for this function:

uint64_t query_money ( const object op)

Determine the amount of money the given object contains, including what is inside containers.

Parameters
opPlayer or container object
Returns
Total amount of money inside

Definition at line 459 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().

Here is the call graph for this function:

Here is the caller graph for this function:

void sell_item ( object op,
object pl 
)

Player is selling an item.

Give money, print appropriate messages.

This function uses the coins[] array to know what coins are available.

Modified to fill available race: gold containers before dumping remaining coins in character's inventory.

Parameters
opobject to sell.
plplayer. Shouldn't be NULL or non player.

Definition at line 921 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().

Here is the call graph for this function:

Here is the caller graph for this function:

double shop_approval ( const mapstruct map,
const object player 
)

Return the approval ratio for a shop for a given player.

This is based on both the race of the shopkeeper and the player.

Parameters
mapMap with a shop
playerPlayer in question
Returns
Approval ratio between 0 and 1

Definition at line 1078 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().

Here is the caller graph for this function:

bool shop_contains ( object ob)

Check if an object is in a shop.

Definition at line 1239 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().

Here is the call graph for this function:

Here is the caller graph for this function:

int shop_describe ( const object op)

Give the player a description of the shop on their current map.

This is used for the bargaining skill.

Parameters
opNon-null player to describe the shop to
Returns
Zero if the object is not a player, 1 otherwise

Definition at line 1137 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().

Here is the call graph for this function:

Here is the caller graph for this function:

int shop_pay_unpaid ( object pl,
object op 
)

Pay for each unpaid item carried by a player, including those inside containers.

It is a good idea to call can_pay() before using this function, because items are paid for here in no particular order.

Parameters
plPlayer making purchase
opContainer to examine, usually the same player object
Return values
0Player still has unpaid items
1Player paid for all unpaid items

Definition at line 855 of file shop.c.

References obj::below, CLEAR_FLAG, cost_str(), draw_ext_info_format(), esrv_update_item(), 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(), SET_FLAG, shop_price_buy(), obj::type, UPD_FLAGS, and UPD_NAME.

Referenced by shop_mat_type_move_on().

Here is the call graph for this function:

Here is the caller graph for this function:

uint64_t shop_price_buy ( const object obj,
object who 
)

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.

Parameters
objitem in question. Must not be NULL.
whoplayer trying to judge the value of the item. Must not be NULL.
Returns
value of tmp.

Definition at line 171 of file shop.c.

References liv::Cha, find_skill_by_number(), 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().

Here is the call graph for this function:

Here is the caller graph for this function:

uint64_t shop_price_sell ( const object obj,
object who 
)

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.

Parameters
objitem in question. Must not be NULL.
whoplayer trying to judge the value of the item. Must not be NULL.
Returns
value of tmp.

Definition at line 224 of file shop.c.

References obj::arch, FLAG_BEEN_APPLIED, FLAG_IDENTIFIED, GEM, obj::map, need_identify(), obj::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().

Here is the call graph for this function:

Here is the caller graph for this function: