float rateSpell(const ESM::Spell *spell, const MWWorld::Ptr &actor, const MWWorld::Ptr& target) { const CreatureStats& stats = actor.getClass().getCreatureStats(actor); if (MWMechanics::getSpellSuccessChance(spell, actor) == 0) return 0.f; if (spell->mData.mType != ESM::Spell::ST_Spell) return 0.f; // Don't make use of racial bonus spells, like MW. Can be made optional later if (actor.getClass().isNpc()) { std::string raceid = actor.get<ESM::NPC>()->mBase->mRace; const ESM::Race* race = MWBase::Environment::get().getWorld()->getStore().get<ESM::Race>().find(raceid); if (race->mPowers.exists(spell->mId)) return 0.f; } if (spell->mData.mCost > stats.getMagicka().getCurrent()) return 0.f; // Spells don't stack, so early out if the spell is still active on the target int types = getRangeTypes(spell->mEffects); if ((types & Self) && stats.getActiveSpells().isSpellActive(spell->mId)) return 0.f; if ( ((types & Touch) || (types & Target)) && target.getClass().getCreatureStats(target).getActiveSpells().isSpellActive(spell->mId)) return 0.f; return rateEffects(spell->mEffects, actor, target); }
float ActionSpell::getCombatRange (bool& isRanged) const { const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(mSpellId); int types = getRangeTypes(spell->mEffects); isRanged = (types & Target); return suggestCombatRange(types); }
void ActionEnchantedItem::getCombatRange(float& rangeAttack, float& rangeFollow) { const ESM::Enchantment* enchantment = MWBase::Environment::get().getWorld()->getStore().get<ESM::Enchantment>().find(mItem->getClass().getEnchantment(*mItem)); int types = getRangeTypes(enchantment->mEffects); suggestCombatRange(types, rangeAttack, rangeFollow); }
void ActionSpell::getCombatRange(float& rangeAttack, float& rangeFollow) { const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(mSpellId); int types = getRangeTypes(spell->mEffects); suggestCombatRange(types, rangeAttack, rangeFollow); }
float ActionEnchantedItem::getCombatRange(bool& isRanged) const { const ESM::Enchantment* enchantment = MWBase::Environment::get().getWorld()->getStore().get<ESM::Enchantment>().find(mItem->getClass().getEnchantment(*mItem)); int types = getRangeTypes(enchantment->mEffects); return suggestCombatRange(types); }