From cc62e41feb78efe22b837d890a028cfcf64d73c8 Mon Sep 17 00:00:00 2001 From: Jim Armstrong Date: Fri, 21 Jun 2019 14:40:09 -0400 Subject: [PATCH] Refactor #9291: Move easter egg code to Guest Refactored static Peep functions related to easter egg names into member functions in the Guest struct. --- src/openrct2/actions/GuestSetNameAction.hpp | 8 +- src/openrct2/actions/StaffSetNameAction.hpp | 2 - src/openrct2/peep/Guest.cpp | 319 +++++++++++++++++++ src/openrct2/peep/Peep.cpp | 324 +------------------- src/openrct2/peep/Peep.h | 15 +- src/openrct2/ride/Station.cpp | 38 ++- 6 files changed, 360 insertions(+), 346 deletions(-) diff --git a/src/openrct2/actions/GuestSetNameAction.hpp b/src/openrct2/actions/GuestSetNameAction.hpp index 31cd19b604..26828aeeec 100644 --- a/src/openrct2/actions/GuestSetNameAction.hpp +++ b/src/openrct2/actions/GuestSetNameAction.hpp @@ -113,7 +113,13 @@ public: peep_update_name_sort(peep); - peep_handle_easteregg_name(peep); + // Easter egg functions are for guests only + Guest* guest = peep->AsGuest(); + + if (guest != nullptr) + { + guest->HandleEasterEggName(); + } gfx_invalidate_screen(); diff --git a/src/openrct2/actions/StaffSetNameAction.hpp b/src/openrct2/actions/StaffSetNameAction.hpp index 5a912e1d2a..9c9faf0f7d 100644 --- a/src/openrct2/actions/StaffSetNameAction.hpp +++ b/src/openrct2/actions/StaffSetNameAction.hpp @@ -118,8 +118,6 @@ public: peep_update_name_sort(peep); - peep_handle_easteregg_name(peep); - gfx_invalidate_screen(); auto intent = Intent(INTENT_ACTION_REFRESH_STAFF_LIST); diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 1db93bee66..47cd46a62d 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -343,6 +343,33 @@ static constexpr const uint8_t peep_extra_item_containers[] = { 0xFF, // PEEP_ITEM_EMPTY_BOWL_BLUE }; +static constexpr const char *gPeepEasterEggNames[] = { + "MICHAEL SCHUMACHER", + "JACQUES VILLENEUVE", + "DAMON HILL", + "MR BEAN", + "CHRIS SAWYER", + "KATIE BRAYSHAW", + "MELANIE WARN", + "SIMON FOSTER", + "JOHN WARDLEY", + "LISA STIRLING", + "DONALD MACRAE", + "KATHERINE MCGOWAN", + "FRANCES MCGOWAN", + "CORINA MASSOURA", + "CAROL YOUNG", + "MIA SHERIDAN", + "KATIE RODGER", + "EMMA GARRELL", + "JOANNE BARTON", + "FELICITY ANDERSON", + "KATIE SMITH", + "EILIDH BELL", + "NANCY STILLWAGON", + "DAVID ELLIS" +}; + // These arrays contain the base minimum and maximum nausea ratings for peeps, based on their nausea tolerance level. static constexpr const ride_rating NauseaMinimumThresholds[] = { 0, 0, 200, 400 @@ -369,6 +396,298 @@ static void peep_head_for_nearest_ride_type(Guest* peep, int32_t rideType); static void peep_head_for_nearest_ride_with_flags(Guest* peep, int32_t rideTypeFlags); bool loc_690FD0(Peep* peep, uint8_t* rideToView, uint8_t* rideSeatToView, TileElement* tileElement); +bool Guest::GuestHasValidXY() const +{ + if (x != LOCATION_NULL) + { + if (x < (256 * 32) && y < (256 * 32)) + { + return true; + } + } + + return false; +} + +void Guest::ApplyEasterEggToNearbyGuests(easter_egg_function easter_egg) +{ + if (!GuestHasValidXY()) + return; + + uint16_t spriteIndex = sprite_get_first_in_quadrant(x, y); + if (spriteIndex == SPRITE_INDEX_NULL) + return; + + auto otherPeep = GET_PEEP(spriteIndex); + for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) + { + otherPeep = GET_PEEP(spriteIndex); + auto otherGuest = otherPeep->AsGuest(); + if (otherGuest) + { + auto zDiff = std::abs(otherPeep->z - z); + if (zDiff <= 32) + { + (*this.*easter_egg)(otherGuest); + } + } + } +} + +void Guest::GivePassingPeepsPurpleClothes(Guest* passingPeep) +{ + passingPeep->tshirt_colour = COLOUR_BRIGHT_PURPLE; + passingPeep->trousers_colour = COLOUR_BRIGHT_PURPLE; + invalidate_sprite_2((rct_sprite*)passingPeep); +} + +void Guest::GivePassingPeepsPizza(Guest* passingPeep) +{ + if ((passingPeep->item_standard_flags & PEEP_ITEM_PIZZA)) + return; + + passingPeep->item_standard_flags |= PEEP_ITEM_PIZZA; + + int32_t peepDirection = (sprite_direction >> 3) ^ 2; + int32_t otherPeepOppositeDirection = passingPeep->sprite_direction >> 3; + if (peepDirection == otherPeepOppositeDirection) + { + if (passingPeep->action == PEEP_ACTION_NONE_1 || passingPeep->action == PEEP_ACTION_NONE_2) + { + Invalidate(); + passingPeep->action = PEEP_ACTION_WAVE_2; + passingPeep->action_frame = 0; + passingPeep->action_sprite_image_offset = 0; + passingPeep->UpdateCurrentActionSpriteType(); + invalidate_sprite_2((rct_sprite*)passingPeep); + } + } + invalidate_sprite_2((rct_sprite*)passingPeep); +} + +void Guest::MakePassingPeepsSick(Guest* passingPeep) +{ + if (this == passingPeep) + return; + if (passingPeep->state != PEEP_STATE_WALKING) + return; + + if (passingPeep->action == PEEP_ACTION_NONE_1 || passingPeep->action == PEEP_ACTION_NONE_2) + { + passingPeep->action = PEEP_ACTION_THROW_UP; + passingPeep->action_frame = 0; + passingPeep->action_sprite_image_offset = 0; + passingPeep->UpdateCurrentActionSpriteType(); + invalidate_sprite_2((rct_sprite*)passingPeep); + } +} + +void Guest::GivePassingPeepsIceCream(Guest* passingPeep) +{ + if (this == passingPeep) + return; + if (passingPeep->item_standard_flags & PEEP_ITEM_ICE_CREAM) + return; + + passingPeep->item_standard_flags |= PEEP_ITEM_ICE_CREAM; + passingPeep->UpdateSpriteType(); +} + +/** + * + * rct2: 0x0068FD3A + */ +void Guest::UpdateEasterEggInteractions() +{ + if (peep_flags & PEEP_FLAGS_PURPLE) + { + ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsPurpleClothes); + } + + if (peep_flags & PEEP_FLAGS_PIZZA) + { + ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsPizza); + } + + if (peep_flags & PEEP_FLAGS_CONTAGIOUS) + { + ApplyEasterEggToNearbyGuests(&Guest::MakePassingPeepsSick); + } + + if (peep_flags & PEEP_FLAGS_JOY) + { + if (scenario_rand() <= 1456) + { + if (action == PEEP_ACTION_NONE_1 || action == PEEP_ACTION_NONE_2) + { + action = PEEP_ACTION_JOY; + action_frame = 0; + action_sprite_image_offset = 0; + UpdateCurrentActionSpriteType(); + Invalidate(); + } + } + } + + if (peep_flags & PEEP_FLAGS_ICE_CREAM) + { + ApplyEasterEggToNearbyGuests(&Guest::GivePassingPeepsIceCream); + } +} + +int32_t Guest::GetEasterEggNameId() const +{ + char buffer[256]; + + format_string(buffer, 256, this->name_string_idx, &this->id); + + for (uint32_t i = 0; i < std::size(gPeepEasterEggNames); i++) + if (_stricmp(buffer, gPeepEasterEggNames[i]) == 0) + return static_cast(i); + + return -1; +} + +void Guest::HandleEasterEggName() +{ + peep_flags &= ~PEEP_FLAGS_WAVING; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_KATIE_BRAYSHAW)) + { + peep_flags |= PEEP_FLAGS_WAVING; + } + + peep_flags &= ~PEEP_FLAGS_PHOTO; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_CHRIS_SAWYER)) + { + peep_flags |= PEEP_FLAGS_PHOTO; + } + + peep_flags &= ~PEEP_FLAGS_PAINTING; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_SIMON_FOSTER)) + { + peep_flags |= PEEP_FLAGS_PAINTING; + } + + peep_flags &= ~PEEP_FLAGS_WOW; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_JOHN_WARDLEY)) + { + peep_flags |= PEEP_FLAGS_WOW; + } + + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_MELANIE_WARN)) + { + happiness = 250; + happiness_target = 250; + energy = 127; + energy_target = 127; + nausea = 0; + nausea_target = 0; + } + + peep_flags &= ~PEEP_FLAGS_LITTER; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_LISA_STIRLING)) + { + peep_flags |= PEEP_FLAGS_LITTER; + } + + peep_flags &= ~PEEP_FLAGS_LOST; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_DONALD_MACRAE)) + { + peep_flags |= PEEP_FLAGS_LOST; + } + + peep_flags &= ~PEEP_FLAGS_HUNGER; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_KATHERINE_MCGOWAN)) + { + peep_flags |= PEEP_FLAGS_HUNGER; + } + + peep_flags &= ~PEEP_FLAGS_BATHROOM; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_FRANCES_MCGOWAN)) + { + peep_flags |= PEEP_FLAGS_BATHROOM; + } + + peep_flags &= ~PEEP_FLAGS_CROWDED; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_CORINA_MASSOURA)) + { + peep_flags |= PEEP_FLAGS_CROWDED; + } + + peep_flags &= ~PEEP_FLAGS_HAPPINESS; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_CAROL_YOUNG)) + { + peep_flags |= PEEP_FLAGS_HAPPINESS; + } + + peep_flags &= ~PEEP_FLAGS_NAUSEA; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_MIA_SHERIDAN)) + { + peep_flags |= PEEP_FLAGS_NAUSEA; + } + + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_KATIE_RODGER)) + { + peep_flags |= PEEP_FLAGS_LEAVING_PARK; + peep_flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; + } + + peep_flags &= ~PEEP_FLAGS_PURPLE; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_EMMA_GARRELL)) + { + peep_flags |= PEEP_FLAGS_PURPLE; + } + + peep_flags &= ~PEEP_FLAGS_PIZZA; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_JOANNE_BARTON)) + { + peep_flags |= PEEP_FLAGS_PIZZA; + } + + peep_flags &= ~PEEP_FLAGS_CONTAGIOUS; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_FELICITY_ANDERSON)) + { + peep_flags |= PEEP_FLAGS_CONTAGIOUS; + } + + peep_flags &= ~PEEP_FLAGS_JOY; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_KATIE_SMITH)) + { + peep_flags |= PEEP_FLAGS_JOY; + } + + peep_flags &= ~PEEP_FLAGS_ANGRY; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_EILIDH_BELL)) + { + peep_flags |= PEEP_FLAGS_ANGRY; + } + + peep_flags &= ~PEEP_FLAGS_ICE_CREAM; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_NANCY_STILLWAGON)) + { + peep_flags |= PEEP_FLAGS_ICE_CREAM; + } + + peep_flags &= ~PEEP_FLAGS_HERE_WE_ARE; + if (CheckEasterEggName(EASTEREGG_PEEP_NAME_DAVID_ELLIS)) + { + peep_flags |= PEEP_FLAGS_HERE_WE_ARE; + } +} + +/** + * + * rct2: 0x0069A5A0 + * tests if a peep's name matches a cheat code, normally returns using a register flag + */ +int32_t Guest::CheckEasterEggName(int32_t index) const +{ + char buffer[256]; + + format_string(buffer, 256, this->name_string_idx, &this->id); + return _stricmp(buffer, gPeepEasterEggNames[index]) == 0; +} + void Guest::Tick128UpdateGuest(int32_t index) { if ((uint32_t)(index & 0x1FF) == (gCurrentTicks & 0x1FF)) diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 09f09e69cb..396f6da7bd 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -79,37 +79,9 @@ static TileElement* _peepRideEntranceExitElement; static void* _crowdSoundChannel = nullptr; static void peep_128_tick_update(Peep* peep, int32_t index); -static void peep_easter_egg_peep_interactions(Guest* peep); static void peep_give_real_name(Peep* peep); static void peep_release_balloon(Guest* peep, int16_t spawn_height); - // clang-format off -static constexpr const char *gPeepEasterEggNames[] = { - "MICHAEL SCHUMACHER", - "JACQUES VILLENEUVE", - "DAMON HILL", - "MR BEAN", - "CHRIS SAWYER", - "KATIE BRAYSHAW", - "MELANIE WARN", - "SIMON FOSTER", - "JOHN WARDLEY", - "LISA STIRLING", - "DONALD MACRAE", - "KATHERINE MCGOWAN", - "FRANCES MCGOWAN", - "CORINA MASSOURA", - "CAROL YOUNG", - "MIA SHERIDAN", - "KATIE RODGER", - "EMMA GARRELL", - "JOANNE BARTON", - "FELICITY ANDERSON", - "KATIE SMITH", - "EILIDH BELL", - "NANCY STILLWAGON", - "DAVID ELLIS" -}; /** rct2: 0x00981DB0 */ static struct @@ -1178,7 +1150,7 @@ void Peep::Update() auto guest = AsGuest(); if (guest != nullptr) { - peep_easter_egg_peep_interactions(guest); + guest->UpdateEasterEggInteractions(); } } else @@ -2157,32 +2129,6 @@ int32_t get_peep_face_sprite_large(Peep* peep) return face_sprite_large[get_face_sprite_offset(peep)]; } -/** - * - * rct2: 0x0069A5A0 - * tests if a peep's name matches a cheat code, normally returns using a register flag - */ -int32_t peep_check_easteregg_name(int32_t index, Peep* peep) -{ - char buffer[256]; - - format_string(buffer, 256, peep->name_string_idx, &peep->id); - return _stricmp(buffer, gPeepEasterEggNames[index]) == 0; -} - -int32_t peep_get_easteregg_name_id(Peep* peep) -{ - char buffer[256]; - - format_string(buffer, 256, peep->name_string_idx, &peep->id); - - for (uint32_t i = 0; i < std::size(gPeepEasterEggNames); i++) - if (_stricmp(buffer, gPeepEasterEggNames[i]) == 0) - return static_cast(i); - - return -1; -} - void peep_set_map_tooltip(Peep* peep) { if (peep->type == PEEP_TYPE_GUEST) @@ -3196,147 +3142,6 @@ void peep_reset_pathfind_goal(Peep* peep) peep->pathfind_goal.direction = 0xFF; } -static bool peep_has_valid_xy(Peep* peep) -{ - if (peep->x != LOCATION_NULL) - { - if (peep->x < (256 * 32) && peep->y < (256 * 32)) - { - return true; - } - } - - return false; -} - -using easter_egg_function = void (*)(Guest* peep, Guest* otherPeep); - -static void peep_apply_easter_egg_to_nearby_guests(Guest* peep, easter_egg_function easter_egg) -{ - if (!peep_has_valid_xy(peep)) - return; - - uint16_t spriteIndex = sprite_get_first_in_quadrant(peep->x, peep->y); - if (spriteIndex == SPRITE_INDEX_NULL) - return; - - auto otherPeep = GET_PEEP(spriteIndex); - for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) - { - otherPeep = GET_PEEP(spriteIndex); - auto otheerGuest = otherPeep->AsGuest(); - if (otheerGuest != nullptr) - { - auto zDiff = std::abs(otherPeep->z - peep->z); - if (zDiff <= 32) - { - easter_egg(peep, otheerGuest); - } - } - } -} - -static void peep_give_passing_peeps_purple_clothes([[maybe_unused]] Guest* peep, Guest* otherPeep) -{ - otherPeep->tshirt_colour = COLOUR_BRIGHT_PURPLE; - otherPeep->trousers_colour = COLOUR_BRIGHT_PURPLE; - invalidate_sprite_2((rct_sprite*)otherPeep); -} - -static void peep_give_passing_peeps_pizza(Guest* peep, Guest* otherPeep) -{ - if ((otherPeep->item_standard_flags & PEEP_ITEM_PIZZA)) - return; - - otherPeep->item_standard_flags |= PEEP_ITEM_PIZZA; - - int32_t peepDirection = (peep->sprite_direction >> 3) ^ 2; - int32_t otherPeepOppositeDirection = otherPeep->sprite_direction >> 3; - if (peepDirection == otherPeepOppositeDirection) - { - if (otherPeep->action == PEEP_ACTION_NONE_1 || otherPeep->action == PEEP_ACTION_NONE_2) - { - peep->Invalidate(); - otherPeep->action = PEEP_ACTION_WAVE_2; - otherPeep->action_frame = 0; - otherPeep->action_sprite_image_offset = 0; - otherPeep->UpdateCurrentActionSpriteType(); - invalidate_sprite_2((rct_sprite*)otherPeep); - } - } - invalidate_sprite_2((rct_sprite*)otherPeep); -} - -static void peep_make_passing_peeps_sick(Guest* peep, Guest* otherPeep) -{ - if (peep == otherPeep) - return; - if (otherPeep->state != PEEP_STATE_WALKING) - return; - - if (otherPeep->action == PEEP_ACTION_NONE_1 || otherPeep->action == PEEP_ACTION_NONE_2) - { - otherPeep->action = PEEP_ACTION_THROW_UP; - otherPeep->action_frame = 0; - otherPeep->action_sprite_image_offset = 0; - otherPeep->UpdateCurrentActionSpriteType(); - invalidate_sprite_2((rct_sprite*)otherPeep); - } -} - -static void peep_give_passing_peeps_ice_cream(Guest* peep, Guest* otherPeep) -{ - if (peep == otherPeep) - return; - if (otherPeep->item_standard_flags & PEEP_ITEM_ICE_CREAM) - return; - - otherPeep->item_standard_flags |= PEEP_ITEM_ICE_CREAM; - otherPeep->UpdateSpriteType(); -} - -/** - * - * rct2: 0x0068FD3A - */ -static void peep_easter_egg_peep_interactions(Guest* peep) -{ - if (peep->peep_flags & PEEP_FLAGS_PURPLE) - { - peep_apply_easter_egg_to_nearby_guests(peep, &peep_give_passing_peeps_purple_clothes); - } - - if (peep->peep_flags & PEEP_FLAGS_PIZZA) - { - peep_apply_easter_egg_to_nearby_guests(peep, &peep_give_passing_peeps_pizza); - } - - if (peep->peep_flags & PEEP_FLAGS_CONTAGIOUS) - { - peep_apply_easter_egg_to_nearby_guests(peep, &peep_make_passing_peeps_sick); - } - - if (peep->peep_flags & PEEP_FLAGS_JOY) - { - if (scenario_rand() <= 1456) - { - if (peep->action == PEEP_ACTION_NONE_1 || peep->action == PEEP_ACTION_NONE_2) - { - peep->action = PEEP_ACTION_JOY; - peep->action_frame = 0; - peep->action_sprite_image_offset = 0; - peep->UpdateCurrentActionSpriteType(); - peep->Invalidate(); - } - } - } - - if (peep->peep_flags & PEEP_FLAGS_ICE_CREAM) - { - peep_apply_easter_egg_to_nearby_guests(peep, &peep_give_passing_peeps_ice_cream); - } -} - /** * Gets the height including the bit depending on how far up the slope the peep * is. @@ -3590,133 +3395,6 @@ void peep_update_names(bool realNames) gfx_invalidate_screen(); } -void peep_handle_easteregg_name(Peep* peep) -{ - peep->peep_flags &= ~PEEP_FLAGS_WAVING; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_BRAYSHAW, peep)) - { - peep->peep_flags |= PEEP_FLAGS_WAVING; - } - - peep->peep_flags &= ~PEEP_FLAGS_PHOTO; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CHRIS_SAWYER, peep)) - { - peep->peep_flags |= PEEP_FLAGS_PHOTO; - } - - peep->peep_flags &= ~PEEP_FLAGS_PAINTING; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_SIMON_FOSTER, peep)) - { - peep->peep_flags |= PEEP_FLAGS_PAINTING; - } - - peep->peep_flags &= ~PEEP_FLAGS_WOW; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_JOHN_WARDLEY, peep)) - { - peep->peep_flags |= PEEP_FLAGS_WOW; - } - - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_MELANIE_WARN, peep)) - { - peep->happiness = 250; - peep->happiness_target = 250; - peep->energy = 127; - peep->energy_target = 127; - peep->nausea = 0; - peep->nausea_target = 0; - } - - peep->peep_flags &= ~PEEP_FLAGS_LITTER; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_LISA_STIRLING, peep)) - { - peep->peep_flags |= PEEP_FLAGS_LITTER; - } - - peep->peep_flags &= ~PEEP_FLAGS_LOST; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_DONALD_MACRAE, peep)) - { - peep->peep_flags |= PEEP_FLAGS_LOST; - } - - peep->peep_flags &= ~PEEP_FLAGS_HUNGER; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATHERINE_MCGOWAN, peep)) - { - peep->peep_flags |= PEEP_FLAGS_HUNGER; - } - - peep->peep_flags &= ~PEEP_FLAGS_BATHROOM; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_FRANCES_MCGOWAN, peep)) - { - peep->peep_flags |= PEEP_FLAGS_BATHROOM; - } - - peep->peep_flags &= ~PEEP_FLAGS_CROWDED; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CORINA_MASSOURA, peep)) - { - peep->peep_flags |= PEEP_FLAGS_CROWDED; - } - - peep->peep_flags &= ~PEEP_FLAGS_HAPPINESS; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CAROL_YOUNG, peep)) - { - peep->peep_flags |= PEEP_FLAGS_HAPPINESS; - } - - peep->peep_flags &= ~PEEP_FLAGS_NAUSEA; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_MIA_SHERIDAN, peep)) - { - peep->peep_flags |= PEEP_FLAGS_NAUSEA; - } - - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_RODGER, peep)) - { - peep->peep_flags |= PEEP_FLAGS_LEAVING_PARK; - peep->peep_flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; - } - - peep->peep_flags &= ~PEEP_FLAGS_PURPLE; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EMMA_GARRELL, peep)) - { - peep->peep_flags |= PEEP_FLAGS_PURPLE; - } - - peep->peep_flags &= ~PEEP_FLAGS_PIZZA; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_JOANNE_BARTON, peep)) - { - peep->peep_flags |= PEEP_FLAGS_PIZZA; - } - - peep->peep_flags &= ~PEEP_FLAGS_CONTAGIOUS; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_FELICITY_ANDERSON, peep)) - { - peep->peep_flags |= PEEP_FLAGS_CONTAGIOUS; - } - - peep->peep_flags &= ~PEEP_FLAGS_JOY; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_SMITH, peep)) - { - peep->peep_flags |= PEEP_FLAGS_JOY; - } - - peep->peep_flags &= ~PEEP_FLAGS_ANGRY; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EILIDH_BELL, peep)) - { - peep->peep_flags |= PEEP_FLAGS_ANGRY; - } - - peep->peep_flags &= ~PEEP_FLAGS_ICE_CREAM; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_NANCY_STILLWAGON, peep)) - { - peep->peep_flags |= PEEP_FLAGS_ICE_CREAM; - } - - peep->peep_flags &= ~PEEP_FLAGS_HERE_WE_ARE; - if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_DAVID_ELLIS, peep)) - { - peep->peep_flags |= PEEP_FLAGS_HERE_WE_ARE; - } -} - #if defined(DEBUG_LEVEL_1) && DEBUG_LEVEL_1 void pathfind_logging_enable([[maybe_unused]] Peep* peep) { diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index 5ce95b4dde..9bc7c92811 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -774,6 +774,9 @@ public: void CheckCantFindExit(); bool DecideAndBuyItem(Ride* ride, int32_t shopItem, money32 price); void SetSpriteType(PeepSpriteType new_sprite_type); + void HandleEasterEggName(); + int32_t GetEasterEggNameId() const; + void UpdateEasterEggInteractions(); private: void UpdateRide(); @@ -805,7 +808,14 @@ private: void UpdateRideShopApproach(); void UpdateRideShopInteract(); void UpdateRideShopLeave(); - + using easter_egg_function = void (Guest::*)(Guest* otherGuest); + int32_t CheckEasterEggName(int32_t index) const; + void ApplyEasterEggToNearbyGuests(easter_egg_function easter_egg); + bool GuestHasValidXY() const; + void GivePassingPeepsPurpleClothes(Guest* passingPeep); + void GivePassingPeepsPizza(Guest* passingPeep); + void MakePassingPeepsSick(Guest* passingPeep); + void GivePassingPeepsIceCream(Guest* passingPeep); Ride* FindBestRideToGoOn(); std::bitset FindRidesToGoOn(); }; @@ -951,8 +961,6 @@ void get_arguments_from_action(Peep* peep, uint32_t* argument_1, uint32_t* argum void peep_thought_set_format_args(rct_peep_thought* thought); int32_t get_peep_face_sprite_small(Peep* peep); int32_t get_peep_face_sprite_large(Peep* peep); -int32_t peep_check_easteregg_name(int32_t index, Peep* peep); -int32_t peep_get_easteregg_name_id(Peep* peep); void game_command_pickup_guest( int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); void peep_sprite_remove(Peep* peep); @@ -968,7 +976,6 @@ void peep_sort(); void peep_update_names(bool realNames); void guest_set_name(uint16_t spriteIndex, const char* name); -void peep_handle_easteregg_name(Peep* peep); int32_t peep_pathfind_choose_direction(TileCoordsXYZ loc, Peep* peep); void peep_reset_pathfind_goal(Peep* peep); diff --git a/src/openrct2/ride/Station.cpp b/src/openrct2/ride/Station.cpp index 44c0f0a4fc..9d00fe345f 100644 --- a/src/openrct2/ride/Station.cpp +++ b/src/openrct2/ride/Station.cpp @@ -284,23 +284,29 @@ static void ride_race_init_vehicle_speeds(Ride* ride) { Peep* peep = &get_sprite(vehicle->peep[0])->peep; - switch (peep_get_easteregg_name_id(peep)) + // Easter egg names should only work on guests + Guest* guest = peep->AsGuest(); + + if (guest != nullptr) { - case EASTEREGG_PEEP_NAME_MICHAEL_SCHUMACHER: - vehicle->speed += 35; - break; - case EASTEREGG_PEEP_NAME_JACQUES_VILLENEUVE: - vehicle->speed += 25; - break; - case EASTEREGG_PEEP_NAME_DAMON_HILL: - vehicle->speed += 55; - break; - case EASTEREGG_PEEP_NAME_CHRIS_SAWYER: - vehicle->speed += 14; - break; - case EASTEREGG_PEEP_NAME_MR_BEAN: - vehicle->speed = 9; - break; + switch (guest->GetEasterEggNameId()) + { + case EASTEREGG_PEEP_NAME_MICHAEL_SCHUMACHER: + vehicle->speed += 35; + break; + case EASTEREGG_PEEP_NAME_JACQUES_VILLENEUVE: + vehicle->speed += 25; + break; + case EASTEREGG_PEEP_NAME_DAMON_HILL: + vehicle->speed += 55; + break; + case EASTEREGG_PEEP_NAME_CHRIS_SAWYER: + vehicle->speed += 14; + break; + case EASTEREGG_PEEP_NAME_MR_BEAN: + vehicle->speed = 9; + break; + } } } }