1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 20:43:04 +01:00

Load banner entries from research and the map

This commit is contained in:
Gymnasiast
2024-02-10 17:43:32 +01:00
parent 4d35989888
commit 864f0350ed
4 changed files with 72 additions and 15 deletions

View File

@@ -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
{

View File

@@ -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<BannerType>(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<std::string>({
"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<std::string>({ "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:

View File

@@ -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[] =

View File

@@ -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);