#ifndef CREATURELIB_SCRIPT_HPP #define CREATURELIB_SCRIPT_HPP #include #include #include #include "../../Library/EffectParameter.hpp" #include "../../Library/Statistic.hpp" #include "../Models/DamageSource.hpp" namespace CreatureLib::Battling { class BaseTurnChoice; class AttackTurnChoice; class SwitchTurnChoice; class FleeTurnChoice; class ExecutingAttack; class Creature; class BattleScript { ArbUt::OptionalBorrowedPtr _owner; size_t _suppressed = 0; public: BattleScript(const ArbUt::OptionalBorrowedPtr& owner) { _owner = owner; }; NO_COPY_OR_MOVE(BattleScript); inline ArbUt::OptionalBorrowedPtr GetOwner() const noexcept { return _owner; } inline bool IsSuppressed() const noexcept { return _suppressed > 0; } inline void Suppress() { _suppressed++; } inline void Unsuppress() { if (_suppressed > 0) _suppressed--; } virtual ~BattleScript() = default; virtual BattleScript* Clone(const ArbUt::OptionalBorrowedPtr& owner) = 0; virtual void Stack(){}; virtual void OnRemove(){}; [[nodiscard]] virtual const ArbUt::StringView& GetName() const noexcept = 0; #define _par_ [[maybe_unused]] virtual void OnInitialize(_par_ const ArbUt::List& parameters){}; virtual void OnBeforeTurn(_par_ const BaseTurnChoice* choice){}; virtual void ChangePriority(_par_ AttackTurnChoice* choice, _par_ int8_t* priority){}; virtual void ChangeAttack(_par_ AttackTurnChoice* choice, _par_ ArbUt::StringView* outAttack){}; virtual void ModifyNumberOfHits(_par_ AttackTurnChoice* choice, _par_ u8* numberOfHits){}; virtual void PreventAttack(_par_ ExecutingAttack* attack, _par_ bool* outResult){}; virtual void FailAttack(_par_ ExecutingAttack* attack, _par_ bool* outFailed){}; virtual void StopBeforeAttack(_par_ ExecutingAttack* attack, _par_ bool* outResult){}; virtual void OnBeforeAttack(_par_ ExecutingAttack* attack){}; virtual void FailIncomingAttack(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ bool* outResult){}; virtual void IsInvulnerable(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ bool* outResult){}; virtual void OnAttackMiss(_par_ ExecutingAttack* attack, _par_ Creature* target){}; virtual void ChangeAttackType(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber, _par_ u8* outType){}; virtual void ChangeEffectiveness(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber, _par_ float* effectiveness){}; virtual void BlockCritical(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber, _par_ bool* blockCritical){}; virtual void OverrideBasePower(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ u8* basePower){}; virtual void ChangeDamageStatsUser(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ Creature** statsUser){}; virtual void BypassDefensiveStat(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ bool* bypass){}; virtual void BypassOffensiveStat(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ bool* bypass){}; virtual void ModifyStatModifier(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ float* modifier){}; virtual void ModifyDamageModifier(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ float* modifier){}; virtual void OverrideDamage(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ u32* damage){}; virtual void OverrideIncomingDamage(_par_ ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitIndex, _par_ u32* damage){}; virtual void OnIncomingHit(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber){}; virtual void OnFaintingOpponent(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber){}; virtual void ModifyStatBoostChange(_par_ Creature* target, _par_ Library::Statistic stat, _par_ int8_t* diffAmount){}; virtual void PreventSecondaryEffects(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber, _par_ bool* outResult){}; virtual void OnSecondaryEffect(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ u8 hitNumber){}; virtual void OnAfterHits(_par_ const ExecutingAttack* attack, _par_ Creature* target){}; virtual void PreventSelfSwitch(_par_ const SwitchTurnChoice* choice, _par_ bool* outResult){}; virtual void PreventOpponentSwitch(_par_ const SwitchTurnChoice* choice, _par_ bool* outResult){}; virtual void ModifyEffectChance(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ float* chance){}; virtual void ModifyIncomingEffectChance(_par_ const ExecutingAttack* attack, _par_ Creature* target, _par_ float* chance){}; virtual void OnFail(_par_ Creature* target){}; virtual void OnOpponentFail(_par_ Creature* target){}; virtual void PreventRunAway(_par_ const FleeTurnChoice* choice, _par_ bool* result){}; virtual void PreventOpponentRunAway(_par_ const FleeTurnChoice* choice, _par_ bool* result){}; virtual void OnEndTurn(){}; virtual void OnDamage(Creature*, DamageSource, _par_ u32 oldHealth, _par_ u32 newHealth){}; virtual void OnFaint(Creature*, DamageSource){}; virtual void OnSwitchIn(Creature*){}; }; } #endif // CREATURELIB_SCRIPT_HPP