Crossfire Server, Branches 1.12  R18729
living.c File Reference
#include <stdlib.h>
#include <global.h>
#include <sproto.h>
+ Include dependency graph for living.c:

Go to the source code of this file.

Macros

#define ADD_EXP(exptotal, exp)   {exptotal += exp; if (exptotal > MAX_EXPERIENCE) exptotal = MAX_EXPERIENCE; }
 
#define DIFF_MSG(flag, subtype1, subtype2, msg1, msg2)   draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_ATTRIBUTE, (flag>0)?subtype1:subtype2, (flag>0)?msg1:msg2, NULL);
 
#define MAX_EXP_IN_OBJ   levels[settings.max_level]/(MAX_EXP_CAT - 1)
 
#define MAX_EXPERIENCE   levels[settings.max_level]
 
#define MAX_SAVE_LEVEL   110
 

Functions

static void add_player_exp (object *op, sint64 exp, const char *skill_name, int flag)
 
void add_statbonus (object *op)
 
int allowed_class (const object *op)
 
void apply_death_exp_penalty (object *op)
 
void calc_perm_exp (object *op)
 
int change_abil (object *op, object *tmp)
 
void change_attr_value (living *stats, int attr, sint8 value)
 
void change_exp (object *op, sint64 exp, const char *skill_name, int flag)
 
void change_luck (object *op, int value)
 
sint64 check_exp_adjust (const object *op, sint64 exp)
 
sint64 check_exp_loss (const object *op, sint64 exp)
 
void check_stat_bounds (living *stats)
 
int did_make_save (const object *op, int level, int bonus)
 
void dragon_level_gain (object *who)
 
void drain_specific_stat (object *op, int deplete_stats)
 
void drain_stat (object *op)
 
void fix_object (object *op)
 
sint8 get_attr_value (const living *stats, int attr)
 
objectgive_skill_by_name (object *op, const char *skill_name)
 
sint64 level_exp (int level, double expmul)
 
void player_lvl_adj (object *who, object *op)
 
void remove_statbonus (object *op)
 
void set_attr_value (living *stats, int attr, sint8 value)
 
void set_dragon_name (object *pl, const object *abil, const object *skin)
 
void share_exp (object *op, sint64 exp, const char *skill, int flag)
 
static void subtract_player_exp (object *op, sint64 exp, const char *skill, int flag)
 

Variables

const char *const attacks [NROFATTACKS]
 
const float cha_bonus [MAX_STAT+1]
 
const int cleric_chance [MAX_STAT+1]
 
static const int con_bonus [MAX_STAT+1]
 
const int dam_bonus [MAX_STAT+1]
 
const int dex_bonus [MAX_STAT+1]
 
static const char *const drain_msg [NUM_STATS]
 
const int fear_bonus [MAX_STAT+1]
 
const char *const gain_msg [NUM_STATS]
 
static const int grace_bonus [MAX_STAT+1]
 
const int learn_spell [MAX_STAT+1]
 
sint64 * levels
 
const char *const lose_msg [NUM_STATS]
 
const int max_carry [MAX_STAT+1]
 
const char *const restore_msg [NUM_STATS]
 
static const int savethrow [MAX_SAVE_LEVEL+1]
 
const char *const short_stat_name [NUM_STATS]
 
static const int sp_bonus [MAX_STAT+1]
 
const float speed_bonus [MAX_STAT+1]
 
const char *const statname [NUM_STATS]
 
const int thaco_bonus [MAX_STAT+1]
 
const int turn_bonus [MAX_STAT+1]
 
const uint32 weight_limit [MAX_STAT+1]
 

Detailed Description

Functions related to attributes, weight, experience, which concern only living things.

Todo:
make "stat"/"attr" coherent.

Definition in file living.c.

Macro Definition Documentation

#define ADD_EXP (   exptotal,
  exp 
)    {exptotal += exp; if (exptotal > MAX_EXPERIENCE) exptotal = MAX_EXPERIENCE; }

Handy little macro that adds exp and keeps it within bounds. Since we are now using 64 bit values, I'm not all concerned about overflow issues with exptotal wrapping. exptotal is typically op->exp, or op->perm_exp

Definition at line 46 of file living.c.

Referenced by add_player_exp().

#define DIFF_MSG (   flag,
  subtype1,
  subtype2,
  msg1,
  msg2 
)    draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_ATTRIBUTE, (flag>0)?subtype1:subtype2, (flag>0)?msg1:msg2, NULL);

Rather than having a whole bunch of if (flag) draw.. else _draw, make this macro to clean those up. Not usuable outside change_abil function since some of the values passed to draw_ext_info are hardcoded.

Definition at line 418 of file living.c.

Referenced by change_abil().

#define MAX_EXP_IN_OBJ   levels[settings.max_level]/(MAX_EXP_CAT - 1)

