--- deliantra/server/common/exp.C 2011/04/23 04:56:45 1.37 +++ deliantra/server/common/exp.C 2024/06/10 17:06:31 1.45 @@ -1,24 +1,25 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * + * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002 Mark Wedel & Crossfire Development Team * Copyright (©) 1992 Frank Tore Johansen - * + * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the Affero GNU General Public License * and the GNU General Public License along with this program. If not, see * . - * + * * The authors can be reached via e-mail to */ @@ -150,17 +151,14 @@ sint64 level_to_min_exp (int level) { - if (level <= 0) - return 0; - else - return levels [min (level, settings.max_level)]; + return levels [clamp (level, 0, settings.max_level)]; } /* This loads the experience table from the exp_table * file. */ void -reload_exp_table () +_reload_exp_table () { int lastlevel = 0; sint64 lastexp = -1; @@ -182,6 +180,7 @@ thawer.get (settings.max_level); sint64 newlevels [MAXNUMLEVELS]; + newlevels [0] = 0; while (thawer.next_line ()) { @@ -199,9 +198,9 @@ lastlevel++; - if (lastlevel > settings.max_level) + if (lastlevel > settings.max_level || lastlevel >= MAXNUMLEVELS - 1) { - LOG (llevError, "Too many levels specified in table (%d > %d)\n", lastlevel, settings.max_level); + LOG (llevError, "Too many levels specified in table (%d > %d (settings.max_level) or >= %d (MAXNUMLEVELS - 1))\n", lastlevel, settings.max_level, MAXNUMLEVELS - 1); exit (1); } @@ -215,6 +214,10 @@ return; } + // copy the last exp value one level higher, so we can take the difference to the "next" level + // eve4n for players at max. level + newlevels [lastlevel + 1] = newlevels [lastlevel]; + memcpy (levels, newlevels, sizeof (levels)); }