Esempio n. 1
0
    bool ActiveSpells::addSpell (const std::string& id)
    {
        const ESM::EffectList& effects = getEffectList (id);

        bool found = false;

        for (std::vector<ESM::ENAMstruct>::const_iterator iter (effects.list.begin());
            iter!=effects.list.end(); ++iter)
        {
            if (iter->duration)
            {
                found = true;
                break;
            }
        }

        if (!found)
            return false;

        TContainer::iterator iter = mSpells.find (id);

        float random = static_cast<float> (std::rand()) / RAND_MAX;

        if (iter==mSpells.end())
            mSpells.insert (std::make_pair (id,
                std::make_pair (MWBase::Environment::get().getWorld()->getTimeStamp(), random)));
        else
            iter->second = std::make_pair (MWBase::Environment::get().getWorld()->getTimeStamp(), random);

        mSpellsChanged = true;

        return true;
    }
Esempio n. 2
0
    void ActiveSpells::update() const
    {
        bool rebuild = false;

        MWWorld::TimeStamp now = MWBase::Environment::get().getWorld()->getTimeStamp();

        if (mLastUpdate!=now)
        {
            TContainer::iterator iter (mSpells.begin());
            while (iter!=mSpells.end())
                if (!timeToExpire (iter))
                {
                    mSpells.erase (iter++);
                    rebuild = true;
                }
                else
                    ++iter;

            mLastUpdate = now;
        }

        if (mSpellsChanged)
        {
            mSpellsChanged = false;
            rebuild = true;
        }

        if (rebuild)
        {
            mEffects = MagicEffects();

            for (TIterator iter (begin()); iter!=end(); ++iter)
            {
                const ESM::EffectList& effects = getEffectList (iter->first);

                const MWWorld::TimeStamp& start = iter->second.first;
                float magnitude = iter->second.second;

                for (std::vector<ESM::ENAMstruct>::const_iterator iter (effects.list.begin());
                    iter!=effects.list.end(); ++iter)
                {
                    if (iter->duration)
                    {
                        MWWorld::TimeStamp end = start;
                        end += static_cast<double> (iter->duration)*
                            MWBase::Environment::get().getWorld()->getTimeScaleFactor()/(60*60);

                        if (end>now)
                        {
                            EffectParam param;
                            param.mMagnitude = static_cast<int> (
                                (iter->magnMax-iter->magnMin+1)*magnitude + iter->magnMin);
                            mEffects.add (*iter, param);
                        }
                    }
                }
            }
        }
    }
Esempio n. 3
0
void EffectGroup::changed(ConstFieldMaskArg whichField, 
                            UInt32            origin,
                            BitVector         details)
{
    Inherited::changed(whichField, origin, details);

    if((whichField & EffectListFieldMask) || (whichField & ParentSceneObjectFieldMask))
    {
        for(UInt32 i(0); i < getMFEffectList()->size(); ++i)
        {
            getEffectList(i)->setParentSceneObject(const_cast<SceneObject*>(getParentSceneObject()));
        }
    }
}
Esempio n. 4
0
    double ActiveSpells::timeToExpire (const TIterator& iterator) const
    {
        const ESM::EffectList& effects = getEffectList (iterator->first);

        int duration = 0;

        for (std::vector<ESM::ENAMstruct>::const_iterator iter (effects.list.begin());
            iter!=effects.list.end(); ++iter)
        {
            if (iter->duration>duration)
                duration = iter->duration;
        }

        double scaledDuration = duration *
              MWBase::Environment::get().getWorld()->getTimeScaleFactor()/(60*60);

        double usedUp = MWBase::Environment::get().getWorld()->getTimeStamp()-iterator->second.first;

        if (usedUp>=scaledDuration)
            return 0;

        return scaledDuration-usedUp;
    }