Because exp_obj sum to make the total score, we cannot allow that sum to exceed the maximum amount of experience a player can gain. Thus we define MAX_EXP_IN_OBJ. It is important to try to make the value of MAX_EXP_CAT close to the actual number of experience objects in the game, otherwise the maximum level in any experience category could be quite low. To help the situation out a little I added 10 more levels, and jacked up the last level experience value. Its out of line with progression of previous levels, so if more levels are desired, this should be fixed. -b.t.

Definition at line 195 of file living.c.

#define MAX_EXPERIENCE   levels[settings.max_level]

Since this is nowhere defined ... Both come in handy at least in function add_exp()

Definition at line 178 of file living.c.

Referenced by calc_perm_exp(), change_exp(), and check_exp_adjust().

#define MAX_SAVE_LEVEL   110

Definition at line 199 of file living.c.

Referenced by did_make_save().

Function Documentation

static void add_player_exp ( object op,
sint64  exp,
const char *  skill_name,
int  flag 
)
static

Add experience to a player - exp should only be positive. Updates permanent exp for the skill we are adding to.

Parameters
opobject we add exp to.
expexperience to gain. Can be 0, but not that useful to call in that case...
skill_nameskill to add exp to. Can be NULL, in which case exp increases the players general total, but not any particular skill.
flagwhat to do if the player doesn't have the skill. Combination of SK_EXP_xxx flags.

Definition at line 1837 of file living.c.

References ADD_EXP, pl::braced, calc_perm_exp(), obj::chosen_skill, obj::contr, liv::exp, obj::expmul, give_skill_by_name(), pl::last_skill_ob, obj::level, levels, NUM_SKILLS, obj::perm_exp, PERM_EXP_GAIN_RATIO, Settings::permanent_exp_ratio, player_lvl_adj(), settings, SK_EXP_ADD_SKILL, SK_EXP_NONE, SKILL, obj::skill, obj::stats, and obj::type.

Referenced by change_exp().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void add_statbonus ( object op)

Adds stat-bonuses given by the class which the player has chosen.

Parameters
opobject which must be a player with contr not NULL.

Definition at line 863 of file living.c.

References obj::arch, liv::Cha, archt::clone, liv::Con, obj::contr, liv::Dex, liv::Int, pl::orig_stats, liv::Pow, obj::stats, liv::Str, and liv::Wis.

Referenced by key_change_class(), and key_roll_stat().

+ Here is the caller graph for this function:

int allowed_class ( const object op)

Returns true if the given player is a legal class. The function to add and remove class-bonuses to the stats doesn't check if the stat becomes negative, thus this function merely checks that all stats are 1 or more, and returns false otherwise.

Parameters
opobject to check.
Returns
1 if allowed, 0 else.

Definition at line 1543 of file living.c.

References liv::Cha, liv::Con, liv::Dex, liv::Int, liv::Pow, obj::stats, liv::Str, and liv::Wis.

Referenced by key_change_class().

+ Here is the caller graph for this function:

void apply_death_exp_penalty ( object op)

Applies a death penalty experience, the size of this is defined by the settings death_penalty_percentage and death_penalty_levels, and by the amount of permenent experience, whichever gives the lowest loss.

Parameters
opvictim of the penalty. Must not be NULL.

Definition at line 2073 of file living.c.

References obj::below, check_exp_loss(), Settings::death_penalty_level, Settings::death_penalty_ratio, liv::exp, obj::inv, obj::level, levels, MAX, MIN, player_lvl_adj(), settings, SKILL, obj::stats, and obj::type.

Referenced by kill_player().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void calc_perm_exp ( object op)

Ensure that the permanent experience requirements in an exp object are met. This really just checks 'op to make sure the perm_exp value is within proper range. Note that the checking of what is passed through has been reduced. Since there is now a proper field for perm_exp, this can now work on a much larger set of objects.

Parameters
opobject to check.

Definition at line 1804 of file living.c.

References liv::exp, MAX_EXPERIENCE, obj::perm_exp, Settings::permanent_exp_ratio, settings, and obj::stats.

Referenced by add_player_exp(), and command_addexp().

+ Here is the caller graph for this function:

int change_abil ( object op,
object tmp 
)

Permanently alters an object's stats/flags based on another object.

Returns
1 if we sucessfully changed a stat, 0 if nothing was changed.
Note
flag is set to 1 if we are applying the object, -1 if we are removing the object.
It is the calling functions responsibilty to check to see if the object can be applied or not. The main purpose of calling this function is the messages that are displayed - fix_object should really always be called after this when removing an object - that is because it is impossible to know if some object is the only source of an attacktype or spell attunement, so this function will clear the bits, but the player may still have some other object that gives them that ability.
Todo:
check logic, and things like that. Is the call to fix_object always required?

Definition at line 443 of file living.c.

