From 1758f2a133cfbb81010185472ee899b478e61156 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 23 Jan 2020 21:59:45 +0000 Subject: [PATCH] Implement As and Is functions for SpriteBase --- src/openrct2/peep/Peep.cpp | 5 +++++ src/openrct2/ride/Vehicle.cpp | 5 +++++ src/openrct2/world/Balloon.cpp | 5 +++++ src/openrct2/world/Duck.cpp | 5 +++++ src/openrct2/world/Fountain.cpp | 6 ++++++ src/openrct2/world/MoneyEffect.cpp | 5 +++++ src/openrct2/world/Particle.cpp | 9 +++++++++ src/openrct2/world/Sprite.cpp | 20 ++++++++++++++++++++ src/openrct2/world/Sprite.h | 8 ++++++++ src/openrct2/world/SpriteBase.h | 10 ++++++++++ 10 files changed, 78 insertions(+) diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index ff884b4d5a..fb6ae1d0c0 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -323,6 +323,11 @@ const bool gSpriteTypeToSlowWalkMap[] = { // clang-format on +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_PEEP; +} + bool rct_sprite::IsPeep() const { return peep.sprite_identifier == SPRITE_IDENTIFIER_PEEP; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 7e9d58c7ea..38f330427f 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -726,6 +726,11 @@ static const struct // clang-format on +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_VEHICLE; +} + static bool vehicle_move_info_valid(int32_t trackSubposition, int32_t typeAndDirection, int32_t offset) { if (trackSubposition >= static_cast(std::size(gTrackVehicleInfo))) diff --git a/src/openrct2/world/Balloon.cpp b/src/openrct2/world/Balloon.cpp index 1f8f528d8f..7b453a761c 100644 --- a/src/openrct2/world/Balloon.cpp +++ b/src/openrct2/world/Balloon.cpp @@ -19,6 +19,11 @@ bool rct_sprite::IsBalloon() return this->balloon.sprite_identifier == SPRITE_IDENTIFIER_MISC && this->balloon.type == SPRITE_MISC_BALLOON; } +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_BALLOON; +} + Balloon* rct_sprite::AsBalloon() { Balloon* result = nullptr; diff --git a/src/openrct2/world/Duck.cpp b/src/openrct2/world/Duck.cpp index e8abc8e9a9..bd737c4b2a 100644 --- a/src/openrct2/world/Duck.cpp +++ b/src/openrct2/world/Duck.cpp @@ -74,6 +74,11 @@ static constexpr const uint8_t * DuckAnimations[] = }; // clang-format on +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_DUCK; +} + bool rct_sprite::IsDuck() { return this->duck.sprite_identifier == SPRITE_IDENTIFIER_MISC && this->duck.type == SPRITE_MISC_DUCK; diff --git a/src/openrct2/world/Fountain.cpp b/src/openrct2/world/Fountain.cpp index fa470190c8..a89638a294 100644 --- a/src/openrct2/world/Fountain.cpp +++ b/src/openrct2/world/Fountain.cpp @@ -80,6 +80,12 @@ const uint8_t _fountainPatternFlags[] = { FOUNTAIN_FLAG::FAST // FAST_RANDOM_CHASERS }; +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC + && (type == SPRITE_MISC_JUMPING_FOUNTAIN_SNOW || type == SPRITE_MISC_JUMPING_FOUNTAIN_WATER); +} + void JumpingFountain::StartAnimation(const int32_t newType, const CoordsXY& newLoc, const TileElement* tileElement) { int32_t randomIndex; diff --git a/src/openrct2/world/MoneyEffect.cpp b/src/openrct2/world/MoneyEffect.cpp index 5174cee14e..c89b2d48cd 100644 --- a/src/openrct2/world/MoneyEffect.cpp +++ b/src/openrct2/world/MoneyEffect.cpp @@ -18,6 +18,11 @@ static constexpr const CoordsXY _moneyEffectMoveOffset[] = { { 1, -1 }, { 1, 1 }, { -1, 1 }, { -1, -1 } }; +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_MONEY_EFFECT; +} + bool rct_sprite::IsMoneyEffect() { return this->money_effect.sprite_identifier == SPRITE_IDENTIFIER_MISC diff --git a/src/openrct2/world/Particle.cpp b/src/openrct2/world/Particle.cpp index 60f5e7546b..b7735dda1a 100644 --- a/src/openrct2/world/Particle.cpp +++ b/src/openrct2/world/Particle.cpp @@ -14,6 +14,15 @@ #include +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_CRASHED_VEHICLE_PARTICLE; +} + +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_CRASH_SPLASH; +} /** * * rct2: 0x006735A1 diff --git a/src/openrct2/world/Sprite.cpp b/src/openrct2/world/Sprite.cpp index 3c63d08e93..96fe403fc4 100644 --- a/src/openrct2/world/Sprite.cpp +++ b/src/openrct2/world/Sprite.cpp @@ -52,6 +52,26 @@ static CoordsXYZ _spritelocations2[MAX_SPRITES]; static size_t GetSpatialIndexOffset(int32_t x, int32_t y); static void move_sprite_to_list(SpriteBase* sprite, SPRITE_LIST newListIndex); +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_LITTER; +} + +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_STEAM_PARTICLE; +} + +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_EXPLOSION_FLARE; +} + +template<> bool SpriteBase::Is() const +{ + return sprite_identifier == SPRITE_IDENTIFIER_MISC && type == SPRITE_MISC_EXPLOSION_CLOUD; +} + std::string rct_sprite_checksum::ToString() const { std::string result; diff --git a/src/openrct2/world/Sprite.h b/src/openrct2/world/Sprite.h index b88034f274..992937624f 100644 --- a/src/openrct2/world/Sprite.h +++ b/src/openrct2/world/Sprite.h @@ -100,6 +100,14 @@ struct VehicleCrashParticle : SpriteGeneric int32_t acceleration_z; }; +struct ExplosionFlare : SpriteGeneric +{ +}; + +struct ExplosionCloud : SpriteGeneric +{ +}; + struct CrashSplashParticle : SpriteGeneric { }; diff --git a/src/openrct2/world/SpriteBase.h b/src/openrct2/world/SpriteBase.h index 1cdc4cfc32..edf2a4af1c 100644 --- a/src/openrct2/world/SpriteBase.h +++ b/src/openrct2/world/SpriteBase.h @@ -33,6 +33,16 @@ struct SpriteBase uint8_t sprite_direction; void MoveTo(const CoordsXYZ& newLocation); + template bool Is() const; + template T* As() + { + T* result = nullptr; + if (Is()) + { + result = reinterpret_cast(this); + } + return result; + } }; struct SpriteGeneric : SpriteBase