#ifndef PKMNLIB_EVOLUTIONDATA_HPP #define PKMNLIB_EVOLUTIONDATA_HPP #include #include #include #include "../TimeOfDay.hpp" #include "EvolutionMethod.hpp" namespace PkmnLib::Library { class PokemonSpecies; class MoveData; class Item; class EvolutionData { private: ArbUt::BorrowedPtr _evolvesInto; EvolutionMethod _method; ArbUt::UniquePtrList _evolutionData; EvolutionData(EvolutionMethod method, std::vector data, const PokemonSpecies* non_null next) : _evolvesInto(next), _method(method), _evolutionData(std::move(data)) {} public: ~EvolutionData() = default; static inline const EvolutionData* non_null CreateLevelEvolution(uint8_t level, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::Level, {new CreatureLib::Library::EffectParameter((int64_t)level)}, into); } static inline const EvolutionData* non_null CreateFriendshipEvolution(uint8_t friendship, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::HighFriendship, {new CreatureLib::Library::EffectParameter((int64_t)friendship)}, into); } static inline const EvolutionData* non_null CreateFriendshipTimeEvolution(uint8_t friendship, TimeOfDay startTime, TimeOfDay endTime, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::HighFriendshipTime, {new CreatureLib::Library::EffectParameter((int64_t)friendship), new CreatureLib::Library::EffectParameter((int64_t)startTime), new CreatureLib::Library::EffectParameter((int64_t)endTime)}, into); } static const EvolutionData* non_null CreateKnownMoveEvolution(const MoveData* non_null move, const PokemonSpecies* non_null into); static inline const EvolutionData* non_null CreateLocationEvolution(const ArbUt::StringView& location, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::LocationBased, {new CreatureLib::Library::EffectParameter(location)}, into); } static inline const EvolutionData* non_null CreateTimeEvolution(TimeOfDay startTime, TimeOfDay endTime, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::TimeBased, { new CreatureLib::Library::EffectParameter((int64_t)startTime), new CreatureLib::Library::EffectParameter((int64_t)endTime), }, into); } static const EvolutionData* non_null CreateHeldItemEvolution(const Item* non_null item, const PokemonSpecies* non_null into); static const EvolutionData* non_null CreateHeldItemTimeEvolution(const Item* non_null item, TimeOfDay startTime, TimeOfDay endTime, const PokemonSpecies* non_null into); static inline const EvolutionData* non_null CreateGenderBasedEvolution(CreatureLib::Library::Gender gender, uint8_t level, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::IsGenderAndLevel, {new CreatureLib::Library::EffectParameter((int64_t)gender), new CreatureLib::Library::EffectParameter((int64_t)level)}, into); } static const EvolutionData* non_null CreateItemUseEvolution(const Item* non_null item, const PokemonSpecies* non_null into); static const EvolutionData* non_null CreateItemUseWithGenderEvolution(const Item* non_null item, CreatureLib::Library::Gender gender, const PokemonSpecies* non_null into); static inline const EvolutionData* non_null CreateTradeEvolution(const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::Trade, {}, into); } static const EvolutionData* non_null CreateTradeWithItemEvolution(const Item* non_null item, const PokemonSpecies* non_null into); static const EvolutionData* non_null CreateTradeWithSpeciesEvolution(const PokemonSpecies* non_null traded, const PokemonSpecies* non_null into); static inline const EvolutionData* non_null CreateCustomEvolution(const std::vector& data, const PokemonSpecies* non_null into) { return new EvolutionData(EvolutionMethod::Custom, data, into); } [[nodiscard]] inline ArbUt::BorrowedPtr GetNewSpecies() const noexcept { return _evolvesInto; } [[nodiscard]] inline EvolutionMethod GetMethod() const noexcept { return _method; } [[nodiscard]] inline size_t GetDataCount() const noexcept { return _evolutionData.Count(); } [[nodiscard]] inline const ArbUt::UniquePtrList& GetData() const { return _evolutionData; } [[nodiscard]] inline ArbUt::BorrowedPtr GetDataAt(size_t index) const { return _evolutionData.At(index); } }; } #endif // PKMNLIB_EVOLUTIONDATA_HPP