References add_string(), obj::arch, AT_CONFUSION, ATNR_PHYSICAL, obj::attacktype, BOW, change_attr_value(), change_resist_msg, check_move_on(), check_stat_bounds(), CLEAR_FLAG, archt::clone, obj::contr, DIFF_MSG, pl::do_los, draw_ext_info(), draw_ext_info_format(), EXPERIENCE, fix_object(), FLAG_APPLIED, FLAG_BLIND, FLAG_LIFESAVE, FLAG_MAKE_INVIS, FLAG_REFL_MISSILE, FLAG_REFL_SPELL, FLAG_SEE_IN_DARK, FLAG_STEALTH, FLAG_UNDEAD, FLAG_WIZ, FLAG_XRAYS, liv::food, free_string(), gain_msg, get_attr_value(), liv::grace, liv::hp, lose_msg, liv::luck, MOVE_FLY_HIGH, MOVE_FLY_LOW, MOVE_SWIM, obj::move_type, MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_ATTACKTYPE_GAIN, MSG_TYPE_ATTRIBUTE_ATTACKTYPE_LOSS, MSG_TYPE_ATTRIBUTE_BAD_EFFECT_END, MSG_TYPE_ATTRIBUTE_BAD_EFFECT_START, MSG_TYPE_ATTRIBUTE_GOOD_EFFECT_END, MSG_TYPE_ATTRIBUTE_GOOD_EFFECT_START, MSG_TYPE_ATTRIBUTE_MOVE, MSG_TYPE_ATTRIBUTE_PROTECTION_GAIN, MSG_TYPE_ATTRIBUTE_PROTECTION_LOSS, MSG_TYPE_ATTRIBUTE_RACE, MSG_TYPE_ATTRIBUTE_STAT_GAIN, MSG_TYPE_ATTRIBUTE_STAT_LOSS, NDI_BLUE, NDI_UNIQUE, NROFATTACKS, NUM_STATS, pl::orig_stats, obj::path_attuned, obj::path_denied, obj::path_repelled, PLAYER, POTION, QUERY_FLAG, obj::race, obj::resist, set_attr_value(), SET_FLAG, SKILL, liv::sp, obj::stats, and obj::type.

Referenced by apply_special(), become_follower(), blind_living(), blindness_type_process(), cast_bless(), cast_change_ability(), cast_curse(), cfapi_object_change_abil(), eat_special_food(), potion_type_apply(), remove_force(), swap_random_stats(), and unapply_special().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void change_attr_value ( living stats,
int  attr,
sint8  value 
)

Like set_attr_value(), but instead the value (which can be negative) is added to the specified stat.

Parameters
statsitem to modify. Must not be NULL.
attrattribute to change.
valuedelta (can be positive).
Todo:
check if attr is valid? Checks result valus is valid?

Definition at line 336 of file living.c.

References CHA, liv::Cha, CON, liv::Con, DEX, liv::Dex, INT, liv::Int, llevError, LOG(), POW, liv::Pow, STR, liv::Str, WIS, and liv::Wis.

Referenced by add_abilities(), alchemy_failure_effect(), apply_changes_to_player(), change_abil(), drain_specific_stat(), fix_object(), and kill_player().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void change_exp ( object op,
sint64  exp,
const char *  skill_name,
int  flag 
)

Changes experience to a player/monster. This does bounds checking to make sure we don't overflow the max exp.

The exp passed is typically not modified much by this function - it is assumed the caller has modified the exp as needed. skill_name is the skill that should get the exp added. flag is what to do if player doesn't have the skill. these last two values are only used for players.

Parameters
opvictim to alter.
expexperience to gain (positive) or lose (negative).
skill_nameskill to change. Can be NULL.
flag
  • if experience gain, what to do if player doesn't have the skill
  • if experience loss, whether to remove from all skills or only specified skill
See Also
share_exp() for a party-aware version.

Definition at line 2015 of file living.c.

References add_player_exp(), liv::exp, FABS, FLAG_ALIVE, llevDebug, llevError, LOG(), MAX_BUF, MAX_EXPERIENCE, PLAYER, QUERY_FLAG, query_name(), obj::stats, subtract_player_exp(), and obj::type.

Referenced by attempt_do_alchemy(), book_type_apply(), cfapi_object_change_exp(), cure_disease(), do_harvest(), do_hidden_move(), do_skill(), god_examines_priest(), hit_with_one_attacktype(), pay_for_item(), peacemaker_type_process(), pray_at_altar(), scroll_type_apply(), sell_item(), share_exp(), and spellbook_type_apply().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void change_luck ( object op,
int  value 
)

Alter the object's luck.

Parameters
opobject to altar.
valuedelta to apply. 0 indicates timeout (moves luck towards 0), otherwise change the luck of the object via an applied bad_luck object in inventory.

Definition at line 791 of file living.c.

References arch_to_object(), FABS, find_archetype(), FLAG_APPLIED, insert_ob_in_ob(), llevError, LOG(), liv::luck, present_arch_in_ob(), SET_FLAG, and obj::stats.

Referenced by fix_luck(), and kill_object().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sint64 check_exp_adjust ( const object op,
sint64  exp 
)

