Crossfire Server, Trunk  R20513
Macros | Functions | Variables
living.c File Reference

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

#include "global.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "sproto.h"
#include "living.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; }
 Handy little macro that adds exp and keeps it within bounds. More...
 
#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);
 Rather than having a whole bunch of if (flag) draw. More...
 
#define FLOAT_CON_BONUS   0
 This is basically same as above, but for bonuses in which we store the value as a float. More...
 
#define FLOAT_DEX_BONUS   1
 
#define FLOAT_GRACE_BONUS   3
 
#define FLOAT_SP_BONUS   2
 
#define INT_CHA_BONUS   4
 
#define INT_CLERIC_CHANCE   2
 
#define INT_DAM_BONUS   6
 
#define INT_DEX_BONUS   5
 
#define INT_FEAR_BONUS   0
 The definitions below are indexes into the bonuses[] array. More...
 
#define INT_LEARN_SPELL   3
 
#define INT_THAC0_BONUS   7
 
#define INT_TURN_BONUS   1
 
#define INT_WEIGHT_LIMIT   8
 
#define MAX_EXPERIENCE   levels[settings.max_level]
 
#define MAX_SAVE_LEVEL   110
 
#define NUM_FLOAT_BONUSES   4
 
#define NUM_INT_BONUSES   9
 

Functions

static void add_player_exp (object *op, int64_t exp, const char *skill_name, int flag)
 Add experience to a player - exp should only be positive. More...
 
void add_statbonus (object *op)
 Adds stat-bonuses given by the class which the player has chosen. More...
 
int allowed_class (const object *op)
 Returns true if the given player is a legal class. More...
 
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. More...
 
void calc_perm_exp (object *op)
 Ensure that the permanent experience requirements in an exp object are met. More...
 
int change_abil (object *op, object *tmp)
 Permanently alters an object's stats/flags based on another object. More...
 
void change_attr_value (living *stats, int attr, int8_t value)
 Like set_attr_value(), but instead the value (which can be negative) is added to the specified stat. More...
 
void change_exp (object *op, int64_t exp, const char *skill_name, int flag)
 Changes experience to a player/monster. More...
 
void change_luck (object *op, int value)
 Alter the object's luck. More...
 
int64_t check_exp_adjust (const object *op, int64_t exp)
 Returns the maximum experience the object can gain or lose. More...
 
int64_t check_exp_loss (const object *op, int64_t exp)
 This function checks to make sure that object 'op' can lose 'exp' experience. More...
 
void check_stat_bounds (living *stats, int8_t min_stat, int8_t max_stat)
 Ensures that all stats (str/dex/con/wis/cha/int) are within the passed in range of min_stat and max_stat. More...
 
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. More...
 
static void dragon_level_gain (object *who)
 This function is called when a dragon-player gains an overall level. More...
 
void drain_specific_stat (object *op, int deplete_stats)
 Drain a specified stat from op. More...
 
void drain_stat (object *op)
 Drains a random stat from op. More...
 
void fix_object (object *op)
 Updates all abilities given by applied objects in the inventory of the given object. More...
 
static void fix_player (object *op, int *ac, int *wc, const object *grace_obj, const object *mana_obj, const object *wc_obj, int weapon_speed, float added_speed)
 Complement to fix_object() for player. More...
 
int8_t get_attr_value (const living *stats, int attr)
 Gets the value of a stat. More...
 
int get_cha_bonus (int stat)
 
int get_cleric_chance (int stat)
 
static float get_con_bonus (int stat)
 
int get_dam_bonus (int stat)
 
int get_dex_bonus (int stat)
 
int get_fear_bonus (int stat)
 
static float get_grace_bonus (int stat)
 
static size_t get_index (int stat, size_t max_index)
 Limits a stat value to [0..max_index]. More...
 
int get_learn_spell (int stat)
 
static float get_sp_bonus (int stat)
 
float get_speed_bonus (int stat)
 
int get_thaco_bonus (int stat)
 
int get_turn_bonus (int stat)
 
uint32_t get_weight_limit (int stat)
 
objectgive_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. More...
 
