Make smart follow functions easier to follow

Opted for a switch case instead of if-else if-else if-else
Reuse entity - is already checked for null and doesn't change
Remove unnecessary else blocks after if-block that returns
This commit is contained in:
Hielke Morsink 2021-09-08 22:55:08 +02:00
parent 0fcef925b6
commit d3263ef6b7
No known key found for this signature in database
GPG Key ID: FE0B343DF883E7F2
1 changed files with 54 additions and 66 deletions

View File

@ -669,40 +669,34 @@ void viewport_update_sprite_follow(rct_window* window)
void viewport_update_smart_sprite_follow(rct_window* window)
{
auto entity = TryGetEntity(window->viewport_smart_follow_sprite);
if (entity == nullptr)
if (entity == nullptr || entity->Type == EntityType::Null)
{
window->viewport_smart_follow_sprite = SPRITE_INDEX_NULL;
window->viewport_target_sprite = SPRITE_INDEX_NULL;
}
else if (entity->Type == EntityType::Guest || entity->Type == EntityType::Staff)
{
Peep* peep = TryGetEntity<Peep>(window->viewport_smart_follow_sprite);
if (peep == nullptr)
{
// will never happen
window->viewport_smart_follow_sprite = SPRITE_INDEX_NULL;
window->viewport_target_sprite = SPRITE_INDEX_NULL;
return;
}
switch (entity->Type)
{
case EntityType::Vehicle:
viewport_update_smart_vehicle_follow(window);
break;
case EntityType::Guest:
case EntityType::Staff:
{
Peep* peep = static_cast<Peep*>(entity);
if (peep->Is<Guest>())
viewport_update_smart_guest_follow(window, peep);
else if (peep->Is<Staff>())
viewport_update_smart_staff_follow(window, peep);
break;
}
else if (entity->Type == EntityType::Vehicle)
{
viewport_update_smart_vehicle_follow(window);
}
else if (entity->Type != EntityType::Null)
{
default: // All other types don't need any "smart" following; steam particle, duck, money effect, etc.
window->viewport_focus_sprite.sprite_id = window->viewport_smart_follow_sprite;
window->viewport_target_sprite = window->viewport_smart_follow_sprite;
}
else
{
window->viewport_smart_follow_sprite = SPRITE_INDEX_NULL;
window->viewport_target_sprite = SPRITE_INDEX_NULL;
break;
}
}
@ -719,8 +713,7 @@ viewport_focus viewport_update_smart_guest_follow(rct_window* window, Peep* peep
window->viewport_target_sprite = SPRITE_INDEX_NULL;
return focus;
}
else
{
bool overallFocus = true;
if (peep->State == PeepState::OnRide || peep->State == PeepState::EnteringRide
|| (peep->State == PeepState::LeavingRide && peep->x == LOCATION_NULL))
@ -740,6 +733,7 @@ viewport_focus viewport_update_smart_guest_follow(rct_window* window, Peep* peep
}
}
}
if (peep->x == LOCATION_NULL && overallFocus)
{
auto ride = get_ride(peep->CurrentRide);
@ -759,7 +753,6 @@ viewport_focus viewport_update_smart_guest_follow(rct_window* window, Peep* peep
focus.sprite.pad_486 &= 0xFFFF;
}
focus.coordinate.rotation = get_current_rotation();
}
window->viewport_focus_sprite = focus.sprite;
window->viewport_target_sprite = window->viewport_focus_sprite.sprite_id;
@ -774,15 +767,12 @@ void viewport_update_smart_staff_follow(rct_window* window, Peep* peep)
if (peep->State == PeepState::Picked)
{
// focus.sprite.sprite_id = SPRITE_INDEX_NULL;
window->viewport_smart_follow_sprite = SPRITE_INDEX_NULL;
window->viewport_target_sprite = SPRITE_INDEX_NULL;
return;
}
else
{
focus.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE;
}
window->viewport_focus_sprite = focus;
window->viewport_target_sprite = window->viewport_focus_sprite.sprite_id;
@ -790,9 +780,7 @@ void viewport_update_smart_staff_follow(rct_window* window, Peep* peep)
void viewport_update_smart_vehicle_follow(rct_window* window)
{
// Can be expanded in the future if needed
sprite_focus focus = {};
focus.sprite_id = window->viewport_smart_follow_sprite;
window->viewport_focus_sprite = focus;