Returns the maximum experience the object can gain or lose.

Parameters
opobject which will be the victim.
expexperience to gain or lose.
Returns
maximum value op can gain or lose (can be positive or negative).

Definition at line 1937 of file living.c.

References check_exp_loss(), liv::exp, MAX_EXPERIENCE, MIN, and obj::stats.

Referenced by command_addexp().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sint64 check_exp_loss ( const object op,
sint64  exp 
)

This function checks to make sure that object 'op' can lose 'exp' experience. It basically makes adjustments based on permanent exp and the like. This function should always be used for losing experience - the 'exp' value passed should be positive - this is the amount that should get subtract from the player.

Parameters
opobject to which to substract.
expexperience to lose.
Returns
the amount of exp object 'op' can in fact lose -

Definition at line 1915 of file living.c.

References liv::exp, obj::perm_exp, PERM_EXP_MAX_LOSS_RATIO, Settings::permanent_exp_ratio, settings, and obj::stats.

Referenced by apply_death_exp_penalty(), check_exp_adjust(), kill_object(), and subtract_player_exp().

+ Here is the caller graph for this function:

void check_stat_bounds ( living stats)

Ensures that all stats (str/dex/con/wis/cha/int) are within the 1-30 stat limit.

Parameters
statsattributes to check.

Definition at line 404 of file living.c.

References get_attr_value(), MAX_STAT, MIN_STAT, NUM_STATS, and set_attr_value().

Referenced by change_abil(), fix_object(), and kill_player().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int did_make_save ( const object op,
int  level,
int  bonus 
)

This function takes an object (monster/player, op), and determines if it makes a basic save throw by looking at the save_throw table.

Parameters
oppotential victim.
levelthe effective level to make the save at
bonusany plus/bonus (typically based on resistance to particular attacktype).
Returns
1 if op makes his save, 0 if he failed

Definition at line 2121 of file living.c.

References MAX_SAVE_LEVEL, PREFER_HIGH, random_roll(), and savethrow.

Referenced by flee_player(), hit_player(), hit_with_one_attacktype(), mood_change(), and polymorph_living().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void dragon_level_gain ( object who)

This function is called when a dragon-player gains an overall level. Here, the dragon might gain new abilities or change the ability-focus.

Parameters
whodragon's object.

Definition at line 1623 of file living.c.

References obj::arch, atnr_is_dragon_enabled(), obj::below, change_resist_msg, dragon_ability_gain(), draw_ext_info_format(), liv::exp, FORCE, obj::inv, obj::last_eat, obj::level, MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_RACE, archt::name, NDI_BLUE, NDI_UNIQUE, obj::resist, set_dragon_name(), obj::stats, and obj::type.

Referenced by player_lvl_adj().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void drain_specific_stat ( object op,
int  deplete_stats 
)

Drain a specified stat from op.

Parameters
opvictim to drain.
deplete_statsstatistic to drain.

Definition at line 760 of file living.c.

References ARCH_DEPLETION, arch_to_object(), change_attr_value(), drain_msg, draw_ext_info(), find_archetype(), fix_object(), FLAG_APPLIED, insert_ob_in_ob(), llevError, LOG(), MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_STAT_LOSS, NDI_UNIQUE, present_arch_in_ob(), SET_FLAG, and obj::stats.

Referenced by cfapi_object_drain(), drain_stat(), and write_scroll().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void drain_stat ( object op)

Drains a random stat from op. Stat draining by Vick 930307 (Feeling evil, I made it work as well now. -Frank 8)

Parameters
opobject to drain.

Definition at line 748 of file living.c.

References drain_specific_stat(), and NUM_STATS.

Referenced by hit_with_one_attacktype(), and potion_type_apply().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void fix_object ( object op)

Updates all abilities given by applied objects in the inventory of the given object.

This functions starts from base values (archetype or player object) and then adjusts them according to what the player/monster has equipped.

Note that a player always has stats reset to their initial value.

July 95 - inserted stuff to handle new skills/exp system - b.t. spell system split, grace points now added to system –peterm

November 2006: max armor speed is always taken into account, no exception.

Parameters
opobject to reset.
Todo:
this function is too long, and should be cleaned / split.

Definition at line 900 of file living.c.

