Merge remote-tracking branch 'scrawl/localscripts'

This commit is contained in:
Marc Zinnschlag 2016-02-04 13:49:43 +01:00
commit 11a4a31bfd
3 changed files with 21 additions and 29 deletions

View file

@ -69,11 +69,9 @@ void OMW::Engine::executeLocalScripts()
MWWorld::LocalScripts& localScripts = mEnvironment.getWorld()->getLocalScripts(); MWWorld::LocalScripts& localScripts = mEnvironment.getWorld()->getLocalScripts();
localScripts.startIteration(); localScripts.startIteration();
std::pair<std::string, MWWorld::Ptr> script;
while (!localScripts.isFinished()) while (localScripts.getNext(script))
{ {
std::pair<std::string, MWWorld::Ptr> script = localScripts.getNext();
MWScript::InterpreterContext interpreterContext ( MWScript::InterpreterContext interpreterContext (
&script.second.getRefData().getLocals(), script.second); &script.second.getRefData().getLocals(), script.second);
mEnvironment.getScriptManager()->run (script.first, interpreterContext); mEnvironment.getScriptManager()->run (script.first, interpreterContext);

View file

@ -76,32 +76,20 @@ void MWWorld::LocalScripts::startIteration()
mIter = mScripts.begin(); mIter = mScripts.begin();
} }
bool MWWorld::LocalScripts::isFinished() const bool MWWorld::LocalScripts::getNext(std::pair<std::string, Ptr>& script)
{ {
if (mIter==mScripts.end()) while (mIter!=mScripts.end())
return true;
if (!mIgnore.isEmpty() && mIter->second==mIgnore)
{ {
std::list<std::pair<std::string, Ptr> >::iterator iter = mIter; std::list<std::pair<std::string, Ptr> >::iterator iter = mIter++;
return ++iter==mScripts.end(); if (mIgnore.isEmpty() || iter->second!=mIgnore)
{
script = *iter;
return true;
}
} }
return false; return false;
} }
std::pair<std::string, MWWorld::Ptr> MWWorld::LocalScripts::getNext()
{
assert (!isFinished());
std::list<std::pair<std::string, Ptr> >::iterator iter = mIter++;
if (mIgnore.isEmpty() || iter->second!=mIgnore)
return *iter;
return getNext();
}
void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr) void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr)
{ {
if (const ESM::Script *script = mStore.get<ESM::Script>().search (scriptName)) if (const ESM::Script *script = mStore.get<ESM::Script>().search (scriptName))
@ -110,6 +98,14 @@ void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr)
{ {
ptr.getRefData().setLocals (*script); ptr.getRefData().setLocals (*script);
for (std::list<std::pair<std::string, Ptr> >::iterator iter = mScripts.begin(); iter!=mScripts.end(); ++iter)
if (iter->second==ptr)
{
std::cout << "warning, tried to add local script twice for " << ptr.getCellRef().getRefId() << std::endl;
remove(ptr);
break;
}
mScripts.push_back (std::make_pair (scriptName, ptr)); mScripts.push_back (std::make_pair (scriptName, ptr));
} }
catch (const std::exception& exception) catch (const std::exception& exception)

View file

@ -31,11 +31,9 @@ namespace MWWorld
void startIteration(); void startIteration();
///< Set the iterator to the begin of the script list. ///< Set the iterator to the begin of the script list.
bool isFinished() const; bool getNext(std::pair<std::string, Ptr>& script);
///< Is iteration finished? ///< Get next local script
/// @return Did we get a script?
std::pair<std::string, Ptr> getNext();
///< Get next local script (must not be called if isFinished())
void add (const std::string& scriptName, const Ptr& ptr); void add (const std::string& scriptName, const Ptr& ptr);
///< Add script to collection of active local scripts. ///< Add script to collection of active local scripts.