Date: Tuesday August 1, 2000 @ 23:04 Author: cvs Update of /home/cvs/CVS/crossfire/common In directory boltzmann.eecs.berkeley.edu:/tmp/cvs-serv32470/common Modified Files: init.c living.c Log Message: include/config.h, include/global.h, common/init.c, common/living.c, server/init.c, server/player.c, server/skill_util.c: Add permanent experience and balanced stat loss features (code by Garth Denley). Permanent experience make some experience in the skills permanent. Balance stat loss makes stat loss less likely/costly at low level and more costly at higher levels. These features are by default off, but can be turned on either in the config.h file or via command line options. Code checked in by MSW 8/1/2000 **************************************** Index: crossfire/common/init.c diff -u crossfire/common/init.c:1.3 crossfire/common/init.c:1.4 --- crossfire/common/init.c:1.3 Sun May 21 14:41:45 2000 +++ crossfire/common/init.c Tue Aug 1 23:04:50 2000 @@ -1,11 +1,12 @@ /* * static char *rcsid_init_c = - * "$Id: init.c,v 1.3 2000/05/21 21:41:45 jec Exp $"; + * "$Id: init.c,v 1.4 2000/08/02 06:04:50 cvs Exp $"; */ /* CrossFire, A Multiplayer game for X-windows + Copyright (C) 2000 Mark Wedel Copyright (C) 1992 Frank Tore Johansen This program is free software; you can redistribute it and/or modify @@ -22,7 +23,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - The author can be reached via e-mail to frankj at ifi.uio.no. + The author can be reached via e-mail to mwedel at scruz.net */ #define EXTERN @@ -51,6 +52,8 @@ PLAYERDIR, MAPDIR, ARCHETYPES,TREASURES, UNIQUE_DIR, TMPDIR, STAT_LOSS_ON_DEATH, +USE_PERMANENT_EXPERIENCE, +BALANCED_STAT_LOSS, SIMPLE_EXP }; Index: crossfire/common/living.c diff -u crossfire/common/living.c:1.8 crossfire/common/living.c:1.9 --- crossfire/common/living.c:1.8 Mon Jun 19 05:23:11 2000 +++ crossfire/common/living.c Tue Aug 1 23:04:50 2000 @@ -1,6 +1,6 @@ /* * static char *rcsid_living_c = - * "$Id: living.c,v 1.8 2000/06/19 12:23:11 jec Exp $"; + * "$Id: living.c,v 1.9 2000/08/02 06:04:50 cvs Exp $"; */ /* @@ -29,7 +29,6 @@ #include <global.h> #include <funcpoint.h> - static int con_bonus[MAX_STAT + 1]={ -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 @@ -1588,10 +1587,59 @@ /* adjust_exp() - make sure that we don't exceed max or min set on * experience */ - + int adjust_exp(object *op, int exp) { int max_exp = MAX_EXPERIENCE; + if (settings.use_permanent_experience) { + /* Permanent experience code. Blame me if any problems. :) */ + /* This code _only_ affects experience objects. */ + /* GD */ + if (op->type == EXPERIENCE) { + int p_exp_min; + int p_exp_gain; + int max_loss; + + /* The following fields are used: */ + /* stats.exp: Current exp in experience object. */ + /* last_heal: Permanent experience earnt. */ + + /* Ensure that our permanent experience minimum is met. */ + p_exp_min = (int)(PERM_EXP_MINIMUM_RATIO * (float)(op->stats.exp)); + /*LOG(llevError, "Experience minimum check: %d p-min %d p-curr %d curr.\n", p_exp_min, op->last_heal, op->stats.exp);*/ + if (op->last_heal < p_exp_min) + op->last_heal = p_exp_min; + + /* Experience gain: We get a ratio of the gain as permanent experience. */ + if (exp > 0) { + p_exp_gain = (int)(PERM_EXP_GAIN_RATIO * exp); + op->last_heal += p_exp_gain; + /* Cap permanent experience. */ + if (op->last_heal > MAX_EXP_IN_OBJ) + op->last_heal = MAX_EXP_IN_OBJ; + /*LOG(llevError, "Gaining %d experience results in %d permanent exp (now %d).\n", exp, p_exp_gain, op->last_heal); */ + } + + /* Experience loss: Our permanent experience affects this. */ + if (exp < 0) { + /*LOG(llevError, "Experience loss of %d from %d (%d perm).\n", + -exp, op->stats.exp, op->last_heal); */ + if (op->stats.exp <= op->last_heal) { + /* Cripes. Less experience than permanent experience. + No experience loss. */ + max_loss = 0; + exp = 0; + } else { + /* Max loss is a ratio of temporary experience (curr-perm). */ + max_loss = (int)(PERM_EXP_MAX_LOSS_RATIO * (float)(op->stats.exp - op->last_heal)); + if (exp < -max_loss) + exp = -max_loss; + } + /* LOG(llevError, "Decided on a loss of %d.\n", -exp); */ + } + } + } + op->stats.exp += exp; if(op->stats.exp < 0) { exp -= op->stats.exp;