mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-03 19:45:34 +00:00
Make magic effects with no corresponding resistance attribute unresistable (Fixes #1727)
This commit is contained in:
parent
0f1451babd
commit
175cc98e64
2 changed files with 20 additions and 11 deletions
|
@ -72,7 +72,7 @@ namespace MWMechanics
|
||||||
return schoolSkillMap[school];
|
return schoolSkillMap[school];
|
||||||
}
|
}
|
||||||
|
|
||||||
float getSpellSuccessChance (const ESM::Spell* spell, const MWWorld::Ptr& actor, int* effectiveSchool)
|
float getSpellSuccessChance (const ESM::Spell* spell, const MWWorld::Ptr& actor, int* effectiveSchool, bool cap)
|
||||||
{
|
{
|
||||||
CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
||||||
|
|
||||||
|
@ -123,14 +123,17 @@ namespace MWMechanics
|
||||||
if (MWBase::Environment::get().getWorld()->getGodModeState() && actor.getRefData().getHandle() == "player")
|
if (MWBase::Environment::get().getWorld()->getGodModeState() && actor.getRefData().getHandle() == "player")
|
||||||
castChance = 100;
|
castChance = 100;
|
||||||
|
|
||||||
return std::max(0.f, std::min(100.f, castChance));
|
if (!cap)
|
||||||
|
return std::max(0.f, castChance);
|
||||||
|
else
|
||||||
|
return std::max(0.f, std::min(100.f, castChance));
|
||||||
}
|
}
|
||||||
|
|
||||||
float getSpellSuccessChance (const std::string& spellId, const MWWorld::Ptr& actor, int* effectiveSchool)
|
float getSpellSuccessChance (const std::string& spellId, const MWWorld::Ptr& actor, int* effectiveSchool, bool cap)
|
||||||
{
|
{
|
||||||
const ESM::Spell* spell =
|
const ESM::Spell* spell =
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
|
||||||
return getSpellSuccessChance(spell, actor, effectiveSchool);
|
return getSpellSuccessChance(spell, actor, effectiveSchool, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -184,6 +187,10 @@ namespace MWMechanics
|
||||||
float resisted = 0;
|
float resisted = 0;
|
||||||
if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful)
|
if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful)
|
||||||
{
|
{
|
||||||
|
// Effects with no resistance attribute belonging to them can not be resisted
|
||||||
|
if (ESM::MagicEffect::getResistanceEffect(effectId) == -1)
|
||||||
|
return 0.f;
|
||||||
|
|
||||||
float resistance = getEffectResistanceAttribute(effectId, magicEffects);
|
float resistance = getEffectResistanceAttribute(effectId, magicEffects);
|
||||||
|
|
||||||
float willpower = stats.getAttribute(ESM::Attribute::Willpower).getModified();
|
float willpower = stats.getAttribute(ESM::Attribute::Willpower).getModified();
|
||||||
|
@ -191,12 +198,13 @@ namespace MWMechanics
|
||||||
float x = (willpower + 0.1 * luck) * stats.getFatigueTerm();
|
float x = (willpower + 0.1 * luck) * stats.getFatigueTerm();
|
||||||
|
|
||||||
// This makes spells that are easy to cast harder to resist and vice versa
|
// This makes spells that are easy to cast harder to resist and vice versa
|
||||||
|
float castChance = 100.f;
|
||||||
if (spell != NULL && !caster.isEmpty() && caster.getClass().isActor())
|
if (spell != NULL && !caster.isEmpty() && caster.getClass().isActor())
|
||||||
{
|
{
|
||||||
float castChance = getSpellSuccessChance(spell, caster);
|
castChance = getSpellSuccessChance(spell, caster, NULL, false); // Uncapped casting chance
|
||||||
if (castChance > 0)
|
|
||||||
x *= 50 / castChance;
|
|
||||||
}
|
}
|
||||||
|
if (castChance > 0)
|
||||||
|
x *= 50 / castChance;
|
||||||
|
|
||||||
float roll = static_cast<float>(std::rand()) / RAND_MAX * 100;
|
float roll = static_cast<float>(std::rand()) / RAND_MAX * 100;
|
||||||
if (magicEffect->mData.mFlags & ESM::MagicEffect::NoMagnitude)
|
if (magicEffect->mData.mFlags & ESM::MagicEffect::NoMagnitude)
|
||||||
|
|
|
@ -26,11 +26,12 @@ namespace MWMechanics
|
||||||
* @param spell spell to cast
|
* @param spell spell to cast
|
||||||
* @param actor calculate spell success chance for this actor (depends on actor's skills)
|
* @param actor calculate spell success chance for this actor (depends on actor's skills)
|
||||||
* @param effectiveSchool the spell's effective school (relevant for skill progress) will be written here
|
* @param effectiveSchool the spell's effective school (relevant for skill progress) will be written here
|
||||||
* @attention actor has to be an NPC and not a creature!
|
* @param cap cap the result to 100%?
|
||||||
* @return success chance from 0 to 100 (in percent)
|
* @note actor can be an NPC or a creature
|
||||||
|
* @return success chance from 0 to 100 (in percent), if cap=false then chance above 100 may be returned.
|
||||||
*/
|
*/
|
||||||
float getSpellSuccessChance (const ESM::Spell* spell, const MWWorld::Ptr& actor, int* effectiveSchool = NULL);
|
float getSpellSuccessChance (const ESM::Spell* spell, const MWWorld::Ptr& actor, int* effectiveSchool = NULL, bool cap=true);
|
||||||
float getSpellSuccessChance (const std::string& spellId, const MWWorld::Ptr& actor, int* effectiveSchool = NULL);
|
float getSpellSuccessChance (const std::string& spellId, const MWWorld::Ptr& actor, int* effectiveSchool = NULL, bool cap=true);
|
||||||
|
|
||||||
int getSpellSchool(const std::string& spellId, const MWWorld::Ptr& actor);
|
int getSpellSchool(const std::string& spellId, const MWWorld::Ptr& actor);
|
||||||
int getSpellSchool(const ESM::Spell* spell, const MWWorld::Ptr& actor);
|
int getSpellSchool(const ESM::Spell* spell, const MWWorld::Ptr& actor);
|
||||||
|
|
Loading…
Reference in a new issue