Support for specific PkmnLib functions in Scripts, added ModifyCriticalStage function.

This commit is contained in:
2020-02-20 13:28:31 +01:00
parent 83a49eee6c
commit 19cfcc9e32
7 changed files with 106 additions and 18 deletions

View File

@@ -0,0 +1,20 @@
#include "MiscLibrary.hpp"
#include <CreatureLib/Battling/Models/Battle.hpp>
#include "../PkmnScriptHook.hpp"
bool PkmnLib::Battling::MiscLibrary::IsCritical(CreatureLib::Battling::ExecutingAttack* attack,
CreatureLib::Battling::Creature* target, uint8_t hit) const {
uint8_t critStage = 0;
PKMN_HOOK(ModifyCriticalStage, attack, attack, target, hit, &critStage);
auto rand = target->GetBattle()->GetRandom();
switch (critStage){
case 0: return rand->Get(24) == 0;
case 1: return rand->Get(8) == 0;
case 2: return rand->Get(2) == 0;
default: return true;
}
}
bool PkmnLib::Battling::MiscLibrary::CanFlee(CreatureLib::Battling::FleeTurnChoice* switchChoice) const {
return CreatureLib::Battling::MiscLibrary::CanFlee(switchChoice);
}

View File

@@ -0,0 +1,15 @@
#ifndef PKMNLIB_MISCLIBRARY_HPP
#define PKMNLIB_MISCLIBRARY_HPP
#include <CreatureLib/Battling/Library/MiscLibrary.hpp>
namespace PkmnLib::Battling{
class MiscLibrary : CreatureLib::Battling::MiscLibrary {
~MiscLibrary() override = default;
bool IsCritical(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target,
uint8_t hit) const override;
bool CanFlee(CreatureLib::Battling::FleeTurnChoice* switchChoice) const override;
};
}
#endif // PKMNLIB_MISCLIBRARY_HPP

View File

@@ -0,0 +1,16 @@
#ifndef PKMNLIB_PKMNSCRIPT_HPP
#define PKMNLIB_PKMNSCRIPT_HPP
#include <CreatureLib/Battling/ScriptHandling/Script.hpp>
#include "Pokemon/Pokemon.hpp"
namespace PkmnLib::Battling{
class PkmnScript : public CreatureLib::Battling::Script{
public:
PkmnScript(const std::string& name) : Script(name) {}
virtual void ModifyCriticalStage(CreatureLib::Battling::ExecutingAttack* attack,
CreatureLib::Battling::Creature* target, uint8_t hit, uint8_t* critStage){};
};
}
#endif // PKMNLIB_PKMNSCRIPT_HPP

View File

@@ -0,0 +1,13 @@
#include "PkmnScript.hpp"
#define PKMN_HOOK(hookName, source, ...) \
{ \
auto aggregator = source->GetScriptIterator(); \
while (aggregator.HasNext()) { \
auto next = aggregator.GetNext(); \
if (next == nullptr) \
continue; \
auto castNext = dynamic_cast<PkmnLib::Battling::PkmnScript*>(next); \
castNext->hookName(__VA_ARGS__); \
} \
}