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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user