From b39f35d805c975334d80f4c04282467bc0dff444 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 29 Jul 2020 18:43:56 +0200 Subject: [PATCH] inherit variables --- apps/openmw/mwscript/globalscripts.cpp | 9 +++++++++ apps/openmw/mwscript/globalscripts.hpp | 2 ++ apps/openmw/mwscript/locals.cpp | 27 ++++++++++++++++++-------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwscript/globalscripts.cpp b/apps/openmw/mwscript/globalscripts.cpp index a7865f0ae..41f153b28 100644 --- a/apps/openmw/mwscript/globalscripts.cpp +++ b/apps/openmw/mwscript/globalscripts.cpp @@ -299,6 +299,15 @@ namespace MWScript return iter->second->mLocals; } + const Locals* GlobalScripts::getLocalsIfPresent (const std::string& name) const + { + std::string name2 = ::Misc::StringUtils::lowerCase (name); + auto iter = mScripts.find (name2); + if (iter==mScripts.end()) + return nullptr; + return &iter->second->mLocals; + } + void GlobalScripts::updatePtrs(const MWWorld::Ptr& base, const MWWorld::Ptr& updated) { MatchPtrVisitor visitor(base); diff --git a/apps/openmw/mwscript/globalscripts.hpp b/apps/openmw/mwscript/globalscripts.hpp index 36d89a7eb..c5c5a9a45 100644 --- a/apps/openmw/mwscript/globalscripts.hpp +++ b/apps/openmw/mwscript/globalscripts.hpp @@ -82,6 +82,8 @@ namespace MWScript ///< If the script \a name has not been added as a global script yet, it is added /// automatically, but is not set to running state. + const Locals* getLocalsIfPresent (const std::string& name) const; + void updatePtrs(const MWWorld::Ptr& base, const MWWorld::Ptr& updated); ///< Update the Ptrs stored in mTarget. Should be called after the reference has been moved to a new cell. }; diff --git a/apps/openmw/mwscript/locals.cpp b/apps/openmw/mwscript/locals.cpp index 699200590..381d73ec8 100644 --- a/apps/openmw/mwscript/locals.cpp +++ b/apps/openmw/mwscript/locals.cpp @@ -1,4 +1,5 @@ #include "locals.hpp" +#include "globalscripts.hpp" #include #include @@ -33,15 +34,25 @@ namespace MWScript if (mInitialised) return false; - const Compiler::Locals& locals = - MWBase::Environment::get().getScriptManager()->getLocals (script.mId); + const Locals* global = MWBase::Environment::get().getScriptManager()->getGlobalScripts().getLocalsIfPresent(script.mId); + if(global) + { + mShorts = global->mShorts; + mLongs = global->mLongs; + mFloats = global->mFloats; + } + else + { + const Compiler::Locals& locals = + MWBase::Environment::get().getScriptManager()->getLocals (script.mId); - mShorts.clear(); - mShorts.resize (locals.get ('s').size(), 0); - mLongs.clear(); - mLongs.resize (locals.get ('l').size(), 0); - mFloats.clear(); - mFloats.resize (locals.get ('f').size(), 0); + mShorts.clear(); + mShorts.resize (locals.get ('s').size(), 0); + mLongs.clear(); + mLongs.resize (locals.get ('l').size(), 0); + mFloats.clear(); + mFloats.resize (locals.get ('f').size(), 0); + } mInitialised = true; return true;