From 864f0350ed2f993ba85272422af7d2bab38cdaed Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 10 Feb 2024 17:43:32 +0100 Subject: [PATCH] Load banner entries from research and the map --- src/openrct2/rct1/RCT1.h | 15 +++++++++ src/openrct2/rct1/S4Importer.cpp | 54 +++++++++++++++++++++++--------- src/openrct2/rct1/Tables.cpp | 17 ++++++++++ src/openrct2/rct1/Tables.h | 1 + 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index dbb78a1801..88a43c6fdd 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -204,6 +204,21 @@ namespace RCT1 Count, }; + enum class BannerType : uint8_t + { + Plain = 0, + Jungle, + Roman, + Egyptian, + Mine, + Jurassic, + Oriental, + Snow, + Space, + + Null = 255, + }; + #pragma pack(push, 1) struct Entrance { diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 618310326b..e70c732791 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -95,6 +95,7 @@ namespace RCT1 RCT12::EntryList _smallSceneryEntries; RCT12::EntryList _largeSceneryEntries; RCT12::EntryList _wallEntries; + RCT12::EntryList _bannerEntries; RCT12::EntryList _pathEntries; RCT12::EntryList _pathAdditionEntries; RCT12::EntryList _sceneryGroupEntries; @@ -110,6 +111,7 @@ namespace RCT1 ObjectEntryIndex _smallSceneryTypeToEntryMap[256]{}; ObjectEntryIndex _largeSceneryTypeToEntryMap[256]{}; ObjectEntryIndex _wallTypeToEntryMap[256]{}; + ObjectEntryIndex _bannerTypeToEntryMap[9]{}; ObjectEntryIndex _pathTypeToEntryMap[24]{}; ObjectEntryIndex _pathAdditionTypeToEntryMap[16]{}; ObjectEntryIndex _sceneryThemeTypeToEntryMap[24]{}; @@ -349,6 +351,7 @@ namespace RCT1 std::fill(std::begin(_smallSceneryTypeToEntryMap), std::end(_smallSceneryTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); std::fill(std::begin(_largeSceneryTypeToEntryMap), std::end(_largeSceneryTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); std::fill(std::begin(_wallTypeToEntryMap), std::end(_wallTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); + std::fill(std::begin(_bannerTypeToEntryMap), std::end(_bannerTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); std::fill(std::begin(_pathTypeToEntryMap), std::end(_pathTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); std::fill(std::begin(_pathAdditionTypeToEntryMap), std::end(_pathAdditionTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); std::fill(std::begin(_sceneryThemeTypeToEntryMap), std::end(_sceneryThemeTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL); @@ -373,6 +376,7 @@ namespace RCT1 AddAvailableEntriesFromMap(); AddAvailableEntriesFromRides(); AddAvailableEntriesFromSceneryGroups(); + AddAvailableEntriesFromBannerList(); AddEntryForWater(); } @@ -560,7 +564,7 @@ namespace RCT1 case ObjectType::SmallScenery: case ObjectType::LargeScenery: case ObjectType::Walls: - case ObjectType::Paths: + case ObjectType::Banners: case ObjectType::PathAdditions: { RCT12::EntryList* entries = GetEntryList(objectType); @@ -586,6 +590,19 @@ namespace RCT1 } } + void AddAvailableEntriesFromBannerList() + { + for (size_t i = 0; i < std::size(_s4.Banners); i++) + { + auto& banner = _s4.Banners[i]; + auto type = static_cast(banner.Type); + if (type == BannerType::Null) + continue; + + AddEntryForBanner(type); + } + } + void AddEntryForWater() { std::string_view entryName; @@ -669,6 +686,18 @@ namespace RCT1 } } + void AddEntryForBanner(BannerType bannerType) + { + assert(EnumValue(bannerType) < std::size(_bannerTypeToEntryMap)); + if (_bannerTypeToEntryMap[EnumValue(bannerType)] == OBJECT_ENTRY_INDEX_NULL) + { + auto entryName = RCT1::GetBannerObject(bannerType); + auto entryIndex = _bannerEntries.GetOrAddEntry(entryName); + + _bannerTypeToEntryMap[EnumValue(bannerType)] = entryIndex; + } + } + void AddEntryForPathSurface(ObjectEntryIndex pathType) { assert(pathType < std::size(_footpathSurfaceTypeToEntryMap)); @@ -1479,19 +1508,7 @@ namespace RCT1 AppendRequiredObjects(result, ObjectType::Paths, _pathEntries); AppendRequiredObjects(result, ObjectType::PathAdditions, _pathAdditionEntries); AppendRequiredObjects(result, ObjectType::SceneryGroup, _sceneryGroupEntries); - AppendRequiredObjects( - result, ObjectType::Banners, - std::vector({ - "rct2.footpath_banner.bn1", - "rct2.footpath_banner.bn2", - "rct2.footpath_banner.bn3", - "rct2.footpath_banner.bn4", - "rct2.footpath_banner.bn5", - "rct2.footpath_banner.bn6", - "rct2.footpath_banner.bn7", - "rct2.footpath_banner.bn8", - "rct2.footpath_banner.bn9", - })); + AppendRequiredObjects(result, ObjectType::Banners, _bannerEntries); AppendRequiredObjects(result, ObjectType::ParkEntrance, std::vector({ "rct2.park_entrance.pkent1" })); AppendRequiredObjects(result, ObjectType::Water, _waterEntry); AppendRequiredObjects(result, ObjectType::TerrainSurface, _terrainSurfaceEntries); @@ -2400,7 +2417,12 @@ namespace RCT1 *dst = {}; dst->id = id; - dst->type = RCTEntryIndexToOpenRCT2EntryIndex(src->Type); + auto type = RCTEntryIndexToOpenRCT2EntryIndex(src->Type); + if (type < std::size(_bannerTypeToEntryMap)) + type = _bannerTypeToEntryMap[type]; + else + type = OBJECT_ENTRY_INDEX_NULL; + dst->type = type; dst->flags = 0; if (src->Flags & BANNER_FLAG_NO_ENTRY) @@ -2453,6 +2475,8 @@ namespace RCT1 return &_largeSceneryEntries; case ObjectType::Walls: return &_wallEntries; + case ObjectType::Banners: + return &_bannerEntries; case ObjectType::Paths: return &_pathEntries; case ObjectType::PathAdditions: diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 0f97f24bdd..c6e6158ff4 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -1322,6 +1322,23 @@ namespace RCT1 return map[0]; } + std::string_view GetBannerObject(BannerType bannerType) + { + static constexpr const char * map[] = + { + "rct2.footpath_banner.bn1", // BannerType::Plain + "rct2.footpath_banner.bn2", // BannerType::Jungle + "rct2.footpath_banner.bn3", // BannerType::Roman + "rct2.footpath_banner.bn4", // BannerType::Egyptian + "rct2.footpath_banner.bn5", // BannerType::Mine + "rct2.footpath_banner.bn6", // BannerType::Jurassic + "rct2.footpath_banner.bn7", // BannerType::Oriental + "rct2.footpath_banner.bn8", // BannerType::Snow + "rct2.footpath_banner.bn9", // BannerType::Space + }; + return map[EnumValue(bannerType)]; + } + std::string_view GetPathSurfaceObject(uint8_t pathType) { static constexpr const char * map[] = diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 2c2ef53127..bbcf180d06 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -44,6 +44,7 @@ namespace RCT1 */ int32_t MapSlopedWall(uint8_t wallType); std::string_view GetWallObject(uint8_t wallType); + std::string_view GetBannerObject(BannerType bannerType); std::string_view GetPathSurfaceObject(uint8_t pathType); std::string_view GetPathAddtionObject(uint8_t pathAdditionType); std::string_view GetFootpathRailingsObject(uint8_t footpathRailingsType);