#ifndef PKMNLIB_ANGELSCRIPTSCRIPT_HPP #define PKMNLIB_ANGELSCRIPTSCRIPT_HPP #include #define ANGELSCRIPT_DLL_LIBRARY_IMPORT #include #include "../../../extern/angelscript_addons/scriptarray/scriptarray.h" #include "../../Battling/PkmnScript.hpp" #include "AngelScriptTypeInfo.hpp" #include "ContextPool.hpp" class AngelScriptResolver; class AngelScriptScript final : public PkmnLib::Battling::PkmnScript { private: AngelScriptResolver* _resolver = nullptr; AngelScriptTypeInfo* _type = nullptr; ContextPool* _ctxPool = nullptr; asIScriptObject* _obj = nullptr; CScriptArray* GetEffectParameters(const ArbUt::List& ls); public: AngelScriptScript(AngelScriptResolver* resolver, AngelScriptTypeInfo* type, asIScriptObject* obj, ContextPool* ctxPool) : _resolver(resolver), _type(type), _ctxPool(ctxPool), _obj(obj) {} ~AngelScriptScript() override { _obj->Release(); } inline asIScriptObject* GetRawAngelscriptObject() const noexcept { return _obj; } [[nodiscard]] const ArbUt::StringView& GetName() const noexcept override { return _type->GetName(); } const AngelScriptTypeInfo* GetType() const noexcept { return _type; } asIScriptFunction* PrepareMethod(const ArbUt::BasicStringView& name, asIScriptContext* ctx) { auto func = _type->GetFunction(name); ctx->Prepare(func); ctx->SetObject(_obj); return func; } ContextPool* GetContextPool() { return _ctxPool; } void OnInitialize(const ArbUt::List& parameters) override; void Stack() override; void OnRemove() override; void OnBeforeTurn(const CreatureLib::Battling::BaseTurnChoice* choice) override; void ChangeAttack(CreatureLib::Battling::AttackTurnChoice* choice, ArbUt::StringView* outAttack) override; void PreventAttack(CreatureLib::Battling::ExecutingAttack* attack, bool* outResult) override; void FailAttack(CreatureLib::Battling::ExecutingAttack* attack, bool* outFailed) override; void StopBeforeAttack(CreatureLib::Battling::ExecutingAttack* attack, bool* outResult) override; void OnBeforeAttack(CreatureLib::Battling::ExecutingAttack* attack) override; void FailIncomingAttack(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, bool* outResult) override; void IsInvulnerable(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, bool* outResult) override; void OnAttackMiss(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target) override; void ChangeAttackType(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitNumber, uint8_t* outType) override; void ChangeEffectiveness(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitNumber, float* effectiveness) override; void PreventSecondaryEffects(const CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitNumber, bool* outResult) override; void OnSecondaryEffect(const CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitNumber) override; void OnAfterHits(const CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target) override; void PreventSelfSwitch(const CreatureLib::Battling::SwitchTurnChoice* choice, bool* outResult) override; void ModifyEffectChance(const CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, float* chance) override; void ModifyIncomingEffectChance(const CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, float* chance) override; void OverrideBasePower(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, uint8_t* basePower) override; void ChangeDamageStatsUser(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, CreatureLib::Battling::Creature** statsUser) override; void BypassDefensiveStat(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, bool* bypass) override; void BypassOffensiveStat(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, bool* bypass) override; void ModifyStatModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, float* modifier) override; void ModifyDamageModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, float* modifier) override; void OverrideDamage(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, uint32_t* damage) override; void ChangePriority(CreatureLib::Battling::AttackTurnChoice* choice, int8_t* priority) override; void OnFail(CreatureLib::Battling::Creature* target) override; void OnOpponentFail(CreatureLib::Battling::Creature* target) override; void PreventRunAway(const CreatureLib::Battling::FleeTurnChoice* choice, bool* result) override; void PreventOpponentRunAway(const CreatureLib::Battling::FleeTurnChoice* choice, bool* result) override; //////////////////// // PkmnLib methods// //////////////////// void ModifyCriticalStage(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hit, uint8_t* critStage) override; void OverrideCriticalModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hit, float* critModifier) override; void OverrideSTABModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hit, float* stabModifier) override; void ModifyExperienceGain(CreatureLib::Battling::Creature* faintedMon, CreatureLib::Battling::Creature* winningMon, uint32_t* experienceGain) override; void DoesShareExperience(CreatureLib::Battling::Creature* faintedMon, CreatureLib::Battling::Creature* winningMon, bool* shareExperience) override; }; #undef CALL_HOOK #endif // PKMNLIB_ANGELSCRIPTSCRIPT_HPP