Fix incorrect calculation of armor rating (Bug #3754)

pull/155/head
MiroslavR 8 years ago
parent 96ca50e108
commit f883951d75

@ -231,8 +231,8 @@ namespace MWClass
typeText = "#{sHeavy}"; typeText = "#{sHeavy}";
} }
text += "\n#{sArmorRating}: " + MWGui::ToolTips::toString(getEffectiveArmorRating(ptr, text += "\n#{sArmorRating}: " + MWGui::ToolTips::toString(static_cast<int>(getEffectiveArmorRating(ptr,
MWMechanics::getPlayer())); MWMechanics::getPlayer())));
int remainingHealth = getItemHealth(ptr); int remainingHealth = getItemHealth(ptr);
text += "\n#{sCondition}: " + MWGui::ToolTips::toString(remainingHealth) + "/" text += "\n#{sCondition}: " + MWGui::ToolTips::toString(remainingHealth) + "/"
@ -277,7 +277,7 @@ namespace MWClass
return record->mId; return record->mId;
} }
int Armor::getEffectiveArmorRating(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &actor) const float Armor::getEffectiveArmorRating(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &actor) const
{ {
const MWWorld::LiveCellRef<ESM::Armor> *ref = ptr.get<ESM::Armor>(); const MWWorld::LiveCellRef<ESM::Armor> *ref = ptr.get<ESM::Armor>();
@ -290,7 +290,7 @@ namespace MWClass
if(ref->mBase->mData.mWeight == 0) if(ref->mBase->mData.mWeight == 0)
return ref->mBase->mData.mArmor; return ref->mBase->mData.mArmor;
else else
return ref->mBase->mData.mArmor * armorSkill / iBaseArmorSkill; return ref->mBase->mData.mArmor * armorSkill / static_cast<float>(iBaseArmorSkill);
} }
std::pair<int, std::string> Armor::canBeEquipped(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &npc) const std::pair<int, std::string> Armor::canBeEquipped(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &npc) const

@ -84,7 +84,7 @@ namespace MWClass
virtual bool canSell (const MWWorld::ConstPtr& item, int npcServices) const; virtual bool canSell (const MWWorld::ConstPtr& item, int npcServices) const;
/// Get the effective armor rating, factoring in the actor's skills, for the given armor. /// Get the effective armor rating, factoring in the actor's skills, for the given armor.
virtual int getEffectiveArmorRating(const MWWorld::ConstPtr& armor, const MWWorld::Ptr& actor) const; virtual float getEffectiveArmorRating(const MWWorld::ConstPtr& armor, const MWWorld::Ptr& actor) const;
}; };
} }

@ -1085,14 +1085,14 @@ namespace MWClass
float fUnarmoredBase2 = store.find("fUnarmoredBase2")->getFloat(); float fUnarmoredBase2 = store.find("fUnarmoredBase2")->getFloat();
int unarmoredSkill = stats.getSkill(ESM::Skill::Unarmored).getModified(); int unarmoredSkill = stats.getSkill(ESM::Skill::Unarmored).getModified();
int ratings[MWWorld::InventoryStore::Slots]; float ratings[MWWorld::InventoryStore::Slots];
for(int i = 0;i < MWWorld::InventoryStore::Slots;i++) for(int i = 0;i < MWWorld::InventoryStore::Slots;i++)
{ {
MWWorld::ContainerStoreIterator it = invStore.getSlot(i); MWWorld::ContainerStoreIterator it = invStore.getSlot(i);
if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name()) if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name())
{ {
// unarmored // unarmored
ratings[i] = static_cast<int>((fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill)); ratings[i] = (fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill);
} }
else else
{ {

@ -482,7 +482,7 @@ namespace MWWorld
return -1; return -1;
} }
int Class::getEffectiveArmorRating(const ConstPtr &armor, const Ptr &actor) const float Class::getEffectiveArmorRating(const ConstPtr &armor, const Ptr &actor) const
{ {
throw std::runtime_error("class does not support armor ratings"); throw std::runtime_error("class does not support armor ratings");
} }

@ -353,7 +353,7 @@ namespace MWWorld
virtual int getPrimaryFactionRank (const MWWorld::ConstPtr& ptr) const; virtual int getPrimaryFactionRank (const MWWorld::ConstPtr& ptr) const;
/// Get the effective armor rating, factoring in the actor's skills, for the given armor. /// Get the effective armor rating, factoring in the actor's skills, for the given armor.
virtual int getEffectiveArmorRating(const MWWorld::ConstPtr& armor, const MWWorld::Ptr& actor) const; virtual float getEffectiveArmorRating(const MWWorld::ConstPtr& armor, const MWWorld::Ptr& actor) const;
}; };
} }

@ -245,7 +245,7 @@ void MWWorld::InventoryStore::autoEquip (const MWWorld::Ptr& actor)
static float fUnarmoredBase2 = store.find("fUnarmoredBase2")->getFloat(); static float fUnarmoredBase2 = store.find("fUnarmoredBase2")->getFloat();
int unarmoredSkill = stats.getSkill(ESM::Skill::Unarmored).getModified(); int unarmoredSkill = stats.getSkill(ESM::Skill::Unarmored).getModified();
float unarmoredRating = static_cast<int>((fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill)); float unarmoredRating = (fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill);
TSlots slots_; TSlots slots_;
initSlots (slots_); initSlots (slots_);

Loading…
Cancel
Save