mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-16 11:33:03 +01:00
Merge pull request #15383 from Broxzier/refactor/smart-follow-cleanup
This commit is contained in:
@@ -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<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;
|
||||
}
|
||||
|
||||
if (peep->Is<Guest>())
|
||||
viewport_update_smart_guest_follow(window, peep);
|
||||
else if (peep->Is<Staff>())
|
||||
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<Guest>());
|
||||
break;
|
||||
|
||||
case EntityType::Staff:
|
||||
viewport_update_smart_staff_follow(window, entity->As<Staff>());
|
||||
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<Vehicle>(ride->vehicles[peep->CurrentTrain]);
|
||||
if (train != nullptr)
|
||||
{
|
||||
auto train = GetEntity<Vehicle>(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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user