Files
simian/include/scripting/ScriptEngine.h
T
nick 8c2ce637a2
CI / build-and-test (push) Failing after 14m23s
feat: autoload script
2026-03-11 15:58:51 +13:00

58 lines
2.6 KiB
C++

#pragma once
#include "angelscript.h"
#include "scriptbuilder.h"
#include <string>
#include <vector>
class ScriptEngine {
public:
ScriptEngine();
~ScriptEngine();
bool Initialize();
void Shutdown();
bool CompileScript(const std::string& filename);
bool CompileModule(const std::string& moduleName, const std::string& filename, asIScriptModule** outModule);
bool CallModuleFunction(asIScriptModule* module, const std::string& decl);
void CallScriptFunction(asIScriptFunction* func, float dt = 0.0f);
void CallScriptFunction(asIScriptFunction* func, unsigned int entityId, float dt);
void GarbageCollect();
// Add a path used to resolve #include directives in scripts
void AddIncludePath(const std::string& path);
// Try to preserve script state across hot-reloads by calling optional
// __SerializeState()/__DeserializeState() hooks in the script module.
std::string CaptureScriptState();
void RestoreScriptState(const std::string &state);
asIScriptEngine* GetEngine() const { return engine; }
asIScriptModule* GetCurrentModule() const { return currentModule; }
asIScriptFunction* GetUpdateFunction() const { return updateFunc; }
asIScriptFunction* GetInitFunction() const { return initFunc; }
asIScriptFunction* GetShutdownFunction() const { return shutdownFunc; }
// Create and release script object instances for entity scripts
asIScriptObject* CreateObjectInstance(asIScriptModule* module, const std::string& className);
void ReleaseObjectInstance(asIScriptObject* obj);
// Retrieve an object's method by declaration (e.g. "void Update(uint, float)")
asIScriptFunction* GetObjectMethod(asIScriptModule* module, const std::string& className, const std::string& methodDecl);
// Call an object method; method must be an object method (use GetObjectMethod)
void CallObjectMethod(asIScriptFunction* method, asIScriptObject* object, unsigned int entityId, float dt);
// Call a scene object method (Init/Update/Shutdown) without entity id
void CallSceneObjectMethod(asIScriptFunction* method, asIScriptObject* object, float dt = 0.0f);
private:
asIScriptEngine* engine;
asIScriptFunction* updateFunc;
asIScriptFunction* initFunc;
asIScriptFunction* shutdownFunc;
asIScriptModule* currentModule;
bool hasValidScript;
std::vector<std::string> includePaths;
static void MessageCallback(const asSMessageInfo* msg, void* param);
static int IncludeCallback(const char* include, const char* from, CScriptBuilder* builder, void* userParam);
std::string ReadFile(const std::string& filename);
void ClearCachedFunctions();
};