You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/apps/openmw/mwscript/compilercontext.cpp

96 lines
3.5 KiB
C++

#include "compilercontext.hpp"
#include "../mwworld/esmstore.hpp"
#include <components/compiler/locals.hpp>
#include <components/esm/refid.hpp>
#include <components/esm3/loadacti.hpp>
#include <components/esm3/loadalch.hpp>
#include <components/esm3/loadappa.hpp>
#include <components/esm3/loadarmo.hpp>
#include <components/esm3/loadbook.hpp>
#include <components/esm3/loadclot.hpp>
#include <components/esm3/loadcont.hpp>
#include <components/esm3/loadcrea.hpp>
#include <components/esm3/loaddoor.hpp>
#include <components/esm3/loadingr.hpp>
#include <components/esm3/loadlevlist.hpp>
#include <components/esm3/loadligh.hpp>
#include <components/esm3/loadlock.hpp>
#include <components/esm3/loadmisc.hpp>
#include <components/esm3/loadnpc.hpp>
#include <components/esm3/loadprob.hpp>
#include <components/esm3/loadrepa.hpp>
#include <components/esm3/loadscpt.hpp>
#include <components/esm3/loadstat.hpp>
#include <components/esm3/loadweap.hpp>
#include "../mwbase/environment.hpp"
#include "../mwbase/scriptmanager.hpp"
#include "../mwbase/world.hpp"
#include "../mwworld/class.hpp"
#include "../mwworld/manualref.hpp"
#include "../mwworld/ptr.hpp"
namespace MWScript
{
CompilerContext::CompilerContext(Type type)
: mType(type)
{
}
bool CompilerContext::canDeclareLocals() const
{
return mType == Type_Full;
}
char CompilerContext::getGlobalType(const std::string& name) const
{
return MWBase::Environment::get().getWorld()->getGlobalVariableType(name);
}
std::pair<char, bool> CompilerContext::getMemberType(const std::string& name, const ESM::RefId& id) const
{
ESM::RefId script;
bool reference = false;
if (const ESM::Script* scriptRecord = MWBase::Environment::get().getESMStore()->get<ESM::Script>().search(id))
{
script = scriptRecord->mId;
}
else
{
MWWorld::ManualRef ref(*MWBase::Environment::get().getESMStore(), id);
script = ref.getPtr().getClass().getScript(ref.getPtr());
reference = true;
}
char type = ' ';
if (!script.empty())
type = MWBase::Environment::get().getScriptManager()->getLocals(script).getType(
Misc::StringUtils::lowerCase(name));
return std::make_pair(type, reference);
}
bool CompilerContext::isId(const ESM::RefId& name) const
{
const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore();
return store.get<ESM::Activator>().search(name) || store.get<ESM::Potion>().search(name)
|| store.get<ESM::Apparatus>().search(name) || store.get<ESM::Armor>().search(name)
|| store.get<ESM::Book>().search(name) || store.get<ESM::Clothing>().search(name)
|| store.get<ESM::Container>().search(name) || store.get<ESM::Creature>().search(name)
|| store.get<ESM::Door>().search(name) || store.get<ESM::Ingredient>().search(name)
|| store.get<ESM::CreatureLevList>().search(name) || store.get<ESM::ItemLevList>().search(name)
|| store.get<ESM::Light>().search(name) || store.get<ESM::Lockpick>().search(name)
|| store.get<ESM::Miscellaneous>().search(name) || store.get<ESM::NPC>().search(name)
|| store.get<ESM::Probe>().search(name) || store.get<ESM::Repair>().search(name)
|| store.get<ESM::Static>().search(name) || store.get<ESM::Weapon>().search(name)
|| store.get<ESM::Script>().search(name);
}
}