|
|
|
@ -35,6 +35,23 @@ namespace MWMechanics
|
|
|
|
|
if (!found)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search (mId);
|
|
|
|
|
if (spell && (spell->mData.mType == ESM::Spell::ST_Disease || spell->mData.mType == ESM::Spell::ST_Blight))
|
|
|
|
|
{
|
|
|
|
|
float x = (spell->mData.mType == ESM::Spell::ST_Disease) ?
|
|
|
|
|
target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::ResistCommonDisease).mMagnitude
|
|
|
|
|
: target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::ResistBlightDisease).mMagnitude;
|
|
|
|
|
|
|
|
|
|
int roll = std::rand()/ (static_cast<double> (RAND_MAX) + 1) * 100; // [0, 99]
|
|
|
|
|
if (roll <= x)
|
|
|
|
|
{
|
|
|
|
|
// Fully resisted, show message
|
|
|
|
|
if (target.getRefData().getHandle() == "player")
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicPCResisted}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ESM::EffectList reflectedEffects;
|
|
|
|
|
std::vector<ActiveSpells::Effect> appliedLastingEffects;
|
|
|
|
|
bool firstAppliedEffect = true;
|
|
|
|
@ -59,7 +76,6 @@ namespace MWMechanics
|
|
|
|
|
// Try absorbing if it's a spell
|
|
|
|
|
// NOTE: Vanilla does this once per effect source instead of adding the % from all sources together, not sure
|
|
|
|
|
// if that is worth replicating.
|
|
|
|
|
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search (mId);
|
|
|
|
|
if (spell && caster != target)
|
|
|
|
|
{
|
|
|
|
|
int absorb = target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::SpellAbsorption).mMagnitude;
|
|
|
|
@ -97,35 +113,15 @@ namespace MWMechanics
|
|
|
|
|
// Try resisting
|
|
|
|
|
if (magnitudeMult > 0 && target.getClass().isActor())
|
|
|
|
|
{
|
|
|
|
|
const ESM::Spell *spell =
|
|
|
|
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search (mId);
|
|
|
|
|
|
|
|
|
|
if (spell->mData.mType == ESM::Spell::ST_Disease || spell->mData.mType == ESM::Spell::ST_Blight)
|
|
|
|
|
magnitudeMult = MWMechanics::getEffectMultiplier(effectIt->mEffectID, target, caster, spell);
|
|
|
|
|
if (magnitudeMult == 0)
|
|
|
|
|
{
|
|
|
|
|
float x = (spell->mData.mType == ESM::Spell::ST_Disease) ?
|
|
|
|
|
target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::ResistCommonDisease).mMagnitude
|
|
|
|
|
: target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::ResistBlightDisease).mMagnitude;
|
|
|
|
|
|
|
|
|
|
int roll = std::rand()/ (static_cast<double> (RAND_MAX) + 1) * 100; // [0, 99]
|
|
|
|
|
if (roll <= x)
|
|
|
|
|
{
|
|
|
|
|
// Fully resisted, show message
|
|
|
|
|
if (target.getRefData().getHandle() == "player")
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicPCResisted}");
|
|
|
|
|
magnitudeMult = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
magnitudeMult = MWMechanics::getEffectMultiplier(effectIt->mEffectID, target, caster, spell);
|
|
|
|
|
if (magnitudeMult == 0)
|
|
|
|
|
{
|
|
|
|
|
// Fully resisted, show message
|
|
|
|
|
if (target.getRefData().getHandle() == "player")
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicPCResisted}");
|
|
|
|
|
else
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicTargetResisted}");
|
|
|
|
|
}
|
|
|
|
|
// Fully resisted, show message
|
|
|
|
|
if (target.getRefData().getHandle() == "player")
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicPCResisted}");
|
|
|
|
|
else
|
|
|
|
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicTargetResisted}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|