mirror of https://github.com/OpenRCT2/OpenRCT2.git
Close #12428: Refactor OBJECT_SOURCE_GAME to use strong enum
This commit is contained in:
parent
a9316869fc
commit
8a4df108ba
|
@ -1433,24 +1433,24 @@ static bool filter_string(const ObjectRepositoryItem* item)
|
||||||
return inName || inRideType || inPath;
|
return inName || inRideType || inPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool sources_match(uint8_t source)
|
static bool sources_match(ObjectSourceGame source)
|
||||||
{
|
{
|
||||||
// clang-format off
|
// clang-format off
|
||||||
return (_FILTER_RCT1 && source == OBJECT_SOURCE_RCT1) ||
|
return (_FILTER_RCT1 && source == ObjectSourceGame::RCT1) ||
|
||||||
(_FILTER_AA && source == OBJECT_SOURCE_ADDED_ATTRACTIONS) ||
|
(_FILTER_AA && source == ObjectSourceGame::AddedAttractions) ||
|
||||||
(_FILTER_LL && source == OBJECT_SOURCE_LOOPY_LANDSCAPES) ||
|
(_FILTER_LL && source == ObjectSourceGame::LoopyLandscapes) ||
|
||||||
(_FILTER_RCT2 && source == OBJECT_SOURCE_RCT2) ||
|
(_FILTER_RCT2 && source == ObjectSourceGame::RCT2) ||
|
||||||
(_FILTER_WW && source == OBJECT_SOURCE_WACKY_WORLDS) ||
|
(_FILTER_WW && source == ObjectSourceGame::WackyWorlds) ||
|
||||||
(_FILTER_TT && source == OBJECT_SOURCE_TIME_TWISTER) ||
|
(_FILTER_TT && source == ObjectSourceGame::TimeTwister) ||
|
||||||
(_FILTER_OO && source == OBJECT_SOURCE_OPENRCT2_OFFICIAL) ||
|
(_FILTER_OO && source == ObjectSourceGame::OpenRCT2Official) ||
|
||||||
(_FILTER_CUSTOM &&
|
(_FILTER_CUSTOM &&
|
||||||
source != OBJECT_SOURCE_RCT1 &&
|
source != ObjectSourceGame::RCT1 &&
|
||||||
source != OBJECT_SOURCE_ADDED_ATTRACTIONS &&
|
source != ObjectSourceGame::AddedAttractions &&
|
||||||
source != OBJECT_SOURCE_LOOPY_LANDSCAPES &&
|
source != ObjectSourceGame::LoopyLandscapes &&
|
||||||
source != OBJECT_SOURCE_RCT2 &&
|
source != ObjectSourceGame::RCT2 &&
|
||||||
source != OBJECT_SOURCE_WACKY_WORLDS &&
|
source != ObjectSourceGame::WackyWorlds &&
|
||||||
source != OBJECT_SOURCE_TIME_TWISTER &&
|
source != ObjectSourceGame::TimeTwister &&
|
||||||
source != OBJECT_SOURCE_OPENRCT2_OFFICIAL);
|
source != ObjectSourceGame::OpenRCT2Official);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,8 @@ void BannerObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStream* st
|
||||||
if (item != nullptr)
|
if (item != nullptr)
|
||||||
{
|
{
|
||||||
auto sourceGame = item->GetFirstSourceGame();
|
auto sourceGame = item->GetFirstSourceGame();
|
||||||
if (sourceGame == OBJECT_SOURCE_WACKY_WORLDS || sourceGame == OBJECT_SOURCE_TIME_TWISTER
|
if (sourceGame == ObjectSourceGame::WackyWorlds || sourceGame == ObjectSourceGame::TimeTwister
|
||||||
|| sourceGame == OBJECT_SOURCE_CUSTOM)
|
|| sourceGame == ObjectSourceGame::Custom)
|
||||||
{
|
{
|
||||||
auto scgPathX = Object::GetScgPathXHeader();
|
auto scgPathX = Object::GetScgPathXHeader();
|
||||||
SetPrimarySceneryGroup(&scgPathX);
|
SetPrimarySceneryGroup(&scgPathX);
|
||||||
|
|
|
@ -52,8 +52,8 @@ void FootpathItemObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStre
|
||||||
if (item != nullptr)
|
if (item != nullptr)
|
||||||
{
|
{
|
||||||
auto sourceGame = item->GetFirstSourceGame();
|
auto sourceGame = item->GetFirstSourceGame();
|
||||||
if (sourceGame == OBJECT_SOURCE_WACKY_WORLDS || sourceGame == OBJECT_SOURCE_TIME_TWISTER
|
if (sourceGame == ObjectSourceGame::WackyWorlds || sourceGame == ObjectSourceGame::TimeTwister
|
||||||
|| sourceGame == OBJECT_SOURCE_CUSTOM)
|
|| sourceGame == ObjectSourceGame::Custom)
|
||||||
{
|
{
|
||||||
auto scgPathX = Object::GetScgPathXHeader();
|
auto scgPathX = Object::GetScgPathXHeader();
|
||||||
SetPrimarySceneryGroup(&scgPathX);
|
SetPrimarySceneryGroup(&scgPathX);
|
||||||
|
|
|
@ -100,12 +100,12 @@ rct_object_entry Object::CreateHeader(const char name[DAT_NAME_LENGTH + 1], uint
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> Object::GetSourceGames()
|
std::vector<ObjectSourceGame> Object::GetSourceGames()
|
||||||
{
|
{
|
||||||
return _sourceGames;
|
return _sourceGames;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::SetSourceGames(const std::vector<uint8_t>& sourceGames)
|
void Object::SetSourceGames(const std::vector<ObjectSourceGame>& sourceGames)
|
||||||
{
|
{
|
||||||
_sourceGames = sourceGames;
|
_sourceGames = sourceGames;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,16 +59,16 @@ enum OBJECT_SELECTION_FLAGS
|
||||||
|
|
||||||
#define OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED 0
|
#define OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED 0
|
||||||
|
|
||||||
enum OBJECT_SOURCE_GAME
|
enum class ObjectSourceGame : uint8_t
|
||||||
{
|
{
|
||||||
OBJECT_SOURCE_CUSTOM,
|
Custom,
|
||||||
OBJECT_SOURCE_WACKY_WORLDS,
|
WackyWorlds,
|
||||||
OBJECT_SOURCE_TIME_TWISTER,
|
TimeTwister,
|
||||||
OBJECT_SOURCE_OPENRCT2_OFFICIAL,
|
OpenRCT2Official,
|
||||||
OBJECT_SOURCE_RCT1,
|
RCT1,
|
||||||
OBJECT_SOURCE_ADDED_ATTRACTIONS,
|
AddedAttractions,
|
||||||
OBJECT_SOURCE_LOOPY_LANDSCAPES,
|
LoopyLandscapes,
|
||||||
OBJECT_SOURCE_RCT2 = 8
|
RCT2 = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
@ -179,7 +179,7 @@ private:
|
||||||
rct_object_entry _objectEntry{};
|
rct_object_entry _objectEntry{};
|
||||||
StringTable _stringTable;
|
StringTable _stringTable;
|
||||||
ImageTable _imageTable;
|
ImageTable _imageTable;
|
||||||
std::vector<uint8_t> _sourceGames;
|
std::vector<ObjectSourceGame> _sourceGames;
|
||||||
std::vector<std::string> _authors;
|
std::vector<std::string> _authors;
|
||||||
bool _isJsonObject{};
|
bool _isJsonObject{};
|
||||||
|
|
||||||
|
@ -269,8 +269,8 @@ public:
|
||||||
virtual void SetRepositoryItem(ObjectRepositoryItem* /*item*/) const
|
virtual void SetRepositoryItem(ObjectRepositoryItem* /*item*/) const
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
std::vector<uint8_t> GetSourceGames();
|
std::vector<ObjectSourceGame> GetSourceGames();
|
||||||
void SetSourceGames(const std::vector<uint8_t>& sourceGames);
|
void SetSourceGames(const std::vector<ObjectSourceGame>& sourceGames);
|
||||||
|
|
||||||
const std::vector<std::string>& GetAuthors() const;
|
const std::vector<std::string>& GetAuthors() const;
|
||||||
void SetAuthors(const std::vector<std::string>&& authors);
|
void SetAuthors(const std::vector<std::string>&& authors);
|
||||||
|
|
|
@ -167,20 +167,20 @@ namespace ObjectFactory
|
||||||
static std::unique_ptr<Object> CreateObjectFromJson(
|
static std::unique_ptr<Object> CreateObjectFromJson(
|
||||||
IObjectRepository& objectRepository, json_t& jRoot, const IFileDataRetriever* fileRetriever);
|
IObjectRepository& objectRepository, json_t& jRoot, const IFileDataRetriever* fileRetriever);
|
||||||
|
|
||||||
static uint8_t ParseSourceGame(const std::string& s)
|
static ObjectSourceGame ParseSourceGame(const std::string& s)
|
||||||
{
|
{
|
||||||
static const std::unordered_map<std::string, OBJECT_SOURCE_GAME> LookupTable{
|
static const std::unordered_map<std::string, ObjectSourceGame> LookupTable{
|
||||||
{ "rct1", OBJECT_SOURCE_RCT1 },
|
{ "rct1", ObjectSourceGame::RCT1 },
|
||||||
{ "rct1aa", OBJECT_SOURCE_ADDED_ATTRACTIONS },
|
{ "rct1aa", ObjectSourceGame::AddedAttractions },
|
||||||
{ "rct1ll", OBJECT_SOURCE_LOOPY_LANDSCAPES },
|
{ "rct1ll", ObjectSourceGame::LoopyLandscapes },
|
||||||
{ "rct2", OBJECT_SOURCE_RCT2 },
|
{ "rct2", ObjectSourceGame::RCT2 },
|
||||||
{ "rct2ww", OBJECT_SOURCE_WACKY_WORLDS },
|
{ "rct2ww", ObjectSourceGame::WackyWorlds },
|
||||||
{ "rct2tt", OBJECT_SOURCE_TIME_TWISTER },
|
{ "rct2tt", ObjectSourceGame::TimeTwister },
|
||||||
{ "official", OBJECT_SOURCE_OPENRCT2_OFFICIAL },
|
{ "official", ObjectSourceGame::OpenRCT2Official },
|
||||||
{ "custom", OBJECT_SOURCE_CUSTOM },
|
{ "custom", ObjectSourceGame::Custom },
|
||||||
};
|
};
|
||||||
auto result = LookupTable.find(s);
|
auto result = LookupTable.find(s);
|
||||||
return (result != LookupTable.end()) ? result->second : OBJECT_SOURCE_CUSTOM;
|
return (result != LookupTable.end()) ? result->second : ObjectSourceGame::Custom;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ReadObjectLegacy(Object& object, IReadObjectContext* context, OpenRCT2::IStream* stream)
|
static void ReadObjectLegacy(Object& object, IReadObjectContext* context, OpenRCT2::IStream* stream)
|
||||||
|
@ -400,7 +400,7 @@ namespace ObjectFactory
|
||||||
auto sourceGames = jRoot["sourceGame"];
|
auto sourceGames = jRoot["sourceGame"];
|
||||||
if (sourceGames.is_array() || sourceGames.is_string())
|
if (sourceGames.is_array() || sourceGames.is_string())
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> sourceGameVector;
|
std::vector<ObjectSourceGame> sourceGameVector;
|
||||||
for (const auto& jSourceGame : sourceGames)
|
for (const auto& jSourceGame : sourceGames)
|
||||||
{
|
{
|
||||||
sourceGameVector.push_back(ParseSourceGame(Json::GetString(jSourceGame)));
|
sourceGameVector.push_back(ParseSourceGame(Json::GetString(jSourceGame)));
|
||||||
|
@ -412,18 +412,18 @@ namespace ObjectFactory
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
|
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
|
||||||
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM });
|
result.SetSourceGames({ ObjectSourceGame::Custom });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// >90% of objects are custom, so allow omitting the parameter without displaying an error.
|
// >90% of objects are custom, so allow omitting the parameter without displaying an error.
|
||||||
else if (sourceGames.is_null())
|
else if (sourceGames.is_null())
|
||||||
{
|
{
|
||||||
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM });
|
result.SetSourceGames({ ObjectSourceGame::Custom });
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
|
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
|
||||||
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM });
|
result.SetSourceGames({ ObjectSourceGame::Custom });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,9 +69,9 @@ bool object_entry_is_empty(const rct_object_entry* entry)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t object_entry_get_source_game_legacy(const rct_object_entry* objectEntry)
|
ObjectSourceGame object_entry_get_source_game_legacy(const rct_object_entry* objectEntry)
|
||||||
{
|
{
|
||||||
return (objectEntry->flags & 0xF0) >> 4;
|
return static_cast<ObjectSourceGame>((objectEntry->flags & 0xF0) >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -21,4 +21,4 @@ void get_type_entry_index(size_t index, uint8_t* outObjectType, ObjectEntryIndex
|
||||||
const rct_object_entry* get_loaded_object_entry(size_t index);
|
const rct_object_entry* get_loaded_object_entry(size_t index);
|
||||||
void* get_loaded_object_chunk(size_t index);
|
void* get_loaded_object_chunk(size_t index);
|
||||||
uint8_t object_entry_get_type(const rct_object_entry* objectEntry);
|
uint8_t object_entry_get_type(const rct_object_entry* objectEntry);
|
||||||
uint8_t object_entry_get_source_game_legacy(const rct_object_entry* objectEntry);
|
ObjectSourceGame object_entry_get_source_game_legacy(const rct_object_entry* objectEntry);
|
||||||
|
|
|
@ -270,23 +270,23 @@ public:
|
||||||
LoadObject("#ORCT2SN");
|
LoadObject("#ORCT2SN");
|
||||||
}
|
}
|
||||||
|
|
||||||
static rct_string_id GetObjectSourceGameString(const uint8_t sourceGame)
|
static rct_string_id GetObjectSourceGameString(const ObjectSourceGame sourceGame)
|
||||||
{
|
{
|
||||||
switch (sourceGame)
|
switch (sourceGame)
|
||||||
{
|
{
|
||||||
case OBJECT_SOURCE_RCT1:
|
case ObjectSourceGame::RCT1:
|
||||||
return STR_SCENARIO_CATEGORY_RCT1;
|
return STR_SCENARIO_CATEGORY_RCT1;
|
||||||
case OBJECT_SOURCE_ADDED_ATTRACTIONS:
|
case ObjectSourceGame::AddedAttractions:
|
||||||
return STR_SCENARIO_CATEGORY_RCT1_AA;
|
return STR_SCENARIO_CATEGORY_RCT1_AA;
|
||||||
case OBJECT_SOURCE_LOOPY_LANDSCAPES:
|
case ObjectSourceGame::LoopyLandscapes:
|
||||||
return STR_SCENARIO_CATEGORY_RCT1_LL;
|
return STR_SCENARIO_CATEGORY_RCT1_LL;
|
||||||
case OBJECT_SOURCE_RCT2:
|
case ObjectSourceGame::RCT2:
|
||||||
return STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
|
return STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
|
||||||
case OBJECT_SOURCE_WACKY_WORLDS:
|
case ObjectSourceGame::WackyWorlds:
|
||||||
return STR_OBJECT_FILTER_WW;
|
return STR_OBJECT_FILTER_WW;
|
||||||
case OBJECT_SOURCE_TIME_TWISTER:
|
case ObjectSourceGame::TimeTwister:
|
||||||
return STR_OBJECT_FILTER_TT;
|
return STR_OBJECT_FILTER_TT;
|
||||||
case OBJECT_SOURCE_OPENRCT2_OFFICIAL:
|
case ObjectSourceGame::OpenRCT2Official:
|
||||||
return STR_OBJECT_FILTER_OPENRCT2_OFFICIAL;
|
return STR_OBJECT_FILTER_OPENRCT2_OFFICIAL;
|
||||||
default:
|
default:
|
||||||
return STR_OBJECT_FILTER_CUSTOM;
|
return STR_OBJECT_FILTER_CUSTOM;
|
||||||
|
@ -774,7 +774,7 @@ void object_manager_unload_all_objects()
|
||||||
objectManager.UnloadAll();
|
objectManager.UnloadAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
rct_string_id object_manager_get_source_game_string(const uint8_t sourceGame)
|
rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame)
|
||||||
{
|
{
|
||||||
return ObjectManager::GetObjectSourceGameString(sourceGame);
|
return ObjectManager::GetObjectSourceGameString(sourceGame);
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,4 +50,4 @@ ObjectEntryIndex object_manager_get_loaded_object_entry_index(const void* loaded
|
||||||
void* object_manager_load_object(const rct_object_entry* entry);
|
void* object_manager_load_object(const rct_object_entry* entry);
|
||||||
void object_manager_unload_objects(const std::vector<rct_object_entry>& entries);
|
void object_manager_unload_objects(const std::vector<rct_object_entry>& entries);
|
||||||
void object_manager_unload_all_objects();
|
void object_manager_unload_all_objects();
|
||||||
rct_string_id object_manager_get_source_game_string(const uint8_t sourceGame);
|
rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame);
|
||||||
|
|
|
@ -178,7 +178,7 @@ protected:
|
||||||
for (size_t i = 0; i < sourceLength; i++)
|
for (size_t i = 0; i < sourceLength; i++)
|
||||||
{
|
{
|
||||||
auto value = stream->ReadValue<uint8_t>();
|
auto value = stream->ReadValue<uint8_t>();
|
||||||
item.Sources.push_back(value);
|
item.Sources.push_back(static_cast<ObjectSourceGame>(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto authorsLength = stream->ReadValue<uint8_t>();
|
auto authorsLength = stream->ReadValue<uint8_t>();
|
||||||
|
@ -671,10 +671,10 @@ bool IsObjectCustom(const ObjectRepositoryItem* object)
|
||||||
|
|
||||||
switch (object->GetFirstSourceGame())
|
switch (object->GetFirstSourceGame())
|
||||||
{
|
{
|
||||||
case OBJECT_SOURCE_RCT2:
|
case ObjectSourceGame::RCT2:
|
||||||
case OBJECT_SOURCE_WACKY_WORLDS:
|
case ObjectSourceGame::WackyWorlds:
|
||||||
case OBJECT_SOURCE_TIME_TWISTER:
|
case ObjectSourceGame::TimeTwister:
|
||||||
case OBJECT_SOURCE_OPENRCT2_OFFICIAL:
|
case ObjectSourceGame::OpenRCT2Official:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -41,7 +41,7 @@ struct ObjectRepositoryItem
|
||||||
std::string Path;
|
std::string Path;
|
||||||
std::string Name;
|
std::string Name;
|
||||||
std::vector<std::string> Authors;
|
std::vector<std::string> Authors;
|
||||||
std::vector<uint8_t> Sources;
|
std::vector<ObjectSourceGame> Sources;
|
||||||
Object* LoadedObject{};
|
Object* LoadedObject{};
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -54,12 +54,12 @@ struct ObjectRepositoryItem
|
||||||
std::vector<rct_object_entry> Entries;
|
std::vector<rct_object_entry> Entries;
|
||||||
} SceneryGroupInfo;
|
} SceneryGroupInfo;
|
||||||
|
|
||||||
OBJECT_SOURCE_GAME GetFirstSourceGame() const
|
ObjectSourceGame GetFirstSourceGame() const
|
||||||
{
|
{
|
||||||
if (Sources.empty())
|
if (Sources.empty())
|
||||||
return OBJECT_SOURCE_CUSTOM;
|
return ObjectSourceGame::Custom;
|
||||||
else
|
else
|
||||||
return static_cast<OBJECT_SOURCE_GAME>(Sources[0]);
|
return static_cast<ObjectSourceGame>(Sources[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1930,7 +1930,7 @@ private:
|
||||||
for (const auto objectName : objectNames)
|
for (const auto objectName : objectNames)
|
||||||
{
|
{
|
||||||
rct_object_entry entry{};
|
rct_object_entry entry{};
|
||||||
entry.flags = ((OBJECT_SOURCE_RCT2 << 4) & 0xF0) | (objectType & 0x0F);
|
entry.flags = ((static_cast<uint8_t>(ObjectSourceGame::RCT2) << 4) & 0xF0) | (objectType & 0x0F);
|
||||||
entry.SetName(objectName);
|
entry.SetName(objectName);
|
||||||
entries.push_back(entry);
|
entries.push_back(entry);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue