--- deliantra/server/common/living.C 2007/05/12 17:26:51 1.49 +++ deliantra/server/common/living.C 2007/05/12 19:07:21 1.53 @@ -235,112 +235,27 @@ }; /* - * sets Str/Dex/con/Wis/Cha/Int/Pow in stats to value, depending on - * what attr is (STR to POW). - */ -void -set_attr_value (living *stats, int attr, sint8 value) -{ - switch (attr) - { - case STR: - stats->Str = value; - break; - case DEX: - stats->Dex = value; - break; - case CON: - stats->Con = value; - break; - case WIS: - stats->Wis = value; - break; - case POW: - stats->Pow = value; - break; - case CHA: - stats->Cha = value; - break; - case INT: - stats->Int = value; - break; - } -} - -/* * Like set_attr_value(), but instead the value (which can be negative) * is added to the specified stat. */ void change_attr_value (living *stats, int attr, sint8 value) { - if (value == 0) - return; - - switch (attr) - { - case STR: - stats->Str += value; - break; - case DEX: - stats->Dex += value; - break; - case CON: - stats->Con += value; - break; - case WIS: - stats->Wis += value; - break; - case POW: - stats->Pow += value; - break; - case CHA: - stats->Cha += value; - break; - case INT: - stats->Int += value; - break; - default: - LOG (llevError, "Invalid attribute in change_attr_value: %d\n", attr); - } -} - -/* - * returns the specified stat. See also set_attr_value(). - */ - -sint8 -get_attr_value (const living *stats, int attr) -{ - switch (attr) - { - case STR: return stats->Str; - case DEX: return stats->Dex; - case CON: return stats->Con; - case WIS: return stats->Wis; - case CHA: return stats->Cha; - case INT: return stats->Int; - case POW: return stats->Pow; - } - - return 0; + stats->stat (attr) += value; } /* * Ensures that all stats (str/dex/con/wis/cha/int) are within the * 1-30 stat limit. */ - void check_stat_bounds (living *stats) { - int i, v; - - for (i = 0; i < NUM_STATS; i++) - if ((v = get_attr_value (stats, i)) > MAX_STAT) - set_attr_value (stats, i, MAX_STAT); - else if (v < MIN_STAT) - set_attr_value (stats, i, MIN_STAT); + for (int i = 0; i < NUM_STATS; i++) + { + sint8 &v = stats->stat (i); + v = clamp (v, MIN_STAT, MAX_STAT); + } } #define ORIG_S(xyz,abc) (op->contr->orig_stats.abc) @@ -368,7 +283,7 @@ int change_abil (object *op, object *tmp) { - int flag = QUERY_FLAG (tmp, FLAG_APPLIED) ? 1 : -1, i, j, success = 0; + int flag = QUERY_FLAG (tmp, FLAG_APPLIED) ? 1 : -1, success = 0; char message[MAX_BUF]; int potion_max = 0; @@ -383,15 +298,13 @@ if (tmp->type == POTION) { potion_max = 1; - for (j = 0; j < NUM_STATS; j++) + for (int j = 0; j < NUM_STATS; j++) { - int nstat, ostat; - - ostat = get_attr_value (&(op->contr->orig_stats), j); - i = get_attr_value (&(tmp->stats), j); + int ostat = op->contr->orig_stats.stat (j); + int i = tmp->stats.stat (j); /* nstat is what the stat will be after use of the potion */ - nstat = flag * i + ostat; + int nstat = flag * i + ostat; /* Do some bounds checking. While I don't think any * potions do so right now, there is the potential for potions @@ -400,12 +313,12 @@ */ if (nstat < 1 && i * flag < 0) nstat = 1; - else if (nstat > 20 + get_attr_value (&op->arch->clone.stats, j)) - nstat = 20 + get_attr_value (&op->arch->clone.stats, j); + else if (nstat > 20 + op->arch->clone.stats.stat (j)) + nstat = 20 + op->arch->clone.stats.stat (j); if (nstat != ostat) { - set_attr_value (&op->contr->orig_stats, j, nstat); + op->contr->orig_stats.stat (j) = nstat; potion_max = 0; } else if (i) @@ -419,14 +332,14 @@ * sure if this is strictly necessary, being that fix_player probably * recalculates this anyway. */ - for (j = 0; j < NUM_STATS; j++) - change_attr_value (&op->stats, j, flag * get_attr_value (&tmp->stats, j)); + for (int j = 0; j < NUM_STATS; j++) + change_attr_value (&op->stats, j, flag * tmp->stats.stat (j)); check_stat_bounds (&op->stats); } /* end of potion handling code */ } - /* reset attributes that fix_player doesn't reset since it doesn't search + /* reset attributes that update_stats doesn't reset since it doesn't search * everything to set */ if (flag == -1) @@ -442,12 +355,12 @@ } /* call fix_player since op object could have whatever attribute due - * to multiple items. if fix_player always has to be called after + * to multiple items. if update_stats always has to be called after * change_ability then might as well call it from here */ op->update_stats (); - /* Fix player won't add the bows ability to the player, so don't + /* update_stats won't add the bows ability to the player, so don't * print out message if this is a bow. */ if (tmp->attacktype & AT_CONFUSION && tmp->type != BOW) @@ -497,7 +410,7 @@ /* double conditional - second case covers if you have move_fly_low - * in that case, you don't actually land */ - DIFF_MSG (flag, "You soar into the air air!.", + DIFF_MSG (flag, "You soar into the air!", (op->move_type & MOVE_FLY_LOW ? "You fly lower in the air" : "You float down to the ground.")); } @@ -638,7 +551,7 @@ } /* Messages for changed resistance */ - for (i = 0; i < NROFATTACKS; i++) + for (int i = 0; i < NROFATTACKS; i++) { if (i == ATNR_PHYSICAL) continue; /* Don't display about armour */ @@ -657,9 +570,9 @@ if (!potion_max) { - for (j = 0; j < NUM_STATS; j++) + for (int j = 0; j < NUM_STATS; j++) { - if ((i = get_attr_value (&(tmp->stats), j)) != 0) + if (int i = tmp->stats.stat (j)) { success = 1; DIFF_MSG (i * flag, gain_msg[j], lose_msg[j]); @@ -772,21 +685,12 @@ void object::remove_statbonus () { - stats.Str -= arch->clone.stats.Str; - stats.Dex -= arch->clone.stats.Dex; - stats.Con -= arch->clone.stats.Con; - stats.Wis -= arch->clone.stats.Wis; - stats.Pow -= arch->clone.stats.Pow; - stats.Cha -= arch->clone.stats.Cha; - stats.Int -= arch->clone.stats.Int; - - contr->orig_stats.Str -= arch->clone.stats.Str; - contr->orig_stats.Dex -= arch->clone.stats.Dex; - contr->orig_stats.Con -= arch->clone.stats.Con; - contr->orig_stats.Wis -= arch->clone.stats.Wis; - contr->orig_stats.Pow -= arch->clone.stats.Pow; - contr->orig_stats.Cha -= arch->clone.stats.Cha; - contr->orig_stats.Int -= arch->clone.stats.Int; + for (int i = 0; i < NUM_STATS; ++i) + { + sint8 v = arch->clone.stats.stat (i); + stats.stat (i) -= v; + contr->orig_stats.stat (i) -= v; + } } /* @@ -795,21 +699,12 @@ void object::add_statbonus () { - stats.Str += arch->clone.stats.Str; - stats.Dex += arch->clone.stats.Dex; - stats.Con += arch->clone.stats.Con; - stats.Wis += arch->clone.stats.Wis; - stats.Pow += arch->clone.stats.Pow; - stats.Cha += arch->clone.stats.Cha; - stats.Int += arch->clone.stats.Int; - - contr->orig_stats.Str += arch->clone.stats.Str; - contr->orig_stats.Dex += arch->clone.stats.Dex; - contr->orig_stats.Con += arch->clone.stats.Con; - contr->orig_stats.Wis += arch->clone.stats.Wis; - contr->orig_stats.Pow += arch->clone.stats.Pow; - contr->orig_stats.Cha += arch->clone.stats.Cha; - contr->orig_stats.Int += arch->clone.stats.Int; + for (int i = 0; i < NUM_STATS; ++i) + { + sint8 v = arch->clone.stats.stat (i); + stats.stat (i) += v; + contr->orig_stats.stat (i) += v; + } } /* @@ -837,7 +732,7 @@ if (type == PLAYER) { for (i = 0; i < NUM_STATS; i++) - set_attr_value (&(stats), i, get_attr_value (&(contr->orig_stats), i)); + stats.stat (i) = contr->orig_stats.stat (i); if (settings.spell_encumbrance == TRUE) contr->encumbrance = 0; @@ -977,7 +872,7 @@ continue; for (i = 0; i < NUM_STATS; i++) - change_attr_value (&stats, i, get_attr_value (&tmp->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 @@ -1046,8 +941,7 @@ } /* There may be other things that should not adjust the attacktype */ - if ((tmp->type != WEAPON && tmp->type != BOW && tmp->type != SYMPTOM) - || current_weapon == tmp) + if (tmp->type != SYMPTOM) { attacktype |= tmp->attacktype; path_attuned |= tmp->path_attuned;