PkmnLib/src/ScriptResolving/AngelScript/AngelScriptItemUseScript.hpp

87 lines
3.6 KiB
C++

#ifndef PKMNLIB_ANGELSCRIPTITEMUSESCRIPT_HPP
#define PKMNLIB_ANGELSCRIPTITEMUSESCRIPT_HPP
#include <CreatureLib/Battling/ScriptHandling/ItemUseScript.hpp>
#include <CreatureLib/Library/Items/Item.hpp>
#include <scriptarray/scriptarray.h>
#include "../../Battling/PkmnItemUseScript.hpp"
#include "TypeRegistry/NativeArray.hpp"
class AngelScriptResolver;
class AngelScriptItemUseScript final : public PkmnLib::Battling::PkmnItemUseScript {
public:
AngelScriptItemUseScript(asIScriptObject* scriptObject, AngelScriptResolver* resolver,
const CreatureLib::Library::Item* item);
~AngelScriptItemUseScript() {
if (_scriptObject != nullptr) {
_scriptObject->Release();
}
}
void OnInitialize(const ArbUt::List<CreatureLib::Library::EffectParameter*>& parameters) override;
[[nodiscard]] bool IsItemUsable() const override;
[[nodiscard]] bool IsCreatureUseItem() const override;
bool IsUseValidForCreature(CreatureLib::Battling::Creature* creature) const override;
bool IsHoldable() const override;
void OnUse(CreatureLib::Battling::Battle* battle) const override;
void OnCreatureUse(CreatureLib::Battling::Creature* creature, bool isBattle) const override;
void ModifyPokeballCatchBonus(PkmnLib::Battling::Pokemon* pokemon, u8* catchBonus) const override;
private:
asIScriptObject* _scriptObject;
AngelScriptResolver* _resolver;
struct FunctionInfo {
bool Exists = false;
asIScriptFunction* Function = nullptr;
};
FunctionInfo Initialize(const std::string& decl) {
auto val = _scriptObject->GetObjectType()->GetMethodByDecl(decl.c_str(), false);
if (val == nullptr) {
return FunctionInfo{.Exists = false, .Function = nullptr};
}
return FunctionInfo{.Exists = true, .Function = val};
}
NativeArray<ArbUt::List<CreatureLib::Library::EffectParameter*>>*
GetEffectParameters(const ArbUt::List<CreatureLib::Library::EffectParameter*>& 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(const Item@ 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(OnInitialize, "void OnInitialize(const narray<EffectParameter@>@ parameters)");
ITEM_USE_SCRIPT_HOOK_FUNCTION(IsItemUsable, "bool IsItemUsable()");
ITEM_USE_SCRIPT_HOOK_FUNCTION(IsPokemonUseItem, "bool IsPokemonUseItem()");
ITEM_USE_SCRIPT_HOOK_FUNCTION(IsUseValidForPokemon, "bool IsUseValidForPokemon(Pokemon@ target)");
ITEM_USE_SCRIPT_HOOK_FUNCTION(IsHoldable, "bool IsHoldable()");
ITEM_USE_SCRIPT_HOOK_FUNCTION(OnUse, "void OnUse()");
ITEM_USE_SCRIPT_HOOK_FUNCTION(OnPokemonUse, "void OnPokemonUse(Pokemon@ target, bool isBattleUse)");
ITEM_USE_SCRIPT_HOOK_FUNCTION(ModifyPokeballCatchBonus,
"void ModifyPokeballCatchBonus(Pokemon@ target, uint8& catchBonus)");
};
#endif // PKMNLIB_ANGELSCRIPTITEMUSESCRIPT_HPP