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/input_system.cpp | 4 +++- src/main.cpp | 2 ++ src/message_system.h | 2 ++ src/script_system.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/script_system.h | 32 +++++++++++++++++++++++++ src/system.h | 3 ++- 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/script_system.cpp create mode 100644 src/script_system.h (limited to 'src') diff --git a/src/input_system.cpp b/src/input_system.cpp index b70b377..6ddb59e 100644 --- a/src/input_system.cpp +++ b/src/input_system.cpp @@ -2,6 +2,7 @@ #include "game.h" #include "character_system.h" #include "message_system.h" +#include "script_system.h" struct Input { bool left = false; @@ -32,9 +33,10 @@ void InputSystem::tick(double dt) { } else { game_.getSystem().displayCutsceneBars(); }*/ - game_.getSystem().displayMessage("Some people always try to avoid fighting when there are enemies around. You know the type, right? They use the dash ability to zoom right by. I guess you could say they're followers of \"peace at any price\".", "Sparrow", SpeakerType::Woman); + //game_.getSystem().displayMessage("Some people always try to avoid fighting when there are enemies around. You know the type, right? They use the dash ability to zoom right by. I guess you could say they're followers of \"peace at any price\".", "Sparrow", SpeakerType::Woman); //game_.getSystem().displayMessage("Lucas. You're awful at hide-and-seek, you know that? Try harder.", "Kumatora", SpeakerType::Woman); //game_.getSystem().displayMessage("Hi Tooth! I hope you're having a good day.", "Lucas", SpeakerType::Boy); + game_.getSystem().runScript("script0001"); } else if (e.key.keysym.sym == SDLK_b) { // TODO: Remove this, it's just for testing. game_.getSystem().advanceText(); diff --git a/src/main.cpp b/src/main.cpp index 935fc78..8f23881 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "character_system.h" #include "input_system.h" #include "message_system.h" +#include "script_system.h" void loop(Renderer& renderer) { Game game(renderer); @@ -19,6 +20,7 @@ void loop(Renderer& renderer) { game.emplaceSystem(); game.emplaceSystem(); game.emplaceSystem(); + game.emplaceSystem(); auto map = std::make_unique("../res/map1.tmx", renderer); game.setMap(std::move(map)); diff --git a/src/message_system.h b/src/message_system.h index 93ca087..85ecd65 100644 --- a/src/message_system.h +++ b/src/message_system.h @@ -51,6 +51,8 @@ public: const std::list& getLines() const { return linesToShow_; } + bool isMessageActive() const { return !linesToShow_.empty(); } + const std::string& getSpeaker() const { return speakerName_; } bool isNextArrowShowing() const { return showNextArrow_; } 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(); + } +} diff --git a/src/script_system.h b/src/script_system.h new file mode 100644 index 0000000..2832576 --- /dev/null +++ b/src/script_system.h @@ -0,0 +1,32 @@ +#ifndef SCRIPT_SYSTEM_H_FD8A95B3 +#define SCRIPT_SYSTEM_H_FD8A95B3 + +#include +#include +#include +#include +#include "system.h" + +class Game; + +class ScriptSystem : public System { +public: + + static constexpr SystemKey Key = SystemKey::Script; + + explicit ScriptSystem(Game& game); + + void tick(double dt) override; + + void runScript(std::string name); + +private: + + Game& game_; + sol::state engine_; + std::unique_ptr runner_; + std::unique_ptr callable_; + std::set loadedScripts_; +}; + +#endif /* end of include guard: SCRIPT_SYSTEM_H_FD8A95B3 */ diff --git a/src/system.h b/src/system.h index 298c5f8..218dc60 100644 --- a/src/system.h +++ b/src/system.h @@ -7,7 +7,8 @@ enum class SystemKey { Character, Animation, Camera, - Message + Message, + Script }; class System { -- cgit 1.4.1