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; }
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); } } } } } }
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())); } } }
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; }