--- deliantra/server/common/living.C 2007/05/12 19:30:18 1.54 +++ deliantra/server/common/living.C 2007/05/17 00:33:29 1.59 @@ -725,7 +725,7 @@ int weapon_weight = 0, weapon_speed = 0; int best_wc = 0, best_ac = 0, wc = 0, ac = 0; int prot[NROFATTACKS], vuln[NROFATTACKS], potion_resist[NROFATTACKS]; - object *grace_obj = NULL, *mana_obj = NULL, *wc_obj = NULL, *tmp; + object *grace_obj = NULL, *mana_obj = NULL, *tmp; float old_speed = speed; /* First task is to clear all the values back to their original values */ @@ -868,14 +868,17 @@ if (type == PLAYER) { if (tmp == contr->combat_ob || tmp == contr->ranged_ob) - if (tmp != current_weapon && (tmp->type != SKILL || tmp->subtype != SK_PRAYING)) + if (tmp != current_weapon + && (tmp->type != SKILL || tmp->subtype != SK_PRAYING) + && !tmp->flag [FLAG_CURSED] + && !tmp->flag [FLAG_DAMNED]) continue; for (i = 0; i < NUM_STATS; i++) change_attr_value (&stats, i, tmp->stats.stat (i)); - /* these are the items that currently can change digestion, regeneration, - * spell point recovery and mana point recovery. Seems sort of an arbitary + /* These are the items that currently can change digestion, regeneration, + * spell point recovery and mana point recovery. Seems sort of an arbitary * list, but other items store other info into stats array. */ if (tmp->type == WEAPON || tmp->type == BOW || @@ -996,9 +999,6 @@ if (!QUERY_FLAG (tmp, FLAG_APPLIED)) break; - if (IS_COMBAT_SKILL (tmp->subtype)) - wc_obj = tmp; - if (chosen_skill) LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &name); @@ -1033,13 +1033,6 @@ break; - case SKILL_TOOL: - if (chosen_skill) - LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &name); - - chosen_skill = tmp; - break; - case SHIELD: if (settings.spell_encumbrance == TRUE && type == PLAYER) contr->encumbrance += (int) tmp->weight / 2000; @@ -1290,6 +1283,7 @@ * to make up for the change. Note that I left the * monster bonus the same as before. -b.t. */ + object *wc_obj = chosen_skill; if (contr && wc_obj && wc_obj->level > 1) { @@ -1321,7 +1315,6 @@ if (attacktype == 0) attacktype = arch->clone.attacktype; - } /* End if player */ if (added_speed >= 0) @@ -1365,13 +1358,13 @@ float M = (max_carry[stats.Str] - 121) / 121.f; float M2 = max_carry[stats.Str] / 100.f; float W = weapon_weight / 20000.f; - float s = 2 - weapon_speed / 10.f; + float s = (20 - weapon_speed) / 10.f; float D = (stats.Dex - 14) / 14.f; float K = 1 + M / 3.f - W / (3 * M2) + speed / 5.f + D / 2.f; - K *= (4 + level) *1.2f / (6 + level); + K *= (4 + level) * 1.2f / (6 + level); - if (K <= 0.f) + if (K <= 0.01f) K = 0.01f; float S = speed / (K * s); @@ -1383,23 +1376,8 @@ if (type != PLAYER && arch && stats.dam > arch->clone.stats.dam * 3) stats.dam = arch->clone.stats.dam * 3; - /* Prevent overflows of wc - best you can get is ABS(120) - this - * should be more than enough - remember, AC is also in 8 bits, - * so its value is the same. - */ - if (wc > 120) - wc = 120; - else if (wc < -120) - wc = -120; - - stats.wc = wc; - - if (ac > 120) - ac = 120; - else if (ac < -120) - ac = -120; - - stats.ac = ac; + stats.wc = clamp (wc, MIN_WC, MAX_WC); + stats.ac = clamp (ac, MIN_AC, MAX_AC); /* if for some reason the creature doesn't have any move type, * give them walking as a default. @@ -1589,6 +1567,7 @@ LOG (llevError, "add_player_exp: couldn't find skill %s\n", skill_name); return NULL; } + /* clear the flag - exp goes into this bucket, but player * still doesn't know it. */ @@ -1597,11 +1576,11 @@ skill_obj->level = 1; insert_ob_in_ob (skill_obj, op); - if (op->contr) + if (player *pl = op->contr) { - op->contr->last_skill_ob [skill_obj->subtype] = skill_obj; - if (op->contr->ns) - op->contr->ns->last_skill_exp[skill_obj->subtype] = -1;//TODO: should be made superfluous + pl->last_skill_ob [skill_obj->subtype] = skill_obj; + if (pl->ns) + pl->ns->last_skill_exp[skill_obj->subtype] = -1;//TODO: should be made superfluous } return skill_obj; @@ -1982,6 +1961,7 @@ percentage_loss = op->stats.exp * settings.death_penalty_ratio / 100; level_loss = op->stats.exp - levels[MAX (0, op->level - settings.death_penalty_level)]; + if (level_loss < 0) level_loss = 0; loss = check_exp_loss (op, MIN (level_loss, percentage_loss));