From dce267d966c2a6466ebc57f84dccda7fa5012a75 Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Sun, 8 Nov 2009 23:32:42 -0800 Subject: Reform SH to be more transparent Before: SH was a function of items and skills. Blocking was a function of SH, skills, and stats. Now: SH is a function of items, skills, and stats. Blocking is a function of SH and SH alone. Your ability to block attacks in given equipment should be more or less the same, although there will be small differences. Condensation Shield was doubled (since nobody uses it), Divine Shield was made to not use intelligence. SH values have been rescaled to be on approximately the same scale as AC and EV. This meant increasing the max enchant of shields to +3. --- crawl-ref/source/player.cc | 67 +++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 33 deletions(-) (limited to 'crawl-ref/source/player.cc') diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index fe7b7bca31..4340a1c6ab 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -2301,37 +2301,59 @@ int player_mag_abil(bool is_weighted) int player_shield_class(void) //jmf: changes for new spell { - int base_shield = 0; + int shield = 0; + int stat = 0; + + if (you.incapacitated()) + return (0); if (player_wearing_slot(EQ_SHIELD)) { const item_def& item = you.inv[you.equip[EQ_SHIELD]]; - base_shield = property(item, PARM_AC); + int base_shield = property(item, PARM_AC); - int racial_bonus = _player_armour_racial_bonus(item) * 2 / 3; + int racial_bonus = _player_armour_racial_bonus(item); // bonus applied only to base, see above for effect: - base_shield *= (20 + you.skills[SK_SHIELDS] + racial_bonus); - base_shield /= 20; + shield += base_shield * 100; + shield += base_shield * 5 * you.skills[SK_SHIELDS]; + shield += base_shield * racial_bonus * 10 / 3; - base_shield += item.plus; + shield += item.plus * 100; + + if (item.sub_type == ARM_BUCKLER) + stat = you.dex * 38; + else if (item.sub_type == ARM_LARGE_SHIELD) + stat = you.dex * 12 + you.strength * 26; + else + stat = you.dex * 19 + you.strength * 19; } else { if (you.duration[DUR_MAGIC_SHIELD]) - base_shield = 2 + you.skills[SK_EVOCATIONS] / 6; + { + stat = 600 + you.skills[SK_EVOCATIONS] * 50; + shield += 300 + you.skills[SK_EVOCATIONS] * 25; + } if (!you.duration[DUR_FIRE_SHIELD] && you.duration[DUR_CONDENSATION_SHIELD]) { - base_shield += 2 + (you.skills[SK_ICE_MAGIC] / 6); // max 6 + shield += 300 + (you.skills[SK_ICE_MAGIC] * 25); + stat = std::max(stat, you.intel * 38); } } if (you.duration[DUR_DIVINE_SHIELD]) - base_shield += you.attribute[ATTR_DIVINE_SHIELD]; + { + shield += you.attribute[ATTR_DIVINE_SHIELD] * 150; + stat = std::max(stat, int(you.attribute[ATTR_DIVINE_SHIELD] * 300)); + } + + if (shield + stat > 0) + shield += skill_bump(SK_SHIELDS) * 38; - return (base_shield); + return (shield + stat + 50) / 100; } int player_sust_abil(bool calc_unid) @@ -6097,31 +6119,10 @@ int player::shield_block_penalty() const int player::shield_bonus() const { const int shield_class = player_shield_class(); - if (!shield_class) + if (shield_class <= 0) return (-100); - // Note that 0 is not quite no-blocking. - if (incapacitated()) - return (0); - - int stat = 0; - if (const item_def *sh = const_cast(this)->shield()) - { - stat = - sh->sub_type == ARM_BUCKLER? dex : - sh->sub_type == ARM_LARGE_SHIELD? (3 * strength + dex) / 4: - (dex + strength) / 2; - } - else - { - // Magical and divine shields are governed by the mind. - stat = intel / 2; - } - - return (random2(shield_class) - + (random2(stat) / 4) - + (random2(skill_bump(SK_SHIELDS)) / 4) - - 1); + return random2avg(shield_class * 2, 2) / 3 - 1; } int player::shield_bypass_ability(int tohit) const -- cgit v1.2.3-54-g00ecf