From f7c881b4e72a8456e4b4b518daa1293ec08f9954 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 19 Feb 2022 14:04:43 +0100 Subject: [PATCH] Implement held item scripts --- .gitignore | 3 +-- .gitmodules | 3 --- CInterface/Library/Item.cpp | 9 ++++++++- src/Library/Items/Item.hpp | 7 ++++--- src/ScriptResolving/AngelScript/AngelScriptResolver.cpp | 6 +++++- src/ScriptResolving/AngelScript/AngelScriptResolver.hpp | 1 + src/ScriptResolving/AngelScript/AngelScriptScript.cpp | 7 +++++++ src/ScriptResolving/AngelScript/AngelScriptScript.hpp | 2 ++ src/ScriptResolving/AngelScript/AngelScriptTypeInfo.hpp | 3 +++ .../AngelScript/TypeRegistry/BasicScriptClass.cpp | 1 + tests/ScriptTests/ItemUseScriptTests.cpp | 2 +- tests/TestLibrary/TestLibrary.cpp | 2 +- 12 files changed, 34 insertions(+), 12 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitignore b/.gitignore index baf251a..015a9f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -/cmake-build-debug/ -/cmake-build-release/ +/cmake-build-* /build-release-windows/ /.idea/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 02bcb2d..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "extern/AngelscriptDebuggerServer"] - path = extern/AngelscriptDebuggerServer - url = https://git.p-epsilon.com/Deukhoofd/AngelscriptDebuggerServer.git diff --git a/CInterface/Library/Item.cpp b/CInterface/Library/Item.cpp index 880ee6e..ddae6d1 100644 --- a/CInterface/Library/Item.cpp +++ b/CInterface/Library/Item.cpp @@ -6,7 +6,9 @@ using namespace PkmnLib::Library; export Item* PkmnLib_Item_Construct(const char* name, CreatureLib::Library::ItemCategory category, CreatureLib::Library::BattleItemCategory battleCategory, int32_t price, const char* effectName, CreatureLib::Library::EffectParameter* effectParameters[], - size_t effectParameterCount, const char* flags[], size_t flagsCount, + size_t effectParameterCount, const char* battleTriggerEffectName, + CreatureLib::Library::EffectParameter* battleTriggerEffectParameters[], + size_t battleTriggerEffectParameterCount, const char* flags[], size_t flagsCount, uint8_t flingPower) { std::unordered_set conversedFlags(flagsCount); for (size_t i = 0; i < flagsCount; i++) { @@ -18,6 +20,11 @@ export Item* PkmnLib_Item_Construct(const char* name, CreatureLib::Library::Item new CreatureLib::Library::SecondaryEffect(100, effectName, ArbUt::List( effectParameters, effectParameters + effectParameterCount)), + new CreatureLib::Library::SecondaryEffect( + 100, battleTriggerEffectName, + ArbUt::List( + battleTriggerEffectParameters, battleTriggerEffectParameters + battleTriggerEffectParameterCount)), + conversedFlags, flingPower); }; diff --git a/src/Library/Items/Item.hpp b/src/Library/Items/Item.hpp index fd077f7..ee620aa 100644 --- a/src/Library/Items/Item.hpp +++ b/src/Library/Items/Item.hpp @@ -9,9 +9,10 @@ namespace PkmnLib::Library { public: Item(const ArbUt::StringView& name, CreatureLib::Library::ItemCategory category, CreatureLib::Library::BattleItemCategory battleCategory, int32_t price, - const CreatureLib::Library::SecondaryEffect* effect, const std::unordered_set& flags, - uint8_t flingPower) noexcept - : CreatureLib::Library::Item(name, category, battleCategory, price, effect, flags), + const CreatureLib::Library::SecondaryEffect* effect, + const CreatureLib::Library::SecondaryEffect* battleTriggerEffect, + const std::unordered_set& flags, uint8_t flingPower) noexcept + : CreatureLib::Library::Item(name, category, battleCategory, price, battleTriggerEffect, effect, flags), _flingPower(flingPower) {} inline uint8_t GetFlingPower() const noexcept { return _flingPower; } diff --git a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp index 24b78e7..019fd1a 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp +++ b/src/ScriptResolving/AngelScript/AngelScriptResolver.cpp @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include #include "AngelScriptMetadata.hpp" #include "AngelscriptUserdata.hpp" #include "ByteCodeHandling/FileByteCodeStream.hpp" @@ -309,6 +309,10 @@ void AngelScriptResolver::RegisterScriptType(asITypeInfo* typeInfo, const ArbUt: case "Side"_cnc: _typeDatabase[ScriptCategory::Side].Insert(effectName, new AngelScriptTypeInfo(effectName, typeInfo)); break; + case "ItemBattleTrigger"_cnc: + _typeDatabase[ScriptCategory::ItemBattleTrigger].Insert(effectName, + new AngelScriptTypeInfo(effectName, typeInfo)); + break; case "Weather"_cnc: _typeDatabase[static_cast(PkmnScriptCategory::Weather)].Insert( effectName, new AngelScriptTypeInfo(effectName, typeInfo)); diff --git a/src/ScriptResolving/AngelScript/AngelScriptResolver.hpp b/src/ScriptResolving/AngelScript/AngelScriptResolver.hpp index 4b7d690..d606c27 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptResolver.hpp +++ b/src/ScriptResolving/AngelScript/AngelScriptResolver.hpp @@ -136,6 +136,7 @@ public: case ScriptCategory::Creature: t = _engine->GetTypeInfoByName("Pokemon"); break; case ScriptCategory::Battle: t = _engine->GetTypeInfoByName("Battle"); break; case ScriptCategory::Side: t = _engine->GetTypeInfoByName("BattleSide"); break; + case ScriptCategory::ItemBattleTrigger: t = _engine->GetTypeInfoByName("Pokemon"); break; } switch (static_cast(category)) { case PkmnScriptCategory::Weather: t = _engine->GetTypeInfoByName("Battle"); break; diff --git a/src/ScriptResolving/AngelScript/AngelScriptScript.cpp b/src/ScriptResolving/AngelScript/AngelScriptScript.cpp index 245f21a..a9a5e12 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptScript.cpp +++ b/src/ScriptResolving/AngelScript/AngelScriptScript.cpp @@ -433,3 +433,10 @@ void AngelScriptScript::ModifyDefensiveStatValue(CreatureLib::Battling::Executin ctx->SetArgAddress(3, modifier); }) } +void AngelScriptScript::OnAfterHeldItemConsume(CreatureLib::Battling::Creature* creature, + const CreatureLib::Library::Item* item) { + CALL_HOOK(OnAfterHeldItemConsume, { + ctx->SetArgObject(0, (void*)creature); + ctx->SetArgObject(1, (void*)item); + }); +} diff --git a/src/ScriptResolving/AngelScript/AngelScriptScript.hpp b/src/ScriptResolving/AngelScript/AngelScriptScript.hpp index cf43a94..cf5dd9f 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptScript.hpp +++ b/src/ScriptResolving/AngelScript/AngelScriptScript.hpp @@ -133,6 +133,8 @@ public: [[maybe_unused]] u32 oldHealth, [[maybe_unused]] u32 newHealth) override; void OnFaint(CreatureLib::Battling::Creature* creature, CreatureLib::Battling::DamageSource source) override; void OnSwitchIn(CreatureLib::Battling::Creature* creature) override; + void OnAfterHeldItemConsume(CreatureLib::Battling::Creature* creature, + const CreatureLib::Library::Item* item) override; //////////////////// // PkmnLib methods// diff --git a/src/ScriptResolving/AngelScript/AngelScriptTypeInfo.hpp b/src/ScriptResolving/AngelScript/AngelScriptTypeInfo.hpp index a581f11..40649a3 100644 --- a/src/ScriptResolving/AngelScript/AngelScriptTypeInfo.hpp +++ b/src/ScriptResolving/AngelScript/AngelScriptTypeInfo.hpp @@ -190,6 +190,9 @@ public: SCRIPT_HOOK_FUNCTION( ModifyDefensiveStatValue, "void ModifyDefensiveStatValue(ExecutingMove@ attack, Pokemon@ target, uint8 hit, float& defensiveStatValue)"); + SCRIPT_HOOK_FUNCTION( + OnAfterHeldItemConsume, + "void OnAfterHeldItemConsume(Pokemon@ target, const Item@ item)"); }; #undef SCRIPT_HOOK_FUNCTION diff --git a/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp b/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp index 48086a8..616dfa4 100644 --- a/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp +++ b/src/ScriptResolving/AngelScript/TypeRegistry/BasicScriptClass.cpp @@ -58,6 +58,7 @@ shared abstract class PkmnScript { void OnEndTurn(){}; void OnDamage(Pokemon@ pokemon, DamageSource damageSource, uint oldHealth, uint newHealth){}; void OnFaint(Pokemon@ pokemon, DamageSource damageSource){}; + void OnAfterHeldItemConsume(Pokemon@ target, const Item@ item){}; // PkmnLib methods void PreventIncomingCritical(ExecutingMove@ attack, Pokemon@ target, uint8 hit, bool& preventCrit){}; diff --git a/tests/ScriptTests/ItemUseScriptTests.cpp b/tests/ScriptTests/ItemUseScriptTests.cpp index 820f348..fff8022 100644 --- a/tests/ScriptTests/ItemUseScriptTests.cpp +++ b/tests/ScriptTests/ItemUseScriptTests.cpp @@ -42,7 +42,7 @@ static AngelScriptItemUseScript* GetScript(PkmnLib::Battling::BattleLibrary* mai auto lib = GetScriptResolver(mainLib); auto item = CreatureLib::Library::Item(name, CreatureLib::Library::ItemCategory::MiscItem, CreatureLib::Library::BattleItemCategory::None, 0, - new CreatureLib::Library::SecondaryEffect(100, name, {}), {}); + new CreatureLib::Library::SecondaryEffect(100, name, {}), nullptr, {}); auto s = lib->LoadItemScript(&item); auto script = dynamic_cast(s); diff --git a/tests/TestLibrary/TestLibrary.cpp b/tests/TestLibrary/TestLibrary.cpp index 0cba856..f99a71c 100644 --- a/tests/TestLibrary/TestLibrary.cpp +++ b/tests/TestLibrary/TestLibrary.cpp @@ -78,6 +78,6 @@ PkmnLib::Library::ItemLibrary* TestLibrary::BuildItemLibrary() { auto lib = new PkmnLib::Library::ItemLibrary(); lib->Insert("testItem"_cnc.GetHash(), new PkmnLib::Library::Item("testItem"_cnc, CreatureLib::Library::ItemCategory::MiscItem, - CreatureLib::Library::BattleItemCategory::None, 0, nullptr, {}, 0)); + CreatureLib::Library::BattleItemCategory::None, 0, nullptr, nullptr, {}, 0)); return lib; }