--- deliantra/server/common/living.C 2007/07/22 14:17:56 1.72 +++ deliantra/server/common/living.C 2007/07/31 18:08:58 1.73 @@ -1601,12 +1601,15 @@ player_lvl_adj (object *who, object *op) { char buf[MAX_BUF]; + bool changed = false; if (!op) /* when rolling stats */ op = who; - if (op->level < settings.max_level && op->stats.exp >= level_exp (op->level + 1, who->expmul)) + while (op->level < settings.max_level && op->stats.exp >= level_exp (op->level + 1, who->expmul)) { + changed = true; + op->level++; if (op && op == who && op->stats.exp > 1 && is_dragon_pl (who)) @@ -1620,37 +1623,44 @@ who->contr->levgrace[who->level] = die_roll (2, 2, who, PREFER_HIGH) - 1; } - who->update_stats (); if (op->level > 1) { if (op->type != PLAYER) - sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name); + { + who->contr->play_sound (sound_find ("skill_up")); + sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name); + } else - sprintf (buf, "You are now level %d.", op->level); + { + who->contr->play_sound (sound_find ("level_up")); + sprintf (buf, "You are now level %d.", op->level); + } if (who) new_draw_info (NDI_UNIQUE | NDI_RED, 0, who, buf); } - - player_lvl_adj (who, op); /* To increase more levels */ } - else if (op->level > 1 && op->stats.exp < level_exp (op->level, who->expmul)) + + while (op->level > 1 && op->stats.exp < level_exp (op->level, who->expmul)) { + changed = true; + op->level--; - who->update_stats (); if (op->type != PLAYER) { sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name); new_draw_info (NDI_UNIQUE | NDI_RED, 0, who, buf); } - - player_lvl_adj (who, op); /* To decrease more levels */ } - /* check if the spell data has changed */ - esrv_update_stats (who->contr); - esrv_update_spells (who->contr); + if (changed) + { + who->update_stats (); + esrv_update_stats (who->contr); + /* check if the spell data has changed */ + esrv_update_spells (who->contr); + } } /*