#pragma once #include #include #include #include "quest/QuestJournal.h" #include "external/nlohmann/json.hpp" #include "ISaveable.h" namespace ZL { class Location; class Inventory; class ScriptEngine : public ISaveable { public: ScriptEngine(); ~ScriptEngine(); // Must be called once, after the Game's NPCs are ready. void init(Location* game, Inventory* inventory, const std::string& scriptPath); // Execute a Lua script file. Logs errors to stderr. void runScript(const std::string& path); void callItemPickupCallback(const std::string& objectName); void callActivateFunction(const std::string& functionName); void callNpcInteractCallback(int npcIndex); void callTriggerEnterCallback(const std::string& zoneId); void callTriggerExitCallback(const std::string& zoneId); // Fired when the player (moving) physically bumps into a standing NPC. void callNpcBumpedByPlayerCallback(int npcIndex); // Fired when a moving NPC physically bumps into the standing player. void callNpcBumpsPlayerCallback(int npcIndex); void setGlobalStore(std::unordered_map* store); void setGlobalFloatStore(std::unordered_map* store); void setQuestJournal(Quest::QuestJournal* journal); void callLocationEnterCallback(); void callLocationExitCallback(); void callDarklandsEnterCallback(); void callDarklandsExitCallback(); void callTriggerNightEnterCallback(); void callCutsceneCompleteCallback(const std::string& cutsceneId); void callChatOpenCallback(int chatIndex); void callCallTaxiCallback(); // Serialise all Lua global scalars (numbers, strings, booleans) to JSON. // Complex types (functions, tables, userdata) are skipped — they are recreated // by re-running the script on load. void saveScriptGlobals(nlohmann::json& out) const; // Restore previously saved scalar globals. Call after init() so the script // has already run and registered all callbacks. void loadScriptGlobals(const nlohmann::json& in); void save(nlohmann::json& out) const override { saveScriptGlobals(out); } void load(const nlohmann::json& in) override { loadScriptGlobals(in); } private: struct Impl; std::unique_ptr impl; }; } // namespace ZL