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-tes3mp/apps/openmw/mwscript/compilercontext.cpp

100 lines
3.2 KiB
C++

#include "compilercontext.hpp"
#include "../mwworld/esmstore.hpp"
#include <components/esm/loaddial.hpp>
#include <components/compiler/locals.hpp>
#include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/scriptmanager.hpp"
#include "../mwworld/ptr.hpp"
#include "../mwworld/class.hpp"
#include "../mwworld/manualref.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 std::string& id) const
{
std::string script;
bool reference = false;
if (const ESM::Script *scriptRecord =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Script>().search (id))
{
script = scriptRecord->mId;
}
else
{
MWWorld::ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), 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 std::string& name) const
{
const MWWorld::ESMStore &store =
MWBase::Environment::get().getWorld()->getStore();
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);
}
bool CompilerContext::isJournalId (const std::string& name) const
{
const MWWorld::ESMStore &store =
MWBase::Environment::get().getWorld()->getStore();
const ESM::Dialogue *topic = store.get<ESM::Dialogue>().search (name);
return topic && topic->mType==ESM::Dialogue::Journal;
}
}