version 1.76 | | version 1.77 |
---|
| | |
/* | | /* |
* static char *rcsid_living_c = | | * static char *rcsid_living_c = |
* "$Id: living.c,v 1.76 2006/02/09 00:48:36 akirschbaum Exp $"; | | * "$Id: living.c,v 1.77 2006/03/07 18:46:23 cavesomething Exp $"; |
*/ | | */ |
| | |
/* | | /* |
| | |
{ | | { |
int p_exp_min; | | int p_exp_min; |
| | |
/* Ensure that our permanent experience minimum is met. */ | | /* Ensure that our permanent experience minimum is met. |
p_exp_min = (int)(PERM_EXP_MINIMUM_RATIO * (float)(op->stats.exp)); | | * permenent_exp_ratio is an integer percentage, we divide by 100 |
| | * to get the fraction */ |
| | p_exp_min = (int)(settings.permanent_exp_ratio * (float)(op->stats.exp)/100); |
| | |
if (op->perm_exp < p_exp_min) | | if (op->perm_exp < p_exp_min) |
op->perm_exp = p_exp_min; | | op->perm_exp = p_exp_min; |
| | |
if (exp_to_add > limit) exp_to_add=limit; | | if (exp_to_add > limit) exp_to_add=limit; |
| | |
ADD_EXP(op->stats.exp, (float) exp_to_add * (skill_obj? skill_obj->expmul:1)); | | ADD_EXP(op->stats.exp, (float) exp_to_add * (skill_obj? skill_obj->expmul:1)); |
if (settings.use_permanent_experience) { | | if (settings.permanent_exp_ratio) { |
ADD_EXP(op->perm_exp, (float) exp_to_add * PERM_EXP_GAIN_RATIO * (skill_obj? skill_obj->expmul:1)); | | ADD_EXP(op->perm_exp, (float) exp_to_add * PERM_EXP_GAIN_RATIO * (skill_obj? skill_obj->expmul:1)); |
calc_perm_exp(op); | | calc_perm_exp(op); |
} | | } |
| | |
limit=(levels[skill_obj->level+1]-levels[skill_obj->level])/2; | | limit=(levels[skill_obj->level+1]-levels[skill_obj->level])/2; |
if (exp_to_add > limit) exp_to_add=limit; | | if (exp_to_add > limit) exp_to_add=limit; |
ADD_EXP(skill_obj->stats.exp, exp_to_add); | | ADD_EXP(skill_obj->stats.exp, exp_to_add); |
if (settings.use_permanent_experience) { | | if (settings.permanent_exp_ratio) { |
skill_obj->perm_exp += exp_to_add * PERM_EXP_GAIN_RATIO; | | skill_obj->perm_exp += exp_to_add * PERM_EXP_GAIN_RATIO; |
calc_perm_exp(skill_obj); | | calc_perm_exp(skill_obj); |
} | | } |
| | |
sint64 del_exp; | | sint64 del_exp; |
| | |
if (exp > op->stats.exp) exp = op->stats.exp; | | if (exp > op->stats.exp) exp = op->stats.exp; |
if (settings.use_permanent_experience) { | | if (settings.permanent_exp_ratio) { |
del_exp = (op->stats.exp - op->perm_exp) * PERM_EXP_MAX_LOSS_RATIO; | | del_exp = (op->stats.exp - op->perm_exp) * PERM_EXP_MAX_LOSS_RATIO; |
if (del_exp < 0) del_exp = 0; | | if (del_exp < 0) del_exp = 0; |
if (exp > del_exp) exp=del_exp; | | if (exp > del_exp) exp=del_exp; |
| | |
} | | } |
} | | } |
| | |
/* Applies a death penalty experience. 20% or 3 levels, whichever is | | /* Applies a death penalty experience, the size of this is defined by the |
* less experience lost. | | * settings death_penalty_percentage and death_penalty_levels, and by the |
| | * amount of permenent experience, whichever gives the lowest loss. |
*/ | | */ |
| | |
void apply_death_exp_penalty(object *op) { | | void apply_death_exp_penalty(object *op) { |
object *tmp; | | object *tmp; |
sint64 loss; | | sint64 loss; |
sint64 loss_20p; /* 20 percent experience loss */ | | sint64 percentage_loss; /* defined by the setting 'death_penalty_percent' */ |
sint64 loss_3l; /* 3 level experience loss */ | | sint64 level_loss; /* defined by the setting 'death_penalty_levels */ |
| | |
for(tmp=op->inv;tmp;tmp=tmp->below) | | for(tmp=op->inv;tmp;tmp=tmp->below) |
if(tmp->type==SKILL && tmp->stats.exp) { | | if(tmp->type==SKILL && tmp->stats.exp) { |
| | |
loss_20p = tmp->stats.exp * 0.20; | | percentage_loss = tmp->stats.exp * settings.death_penalty_ratio/100; |
loss_3l = tmp->stats.exp - levels[MAX(0,tmp->level -3)]; | | level_loss = tmp->stats.exp - levels[MAX(0,tmp->level - settings.death_penalty_level)]; |
| | |
/* With the revised exp system, you can get cases where | | /* With the revised exp system, you can get cases where |
* losing 3 levels would still require that you have more | | * losing several levels would still require that you have more |
* exp than you current have - this is true if the levels | | * exp than you currently have - this is true if the levels |
* tables is a lot harder. | | * tables is a lot harder. |
*/ | | */ |
if (loss_3l < 0) loss_3l = 0; | | if (level_loss < 0) level_loss = 0; |
| | |
loss = check_exp_loss(tmp, MIN(loss_3l, loss_20p)); | | loss = check_exp_loss(tmp, MIN(level_loss, percentage_loss)); |
| | |
tmp->stats.exp -= loss; | | tmp->stats.exp -= loss; |
player_lvl_adj(op,tmp); | | player_lvl_adj(op,tmp); |
} | | } |
| | |
loss_20p = op->stats.exp * 0.20; | | percentage_loss = op->stats.exp * settings.death_penalty_ratio/100; |
loss_3l = op->stats.exp - levels[MAX(0,op->level -3)]; | | level_loss = op->stats.exp - levels[MAX(0,op->level - settings.death_penalty_level)]; |
if (loss_3l < 0) loss_3l = 0; | | if (level_loss < 0) level_loss = 0; |
loss = check_exp_loss(op, MIN(loss_3l, loss_20p)); | | loss = check_exp_loss(op, MIN(level_loss, percentage_loss)); |
| | |
op->stats.exp -= loss; | | op->stats.exp -= loss; |
player_lvl_adj(op,NULL); | | player_lvl_adj(op,NULL); |