#ifndef CREATURELIB_EVENTDATA_HPP #define CREATURELIB_EVENTDATA_HPP #include #include "../Models/DamageSource.hpp" #include "EventDataKind.hpp" namespace CreatureLib::Battling { // Predeclare some classes. class Creature; class EventData { public: virtual ~EventData() = default; virtual EventDataKind GetKind() const noexcept = 0; }; class DamageEvent : public EventData { ArbUt::BorrowedPtr _creature; DamageSource _damageSource; uint32_t _originalHealth; uint32_t _newHealth; public: DamageEvent(Creature* c, DamageSource s, uint32_t oHealth, uint32_t newHealth) noexcept : _creature(c), _damageSource(s), _originalHealth(oHealth), _newHealth(newHealth) {} EventDataKind GetKind() const noexcept override { return EventDataKind ::Damage; } const ArbUt::BorrowedPtr& GetCreature() const noexcept { return _creature; } DamageSource GetDamageSource() const noexcept { return _damageSource; } uint32_t GetOriginalHealth() const noexcept { return _originalHealth; } uint32_t GetNewHealth() const noexcept { return _newHealth; } }; class HealEvent : public EventData { ArbUt::BorrowedPtr _creature; uint32_t _originalHealth; uint32_t _newHealth; public: HealEvent(ArbUt::BorrowedPtr c, uint32_t oHealth, uint32_t newHealth) noexcept : _creature(c), _originalHealth(oHealth), _newHealth(newHealth) {} EventDataKind GetKind() const noexcept override { return EventDataKind ::Heal; } const ArbUt::BorrowedPtr& GetCreature() const noexcept { return _creature; } uint32_t GetOriginalHealth() const noexcept { return _originalHealth; } uint32_t GetNewHealth() const noexcept { return _newHealth; } }; class FaintEvent : public EventData { ArbUt::BorrowedPtr _creature; public: FaintEvent(ArbUt::BorrowedPtr c) noexcept : _creature(c) {} EventDataKind GetKind() const noexcept override { return EventDataKind ::Faint; } const ArbUt::BorrowedPtr& GetCreature() const noexcept { return _creature; } }; class DisplayTextEvent : public EventData { const ArbUt::StringView _text; public: DisplayTextEvent(const ArbUt::StringView& text) noexcept : _text(text) {} EventDataKind GetKind() const noexcept override { return EventDataKind ::DisplayText; } const ArbUt::StringView& GetText() const noexcept { return _text; } }; } #endif // CREATURELIB_EVENTDATA_HPP