Merge remote-tracking branch 'zini/master' into animation2

This commit is contained in:
Chris Robinson 2013-02-24 06:20:10 -08:00
commit 94be45e07e
3 changed files with 49 additions and 25 deletions

View file

@ -139,28 +139,45 @@ namespace MWScript
} }
Compiler::Locals& ScriptManager::getLocals (const std::string& name) Compiler::Locals& ScriptManager::getLocals (const std::string& name)
{
{ {
ScriptCollection::iterator iter = mScripts.find (name); ScriptCollection::iterator iter = mScripts.find (name);
if (iter==mScripts.end()) if (iter!=mScripts.end())
{
if (!compile (name))
{
/// \todo Handle case of cyclic member variable access. Currently this could look up
/// the whole application in an endless recursion.
// failed -> ignore script from now on.
std::vector<Interpreter::Type_Code> empty;
mScripts.insert (std::make_pair (name, std::make_pair (empty, Compiler::Locals())));
throw std::runtime_error ("failed to compile script " + name);
}
iter = mScripts.find (name);
}
return iter->second.second; return iter->second.second;
} }
{
std::map<std::string, Compiler::Locals>::iterator iter = mOtherLocals.find (name);
if (iter!=mOtherLocals.end())
return iter->second;
}
Compiler::Locals locals;
if (const ESM::Script *script = mStore.get<ESM::Script>().find (name))
{
int index = 0;
for (int i=0; i<script->mData.mNumShorts; ++i)
locals.declare ('s', script->mVarNames[index++]);
for (int i=0; i<script->mData.mNumLongs; ++i)
locals.declare ('l', script->mVarNames[index++]);
for (int i=0; i<script->mData.mNumFloats; ++i)
locals.declare ('f', script->mVarNames[index++]);
std::map<std::string, Compiler::Locals>::iterator iter =
mOtherLocals.insert (std::make_pair (name, locals)).first;
return iter->second;
}
throw std::logic_error ("script " + name + " does not exist");
}
GlobalScripts& ScriptManager::getGlobalScripts() GlobalScripts& ScriptManager::getGlobalScripts()
{ {
return mGlobalScripts; return mGlobalScripts;

View file

@ -47,6 +47,7 @@ namespace MWScript
ScriptCollection mScripts; ScriptCollection mScripts;
GlobalScripts mGlobalScripts; GlobalScripts mGlobalScripts;
std::map<std::string, Compiler::Locals> mOtherLocals;
public: public:

View file

@ -220,9 +220,15 @@ namespace MWWorld
template <> template <>
inline void Store<ESM::Dialogue>::load(ESM::ESMReader &esm, const std::string &id) { inline void Store<ESM::Dialogue>::load(ESM::ESMReader &esm, const std::string &id) {
std::string idLower = Misc::StringUtils::lowerCase(id); std::string idLower = Misc::StringUtils::lowerCase(id);
mStatic[idLower] = ESM::Dialogue();
mStatic[idLower].mId = id; // don't smash case here, as this line is printed... I think std::map<std::string, ESM::Dialogue>::iterator it = mStatic.find(idLower);
mStatic[idLower].load(esm); if (it == mStatic.end()) {
it = mStatic.insert( std::make_pair( idLower, ESM::Dialogue() ) ).first;
it->second.mId = id; // don't smash case here, as this line is printed... I think
}
//I am not sure is it need to load the dialog from a plugin if it was already loaded from prevois plugins
it->second.load(esm);
} }
template <> template <>