References liv::ac, add_refcount(), AMULET, obj::arch, ARMOUR, ARMOUR_SPEED, AT_PHYSICAL, ATNR_PHYSICAL, obj::attacktype, obj::below, obj::body_info, obj::body_used, BOOTS, BOW, pl::braced, BRACERS, obj::carrying, change_attr_value(), check_stat_bounds(), obj::chosen_skill, CLEAR_FLAG, CLOAK, archt::clone, CLOSE_CON, liv::Con, con_bonus, CONTAINER, obj::contr, obj::current_weapon, liv::dam, dam_bonus, liv::Dex, dex_bonus, pl::digestion, DISEASE, pl::encumbrance, esrv_update_spells(), EXPERIENCE, FLAG_APPLIED, FLAG_BLIND, FLAG_LIFESAVE, FLAG_MAKE_INVIS, FLAG_READY_WEAPON, FLAG_REFL_MISSILE, FLAG_REFL_SPELL, FLAG_SEE_IN_DARK, FLAG_STEALTH, FLAG_UNDEAD, FLAG_USE_ARMOUR, FLAG_WIZ, FLAG_XRAYS, FORCE, free_string(), pl::gen_grace, pl::gen_hp, pl::gen_sp, pl::gen_sp_armour, get_attr_value(), GIRDLE, GLOVES, obj::glow_radius, grace_bonus, HELMET, HORN, liv::hp, liv::Int, obj::inv, obj::invisible, IS_COMBAT_SKILL, IS_GRACE_SKILL, IS_MANA_SKILL, pl::item_power, obj::level, pl::levgrace, pl::levhp, pl::levsp, llevDebug, LOG(), liv::luck, MAX, max_carry, Settings::max_level, liv::maxgrace, liv::maxhp, liv::maxsp, MOVE_FLY_HIGH, MOVE_FLY_LOW, obj::move_type, MOVE_WALK, obj::name, NROFATTACKS, NUM_BODY_LOCATIONS, NUM_STATS, pl::orig_stats, obj::path_attuned, obj::path_denied, obj::path_repelled, PLAYER, POTION, POTION_EFFECT, liv::Pow, QUERY_FLAG, range_bow, range_misc, range_skill, pl::ranges, obj::resist, RING, ROD, Settings::search_items, pl::search_str, set_attr_value(), SET_FLAG, settings, SHIELD, SK_PRAYING, SKILL, SKILL_TOOL, obj::slaying, liv::sp, sp_bonus, obj::speed, speed_bonus, Settings::spell_encumbrance, obj::stats, liv::Str, SYMPTOM, thaco_bonus, TRUE, obj::type, update_ob_speed(), WAND, liv::wc, WEAPON, pl::weapon_sp, WEAPON_SPEED, and liv::Wis.

Referenced by animate_weapon(), apply_special(), blind_living(), blindness_type_process(), cast_bless(), cast_curse(), cfapi_object_fix(), cfapi_object_set_property(), change_abil(), check_login(), command_abil(), command_brace(), command_dropall(), command_fix_me(), command_possess(), command_search_items(), do_skill(), do_symptoms(), do_turn(), dragon_eat_flesh(), drain_specific_stat(), drop_object(), eat_special_food(), fire_bow(), fix_weight(), god_intervention(), hit_with_one_attacktype(), improve_armour(), improve_weapon_stat(), insert_ob_in_ob(), key_change_class(), kill_player(), lighter_type_apply(), pay_for_amount(), pay_for_item(), pick_up_object(), player_changer_type_process(), player_lvl_adj(), poison_living(), poisoning_type_process(), potion_type_apply(), put_object_in_sack(), remove_force(), remove_ob(), remove_symptoms(), roll_stats(), save_life(), slow_living(), stop_jump(), swap_random_stats(), swap_stat(), and unapply_special().

+ Here is the call graph for this function:

sint8 get_attr_value ( const living stats,
int  attr 
)

Gets the value of a stat.

Parameters
statsitem from which to get stat.
attrattribute to get.
Returns
specified attribute, 0 if not found.
See Also
set_attr_value().

Definition at line 377 of file living.c.

References CHA, liv::Cha, CON, liv::Con, DEX, liv::Dex, INT, liv::Int, POW, liv::Pow, STR, liv::Str, WIS, and liv::Wis.

Referenced by add_abilities(), apply_changes_to_player(), calc_item_power(), cast_change_ability(), change_abil(), check_good_weapon(), check_stat_bounds(), describe_item(), eat_special_food(), fix_object(), god_intervention(), is_magical(), kill_player(), perceive_self(), potion_type_apply(), ring_desc(), set_ring_bonus(), swap_random_stats(), and swap_stat().

+ Here is the caller graph for this function:

object* give_skill_by_name ( object op,
const char *  skill_name 
)

Given the skill name skill_name, we find the skill archetype/object, set appropriate values, and insert it into the object (op) that is passed.

We return the skill - this makes it easier for calling functions that want to do something with it immediately.

Parameters
opobject to which to give the skill. Must not be NULL.
skill_nameskill to give. Must not be NULL.
Returns
newly created skill, or NULL if failure (logger with error level).
Note
this doesn't check whether the object already has the skill or not.

Definition at line 1689 of file living.c.

References arch_to_object(), CLEAR_FLAG, obj::contr, liv::exp, FLAG_CAN_USE_SKILL, get_archetype_by_skill_name(), insert_ob_in_ob(), pl::last_skill_exp, pl::last_skill_ob, obj::level, llevError, LOG(), SKILL, obj::stats, and obj::subtype.

