From bd1a66887f00e186ab86a5195ebb3271ea732b38 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 5 Feb 2021 20:20:21 -0500 Subject: Created script system --- src/script_system.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/script_system.cpp (limited to 'src/script_system.cpp') diff --git a/src/script_system.cpp b/src/script_system.cpp new file mode 100644 index 0000000..7f4729b --- /dev/null +++ b/src/script_system.cpp @@ -0,0 +1,65 @@ +#include "script_system.h" +#include +#include "game.h" +#include "message_system.h" + +ScriptSystem::ScriptSystem(Game& game) : game_(game) { + engine_.open_libraries( + sol::lib::base, + sol::lib::coroutine, + sol::lib::math); + + engine_.new_usertype( + "message", + "displayMessage", &MessageSystem::displayMessage, + "hideCutsceneBars", &MessageSystem::hideCutsceneBars, + "isMessageActive", sol::property(&MessageSystem::isMessageActive)); + + engine_.set_function( + "message", + [&] () -> MessageSystem& { + return game_.getSystem(); + }); + + engine_.script_file("../res/scripts/common.lua"); +} + +void ScriptSystem::tick(double dt) { + if (callable_ && *callable_) { + auto result = (*callable_)(dt); + if (!result.valid()) { + sol::error e = result; + throw std::runtime_error(e.what()); + } + + if (!*callable_) { + callable_.reset(); + runner_.reset(); + } + } +} + +void ScriptSystem::runScript(std::string name) { + if (!loadedScripts_.count(name)) { + engine_.script_file("../res/scripts/" + name + ".lua"); + loadedScripts_.insert(name); + } + + runner_.reset(new sol::thread(sol::thread::create(engine_.lua_state()))); + callable_.reset(new sol::coroutine(runner_->state().get(name))); + + if (!*callable_) { + throw std::runtime_error("Error running script: " + name); + } + + auto result = (*callable_)(); + if (!result.valid()) { + sol::error e = result; + throw std::runtime_error(e.what()); + } + + if (!*callable_) { + callable_.reset(); + runner_.reset(); + } +} -- cgit 1.4.1