void init_stats (int reload)
 This loads statistic bonus/penalties from the stat_bonus file. More...
 
int64_t level_exp (int level, double expmul)
 Returns how much experience is needed for a player to become the given level. More...
 
static int load_table_float (float **bonuses, FILE *fp, char *bonus_name)
 This loads up a stat table from the file - basically, it keeps processing until it gets the closing brace. More...
 
static int load_table_int (int **bonuses, FILE *fp, char *bonus_name)
 This loads up a stat table from the file - basically, it keeps processing until it gets the closing brace. More...
 
void player_lvl_adj (object *who, object *op)
 For the new exp system. More...
 
int remove_depletion (object *op, int level)
 Remove depletion from op, if present, and warn player of such restorations. More...
 
void remove_statbonus (object *op)
 Subtracts stat-bonuses given by the class which the player has chosen. More...
 
void set_attr_value (living *stats, int attr, int8_t value)
 Sets Str/Dex/con/Wis/Cha/Int/Pow in stats to value, depending on what attr is (STR to POW). More...
 
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) More...
 
void share_exp (object *op, int64_t exp, const char *skill, int flag)
 Gives experience to a player/monster, sharing it with party if applicable. More...
 
static void subtract_player_exp (object *op, int64_t exp, const char *skill, int flag)
 Subtracts experience from player. More...
 

Variables

const char *const attacks [NROFATTACKS]
 Attack type names. More...
 
static const char *const drain_msg [NUM_STATS]
 Message when a player is drained of a stat. More...
 
static const char * float_bonus_names [NUM_FLOAT_BONUSES]
 
static float * float_bonuses [NUM_FLOAT_BONUSES]
 
const char *const gain_msg [NUM_STATS]
 Message when a player increases permanently a stat. More...
 
static const char * int_bonus_names [NUM_INT_BONUSES]
 Following array corresponds to the defines above, but are the text names as found in the file. More...
 
static int * int_bonuses [NUM_INT_BONUSES]
 
int64_tlevels
 Number of levels for which we have experience. More...
 
const char *const lose_msg [NUM_STATS]
 Message when a player decreases permanently a stat. More...
 
const char *const restore_msg [NUM_STATS]
 Message when a player has a stat restored. More...
 
static const int savethrow [MAX_SAVE_LEVEL+1]
 Probability to avoid something. More...
 
const char *const short_stat_name [NUM_STATS]
 Short name of stats. More...
 
const char *const statname [NUM_STATS]
 Name of stats. More...
 

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 42 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);

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 369 of file living.c.

Referenced by change_abil().

#define FLOAT_CON_BONUS   0

This is basically same as above, but for bonuses in which we store the value as a float.

Definition at line 85 of file living.c.

Referenced by get_con_bonus().

#define FLOAT_DEX_BONUS   1

Definition at line 86 of file living.c.

Referenced by get_speed_bonus().

#define FLOAT_GRACE_BONUS   3

Definition at line 88 of file living.c.

Referenced by get_grace_bonus().

#define FLOAT_SP_BONUS   2

Definition at line 87 of file living.c.

Referenced by get_sp_bonus().

#define INT_CHA_BONUS   4

Definition at line 62 of file living.c.

Referenced by get_cha_bonus().

#define INT_CLERIC_CHANCE   2

Definition at line 60 of file living.c.

Referenced by get_cleric_chance().

#define INT_DAM_BONUS   6

Definition at line 64 of file living.c.

Referenced by get_dam_bonus().

#define INT_DEX_BONUS   5

Definition at line 63 of file living.c.

Referenced by get_dex_bonus().

#define INT_FEAR_BONUS   0

The definitions below are indexes into the bonuses[] array.

Rather than have a bunch of different variables, it is easier to just have a single array - all access to these is done through the get_cha_...() function in any case - making it an array makes processing simpler.

The INT_ prefix is to note the type of array the bonus goes into (vs FLOAT) - it is unfortunately that it is also the name of one of the stats.

The NUM_BONUSES is how many bonuses they are (size of the array), so is equal to last value +1.

Definition at line 58 of file living.c.

Referenced by get_fear_bonus().

#define INT_LEARN_SPELL   3

Definition at line 61 of file living.c.

Referenced by get_learn_spell().

#define INT_THAC0_BONUS   7

Definition at line 65 of file living.c.

Referenced by get_thaco_bonus().

#define INT_TURN_BONUS   1

Definition at line 59 of file living.c.

Referenced by get_turn_bonus().

#define INT_WEIGHT_LIMIT   8

Definition at line 66 of file living.c.

Referenced by get_weight_limit().

#define MAX_EXPERIENCE   levels[settings.max_level]

Definition at line 99 of file living.c.

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

#define MAX_SAVE_LEVEL   110

Definition at line 103 of file living.c.

Referenced by did_make_save().

#define NUM_FLOAT_BONUSES   4

Definition at line 89 of file living.c.

Referenced by init_stats().

#define NUM_INT_BONUSES   9

Definition at line 67 of file living.c.

Referenced by init_stats().

Function Documentation

static void add_player_exp ( object op,
int64_t  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 1871 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, Settings::max_level, 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 apply_race_and_class(), 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 1602 of file living.c.

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

Referenced by apply_race_and_class(), and 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 2126 of file living.c.

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

Referenced by kill_player_not_permadeath().

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 1838 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 394 of file living.c.

References liv::ac, add_string(), obj::arch, AT_CONFUSION, ATNR_PHYSICAL, obj::attacktype, BOW, change_attr_value(), change_resist_msg, check_stat_bounds(), CLEAR_FLAG, archt::clone, obj::contr, DIFF_MSG, pl::do_los, draw_ext_info(), draw_ext_info_format(), liv::exp, 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, Settings::max_stat, MIN_STAT, 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, object_check_move_on(), 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, settings, SKILL, liv::sp, obj::stats, obj::type, and liv::wc.

Referenced by apply_special(), become_follower(), blind_living(), blindness_type_process(), cast_bless(), cast_change_ability(), cast_curse(), cfapi_object_change_abil(), create_aura(), 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,
int8_t  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 264 of file living.c.

References liv::Cha, CHARISMA, liv::Con, CONSTITUTION, liv::Dex, DEXTERITY, liv::Int, INTELLIGENCE, llevError, LOG(), liv::Pow, POWER, liv::Str, STRENGTH, liv::Wis, and WISDOM.

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

Here is the call graph for this function:

Here is the caller graph for this function:

void change_exp ( object op,
int64_t  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 2076 of file living.c.

References add_player_exp(), liv::exp, FABS, FLAG_ALIVE, llevError, LOG(), MAX_EXPERIENCE, PLAYER, QUERY_FLAG, 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(), examine(), 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_present_in_ob(), arch_to_object(), FABS, find_archetype(), FLAG_APPLIED, liv::luck, object_insert_in_ob(), RANDOM, 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:

int64_t check_exp_adjust ( const object op,
int64_t  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 1999 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:

int64_t check_exp_loss ( const object op,
int64_t  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 1974 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,
int8_t  min_stat,
int8_t  max_stat 
)

Ensures that all stats (str/dex/con/wis/cha/int) are within the passed in range of min_stat and max_stat.

Often, the caller will pass in MIN_STAT and MAX_STAT, but in case of force objects or temporary calculations, we want things outside the range (force objects may have negative stats, but we don't want them too negative)

Parameters
statsattributes to check.
min_statlowest the stat can be
max_stathighest the stat can be

Definition at line 354 of file living.c.

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

Referenced by change_abil(), do_symptoms(), fix_object(), fix_player(), and kill_player_not_permadeath().

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 2175 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:

static void dragon_level_gain ( object who)
static

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 1669 of file living.c.

References atnr_is_dragon_enabled(), change_resist_msg, dragon_ability_gain(), draw_ext_info_format(), liv::exp, FORCE, obj::last_eat, obj::level, MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_RACE, NDI_BLUE, NDI_UNIQUE, object_find_by_type_and_arch_name(), obj::resist, set_dragon_name(), and obj::stats.

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 724 of file living.c.

References ARCH_DEPLETION, arch_present_in_ob(), arch_to_object(), change_attr_value(), drain_msg, draw_ext_info(), find_archetype(), fix_object(), FLAG_APPLIED, MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_STAT_LOSS, NDI_UNIQUE, object_insert_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 712 of file living.c.

References drain_specific_stat(), NUM_STATS, and RANDOM.

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 1120 of file living.c.

References liv::ac, add_refcount(), AMULET, pl::applied_stats, obj::arch, ARCH_DEPLETION, ARMOUR, ARMOUR_SPEED, AT_PHYSICAL, ATNR_PHYSICAL, obj::attacktype, obj::body_info, obj::body_used, BOOTS, BOW, BRACERS, change_attr_value(), check_stat_bounds(), obj::chosen_skill, CLEAR_FLAG, CLOAK, archt::clone, CLOSE_CON, CONTAINER, obj::contr, obj::current_weapon, liv::dam, pl::digestion, DISEASE, pl::encumbrance, fix_player(), FLAG_APPLIED, FLAG_BLIND, FLAG_LIFESAVE, FLAG_MAKE_INVIS, FLAG_PROBE, FLAG_READY_WEAPON, FLAG_REFL_MISSILE, FLAG_REFL_SPELL, FLAG_SEE_IN_DARK, FLAG_STEALTH, FLAG_UNDEAD, FLAG_USE_ARMOUR, FLAG_WIZ, FLAG_XRAYS, FOR_INV_FINISH, FOR_INV_PREPARE, FORCE, free_string(), pl::gen_grace, pl::gen_hp, pl::gen_sp, pl::gen_sp_armour, get_attr_value(), GIRDLE, GLOVES, obj::glow_radius, HELMET, obj::invisible, IS_COMBAT_SKILL, IS_GRACE_SKILL, IS_MANA_SKILL, pl::item_power, obj::level, llevDebug, LOG(), liv::luck, MAX, Settings::max_level, Settings::max_stat, MOVE_FLY_HIGH, MOVE_FLY_LOW, obj::move_type, MOVE_WALK, obj::name, NROFATTACKS, NUM_BODY_LOCATIONS, NUM_STATS, object_update_speed(), pl::orig_stats, obj::path_attuned, obj::path_denied, obj::path_repelled, PLAYER, POTION, POTION_RESIST_EFFECT, QUERY_FLAG, range_bow, range_misc, range_skill, pl::ranges, obj::resist, RING, ROD, set_attr_value(), SET_FLAG, settings, SHIELD, SK_PRAYING, SKILL, SKILL_TOOL, obj::slaying, obj::speed, Settings::spell_encumbrance, obj::stats, SYMPTOM, TRUE, obj::type, WAND, liv::wc, WEAPON, and WEAPON_SPEED.

Referenced by animate_weapon(), apply_race_and_class(), apply_special(), blind_living(), blindness_type_process(), 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(), create_aura(), do_skill(), do_symptoms(), do_turn(), dragon_eat_flesh(), drain_specific_stat(), drop_object(), eat_special_food(), examine_monster(), fire_bow(), fix_weight(), god_intervention(), hit_with_one_attacktype(), improve_armour(), improve_weapon_stat(), key_change_class(), kill_player_not_permadeath(), lighter_type_apply(), monsterFight(), object_decrease_nrof(), object_insert_in_ob(), object_remove(), 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_depletion(), remove_force(), remove_symptoms(), roll_stats(), save_life(), slow_living(), START_TEST(), stop_jump(), swap_random_stats(), swap_stat(), and unapply_special().

Here is the call graph for this function:

static void fix_player ( object op,
int *  ac,
int *  wc,
const object grace_obj,
const object mana_obj,
const object wc_obj,
int  weapon_speed,
float  added_speed 
)
static

Complement to fix_object() for player.

Figure out the players sp/mana/hp totals. Also do encumberance and various speeds.

Parameters
opobject being fixed, must not be NULL.
accurrent ac, may be adjusted.
wccurrent wc, may be adjusted.
grace_objpraying skill, can be NULL.
mana_objspell-casting skill, can be NULL.
wc_objapplied combat skill, can be NULL.
weapon_speedcurrent weapon's speed.
added_speedspeed bonus from items.

Definition at line 892 of file living.c.

References obj::arch, obj::attacktype, BASE_WEAPON_SPEED, pl::braced, obj::carrying, check_stat_bounds(), archt::clone, liv::Con, obj::contr, liv::dam, liv::Dex, esrv_update_spells(), FREE_PLAYER_LOAD_PERCENT, get_con_bonus(), get_dam_bonus(), get_dex_bonus(), get_grace_bonus(), get_sp_bonus(), get_speed_bonus(), get_thaco_bonus(), get_weight_limit(), liv::hp, liv::Int, obj::level, pl::levgrace, pl::levhp, pl::levsp, MAX_PLAYER_SPEED, Settings::max_stat, liv::maxgrace, liv::maxhp, liv::maxsp, MIN_PLAYER_SPEED, MIN_STAT, object_get_value(), PLAYER, liv::Pow, Settings::search_items, pl::search_str, settings, liv::sp, obj::speed, obj::stats, liv::Str, obj::type, obj::weapon_speed, and liv::Wis.

Referenced by fix_object().

Here is the call graph for this function:

Here is the caller graph for this function:

int8_t get_attr_value ( const living stats,
int  attr 
)
int get_cha_bonus ( int  stat)

Definition at line 2243 of file living.c.

References get_index(), int_bonuses, INT_CHA_BONUS, Settings::max_stat, and settings.

Here is the call graph for this function:

int get_cleric_chance ( int  stat)

Definition at line 2263 of file living.c.

References get_index(), int_bonuses, INT_CLERIC_CHANCE, Settings::max_stat, and settings.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static float get_con_bonus ( int  stat)
static

Definition at line 2283 of file living.c.

References float_bonuses, FLOAT_CON_BONUS, get_index(), Settings::max_stat, and settings.

Referenced by fix_player().

Here is the call graph for this function:

Here is the caller graph for this function:

int get_dam_bonus ( int  stat)

Definition at line 2271 of file living.c.

References get_index(), int_bonuses, INT_DAM_BONUS, Settings::max_stat, and settings.

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

Here is the call graph for this function:

Here is the caller graph for this function:

int get_dex_bonus ( int  stat)

Definition at line 2247 of file living.c.

References get_index(), int_bonuses, INT_DEX_BONUS, Settings::max_stat, and settings.

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

Here is the call graph for this function:

Here is the caller graph for this function:

int get_fear_bonus ( int  stat)

Definition at line 2279 of file living.c.

References get_index(), int_bonuses, INT_FEAR_BONUS, Settings::max_stat, and settings.

Referenced by cast_cone().

Here is the call graph for this function:

Here is the caller graph for this function:

static float get_grace_bonus ( int  stat)
static

Definition at line 2291 of file living.c.

References float_bonuses, FLOAT_GRACE_BONUS, get_index(), Settings::max_stat, and settings.

Referenced by fix_player().

Here is the call graph for this function:

Here is the caller graph for this function:

static size_t get_index ( int  stat,
size_t  max_index 
)
static

Limits a stat value to [0..max_index].

Parameters
statindex of the stat to get.
max_indexthe maximum index (inclusive).
Returns
the limited index.

Definition at line 2303 of file living.c.

References MIN.

Referenced by get_cha_bonus(), get_cleric_chance(), get_con_bonus(), get_dam_bonus(), get_dex_bonus(), get_fear_bonus(), get_grace_bonus(), get_learn_spell(), get_sp_bonus(), get_speed_bonus(), get_thaco_bonus(), get_turn_bonus(), and get_weight_limit().

Here is the caller graph for this function:

int get_learn_spell ( int  stat)

Definition at line 2259 of file living.c.

References get_index(), int_bonuses, INT_LEARN_SPELL, Settings::max_stat, and settings.

Referenced by learn_skill(), and spellbook_type_apply().

Here is the call graph for this function:

Here is the caller graph for this function:

static float get_sp_bonus ( int  stat)
static

Definition at line 2287 of file living.c.

References float_bonuses, FLOAT_SP_BONUS, get_index(), Settings::max_stat, and settings.

Referenced by fix_player().

Here is the call graph for this function:

Here is the caller graph for this function:

float get_speed_bonus ( int  stat)

Definition at line 2275 of file living.c.

References float_bonuses, FLOAT_DEX_BONUS, get_index(), Settings::max_stat, and settings.

Referenced by do_throw(), and fix_player().

Here is the call graph for this function:

Here is the caller graph for this function:

int get_thaco_bonus ( int  stat)

Definition at line 2251 of file living.c.

References get_index(), int_bonuses, INT_THAC0_BONUS, Settings::max_stat, and settings.

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

Here is the call graph for this function:

Here is the caller graph for this function:

int get_turn_bonus ( int  stat)

Definition at line 2267 of file living.c.

References get_index(), int_bonuses, INT_TURN_BONUS, Settings::max_stat, and settings.

Referenced by cast_cone(), and hit_with_one_attacktype().

Here is the call graph for this function:

Here is the caller graph for this function:

uint32_t get_weight_limit ( int  stat)

Definition at line 2255 of file living.c.

References get_index(), int_bonuses, INT_WEIGHT_LIMIT, Settings::max_stat, and settings.

Referenced by do_harvest(), do_throw(), esrv_update_stats(), fix_player(), monster_check_pickup(), object_can_pick(), and pick_up_object().

Here is the call graph for this function:

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 1727 of file living.c.

References arch_to_object(), CLEAR_FLAG, obj::contr, liv::exp, FLAG_CAN_USE_SKILL, get_archetype_by_skill_name(), pl::last_skill_exp, pl::last_skill_ob, obj::level, llevError, LOG(), object_insert_in_ob(), 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:

void init_stats ( int  reload)

This loads statistic bonus/penalties from the stat_bonus file.

If reload is false (eg, this is initial start time load), then any error becomes fatal, as system needs working bonuses.

Parameters
reloadIf set, this is reloading new values - this can be useful for real time adjustment of stat bonuses - however, it also has some more restraints - in particular, max_stat can not decrease (that could be made to work but is more work) and also errors are not fatal - it will just use the old stat bonus tables in the case of any errors. TODO: add code that uses reload
Note
will call exit() if file is invalid or not found.

Definition at line 2487 of file living.c.

References Settings::confdir, float_bonus_names, float_bonuses, FREE_AND_CLEAR, int_bonus_names, int_bonuses, llevError, load_table_float(), load_table_int(), LOG(), MAX_BUF, Settings::max_stat, MIN_STAT, NUM_FLOAT_BONUSES, NUM_INT_BONUSES, settings, snprintf, and strncasecmp().

Referenced by cctk_init_std_archetypes(), and init_library().

Here is the call graph for this function:

Here is the caller graph for this function:

int64_t 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 1822 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:

static int load_table_float ( float **  bonuses,
FILE *  fp,
char *  bonus_name 
)
static

This loads up a stat table from the file - basically, it keeps processing until it gets the closing brace.

Parameters
bonusesan array will be allocated and the bonus put into this allocated array.
fpFile to load the data from.
bonus_nameUsed purely for error messages to make it easier to identify where in the file an error is.
Returns
0 on success, 1 on error. In general, the error will be too many or too few bonus values.

Definition at line 2407 of file living.c.

References llevError, LOG(), MAX_BUF, Settings::max_stat, and settings.

Referenced by init_stats().

Here is the call graph for this function:

Here is the caller graph for this function:

static int load_table_int ( int **  bonuses,
FILE *  fp,
char *  bonus_name 
)
static

This loads up a stat table from the file - basically, it keeps processing until it gets the closing brace.

Parameters
bonusesan array will be allocated and the bonus put into this allocated array.
fpFile to load the data from.
bonus_nameUsed purely for error messages to make it easier to identify where in the file an error is.
Returns
0 on success, 1 on error. In general, the error will be too many or too few bonus values.

Definition at line 2331 of file living.c.

References llevError, LOG(), MAX_BUF, Settings::max_stat, and settings.

Referenced by init_stats().

Here is the call graph for this function:

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, must not be NULL.
opwhat we are checking to gain the level (eg, skill), can be NULL.
Note
this function can call itself recursively to check for multiple levels.

Definition at line 1768 of file living.c.

References obj::contr, die_roll(), dragon_level_gain(), draw_ext_info(), 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:

int remove_depletion ( object op,
int  level 
)

Remove depletion from op, if present, and warn player of such restorations.

Parameters
opwho to remove depletion from.
levelmaximum depletion level to remove, if -1 no maximum.
Returns
0 if no depletion (or with no drained statistics) was present or level was insufficient, 1 if something was removed.

Definition at line 751 of file living.c.

References ARCH_DEPLETION, arch_present_in_ob(), draw_ext_info(), find_archetype(), fix_object(), get_attr_value(), MSG_TYPE_ATTRIBUTE, MSG_TYPE_ATTRIBUTE_STAT_GAIN, NDI_UNIQUE, NUM_STATS, object_free_drop_inventory(), object_remove(), restore_msg, and obj::stats.

Referenced by cfapi_object_remove_depletion(), and potion_type_apply().

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,
int8_t  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 218 of file living.c.

References liv::Cha, CHARISMA, liv::Con, CONSTITUTION, liv::Dex, DEXTERITY, liv::Int, INTELLIGENCE, liv::Pow, POWER, liv::Str, STRENGTH, liv::Wis, and WISDOM.

Referenced by apply_changes_to_player(), apply_race_and_class(), cast_change_ability(), change_abil(), check_race_and_class(), check_stat_bounds(), create_player_cmd(), do_symptoms(), 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 1629 of file living.c.

References atnr_is_dragon_enabled(), attacks, obj::contr, liv::exp, NROFATTACKS, player_set_dragon_title(), obj::resist, and obj::stats.

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,
int64_t  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 2205 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,
int64_t  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 2028 of file living.c.

References check_exp_loss(), liv::exp, FOR_INV_FINISH, FOR_INV_PREPARE, player_lvl_adj(), SK_SUBTRACT_SKILL_EXP, SKILL, and obj::stats.

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",
"disease"
}

Attack type names.

Definition at line 129 of file living.c.

Referenced by CREScriptEngine::CREScriptEngine(), describe_attacktype(), did_make_save_item(), and set_dragon_name().

const char* const drain_msg[NUM_STATS]
static
Initial value:
= {
"Oh no! You are weakened!",
"You're feeling clumsy!",
"Your health deteriorates!",
"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 139 of file living.c.

Referenced by drain_specific_stat().

const char* float_bonus_names[NUM_FLOAT_BONUSES]
static
Initial value:
= {
"con_hp_bonus", "dex_speed_bonus", "pow_int_sp_bonus", "wis_pow_grace_bonus"
}

Definition at line 91 of file living.c.

Referenced by init_stats().

float* float_bonuses[NUM_FLOAT_BONUSES]
static

Definition at line 90 of file living.c.

Referenced by get_con_bonus(), get_grace_bonus(), get_sp_bonus(), get_speed_bonus(), and init_stats().

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 161 of file living.c.

Referenced by change_abil().

const char* int_bonus_names[NUM_INT_BONUSES]
static
Initial value:
= {
"cha_fear_bonus", "wis_turn_bonus", "wis_cleric_chance", "int_wis_learn_spell",
"cha_shop_bonus", "dex_bonus", "str_damage_bonus", "str_hit_bonus",
"str_weight_limit",
}

Following array corresponds to the defines above, but are the text names as found in the file.

In this way, processing of file is simpler.

Definition at line 75 of file living.c.

Referenced by init_stats().

int* int_bonuses[NUM_INT_BONUSES]
static
int64_t* levels
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 172 of file living.c.

Referenced by change_abil(), and kill_player_not_permadeath().

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 150 of file living.c.

Referenced by god_intervention(), and remove_depletion().

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 113 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 194 of file living.c.

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

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

Name of stats.

Definition at line 183 of file living.c.

Referenced by perceive_self().