#ifndef PKMNLIB_BATTLE_HPP #define PKMNLIB_BATTLE_HPP #include #include "../EventHooks/WeatherChangeEvent.hpp" #include "../Library/BattleLibrary.hpp" #include "../PkmnScript.hpp" #include "../PkmnScriptCategory.hpp" namespace PkmnLib::Battling { class Battle : public CreatureLib::Battling::Battle { private: ArbUt::OptionalUniquePtr _weatherScript = nullptr; public: Battle(const BattleLibrary* non_null library, const ArbUt::List& parties, bool canFlee = true, u8 numberOfSides = 2, u8 creaturesPerSide = 1, uint_fast32_t randomSeed = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()) .count()) : CreatureLib::Battling::Battle(library, parties, canFlee, numberOfSides, creaturesPerSide, randomSeed) {} virtual ~Battle() = default; bool SetWeather(const ArbUt::StringView& name); void ClearWeather(); void SuppressWeather() { if (_weatherScript.HasValue()) { _weatherScript.GetValue()->Suppress(); } } void UnsuppressWeather() { if (_weatherScript.HasValue()) { _weatherScript.GetValue()->Unsuppress(); } } const ArbUt::StringView& GetWeatherName() noexcept { if (!_weatherScript.HasValue()) { return ArbUt::StringView::EmptyString(); } return _weatherScript.GetValue()->GetName(); } size_t ScriptCount() const override { return CreatureLib::Battling::Battle::ScriptCount() + 1; } void GetOwnScripts(ArbUt::List& scripts) override { CreatureLib::Battling::Battle::GetOwnScripts(scripts); scripts.Append(CreatureLib::Battling::ScriptWrapper( CreatureLib::Battling::ScriptWrapper::FromScript(&_weatherScript))); } Battle* non_null Clone() const override; }; } #endif // PKMNLIB_BATTLE_HPP