From b5894ea8f2900cd79f36589f8098544fe7857665 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Wed, 25 Mar 2020 19:47:37 +0100 Subject: [PATCH] Added C Interface for Script. --- CInterface/Battling/Script.cpp | 97 +++++++++++++++++++ src/Battling/Library/DamageLibrary.cpp | 4 +- src/Battling/ScriptHandling/Script.hpp | 5 +- .../ScriptTests/ScriptAggregatorTests.cpp | 2 +- .../ScriptTests/ScriptSetTests.cpp | 2 +- .../ScriptTests/ScriptSourceTest.cpp | 2 +- 6 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 CInterface/Battling/Script.cpp diff --git a/CInterface/Battling/Script.cpp b/CInterface/Battling/Script.cpp new file mode 100644 index 0000000..dd13b73 --- /dev/null +++ b/CInterface/Battling/Script.cpp @@ -0,0 +1,97 @@ +#include "../../src/Battling/ScriptHandling/Script.hpp" +#include "../Core.hpp" +using namespace CreatureLib::Battling; + +export void CreatureLib_Script_Destruct(Script* p) { delete p; } + +export uint8_t CreatureLib_Script_Stack(Script* p) { Try(p->Stack()); } +export uint8_t CreatureLib_Script_OnRemove(Script* p) { Try(p->OnRemove()); } +export const char* CreatureLib_Script_GetName(Script* p) { return p->GetName().c_str(); } + +export uint8_t CreatureLib_Script_OnBeforeTurn(Script* p, const BaseTurnChoice* choice) { + Try(p->OnBeforeTurn(choice)); +} +export uint8_t CreatureLib_Script_ChangeAttack(Script* p, AttackTurnChoice* choice, ConstString* outAttack) { + Try(p->ChangeAttack(choice, outAttack)); +} +export uint8_t CreatureLib_Script_PreventAttack(Script* p, ExecutingAttack* attack, bool* outResult) { + Try(p->PreventAttack(attack, outResult)); +} +export uint8_t CreatureLib_Script_FailAttack(Script* p, ExecutingAttack* attack, bool* outResult) { + Try(p->FailAttack(attack, outResult)); +} +export uint8_t CreatureLib_Script_StopBeforeAttack(Script* p, ExecutingAttack* attack, bool* outResult) { + Try(p->StopBeforeAttack(attack, outResult)); +} +export uint8_t CreatureLib_Script_OnBeforeAttack(Script* p, ExecutingAttack* attack) { Try(p->OnBeforeAttack(attack)); } + +export uint8_t CreatureLib_Script_FailIncomingAttack(Script* p, ExecutingAttack* attack, Creature* target, + bool* outResult) { + Try(p->FailIncomingAttack(attack, target, outResult)); +} + +export uint8_t CreatureLib_Script_IsInvulnerable(Script* p, ExecutingAttack* attack, Creature* target, + bool* outResult) { + Try(p->IsInvulnerable(attack, target, outResult)); +} +export uint8_t CreatureLib_Script_OnAttackMiss(Script* p, ExecutingAttack* attack, Creature* target) { + Try(p->OnAttackMiss(attack, target)); +} +export uint8_t CreatureLib_Script_ChangeAttackType(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, uint8_t* outType) { + Try(p->ChangeAttackType(attack, target, hitNumber, outType)) +} +export uint8_t CreatureLib_Script_OverrideBasePower(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, uint8_t* basePower) { + Try(p->OverrideBasePower(attack, target, hitNumber, basePower)); +} +export uint8_t CreatureLib_Script_ChangeDamageStatsUser(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, Creature** statsUser) { + Try(p->ChangeDamageStatsUser(attack, target, hitNumber, statsUser)); +} +export uint8_t CreatureLib_Script_BypassDefensiveStat(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, bool* bypass) { + Try(p->BypassDefensiveStat(attack, target, hitNumber, bypass)); +} +export uint8_t CreatureLib_Script_BypassOffensiveStat(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, bool* bypass) { + Try(p->BypassOffensiveStat(attack, target, hitNumber, bypass)); +} +export uint8_t CreatureLib_Script_ModifyStatModifier(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, float* modifier) { + Try(p->ModifyStatModifier(attack, target, hitNumber, modifier)); +} +export uint8_t CreatureLib_Script_ModifyDamageModifier(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, float* modifier) { + Try(p->ModifyDamageModifier(attack, target, hitNumber, modifier)); +} +export uint8_t CreatureLib_Script_OverrideDamage(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, uint32_t* damage) { + Try(p->OverrideDamage(attack, target, hitNumber, damage)); +} +export uint8_t CreatureLib_Script_OnStatusMove(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber) { + Try(p->OnStatusMove(attack, target, hitNumber)); +} +export uint8_t CreatureLib_Script_PreventSecondaryEffects(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber, bool* outResult) { + Try(p->PreventSecondaryEffects(attack, target, hitNumber, outResult)); +} +export uint8_t CreatureLib_Script_OnSecondaryEffect(Script* p, ExecutingAttack* attack, Creature* target, + uint8_t hitNumber) { + Try(p->OnSecondaryEffect(attack, target, hitNumber)); +} +export uint8_t CreatureLib_Script_OnAfterHits(Script* p, ExecutingAttack* attack, Creature* target) { + Try(p->OnAfterHits(attack, target)); +} +export uint8_t CreatureLib_Script_PreventSelfSwitch(Script* p, const SwitchTurnChoice* choice, bool* outResult) { + Try(p->PreventSelfSwitch(choice, outResult)); +} +export uint8_t CreatureLib_Script_ModifyEffectChance(Script* p, const ExecutingAttack* attack, Creature* target, + float* chance) { + Try(p->ModifyEffectChance(attack, target, chance)); +} +export uint8_t CreatureLib_Script_ModifyIncomingEffectChance(Script* p, const ExecutingAttack* attack, Creature* target, + float* chance) { + Try(p->ModifyIncomingEffectChance(attack, target, chance)); +} diff --git a/src/Battling/Library/DamageLibrary.cpp b/src/Battling/Library/DamageLibrary.cpp index 9bc4250..f6625a8 100644 --- a/src/Battling/Library/DamageLibrary.cpp +++ b/src/Battling/Library/DamageLibrary.cpp @@ -11,8 +11,8 @@ uint32_t DamageLibrary::GetDamage(ExecutingAttack* attack, Creature* target, uin auto bp = hit->GetBasePower(); auto statMod = GetStatModifier(attack, target, hitIndex); HOOK(ModifyStatModifier, attack, attack, target, hitIndex, &statMod); - int32_t damage = static_cast((((levelMod * static_cast(bp) * statMod) / 50) + 2) * - GetDamageModifier(attack, target, hitIndex)); + uint32_t damage = static_cast((((levelMod * static_cast(bp) * statMod) / 50) + 2) * + GetDamageModifier(attack, target, hitIndex)); HOOK(OverrideDamage, attack, attack, target, hitIndex, &damage); return damage; } diff --git a/src/Battling/ScriptHandling/Script.hpp b/src/Battling/ScriptHandling/Script.hpp index bac712a..5ee4962 100644 --- a/src/Battling/ScriptHandling/Script.hpp +++ b/src/Battling/ScriptHandling/Script.hpp @@ -16,13 +16,12 @@ namespace CreatureLib::Battling { class Script { public: - explicit Script() {} virtual ~Script() = default; virtual void Stack(){}; virtual void OnRemove(){}; - virtual const ConstString& GetName() const = 0; + virtual const ConstString& GetName() const noexcept = 0; virtual void OnBeforeTurn(const BaseTurnChoice* choice){}; @@ -47,7 +46,7 @@ namespace CreatureLib::Battling { virtual void ModifyStatModifier(ExecutingAttack* attack, Creature* target, uint8_t hitIndex, float* modifier){}; virtual void ModifyDamageModifier(ExecutingAttack* attack, Creature* target, uint8_t hitIndex, float* modifier){}; - virtual void OverrideDamage(ExecutingAttack* attack, Creature* target, uint8_t hitIndex, int32_t* damage){}; + virtual void OverrideDamage(ExecutingAttack* attack, Creature* target, uint8_t hitIndex, uint32_t* damage){}; virtual void OnStatusMove(const ExecutingAttack* attack, Creature* target, uint8_t hitNumber){}; virtual void PreventSecondaryEffects(const ExecutingAttack* attack, Creature* target, uint8_t hitNumber, diff --git a/tests/BattleTests/ScriptTests/ScriptAggregatorTests.cpp b/tests/BattleTests/ScriptTests/ScriptAggregatorTests.cpp index b3b8ef4..aabe716 100644 --- a/tests/BattleTests/ScriptTests/ScriptAggregatorTests.cpp +++ b/tests/BattleTests/ScriptTests/ScriptAggregatorTests.cpp @@ -13,7 +13,7 @@ private: public: explicit TestScript(std::string name) : _name(std::move(name)){}; - const ConstString& GetName() const override { return _name; } + const ConstString& GetName() const noexcept override { return _name; } void TestMethod(int& runCount) { runCount++; } }; diff --git a/tests/BattleTests/ScriptTests/ScriptSetTests.cpp b/tests/BattleTests/ScriptTests/ScriptSetTests.cpp index 40cab8a..842169b 100644 --- a/tests/BattleTests/ScriptTests/ScriptSetTests.cpp +++ b/tests/BattleTests/ScriptTests/ScriptSetTests.cpp @@ -13,7 +13,7 @@ private: public: explicit TestScript(std::string name) : _name(std::move(name)){}; - const ConstString& GetName() const override { return _name; } + const ConstString& GetName() const noexcept override { return _name; } }; TEST_CASE("Empty script set count == 0", "[Battling, Scripting]") { diff --git a/tests/BattleTests/ScriptTests/ScriptSourceTest.cpp b/tests/BattleTests/ScriptTests/ScriptSourceTest.cpp index 810bb81..55ce9dd 100644 --- a/tests/BattleTests/ScriptTests/ScriptSourceTest.cpp +++ b/tests/BattleTests/ScriptTests/ScriptSourceTest.cpp @@ -14,7 +14,7 @@ private: public: explicit TestScript(std::string name) : _name(std::move(name)){}; - const ConstString& GetName() const override { return _name; } + const ConstString& GetName() const noexcept override { return _name; } void TestMethod(int& runCount) { runCount++; } };