diff --git a/apps/openmw/mwscript/locals.cpp b/apps/openmw/mwscript/locals.cpp index 177536fe9..57584ac30 100644 --- a/apps/openmw/mwscript/locals.cpp +++ b/apps/openmw/mwscript/locals.cpp @@ -5,6 +5,7 @@ #include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/scriptmanager.hpp" @@ -75,65 +76,77 @@ namespace MWScript void Locals::write (ESM::Locals& locals, const std::string& script) const { - const Compiler::Locals& declarations = - MWBase::Environment::get().getScriptManager()->getLocals(script); - - for (int i=0; i<3; ++i) + try { - char type = 0; + const Compiler::Locals& declarations = + MWBase::Environment::get().getScriptManager()->getLocals(script); - switch (i) + for (int i=0; i<3; ++i) { - case 0: type = 's'; break; - case 1: type = 'l'; break; - case 2: type = 'f'; break; - } - - const std::vector& names = declarations.get (type); - - for (int i2=0; i2 (names.size()); ++i2) - { - ESM::Variant value; + char type = 0; switch (i) { - case 0: value.setType (ESM::VT_Int); value.setInteger (mShorts.at (i2)); break; - case 1: value.setType (ESM::VT_Int); value.setInteger (mLongs.at (i2)); break; - case 2: value.setType (ESM::VT_Float); value.setFloat (mFloats.at (i2)); break; + case 0: type = 's'; break; + case 1: type = 'l'; break; + case 2: type = 'f'; break; } - locals.mVariables.push_back (std::make_pair (names[i2], value)); + const std::vector& names = declarations.get (type); + + for (int i2=0; i2 (names.size()); ++i2) + { + ESM::Variant value; + + switch (i) + { + case 0: value.setType (ESM::VT_Int); value.setInteger (mShorts.at (i2)); break; + case 1: value.setType (ESM::VT_Int); value.setInteger (mLongs.at (i2)); break; + case 2: value.setType (ESM::VT_Float); value.setFloat (mFloats.at (i2)); break; + } + + locals.mVariables.push_back (std::make_pair (names[i2], value)); + } } } + catch (const Compiler::SourceException&) + { + } } void Locals::read (const ESM::Locals& locals, const std::string& script) { - const Compiler::Locals& declarations = - MWBase::Environment::get().getScriptManager()->getLocals(script); - - for (std::vector >::const_iterator iter - = locals.mVariables.begin(); iter!=locals.mVariables.end(); ++iter) + try { - char type = declarations.getType (iter->first); - char index = declarations.getIndex (iter->first); + const Compiler::Locals& declarations = + MWBase::Environment::get().getScriptManager()->getLocals(script); - try + for (std::vector >::const_iterator iter + = locals.mVariables.begin(); iter!=locals.mVariables.end(); ++iter) { - switch (type) - { - case 's': mShorts.at (index) = iter->second.getInteger(); break; - case 'l': mLongs.at (index) = iter->second.getInteger(); break; - case 'f': mFloats.at (index) = iter->second.getFloat(); break; + char type = declarations.getType (iter->first); + char index = declarations.getIndex (iter->first); - // silently ignore locals that don't exist anymore + try + { + switch (type) + { + case 's': mShorts.at (index) = iter->second.getInteger(); break; + case 'l': mLongs.at (index) = iter->second.getInteger(); break; + case 'f': mFloats.at (index) = iter->second.getFloat(); break; + + // silently ignore locals that don't exist anymore + } + } + catch (...) + { + // ignore type changes + /// \todo write to log } } - catch (...) - { - // ignore type changes - /// \todo write to log - } + } + catch (const Compiler::SourceException&) + { } } }