--- deliantra/server/common/living.C 2008/09/25 04:09:57 1.89 +++ deliantra/server/common/living.C 2008/12/18 19:56:09 1.93 @@ -1700,7 +1700,7 @@ static void add_player_exp (object *op, sint64 exp, const char *skill_name, int flag) { - object *skill_obj = NULL; + object *skill_obj; sint64 limit, exp_to_add; int i; @@ -1713,29 +1713,22 @@ * chosen_skill. This means we don't need to search through * the players inventory. */ + skill_obj = 0; + if (skill_name) { - if (op->chosen_skill && op->chosen_skill->type == SKILL && !strcmp (skill_name, op->chosen_skill->skill)) - skill_obj = op->chosen_skill; - else + skill_obj = op->contr->find_skill (skill_name); + + /* Player doesn't have the skill. Check to see what to do, and give + * it to the player if necessary + */ + if (!skill_obj) { - for (object *tmp = op->inv; tmp; tmp = tmp->below) - if (tmp->skill == skill_name && tmp->type == SKILL) - { - skill_obj = splay (tmp); - break; - } - - /* Player doesn't have the skill. Check to see what to do, and give - * it to the player if necessary - */ - if (!skill_obj) - { - if (flag == SK_EXP_NONE) - return; - else if (flag == SK_EXP_ADD_SKILL) - skill_obj = give_skill_by_name (op, skill_name); - } + if (flag == SK_EXP_NONE) + return; + + if (flag == SK_EXP_ADD_SKILL) + skill_obj = give_skill_by_name (op, skill_name); } } @@ -1778,7 +1771,7 @@ } /* This function checks to make sure that object 'op' can - * lost 'exp' experience. It returns the amount of exp + * lose 'exp' experience. It returns the amount of exp * object 'op' can in fact lose - it basically makes * adjustments based on permanent exp and the like. * This function should always be used for losing experience - @@ -1792,14 +1785,18 @@ if (exp > op->stats.exp) exp = op->stats.exp; + if (settings.permanent_exp_ratio) { del_exp = (sint64) ((op->stats.exp - op->perm_exp) * PERM_EXP_MAX_LOSS_RATIO); + if (del_exp < 0) del_exp = 0; + if (exp > del_exp) exp = del_exp; } + return exp; } @@ -1809,10 +1806,9 @@ if (exp < 0) return check_exp_loss (op, exp); else - return MIN (exp, (sint64) MAX_EXPERIENCE - op->stats.exp); + return min (exp, (sint64)MAX_EXPERIENCE - op->stats.exp); } - /* Subtracts experience from player. * if skill is set and flag == SK_SUBTRACT_SKILL_EXP, then we * only subtract from the matching skill. Otherwise, @@ -1835,7 +1831,7 @@ for (tmp = op->inv; tmp; tmp = tmp->below) if (tmp->type == SKILL && tmp->stats.exp) { - if (flag == SK_SUBTRACT_SKILL_EXP && skill && !strcmp (tmp->skill, skill)) + if (flag == SK_SUBTRACT_SKILL_EXP && skill && !strcmp (&tmp->skill, skill)) { del_exp = check_exp_loss (tmp, exp); tmp->stats.exp -= del_exp; @@ -1933,15 +1929,13 @@ void apply_death_exp_penalty (object *op) { - object *tmp; sint64 loss; sint64 percentage_loss; /* defined by the setting 'death_penalty_percent' */ sint64 level_loss; /* defined by the setting 'death_penalty_levels */ - for (tmp = op->inv; tmp; tmp = tmp->below) + for (object *tmp = op->inv; tmp; tmp = tmp->below) if (tmp->type == SKILL && tmp->stats.exp) { - percentage_loss = tmp->stats.exp * settings.death_penalty_ratio / 100; level_loss = tmp->stats.exp - levels[MAX (0, tmp->level - settings.death_penalty_level)]; @@ -1953,18 +1947,19 @@ if (level_loss < 0) level_loss = 0; - loss = check_exp_loss (tmp, MIN (level_loss, percentage_loss)); + loss = check_exp_loss (tmp, min (level_loss, percentage_loss)); tmp->stats.exp -= loss; player_lvl_adj (op, tmp); } percentage_loss = op->stats.exp * settings.death_penalty_ratio / 100; - level_loss = op->stats.exp - levels[MAX (0, op->level - settings.death_penalty_level)]; + level_loss = op->stats.exp - levels[max (0, op->level - settings.death_penalty_level)]; if (level_loss < 0) level_loss = 0; - loss = check_exp_loss (op, MIN (level_loss, percentage_loss)); + + loss = check_exp_loss (op, min (level_loss, percentage_loss)); op->stats.exp -= loss; player_lvl_adj (op, NULL);