Support for specific PkmnLib functions in Scripts, added ModifyCriticalStage function.
This commit is contained in:
20
src/Battling/Library/MiscLibrary.cpp
Normal file
20
src/Battling/Library/MiscLibrary.cpp
Normal 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);
|
||||
}
|
||||
15
src/Battling/Library/MiscLibrary.hpp
Normal file
15
src/Battling/Library/MiscLibrary.hpp
Normal 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
|
||||
16
src/Battling/PkmnScript.hpp
Normal file
16
src/Battling/PkmnScript.hpp
Normal 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
|
||||
13
src/Battling/PkmnScriptHook.hpp
Normal file
13
src/Battling/PkmnScriptHook.hpp
Normal 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__); \
|
||||
} \
|
||||
}
|
||||
Reference in New Issue
Block a user