Referenced by add_player_exp(), adjust_skill_tool(), become_follower(), cfapi_object_give_skill(), do_skill(), food_type_apply(), and learn_skill().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sint64 level_exp ( int  level,
double  expmul 
)

Returns how much experience is needed for a player to become the given level. level should really never exceed max_level

Parameters
levellevel player wants to reach
expmulpenality/bonus for experience.

Definition at line 1788 of file living.c.

References levels, Settings::max_level, and settings.

Referenced by calculate_difficulty(), command_statistics(), place_monsters(), player_lvl_adj(), and show_skills().

+ Here is the caller graph for this function:

void player_lvl_adj ( object who,
object op 
)

For the new exp system. we are concerned with whether the player gets more hp, sp and new levels. Note this this function should only be called for players. Monsters don't really gain levels

Will tell the player about changed levels.

Parameters
whoplayer
opwhat we are checking to gain the level (eg, skill)
Note
this function can call itself recursively to check for multiple levels.

Definition at line 1731 of file living.c.

References obj::contr, die_roll(), dragon_level_gain(), draw_ext_info(), draw_ext_info_format(), esrv_update_spells(), liv::exp, obj::expmul, fix_object(), is_dragon_pl(), obj::level, level_exp(), pl::levgrace, pl::levhp, pl::levsp, MAX_BUF, Settings::max_level, MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_LEVEL_GAIN, MSG_TYPE_ATTRIBUTE_LEVEL_LOSS, obj::name, NDI_RED, NDI_UNIQUE, PLAYER, player_lvl_adj(), PREFER_HIGH, settings, snprintf(), obj::stats, and obj::type.

Referenced by add_player_exp(), apply_death_exp_penalty(), command_addexp(), player_lvl_adj(), and subtract_player_exp().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void remove_statbonus ( object op)

Subtracts stat-bonuses given by the class which the player has chosen.

Parameters
opobject which must be a player with contr not NULL.

Definition at line 840 of file living.c.

References obj::arch, liv::Cha, archt::clone, liv::Con, obj::contr, liv::Dex, liv::Int, pl::orig_stats, liv::Pow, obj::stats, liv::Str, and liv::Wis.

Referenced by key_change_class().

+ Here is the caller graph for this function:

void set_attr_value ( living stats,
int  attr,
sint8  value 
)

Sets Str/Dex/con/Wis/Cha/Int/Pow in stats to value, depending on what attr is (STR to POW).

Parameters
statsitem to modify. Must not be NULL.
attrattribute to change.
valuenew value.
Todo:
check if attr is valid? Check whether value is valid or not.

Definition at line 296 of file living.c.

References CHA, liv::Cha, CON, liv::Con, DEX, liv::Dex, INT, liv::Int, POW, liv::Pow, STR, liv::Str, WIS, and liv::Wis.

Referenced by apply_changes_to_player(), cast_change_ability(), change_abil(), check_stat_bounds(), eat_special_food(), fix_object(), set_ring_bonus(), swap_random_stats(), and swap_stat().

+ Here is the caller graph for this function:

void set_dragon_name ( object pl,
const object abil,
const object skin 
)

