modified GlobalScripts data structures to accommodate targeted script data

This commit is contained in:
Marc Zinnschlag 2014-07-15 12:59:02 +02:00
parent 563c2e5730
commit 8241ee59c3
2 changed files with 40 additions and 31 deletions

View file

@ -15,6 +15,9 @@
namespace MWScript namespace MWScript
{ {
GlobalScriptDesc::GlobalScriptDesc() : mRunning (false) {}
GlobalScripts::GlobalScripts (const MWWorld::ESMStore& store) GlobalScripts::GlobalScripts (const MWWorld::ESMStore& store)
: mStore (store) : mStore (store)
{ {
@ -23,53 +26,53 @@ namespace MWScript
void GlobalScripts::addScript (const std::string& name) void GlobalScripts::addScript (const std::string& name)
{ {
std::map<std::string, std::pair<bool, Locals> >::iterator iter = std::map<std::string, GlobalScriptDesc>::iterator iter =
mScripts.find (::Misc::StringUtils::lowerCase (name)); mScripts.find (::Misc::StringUtils::lowerCase (name));
if (iter==mScripts.end()) if (iter==mScripts.end())
{ {
if (const ESM::Script *script = mStore.get<ESM::Script>().find (name)) if (const ESM::Script *script = mStore.get<ESM::Script>().find (name))
{ {
Locals locals; GlobalScriptDesc desc;
desc.mRunning = true;
desc.mLocals.configure (*script);
locals.configure (*script); mScripts.insert (std::make_pair (name, desc));
mScripts.insert (std::make_pair (name, std::make_pair (true, locals)));
} }
} }
else else
iter->second.first = true; iter->second.mRunning = true;
} }
void GlobalScripts::removeScript (const std::string& name) void GlobalScripts::removeScript (const std::string& name)
{ {
std::map<std::string, std::pair<bool, Locals> >::iterator iter = std::map<std::string, GlobalScriptDesc>::iterator iter =
mScripts.find (::Misc::StringUtils::lowerCase (name)); mScripts.find (::Misc::StringUtils::lowerCase (name));
if (iter!=mScripts.end()) if (iter!=mScripts.end())
iter->second.first = false; iter->second.mRunning = false;
} }
bool GlobalScripts::isRunning (const std::string& name) const bool GlobalScripts::isRunning (const std::string& name) const
{ {
std::map<std::string, std::pair<bool, Locals> >::const_iterator iter = std::map<std::string, GlobalScriptDesc>::const_iterator iter =
mScripts.find (::Misc::StringUtils::lowerCase (name)); mScripts.find (::Misc::StringUtils::lowerCase (name));
if (iter==mScripts.end()) if (iter==mScripts.end())
return false; return false;
return iter->second.first; return iter->second.mRunning;
} }
void GlobalScripts::run() void GlobalScripts::run()
{ {
for (std::map<std::string, std::pair<bool, Locals> >::iterator iter (mScripts.begin()); for (std::map<std::string, GlobalScriptDesc>::iterator iter (mScripts.begin());
iter!=mScripts.end(); ++iter) iter!=mScripts.end(); ++iter)
{ {
if (iter->second.first) if (iter->second.mRunning)
{ {
MWScript::InterpreterContext interpreterContext ( MWScript::InterpreterContext interpreterContext (
&iter->second.second, MWWorld::Ptr()); &iter->second.mLocals, MWWorld::Ptr());
MWBase::Environment::get().getScriptManager()->run (iter->first, interpreterContext); MWBase::Environment::get().getScriptManager()->run (iter->first, interpreterContext);
} }
} }
@ -99,16 +102,16 @@ namespace MWScript
void GlobalScripts::write (ESM::ESMWriter& writer, Loading::Listener& progress) const void GlobalScripts::write (ESM::ESMWriter& writer, Loading::Listener& progress) const
{ {
for (std::map<std::string, std::pair<bool, Locals> >::const_iterator iter (mScripts.begin()); for (std::map<std::string, GlobalScriptDesc>::const_iterator iter (mScripts.begin());
iter!=mScripts.end(); ++iter) iter!=mScripts.end(); ++iter)
{ {
ESM::GlobalScript script; ESM::GlobalScript script;
script.mId = iter->first; script.mId = iter->first;
iter->second.second.write (script.mLocals, iter->first); iter->second.mLocals.write (script.mLocals, iter->first);
script.mRunning = iter->second.first ? 1 : 0; script.mRunning = iter->second.mRunning ? 1 : 0;
writer.startRecord (ESM::REC_GSCR); writer.startRecord (ESM::REC_GSCR);
script.save (writer); script.save (writer);
@ -124,25 +127,24 @@ namespace MWScript
ESM::GlobalScript script; ESM::GlobalScript script;
script.load (reader); script.load (reader);
std::map<std::string, std::pair<bool, Locals> >::iterator iter = std::map<std::string, GlobalScriptDesc>::iterator iter =
mScripts.find (script.mId); mScripts.find (script.mId);
if (iter==mScripts.end()) if (iter==mScripts.end())
{ {
if (const ESM::Script *scriptRecord = mStore.get<ESM::Script>().search (script.mId)) if (const ESM::Script *scriptRecord = mStore.get<ESM::Script>().search (script.mId))
{ {
std::pair<bool, Locals> data (false, Locals()); GlobalScriptDesc desc;
desc.mLocals.configure (*scriptRecord);
data.second.configure (*scriptRecord); iter = mScripts.insert (std::make_pair (script.mId, desc)).first;
iter = mScripts.insert (std::make_pair (script.mId, data)).first;
} }
else // script does not exist anymore else // script does not exist anymore
return true; return true;
} }
iter->second.first = script.mRunning!=0; iter->second.mRunning = script.mRunning!=0;
iter->second.second.read (script.mLocals, script.mId); iter->second.mLocals.read (script.mLocals, script.mId);
return true; return true;
} }
@ -153,21 +155,19 @@ namespace MWScript
Locals& GlobalScripts::getLocals (const std::string& name) Locals& GlobalScripts::getLocals (const std::string& name)
{ {
std::string name2 = ::Misc::StringUtils::lowerCase (name); std::string name2 = ::Misc::StringUtils::lowerCase (name);
std::map<std::string, std::pair<bool, Locals> >::iterator iter = std::map<std::string, GlobalScriptDesc>::iterator iter = mScripts.find (name2);
mScripts.find (name2);
if (iter==mScripts.end()) if (iter==mScripts.end())
{ {
if (const ESM::Script *script = mStore.get<ESM::Script>().find (name)) if (const ESM::Script *script = mStore.get<ESM::Script>().find (name))
{ {
Locals locals; GlobalScriptDesc desc;
desc.mLocals.configure (*script);
locals.configure (*script); iter = mScripts.insert (std::make_pair (name, desc)).first;
iter = mScripts.insert (std::make_pair (name, std::make_pair (false, locals))).first;
} }
} }
return iter->second.second; return iter->second.mLocals;
} }
} }

View file

@ -26,10 +26,19 @@ namespace MWWorld
namespace MWScript namespace MWScript
{ {
struct GlobalScriptDesc
{
bool mRunning;
Locals mLocals;
std::string mId; // ID used to start targeted script (empty if not a targeted script)
GlobalScriptDesc();
};
class GlobalScripts class GlobalScripts
{ {
const MWWorld::ESMStore& mStore; const MWWorld::ESMStore& mStore;
std::map<std::string, std::pair<bool, Locals> > mScripts; // running, local variables std::map<std::string, GlobalScriptDesc> mScripts;
public: public: