From c0bd64f778abbd6de49b266ef45dc594a6a2edf7 Mon Sep 17 00:00:00 2001 From: Duncan Date: Tue, 4 Apr 2023 08:52:07 +0100 Subject: [PATCH] Split of Needs supports changes from OpenRCT2/OpenRCT2#19446 (#19759) --- src/openrct2/network/NetworkBase.cpp | 2 +- src/openrct2/park/ParkFile.cpp | 16 ++++++++++++++++ src/openrct2/park/ParkFile.h | 4 ++-- src/openrct2/rct12/RCT12.cpp | 19 ++++++++++--------- src/openrct2/rct12/RCT12.h | 3 +++ src/openrct2/world/LargeScenery.cpp | 6 +++--- src/openrct2/world/SmallScenery.cpp | 19 ++++++++----------- src/openrct2/world/SmallScenery.h | 2 +- src/openrct2/world/TileElement.h | 5 ++--- 9 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 699b1662c0..92d6725fda 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -43,7 +43,7 @@ // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "3" +#define NETWORK_STREAM_VERSION "4" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 435bb6c562..d7556a8c88 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -1099,6 +1099,22 @@ namespace OpenRCT2 it.element->SetInvisible(true); } } + else if ( + it.element->GetType() == TileElementType::SmallScenery && os.GetHeader().TargetVersion < 22) + { + auto* sceneryElement = it.element->AsSmallScenery(); + // Previous formats stored the needs supports flag in the primary colour + // We have moved it into a flags field to support extended colour sets + bool needsSupports = sceneryElement->GetPrimaryColour() + & RCT12_SMALL_SCENERY_ELEMENT_NEEDS_SUPPORTS_FLAG; + if (needsSupports) + { + sceneryElement->SetPrimaryColour( + sceneryElement->GetPrimaryColour() + & ~RCT12_SMALL_SCENERY_ELEMENT_NEEDS_SUPPORTS_FLAG); + sceneryElement->SetNeedsSupports(); + } + } } } ParkEntranceUpdateLocations(); diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 69fe23f2b5..a627d79d46 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -9,10 +9,10 @@ struct ObjectRepositoryItem; namespace OpenRCT2 { // Current version that is saved. - constexpr uint32_t PARK_FILE_CURRENT_VERSION = 21; + constexpr uint32_t PARK_FILE_CURRENT_VERSION = 22; // The minimum version that is forwards compatible with the current version. - constexpr uint32_t PARK_FILE_MIN_VERSION = 21; + constexpr uint32_t PARK_FILE_MIN_VERSION = 22; // The minimum version that is backwards compatible with the current version. // If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp! diff --git a/src/openrct2/rct12/RCT12.cpp b/src/openrct2/rct12/RCT12.cpp index cebe7f3d89..54b9fee1d7 100644 --- a/src/openrct2/rct12/RCT12.cpp +++ b/src/openrct2/rct12/RCT12.cpp @@ -311,17 +311,17 @@ uint8_t RCT12SmallSceneryElement::GetSceneryQuadrant() const colour_t RCT12SmallSceneryElement::GetPrimaryColour() const { - return Colour1 & TILE_ELEMENT_COLOUR_MASK; + return Colour1 & RCT12_TILE_ELEMENT_COLOUR_MASK; } colour_t RCT12SmallSceneryElement::GetSecondaryColour() const { - return Colour2 & TILE_ELEMENT_COLOUR_MASK; + return Colour2 & RCT12_TILE_ELEMENT_COLOUR_MASK; } bool RCT12SmallSceneryElement::NeedsSupports() const { - return Colour1 & MAP_ELEM_SMALL_SCENERY_COLOUR_FLAG_NEEDS_SUPPORTS; + return Colour1 & RCT12_SMALL_SCENERY_ELEMENT_NEEDS_SUPPORTS_FLAG; } uint32_t RCT12LargeSceneryElement::GetEntryIndex() const @@ -335,17 +335,18 @@ uint16_t RCT12LargeSceneryElement::GetSequenceIndex() const } colour_t RCT12LargeSceneryElement::GetPrimaryColour() const { - return Colour[0] & TILE_ELEMENT_COLOUR_MASK; + return Colour[0] & RCT12_TILE_ELEMENT_COLOUR_MASK; } colour_t RCT12LargeSceneryElement::GetSecondaryColour() const { - return Colour[1] & TILE_ELEMENT_COLOUR_MASK; + return Colour[1] & RCT12_TILE_ELEMENT_COLOUR_MASK; } uint8_t RCT12LargeSceneryElement::GetBannerIndex() const { - return (Type & 0xC0) | (((Colour[0]) & ~TILE_ELEMENT_COLOUR_MASK) >> 2) | (((Colour[1]) & ~TILE_ELEMENT_COLOUR_MASK) >> 5); + return (Type & 0xC0) | (((Colour[0]) & ~RCT12_TILE_ELEMENT_COLOUR_MASK) >> 2) + | (((Colour[1]) & ~RCT12_TILE_ELEMENT_COLOUR_MASK) >> 5); } uint8_t RCT12WallElement::GetEntryIndex() const @@ -360,19 +361,19 @@ uint8_t RCT12WallElement::GetSlope() const colour_t RCT12WallElement::GetPrimaryColour() const { - return Colour1 & TILE_ELEMENT_COLOUR_MASK; + return Colour1 & RCT12_TILE_ELEMENT_COLOUR_MASK; } colour_t RCT12WallElement::GetSecondaryColour() const { - uint8_t secondaryColour = (Colour1 & ~TILE_ELEMENT_COLOUR_MASK) >> 5; + uint8_t secondaryColour = (Colour1 & ~RCT12_TILE_ELEMENT_COLOUR_MASK) >> 5; secondaryColour |= (Flags & 0x60) >> 2; return secondaryColour; } colour_t RCT12WallElement::GetTertiaryColour() const { - return Colour3 & TILE_ELEMENT_COLOUR_MASK; + return Colour3 & RCT12_TILE_ELEMENT_COLOUR_MASK; } uint8_t RCT12WallElement::GetAnimationFrame() const diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index 4f6b2103bd..1c9fa21b33 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -47,6 +47,9 @@ constexpr const uint8_t RCT12_TILE_ELEMENT_SURFACE_EDGE_STYLE_MASK = 0xE0; // constexpr const uint8_t RCT12_TILE_ELEMENT_SURFACE_WATER_HEIGHT_MASK = 0x1F; // in RCT12TileElement.properties.surface.terrain constexpr const uint8_t RCT12_TILE_ELEMENT_SURFACE_TERRAIN_MASK = 0xE0; // in RCT12TileElement.properties.surface.terrain +constexpr const uint8_t RCT12_SMALL_SCENERY_ELEMENT_NEEDS_SUPPORTS_FLAG = 0x20; +constexpr const uint8_t RCT12_TILE_ELEMENT_COLOUR_MASK = 0b0001'1111; + constexpr const uint16_t RCT12_TILE_ELEMENT_LARGE_TYPE_MASK = 0x3FF; constexpr uint16_t const RCT12_XY8_UNDEFINED = 0xFFFF; diff --git a/src/openrct2/world/LargeScenery.cpp b/src/openrct2/world/LargeScenery.cpp index 63634ae76f..a7ff00c05f 100644 --- a/src/openrct2/world/LargeScenery.cpp +++ b/src/openrct2/world/LargeScenery.cpp @@ -34,19 +34,19 @@ colour_t LargeSceneryElement::GetTertiaryColour() const void LargeSceneryElement::SetPrimaryColour(colour_t newColour) { - assert(newColour <= 31); + assert(newColour < COLOUR_COUNT); Colour[0] = newColour; } void LargeSceneryElement::SetSecondaryColour(colour_t newColour) { - assert(newColour <= 31); + assert(newColour < COLOUR_COUNT); Colour[1] = newColour; } void LargeSceneryElement::SetTertiaryColour(colour_t newColour) { - assert(newColour <= 31); + assert(newColour < COLOUR_COUNT); Colour[2] = newColour; } diff --git a/src/openrct2/world/SmallScenery.cpp b/src/openrct2/world/SmallScenery.cpp index 2b730f04aa..fd771d215a 100644 --- a/src/openrct2/world/SmallScenery.cpp +++ b/src/openrct2/world/SmallScenery.cpp @@ -81,48 +81,45 @@ void SmallSceneryElement::IncreaseAge(const CoordsXY& sceneryPos) colour_t SmallSceneryElement::GetPrimaryColour() const { - return Colour[0] & TILE_ELEMENT_COLOUR_MASK; + return Colour[0]; } colour_t SmallSceneryElement::GetSecondaryColour() const { - return Colour[1] & TILE_ELEMENT_COLOUR_MASK; + return Colour[1]; } colour_t SmallSceneryElement::GetTertiaryColour() const { - return Colour[2] & TILE_ELEMENT_COLOUR_MASK; + return Colour[2]; } void SmallSceneryElement::SetPrimaryColour(colour_t newColour) { - assert(newColour <= 31); - Colour[0] &= ~TILE_ELEMENT_COLOUR_MASK; + assert(newColour < COLOUR_COUNT); Colour[0] |= newColour; } void SmallSceneryElement::SetSecondaryColour(colour_t newColour) { - assert(newColour <= 31); - Colour[1] &= ~TILE_ELEMENT_COLOUR_MASK; + assert(newColour < COLOUR_COUNT); Colour[1] |= newColour; } void SmallSceneryElement::SetTertiaryColour(colour_t newColour) { - assert(newColour <= 31); - Colour[2] &= ~TILE_ELEMENT_COLOUR_MASK; + assert(newColour < COLOUR_COUNT); Colour[2] |= newColour; } bool SmallSceneryElement::NeedsSupports() const { - return static_cast(Colour[0] & MAP_ELEM_SMALL_SCENERY_COLOUR_FLAG_NEEDS_SUPPORTS); + return static_cast(Flags2 & MAP_ELEM_SMALL_SCENERY_FLAGS2_NEEDS_SUPPORTS); } void SmallSceneryElement::SetNeedsSupports() { - Colour[0] |= MAP_ELEM_SMALL_SCENERY_COLOUR_FLAG_NEEDS_SUPPORTS; + Flags2 |= MAP_ELEM_SMALL_SCENERY_FLAGS2_NEEDS_SUPPORTS; } const SmallSceneryEntry* SmallSceneryElement::GetEntry() const diff --git a/src/openrct2/world/SmallScenery.h b/src/openrct2/world/SmallScenery.h index 9c4c621bb3..fd35649eca 100644 --- a/src/openrct2/world/SmallScenery.h +++ b/src/openrct2/world/SmallScenery.h @@ -11,5 +11,5 @@ enum { - MAP_ELEM_SMALL_SCENERY_COLOUR_FLAG_NEEDS_SUPPORTS = (1 << 5), + MAP_ELEM_SMALL_SCENERY_FLAGS2_NEEDS_SUPPORTS = (1 << 0), }; diff --git a/src/openrct2/world/TileElement.h b/src/openrct2/world/TileElement.h index f0524b04b7..fb852d15ac 100644 --- a/src/openrct2/world/TileElement.h +++ b/src/openrct2/world/TileElement.h @@ -434,9 +434,10 @@ private: ObjectEntryIndex entryIndex; // 5 uint8_t age; // 7 uint8_t Colour[3]; // 8 + uint8_t Flags2; // B #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-private-field" - uint8_t Pad0B[5]; + uint8_t Pad0B[4]; #pragma clang diagnostic pop public: @@ -702,8 +703,6 @@ enum #define TILE_ELEMENT_DIRECTION_MASK 0b00000011 #define TILE_ELEMENT_OCCUPIED_QUADRANTS_MASK 0b00001111 -#define TILE_ELEMENT_COLOUR_MASK 0b00011111 - enum { LANDSCAPE_DOOR_CLOSED = 0,