Set the new dragon name after gaining levels or changing ability focus (later this can be extended to eventually change the player's face and animation)

Note that the title is written to 'own_title' in the player struct. This should be changed to 'ext_title' as soon as clients support this! Please, anyone, write support for 'ext_title'.

Parameters
plplayer's object to change.
abildragon's innate abilities.
skindragon's skin.

Definition at line 1566 of file living.c.

References atnr_is_dragon_enabled(), attacks, obj::contr, liv::exp, NROFATTACKS, pl::own_title, obj::resist, snprintf(), obj::stats, and pl::title.

Referenced by check_login(), and dragon_level_gain().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void share_exp ( object op,
sint64  exp,
const char *  skill,
int  flag 
)

Gives experience to a player/monster, sharing it with party if applicable. This does bounds checking to make sure we don't overflow the max exp.

The exp passed is typically not modified much by this function - it is assumed the caller has modified the exp as needed.

This is merely a wrapper for change_exp().

Parameters
opvictim to alter.
expexperience to gain (positive) or lose (negative).
skillskill to change. Can be NULL.
flag
  • if experience gain, what to do if player doesn't have the skill
  • if experience loss, whether to remove from all skills or only specified skill
Note
flag only applies to op, not other players in same party.

Definition at line 2150 of file living.c.

References change_exp(), obj::contr, first_player, obj::level, pl::next, pl::ob, on_same_map(), pl::party, PLAYER, SK_EXP_TOTAL, and obj::type.

Referenced by kill_object(), and mood_change().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void subtract_player_exp ( object op,
sint64  exp,
const char *  skill,
int  flag 
)
static

Subtracts experience from player.

Eg, if we figure the player is losing 10% of his total exp, what happens is he loses 10% from all his skills. Note that if permanent exp is used, player may not in fact lose as much as listed. Eg, if player has gotten reduced to the point where everything is at the minimum perm exp, he would lose nothing.

Parameters
opvictim we want to substract from
expvalue to substract. Should be positive.
skillskill to substract exp from. Can be NULL.
flagif SK_SUBTRACT_SKILL_EXP and skill is set, only subtract from the matching skill. Otherwise, this subtracts a portion from all skills the player has.
Todo:
check whether flag is necessary, can't it be only based on skill==null?

Definition at line 1965 of file living.c.

References obj::below, check_exp_loss(), liv::exp, obj::inv, player_lvl_adj(), SK_SUBTRACT_SKILL_EXP, SKILL, obj::skill, obj::stats, and obj::type.

Referenced by change_exp().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Variable Documentation

const char* const attacks[NROFATTACKS]
Initial value:
= {
"physical", "magical", "fire", "electricity", "cold", "confusion",
"acid", "drain", "weaponmagic", "ghosthit", "poison", "slow",
"paralyze", "turn undead", "fear", "cancellation", "depletion", "death",
"chaos","counterspell","god power","holy power","blinding", "",
"life stealing"
}

Attack type names.

Definition at line 220 of file living.c.

Referenced by did_make_save_item(), and set_dragon_name().

const float cha_bonus[MAX_STAT+1]
Initial value:
={
10.0, 10.0, 9.0, 8.0, 7.0, 6.0,
5.0, 4.5, 4.0, 3.5, 3.0,
2.9, 2.8, 2.7, 2.6, 2.5,
2.4, 2.3, 2.2, 2.1, 2.0,
1.95, 1.90, 1.85, 1.80, 1.75,
1.70, 1.65, 1.60, 1.55, 1.50
}

Charisma bonus.

Note
0.92.7 Changed way charisma works. Values now represent how much more it costs to buy something than to sell it (10, a value of 10 means it is that if it costs 50 gp to buy, you would only get 5 gp when you sell.) Let query_cost do the calculations on how to really do this. Buy keeping it this simple number, it is much easier to know how things will be influenced. A value of '1' means buying and selling is both the same value - any value less than or equal to 1 should not be used. At least as of now, the only place that uses this code is query_cost, in server/shop.c. This bonus is split evenly between buying and selling (ie, if the bonus is 2.0, then items are bought for 1.33 list, and sold at .667 This is figured by diff=(y-1)/(1+y), and for buy, it is 1+diff, for sell it is 1-diff

Definition at line 94 of file living.c.

Referenced by query_cost().

const int cleric_chance[MAX_STAT+1]
Initial value:
={
100,100,100,100,90,80,70,60,50,40,35,30,25,20,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0
}

Probability of messing a divine spell. Based on wisdom.

Definition at line 160 of file living.c.

Referenced by cast_spell().

const int con_bonus[MAX_STAT+1]
static
Initial value:
={
-6,-5,-4,-3,-2,-1,-1,0,0,0,0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,
22,25,30,40,50
}

Constitution bonus

Definition at line 51 of file living.c.

Referenced by fix_object().

const int dam_bonus[MAX_STAT+1]
Initial value:
={
-2,-2,-2,-1,-1,-1,0,0,0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6,7,8,10,15
}

dam_bonus, thaco_bonus, max_carry, weight limit all are based on strength.

Definition at line 119 of file living.c.

Referenced by do_throw(), fire_bow(), and fix_object().

const int dex_bonus[MAX_STAT+1]
Initial value:
={
-4,-3,-2,-2,-1,-1,-1,0,0,0,0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,6,6,7
}

Dexterity bonus

Definition at line 104 of file living.c.

Referenced by do_throw(), fire_bow(), and fix_object().

const char* const drain_msg[NUM_STATS]
static
Initial value:
= {
"Oh no! You are weakened!",
"You're feeling clumsy!",
"You feel less healthy",
"You suddenly begin to lose your memory!",
"Your face gets distorted!",
"Watch out, your mind is going!",
"Your spirit feels drained!"
}

Message when a player is drained of a stat.

Definition at line 229 of file living.c.

Referenced by drain_specific_stat().

const int fear_bonus[MAX_STAT+1]
Initial value:
={
3,3,3,3,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}

Bonus for fear resistance for players.

Definition at line 170 of file living.c.

Referenced by cast_cone().

const char* const gain_msg[NUM_STATS]
Initial value:
= {
"You feel stronger.",
"You feel more agile.",
"You feel healthy.",
"You feel wiser.",
"You seem to look better.",
"You feel smarter.",
"You feel more potent."
}

Message when a player increases permanently a stat.

Definition at line 251 of file living.c.

Referenced by change_abil().

const int grace_bonus[MAX_STAT+1]
static
Initial value:
= {
-10,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,12,15,20,25,
30,40,50,70,100
}

Grace bonus

Definition at line 70 of file living.c.

Referenced by fix_object().

const int learn_spell[MAX_STAT+1]
Initial value:
={
0,0,0,1,2,4,8,12,16,25,36,45,55,65,70,75,80,85,90,95,100,100,100,100,100,
100,100,100,100,100,100
}

Probability to learn a spell or skill, based on intelligence or wisdom.

Definition at line 154 of file living.c.

Referenced by learn_skill(), and spellbook_type_apply().

sint64* levels

Number of levels for which we have experience.

Definition at line 39 of file exp.c.

Referenced by add_player_exp(), apply_death_exp_penalty(), dump_experience(), free_experience(), init_experience(), level_exp(), and send_exp_table().

const char* const lose_msg[NUM_STATS]
Initial value:
= {
"You feel weaker!",
"You feel clumsy!",
"You feel less healthy!",
"You lose some of your memory!",
"You look ugly!",
"You feel stupid!",
"You feel less potent!"
}

Message when a player decreases permanently a stat.

Definition at line 262 of file living.c.

Referenced by change_abil(), and kill_player().

const int max_carry[MAX_STAT+1]
Initial value:
={
2,4,7,11,16,22,29,37,46,56,67,79,92,106,121,137,154,172,191,211,232,254,277,
301,326,352,400,450,500,600,1000
}

Definition at line 129 of file living.c.

Referenced by do_throw(), and fix_object().

const char* const restore_msg[NUM_STATS]
Initial value:
= {
"You feel your strength return.",
"You feel your agility return.",
"You feel your health return.",
"You feel your wisdom return.",
"You feel your charisma return.",
"You feel your memory return.",
"You feel your spirits return."
}

Message when a player has a stat restored.

Definition at line 240 of file living.c.

Referenced by god_intervention(), and potion_type_apply().

const int savethrow[MAX_SAVE_LEVEL+1]
static
Initial value:
={
18,
18,17,16,15,14,14,13,13,12,12,12,11,11,11,11,10,10,10,10, 9,
9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6,
6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
}

Probability to avoid something.

This no longer needs to be changed anytime the number of levels is increased - rather, did_make_save() will do the right thing and always use range within this table. for safety, savethrow should not be accessed directly anymore, and instead did_make_save() should be used instead.

Definition at line 209 of file living.c.

Referenced by did_make_save().

const char* const short_stat_name[NUM_STATS]
Initial value:
= {
"Str", "Dex", "Con", "Wis", "Cha", "Int","Pow"
}

Short name of stats.

Definition at line 278 of file living.c.

Referenced by describe_item(), key_roll_stat(), ring_desc(), and swap_stat().

const int sp_bonus[MAX_STAT+1]
static
Initial value:
={
-10,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,12,15,20,25,
30,40,50,70,100
}

Spell point bonus. Changed the name of this to "sp_bonus" from "int_bonus" because Pow can now be the stat that controls spellpoint advancement. -b.t.

Definition at line 62 of file living.c.

Referenced by fix_object().

const float speed_bonus[MAX_STAT+1]
Initial value:
={
-0.4, -0.4, -0.3, -0.3, -0.2, -0.2, -0.2, -0.1, -0.1, -0.1, -0.05, 0, 0, 0,
0.05, 0.1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.4,
1.6, 1.8, 2.0, 2.5, 3.0
}

speed_bonus, which uses dex as its stat

Definition at line 109 of file living.c.

Referenced by do_throw(), and fix_object().

const char* const statname[NUM_STATS]
Initial value:
= {
"strength", "dexterity", "constitution", "wisdom", "charisma", "intelligence","power"
}

Name of stats.

Definition at line 273 of file living.c.

Referenced by perceive_self().

const int thaco_bonus[MAX_STAT+1]
Initial value:
={
-2,-2,-1,-1,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,5,5,6,7,8,10
}

THAC0 bonus

Definition at line 124 of file living.c.

Referenced by do_throw(), fire_bow(), and fix_object().

const int turn_bonus[MAX_STAT+1]
Initial value:
={
-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,1,1,1,2,2,2,3,3,3,4,4,5,5,6,7,8,9,10,12,15
}

Bonus for spell duration (holyword and turn undead), bonus for resistance to these spells.

Definition at line 165 of file living.c.

Referenced by cast_cone(), and hit_with_one_attacktype().

const uint32 weight_limit[MAX_STAT+1]
Initial value:
= {
200000,
250000,300000,350000,400000,500000,
600000,700000,800000,900000,1000000,
1100000,1200000,1300000,1400000,1500000,
1650000,1800000,1950000,2100000,2250000,
2400000,2550000,2700000,2850000,3000000,
3250000,3500000,3750000,4000000,4500000
}

The absolute most a character can carry - a character can't pick stuff up if it would put him above this limit.

Value is in grams, so we don't need to do conversion later

These limits are probably overly generous, but being there were no values before, you need to start someplace.

Definition at line 143 of file living.c.

Referenced by do_throw(), esrv_update_stats(), pick_up_object(), and sell_item().