1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-29 00:32:49 +00:00
OpenMW/apps/openmw/mwscript/scriptmanagerimp.hpp
florent.teppe 65cdd489fb create a specific esm reader function for RefID to avoid allocation for string and then again for RefId
Fixed some types

removed useless header

applied clang format

fixed compile tests

fixed clang tidy, and closer to logic before this MR

Removed hardcoded refids

unless there is a returned value we don't use static RefIds
can use == between RefId and hardcoded string

Fix clang format

Fixed a few instances where std::string was used, when only const std::string& was needed

removed unused variable
2022-12-27 19:15:57 +01:00

92 lines
2.4 KiB
C++

#ifndef GAME_SCRIPT_SCRIPTMANAGER_H
#define GAME_SCRIPT_SCRIPTMANAGER_H
#include <map>
#include <set>
#include <string>
#include <components/compiler/fileparser.hpp>
#include <components/compiler/streamerrorhandler.hpp>
#include <components/interpreter/interpreter.hpp>
#include <components/interpreter/types.hpp>
#include <components/esm/refid.hpp>
#include "../mwbase/scriptmanager.hpp"
#include "globalscripts.hpp"
namespace MWWorld
{
class ESMStore;
}
namespace Compiler
{
class Context;
}
namespace Interpreter
{
class Context;
class Interpreter;
}
namespace MWScript
{
class ScriptManager : public MWBase::ScriptManager
{
Compiler::StreamErrorHandler mErrorHandler;
const MWWorld::ESMStore& mStore;
Compiler::Context& mCompilerContext;
Compiler::FileParser mParser;
Interpreter::Interpreter mInterpreter;
bool mOpcodesInstalled;
struct CompiledScript
{
std::vector<Interpreter::Type_Code> mByteCode;
Compiler::Locals mLocals;
std::set<ESM::RefId> mInactive;
CompiledScript(const std::vector<Interpreter::Type_Code>& code, const Compiler::Locals& locals)
: mByteCode(code)
, mLocals(locals)
{
}
};
std::unordered_map<ESM::RefId, CompiledScript> mScripts;
GlobalScripts mGlobalScripts;
std::unordered_map<ESM::RefId, Compiler::Locals> mOtherLocals;
std::vector<std::string> mScriptBlacklist;
public:
ScriptManager(const MWWorld::ESMStore& store, Compiler::Context& compilerContext, int warningsMode,
const std::vector<std::string>& scriptBlacklist);
void clear() override;
bool run(const ESM::RefId& name, Interpreter::Context& interpreterContext) override;
///< Run the script with the given name (compile first, if not compiled yet)
bool compile(const ESM::RefId& name) override;
///< Compile script with the given namen
/// \return Success?
std::pair<int, int> compileAll() override;
///< Compile all scripts
/// \return count, success
const Compiler::Locals& getLocals(const ESM::RefId& name) override;
///< Return locals for script \a name.
GlobalScripts& getGlobalScripts() override;
const Compiler::Extensions& getExtensions() const override;
};
}
#endif