ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/living.c
(Generate patch)

Comparing deliantra/server/common/living.c (file contents):
Revision 1.5 by elmex, Wed Feb 22 18:53:48 2006 UTC vs.
Revision 1.6 by elmex, Wed Mar 15 15:35:46 2006 UTC

1/* 1/*
2 * static char *rcsid_living_c = 2 * static char *rcsid_living_c =
3 * "$Id: living.c,v 1.5 2006/02/22 18:53:48 elmex Exp $"; 3 * "$Id: living.c,v 1.6 2006/03/15 15:35:46 elmex Exp $";
4 */ 4 */
5 5
6/* 6/*
7 CrossFire, A Multiplayer game for X-windows 7 CrossFire, A Multiplayer game for X-windows
8 8
1591 */ 1591 */
1592void calc_perm_exp(object *op) 1592void calc_perm_exp(object *op)
1593{ 1593{
1594 int p_exp_min; 1594 int p_exp_min;
1595 1595
1596 /* Ensure that our permanent experience minimum is met. */ 1596 /* Ensure that our permanent experience minimum is met.
1597 p_exp_min = (int)(PERM_EXP_MINIMUM_RATIO * (float)(op->stats.exp)); 1597 * permenent_exp_ratio is an integer percentage, we divide by 100
1598 * to get the fraction */
1599 p_exp_min = (int)(settings.permanent_exp_ratio * (float)(op->stats.exp)/100);
1598 1600
1599 if (op->perm_exp < p_exp_min) 1601 if (op->perm_exp < p_exp_min)
1600 op->perm_exp = p_exp_min; 1602 op->perm_exp = p_exp_min;
1601 1603
1602 /* Cap permanent experience. */ 1604 /* Cap permanent experience. */
1658 exp_to_add = exp; 1660 exp_to_add = exp;
1659 limit=(levels[op->level+1]-levels[op->level])/2; 1661 limit=(levels[op->level+1]-levels[op->level])/2;
1660 if (exp_to_add > limit) exp_to_add=limit; 1662 if (exp_to_add > limit) exp_to_add=limit;
1661 1663
1662 ADD_EXP(op->stats.exp, (float) exp_to_add * (skill_obj? skill_obj->expmul:1)); 1664 ADD_EXP(op->stats.exp, (float) exp_to_add * (skill_obj? skill_obj->expmul:1));
1663 if (settings.use_permanent_experience) { 1665 if (settings.permanent_exp_ratio) {
1664 ADD_EXP(op->perm_exp, (float) exp_to_add * PERM_EXP_GAIN_RATIO * (skill_obj? skill_obj->expmul:1)); 1666 ADD_EXP(op->perm_exp, (float) exp_to_add * PERM_EXP_GAIN_RATIO * (skill_obj? skill_obj->expmul:1));
1665 calc_perm_exp(op); 1667 calc_perm_exp(op);
1666 } 1668 }
1667 1669
1668 player_lvl_adj(op,NULL); 1670 player_lvl_adj(op,NULL);
1669 if (skill_obj) { 1671 if (skill_obj) {
1670 exp_to_add = exp; 1672 exp_to_add = exp;
1671 limit=(levels[skill_obj->level+1]-levels[skill_obj->level])/2; 1673 limit=(levels[skill_obj->level+1]-levels[skill_obj->level])/2;
1672 if (exp_to_add > limit) exp_to_add=limit; 1674 if (exp_to_add > limit) exp_to_add=limit;
1673 ADD_EXP(skill_obj->stats.exp, exp_to_add); 1675 ADD_EXP(skill_obj->stats.exp, exp_to_add);
1674 if (settings.use_permanent_experience) { 1676 if (settings.permanent_exp_ratio) {
1675 skill_obj->perm_exp += exp_to_add * PERM_EXP_GAIN_RATIO; 1677 skill_obj->perm_exp += exp_to_add * PERM_EXP_GAIN_RATIO;
1676 calc_perm_exp(skill_obj); 1678 calc_perm_exp(skill_obj);
1677 } 1679 }
1678 player_lvl_adj(op,skill_obj); 1680 player_lvl_adj(op,skill_obj);
1679 } 1681 }
1690sint64 check_exp_loss(const object *op, sint64 exp) 1692sint64 check_exp_loss(const object *op, sint64 exp)
1691{ 1693{
1692 sint64 del_exp; 1694 sint64 del_exp;
1693 1695
1694 if (exp > op->stats.exp) exp = op->stats.exp; 1696 if (exp > op->stats.exp) exp = op->stats.exp;
1695 if (settings.use_permanent_experience) { 1697 if (settings.permanent_exp_ratio) {
1696 del_exp = (op->stats.exp - op->perm_exp) * PERM_EXP_MAX_LOSS_RATIO; 1698 del_exp = (op->stats.exp - op->perm_exp) * PERM_EXP_MAX_LOSS_RATIO;
1697 if (del_exp < 0) del_exp = 0; 1699 if (del_exp < 0) del_exp = 0;
1698 if (exp > del_exp) exp=del_exp; 1700 if (exp > del_exp) exp=del_exp;
1699 } 1701 }
1700 return exp; 1702 return exp;
1811 subtract_player_exp(op, FABS(exp), skill_name, flag); 1813 subtract_player_exp(op, FABS(exp), skill_name, flag);
1812 1814
1813 } 1815 }
1814} 1816}
1815 1817
1816/* Applies a death penalty experience. 20% or 3 levels, whichever is 1818/* Applies a death penalty experience, the size of this is defined by the
1817 * less experience lost. 1819 * settings death_penalty_percentage and death_penalty_levels, and by the
1820 * amount of permenent experience, whichever gives the lowest loss.
1818 */ 1821 */
1819 1822
1820void apply_death_exp_penalty(object *op) { 1823void apply_death_exp_penalty(object *op) {
1821 object *tmp; 1824 object *tmp;
1822 sint64 loss; 1825 sint64 loss;
1823 sint64 loss_20p; /* 20 percent experience loss */ 1826 sint64 percentage_loss; /* defined by the setting 'death_penalty_percent' */
1824 sint64 loss_3l; /* 3 level experience loss */ 1827 sint64 level_loss; /* defined by the setting 'death_penalty_levels */
1825 1828
1826 for(tmp=op->inv;tmp;tmp=tmp->below) 1829 for(tmp=op->inv;tmp;tmp=tmp->below)
1827 if(tmp->type==SKILL && tmp->stats.exp) { 1830 if(tmp->type==SKILL && tmp->stats.exp) {
1828 1831
1829#ifdef COZY_SERVER 1832 percentage_loss = tmp->stats.exp * settings.death_penalty_ratio/100;
1830 loss_20p = tmp->stats.exp * 0.05; 1833 level_loss = tmp->stats.exp - levels[MAX(0,tmp->level - settings.death_penalty_level)];
1831#else
1832 loss_20p = tmp->stats.exp * 0.20;
1833#endif
1834 loss_3l = tmp->stats.exp - levels[MAX(0,tmp->level -3)];
1835 1834
1836 /* With the revised exp system, you can get cases where 1835 /* With the revised exp system, you can get cases where
1837 * losing 3 levels would still require that you have more 1836 * losing several levels would still require that you have more
1838 * exp than you current have - this is true if the levels 1837 * exp than you currently have - this is true if the levels
1839 * tables is a lot harder. 1838 * tables is a lot harder.
1840 */ 1839 */
1841 if (loss_3l < 0) loss_3l = 0; 1840 if (level_loss < 0) level_loss = 0;
1842 1841
1843 loss = check_exp_loss(tmp, MIN(loss_3l, loss_20p)); 1842 loss = check_exp_loss(tmp, MIN(level_loss, percentage_loss));
1844 1843
1845 tmp->stats.exp -= loss; 1844 tmp->stats.exp -= loss;
1846 player_lvl_adj(op,tmp); 1845 player_lvl_adj(op,tmp);
1847 } 1846 }
1848 1847
1849#ifdef COZY_SERVER 1848 percentage_loss = op->stats.exp * settings.death_penalty_ratio/100;
1850 loss_20p = op->stats.exp * 0.05; 1849 level_loss = op->stats.exp - levels[MAX(0,op->level - settings.death_penalty_level)];
1851#else
1852 loss_20p = op->stats.exp * 0.20;
1853#endif
1854 loss_3l = op->stats.exp - levels[MAX(0,op->level -3)];
1855 if (loss_3l < 0) loss_3l = 0; 1850 if (level_loss < 0) level_loss = 0;
1856 loss = check_exp_loss(op, MIN(loss_3l, loss_20p)); 1851 loss = check_exp_loss(op, MIN(level_loss, percentage_loss));
1857 1852
1858 op->stats.exp -= loss; 1853 op->stats.exp -= loss;
1859 player_lvl_adj(op,NULL); 1854 player_lvl_adj(op,NULL);
1860} 1855}
1861 1856

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines