From 2d5821d0bb87cc23afc8ba3f345a6fad6bc88126 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 18 Apr 2020 00:31:08 +0200 Subject: [PATCH] Add scripting compatibility for plutonium --- src/game/scripting/context_initializer.cpp | 185 ++++----------------- src/game/scripting/executer.cpp | 5 + src/game/scripting/executer.hpp | 2 + 3 files changed, 38 insertions(+), 154 deletions(-) diff --git a/src/game/scripting/context_initializer.cpp b/src/game/scripting/context_initializer.cpp index 413a5e8..46d20d4 100644 --- a/src/game/scripting/context_initializer.cpp +++ b/src/game/scripting/context_initializer.cpp @@ -1,11 +1,13 @@ #include "std_include.hpp" #include "context_initializer.hpp" +#include "utils/string.hpp" + namespace game::scripting::context_initializer { void initialize_entity(context* context) { - const auto chai = context->get_chai(); + auto* const chai = context->get_chai(); chai->add(chaiscript::user_type(), "_entity"); chai->add(chaiscript::constructor(), "_entity"); @@ -54,173 +56,48 @@ namespace game::scripting::context_initializer return context->get_event_handler()->add_event_listener(listener); }), "onNotify"); - // Notification - chai->add(chaiscript::fun(&entity::notify), "vectorNotify"); - chai->add(chaiscript::fun([](const entity& ent, const std::string& event) + chai->add_global(chaiscript::Boxed_Value(0), "gsc"); + + chai->add(chaiscript::fun([context](const entity& entity, const std::string& function, + const std::vector& arguments) { - return ent.notify(event, {}); - }), "notify"); + const auto function_lower = utils::string::to_lower(function); - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& event, - const chaiscript::Boxed_Value& a1) - { - return ent.notify(event, {a1}); - }), "notify"); + if (function_lower == "notify" && !arguments.empty()) + { + const auto real_arguments = std::vector( + arguments.begin() + 1, arguments.end()); - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& event, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2) - { - return ent.notify(event, {a1, a2}); - }), "notify"); + entity.notify(chaiscript::boxed_cast(arguments[0]), real_arguments); + } + else if (context->get_executer()->function_exists(function_lower, false)) + { + return entity.call(function_lower, arguments); + } - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& event, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3) - { - return ent.notify(event, {a1, a2, a3}); - }), "notify"); + return chaiscript::Boxed_Value(0); + }), "method_missing"); - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& event, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4) - { - return ent.notify(event, {a1, a2, a3, a4}); - }), "notify"); - - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& event, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4, - const chaiscript::Boxed_Value& a5) - { - return ent.notify(event, {a1, a2, a3, a4, a5}); - }), "notify"); - - // Instance call - chai->add(chaiscript::fun(&entity::call), "vectorCall"); - chai->add(chaiscript::fun([](const entity& ent, const std::string& function) + chai->add(chaiscript::fun([context](const chaiscript::Boxed_Value&/*object*/, + const std::string& function, + const std::vector& arguments) { - return ent.call(function, {}); - }), "call"); + const auto function_lower = utils::string::to_lower(function); - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& function, - const chaiscript::Boxed_Value& a1) - { - return ent.call(function, {a1}); - }), "call"); + if (context->get_executer()->function_exists(function_lower, true)) + { + return context->get_executer()->call(function_lower, 0, arguments); + } - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2) - { - return ent.call(function, {a1, a2}); - }), "call"); - - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3) - { - return ent.call(function, {a1, a2, a3}); - }), "call"); - - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4) - { - return ent.call(function, {a1, a2, a3, a4}); - }), "call"); - - chai->add(chaiscript::fun( - [](const entity& ent, const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4, - const chaiscript::Boxed_Value& a5) - { - return ent.call(function, {a1, a2, a3, a4, a5}); - }), "call"); - - // Global call - chai->add(chaiscript::fun( - [context](const std::string& function, - const std::vector& arguments) - { - return context->get_executer()->call(function, 0, arguments); - }), "vectorCall"); - chai->add(chaiscript::fun([context](const std::string& function) - { - return context->get_executer()->call(function, 0, {}); - }), "call"); - - chai->add(chaiscript::fun( - [context](const std::string& function, - const chaiscript::Boxed_Value& a1) - { - return context->get_executer()->call(function, 0, {a1}); - }), "call"); - - chai->add(chaiscript::fun( - [context](const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2) - { - return context->get_executer()->call(function, 0, {a1, a2}); - }), "call"); - - chai->add(chaiscript::fun( - [context](const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3) - { - return context->get_executer()->call(function, 0, {a1, a2, a3}); - }), "call"); - - chai->add(chaiscript::fun( - [context](const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4) - { - return context->get_executer()->call(function, 0, {a1, a2, a3, a4}); - }), "call"); - - chai->add(chaiscript::fun( - [context](const std::string& function, - const chaiscript::Boxed_Value& a1, - const chaiscript::Boxed_Value& a2, - const chaiscript::Boxed_Value& a3, - const chaiscript::Boxed_Value& a4, - const chaiscript::Boxed_Value& a5) - { - return context->get_executer()->call(function, 0, {a1, a2, a3, a4, a5}); - }), "call"); + return chaiscript::Boxed_Value(0); + }), "method_missing"); } void initialize(context* context) { initialize_entity(context); - const auto chai = context->get_chai(); + auto* const chai = context->get_chai(); chai->add(chaiscript::fun([](const std::string& string) { diff --git a/src/game/scripting/executer.cpp b/src/game/scripting/executer.cpp index 948632d..42ac2b9 100644 --- a/src/game/scripting/executer.cpp +++ b/src/game/scripting/executer.cpp @@ -166,4 +166,9 @@ namespace game::scripting return -1; } + + bool executer::function_exists(const std::string& function, const bool prefer_global) + { + return find_function_index(function, prefer_global) >= 0; + } } diff --git a/src/game/scripting/executer.hpp b/src/game/scripting/executer.hpp index 01305f0..8baa07d 100644 --- a/src/game/scripting/executer.hpp +++ b/src/game/scripting/executer.hpp @@ -19,6 +19,8 @@ namespace game::scripting chaiscript::Boxed_Value call(const std::string& function, unsigned int entity_id, std::vector arguments) const; + static bool function_exists(const std::string& function, bool prefer_global); + private: context* context_;