From 5a0be004ded515b2c0257edd527c9e438df3f48e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 12 Feb 2022 00:31:43 +0100 Subject: [PATCH 1/3] Guard against invalid entry indices in ride_entry_is_invented() --- src/openrct2/management/Research.cpp | 12 +++++++++--- src/openrct2/management/Research.h | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 2b780c0f9e..61d56895fa 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -549,8 +549,11 @@ bool ride_type_is_invented(uint32_t rideType) return RideTypeIsValid(rideType) ? _researchedRideTypes[rideType] : false; } -bool ride_entry_is_invented(int32_t rideEntryIndex) +bool ride_entry_is_invented(ObjectEntryIndex rideEntryIndex) { + if (rideEntryIndex >= std::size(_researchedRideEntries)) + return false; + return _researchedRideEntries[rideEntryIndex]; } @@ -562,9 +565,12 @@ void ride_type_set_invented(uint32_t rideType) } } -void ride_entry_set_invented(int32_t rideEntryIndex) +void ride_entry_set_invented(ObjectEntryIndex rideEntryIndex) { - _researchedRideEntries[rideEntryIndex] = true; + if (rideEntryIndex >= std::size(_researchedRideEntries)) + log_error("Try setting ride entry %u as invented", rideEntryIndex); + else + _researchedRideEntries[rideEntryIndex] = true; } bool scenery_is_invented(const ScenerySelection& sceneryItem) diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index cbfa059335..df78517a66 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -138,11 +138,11 @@ void research_insert_ride_entry(ObjectEntryIndex entryIndex, bool researched); bool research_insert_scenery_group_entry(ObjectEntryIndex entryIndex, bool researched); void ride_type_set_invented(uint32_t rideType); -void ride_entry_set_invented(int32_t rideEntryIndex); +void ride_entry_set_invented(ObjectEntryIndex rideEntryIndex); void scenery_set_invented(const ScenerySelection& sceneryItem); void scenery_set_not_invented(const ScenerySelection& sceneryItem); bool ride_type_is_invented(uint32_t rideType); -bool ride_entry_is_invented(int32_t rideEntryIndex); +bool ride_entry_is_invented(ObjectEntryIndex rideEntryIndex); bool scenery_group_is_invented(int32_t sgIndex); void scenery_group_set_invented(int32_t sgIndex); bool scenery_is_invented(const ScenerySelection& sceneryItem); From 635a6507eb3e1f8fcd21f6f7a047dfab7d491b51 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 12 Feb 2022 00:43:32 +0100 Subject: [PATCH 2/3] Fix #16572: Refactor error made in #15403 --- src/openrct2/actions/TrackDesignAction.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index a6cd6017eb..43976034a8 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -137,10 +137,10 @@ GameActions::Result TrackDesignAction::Execute() const auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); auto entryIndex = objManager.GetLoadedObjectEntryIndex(_td.vehicle_object); - if (entryIndex == OBJECT_ENTRY_INDEX_NULL) + if (entryIndex != OBJECT_ENTRY_INDEX_NULL) { - // Force a fallback if the entry is not invented yet a td6 of it is selected, - // which can happen in select-by-track-type mode + // Force a fallback if the entry is not invented yet a track design using is selected. + // This can happen on rides with multiple vehicles where some have been invented and some haven’t. if (!ride_entry_is_invented(entryIndex) && !gCheatsIgnoreResearchStatus) { entryIndex = OBJECT_ENTRY_INDEX_NULL; From f0ee220ec615eb77ee0161d64f4b45dd42204593 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 12 Feb 2022 12:28:37 +0100 Subject: [PATCH 3/3] Fix messages [ci skip] Co-authored-by: pizza2004 --- src/openrct2/actions/TrackDesignAction.cpp | 2 +- src/openrct2/management/Research.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index 43976034a8..534d2003dd 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -139,7 +139,7 @@ GameActions::Result TrackDesignAction::Execute() const auto entryIndex = objManager.GetLoadedObjectEntryIndex(_td.vehicle_object); if (entryIndex != OBJECT_ENTRY_INDEX_NULL) { - // Force a fallback if the entry is not invented yet a track design using is selected. + // Force a fallback if the entry is not invented yet a track design using it is selected. // This can happen on rides with multiple vehicles where some have been invented and some haven’t. if (!ride_entry_is_invented(entryIndex) && !gCheatsIgnoreResearchStatus) { diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 61d56895fa..2d53ddeb32 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -568,7 +568,7 @@ void ride_type_set_invented(uint32_t rideType) void ride_entry_set_invented(ObjectEntryIndex rideEntryIndex) { if (rideEntryIndex >= std::size(_researchedRideEntries)) - log_error("Try setting ride entry %u as invented", rideEntryIndex); + log_error("Tried setting ride entry %u as invented", rideEntryIndex); else _researchedRideEntries[rideEntryIndex] = true; }