diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 9f37027f2a..31af3860f0 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -7,6 +7,7 @@ - Improved: [#21227] Entrance style dropdown is now sorted alphabetically everywhere. - Change: [#21200] Raise maximum lift speeds of the Reverser Coaster, Side Friction Coaster, and Virginia Reel for RCT1 parity. - Change: [#21225] Raise maximum allowed misc entities to 1600. +- Fix: [#19494] RCT1 fence gate walls not imported properly if they were placed on slopes. - Fix: [#20196] New scenarios start with an incorrect temperature. - Fix: [#20255] Images from the last hovered-over coaster in the object selection are not freed. - Fix: [#20616] Confirmation button in the track designer’s quit prompt has the wrong text. diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index bce1bc7bd0..94fe3d2b58 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -1191,6 +1191,70 @@ namespace RCT1 return map[largeSceneryType]; } + int32_t MapSlopedWall(uint8_t wallType) + { + static constexpr uint8_t map[] = + { + RCT1_WALL_TYPE_MESH_FENCE, // RCT1_WALL_TYPE_MESH_FENCE, + RCT1_WALL_TYPE_MESH_FENCE, // RCT1_WALL_TYPE_MESH_FENCE_WITH_GATE, + RCT1_WALL_TYPE_ROMAN, // RCT1_WALL_TYPE_ROMAN, + RCT1_WALL_TYPE_EGYPTIAN, // RCT1_WALL_TYPE_EGYPTIAN, + RCT1_WALL_TYPE_HEDGE, // RCT1_WALL_TYPE_HEDGE, + RCT1_WALL_TYPE_HEDGE, // RCT1_WALL_TYPE_HEDGE_WITH_GATE, + RCT1_WALL_TYPE_BLUE_PLAYING_CARDS, // RCT1_WALL_TYPE_BLUE_PLAYING_CARDS, + RCT1_WALL_TYPE_RED_PLAYING_CARDS, // RCT1_WALL_TYPE_RED_PLAYING_CARDS, + RCT1_WALL_TYPE_WHITE_RAILING, // RCT1_WALL_TYPE_WHITE_RAILING, + RCT1_WALL_TYPE_WHITE_RAILING, // RCT1_WALL_TYPE_WHITE_RAILING_WITH_GATE, + RCT1_WALL_TYPE_MARTIAN, // RCT1_WALL_TYPE_MARTIAN, + RCT1_WALL_TYPE_GLASS_SMOOTH, // RCT1_WALL_TYPE_GLASS_SMOOTH, + RCT1_WALL_TYPE_WOODEN_PANEL_FENCE, // RCT1_WALL_TYPE_WOODEN_PANEL_FENCE, + RCT1_WALL_TYPE_WOODEN_PANEL_FENCE, // RCT1_WALL_TYPE_WOODEN_PANEL_FENCE_WITH_GATE, + RCT1_WALL_TYPE_WOODEN_POST_FENCE, // RCT1_WALL_TYPE_WOODEN_POST_FENCE, + RCT1_WALL_TYPE_RED_WOODEN_POST_FENCE, // RCT1_WALL_TYPE_RED_WOODEN_POST_FENCE, + RCT1_WALL_TYPE_BARBED_WIRE, // RCT1_WALL_TYPE_BARBED_WIRE, + RCT1_WALL_TYPE_BARBED_WIRE, // RCT1_WALL_TYPE_BARBED_WIRE_WITH_GATE, + RCT1_WALL_TYPE_PRIMITIVE_TALL_WOOD_FENCE, // RCT1_WALL_TYPE_PRIMITIVE_TALL_WOOD_FENCE, + RCT1_WALL_TYPE_PRIMITIVE_SHORT_WOOD_FENCE, // RCT1_WALL_TYPE_PRIMITIVE_SHORT_WOOD_FENCE, + RCT1_WALL_TYPE_IRON_RAILING, // RCT1_WALL_TYPE_IRON_RAILING, + RCT1_WALL_TYPE_IRON_RAILING, // RCT1_WALL_TYPE_IRON_RAILING_WITH_GATE, + RCT1_WALL_TYPE_GLASS_PANELS, // RCT1_WALL_TYPE_GLASS_PANELS, + RCT1_WALL_TYPE_BONE_FENCE, // RCT1_WALL_TYPE_BONE_FENCE, + RCT1_WALL_TYPE_BRICK, // RCT1_WALL_TYPE_BRICK, + RCT1_WALL_TYPE_BRICK, // RCT1_WALL_TYPE_BRICK_WITH_GATE, + RCT1_WALL_TYPE_WHITE_WOODEN_PANEL_FENCE, // RCT1_WALL_TYPE_WHITE_WOODEN_PANEL_FENCE, + RCT1_WALL_TYPE_RED_WOODEN_PANEL_FENCE, // RCT1_WALL_TYPE_RED_WOODEN_PANEL_FENCE, + RCT1_WALL_TYPE_STONE, // RCT1_WALL_TYPE_STONE, + RCT1_WALL_TYPE_STONE, // RCT1_WALL_TYPE_STONE_WITH_GATE, + RCT1_WALL_TYPE_WOODEN_FENCE, // RCT1_WALL_TYPE_WOODEN_FENCE, + RCT1_WALL_TYPE_JUNGLE, // RCT1_WALL_TYPE_JUNGLE, + RCT1_WALL_TYPE_CONIFER_HEDGE, // RCT1_WALL_TYPE_CONIFER_HEDGE, + RCT1_WALL_TYPE_CONIFER_HEDGE, // RCT1_WALL_TYPE_CONIFER_HEDGE_WITH_GATE, + RCT1_WALL_TYPE_SMALL_BROWN_CASTLE, // RCT1_WALL_TYPE_SMALL_BROWN_CASTLE, + RCT1_WALL_TYPE_SMALL_GREY_CASTLE, // RCT1_WALL_TYPE_SMALL_GREY_CASTLE, + RCT1_WALL_TYPE_ROMAN_COLUMN, // RCT1_WALL_TYPE_ROMAN_COLUMN, + RCT1_WALL_TYPE_LARGE_BROWN_CASTLE, // RCT1_WALL_TYPE_LARGE_BROWN_CASTLE, + RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_CROSS, // RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_CROSS, + RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_GATE, // RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_GATE, + RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_WINDOW, // RCT1_WALL_TYPE_LARGE_BROWN_CASTLE_WINDOW, + RCT1_WALL_TYPE_MEDIUM_BROWN_CASTLE, // RCT1_WALL_TYPE_MEDIUM_BROWN_CASTLE, + RCT1_WALL_TYPE_LARGE_GREY_CASTLE, // RCT1_WALL_TYPE_LARGE_GREY_CASTLE, + RCT1_WALL_TYPE_LARGE_GREY_CASTLE_CROSS, // RCT1_WALL_TYPE_LARGE_GREY_CASTLE_CROSS, + RCT1_WALL_TYPE_LARGE_GREY_CASTLE_GATE, // RCT1_WALL_TYPE_LARGE_GREY_CASTLE_GATE, + RCT1_WALL_TYPE_LARGE_GREY_CASTLE_WINDOW, // RCT1_WALL_TYPE_LARGE_GREY_CASTLE_WINDOW, + RCT1_WALL_TYPE_MEDIUM_GREY_CASTLE, // RCT1_WALL_TYPE_MEDIUM_GREY_CASTLE, + RCT1_WALL_TYPE_CREEPY, // RCT1_WALL_TYPE_CREEPY, + RCT1_WALL_TYPE_CREEPY_GATE, // RCT1_WALL_TYPE_CREEPY_GATE, + RCT1_WALL_TYPE_BARBED_WIRE_WITH_SNOW, // RCT1_WALL_TYPE_BARBED_WIRE_WITH_SNOW, + RCT1_WALL_TYPE_WOODEN_PANEL_FENCE_WITH_SNOW, // RCT1_WALL_TYPE_WOODEN_PANEL_FENCE_WITH_SNOW, + RCT1_WALL_TYPE_WOODEN_POST_FENCE_WITH_SNOW, // RCT1_WALL_TYPE_WOODEN_POST_FENCE_WITH_SNOW, + }; + + if (wallType < std::size(map)) + return map[wallType]; + + return -1; + } + std::string_view GetWallObject(uint8_t wallType) { static constexpr const char * map[] = diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 53caaab327..d8291093f4 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -38,6 +38,10 @@ namespace RCT1 std::string_view GetVehicleObject(uint8_t vehicleType); std::string_view GetSmallSceneryObject(uint8_t smallSceneryType); std::string_view GetLargeSceneryObject(uint8_t largeSceneryType); + /** + * Most sloped gates look like their ungated counterpart. This function maps these gates. + */ + int32_t MapSlopedWall(uint8_t wallType); std::string_view GetWallObject(uint8_t wallType); std::string_view GetPathSurfaceObject(uint8_t pathType); std::string_view GetPathAddtionObject(uint8_t pathAdditionType); diff --git a/src/openrct2/rct12/RCT12.cpp b/src/openrct2/rct12/RCT12.cpp index 1eee342ce3..8dcc235878 100644 --- a/src/openrct2/rct12/RCT12.cpp +++ b/src/openrct2/rct12/RCT12.cpp @@ -13,6 +13,7 @@ #include "../localisation/Formatting.h" #include "../localisation/Localisation.h" #include "../object/ObjectList.h" +#include "../rct1/Tables.h" #include "../rct2/RCT2.h" #include "../ride/Ride.h" #include "../ride/Track.h" @@ -407,7 +408,14 @@ int32_t RCT12WallElement::GetRCT1WallType(int32_t edge) const if (typeB != 0x0F) { - return typeA | (typeB << 2); + int32_t index = typeA | (typeB << 2); + + auto slope = GetRCT1Slope(); + auto edgeSlope = GetWallSlopeFromEdgeSlope(slope, edge & 3); + if (edgeSlope & (EDGE_SLOPE_UPWARDS | EDGE_SLOPE_DOWNWARDS)) + index = RCT1::MapSlopedWall(index); + + return index; } return -1;