Simplify code for Peep easter eggs

This commit is contained in:
Matt 2021-05-13 18:31:08 +03:00
parent 5b5aa0771e
commit 751db9f13e
No known key found for this signature in database
GPG Key ID: 18CE582C71A225B0
2 changed files with 23 additions and 22 deletions

View File

@ -47,6 +47,7 @@
#include "Staff.h" #include "Staff.h"
#include <algorithm> #include <algorithm>
#include <functional>
#include <iterator> #include <iterator>
using namespace OpenRCT2; using namespace OpenRCT2;
@ -431,11 +432,11 @@ template<> bool SpriteBase::Is<Guest>() const
return Type == EntityType::Guest; return Type == EntityType::Guest;
} }
bool Guest::GuestHasValidXY() const static bool IsValidLocation(const CoordsXYZ& coords)
{ {
if (x != LOCATION_NULL) if (coords.x != LOCATION_NULL)
{ {
if (map_is_location_valid({ x, y })) if (map_is_location_valid(coords))
{ {
return true; return true;
} }
@ -444,17 +445,23 @@ bool Guest::GuestHasValidXY() const
return false; return false;
} }
void Guest::ApplyEasterEggToNearbyGuests(easter_egg_function easter_egg) template<void (Guest::*EasterEggFunc)(Guest*)> static void ApplyEasterEggToNearbyGuests(Guest* guest)
{ {
if (!GuestHasValidXY()) const auto guestLoc = guest->GetLocation();
if (!IsValidLocation(guestLoc))
return; return;
for (auto* otherGuest : EntityTileList<Guest>({ x, y })) for (auto* otherGuest : EntityTileList<Guest>(guestLoc))
{ {
auto zDiff = std::abs(otherGuest->z - z); if (otherGuest == guest)
{
// Can not apply effect on self.
continue;
}
auto zDiff = std::abs(otherGuest->z - guestLoc.z);
if (zDiff <= 32) if (zDiff <= 32)
{ {
(*this.*easter_egg)(otherGuest); std::invoke(EasterEggFunc, *guest, otherGuest);
} }
} }
} }
@ -489,8 +496,6 @@ void Guest::GivePassingPeepsPizza(Guest* passingPeep)
void Guest::MakePassingPeepsSick(Guest* passingPeep) void Guest::MakePassingPeepsSick(Guest* passingPeep)
{ {
if (this == passingPeep)
return;
if (passingPeep->State != PeepState::Walking) if (passingPeep->State != PeepState::Walking)
return; return;
@ -505,8 +510,6 @@ void Guest::MakePassingPeepsSick(Guest* passingPeep)
void Guest::GivePassingPeepsIceCream(Guest* passingPeep) void Guest::GivePassingPeepsIceCream(Guest* passingPeep)
{ {
if (this == passingPeep)
return;
if (passingPeep->HasItem(ShopItem::IceCream)) if (passingPeep->HasItem(ShopItem::IceCream))
return; return;
@ -522,17 +525,22 @@ void Guest::UpdateEasterEggInteractions()
{ {
if (PeepFlags & PEEP_FLAGS_PURPLE) if (PeepFlags & PEEP_FLAGS_PURPLE)
{ {
ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsPurpleClothes); ApplyEasterEggToNearbyGuests<&Guest::GivePassingPeepsPurpleClothes>(this);
} }
if (PeepFlags & PEEP_FLAGS_PIZZA) if (PeepFlags & PEEP_FLAGS_PIZZA)
{ {
ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsPizza); ApplyEasterEggToNearbyGuests<&Guest::GivePassingPeepsPizza>(this);
} }
if (PeepFlags & PEEP_FLAGS_CONTAGIOUS) if (PeepFlags & PEEP_FLAGS_CONTAGIOUS)
{ {
ApplyEasterEggToNearbyGuests(&Guest::MakePassingPeepsSick); ApplyEasterEggToNearbyGuests<&Guest::MakePassingPeepsSick>(this);
}
if (PeepFlags & PEEP_FLAGS_ICE_CREAM)
{
ApplyEasterEggToNearbyGuests<&Guest::GivePassingPeepsIceCream>(this);
} }
if (PeepFlags & PEEP_FLAGS_JOY) if (PeepFlags & PEEP_FLAGS_JOY)
@ -548,11 +556,6 @@ void Guest::UpdateEasterEggInteractions()
} }
} }
} }
if (PeepFlags & PEEP_FLAGS_ICE_CREAM)
{
ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsIceCream);
}
} }
int32_t Guest::GetEasterEggNameId() const int32_t Guest::GetEasterEggNameId() const

View File

@ -816,9 +816,7 @@ private:
void UpdateRideShopLeave(); void UpdateRideShopLeave();
void loc_68F9F3(); void loc_68F9F3();
void loc_68FA89(); void loc_68FA89();
using easter_egg_function = void (Guest::*)(Guest* otherGuest);
int32_t CheckEasterEggName(int32_t index) const; int32_t CheckEasterEggName(int32_t index) const;
void ApplyEasterEggToNearbyGuests(easter_egg_function easter_egg);
bool GuestHasValidXY() const; bool GuestHasValidXY() const;
void GivePassingPeepsPurpleClothes(Guest* passingPeep); void GivePassingPeepsPurpleClothes(Guest* passingPeep);
void GivePassingPeepsPizza(Guest* passingPeep); void GivePassingPeepsPizza(Guest* passingPeep);