Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
 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);
 }