diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 6358d3c650..72ded2585a 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -669,44 +669,35 @@ 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; + return; } - else if (entity->Type == EntityType::Guest || entity->Type == EntityType::Staff) - { - Peep* peep = TryGetEntity(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; - } - if (peep->Is()) - viewport_update_smart_guest_follow(window, peep); - else if (peep->Is()) - viewport_update_smart_staff_follow(window, peep); - } - else if (entity->Type == EntityType::Vehicle) + switch (entity->Type) { - viewport_update_smart_vehicle_follow(window); - } - else if (entity->Type != EntityType::Null) - { - 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; + case EntityType::Vehicle: + viewport_update_smart_vehicle_follow(window); + break; + + case EntityType::Guest: + viewport_update_smart_guest_follow(window, entity->As()); + break; + + case EntityType::Staff: + viewport_update_smart_staff_follow(window, entity->As()); + break; + + 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; + break; } } -viewport_focus viewport_update_smart_guest_follow(rct_window* window, Peep* peep) +viewport_focus viewport_update_smart_guest_follow(rct_window* window, const Guest* peep) { viewport_focus focus{}; focus.type = VIEWPORT_FOCUS_TYPE_SPRITE; @@ -719,54 +710,53 @@ 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)) { - bool overallFocus = true; - if (peep->State == PeepState::OnRide || peep->State == PeepState::EnteringRide - || (peep->State == PeepState::LeavingRide && peep->x == LOCATION_NULL)) + auto ride = get_ride(peep->CurrentRide); + if (ride != nullptr && (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { - auto ride = get_ride(peep->CurrentRide); - if (ride != nullptr && (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) + auto train = GetEntity(ride->vehicles[peep->CurrentTrain]); + if (train != nullptr) { - auto train = GetEntity(ride->vehicles[peep->CurrentTrain]); - if (train != nullptr) + const auto car = train->GetCar(peep->CurrentCar); + if (car != nullptr) { - const auto car = train->GetCar(peep->CurrentCar); - if (car != nullptr) - { - focus.sprite.sprite_id = car->sprite_index; - overallFocus = false; - } + focus.sprite.sprite_id = car->sprite_index; + overallFocus = false; } } } - if (peep->x == LOCATION_NULL && overallFocus) - { - auto ride = get_ride(peep->CurrentRide); - if (ride != nullptr) - { - auto xy = ride->overall_view.ToTileCentre(); - focus.type = VIEWPORT_FOCUS_TYPE_COORDINATE; - focus.coordinate.x = xy.x; - focus.coordinate.y = xy.y; - focus.coordinate.z = tile_element_height(xy) + (4 * COORDS_Z_STEP); - focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; - } - } - else - { - focus.sprite.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE; - focus.sprite.pad_486 &= 0xFFFF; - } - focus.coordinate.rotation = get_current_rotation(); } + if (peep->x == LOCATION_NULL && overallFocus) + { + auto ride = get_ride(peep->CurrentRide); + if (ride != nullptr) + { + auto xy = ride->overall_view.ToTileCentre(); + focus.type = VIEWPORT_FOCUS_TYPE_COORDINATE; + focus.coordinate.x = xy.x; + focus.coordinate.y = xy.y; + focus.coordinate.z = tile_element_height(xy) + (4 * COORDS_Z_STEP); + focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; + } + } + else + { + focus.sprite.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE; + 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; return focus; } -void viewport_update_smart_staff_follow(rct_window* window, Peep* peep) +void viewport_update_smart_staff_follow(rct_window* window, const Staff* peep) { sprite_focus focus = {}; @@ -774,15 +764,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; - } + + 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 +777,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; diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index 3bd4f8880a..09091e511b 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -20,11 +20,12 @@ struct paint_session; struct RecordedPaintSession; struct paint_struct; struct rct_drawpixelinfo; -struct Peep; struct TileElement; struct rct_window; -union paint_entry; struct EntityBase; +struct Guest; +struct Staff; +union paint_entry; enum { @@ -111,8 +112,8 @@ void viewports_invalidate(int32_t left, int32_t top, int32_t right, int32_t bott void viewport_update_position(rct_window* window); void viewport_update_sprite_follow(rct_window* window); void viewport_update_smart_sprite_follow(rct_window* window); -viewport_focus viewport_update_smart_guest_follow(rct_window* window, Peep* peep); -void viewport_update_smart_staff_follow(rct_window* window, Peep* peep); +viewport_focus viewport_update_smart_guest_follow(rct_window* window, const Guest* peep); +void viewport_update_smart_staff_follow(rct_window* window, const Staff* peep); void viewport_update_smart_vehicle_follow(rct_window* window); void viewport_render( rct_drawpixelinfo* dpi, const rct_viewport* viewport, int32_t left, int32_t top, int32_t right, int32_t bottom, diff --git a/src/openrct2/rct2/S6Exporter.h b/src/openrct2/rct2/S6Exporter.h index 9970a7ef3e..b5a69db52d 100644 --- a/src/openrct2/rct2/S6Exporter.h +++ b/src/openrct2/rct2/S6Exporter.h @@ -26,8 +26,9 @@ namespace OpenRCT2 struct Litter; struct ObjectRepositoryItem; struct RCT12SpriteBase; -union rct_sprite; struct EntityBase; +struct Peep; +union rct_sprite; /** * Class to export RollerCoaster Tycoon 2 scenarios (*.SC6) and saved games (*.SV6).