From 50118ae0399265f9f2a4e052f246ef4d607007c2 Mon Sep 17 00:00:00 2001 From: Duncan Date: Mon, 27 Sep 2021 21:54:41 +0100 Subject: [PATCH 1/3] Move function for NSF use --- src/openrct2/object/Object.cpp | 19 ------------------- src/openrct2/object/Object.h | 2 -- src/openrct2/object/SceneryGroupObject.cpp | 21 ++++++++++++++++++++- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/openrct2/object/Object.cpp b/src/openrct2/object/Object.cpp index 927e92ca5b..fcf5477b67 100644 --- a/src/openrct2/object/Object.cpp +++ b/src/openrct2/object/Object.cpp @@ -217,25 +217,6 @@ void Object::SetAuthors(std::vector&& authors) _authors = std::move(authors); } -std::optional rct_object_entry::GetSceneryType() const -{ - switch (GetType()) - { - case ObjectType::SmallScenery: - return SCENERY_TYPE_SMALL; - case ObjectType::LargeScenery: - return SCENERY_TYPE_LARGE; - case ObjectType::Walls: - return SCENERY_TYPE_WALL; - case ObjectType::Banners: - return SCENERY_TYPE_BANNER; - case ObjectType::PathBits: - return SCENERY_TYPE_PATH_ITEM; - default: - return std::nullopt; - } -} - bool rct_object_entry::IsEmpty() const { uint64_t a, b; diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index db6dbb858d..666ae1555d 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -119,8 +119,6 @@ struct rct_object_entry flags |= (static_cast(newType) & 0x0F); } - std::optional GetSceneryType() const; - ObjectSourceGame GetSourceGame() const { return static_cast((flags & 0xF0) >> 4); diff --git a/src/openrct2/object/SceneryGroupObject.cpp b/src/openrct2/object/SceneryGroupObject.cpp index 88bf42acbc..7c026dfcdc 100644 --- a/src/openrct2/object/SceneryGroupObject.cpp +++ b/src/openrct2/object/SceneryGroupObject.cpp @@ -66,6 +66,25 @@ void SceneryGroupObject::DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int3 gfx_draw_sprite(dpi, imageId, screenCoords - ScreenCoordsXY{ 15, 14 }, 0); } +static std::optional GetSceneryType(const ObjectType type) +{ + switch (type) + { + case ObjectType::SmallScenery: + return SCENERY_TYPE_SMALL; + case ObjectType::LargeScenery: + return SCENERY_TYPE_LARGE; + case ObjectType::Walls: + return SCENERY_TYPE_WALL; + case ObjectType::Banners: + return SCENERY_TYPE_BANNER; + case ObjectType::PathBits: + return SCENERY_TYPE_PATH_ITEM; + default: + return std::nullopt; + } +} + void SceneryGroupObject::UpdateEntryIndexes() { auto context = GetContext(); @@ -84,7 +103,7 @@ void SceneryGroupObject::UpdateEntryIndexes() auto entryIndex = objectManager.GetLoadedObjectEntryIndex(ori->LoadedObject.get()); Guard::Assert(entryIndex != OBJECT_ENTRY_INDEX_NULL, GUARD_LINE); - auto sceneryType = ori->ObjectEntry.GetSceneryType(); + auto sceneryType = GetSceneryType(ori->Type); if (sceneryType.has_value()) { _legacyType.scenery_entries[_legacyType.entry_count] = { sceneryType.value(), entryIndex }; From 185cfdea0fa8e42681c12b36c6f233de502156a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:05:48 +0300 Subject: [PATCH 2/3] Refactor GetSpatialIndexOffset and fix overflow --- src/openrct2/world/Sprite.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/openrct2/world/Sprite.cpp b/src/openrct2/world/Sprite.cpp index aefecb5ee3..b3363565e2 100644 --- a/src/openrct2/world/Sprite.cpp +++ b/src/openrct2/world/Sprite.cpp @@ -48,21 +48,18 @@ static void FreeEntity(EntityBase& entity); constexpr size_t GetSpatialIndexOffset(int32_t x, int32_t y) { - size_t index = SPATIAL_INDEX_LOCATION_NULL; - if (x != LOCATION_NULL) - { - x = std::clamp(x, 0, 0xFFFF); - y = std::clamp(y, 0, 0xFFFF); + if (x == LOCATION_NULL) + return SPATIAL_INDEX_LOCATION_NULL; - int16_t flooredX = floor2(x, 32); - uint8_t tileY = y >> 5; - index = (flooredX << 3) | tileY; - } + const auto tileX = std::clamp(x / COORDS_XY_STEP, 0, MAXIMUM_MAP_SIZE_TECHNICAL); + const auto tileY = std::clamp(y / COORDS_XY_STEP, 0, MAXIMUM_MAP_SIZE_TECHNICAL); + const auto index = tileX * MAXIMUM_MAP_SIZE_TECHNICAL + tileY; if (index >= sizeof(gSpriteSpatialIndex)) { return SPATIAL_INDEX_LOCATION_NULL; } + return index; } From 274bc039af96d7ecafddc7f0d8a3bbaa69d6a258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Tue, 28 Sep 2021 01:24:51 +0300 Subject: [PATCH 3/3] Fix out of bounds access --- src/openrct2/world/Sprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/world/Sprite.cpp b/src/openrct2/world/Sprite.cpp index b3363565e2..2af9e1e6fe 100644 --- a/src/openrct2/world/Sprite.cpp +++ b/src/openrct2/world/Sprite.cpp @@ -55,7 +55,7 @@ constexpr size_t GetSpatialIndexOffset(int32_t x, int32_t y) const auto tileY = std::clamp(y / COORDS_XY_STEP, 0, MAXIMUM_MAP_SIZE_TECHNICAL); const auto index = tileX * MAXIMUM_MAP_SIZE_TECHNICAL + tileY; - if (index >= sizeof(gSpriteSpatialIndex)) + if (index >= std::size(gSpriteSpatialIndex)) { return SPATIAL_INDEX_LOCATION_NULL; }