Merge pull request #18208 from Gymnasiast/fix/18204

Fix #18204: Crash opening New Ride window with invalid highlight
This commit is contained in:
Michael Steenbeek 2022-10-06 10:54:19 +02:00 committed by GitHub
commit fa81f119c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 24 additions and 27 deletions

View File

@ -1508,7 +1508,7 @@ private:
;
rct_ride_entry* ride_entry = get_ride_entry(entry_index);
auto rideType = ride_entry_get_first_non_null_ride_type(ride_entry);
auto rideType = ride_entry->GetFirstNonNullRideType();
auto intent = Intent(WindowClass::TrackDesignList);
intent.putExtra(INTENT_EXTRA_RIDE_TYPE, rideType);
@ -1589,7 +1589,7 @@ void EditorLoadSelectedObjects()
if (objectType == ObjectType::Ride)
{
rct_ride_entry* rideEntry = get_ride_entry(entryIndex);
auto rideType = ride_entry_get_first_non_null_ride_type(rideEntry);
auto rideType = rideEntry->GetFirstNonNullRideType();
ResearchCategory category = static_cast<ResearchCategory>(GetRideTypeDescriptor(rideType).Category);
research_insert_ride_entry(rideType, entryIndex, category, true);
}

View File

@ -989,7 +989,9 @@ void WindowNewRideFocus(RideSelection rideItem)
}
rct_ride_entry* rideEntry = get_ride_entry(rideItem.EntryIndex);
auto rideTypeIndex = ride_entry_get_first_non_null_ride_type(rideEntry);
if (rideEntry == nullptr)
return;
auto rideTypeIndex = rideEntry->GetFirstNonNullRideType();
w->SetPage(GetRideTypeDescriptor(rideTypeIndex).Category);
}

View File

@ -208,7 +208,7 @@ void research_finish_item(ResearchItem* researchItem)
if (!RideTypeIsValid(base_ride_type))
{
log_warning("Invalid ride type: %d", base_ride_type);
base_ride_type = ride_entry_get_first_non_null_ride_type(rideEntry);
base_ride_type = rideEntry->GetFirstNonNullRideType();
}
StringId availabilityString;

View File

@ -326,7 +326,7 @@ ImageIndex RideObject::GetPreviewImage(ride_type_t type)
void RideObject::SetRepositoryItem(ObjectRepositoryItem* item) const
{
// Find the first non-null ride type, to be used when checking the ride group and determining the category.
uint8_t firstRideType = ride_entry_get_first_non_null_ride_type(&_legacyType);
auto firstRideType = _legacyType.GetFirstNonNullRideType();
uint8_t category = GetRideTypeDescriptor(firstRideType).Category;
for (int32_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++)

View File

@ -2229,7 +2229,7 @@ namespace RCT1
if (rideEntry != nullptr)
{
auto rideType = ride_entry_get_first_non_null_ride_type(rideEntry);
auto rideType = rideEntry->GetFirstNonNullRideType();
dst->entryIndex = entryIndex;
dst->baseRideType = rideType;
dst->type = Research::EntryType::Ride;
@ -2248,7 +2248,7 @@ namespace RCT1
if (rideEntry != nullptr)
{
auto rideType = ride_entry_get_first_non_null_ride_type(rideEntry);
auto rideType = rideEntry->GetFirstNonNullRideType();
dst->entryIndex = entryIndex;
dst->baseRideType = rideType;
dst->type = Research::EntryType::Ride;

View File

@ -751,7 +751,7 @@ namespace RCT2
ObjectEntryIndex originalRideType = src->type;
if (rideEntry != nullptr)
{
originalRideType = ride_entry_get_first_non_null_ride_type(rideEntry);
originalRideType = rideEntry->GetFirstNonNullRideType();
}
const auto isFlatRide = GetRideTypeDescriptor(originalRideType).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE);
_isFlatRide.set(static_cast<size_t>(index), isFlatRide);

View File

@ -5515,22 +5515,6 @@ bool ride_has_ratings(const Ride* ride)
return ride->excitement != RIDE_RATING_UNDEFINED;
}
/**
* Searches for a non-null ride type in a ride entry.
* If none is found, it will still return RIDE_TYPE_NULL.
*/
ride_type_t ride_entry_get_first_non_null_ride_type(const rct_ride_entry* rideEntry)
{
for (uint8_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++)
{
if (rideEntry->ride_type[i] != RIDE_TYPE_NULL)
{
return rideEntry->ride_type[i];
}
}
return RIDE_TYPE_NULL;
}
int32_t get_booster_speed(ride_type_t rideType, int32_t rawSpeed)
{
int8_t shiftFactor = GetRideTypeDescriptor(rideType).OperatingSettings.BoosterSpeedFactor;
@ -5582,7 +5566,7 @@ void fix_invalid_vehicle_sprite_sizes()
bool ride_entry_has_category(const rct_ride_entry* rideEntry, uint8_t category)
{
auto rideType = ride_entry_get_first_non_null_ride_type(rideEntry);
auto rideType = rideEntry->GetFirstNonNullRideType();
return GetRideTypeDescriptor(rideType).Category == category;
}

View File

@ -18,6 +18,7 @@
#include "../rct2/Limits.h"
#include "../world/Map.h"
#include "RideColour.h"
#include "RideEntry.h"
#include "RideRatings.h"
#include "RideTypes.h"
#include "Track.h"
@ -39,7 +40,6 @@ struct Vehicle;
struct rct_ride_entry;
struct ResultWithMessage;
#define RIDE_TYPE_NULL 255
#define RIDE_ADJACENCY_CHECK_DISTANCE 5
constexpr uint8_t TUNE_ID_NULL = 0xFF;
@ -1088,7 +1088,6 @@ bool ride_has_adjacent_station(Ride* ride);
bool ride_has_station_shelter(Ride* ride);
bool ride_has_ratings(const Ride* ride);
ride_type_t ride_entry_get_first_non_null_ride_type(const rct_ride_entry* rideEntry);
int32_t get_booster_speed(ride_type_t rideType, int32_t rawSpeed);
void fix_invalid_vehicle_sprite_sizes();
bool ride_entry_has_category(const rct_ride_entry* rideEntry, uint8_t category);

View File

@ -20,6 +20,7 @@
// Set to 255 on all tracked ride entries
static uint8_t constexpr NoFlatRideCars = 0xFF;
static ride_type_t constexpr RIDE_TYPE_NULL = 0xFF;
struct RideNaming
{
@ -86,6 +87,17 @@ struct rct_ride_entry
{
return GetCar(DefaultCar);
}
ride_type_t GetFirstNonNullRideType() const
{
for (const auto& currentRideType : ride_type)
{
if (currentRideType != RIDE_TYPE_NULL)
return currentRideType;
}
return RIDE_TYPE_NULL;
}
};
void set_vehicle_type_image_max_sizes(CarEntry* vehicle_type, int32_t num_images);