From c0e7f905a99fecbc42f341b00e239bbd682dfb7a Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 27 Mar 2022 13:07:58 +0200 Subject: [PATCH] Adds a GetOwner pattern to ItemUseScript --- .../AngelScript/AngelScriptItemUseScript.cpp | 11 ++++++++- .../AngelScript/AngelScriptItemUseScript.hpp | 24 +++++++++++++++++-- .../AngelScript/AngelScriptResolver.cpp | 2 +- .../TypeRegistry/BasicScriptClass.cpp | 5 ++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.cpp b/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.cpp index 04b89b3..3fd65c2 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.cpp +++ b/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.cpp @@ -1,7 +1,16 @@ #include "AngelScriptItemUseScript.hpp" #include "AngelScriptFunctionCall.hpp" #include "AngelScriptResolver.hpp" -#include "AngelscriptUserdata.hpp" + +AngelScriptItemUseScript::AngelScriptItemUseScript(asIScriptObject* scriptObject, AngelScriptResolver* resolver, + const CreatureLib::Library::Item* item) + : _scriptObject(scriptObject), _resolver(resolver) { + if (__SetOwner.Exists) { + AngelScriptUtils::AngelscriptFunctionCall( + __SetOwner.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc, + [&](asIScriptContext* ctx) { ctx->SetArgObject(0, (void*)item); }, [&](asIScriptContext*) {}); + } +} NativeArray>* AngelScriptItemUseScript::GetEffectParameters(const ArbUt::List& ls) { diff --git a/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.hpp b/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.hpp index a581fe0..fa756ad 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.hpp +++ b/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.hpp @@ -2,6 +2,7 @@ #define PKMNLIB_ANGELSCRIPTITEMUSESCRIPT_HPP #include +#include #include #include "../../Battling/PkmnItemUseScript.hpp" #include "TypeRegistry/NativeArray.hpp" @@ -10,8 +11,8 @@ class AngelScriptResolver; class AngelScriptItemUseScript final : public PkmnLib::Battling::PkmnItemUseScript { public: - AngelScriptItemUseScript(asIScriptObject* scriptObject, AngelScriptResolver* resolver) - : _scriptObject(scriptObject), _resolver(resolver) {} + AngelScriptItemUseScript(asIScriptObject* scriptObject, AngelScriptResolver* resolver, + const CreatureLib::Library::Item* item); ~AngelScriptItemUseScript() { if (_scriptObject != nullptr) { @@ -50,6 +51,25 @@ private: NativeArray>* GetEffectParameters(const ArbUt::List& ls); + FunctionInfo InitializeGetOwner() { + auto val = _scriptObject->GetObjectType()->GetMethodByDecl("const Item@ GetOwner()", true); + if (val != nullptr) { + return FunctionInfo{.Exists = true, .Function = val}; + } + return FunctionInfo{.Exists = false, .Function = nullptr}; + } + + FunctionInfo InitializeSetOwner() { + auto val = _scriptObject->GetObjectType()->GetMethodByDecl("void SetOwner(ref@ owner)", true); + if (val != nullptr) { + return FunctionInfo{.Exists = true, .Function = val}; + } + return FunctionInfo{.Exists = false, .Function = nullptr}; + } + + FunctionInfo __GetOwner = InitializeGetOwner(); + FunctionInfo __SetOwner = InitializeSetOwner(); + #define ITEM_USE_SCRIPT_HOOK_FUNCTION(name, decl) FunctionInfo __##name = Initialize(decl); ITEM_USE_SCRIPT_HOOK_FUNCTION( diff --git a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp index 880ec15..d9fd12a 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp +++ b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp @@ -216,7 +216,7 @@ PkmnLib::Battling::PkmnItemUseScript* AngelScriptResolver::LoadItemScript(const } asIScriptObject* obj = *(asIScriptObject**)ctx->GetAddressOfReturnValue(); obj->AddRef(); - auto scriptObject = new AngelScriptItemUseScript(obj, this); + auto scriptObject = new AngelScriptItemUseScript(obj, this, item); scriptObject->OnInitialize(item->GetEffect().GetValue()->GetParameters()); _itemUseScripts.Insert(item, scriptObject); _contextPool->ReturnContextToPool(ctx); diff --git a/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp b/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp index db3ab14..c767aee 100644 --- a/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp +++ b/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp @@ -80,6 +80,11 @@ shared abstract class PkmnScript { Ensure(r >= 0); r = engine->GetModuleByIndex(0)->AddScriptSection("ItemUseScript", R"( shared abstract class ItemUseScript { + private Item@ __owner; + + protected const Item@ GetOwner() { return __owner; }; + protected void SetOwner(Item@ o) { @__owner = @o; }; + void OnInitialize(const narray@ parameters){}; bool IsItemUsable() { return false; }; bool IsPokemonUseItem() { return false; };