1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Merge pull request #9459 from 41northstudios/refactor-9291

Refactor #9291: Move easter egg code to Guest
This commit is contained in:
Duncan
2019-07-11 20:37:25 +01:00
committed by GitHub
6 changed files with 360 additions and 346 deletions

View File

@@ -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();

View File

@@ -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);

View File

@@ -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<int32_t>(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))

View File

@@ -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<int32_t>(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)
{

View File

@@ -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<MAX_RIDES> 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);

View File

@@ -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;
}
}
}
}